ln-xmpp4r 0.5
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/CHANGELOG +91 -0
- data/COPYING +340 -0
- data/LICENSE +59 -0
- data/README.rdoc +113 -0
- data/README_ruby19.txt +43 -0
- data/Rakefile +252 -0
- data/data/doc/xmpp4r/examples/advanced/adventure/README +56 -0
- data/data/doc/xmpp4r/examples/advanced/adventure/adventure.rb +23 -0
- data/data/doc/xmpp4r/examples/advanced/adventure/adventuremuc.rb +136 -0
- data/data/doc/xmpp4r/examples/advanced/adventure/cube.xml +15 -0
- data/data/doc/xmpp4r/examples/advanced/adventure/tower.xml +69 -0
- data/data/doc/xmpp4r/examples/advanced/adventure/world.rb +424 -0
- data/data/doc/xmpp4r/examples/advanced/fileserve.conf +11 -0
- data/data/doc/xmpp4r/examples/advanced/fileserve.rb +346 -0
- data/data/doc/xmpp4r/examples/advanced/getonline.rb +56 -0
- data/data/doc/xmpp4r/examples/advanced/gtkmucclient.rb +315 -0
- data/data/doc/xmpp4r/examples/advanced/migrate.rb +88 -0
- data/data/doc/xmpp4r/examples/advanced/minimuc.rb +266 -0
- data/data/doc/xmpp4r/examples/advanced/pep-aggregator/index.xsl +235 -0
- data/data/doc/xmpp4r/examples/advanced/pep-aggregator/pep-aggregator.rb +147 -0
- data/data/doc/xmpp4r/examples/advanced/recvfile.rb +84 -0
- data/data/doc/xmpp4r/examples/advanced/rosterdiscovery.rb +129 -0
- data/data/doc/xmpp4r/examples/advanced/sendfile.conf +10 -0
- data/data/doc/xmpp4r/examples/advanced/sendfile.rb +72 -0
- data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr.rb +51 -0
- data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_jabber.rb +43 -0
- data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_test.rb +10 -0
- data/data/doc/xmpp4r/examples/advanced/versionpoll.rb +109 -0
- data/data/doc/xmpp4r/examples/advanced/xmpping.rb +146 -0
- data/data/doc/xmpp4r/examples/advanced/xmppingrc.sample +14 -0
- data/data/doc/xmpp4r/examples/basic/change_password.rb +41 -0
- data/data/doc/xmpp4r/examples/basic/client.rb +70 -0
- data/data/doc/xmpp4r/examples/basic/component.rb +11 -0
- data/data/doc/xmpp4r/examples/basic/echo.rb +37 -0
- data/data/doc/xmpp4r/examples/basic/jabbersend.rb +41 -0
- data/data/doc/xmpp4r/examples/basic/mass_sender.rb +68 -0
- data/data/doc/xmpp4r/examples/basic/muc_owner_config.rb +12 -0
- data/data/doc/xmpp4r/examples/basic/mucinfo.rb +41 -0
- data/data/doc/xmpp4r/examples/basic/mucsimplebot.rb +82 -0
- data/data/doc/xmpp4r/examples/basic/register.rb +42 -0
- data/data/doc/xmpp4r/examples/basic/remove_registration.rb +18 -0
- data/data/doc/xmpp4r/examples/basic/roster.rb +44 -0
- data/data/doc/xmpp4r/examples/basic/rosterprint.rb +50 -0
- data/data/doc/xmpp4r/examples/basic/rosterrename.rb +34 -0
- data/data/doc/xmpp4r/examples/basic/rosterwatch.rb +171 -0
- data/data/doc/xmpp4r/examples/basic/send_vcard.rb +67 -0
- data/data/doc/xmpp4r/examples/basic/tune_client.rb +56 -0
- data/data/doc/xmpp4r/examples/basic/tune_server.rb +58 -0
- data/data/doc/xmpp4r/examples/basic/versionbot.rb +75 -0
- data/lib/xmpp4r.rb +116 -0
- data/lib/xmpp4r/base64.rb +32 -0
- data/lib/xmpp4r/bytestreams.rb +15 -0
- data/lib/xmpp4r/bytestreams/helper/filetransfer.rb +319 -0
- data/lib/xmpp4r/bytestreams/helper/ibb/base.rb +257 -0
- data/lib/xmpp4r/bytestreams/helper/ibb/initiator.rb +31 -0
- data/lib/xmpp4r/bytestreams/helper/ibb/target.rb +54 -0
- data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb +152 -0
- data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb +86 -0
- data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb +198 -0
- data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb +65 -0
- data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb +79 -0
- data/lib/xmpp4r/bytestreams/iq/bytestreams.rb +170 -0
- data/lib/xmpp4r/bytestreams/iq/si.rb +206 -0
- data/lib/xmpp4r/callbacks.rb +133 -0
- data/lib/xmpp4r/caps.rb +1 -0
- data/lib/xmpp4r/caps/c.rb +67 -0
- data/lib/xmpp4r/caps/helper/generator.rb +160 -0
- data/lib/xmpp4r/caps/helper/helper.rb +84 -0
- data/lib/xmpp4r/client.rb +344 -0
- data/lib/xmpp4r/command/helper/responder.rb +53 -0
- data/lib/xmpp4r/command/iq/command.rb +154 -0
- data/lib/xmpp4r/component.rb +103 -0
- data/lib/xmpp4r/connection.rb +223 -0
- data/lib/xmpp4r/dataforms.rb +5 -0
- data/lib/xmpp4r/dataforms/x/data.rb +297 -0
- data/lib/xmpp4r/debuglog.rb +63 -0
- data/lib/xmpp4r/delay.rb +5 -0
- data/lib/xmpp4r/delay/x/delay.rb +99 -0
- data/lib/xmpp4r/discovery.rb +8 -0
- data/lib/xmpp4r/discovery/helper/helper.rb +58 -0
- data/lib/xmpp4r/discovery/helper/responder.rb +165 -0
- data/lib/xmpp4r/discovery/iq/discoinfo.rb +211 -0
- data/lib/xmpp4r/discovery/iq/discoitems.rb +147 -0
- data/lib/xmpp4r/errors.rb +284 -0
- data/lib/xmpp4r/feature_negotiation.rb +5 -0
- data/lib/xmpp4r/feature_negotiation/iq/feature.rb +28 -0
- data/lib/xmpp4r/framework/base.rb +55 -0
- data/lib/xmpp4r/framework/bot.rb +148 -0
- data/lib/xmpp4r/httpbinding.rb +5 -0
- data/lib/xmpp4r/httpbinding/client.rb +275 -0
- data/lib/xmpp4r/idgenerator.rb +37 -0
- data/lib/xmpp4r/iq.rb +221 -0
- data/lib/xmpp4r/jid.rb +167 -0
- data/lib/xmpp4r/last.rb +2 -0
- data/lib/xmpp4r/last/helper/helper.rb +37 -0
- data/lib/xmpp4r/last/iq/last.rb +67 -0
- data/lib/xmpp4r/location.rb +2 -0
- data/lib/xmpp4r/location/helper/helper.rb +56 -0
- data/lib/xmpp4r/location/location.rb +179 -0
- data/lib/xmpp4r/message.rb +180 -0
- data/lib/xmpp4r/muc.rb +14 -0
- data/lib/xmpp4r/muc/helper/mucbrowser.rb +92 -0
- data/lib/xmpp4r/muc/helper/mucclient.rb +462 -0
- data/lib/xmpp4r/muc/helper/simplemucclient.rb +332 -0
- data/lib/xmpp4r/muc/iq/mucadmin.rb +23 -0
- data/lib/xmpp4r/muc/iq/mucadminitem.rb +20 -0
- data/lib/xmpp4r/muc/iq/mucowner.rb +15 -0
- data/lib/xmpp4r/muc/item.rb +143 -0
- data/lib/xmpp4r/muc/x/muc.rb +70 -0
- data/lib/xmpp4r/muc/x/mucuserinvite.rb +60 -0
- data/lib/xmpp4r/muc/x/mucuseritem.rb +36 -0
- data/lib/xmpp4r/presence.rb +232 -0
- data/lib/xmpp4r/pubsub.rb +8 -0
- data/lib/xmpp4r/pubsub/children/configuration.rb +86 -0
- data/lib/xmpp4r/pubsub/children/event.rb +49 -0
- data/lib/xmpp4r/pubsub/children/item.rb +35 -0
- data/lib/xmpp4r/pubsub/children/items.rb +53 -0
- data/lib/xmpp4r/pubsub/children/node_config.rb +48 -0
- data/lib/xmpp4r/pubsub/children/publish.rb +38 -0
- data/lib/xmpp4r/pubsub/children/retract.rb +41 -0
- data/lib/xmpp4r/pubsub/children/subscription.rb +62 -0
- data/lib/xmpp4r/pubsub/children/subscription_config.rb +67 -0
- data/lib/xmpp4r/pubsub/children/unsubscribe.rb +48 -0
- data/lib/xmpp4r/pubsub/helper/nodebrowser.rb +129 -0
- data/lib/xmpp4r/pubsub/helper/nodehelper.rb +156 -0
- data/lib/xmpp4r/pubsub/helper/oauth_service_helper.rb +90 -0
- data/lib/xmpp4r/pubsub/helper/servicehelper.rb +456 -0
- data/lib/xmpp4r/pubsub/iq/pubsub.rb +19 -0
- data/lib/xmpp4r/query.rb +15 -0
- data/lib/xmpp4r/reliable.rb +168 -0
- data/lib/xmpp4r/rexmladdons.rb +157 -0
- data/lib/xmpp4r/roster.rb +7 -0
- data/lib/xmpp4r/roster/helper/roster.rb +522 -0
- data/lib/xmpp4r/roster/iq/roster.rb +215 -0
- data/lib/xmpp4r/roster/x/roster.rb +138 -0
- data/lib/xmpp4r/rpc.rb +2 -0
- data/lib/xmpp4r/rpc/helper/client.rb +123 -0
- data/lib/xmpp4r/rpc/helper/server.rb +74 -0
- data/lib/xmpp4r/rpc/helper/xmlrpcaddons.rb +67 -0
- data/lib/xmpp4r/rpc/iq/rpc.rb +23 -0
- data/lib/xmpp4r/sasl.rb +248 -0
- data/lib/xmpp4r/semaphore.rb +38 -0
- data/lib/xmpp4r/stream.rb +599 -0
- data/lib/xmpp4r/streamparser.rb +85 -0
- data/lib/xmpp4r/test/listener_mocker.rb +118 -0
- data/lib/xmpp4r/tune.rb +2 -0
- data/lib/xmpp4r/tune/helper/helper.rb +58 -0
- data/lib/xmpp4r/tune/tune.rb +113 -0
- data/lib/xmpp4r/vcard.rb +6 -0
- data/lib/xmpp4r/vcard/helper/vcard.rb +84 -0
- data/lib/xmpp4r/vcard/iq/vcard.rb +109 -0
- data/lib/xmpp4r/version.rb +7 -0
- data/lib/xmpp4r/version/helper/responder.rb +72 -0
- data/lib/xmpp4r/version/helper/simpleresponder.rb +44 -0
- data/lib/xmpp4r/version/iq/version.rb +105 -0
- data/lib/xmpp4r/x.rb +37 -0
- data/lib/xmpp4r/xhtml.rb +1 -0
- data/lib/xmpp4r/xhtml/html.rb +115 -0
- data/lib/xmpp4r/xmpp4r.rb +20 -0
- data/lib/xmpp4r/xmppelement.rb +168 -0
- data/lib/xmpp4r/xmppstanza.rb +162 -0
- data/setup.rb +1586 -0
- data/test/bytestreams/tc_ibb.rb +188 -0
- data/test/bytestreams/tc_socks5bytestreams.rb +114 -0
- data/test/caps/tc_helper.rb +158 -0
- data/test/dataforms/tc_data.rb +81 -0
- data/test/delay/tc_xdelay.rb +51 -0
- data/test/discovery/tc_responder.rb +91 -0
- data/test/last/tc_helper.rb +75 -0
- data/test/lib/assert_equal_xml.rb +14 -0
- data/test/lib/clienttester.rb +149 -0
- data/test/muc/tc_muc_mucclient.rb +834 -0
- data/test/muc/tc_muc_simplemucclient.rb +114 -0
- data/test/muc/tc_mucowner.rb +50 -0
- data/test/pubsub/tc_helper.rb +785 -0
- data/test/pubsub/tc_nodeconfig.rb +61 -0
- data/test/pubsub/tc_subscriptionconfig.rb +41 -0
- data/test/reliable/tc_disconnect_cleanup.rb +334 -0
- data/test/reliable/tc_disconnect_exception.rb +37 -0
- data/test/reliable/tc_listener_mocked_test.rb +68 -0
- data/test/reliable/tc_reliable_connection.rb +31 -0
- data/test/roster/tc_helper.rb +524 -0
- data/test/roster/tc_iqqueryroster.rb +173 -0
- data/test/roster/tc_xroster.rb +73 -0
- data/test/rpc/tc_helper.rb +96 -0
- data/test/tc_callbacks.rb +129 -0
- data/test/tc_class_names.rb +146 -0
- data/test/tc_client.rb +30 -0
- data/test/tc_errors.rb +146 -0
- data/test/tc_idgenerator.rb +30 -0
- data/test/tc_iq.rb +113 -0
- data/test/tc_iqquery.rb +31 -0
- data/test/tc_jid.rb +204 -0
- data/test/tc_message.rb +131 -0
- data/test/tc_presence.rb +150 -0
- data/test/tc_rexml.rb +139 -0
- data/test/tc_stream.rb +167 -0
- data/test/tc_streamComponent.rb +95 -0
- data/test/tc_streamError.rb +129 -0
- data/test/tc_streamSend.rb +59 -0
- data/test/tc_streamparser.rb +125 -0
- data/test/tc_xmppstanza.rb +135 -0
- data/test/ts_xmpp4r.rb +44 -0
- data/test/tune/tc_helper_recv.rb +82 -0
- data/test/tune/tc_helper_send.rb +74 -0
- data/test/tune/tc_tune.rb +79 -0
- data/test/vcard/tc_helper.rb +49 -0
- data/test/vcard/tc_iqvcard.rb +62 -0
- data/test/version/tc_helper.rb +60 -0
- data/test/version/tc_iqqueryversion.rb +97 -0
- data/test/xhtml/tc_html.rb +41 -0
- data/tools/gen_requires.bash +31 -0
- data/tools/xmpp4r-gemspec-test.rb +11 -0
- data/xmpp4r.gemspec +238 -0
- metadata +280 -0
data/lib/xmpp4r/jid.rb
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# =XMPP4R - XMPP Library for Ruby
|
|
2
|
+
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
|
3
|
+
# Website::http://home.gna.org/xmpp4r/
|
|
4
|
+
|
|
5
|
+
module Jabber
|
|
6
|
+
##
|
|
7
|
+
# The JID class represents a Jabber Identifier as described by
|
|
8
|
+
# RFC3920 section 3.1.
|
|
9
|
+
#
|
|
10
|
+
# Note that you can use JIDs also for Sorting, Hash keys, ...
|
|
11
|
+
class JID
|
|
12
|
+
include Comparable
|
|
13
|
+
|
|
14
|
+
PATTERN = /^(?:([^@]*)@)??([^@\/]*)(?:\/(.*?))?$/
|
|
15
|
+
|
|
16
|
+
begin
|
|
17
|
+
require 'idn'
|
|
18
|
+
USE_STRINGPREP = true
|
|
19
|
+
rescue LoadError
|
|
20
|
+
USE_STRINGPREP = false
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
##
|
|
24
|
+
# Create a new JID. If called as new('a@b/c'), parse the string and
|
|
25
|
+
# split (node, domain, resource)
|
|
26
|
+
def initialize(node = "", domain = nil, resource = nil)
|
|
27
|
+
@resource = resource
|
|
28
|
+
@domain = domain
|
|
29
|
+
@node = node
|
|
30
|
+
if @domain.nil? and @resource.nil? and @node
|
|
31
|
+
@node, @domain, @resource = @node.to_s.scan(PATTERN).first
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
if USE_STRINGPREP
|
|
35
|
+
@node = IDN::Stringprep.nodeprep(@node) if @node
|
|
36
|
+
@domain = IDN::Stringprep.nameprep(@domain) if @domain
|
|
37
|
+
@resource = IDN::Stringprep.resourceprep(@resource) if @resource
|
|
38
|
+
else
|
|
39
|
+
@node.downcase! if @node
|
|
40
|
+
@domain.downcase! if @domain
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
raise ArgumentError, 'Node too long' if (@node || '').length > 1023
|
|
44
|
+
raise ArgumentError, 'Domain too long' if (@domain || '').length > 1023
|
|
45
|
+
raise ArgumentError, 'Resource too long' if (@resource || '').length > 1023
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
##
|
|
49
|
+
# Returns a string representation of the JID
|
|
50
|
+
# * ""
|
|
51
|
+
# * "domain"
|
|
52
|
+
# * "node@domain"
|
|
53
|
+
# * "domain/resource"
|
|
54
|
+
# * "node@domain/resource"
|
|
55
|
+
def to_s
|
|
56
|
+
s = @domain
|
|
57
|
+
s = "#{@node}@#{s}" if @node
|
|
58
|
+
s += "/#{@resource}" if @resource
|
|
59
|
+
return s
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
##
|
|
63
|
+
# Returns a new JID with resource removed.
|
|
64
|
+
# return:: [JID]
|
|
65
|
+
def strip
|
|
66
|
+
JID.new(@node, @domain)
|
|
67
|
+
end
|
|
68
|
+
alias_method :bare, :strip
|
|
69
|
+
|
|
70
|
+
##
|
|
71
|
+
# Removes the resource (sets it to nil)
|
|
72
|
+
# return:: [JID] self
|
|
73
|
+
def strip!
|
|
74
|
+
@resource = nil
|
|
75
|
+
self
|
|
76
|
+
end
|
|
77
|
+
alias_method :bare!, :strip!
|
|
78
|
+
|
|
79
|
+
##
|
|
80
|
+
# Returns a hash value of the String representation
|
|
81
|
+
# (see JID#to_s)
|
|
82
|
+
def hash
|
|
83
|
+
return to_s.hash
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
##
|
|
87
|
+
# Ccompare to another JID
|
|
88
|
+
#
|
|
89
|
+
# String representations are compared, see JID#to_s
|
|
90
|
+
def eql?(o)
|
|
91
|
+
to_s.eql?(o.to_s)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
##
|
|
95
|
+
# Ccompare to another JID
|
|
96
|
+
#
|
|
97
|
+
# String representations are compared, see JID#to_s
|
|
98
|
+
def ==(o)
|
|
99
|
+
to_s == o.to_s
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
##
|
|
103
|
+
# Compare two JIDs,
|
|
104
|
+
# helpful for sorting etc.
|
|
105
|
+
#
|
|
106
|
+
# String representations are compared, see JID#to_s
|
|
107
|
+
def <=>(o)
|
|
108
|
+
to_s <=> o.to_s
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Get the JID's node
|
|
112
|
+
def node
|
|
113
|
+
@node
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Set the JID's node
|
|
117
|
+
def node=(v)
|
|
118
|
+
@node = v.to_s
|
|
119
|
+
if USE_STRINGPREP
|
|
120
|
+
@node = IDN::Stringprep.nodeprep(@node) if @node
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Get the JID's domain
|
|
125
|
+
def domain
|
|
126
|
+
return nil if @domain.empty?
|
|
127
|
+
@domain
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Set the JID's domain
|
|
131
|
+
def domain=(v)
|
|
132
|
+
@domain = v.to_s
|
|
133
|
+
if USE_STRINGPREP
|
|
134
|
+
@domain = IDN::Stringprep.nodeprep(@domain)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Get the JID's resource
|
|
139
|
+
def resource
|
|
140
|
+
@resource
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Set the JID's resource
|
|
144
|
+
def resource=(v)
|
|
145
|
+
@resource = v.to_s
|
|
146
|
+
if USE_STRINGPREP
|
|
147
|
+
@resource = IDN::Stringprep.nodeprep(@resource)
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Escape JID
|
|
152
|
+
def JID::escape(jid)
|
|
153
|
+
return jid.to_s.gsub('@', '%')
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Test if jid is empty
|
|
157
|
+
def empty?
|
|
158
|
+
to_s.empty?
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Test id jid is strepped
|
|
162
|
+
def stripped?
|
|
163
|
+
@resource.nil?
|
|
164
|
+
end
|
|
165
|
+
alias_method :bared?, :stripped?
|
|
166
|
+
end
|
|
167
|
+
end
|
data/lib/xmpp4r/last.rb
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# =XMPP4R - XMPP Library for Ruby
|
|
2
|
+
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
|
3
|
+
# Website::http://home.gna.org/xmpp4r/
|
|
4
|
+
|
|
5
|
+
require 'xmpp4r'
|
|
6
|
+
require 'xmpp4r/last'
|
|
7
|
+
|
|
8
|
+
module Jabber
|
|
9
|
+
module LastActivity
|
|
10
|
+
##
|
|
11
|
+
# A Helper to manage discovery of Last Activity.
|
|
12
|
+
class Helper
|
|
13
|
+
def initialize(client)
|
|
14
|
+
@stream = client
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Gets the last activity from a JID.
|
|
19
|
+
# jid:: [JID]
|
|
20
|
+
# return:: [Jabber::LastActivity::IqQueryLastActivity]
|
|
21
|
+
def get_last_activity_from(jid)
|
|
22
|
+
iq = Jabber::Iq.new(:get, jid)
|
|
23
|
+
iq.from = @stream.jid
|
|
24
|
+
iq.add(Jabber::LastActivity::IqQueryLastActivity.new)
|
|
25
|
+
|
|
26
|
+
reply = @stream.send_with_id(iq)
|
|
27
|
+
|
|
28
|
+
if reply.query && reply.query.kind_of?(IqQueryLastActivity)
|
|
29
|
+
reply.query
|
|
30
|
+
else
|
|
31
|
+
nil
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# =XMPP4R - XMPP Library for Ruby
|
|
2
|
+
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
|
3
|
+
# Website::http://home.gna.org/xmpp4r/
|
|
4
|
+
|
|
5
|
+
require 'xmpp4r/query'
|
|
6
|
+
|
|
7
|
+
module Jabber
|
|
8
|
+
module LastActivity
|
|
9
|
+
NS_LAST_ACTIVITY = 'jabber:iq:last'
|
|
10
|
+
|
|
11
|
+
##
|
|
12
|
+
# Class for handling Last Activity queries
|
|
13
|
+
# (XEP-0012)
|
|
14
|
+
class IqQueryLastActivity < IqQuery
|
|
15
|
+
name_xmlns 'query', NS_LAST_ACTIVITY
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Get the number of seconds since last activity.
|
|
19
|
+
#
|
|
20
|
+
# With a bare jid, this will return the number of seconds since the
|
|
21
|
+
# client was last seen (offline user query).
|
|
22
|
+
#
|
|
23
|
+
# With a full jid, this will return the number of seconds that the
|
|
24
|
+
# client has been idle (online user query).
|
|
25
|
+
#
|
|
26
|
+
# With a server, this will return the server or component's uptime in
|
|
27
|
+
# seconds (server / component query).
|
|
28
|
+
def seconds
|
|
29
|
+
attributes['seconds'] ? attributes['seconds'].to_i : nil
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
##
|
|
33
|
+
# Set the number of seconds since last activity
|
|
34
|
+
def seconds=(val)
|
|
35
|
+
attributes['seconds'] = val.to_s
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
##
|
|
39
|
+
# Set the number of seconds since last activity
|
|
40
|
+
# (chaining-friendly)
|
|
41
|
+
def set_second(val)
|
|
42
|
+
self.seconds = val
|
|
43
|
+
self
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
##
|
|
47
|
+
# For an offline user query, get the last status.
|
|
48
|
+
def status
|
|
49
|
+
self.text
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
##
|
|
53
|
+
# For an offline user query, set the last status.
|
|
54
|
+
def status=(val)
|
|
55
|
+
self.text = val
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
##
|
|
59
|
+
# For an offline user query, set the last status.
|
|
60
|
+
# (chaining-friendly)
|
|
61
|
+
def set_status(val)
|
|
62
|
+
self.status = val
|
|
63
|
+
self
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# =XMPP4R - XMPP Library for Ruby
|
|
2
|
+
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
|
3
|
+
# Website::http://home.gna.org/xmpp4r/
|
|
4
|
+
|
|
5
|
+
require 'xmpp4r'
|
|
6
|
+
require 'xmpp4r/pubsub'
|
|
7
|
+
require 'xmpp4r/location/location'
|
|
8
|
+
|
|
9
|
+
module Jabber
|
|
10
|
+
module UserLocation
|
|
11
|
+
##
|
|
12
|
+
# A Helper for XEP-0080 User Location
|
|
13
|
+
#
|
|
14
|
+
# Use this helper to send a user's location, or receive them from a
|
|
15
|
+
# specified jid. Described at http://www.xmpp.org/extensions/xep-0080.html
|
|
16
|
+
#
|
|
17
|
+
# For example:
|
|
18
|
+
# <pre>
|
|
19
|
+
# h = UserLocation::Helper( @client, 'radio1@hug.hellomatty.com' )
|
|
20
|
+
# h.add_userlocation_callback do |location|
|
|
21
|
+
# puts "Now in: #{location.locality}"
|
|
22
|
+
# end
|
|
23
|
+
# </pre>
|
|
24
|
+
class Helper < PubSub::ServiceHelper
|
|
25
|
+
##
|
|
26
|
+
# Send out the current location.
|
|
27
|
+
#
|
|
28
|
+
# location:: [Jabber::UserLocation::Location] current_location
|
|
29
|
+
def current_location(location)
|
|
30
|
+
item = Jabber::PubSub::Item.new()
|
|
31
|
+
item.add(location)
|
|
32
|
+
|
|
33
|
+
publish_item_to(NS_USERLOCATION, item)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
##
|
|
37
|
+
# Use this method to indicate that you wish to stop publishing
|
|
38
|
+
# a location.
|
|
39
|
+
def stop_publishing
|
|
40
|
+
current_location(Jabber::UserLocation::Location.new())
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
##
|
|
44
|
+
# Add a callback that will be invoked when a location is received
|
|
45
|
+
# from the jid specified when you constructed the Helper.
|
|
46
|
+
def add_userlocation_callback(prio = 200, ref = nil, &block)
|
|
47
|
+
add_event_callback(prio, ref) do |event|
|
|
48
|
+
location = event.first_element('items/item/location')
|
|
49
|
+
if location
|
|
50
|
+
block.call(location)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# =XMPP4R - XMPP Library for Ruby
|
|
2
|
+
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
|
3
|
+
# Website::http://home.gna.org/xmpp4r/
|
|
4
|
+
|
|
5
|
+
require 'time'
|
|
6
|
+
require 'xmpp4r/xmppelement'
|
|
7
|
+
require 'rexml/element'
|
|
8
|
+
|
|
9
|
+
module Jabber
|
|
10
|
+
module UserLocation
|
|
11
|
+
NS_USERLOCATION = 'http://jabber.org/protocol/geoloc'
|
|
12
|
+
ALLOWABLE_ATTRIBUTES = %w(accuracy alt area bearing building country
|
|
13
|
+
datum description floor lat locality lon postalcode region room
|
|
14
|
+
speed street text timestamp uri)
|
|
15
|
+
|
|
16
|
+
##
|
|
17
|
+
# The <geoloc> XMPP element, as defined in XEP-0080 User Location
|
|
18
|
+
#
|
|
19
|
+
# See http://xmpp.org/extensions/xep-0080.html - this element
|
|
20
|
+
# encapsulates data about a user's current location. These are
|
|
21
|
+
# expressed as child elements such as <locality>, <lat>, etc.
|
|
22
|
+
# which are also managed by this class.
|
|
23
|
+
#
|
|
24
|
+
# If the element has no children then it indicates that the user
|
|
25
|
+
# has stopped publishing their location.
|
|
26
|
+
class Location < XMPPElement
|
|
27
|
+
name_xmlns 'geoloc', NS_USERLOCATION
|
|
28
|
+
force_xmlns true
|
|
29
|
+
|
|
30
|
+
##
|
|
31
|
+
# Construct a new <location> element.
|
|
32
|
+
#
|
|
33
|
+
# Supply no arguments to make an empty element to indicate that
|
|
34
|
+
# location is no longer being published.
|
|
35
|
+
#
|
|
36
|
+
# attributes:: [Hash] location attributes
|
|
37
|
+
def initialize(attributes = {})
|
|
38
|
+
super()
|
|
39
|
+
|
|
40
|
+
# validate attributes
|
|
41
|
+
attributes = attributes.select do |k,v|
|
|
42
|
+
ALLOWABLE_ATTRIBUTES.include?(k) && !v.nil?
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
attributes.each do |k,v|
|
|
46
|
+
v = x.xmlschema if v.is_a?(Time)
|
|
47
|
+
add_element(REXML::Element.new(k)).text = v.to_s
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
##
|
|
53
|
+
# Returns true if a location is currently being published, otherwise false.
|
|
54
|
+
def published?
|
|
55
|
+
(elements.size > 0)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
##
|
|
59
|
+
# Get the accuracy attribute of this location.
|
|
60
|
+
def accuracy
|
|
61
|
+
first_element('accuracy').text if first_element('accuracy')
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
##
|
|
65
|
+
# Get the alt attribute of this location.
|
|
66
|
+
def alt
|
|
67
|
+
first_element('alt').text if first_element('alt')
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
##
|
|
71
|
+
# Get the area attribute of this location.
|
|
72
|
+
def area
|
|
73
|
+
first_element('area').text if first_element('area')
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
##
|
|
77
|
+
# Get the bearing attribute of this location.
|
|
78
|
+
def bearing
|
|
79
|
+
first_element('bearing').text if first_element('bearing')
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
##
|
|
83
|
+
# Get the building attribute of this location.
|
|
84
|
+
def building
|
|
85
|
+
first_element('building').text if first_element('building')
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
##
|
|
89
|
+
# Get the country attribute of this location.
|
|
90
|
+
def country
|
|
91
|
+
first_element('country').text if first_element('country')
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
##
|
|
95
|
+
# Get the datum attribute of this location.
|
|
96
|
+
def datum
|
|
97
|
+
first_element('datum').text if first_element('datum')
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
##
|
|
101
|
+
# Get the description attribute of this location.
|
|
102
|
+
def description
|
|
103
|
+
first_element('description').text if first_element('description')
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
##
|
|
107
|
+
# Get the floor attribute of this location.
|
|
108
|
+
def floor
|
|
109
|
+
first_element('floor').text if first_element('floor')
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
##
|
|
113
|
+
# Get the lat attribute of this location.
|
|
114
|
+
def lat
|
|
115
|
+
first_element('lat').text if first_element('lat')
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
##
|
|
119
|
+
# Get the locality attribute of this location.
|
|
120
|
+
def locality
|
|
121
|
+
first_element('locality').text if first_element('locality')
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
##
|
|
125
|
+
# Get the lon attribute of this location.
|
|
126
|
+
def lon
|
|
127
|
+
first_element('lon').text if first_element('lon')
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
##
|
|
131
|
+
# Get the postalcode attribute of this location.
|
|
132
|
+
def postalcode
|
|
133
|
+
first_element('postalcode').text if first_element('postalcode')
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
##
|
|
137
|
+
# Get the region attribute of this location.
|
|
138
|
+
def region
|
|
139
|
+
first_element('region').text if first_element('region')
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
##
|
|
143
|
+
# Get the room attribute of this location.
|
|
144
|
+
def room
|
|
145
|
+
first_element('room').text if first_element('room')
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
##
|
|
149
|
+
# Get the speed attribute of this location.
|
|
150
|
+
def speed
|
|
151
|
+
first_element('speed').text if first_element('speed')
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
##
|
|
155
|
+
# Get the street attribute of this location.
|
|
156
|
+
def street
|
|
157
|
+
first_element('street').text if first_element('street')
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
##
|
|
161
|
+
# Get the text attribute of this location.
|
|
162
|
+
def text
|
|
163
|
+
first_element('text').text if first_element('text')
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
##
|
|
167
|
+
# Get the timestamp attribute of this location.
|
|
168
|
+
def timestamp
|
|
169
|
+
first_element('timestamp').text if first_element('timestamp')
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
##
|
|
173
|
+
# Get the uri attribute of this location.
|
|
174
|
+
def uri
|
|
175
|
+
first_element('uri').text if first_element('uri')
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|