From 5be2178d55246d22e079c05db848eb3ec50f1aa9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Thu, 17 Mar 2011 23:09:50 +0100
Subject: Sluift: Added example script for removing unreachable contacts.


diff --git a/Sluift/Examples/RemoveUnreachableContacts.lua b/Sluift/Examples/RemoveUnreachableContacts.lua
new file mode 100644
index 0000000..90122df
--- /dev/null
+++ b/Sluift/Examples/RemoveUnreachableContacts.lua
@@ -0,0 +1,37 @@
+--
+-- Copyright (c) 2010 Remko Tronçon
+-- Licensed under the GNU General Public License v3.
+-- See Documentation/Licenses/GPLv3.txt for more information.
+--
+
+-- This script logs into an XMPP server, iterates over all roster items,
+-- and checks if their server is still alive. If not, the script asks you
+-- whether it should remove the contact from your contact list.
+-- 
+-- The following environment variables are used:
+-- * SLUIFT_JID, SWIFT_PASS: JID and password to log in with
+-- * SLUIFT_DEBUG: Sets whether debugging should be turned on
+
+require "sluift"
+sluift.debug = os.getenv("SLUIFT_DEBUG")
+
+print "Connecting ..."
+c = sluift.new_client(os.getenv("SLUIFT_JID"), os.getenv("SLUIFT_PASS"))
+c:connect()
+
+print "Checking for unreachable contacts ..."
+for jid, _ in pairs(c:get_contacts()) do
+	_, err = c:get_version(sluift.jid_domain(jid), 10000)
+	if err == "Remote server not found" or err == "Timeout" then
+		print("Delete " .. jid .. " (" .. err .. ") ? [y/n/q]")
+		answer = io.read()
+		if answer == "y" then
+			c:remove_contact(jid)
+		elseif answer == "q" then
+			break
+		end
+	end
+end
+
+print "Done. Exiting ..."
+c:disconnect()
diff --git a/Sluift/sluift.cpp b/Sluift/sluift.cpp
index abfde24..0545089 100644
--- a/Sluift/sluift.cpp
+++ b/Sluift/sluift.cpp
@@ -300,7 +300,7 @@ static int sluift_client_get_version(lua_State *L) {
 
 		ResponseSink<SoftwareVersion> sink;
 		GetSoftwareVersionRequest::ref request = GetSoftwareVersionRequest::create(std::string(luaL_checkstring(L, 2)), client->getClient()->getIQRouter());
-		request->onResponse.connect(boost::ref(sink));
+		boost::signals::scoped_connection c = request->onResponse.connect(boost::ref(sink));
 		request->send();
 
 		Watchdog watchdog(timeout, networkFactories.getTimerFactory());
@@ -580,7 +580,7 @@ static int sluift_client_add_contact(lua_State* L) {
 
 			ResponseSink<RosterPayload> sink;
 			SetRosterRequest::ref request = SetRosterRequest::create(roster, client->getClient()->getIQRouter());
-			request->onResponse.connect(boost::ref(sink));
+			boost::signals::scoped_connection c = request->onResponse.connect(boost::ref(sink));
 			request->send();
 			while (!sink.hasResponse()) {
 				eventLoop.runUntilEvents();
@@ -609,7 +609,7 @@ static int sluift_client_remove_contact(lua_State* L) {
 		roster->addItem(RosterItemPayload(JID(luaL_checkstring(L, 2)), "", RosterItemPayload::Remove));
 		ResponseSink<RosterPayload> sink;
 		SetRosterRequest::ref request = SetRosterRequest::create(roster, client->getClient()->getIQRouter());
-		request->onResponse.connect(boost::ref(sink));
+		boost::signals::scoped_connection c = request->onResponse.connect(boost::ref(sink));
 		request->send();
 		while (!sink.hasResponse()) {
 			eventLoop.runUntilEvents();
-- 
cgit v0.10.2-6-g49f6