switchboard 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +3 -0
- data/README.markdown +59 -0
- data/Rakefile +30 -0
- data/bin/switchboard +35 -0
- data/examples/echo_bot.rb +7 -0
- data/lib/switchboard.rb +1 -0
- data/lib/switchboard/client.rb +92 -0
- data/lib/switchboard/colors.rb +10 -0
- data/lib/switchboard/commands.rb +12 -0
- data/lib/switchboard/commands/command.rb +85 -0
- data/lib/switchboard/commands/config.rb +1 -0
- data/lib/switchboard/commands/config/config.rb +20 -0
- data/lib/switchboard/commands/default.rb +40 -0
- data/lib/switchboard/commands/disco.rb +3 -0
- data/lib/switchboard/commands/disco/disco.rb +13 -0
- data/lib/switchboard/commands/disco/info.rb +39 -0
- data/lib/switchboard/commands/disco/items.rb +30 -0
- data/lib/switchboard/commands/grep.rb +23 -0
- data/lib/switchboard/commands/help.rb +1 -0
- data/lib/switchboard/commands/help/help.rb +15 -0
- data/lib/switchboard/commands/last.rb +1 -0
- data/lib/switchboard/commands/last/last.rb +34 -0
- data/lib/switchboard/commands/pep.rb +3 -0
- data/lib/switchboard/commands/pep/location.rb +97 -0
- data/lib/switchboard/commands/pep/pep.rb +7 -0
- data/lib/switchboard/commands/pep/tune.rb +85 -0
- data/lib/switchboard/commands/pubsub.rb +16 -0
- data/lib/switchboard/commands/pubsub/affiliations.rb +34 -0
- data/lib/switchboard/commands/pubsub/config.rb +42 -0
- data/lib/switchboard/commands/pubsub/create.rb +41 -0
- data/lib/switchboard/commands/pubsub/delete.rb +32 -0
- data/lib/switchboard/commands/pubsub/info.rb +48 -0
- data/lib/switchboard/commands/pubsub/items.rb +40 -0
- data/lib/switchboard/commands/pubsub/listen.rb +20 -0
- data/lib/switchboard/commands/pubsub/nodes.rb +37 -0
- data/lib/switchboard/commands/pubsub/options.rb +40 -0
- data/lib/switchboard/commands/pubsub/publish.rb +44 -0
- data/lib/switchboard/commands/pubsub/pubsub.rb +25 -0
- data/lib/switchboard/commands/pubsub/purge.rb +32 -0
- data/lib/switchboard/commands/pubsub/retract.rb +38 -0
- data/lib/switchboard/commands/pubsub/subscribe.rb +34 -0
- data/lib/switchboard/commands/pubsub/subscriptions.rb +35 -0
- data/lib/switchboard/commands/pubsub/unsubscribe.rb +30 -0
- data/lib/switchboard/commands/register.rb +40 -0
- data/lib/switchboard/commands/roster.rb +5 -0
- data/lib/switchboard/commands/roster/add.rb +27 -0
- data/lib/switchboard/commands/roster/list.rb +26 -0
- data/lib/switchboard/commands/roster/online.rb +28 -0
- data/lib/switchboard/commands/roster/remove.rb +25 -0
- data/lib/switchboard/commands/roster/roster.rb +7 -0
- data/lib/switchboard/commands/unregister.rb +21 -0
- data/lib/switchboard/component.rb +36 -0
- data/lib/switchboard/core.rb +311 -0
- data/lib/switchboard/ext/delegate.rb +21 -0
- data/lib/switchboard/ext/instance_exec.rb +16 -0
- data/lib/switchboard/helpers/oauth_pubsub.rb +44 -0
- data/lib/switchboard/helpers/pubsub.rb +28 -0
- data/lib/switchboard/jacks.rb +7 -0
- data/lib/switchboard/jacks/auto_accept.rb +16 -0
- data/lib/switchboard/jacks/debug.rb +17 -0
- data/lib/switchboard/jacks/echo.rb +7 -0
- data/lib/switchboard/jacks/notify.rb +15 -0
- data/lib/switchboard/jacks/oauth_pubsub.rb +23 -0
- data/lib/switchboard/jacks/pubsub.rb +21 -0
- data/lib/switchboard/jacks/roster_debug.rb +23 -0
- data/lib/switchboard/settings.rb +49 -0
- data/lib/switchboard/switchboard.rb +12 -0
- data/lib/switchboard/version.rb +3 -0
- data/switchboard.gemspec +15 -0
- metadata +136 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'xmpp4r/discovery'
|
2
|
+
|
3
|
+
module Switchboard
|
4
|
+
module Commands
|
5
|
+
class Disco
|
6
|
+
class Items < Switchboard::Command
|
7
|
+
description "Item discovery"
|
8
|
+
|
9
|
+
def self.run!
|
10
|
+
switchboard = Switchboard::Client.new do
|
11
|
+
helper = Jabber::Discovery::Helper.new(client)
|
12
|
+
resp = helper.get_items_for(settings["disco.target"], settings["disco.node"])
|
13
|
+
|
14
|
+
if resp.items.any?
|
15
|
+
puts "Item Discovery for #{settings["disco.target"]}#{settings["disco.node"] ? " (#{settings["disco.node"]})" : ""}"
|
16
|
+
resp.items.each do |item|
|
17
|
+
name = "#{item.iname}#{item.node ? " (#{item.node})" : ""}"
|
18
|
+
puts " " + [item.jid, name].reject { |x| x == "" } * ": "
|
19
|
+
end
|
20
|
+
else
|
21
|
+
puts "No items were discoverable for #{settings["disco.target"]}."
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
switchboard.run!
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Switchboard
|
2
|
+
module Commands
|
3
|
+
class Grep < Switchboard::Command
|
4
|
+
description "Search for an XPath expression"
|
5
|
+
|
6
|
+
def self.run!
|
7
|
+
expr = ARGV.pop
|
8
|
+
|
9
|
+
switchboard = Switchboard::Client.new
|
10
|
+
switchboard.plug!(AutoAcceptJack, NotifyJack)
|
11
|
+
|
12
|
+
switchboard.on_stanza do |stanza|
|
13
|
+
# TODO doesn't handle default namespaces properly
|
14
|
+
REXML::XPath.each(stanza, expr) do |el|
|
15
|
+
puts el.to_s
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
switchboard.run!
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'switchboard/commands/help/help'
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'switchboard/commands/last/last'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'xmpp4r/last'
|
2
|
+
|
3
|
+
module Switchboard
|
4
|
+
module Commands
|
5
|
+
class Last < Switchboard::Command
|
6
|
+
description "Last Activity (XEP-0012)"
|
7
|
+
|
8
|
+
def self.options(opts)
|
9
|
+
super(opts)
|
10
|
+
opts.on("--target=target", String, "Specifies the target to query.") { |v| OPTIONS["last.target"] = v }
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.run!
|
14
|
+
switchboard = Switchboard::Client.new do
|
15
|
+
helper = Jabber::LastActivity::Helper.new(client)
|
16
|
+
resp = helper.get_last_activity_from(jid = Jabber::JID.new(settings["last.target"]))
|
17
|
+
|
18
|
+
status = " (#{resp.status})" if resp.status
|
19
|
+
status ||= ""
|
20
|
+
|
21
|
+
if jid.resource
|
22
|
+
puts "#{jid} idle: #{resp.seconds} seconds" << status
|
23
|
+
elsif jid.node
|
24
|
+
puts "#{jid} last disconnected: " << (Time.new - resp.seconds).to_s << status
|
25
|
+
else
|
26
|
+
puts "#{jid} uptime: #{resp.seconds} seconds" << status
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
switchboard.run!
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'xmpp4r/location'
|
2
|
+
|
3
|
+
module Switchboard
|
4
|
+
module Commands
|
5
|
+
class PEP
|
6
|
+
class Location < Switchboard::Command
|
7
|
+
description "Broadcasting UserLocation (XEP-0080)"
|
8
|
+
|
9
|
+
def self.run!
|
10
|
+
begin
|
11
|
+
require 'fire_hydrant'
|
12
|
+
rescue LoadError => e
|
13
|
+
lib = e.message.split("--").last.strip
|
14
|
+
puts "#{lib} is required for this command to work."
|
15
|
+
exit 1
|
16
|
+
end
|
17
|
+
|
18
|
+
# TODO check for at least one Fire Eagle subscription, otherwise this
|
19
|
+
# will never broadcast anything.
|
20
|
+
|
21
|
+
switchboard = Switchboard::Client.new
|
22
|
+
switchboard.plug!(AutoAcceptJack, FireEagleJack)
|
23
|
+
|
24
|
+
switchboard.on_startup do
|
25
|
+
@location_helper = Jabber::UserLocation::Helper.new(client, nil)
|
26
|
+
end
|
27
|
+
|
28
|
+
switchboard.on_location_update do |user|
|
29
|
+
name = user.locations.first
|
30
|
+
timestamp = user.locations.first.located_at
|
31
|
+
|
32
|
+
area, postalcode, locality, region, country = nil
|
33
|
+
|
34
|
+
user.locations.each do |loc|
|
35
|
+
level = loc.level_name
|
36
|
+
normal_name = loc.normal_name
|
37
|
+
case level
|
38
|
+
when "exact"
|
39
|
+
street = normal_name
|
40
|
+
when "postal"
|
41
|
+
postalcode = normal_name
|
42
|
+
when "neighborhood"
|
43
|
+
area = normal_name
|
44
|
+
when "city"
|
45
|
+
locality = normal_name
|
46
|
+
when "state"
|
47
|
+
region = normal_name
|
48
|
+
when "country"
|
49
|
+
country = normal_name
|
50
|
+
end
|
51
|
+
puts "level: #{level}"
|
52
|
+
end
|
53
|
+
|
54
|
+
puts "Current location: #{name}."
|
55
|
+
|
56
|
+
geom = user.locations[0].geom
|
57
|
+
if geom.is_a?(GeoRuby::SimpleFeatures::Envelope)
|
58
|
+
pt = geom.center
|
59
|
+
accuracy = geom.upper_corner.spherical_distance(geom.lower_corner) / 2
|
60
|
+
else
|
61
|
+
pt = geom
|
62
|
+
accuracy = 0
|
63
|
+
end
|
64
|
+
|
65
|
+
location = Jabber::UserLocation::Location.new \
|
66
|
+
"accuracy" => accuracy,
|
67
|
+
"area" => area,
|
68
|
+
"country" => country,
|
69
|
+
"description" => name,
|
70
|
+
"lat" => pt.lat,
|
71
|
+
"locality" => locality,
|
72
|
+
"lon" => pt.lon,
|
73
|
+
"postalcode" => postalcode,
|
74
|
+
"region" => region,
|
75
|
+
"street" => street,
|
76
|
+
"timestamp" => timestamp
|
77
|
+
|
78
|
+
# parsing thread is still running, so the send needs to be deferred
|
79
|
+
defer :location_sent do
|
80
|
+
@location_helper.current_location(location)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
switchboard.on_shutdown do
|
85
|
+
begin
|
86
|
+
@location_helper.stop_publishing
|
87
|
+
rescue Jabber::ServerError => e
|
88
|
+
puts e
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
switchboard.run!
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'xmpp4r/tune'
|
2
|
+
|
3
|
+
module Switchboard
|
4
|
+
module Commands
|
5
|
+
class PEP
|
6
|
+
class Tune < Switchboard::Command
|
7
|
+
description "Broadcasting UserTune (XEP-0118)"
|
8
|
+
|
9
|
+
def self.run!
|
10
|
+
begin
|
11
|
+
require 'appscript'
|
12
|
+
rescue LoadError => e
|
13
|
+
lib = e.message.split("--").last.strip
|
14
|
+
puts "#{lib} is required for this command to work."
|
15
|
+
exit 1
|
16
|
+
end
|
17
|
+
|
18
|
+
switchboard = Switchboard::Client.new do
|
19
|
+
@tune_helper = Jabber::UserTune::Helper.new(client, nil)
|
20
|
+
|
21
|
+
itunes = Appscript.app('iTunes')
|
22
|
+
old_track_info = nil
|
23
|
+
last_state = :paused
|
24
|
+
|
25
|
+
while !shutdown?
|
26
|
+
track = itunes.current_track.get
|
27
|
+
state = itunes.player_state.get
|
28
|
+
|
29
|
+
if track && state == :playing
|
30
|
+
|
31
|
+
artist = track.artist.get
|
32
|
+
name = track.name.get
|
33
|
+
source = track.album.get
|
34
|
+
track_info = [artist, name, source]
|
35
|
+
|
36
|
+
if track_info != old_track_info
|
37
|
+
duration = track.duration.get.to_i
|
38
|
+
track = track.track_number.get.to_s
|
39
|
+
|
40
|
+
puts "Now playing: #{name} by #{artist}"
|
41
|
+
tune = Jabber::UserTune::Tune.new \
|
42
|
+
artist,
|
43
|
+
name,
|
44
|
+
duration,
|
45
|
+
track,
|
46
|
+
source
|
47
|
+
|
48
|
+
begin
|
49
|
+
@tune_helper.now_playing(tune)
|
50
|
+
rescue Jabber::ServerError => e
|
51
|
+
puts e
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
elsif state != last_state
|
56
|
+
track_info = nil
|
57
|
+
begin
|
58
|
+
@tune_helper.stop_playing
|
59
|
+
rescue Jabber::ServerError => e
|
60
|
+
puts e
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
old_track_info = track_info
|
65
|
+
last_state = state
|
66
|
+
sleep 1
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
switchboard.on_shutdown do
|
71
|
+
begin
|
72
|
+
@tune_helper.stop_playing
|
73
|
+
rescue Jabber::ServerError => e
|
74
|
+
puts e
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
switchboard.plug!(AutoAcceptJack)
|
79
|
+
|
80
|
+
switchboard.run!
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'switchboard/commands/pubsub/pubsub'
|
2
|
+
require 'switchboard/commands/pubsub/affiliations'
|
3
|
+
require 'switchboard/commands/pubsub/config'
|
4
|
+
require 'switchboard/commands/pubsub/create'
|
5
|
+
require 'switchboard/commands/pubsub/delete'
|
6
|
+
require 'switchboard/commands/pubsub/info'
|
7
|
+
require 'switchboard/commands/pubsub/items'
|
8
|
+
require 'switchboard/commands/pubsub/listen'
|
9
|
+
require 'switchboard/commands/pubsub/nodes'
|
10
|
+
require 'switchboard/commands/pubsub/options'
|
11
|
+
require 'switchboard/commands/pubsub/publish'
|
12
|
+
require 'switchboard/commands/pubsub/purge'
|
13
|
+
require 'switchboard/commands/pubsub/retract'
|
14
|
+
require 'switchboard/commands/pubsub/subscribe'
|
15
|
+
require 'switchboard/commands/pubsub/subscriptions'
|
16
|
+
require 'switchboard/commands/pubsub/unsubscribe'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Switchboard
|
2
|
+
module Commands
|
3
|
+
class PubSub
|
4
|
+
class Affiliations < Switchboard::Command
|
5
|
+
description "Lists pubsub affiliations"
|
6
|
+
|
7
|
+
def self.run!
|
8
|
+
switchboard = Switchboard::Client.new do
|
9
|
+
defer :affiliations_received do
|
10
|
+
pubsub.get_affiliations(OPTIONS["pubsub.node"])
|
11
|
+
end
|
12
|
+
|
13
|
+
def affiliations_received(affiliations)
|
14
|
+
if affiliations
|
15
|
+
affiliations.each do |node, affiliation|
|
16
|
+
puts [node, affiliation] * " => "
|
17
|
+
end
|
18
|
+
else
|
19
|
+
puts "No affiliations."
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
if defined?(OAuth) && OPTIONS["oauth"]
|
25
|
+
switchboard.plug!(OAuthPubSubJack)
|
26
|
+
else
|
27
|
+
switchboard.plug!(PubSubJack)
|
28
|
+
end
|
29
|
+
switchboard.run!
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Switchboard
|
2
|
+
module Commands
|
3
|
+
class PubSub
|
4
|
+
class Config < Switchboard::Command
|
5
|
+
description "Gets the configuration for a pubsub node"
|
6
|
+
|
7
|
+
def self.run!
|
8
|
+
switchboard = Switchboard::Client.new do
|
9
|
+
defer :configuration_retrieved do
|
10
|
+
if ARGV.length == 2
|
11
|
+
key, value = ARGV
|
12
|
+
puts "Setting '#{key}' to '#{value}'"
|
13
|
+
config = Jabber::PubSub::NodeConfig.new(OPTIONS["pubsub.node"], key => value)
|
14
|
+
set_config_for(OPTIONS["pubsub.node"], config)
|
15
|
+
end
|
16
|
+
|
17
|
+
get_config_from(OPTIONS["pubsub.node"])
|
18
|
+
end
|
19
|
+
|
20
|
+
def configuration_retrieved(config)
|
21
|
+
if config
|
22
|
+
puts "Configuration for node '#{config.node}':"
|
23
|
+
config.options.each do |k,v|
|
24
|
+
puts " " + [k, v] * ": "
|
25
|
+
end
|
26
|
+
else
|
27
|
+
puts "Could not load configuration for node '#{OPTIONS["pubsub.node"]}'."
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
if defined?(OAuth) && OPTIONS["oauth"]
|
33
|
+
switchboard.plug!(OAuthPubSubJack)
|
34
|
+
else
|
35
|
+
switchboard.plug!(PubSubJack)
|
36
|
+
end
|
37
|
+
switchboard.run!
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Switchboard
|
2
|
+
module Commands
|
3
|
+
class PubSub
|
4
|
+
class Create < Switchboard::Command
|
5
|
+
description "Creates a pubsub node"
|
6
|
+
|
7
|
+
def self.options(opts)
|
8
|
+
super(opts)
|
9
|
+
opts.on("--collection", "Specifies that a 'collection' node should be created.") { |v| OPTIONS["pubsub.create.node_type"] = "collection" }
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.run!
|
13
|
+
switchboard = Switchboard::Client.new do
|
14
|
+
defer :node_created do
|
15
|
+
if OPTIONS["pubsub.create.node_type"] == "collection"
|
16
|
+
create_collection_node(OPTIONS["pubsub.node"], nil)
|
17
|
+
else
|
18
|
+
create_node(OPTIONS["pubsub.node"], nil)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def node_created(name)
|
23
|
+
if name
|
24
|
+
puts "Node '#{name}' was created."
|
25
|
+
else
|
26
|
+
puts "An auto-named node was created."
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
if defined?(OAuth) && OPTIONS["oauth"]
|
32
|
+
switchboard.plug!(OAuthPubSubJack)
|
33
|
+
else
|
34
|
+
switchboard.plug!(PubSubJack)
|
35
|
+
end
|
36
|
+
switchboard.run!
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|