summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2013-08-25 16:39:06 (GMT)
committerRemko Tronçon <git@el-tramo.be>2013-08-27 19:47:48 (GMT)
commit1bb607f96e79845ce30dd5590b0d53cc394ac150 (patch)
tree6156622ddd1b3238aec73536e0dc25b632965a71 /Sluift/Examples
parentc4431ee90f3f1daac0a12b35bfa3378d5c570eaa (diff)
downloadswift-1bb607f96e79845ce30dd5590b0d53cc394ac150.zip
swift-1bb607f96e79845ce30dd5590b0d53cc394ac150.tar.bz2
PubSub implementation & Sluift refactoring.
Change-Id: I04ff7111b73565c00bff6db183451774a633344f
Diffstat (limited to 'Sluift/Examples')
-rw-r--r--Sluift/Examples/CollectVersions.lua36
-rw-r--r--Sluift/Examples/ContactsMap.lua120
-rw-r--r--Sluift/Examples/EchoBot.lua44
-rw-r--r--Sluift/Examples/Login.lua32
-rw-r--r--Sluift/Examples/PEPListener.lua46
-rw-r--r--Sluift/Examples/RemoveUnreachableContacts.lua63
-rwxr-xr-xSluift/Examples/Wonderland.lua6
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