mojodna-switchboard 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +18 -0
- data/lib/switchboard/client.rb +112 -0
- data/lib/switchboard/commands/pep/tune.rb +1 -1
- data/lib/switchboard/commands/pubsub/affiliations.rb +2 -6
- data/lib/switchboard/commands/pubsub/config.rb +8 -12
- data/lib/switchboard/commands/pubsub/create.rb +5 -9
- data/lib/switchboard/commands/pubsub/delete.rb +2 -6
- data/lib/switchboard/commands/pubsub/info.rb +3 -7
- data/lib/switchboard/commands/pubsub/items.rb +2 -6
- data/lib/switchboard/commands/pubsub/listen.rb +1 -1
- data/lib/switchboard/commands/pubsub/nodes.rb +3 -7
- data/lib/switchboard/commands/pubsub/options.rb +2 -6
- data/lib/switchboard/commands/pubsub/publish.rb +7 -11
- data/lib/switchboard/commands/pubsub/purge.rb +2 -6
- data/lib/switchboard/commands/pubsub/subscribe.rb +2 -6
- data/lib/switchboard/commands/pubsub/subscriptions.rb +2 -6
- data/lib/switchboard/commands/pubsub/unsubscribe.rb +2 -6
- data/lib/switchboard/commands/register.rb +1 -1
- data/lib/switchboard/commands/roster/add.rb +3 -2
- data/lib/switchboard/commands/roster/list.rb +3 -1
- data/lib/switchboard/commands/roster/remove.rb +3 -7
- data/lib/switchboard/commands/unregister.rb +1 -1
- data/lib/switchboard/core.rb +29 -103
- data/lib/switchboard/switchboard.rb +1 -0
- data/lib/switchboard/version.rb +1 -1
- data/switchboard.gemspec +2 -2
- metadata +2 -1
data/README.markdown
CHANGED
@@ -22,3 +22,21 @@ Run it:
|
|
22
22
|
$ switchboard roster list
|
23
23
|
$ switchboard roster add fireeagle.com
|
24
24
|
$ ...
|
25
|
+
|
26
|
+
Subscribe to a node using OAuth, overriding default settings:
|
27
|
+
|
28
|
+
$ switchboard --jid subscriber@example.com --password pa55word \
|
29
|
+
pubsub --oauth \
|
30
|
+
--oauth-consumer-key <consumer key> \
|
31
|
+
--oauth-consumer-secret <consumer secret> \
|
32
|
+
--oauth-token <token> \
|
33
|
+
--oauth-token-secret <token secret> \
|
34
|
+
--server fireeagle.com \
|
35
|
+
--node "/api/0.1/user/<token>" \
|
36
|
+
subscribe
|
37
|
+
|
38
|
+
Publish iTunes' current track using UserTune (XEP-0118):
|
39
|
+
|
40
|
+
$ switchboard --resource switchtunes pep tune
|
41
|
+
|
42
|
+
_You can do this using a JID that is already online._
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Switchboard
|
2
|
+
class Client < Core
|
3
|
+
attr_reader :client, :roster
|
4
|
+
|
5
|
+
def initialize(settings = Switchboard::Settings.new, spin = true)
|
6
|
+
super(settings, spin)
|
7
|
+
|
8
|
+
# TODO jid may already have a resource, so account for that
|
9
|
+
@client = Jabber::Client.new([settings["jid"], settings["resource"]] * "/")
|
10
|
+
|
11
|
+
on_stream_connected do
|
12
|
+
register_roster_callbacks
|
13
|
+
|
14
|
+
# tell others that we're online
|
15
|
+
presence
|
16
|
+
|
17
|
+
defer :roster_loaded do
|
18
|
+
# wait for the roster to load
|
19
|
+
roster.wait_for_roster
|
20
|
+
|
21
|
+
# roster has now been loaded
|
22
|
+
on(:roster_loaded)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def on_roster_presence(&block)
|
28
|
+
register_hook(:roster_presence, &block)
|
29
|
+
end
|
30
|
+
|
31
|
+
def on_roster_query(&block)
|
32
|
+
register_hook(:roster_query, &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
def on_roster_subscription(&block)
|
36
|
+
register_hook(:roster_subscription, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
def on_roster_subscription_request(&block)
|
40
|
+
register_hook(:roster_subscription_request, &block)
|
41
|
+
end
|
42
|
+
|
43
|
+
def on_roster_loaded(&block)
|
44
|
+
register_hook(:roster_loaded, &block)
|
45
|
+
end
|
46
|
+
|
47
|
+
def on_roster_update(&block)
|
48
|
+
register_hook(:roster_update, &block)
|
49
|
+
end
|
50
|
+
|
51
|
+
protected
|
52
|
+
|
53
|
+
def auth!
|
54
|
+
client.auth(settings["password"])
|
55
|
+
@roster = Jabber::Roster::Helper.new(client)
|
56
|
+
rescue Jabber::ClientAuthenticationFailure => e
|
57
|
+
puts "Could not authenticate as #{settings["jid"]}"
|
58
|
+
shutdown(false)
|
59
|
+
exit 1
|
60
|
+
end
|
61
|
+
|
62
|
+
def connect!
|
63
|
+
client.connect
|
64
|
+
auth!
|
65
|
+
end
|
66
|
+
|
67
|
+
def disconnect!
|
68
|
+
presence(:unavailable)
|
69
|
+
client.close
|
70
|
+
end
|
71
|
+
|
72
|
+
def presence(status = nil, to = nil)
|
73
|
+
presence = Jabber::Presence.new(nil, status)
|
74
|
+
presence.to = to
|
75
|
+
client.send(presence)
|
76
|
+
end
|
77
|
+
|
78
|
+
def register_roster_callbacks
|
79
|
+
# presence from someone on my roster
|
80
|
+
roster.add_presence_callback do |item, old_presence, new_presence|
|
81
|
+
on(:roster_presence, item, old_presence, new_presence)
|
82
|
+
end
|
83
|
+
|
84
|
+
# roster query completed (rarely used)
|
85
|
+
roster.add_query_callback do |query|
|
86
|
+
on(:roster_query, query)
|
87
|
+
end
|
88
|
+
|
89
|
+
# roster subscription
|
90
|
+
roster.add_subscription_callback do |item, presence|
|
91
|
+
# confirmation that we were able to subscribe to someone else
|
92
|
+
on(:roster_subscription, item, presence)
|
93
|
+
end
|
94
|
+
|
95
|
+
roster.add_subscription_request_callback do |item, presence|
|
96
|
+
# someone wants to subscribe to me!
|
97
|
+
on(:roster_subscription_request, item, presence)
|
98
|
+
end
|
99
|
+
|
100
|
+
# roster was updated (rarely used)
|
101
|
+
roster.add_update_callback do |old_item, new_item|
|
102
|
+
# roster has been updated; don't care
|
103
|
+
# puts "update: #{old_item.inspect}, #{new_item.inspect}"
|
104
|
+
on(:roster_update, old_item, new_item)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def stream
|
109
|
+
client
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -14,7 +14,7 @@ module Switchboard
|
|
14
14
|
description "Broadcasting UserTune (XEP-0118)"
|
15
15
|
|
16
16
|
def self.run!
|
17
|
-
switchboard = Switchboard::
|
17
|
+
switchboard = Switchboard::Client.new do
|
18
18
|
@tune_helper = Jabber::UserTune::Helper.new(client, nil)
|
19
19
|
|
20
20
|
itunes = Appscript.app('iTunes')
|
@@ -5,13 +5,9 @@ module Switchboard
|
|
5
5
|
description "Lists pubsub affiliations"
|
6
6
|
|
7
7
|
def self.run!
|
8
|
-
switchboard = Switchboard::
|
8
|
+
switchboard = Switchboard::Client.new do
|
9
9
|
defer :affiliations_received do
|
10
|
-
|
11
|
-
pubsub.get_affiliations(OPTIONS["pubsub.node"])
|
12
|
-
rescue Jabber::ServerError => e
|
13
|
-
puts e
|
14
|
-
end
|
10
|
+
pubsub.get_affiliations(OPTIONS["pubsub.node"])
|
15
11
|
end
|
16
12
|
|
17
13
|
def affiliations_received(affiliations)
|
@@ -5,20 +5,16 @@ module Switchboard
|
|
5
5
|
description "Gets the configuration for a pubsub node"
|
6
6
|
|
7
7
|
def self.run!
|
8
|
-
switchboard = Switchboard::
|
8
|
+
switchboard = Switchboard::Client.new do
|
9
9
|
defer :configuration_retrieved do
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
set_config_for(OPTIONS["pubsub.node"], config)
|
16
|
-
end
|
17
|
-
|
18
|
-
get_config_from(OPTIONS["pubsub.node"])
|
19
|
-
rescue Jabber::ServerError => e
|
20
|
-
puts e
|
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)
|
21
15
|
end
|
16
|
+
|
17
|
+
get_config_from(OPTIONS["pubsub.node"])
|
22
18
|
end
|
23
19
|
|
24
20
|
def configuration_retrieved(config)
|
@@ -10,16 +10,12 @@ module Switchboard
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.run!
|
13
|
-
switchboard = Switchboard::
|
13
|
+
switchboard = Switchboard::Client.new do
|
14
14
|
defer :node_created do
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
create_node(OPTIONS["pubsub.node"])
|
20
|
-
end
|
21
|
-
rescue Jabber::ServerError => e
|
22
|
-
puts e
|
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)
|
23
19
|
end
|
24
20
|
end
|
25
21
|
|
@@ -5,13 +5,9 @@ module Switchboard
|
|
5
5
|
description "Deletes a pubsub node"
|
6
6
|
|
7
7
|
def self.run!
|
8
|
-
switchboard = Switchboard::
|
8
|
+
switchboard = Switchboard::Client.new do
|
9
9
|
defer :node_deleted do
|
10
|
-
|
11
|
-
delete_node(OPTIONS["pubsub.node"])
|
12
|
-
rescue Jabber::ServerError => e
|
13
|
-
puts e
|
14
|
-
end
|
10
|
+
delete_node(OPTIONS["pubsub.node"])
|
15
11
|
end
|
16
12
|
|
17
13
|
def node_deleted(success)
|
@@ -6,14 +6,10 @@ module Switchboard
|
|
6
6
|
description "Gets information about a pubsub resource"
|
7
7
|
|
8
8
|
def self.run!
|
9
|
-
switchboard = Switchboard::
|
9
|
+
switchboard = Switchboard::Client.new do
|
10
10
|
defer :info_retrieved do
|
11
|
-
|
12
|
-
|
13
|
-
browser.get_info(OPTIONS["pubsub.server"], OPTIONS["pubsub.node"])
|
14
|
-
rescue Jabber::ServerError => e
|
15
|
-
puts e
|
16
|
-
end
|
11
|
+
browser = Jabber::PubSub::NodeBrowser.new(client)
|
12
|
+
browser.get_info(OPTIONS["pubsub.server"], OPTIONS["pubsub.node"])
|
17
13
|
end
|
18
14
|
|
19
15
|
def info_retrieved(info)
|
@@ -10,13 +10,9 @@ module Switchboard
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.run!
|
13
|
-
switchboard = Switchboard::
|
13
|
+
switchboard = Switchboard::Client.new do
|
14
14
|
defer :items_retrieved do
|
15
|
-
|
16
|
-
get_items_from(OPTIONS["pubsub.node"], OPTIONS["pubsub.items.count"])
|
17
|
-
rescue Jabber::ServerError => e
|
18
|
-
puts e
|
19
|
-
end
|
15
|
+
get_items_from(OPTIONS["pubsub.node"], OPTIONS["pubsub.items.count"])
|
20
16
|
end
|
21
17
|
|
22
18
|
def items_retrieved(items)
|
@@ -6,14 +6,10 @@ module Switchboard
|
|
6
6
|
description "Lists available pubsub nodes (maybe use pubsub.<server>)"
|
7
7
|
|
8
8
|
def self.run!
|
9
|
-
switchboard = Switchboard::
|
9
|
+
switchboard = Switchboard::Client.new do
|
10
10
|
defer :nodes_retrieved do
|
11
|
-
|
12
|
-
|
13
|
-
browser.nodes(OPTIONS["pubsub.server"])
|
14
|
-
rescue Jabber::ServerError => e
|
15
|
-
puts e
|
16
|
-
end
|
11
|
+
browser = Jabber::PubSub::NodeBrowser.new(client)
|
12
|
+
browser.nodes(OPTIONS["pubsub.server"])
|
17
13
|
end
|
18
14
|
|
19
15
|
def nodes_retrieved(nodes)
|
@@ -10,13 +10,9 @@ module Switchboard
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.run!
|
13
|
-
switchboard = Switchboard::
|
13
|
+
switchboard = Switchboard::Client.new do
|
14
14
|
defer :options_retrieved do
|
15
|
-
|
16
|
-
get_options_from(OPTIONS["pubsub.node"], OPTIONS["pubsub.subscriber"] || OPTIONS["jid"])
|
17
|
-
rescue Jabber::ServerError => e
|
18
|
-
puts e
|
19
|
-
end
|
15
|
+
get_options_from(OPTIONS["pubsub.node"], OPTIONS["pubsub.subscriber"] || OPTIONS["jid"])
|
20
16
|
end
|
21
17
|
|
22
18
|
def options_retrieved(options)
|
@@ -10,18 +10,14 @@ module Switchboard
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.run!
|
13
|
-
switchboard = Switchboard::
|
13
|
+
switchboard = Switchboard::Client.new do
|
14
14
|
defer :item_published do
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
publish_item_to(OPTIONS["pubsub.node"], item)
|
22
|
-
end
|
23
|
-
rescue Jabber::ServerError => e
|
24
|
-
puts e
|
15
|
+
item = Jabber::PubSub::Item.new
|
16
|
+
item.text = STDIN.read
|
17
|
+
if OPTIONS["pubsub.publish.id"]
|
18
|
+
publish_item_with_id_to(OPTIONS["pubsub.node"], item, OPTIONS["pubsub.publish.id"])
|
19
|
+
else
|
20
|
+
publish_item_to(OPTIONS["pubsub.node"], item)
|
25
21
|
end
|
26
22
|
end
|
27
23
|
|
@@ -5,13 +5,9 @@ module Switchboard
|
|
5
5
|
description "Purges a pubsub node"
|
6
6
|
|
7
7
|
def self.run!
|
8
|
-
switchboard = Switchboard::
|
8
|
+
switchboard = Switchboard::Client.new do
|
9
9
|
defer :node_purged do
|
10
|
-
|
11
|
-
purge_items_from(OPTIONS["pubsub.node"])
|
12
|
-
rescue Jabber::ServerError => e
|
13
|
-
puts e
|
14
|
-
end
|
10
|
+
purge_items_from(OPTIONS["pubsub.node"])
|
15
11
|
end
|
16
12
|
|
17
13
|
def node_purged(success)
|
@@ -5,14 +5,10 @@ module Switchboard
|
|
5
5
|
description "Subscribe to a pubsub node"
|
6
6
|
|
7
7
|
def self.run!
|
8
|
-
switchboard = Switchboard::
|
8
|
+
switchboard = Switchboard::Client.new do
|
9
9
|
# this executes in the main loop, so it doesn't really matter that this runs in a different thread
|
10
10
|
defer :subscribed do
|
11
|
-
|
12
|
-
subscribe_to(settings["pubsub.node"])
|
13
|
-
rescue Jabber::ServerError => e
|
14
|
-
puts e
|
15
|
-
end
|
11
|
+
subscribe_to(settings["pubsub.node"])
|
16
12
|
end
|
17
13
|
|
18
14
|
# define here or as hydrant.subscriptions_received
|
@@ -5,14 +5,10 @@ module Switchboard
|
|
5
5
|
description "List pubsub subscriptions"
|
6
6
|
|
7
7
|
def self.run!
|
8
|
-
switchboard = Switchboard::
|
8
|
+
switchboard = Switchboard::Client.new do
|
9
9
|
# this executes in the main loop, so it doesn't really matter that this runs in a different thread
|
10
10
|
defer :subscriptions_received do
|
11
|
-
|
12
|
-
subscriptions(settings["pubsub.node"])
|
13
|
-
rescue Jabber::ServerError => e
|
14
|
-
puts e
|
15
|
-
end
|
11
|
+
subscriptions(settings["pubsub.node"])
|
16
12
|
end
|
17
13
|
|
18
14
|
# define here or as hydrant.subscriptions_received
|
@@ -5,14 +5,10 @@ module Switchboard
|
|
5
5
|
description "Unsubscribe from a pubsub node"
|
6
6
|
|
7
7
|
def self.run!
|
8
|
-
switchboard = Switchboard::
|
8
|
+
switchboard = Switchboard::Client.new do
|
9
9
|
# this executes in the main loop, so it doesn't really matter that this runs in a different thread
|
10
10
|
defer :unsubscribed do
|
11
|
-
|
12
|
-
unsubscribe_from(settings["pubsub.node"])
|
13
|
-
rescue Jabber::ServerError => e
|
14
|
-
puts e
|
15
|
-
end
|
11
|
+
unsubscribe_from(settings["pubsub.node"])
|
16
12
|
end
|
17
13
|
|
18
14
|
# define here or as hydrant.subscriptions_received
|
@@ -3,7 +3,7 @@ module Switchboard
|
|
3
3
|
class Register < Switchboard::Command
|
4
4
|
description "Register a JID"
|
5
5
|
|
6
|
-
class Registration < Switchboard::
|
6
|
+
class Registration < Switchboard::Client
|
7
7
|
def initialize(settings = Switchboard::Settings.new, spin = false)
|
8
8
|
super(settings, false)
|
9
9
|
end
|
@@ -5,8 +5,9 @@ module Switchboard
|
|
5
5
|
description "Add a JID to your roster"
|
6
6
|
|
7
7
|
def self.run!
|
8
|
-
|
9
|
-
|
8
|
+
switchboard = Switchboard::Client.new(Switchboard::Settings.new, false)
|
9
|
+
|
10
|
+
switchboard.on_roster_loaded do
|
10
11
|
# add the server as a contact if it wasn't already added
|
11
12
|
ARGV.each do |jid|
|
12
13
|
if roster.find(jid).empty?
|
@@ -6,7 +6,9 @@ module Switchboard
|
|
6
6
|
|
7
7
|
def self.run!
|
8
8
|
# TODO override settings with values from the command line
|
9
|
-
switchboard = Switchboard::
|
9
|
+
switchboard = Switchboard::Client.new(Switchboard::Settings.new, false)
|
10
|
+
|
11
|
+
switchboard.on_roster_loaded do
|
10
12
|
if roster.items.any?
|
11
13
|
puts "#{settings["jid"]}'s roster:"
|
12
14
|
puts roster.items.keys.map { |jid| jid.to_s } * "\n"
|
@@ -4,14 +4,10 @@ module Switchboard
|
|
4
4
|
class Remove < Switchboard::Command
|
5
5
|
description "Remove a JID from your roster"
|
6
6
|
|
7
|
-
def self.options(opts)
|
8
|
-
super(opts)
|
9
|
-
# opts.on("-l", "--log=path", String, "Specifies a path to log script output.") { |v| OPTIONS[:log] = v }
|
10
|
-
end
|
11
|
-
|
12
7
|
def self.run!
|
13
|
-
|
14
|
-
|
8
|
+
switchboard = Switchboard::Client.new(Switchboard::Settings.new, false)
|
9
|
+
|
10
|
+
switchboard.on_roster_loaded do
|
15
11
|
ARGV.each do |jid|
|
16
12
|
if (items = roster.find(jid)).any?
|
17
13
|
item = items.values.first
|
data/lib/switchboard/core.rb
CHANGED
@@ -14,12 +14,11 @@ require 'switchboard/ext/delegate'
|
|
14
14
|
require 'switchboard/ext/instance_exec'
|
15
15
|
require 'xmpp4r/roster'
|
16
16
|
|
17
|
-
|
18
17
|
module Switchboard
|
19
18
|
class Core
|
20
19
|
include Timeout
|
21
20
|
|
22
|
-
attr_reader :
|
21
|
+
attr_reader :jacks, :settings
|
23
22
|
|
24
23
|
def initialize(settings = Switchboard::Settings.new, spin = true, &block)
|
25
24
|
# register a handler for SIGINTs
|
@@ -42,12 +41,9 @@ module Switchboard
|
|
42
41
|
@shutdown = false
|
43
42
|
@deferreds = {}
|
44
43
|
@main = block if block_given?
|
45
|
-
|
46
|
-
# TODO jid may already have a resource, so account for that
|
47
|
-
@client = Jabber::Client.new([settings["jid"], settings["resource"]] * "/")
|
48
44
|
end
|
49
45
|
|
50
|
-
#
|
46
|
+
# Start running.
|
51
47
|
def run!
|
52
48
|
startup
|
53
49
|
|
@@ -63,18 +59,22 @@ module Switchboard
|
|
63
59
|
# TODO don't start threads yet; wait until all startup hooks have been run
|
64
60
|
def defer(callback_name, timeout = 30, &block)
|
65
61
|
puts "Deferring to #{callback_name}..." if debug?
|
66
|
-
@deferreds[callback_name.to_sym] = Thread.new do
|
62
|
+
@deferreds[callback_name.to_sym] = Thread.new(callback_name.to_sym) do |callback|
|
67
63
|
|
68
64
|
begin
|
69
65
|
|
70
66
|
timeout(timeout) do
|
71
|
-
|
72
|
-
|
67
|
+
begin
|
68
|
+
results = instance_eval(&block)
|
69
|
+
send(callback, results) if respond_to?(callback)
|
70
|
+
rescue Jabber::ServerError => e
|
71
|
+
puts "Server error: #{e}"
|
72
|
+
end
|
73
73
|
end
|
74
74
|
|
75
|
-
puts "Done with #{
|
75
|
+
puts "Done with #{callback}." if debug?
|
76
76
|
# TODO make this thread-safe
|
77
|
-
@deferreds.delete(
|
77
|
+
@deferreds.delete(callback)
|
78
78
|
|
79
79
|
rescue Timeout::Error
|
80
80
|
puts "Deferred method timed out."
|
@@ -101,7 +101,7 @@ module Switchboard
|
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
104
|
-
# Register a hook to run when the Jabber::
|
104
|
+
# Register a hook to run when the Jabber::Stream encounters an exception.
|
105
105
|
def on_exception(&block)
|
106
106
|
register_hook(:exception, &block)
|
107
107
|
end
|
@@ -121,56 +121,24 @@ module Switchboard
|
|
121
121
|
register_hook(:presence, &block)
|
122
122
|
end
|
123
123
|
|
124
|
-
def on_roster_presence(&block)
|
125
|
-
register_hook(:roster_presence, &block)
|
126
|
-
end
|
127
|
-
|
128
|
-
def on_roster_query(&block)
|
129
|
-
register_hook(:roster_query, &block)
|
130
|
-
end
|
131
|
-
|
132
|
-
def on_roster_subscription(&block)
|
133
|
-
register_hook(:roster_subscription, &block)
|
134
|
-
end
|
135
|
-
|
136
|
-
def on_roster_subscription_request(&block)
|
137
|
-
register_hook(:roster_subscription_request, &block)
|
138
|
-
end
|
139
|
-
|
140
|
-
def on_roster_loaded(&block)
|
141
|
-
register_hook(:roster_loaded, &block)
|
142
|
-
end
|
143
|
-
|
144
|
-
def on_roster_update(&block)
|
145
|
-
register_hook(:roster_update, &block)
|
146
|
-
end
|
147
|
-
|
148
124
|
# Register a startup hook.
|
149
|
-
# Hooks will be given 5 seconds to complete before moving on.
|
150
125
|
def on_startup(&block)
|
151
126
|
register_hook(:startup, &block)
|
152
127
|
end
|
153
128
|
|
129
|
+
def on_stream_connected(&block)
|
130
|
+
register_hook(:stream_connected, &block)
|
131
|
+
end
|
132
|
+
|
154
133
|
# Register a shutdown hook.
|
155
|
-
# Hooks will be given 5 seconds to complete before moving on.
|
156
134
|
def on_shutdown(&block)
|
157
135
|
register_hook(:shutdown, &block)
|
158
136
|
end
|
159
137
|
|
160
138
|
protected
|
161
139
|
|
162
|
-
def auth!
|
163
|
-
client.auth(settings["password"])
|
164
|
-
@roster = Jabber::Roster::Helper.new(client)
|
165
|
-
rescue Jabber::ClientAuthenticationFailure => e
|
166
|
-
puts "Could not authenticate as #{settings["jid"]}"
|
167
|
-
shutdown(false)
|
168
|
-
exit 1
|
169
|
-
end
|
170
|
-
|
171
140
|
def connect!
|
172
|
-
|
173
|
-
auth!
|
141
|
+
raise NotImplementedError, "subclasses of Switchboard::Core must implement connect!"
|
174
142
|
end
|
175
143
|
|
176
144
|
def connected?
|
@@ -181,9 +149,8 @@ module Switchboard
|
|
181
149
|
settings["debug"]
|
182
150
|
end
|
183
151
|
|
184
|
-
def disconnect
|
185
|
-
|
186
|
-
client.close
|
152
|
+
def disconnect!
|
153
|
+
raise NotImplementedError, "subclasses of Switchboard::Core must implement disconnect!"
|
187
154
|
end
|
188
155
|
|
189
156
|
def register_hook(name, &block)
|
@@ -220,14 +187,8 @@ module Switchboard
|
|
220
187
|
@loop
|
221
188
|
end
|
222
189
|
|
223
|
-
def presence(status = nil, to = nil)
|
224
|
-
presence = Jabber::Presence.new(nil, status)
|
225
|
-
presence.to = to
|
226
|
-
client.send(presence)
|
227
|
-
end
|
228
|
-
|
229
190
|
def register_default_callbacks
|
230
|
-
|
191
|
+
stream.on_exception do |e, stream, where|
|
231
192
|
on(:exception, e, stream, where)
|
232
193
|
|
233
194
|
case where
|
@@ -238,49 +199,19 @@ module Switchboard
|
|
238
199
|
end
|
239
200
|
end
|
240
201
|
|
241
|
-
|
202
|
+
stream.add_presence_callback do |presence|
|
242
203
|
on(:presence, presence)
|
243
204
|
end
|
244
205
|
|
245
|
-
|
206
|
+
stream.add_message_callback do |message|
|
246
207
|
on(:message, message)
|
247
208
|
end
|
248
209
|
|
249
|
-
|
210
|
+
stream.add_iq_callback do |iq|
|
250
211
|
on(:iq, iq)
|
251
212
|
end
|
252
213
|
end
|
253
214
|
|
254
|
-
def register_roster_callbacks
|
255
|
-
# presence from someone on my roster
|
256
|
-
roster.add_presence_callback do |item, old_presence, new_presence|
|
257
|
-
on(:roster_presence, item, old_presence, new_presence)
|
258
|
-
end
|
259
|
-
|
260
|
-
# roster query completed (rarely used)
|
261
|
-
roster.add_query_callback do |query|
|
262
|
-
on(:roster_query, query)
|
263
|
-
end
|
264
|
-
|
265
|
-
# roster subscription
|
266
|
-
roster.add_subscription_callback do |item, presence|
|
267
|
-
# confirmation that we were able to subscribe to someone else
|
268
|
-
on(:roster_subscription, item, presence)
|
269
|
-
end
|
270
|
-
|
271
|
-
roster.add_subscription_request_callback do |item, presence|
|
272
|
-
# someone wants to subscribe to me!
|
273
|
-
on(:roster_subscription_request, item, presence)
|
274
|
-
end
|
275
|
-
|
276
|
-
# roster was updated (rarely used)
|
277
|
-
roster.add_update_callback do |old_item, new_item|
|
278
|
-
# roster has been updated; don't care
|
279
|
-
# puts "update: #{old_item.inspect}, #{new_item.inspect}"
|
280
|
-
on(:roster_update, old_item, new_item)
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
215
|
def startup
|
285
216
|
begin
|
286
217
|
timeout(30) do
|
@@ -288,13 +219,7 @@ module Switchboard
|
|
288
219
|
@connected = true
|
289
220
|
|
290
221
|
register_default_callbacks
|
291
|
-
|
292
|
-
|
293
|
-
# tell others that we're online
|
294
|
-
presence
|
295
|
-
|
296
|
-
# wait for the roster to load
|
297
|
-
roster.wait_for_roster
|
222
|
+
on(:stream_connected)
|
298
223
|
end
|
299
224
|
rescue Timeout::Error
|
300
225
|
puts "Startup took too long. Shutting down."
|
@@ -302,9 +227,6 @@ module Switchboard
|
|
302
227
|
exit 1
|
303
228
|
end
|
304
229
|
|
305
|
-
# roster has now been loaded
|
306
|
-
on(:roster_loaded)
|
307
|
-
|
308
230
|
puts "Core startup completed." if debug?
|
309
231
|
|
310
232
|
# run startup hooks
|
@@ -313,6 +235,10 @@ module Switchboard
|
|
313
235
|
puts "=> Switchboard started."
|
314
236
|
end
|
315
237
|
|
238
|
+
def stream
|
239
|
+
raise NotImplementedError, "subclasses of Switchboard::Core must implement stream"
|
240
|
+
end
|
241
|
+
|
316
242
|
def shutdown!
|
317
243
|
puts "Shutdown initiated."
|
318
244
|
@shutdown = true
|
@@ -328,7 +254,7 @@ module Switchboard
|
|
328
254
|
on(:shutdown) if run_hooks
|
329
255
|
|
330
256
|
puts "Shutting down..." if debug?
|
331
|
-
disconnect if connected?
|
257
|
+
disconnect! if connected?
|
332
258
|
end
|
333
259
|
|
334
260
|
def shutdown?
|
data/lib/switchboard/version.rb
CHANGED
data/switchboard.gemspec
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "switchboard"
|
3
|
-
s.version = "0.0.
|
3
|
+
s.version = "0.0.6"
|
4
4
|
s.summary = "XMPP toolkit."
|
5
5
|
s.description = "A toolkit for assembling XMPP clients and interacting with XMPP servers."
|
6
6
|
s.authors = ["Seth Fitzsimmons"]
|
7
7
|
s.email = ["seth@mojodna.net"]
|
8
8
|
|
9
|
-
s.files = ["bin/switchboard", "examples/election_results.rb", "lib/switchboard/colors.rb", "lib/switchboard/commands/command.rb", "lib/switchboard/commands/config/config.rb", "lib/switchboard/commands/config.rb", "lib/switchboard/commands/default.rb", "lib/switchboard/commands/help/help.rb", "lib/switchboard/commands/help.rb", "lib/switchboard/commands/pep/pep.rb", "lib/switchboard/commands/pep/tune.rb", "lib/switchboard/commands/pep.rb", "lib/switchboard/commands/pubsub/affiliations.rb", "lib/switchboard/commands/pubsub/config.rb", "lib/switchboard/commands/pubsub/create.rb", "lib/switchboard/commands/pubsub/delete.rb", "lib/switchboard/commands/pubsub/info.rb", "lib/switchboard/commands/pubsub/items.rb", "lib/switchboard/commands/pubsub/listen.rb", "lib/switchboard/commands/pubsub/nodes.rb", "lib/switchboard/commands/pubsub/options.rb", "lib/switchboard/commands/pubsub/publish.rb", "lib/switchboard/commands/pubsub/pubsub.rb", "lib/switchboard/commands/pubsub/purge.rb", "lib/switchboard/commands/pubsub/subscribe.rb", "lib/switchboard/commands/pubsub/subscriptions.rb", "lib/switchboard/commands/pubsub/unsubscribe.rb", "lib/switchboard/commands/pubsub.rb", "lib/switchboard/commands/register.rb", "lib/switchboard/commands/roster/add.rb", "lib/switchboard/commands/roster/list.rb", "lib/switchboard/commands/roster/remove.rb", "lib/switchboard/commands/roster/roster.rb", "lib/switchboard/commands/roster.rb", "lib/switchboard/commands/unregister.rb", "lib/switchboard/commands.rb", "lib/switchboard/core.rb", "lib/switchboard/ext/delegate.rb", "lib/switchboard/ext/instance_exec.rb", "lib/switchboard/helpers/oauth_pubsub.rb", "lib/switchboard/helpers/pubsub.rb", "lib/switchboard/jacks/auto_accept.rb", "lib/switchboard/jacks/debug.rb", "lib/switchboard/jacks/notify.rb", "lib/switchboard/jacks/oauth_pubsub.rb", "lib/switchboard/jacks/pubsub.rb", "lib/switchboard/jacks/roster_debug.rb", "lib/switchboard/jacks.rb", "lib/switchboard/oauth/request_proxy/mock_request.rb", "lib/switchboard/settings.rb", "lib/switchboard/switchboard.rb", "lib/switchboard/version.rb", "lib/switchboard/xmpp4r/pubsub/helper/oauth_service_helper.rb", "lib/switchboard.rb", "Rakefile", "README.markdown", "switchboard.gemspec"]
|
9
|
+
s.files = ["bin/switchboard", "examples/election_results.rb", "lib/switchboard/client.rb", "lib/switchboard/colors.rb", "lib/switchboard/commands/command.rb", "lib/switchboard/commands/config/config.rb", "lib/switchboard/commands/config.rb", "lib/switchboard/commands/default.rb", "lib/switchboard/commands/help/help.rb", "lib/switchboard/commands/help.rb", "lib/switchboard/commands/pep/pep.rb", "lib/switchboard/commands/pep/tune.rb", "lib/switchboard/commands/pep.rb", "lib/switchboard/commands/pubsub/affiliations.rb", "lib/switchboard/commands/pubsub/config.rb", "lib/switchboard/commands/pubsub/create.rb", "lib/switchboard/commands/pubsub/delete.rb", "lib/switchboard/commands/pubsub/info.rb", "lib/switchboard/commands/pubsub/items.rb", "lib/switchboard/commands/pubsub/listen.rb", "lib/switchboard/commands/pubsub/nodes.rb", "lib/switchboard/commands/pubsub/options.rb", "lib/switchboard/commands/pubsub/publish.rb", "lib/switchboard/commands/pubsub/pubsub.rb", "lib/switchboard/commands/pubsub/purge.rb", "lib/switchboard/commands/pubsub/subscribe.rb", "lib/switchboard/commands/pubsub/subscriptions.rb", "lib/switchboard/commands/pubsub/unsubscribe.rb", "lib/switchboard/commands/pubsub.rb", "lib/switchboard/commands/register.rb", "lib/switchboard/commands/roster/add.rb", "lib/switchboard/commands/roster/list.rb", "lib/switchboard/commands/roster/remove.rb", "lib/switchboard/commands/roster/roster.rb", "lib/switchboard/commands/roster.rb", "lib/switchboard/commands/unregister.rb", "lib/switchboard/commands.rb", "lib/switchboard/core.rb", "lib/switchboard/ext/delegate.rb", "lib/switchboard/ext/instance_exec.rb", "lib/switchboard/helpers/oauth_pubsub.rb", "lib/switchboard/helpers/pubsub.rb", "lib/switchboard/jacks/auto_accept.rb", "lib/switchboard/jacks/debug.rb", "lib/switchboard/jacks/notify.rb", "lib/switchboard/jacks/oauth_pubsub.rb", "lib/switchboard/jacks/pubsub.rb", "lib/switchboard/jacks/roster_debug.rb", "lib/switchboard/jacks.rb", "lib/switchboard/oauth/request_proxy/mock_request.rb", "lib/switchboard/settings.rb", "lib/switchboard/switchboard.rb", "lib/switchboard/version.rb", "lib/switchboard/xmpp4r/pubsub/helper/oauth_service_helper.rb", "lib/switchboard.rb", "Rakefile", "README.markdown", "switchboard.gemspec"]
|
10
10
|
s.executables = ["switchboard"]
|
11
11
|
s.require_paths = ["lib"]
|
12
12
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mojodna-switchboard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Seth Fitzsimmons
|
@@ -51,6 +51,7 @@ extra_rdoc_files: []
|
|
51
51
|
files:
|
52
52
|
- bin/switchboard
|
53
53
|
- examples/election_results.rb
|
54
|
+
- lib/switchboard/client.rb
|
54
55
|
- lib/switchboard/colors.rb
|
55
56
|
- lib/switchboard/commands/command.rb
|
56
57
|
- lib/switchboard/commands/config/config.rb
|