em-xmpp 0.0.11 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/xmig +40 -37
- data/em-xmpp.gemspec +1 -0
- data/lib/em-xmpp.rb +0 -2
- data/lib/em-xmpp/component.rb +18 -0
- data/lib/em-xmpp/connection.rb +35 -103
- data/lib/em-xmpp/context.rb +37 -19
- data/lib/em-xmpp/entity.rb +219 -223
- data/lib/em-xmpp/evented.rb +183 -0
- data/lib/em-xmpp/handler.rb +89 -86
- data/lib/em-xmpp/helpers.rb +39 -38
- data/lib/em-xmpp/namespaces.rb +1 -0
- data/lib/em-xmpp/non-em.rb +95 -0
- data/lib/em-xmpp/version.rb +1 -1
- data/lib/em-xmpp/xml_builder.rb +160 -0
- data/lib/em-xmpp/xml_parser.rb +344 -0
- data/samples/hello.rb +6 -3
- data/samples/non-em-hello.rb +90 -0
- metadata +25 -9
- data/lib/em-xmpp/connector.rb +0 -244
data/samples/hello.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
$LOAD_PATH.unshift './lib'
|
2
|
-
require 'em-xmpp'
|
2
|
+
require 'em-xmpp/connection'
|
3
3
|
require 'em-xmpp/helpers'
|
4
4
|
|
5
5
|
if ARGV.empty?
|
@@ -9,11 +9,14 @@ end
|
|
9
9
|
|
10
10
|
jid = ARGV.first
|
11
11
|
pass = ARGV[1]
|
12
|
-
|
12
|
+
server = ARGV[2]
|
13
|
+
port = ARGV[3]
|
14
|
+
certdir = ARGV[4]
|
13
15
|
|
14
16
|
module RosterClient
|
15
17
|
attr_reader :roster
|
16
18
|
|
19
|
+
include EM::Xmpp::XmlParser::Nokogiri
|
17
20
|
include EM::Xmpp::Helpers
|
18
21
|
|
19
22
|
def ready
|
@@ -84,5 +87,5 @@ end
|
|
84
87
|
cfg = {:certificates => certdir}
|
85
88
|
|
86
89
|
EM.run do
|
87
|
-
conn = EM::Xmpp::Connection.start(jid, pass, RosterClient, cfg)
|
90
|
+
conn = EM::Xmpp::Connection.start(jid, pass, RosterClient, cfg, server, port)
|
88
91
|
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
$LOAD_PATH.unshift './lib'
|
2
|
+
require 'em-xmpp/non-em'
|
3
|
+
require 'em-xmpp/helpers'
|
4
|
+
|
5
|
+
if ARGV.empty?
|
6
|
+
puts "usage: #{__FILE__} <jid> [<pass>] [certificates-dir]"
|
7
|
+
exit 0
|
8
|
+
end
|
9
|
+
|
10
|
+
jid = ARGV.first
|
11
|
+
pass = ARGV[1]
|
12
|
+
server = ARGV[2]
|
13
|
+
port = ARGV[3]
|
14
|
+
certdir = ARGV[4]
|
15
|
+
|
16
|
+
module RosterClient
|
17
|
+
attr_reader :roster
|
18
|
+
|
19
|
+
include EM::Xmpp::XmlParser::Nokogiri
|
20
|
+
include EM::Xmpp::Helpers
|
21
|
+
|
22
|
+
def ready
|
23
|
+
super #setup helpers
|
24
|
+
puts "***** #{@jid} ready"
|
25
|
+
|
26
|
+
on_presence do |ctx|
|
27
|
+
presence = ctx.bit(:presence)
|
28
|
+
|
29
|
+
if presence.subscription_request?
|
30
|
+
puts "**** accepting subscription from #{presence.from}"
|
31
|
+
send_stanza presence.reply('type'=>'subscribed')
|
32
|
+
presence.from.subscribe
|
33
|
+
presence.from.add_to_roster
|
34
|
+
else
|
35
|
+
puts "**** #{presence.from} is present"
|
36
|
+
end
|
37
|
+
|
38
|
+
ctx #returns a ctx for subsequent handlers if any
|
39
|
+
end
|
40
|
+
|
41
|
+
on_message do |ctx|
|
42
|
+
msg = ctx.bit :message
|
43
|
+
|
44
|
+
puts "**** message from #{msg.from}"
|
45
|
+
|
46
|
+
key = msg.from.to_s
|
47
|
+
|
48
|
+
conv = conversation(key)
|
49
|
+
|
50
|
+
if conv
|
51
|
+
conv.resume ctx
|
52
|
+
else
|
53
|
+
x = rand(300)
|
54
|
+
y = rand(300)
|
55
|
+
start_conversation(ctx, key) do |c|
|
56
|
+
rep = c.send_stanza(msg.reply{|xml| xml.body("how much is #{x} - #{y} ?")}, 5)
|
57
|
+
greeting = if rep.interrupted?
|
58
|
+
if rep.ctx.bit(:message).body == (x - y).to_s
|
59
|
+
"great!"
|
60
|
+
else
|
61
|
+
"wrong: #{x - y}"
|
62
|
+
end
|
63
|
+
else
|
64
|
+
"too slow, laggard"
|
65
|
+
end
|
66
|
+
self.send_stanza(msg.reply{|xml| xml.body(greeting)})
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
ctx #returns a ctx for subsequent handlers if any
|
71
|
+
end
|
72
|
+
|
73
|
+
on_exception(:anything) do |ctx|
|
74
|
+
p "rescued error"
|
75
|
+
raise ctx.env['error']
|
76
|
+
ctx
|
77
|
+
end
|
78
|
+
|
79
|
+
puts "***** friends list"
|
80
|
+
subscriptions = get_roster
|
81
|
+
subscriptions.each do |sub|
|
82
|
+
p sub.to_a
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
cfg = {:certificates => certdir}
|
88
|
+
|
89
|
+
bot = EM::Xmpp::NonEM::Connection.start(jid, pass, RosterClient, cfg, server, port)
|
90
|
+
bot.event_loop
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-xmpp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-09-18 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: eventmachine
|
16
|
-
requirement: &
|
16
|
+
requirement: &2153173140 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2153173140
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: nokogiri
|
27
|
-
requirement: &
|
27
|
+
requirement: &2153172720 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,21 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2153172720
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: ox
|
38
|
+
requirement: &2153172300 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *2153172300
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: ruby-sasl
|
38
|
-
requirement: &
|
49
|
+
requirement: &2153171880 !ruby/object:Gem::Requirement
|
39
50
|
none: false
|
40
51
|
requirements:
|
41
52
|
- - ! '>='
|
@@ -43,7 +54,7 @@ dependencies:
|
|
43
54
|
version: '0'
|
44
55
|
type: :runtime
|
45
56
|
prerelease: false
|
46
|
-
version_requirements: *
|
57
|
+
version_requirements: *2153171880
|
47
58
|
description: XMPP client for event machine
|
48
59
|
email:
|
49
60
|
- crapooze@gmail.com
|
@@ -61,21 +72,26 @@ files:
|
|
61
72
|
- em-xmpp.gemspec
|
62
73
|
- lib/em-xmpp.rb
|
63
74
|
- lib/em-xmpp/cert_store.rb
|
75
|
+
- lib/em-xmpp/component.rb
|
64
76
|
- lib/em-xmpp/connection.rb
|
65
|
-
- lib/em-xmpp/connector.rb
|
66
77
|
- lib/em-xmpp/context.rb
|
67
78
|
- lib/em-xmpp/conversation.rb
|
68
79
|
- lib/em-xmpp/entity.rb
|
80
|
+
- lib/em-xmpp/evented.rb
|
69
81
|
- lib/em-xmpp/handler.rb
|
70
82
|
- lib/em-xmpp/helpers.rb
|
71
83
|
- lib/em-xmpp/jid.rb
|
72
84
|
- lib/em-xmpp/namespaces.rb
|
73
85
|
- lib/em-xmpp/nodes.rb
|
86
|
+
- lib/em-xmpp/non-em.rb
|
74
87
|
- lib/em-xmpp/resolver.rb
|
75
88
|
- lib/em-xmpp/stanza_handler.rb
|
76
89
|
- lib/em-xmpp/stanza_matcher.rb
|
77
90
|
- lib/em-xmpp/version.rb
|
91
|
+
- lib/em-xmpp/xml_builder.rb
|
92
|
+
- lib/em-xmpp/xml_parser.rb
|
78
93
|
- samples/hello.rb
|
94
|
+
- samples/non-em-hello.rb
|
79
95
|
homepage: https://github.com/crapooze/em-xmpp
|
80
96
|
licenses: []
|
81
97
|
post_install_message:
|
data/lib/em-xmpp/connector.rb
DELETED
@@ -1,244 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'nokogiri'
|
3
|
-
require 'eventmachine'
|
4
|
-
require 'em-xmpp/context'
|
5
|
-
require 'em-xmpp/namespaces'
|
6
|
-
require 'em-xmpp/resolver'
|
7
|
-
|
8
|
-
module EM::Xmpp
|
9
|
-
module Connector
|
10
|
-
include Namespaces
|
11
|
-
|
12
|
-
#XML SAX document which delegates its method to a recipient object
|
13
|
-
class ForwardingDocument < Nokogiri::XML::SAX::Document
|
14
|
-
attr_accessor :recipient
|
15
|
-
%w{xmldecl start_document end_document start_element_namespace end_element characters
|
16
|
-
comment warning error cdata_block}.each do |meth|
|
17
|
-
meth2 = "xml_#{meth}"
|
18
|
-
define_method(meth) do |*args|
|
19
|
-
recipient.send(meth2, *args) if recipient
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.included(obj)
|
25
|
-
obj.extend ClassMethods
|
26
|
-
end
|
27
|
-
|
28
|
-
module ClassMethods
|
29
|
-
def start(jid, pass=nil, mod=nil, cfg={}, server=nil, port=5222, &blk)
|
30
|
-
jid = JID.parse jid
|
31
|
-
if server.nil?
|
32
|
-
record = Resolver.resolve jid.domain
|
33
|
-
if record
|
34
|
-
server = record.target.to_s
|
35
|
-
port = record.port
|
36
|
-
else
|
37
|
-
server = jid.domain
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
EM.connect(server, port, self, jid, pass, mod, cfg, &blk)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
extend ClassMethods
|
46
|
-
|
47
|
-
def send_raw(data)
|
48
|
-
puts ">> out\n#{data}\n" if $DEBUG
|
49
|
-
send_data data
|
50
|
-
end
|
51
|
-
|
52
|
-
def send_xml(&blk)
|
53
|
-
data = build_xml(&blk)
|
54
|
-
send_raw data
|
55
|
-
end
|
56
|
-
|
57
|
-
def restart_xml_stream
|
58
|
-
@xml_parser.document.recipient = nil
|
59
|
-
post_init
|
60
|
-
end
|
61
|
-
|
62
|
-
def post_init
|
63
|
-
doc = ForwardingDocument.new
|
64
|
-
doc.recipient = self
|
65
|
-
@xml_parser = Nokogiri::XML::SAX::PushParser.new doc
|
66
|
-
@stack = []
|
67
|
-
@stanza = nil
|
68
|
-
@streamdoc = nil
|
69
|
-
|
70
|
-
open_xml_stream
|
71
|
-
end
|
72
|
-
|
73
|
-
def receive_data(dat)
|
74
|
-
puts "<< in\n#{dat}\n" if $DEBUG
|
75
|
-
@xml_parser << dat
|
76
|
-
end
|
77
|
-
|
78
|
-
def unbind
|
79
|
-
puts "**** unbound ****" if $DEBUG
|
80
|
-
end
|
81
|
-
|
82
|
-
def build_xml(&blk)
|
83
|
-
n = Nokogiri::XML::Builder.new(&blk)
|
84
|
-
n.doc.root.to_xml
|
85
|
-
end
|
86
|
-
|
87
|
-
private
|
88
|
-
|
89
|
-
def open_xml_stream_tag
|
90
|
-
domain = @jid.domain
|
91
|
-
version = '1.0'
|
92
|
-
lang = 'en'
|
93
|
-
start_stream = <<-STREAM
|
94
|
-
<stream:stream
|
95
|
-
to='#{domain}'
|
96
|
-
version='#{version}'
|
97
|
-
xml:lang='#{lang}'
|
98
|
-
xmlns='#{Client}'
|
99
|
-
xmlns:stream='#{Stream}'
|
100
|
-
>
|
101
|
-
STREAM
|
102
|
-
end
|
103
|
-
|
104
|
-
def close_xml_stream_tag
|
105
|
-
'</stream:stream>'
|
106
|
-
end
|
107
|
-
|
108
|
-
def open_xml_stream
|
109
|
-
send_raw open_xml_stream_tag
|
110
|
-
end
|
111
|
-
|
112
|
-
def close_xml_stream
|
113
|
-
send_raw close_xml_stream_tag
|
114
|
-
end
|
115
|
-
|
116
|
-
### XML world
|
117
|
-
|
118
|
-
def xml_xmldecl(version,encoding,standalone)
|
119
|
-
end
|
120
|
-
|
121
|
-
def xml_start_document
|
122
|
-
#XXX set namespaces and stream prefix
|
123
|
-
# namespace may depend on the type of connection ('jabber:client' or
|
124
|
-
# 'jabber:server')
|
125
|
-
# currently we do not set any stream's namespace, hence when builidng stanza,
|
126
|
-
# we must explicitely avoid writing the namespace of iq/presence/message XML nodes
|
127
|
-
@streamdoc = Nokogiri::XML::Document.new
|
128
|
-
end
|
129
|
-
|
130
|
-
def xml_end_document
|
131
|
-
@streamdoc = @stanza = @stack = @xml_parser = nil
|
132
|
-
end
|
133
|
-
|
134
|
-
def xml_start_element_namespace(name, attrs=[],prefix=nil,uri=nil,ns=[])
|
135
|
-
node = Nokogiri::XML::Node.new(name, @streamdoc)
|
136
|
-
attrs.each do |attr|
|
137
|
-
#attr is a Struct with members localname/prefix/uri/value
|
138
|
-
node[attr.localname] = attr.value
|
139
|
-
end
|
140
|
-
#XXX - if prefix is there maybe we do not want to set uri as default
|
141
|
-
node.default_namespace = uri if uri
|
142
|
-
|
143
|
-
ns.each do |pfx,href|
|
144
|
-
node.add_namespace_definition pfx, href
|
145
|
-
end
|
146
|
-
|
147
|
-
# puts "starting: #{name}, stack:#{@stack.size}" if $DEBUG
|
148
|
-
case @stack.size
|
149
|
-
when 0 #the streaming tag starts
|
150
|
-
stream_support(node)
|
151
|
-
when 1 #a stanza starts
|
152
|
-
set_current_stanza!(node)
|
153
|
-
stanza_start node
|
154
|
-
else
|
155
|
-
@stack.last.add_child node
|
156
|
-
end
|
157
|
-
|
158
|
-
@stack << node
|
159
|
-
end
|
160
|
-
|
161
|
-
def xml_end_element(name)
|
162
|
-
node = @stack.pop
|
163
|
-
#puts "ending: #{name}, stack:#{@stack.size}" if $DEBUG
|
164
|
-
|
165
|
-
case @stack.size
|
166
|
-
when 0 #i.e., the stream support ends
|
167
|
-
xml_stream_closing
|
168
|
-
when 1 #i.e., we've finished a stanza
|
169
|
-
raise RuntimeError, "should end on a stanza" unless node == @stanza
|
170
|
-
stanza_end node
|
171
|
-
else
|
172
|
-
#the stanza keeps growing
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
def xml_characters(txt)
|
177
|
-
@stack.last << Nokogiri::XML::Text.new(txt, @streamdoc)
|
178
|
-
end
|
179
|
-
|
180
|
-
def xml_error(err)
|
181
|
-
#raise RuntimeError, err
|
182
|
-
end
|
183
|
-
|
184
|
-
def xml_stream_closing
|
185
|
-
close_xml_stream
|
186
|
-
close_connection
|
187
|
-
end
|
188
|
-
|
189
|
-
def xml_comment(comm)
|
190
|
-
raise NotImplementedError
|
191
|
-
end
|
192
|
-
|
193
|
-
def xml_warning(warn)
|
194
|
-
raise NotImplementedError
|
195
|
-
end
|
196
|
-
|
197
|
-
def xml_cdata_block(data)
|
198
|
-
raise NotImplementedError
|
199
|
-
end
|
200
|
-
|
201
|
-
### XMPP World
|
202
|
-
|
203
|
-
def stream_support(node)
|
204
|
-
@stanza = Nokogiri::XML::Node.new('dummy', @streamdoc)
|
205
|
-
node << @stanza
|
206
|
-
|
207
|
-
@streamdoc.root = node
|
208
|
-
end
|
209
|
-
|
210
|
-
def set_current_stanza!(node)
|
211
|
-
@stanza.remove
|
212
|
-
|
213
|
-
@stanza = node
|
214
|
-
@streamdoc.root << @stanza
|
215
|
-
end
|
216
|
-
|
217
|
-
def stanza_start(node)
|
218
|
-
raise NotImplementedError
|
219
|
-
end
|
220
|
-
|
221
|
-
def stanza_end(node)
|
222
|
-
raise NotImplementedError
|
223
|
-
end
|
224
|
-
|
225
|
-
public
|
226
|
-
|
227
|
-
### TLS World
|
228
|
-
|
229
|
-
def ask_for_tls
|
230
|
-
send_xml do |x|
|
231
|
-
x.starttls(:xmlns => TLS)
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
def start_using_tls_and_reset_stream
|
236
|
-
start_tls(:verify_peer => false)
|
237
|
-
restart_xml_stream
|
238
|
-
end
|
239
|
-
|
240
|
-
def ssl_verify_peer(pem)
|
241
|
-
raise NotImplementedError
|
242
|
-
end
|
243
|
-
end
|
244
|
-
end
|