brontes3d-xmpp4r 0.4
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 +83 -0
- data/COPYING +340 -0
- data/LICENSE +59 -0
- data/README.rdoc +112 -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/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/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 +105 -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 +243 -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/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 +19 -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 +722 -0
- data/test/pubsub/tc_nodeconfig.rb +54 -0
- data/test/pubsub/tc_subscriptionconfig.rb +41 -0
- data/test/reliable/listener_mocker.rb +90 -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 +40 -0
- data/test/reliable/tc_reliable_connection.rb +32 -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 +53 -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 +307 -0
- metadata +349 -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,180 @@
|
|
|
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/xmppstanza'
|
|
6
|
+
require 'xmpp4r/x'
|
|
7
|
+
|
|
8
|
+
module Jabber
|
|
9
|
+
##
|
|
10
|
+
# The Message class manages the <message/> stanzas,
|
|
11
|
+
# which is used for all messaging communication.
|
|
12
|
+
class Message < XMPPStanza
|
|
13
|
+
|
|
14
|
+
CHAT_STATES = %w(active composing gone inactive paused).freeze
|
|
15
|
+
|
|
16
|
+
name_xmlns 'message', 'jabber:client'
|
|
17
|
+
force_xmlns true
|
|
18
|
+
|
|
19
|
+
include XParent
|
|
20
|
+
|
|
21
|
+
##
|
|
22
|
+
# Create a new message
|
|
23
|
+
# >to:: a JID or a String object to send the message to.
|
|
24
|
+
# >body:: the message's body
|
|
25
|
+
def initialize(to = nil, body = nil)
|
|
26
|
+
super()
|
|
27
|
+
if not to.nil?
|
|
28
|
+
set_to(to)
|
|
29
|
+
end
|
|
30
|
+
if !body.nil?
|
|
31
|
+
add_element(REXML::Element.new("body").add_text(body))
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
##
|
|
36
|
+
# Get the type of the Message stanza
|
|
37
|
+
#
|
|
38
|
+
# The following Symbols are allowed:
|
|
39
|
+
# * :chat
|
|
40
|
+
# * :error
|
|
41
|
+
# * :groupchat
|
|
42
|
+
# * :headline
|
|
43
|
+
# * :normal
|
|
44
|
+
# result:: [Symbol] or nil
|
|
45
|
+
def type
|
|
46
|
+
case super
|
|
47
|
+
when 'chat' then :chat
|
|
48
|
+
when 'error' then :error
|
|
49
|
+
when 'groupchat' then :groupchat
|
|
50
|
+
when 'headline' then :headline
|
|
51
|
+
when 'normal' then :normal
|
|
52
|
+
else nil
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
##
|
|
57
|
+
# Set the type of the Message stanza (see Message#type for details)
|
|
58
|
+
# v:: [Symbol] or nil
|
|
59
|
+
def type=(v)
|
|
60
|
+
case v
|
|
61
|
+
when :chat then super('chat')
|
|
62
|
+
when :error then super('error')
|
|
63
|
+
when :groupchat then super('groupchat')
|
|
64
|
+
when :headline then super('headline')
|
|
65
|
+
when :normal then super('normal')
|
|
66
|
+
else super(nil)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
##
|
|
71
|
+
# Set the type of the Message stanza (chaining-friendly)
|
|
72
|
+
# v:: [Symbol] or nil
|
|
73
|
+
def set_type(v)
|
|
74
|
+
self.type = v
|
|
75
|
+
self
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
##
|
|
79
|
+
# Returns the message's body, or nil.
|
|
80
|
+
# This is the message's plain-text content.
|
|
81
|
+
def body
|
|
82
|
+
first_element_text('body')
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
##
|
|
86
|
+
# Sets the message's body
|
|
87
|
+
#
|
|
88
|
+
# b:: [String] body to set
|
|
89
|
+
def body=(b)
|
|
90
|
+
replace_element_text('body', b)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
##
|
|
94
|
+
# Sets the message's body
|
|
95
|
+
#
|
|
96
|
+
# b:: [String] body to set
|
|
97
|
+
# return:: [REXML::Element] self for chaining
|
|
98
|
+
def set_body(b)
|
|
99
|
+
self.body = b
|
|
100
|
+
self
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
##
|
|
104
|
+
# sets the message's subject
|
|
105
|
+
#
|
|
106
|
+
# s:: [String] subject to set
|
|
107
|
+
def subject=(s)
|
|
108
|
+
replace_element_text('subject', s)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
##
|
|
112
|
+
# sets the message's subject
|
|
113
|
+
#
|
|
114
|
+
# s:: [String] subject to set
|
|
115
|
+
# return:: [REXML::Element] self for chaining
|
|
116
|
+
def set_subject(s)
|
|
117
|
+
self.subject = s
|
|
118
|
+
self
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
##
|
|
122
|
+
# Returns the message's subject, or nil
|
|
123
|
+
def subject
|
|
124
|
+
first_element_text('subject')
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
##
|
|
128
|
+
# sets the message's thread
|
|
129
|
+
# s:: [String] thread to set
|
|
130
|
+
def thread=(s)
|
|
131
|
+
delete_elements('thread')
|
|
132
|
+
replace_element_text('thread', s) unless s.nil?
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
##
|
|
136
|
+
# gets the message's thread (chaining-friendly)
|
|
137
|
+
# Please note that this are not [Thread] but a [String]-Identifier to track conversations
|
|
138
|
+
# s:: [String] thread to set
|
|
139
|
+
def set_thread(s)
|
|
140
|
+
self.thread = s
|
|
141
|
+
self
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
##
|
|
145
|
+
# Returns the message's thread, or nil
|
|
146
|
+
def thread
|
|
147
|
+
first_element_text('thread')
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
##
|
|
151
|
+
# Returns the current chat state, or nil if no chat state is set
|
|
152
|
+
def chat_state
|
|
153
|
+
each_elements(*CHAT_STATES) { |el| return el.name.to_sym }
|
|
154
|
+
return nil
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
##
|
|
158
|
+
# Sets the chat state :active, :composing, :gone, :inactive, :paused
|
|
159
|
+
def chat_state=(s)
|
|
160
|
+
s = s.to_s
|
|
161
|
+
raise InvalidChatState, "Chat state must be one of #{CHAT_STATES.join(', ')}" unless CHAT_STATES.include?(s)
|
|
162
|
+
CHAT_STATES.each { |state| delete_elements(state) }
|
|
163
|
+
add_element(REXML::Element.new(s).add_namespace('http://jabber.org/protocol/chatstates'))
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
##
|
|
167
|
+
# Sets the message's chat state
|
|
168
|
+
def set_chat_state(s)
|
|
169
|
+
self.state = s
|
|
170
|
+
self
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
CHAT_STATES.each do |state|
|
|
174
|
+
define_method("#{state}?") do
|
|
175
|
+
chat_state == state.to_sym
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
end
|
|
180
|
+
end
|