diff options
Diffstat (limited to 'Sluift/Examples')
| -rw-r--r-- | Sluift/Examples/CollectVersions.lua | 36 | ||||
| -rw-r--r-- | Sluift/Examples/ContactsMap.lua | 120 | ||||
| -rw-r--r-- | Sluift/Examples/EchoBot.lua | 44 | ||||
| -rw-r--r-- | Sluift/Examples/Login.lua | 32 | ||||
| -rw-r--r-- | Sluift/Examples/PEPListener.lua | 46 | ||||
| -rw-r--r-- | Sluift/Examples/RemoveUnreachableContacts.lua | 63 | ||||
| -rwxr-xr-x | Sluift/Examples/Wonderland.lua | 6 | 
7 files changed, 262 insertions, 85 deletions
| diff --git a/Sluift/Examples/CollectVersions.lua b/Sluift/Examples/CollectVersions.lua index c93c8c8..38bf6ac 100644 --- a/Sluift/Examples/CollectVersions.lua +++ b/Sluift/Examples/CollectVersions.lua @@ -1,22 +1,22 @@ --- --- Copyright (c) 2010 Remko Tronçon --- Licensed under the GNU General Public License v3. --- See Documentation/Licenses/GPLv3.txt for more information. --- +--[[ +	 +	Copyright (c) 2010-2013 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, and collects statistics about --- the server software of all contacts in your roster +	This script logs into an XMPP server, and collects statistics about +	the server software of all contacts in your roster -require "sluift" +--]] -c = sluift.new_client(os.getenv("SLUIFT_JID"), os.getenv("SLUIFT_PASS")) -c:connect() +require 'sluift' -versions = {} -for jid, _ in pairs(c:get_contacts()) do -	v = c:get_version(sluift.jid_domain(jid)) -	if v then versions[v["name"]] = (versions[v["name"]] or 0) + 1 end -end -for name, count in pairs(versions) do print(name .. ": " .. count) end - -c:disconnect() +c = sluift.new_client(os.getenv('SLUIFT_JID'), os.getenv('SLUIFT_PASS')) +c:connect(function ()  +	versions = {} +	for jid in pairs(c:get_contacts()) do +		local v = c:get_software_version {to = sluift.jid.domain(jid), timeout = 3000} or {name = 'Unknown'} +		versions[v['name']] = (versions[v['name']] or 0) + 1 +	end +	for name, count in pairs(versions) do print(name .. ': ' .. count) end +end) diff --git a/Sluift/Examples/ContactsMap.lua b/Sluift/Examples/ContactsMap.lua new file mode 100644 index 0000000..d248dc7 --- /dev/null +++ b/Sluift/Examples/ContactsMap.lua @@ -0,0 +1,120 @@ +--[[ +	Copyright (c) 2013 Remko Tronçon +	Licensed under the GNU General Public License v3. +	See Documentation/Licenses/GPLv3.txt for more information. +--]] + +--[[ + +	Contacts map + +	Creates an HTML file of a map with all your contacts on it. + +	The following environment variables are used: +	- SLUIFT_JID, SWIFT_PASS: JID and password to log in with + +--]] + +require "sluift" + +output_dir = arg[1] +if not output_dir then +	error("Please specify the directory to write the map to") +end + +-- Collect all data +geolocs = {} +avatars = {} +c = sluift.new_client(os.getenv("SLUIFT_JID"), os.getenv("SLUIFT_PASS")) +c:connect(function ()  +	-- Indicate we're interested in getting user location information, and send initial presence +	c:set_caps_node("http://swift.im/ContactsMap") +	c:set_disco_info({identities = {{name = 'ContactsMap'}}, features = { +		sluift.disco.features.DISCO_INFO, +		sluift.disco.features.USER_LOCATION .. '+notify', +	}}) +	c:send_presence() + +	-- Collect geoloc info +	for event in c:pubsub_events {timeout = 10000} do +		local from = sluift.jid.to_bare(event.from) +		if event._type == 'pubsub_event_items' and event.item then +			if event.node == sluift.disco.features.USER_LOCATION then +				local lat, lon = event.item.latitude, event.item.longitude +				if lat and lon then geolocs[from] = {lat = lat, lon = lon} end +			end +		end +	end + +	-- Download the necessary avatars +	for contact in pairs(geolocs) do +		local vcard = c:get_vcard {to = contact} +		if vcard and vcard.photo then +			local avatar_hash = sluift.hexify(sluift.sha1(vcard.photo)) +			local file = io.open(output_dir.."/" .. avatar_hash .. ".png", "wb") +			file:write(vcard.photo) +			file:close() +			avatars[contact] = avatar_hash +		end +	end +end) + +-- Generate html +min_lat, max_lat = 90, -90 +min_lon, max_lon = 180, -180 +contacts_html = {} +for contact, geoloc in pairs(geolocs) do +	if geoloc.lat < min_lat then min_lat = geoloc.lat end +	if geoloc.lon < min_lon then min_lon = geoloc.lon end +	if geoloc.lat > max_lat then max_lat = geoloc.lat end +	if geoloc.lon > max_lon then max_lon = geoloc.lon end +	local image = 'null' +	if avatars[contact] then +		image = "'" .. avatars[contact] .. ".png'" +	end +	contacts_html[#contacts_html+1] = "['" .. contact .. "'," .. geoloc.lat .. "," .. geoloc.lon .. "," .. image .. "]" +end +center_html = ((min_lat + max_lat) / 2) .. ',' .. ((min_lon + max_lon) / 2) + +map_html = [[ +<html> +	<head> +		<title>Contacts Map</title> +		<script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script> +	</head> +	<body> +		<div id="map" style="height: 100%; width: 100%;"/> +		<script> +			var map = new google.maps.Map(document.getElementById('map'), { +				zoom: 2, +				center: new google.maps.LatLng(%(CENTER)), +				mapTypeId: google.maps.MapTypeId.ROADMAP +			}); +			var infowindow = new google.maps.InfoWindow(); +			var contacts = [%(CONTACTS)]; +			for (var i = 0; i < contacts.length; i++) {  +				var icon = null; +				if (contacts[i][3]) { +					icon = { url: contacts[i][3], scaledSize: { width: 30, height: 30} }; +				} +				var marker = new google.maps.Marker({ +					position: new google.maps.LatLng(contacts[i][1], contacts[i][2]), +					map: map, +					icon: icon, +				}); +				google.maps.event.addListener(marker, 'click', (function(marker, i) { +					return function() { +						infowindow.setContent(contacts[i][0]); +						infowindow.open(map, marker); +					} +				})(marker, i)); +			} +		</script> +	</body> +</html> +]] +local file = io.open(output_dir .. "/index.html", "w") +file:write(map_html: +	gsub('%%%(CONTACTS%)', table.concat(contacts_html, ",")): +	gsub('%%%(CENTER%)', center_html)) +file:close() diff --git a/Sluift/Examples/EchoBot.lua b/Sluift/Examples/EchoBot.lua index 09da63b..fc495c4 100644 --- a/Sluift/Examples/EchoBot.lua +++ b/Sluift/Examples/EchoBot.lua @@ -1,27 +1,31 @@ --- --- Copyright (c) 2010 Remko Tronçon --- Licensed under the GNU General Public License v3. --- See Documentation/Licenses/GPLv3.txt for more information. --- +--[[ +	Copyright (c) 2010-2013 Remko Tronçon +	Licensed under the GNU General Public License v3. +	See Documentation/Licenses/GPLv3.txt for more information. +--]] --- --- An XMPP Echoing Bot --- --- This script logs into an XMPP server, sends initial presence, --- and then waits for incoming messages, and echoes them back. ---  --- 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 ---  +--[[ +	 +	An XMPP Echoing Bot + +	This script logs into an XMPP server, sends initial presence, +	and then waits for incoming messages, and echoes them back. +	 +	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") or false  c = sluift.new_client(os.getenv("SLUIFT_JID"), os.getenv("SLUIFT_PASS")) -c:connect() -c:send_presence("Send me a message") -c:for_event(function(e)  -		if e["type"] == "message" then c:send_message(e["from"], e["body"]) end  -	end) +c:connect(function ()  +	c:set_version{name = "EchoBot", version = "0.1"} +	c:send_presence("Send me a message") +	for message in c:messages() do +		c:send_message{to = message["from"], body = message["body"]} +	end +end) diff --git a/Sluift/Examples/Login.lua b/Sluift/Examples/Login.lua index 1733bb9..c43b72a 100644 --- a/Sluift/Examples/Login.lua +++ b/Sluift/Examples/Login.lua @@ -1,16 +1,20 @@ --- --- Copyright (c) 2010 Remko Tronçon --- Licensed under the GNU General Public License v3. --- See Documentation/Licenses/GPLv3.txt for more information. --- +--[[ +	Copyright (c) 2010-2013 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, and sends initial presence --- Useful as initialization script for an interactive session ('-i'), --- or as a starting point for scripts. ---  --- 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 +--[[ + +	This script logs into an XMPP server, and sends initial presence +	Useful as initialization script for an interactive session ('-i'), +	or as a starting point for scripts. + +	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") or false @@ -18,6 +22,8 @@ sluift.debug = os.getenv("SLUIFT_DEBUG") or false  print("Connecting " .. os.getenv("SLUIFT_JID") .. " ...")  c = sluift.new_client(os.getenv("SLUIFT_JID"), os.getenv("SLUIFT_PASS"))  c:set_options({compress = false, tls = false}) -c:connect():send_presence("") +c:connect() +c:send_presence("")  print("Connected ...") +print("Use the 'c' variable to communicate.") diff --git a/Sluift/Examples/PEPListener.lua b/Sluift/Examples/PEPListener.lua new file mode 100644 index 0000000..f196f84 --- /dev/null +++ b/Sluift/Examples/PEPListener.lua @@ -0,0 +1,46 @@ +--[[ +	Copyright (c) 2010-2013 Remko Tronçon +	Licensed under the GNU General Public License v3. +	See Documentation/Licenses/GPLv3.txt for more information. +--]] + +--[[ + +	PEP Listener + +	Listens to a series of PEP events of all contacts. + +	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") or false + +pep_protocols = { +	[sluift.disco.features.USER_LOCATION] = true, +	[sluift.disco.features.USER_TUNE] = true, +	[sluift.disco.features.USER_ACTIVITY] = true, +	[sluift.disco.features.USER_AVATAR_METADATA] = true, +	[sluift.disco.features.USER_PROFILE] = true, +} + +client = sluift.new_client(os.getenv("SLUIFT_JID"), os.getenv("SLUIFT_PASS")) +client:connect(function (c)  +	features = {sluift.disco.features.DISCO_INFO} +	for protocol in pairs(pep_protocols) do +		features[#features+1] = protocol .. '+notify' +	end + +	c:set_caps_node("http://swift.im/PEPListener") +	c:set_disco_info({identities = {{name = 'PEPListener'}}, features = features}) +	c:send_presence() +	for event in c:pubsub_events() do +		if event._type == 'pubsub_event_items' and pep_protocols[event.node] then +			print("<" .. event.from .. "> " .. tostring(event.item)) +		end +	end +end) diff --git a/Sluift/Examples/RemoveUnreachableContacts.lua b/Sluift/Examples/RemoveUnreachableContacts.lua index 90122df..a202e62 100644 --- a/Sluift/Examples/RemoveUnreachableContacts.lua +++ b/Sluift/Examples/RemoveUnreachableContacts.lua @@ -1,37 +1,38 @@ --- --- Copyright (c) 2010 Remko Tronçon --- Licensed under the GNU General Public License v3. --- See Documentation/Licenses/GPLv3.txt for more information. --- +--[[ +	Copyright (c) 2010-2013 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 +--[[ +	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. -require "sluift" -sluift.debug = os.getenv("SLUIFT_DEBUG") +	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 +--]] -print "Connecting ..." -c = sluift.new_client(os.getenv("SLUIFT_JID"), os.getenv("SLUIFT_PASS")) -c:connect() +require 'sluift' +sluift.debug = os.getenv('SLUIFT_DEBUG') -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 +print 'Connecting ...' +c = sluift.new_client(os.getenv('SLUIFT_JID'), os.getenv('SLUIFT_PASS')) +c:connect(function (c) +	print 'Checking for unreachable contacts ...' +	for jid in pairs(c:get_contacts()) do +		_, err = c:get_software_version {to = sluift.jid.domain(jid), timeout = 10000} +		print(err) +		if err == 'Remote server not found' or err == 'Remote server 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 -end - -print "Done. Exiting ..." -c:disconnect() +	print 'Done. Exiting ...' +end) diff --git a/Sluift/Examples/Wonderland.lua b/Sluift/Examples/Wonderland.lua index 58c00ca..235d8d0 100755 --- a/Sluift/Examples/Wonderland.lua +++ b/Sluift/Examples/Wonderland.lua @@ -44,9 +44,9 @@ end  print("Done. Waiting ...")  while true do  	for _, client in ipairs(clients) do -		client:for_event(function(e)  -				if e["type"] == "message" then client:send_message(e["from"], "Off with their heads!") end  -			end, 1000) +		for message in client:messages {timeout = 1000} do +			client:send_message{to = e["from"], body = "Off with their heads!"} +		end  	end  	sluift.sleep(1000)  end | 
 Swift
 Swift