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.
Files changed (215) hide show
  1. data/CHANGELOG +91 -0
  2. data/COPYING +340 -0
  3. data/LICENSE +59 -0
  4. data/README.rdoc +113 -0
  5. data/README_ruby19.txt +43 -0
  6. data/Rakefile +252 -0
  7. data/data/doc/xmpp4r/examples/advanced/adventure/README +56 -0
  8. data/data/doc/xmpp4r/examples/advanced/adventure/adventure.rb +23 -0
  9. data/data/doc/xmpp4r/examples/advanced/adventure/adventuremuc.rb +136 -0
  10. data/data/doc/xmpp4r/examples/advanced/adventure/cube.xml +15 -0
  11. data/data/doc/xmpp4r/examples/advanced/adventure/tower.xml +69 -0
  12. data/data/doc/xmpp4r/examples/advanced/adventure/world.rb +424 -0
  13. data/data/doc/xmpp4r/examples/advanced/fileserve.conf +11 -0
  14. data/data/doc/xmpp4r/examples/advanced/fileserve.rb +346 -0
  15. data/data/doc/xmpp4r/examples/advanced/getonline.rb +56 -0
  16. data/data/doc/xmpp4r/examples/advanced/gtkmucclient.rb +315 -0
  17. data/data/doc/xmpp4r/examples/advanced/migrate.rb +88 -0
  18. data/data/doc/xmpp4r/examples/advanced/minimuc.rb +266 -0
  19. data/data/doc/xmpp4r/examples/advanced/pep-aggregator/index.xsl +235 -0
  20. data/data/doc/xmpp4r/examples/advanced/pep-aggregator/pep-aggregator.rb +147 -0
  21. data/data/doc/xmpp4r/examples/advanced/recvfile.rb +84 -0
  22. data/data/doc/xmpp4r/examples/advanced/rosterdiscovery.rb +129 -0
  23. data/data/doc/xmpp4r/examples/advanced/sendfile.conf +10 -0
  24. data/data/doc/xmpp4r/examples/advanced/sendfile.rb +72 -0
  25. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr.rb +51 -0
  26. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_jabber.rb +43 -0
  27. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_test.rb +10 -0
  28. data/data/doc/xmpp4r/examples/advanced/versionpoll.rb +109 -0
  29. data/data/doc/xmpp4r/examples/advanced/xmpping.rb +146 -0
  30. data/data/doc/xmpp4r/examples/advanced/xmppingrc.sample +14 -0
  31. data/data/doc/xmpp4r/examples/basic/change_password.rb +41 -0
  32. data/data/doc/xmpp4r/examples/basic/client.rb +70 -0
  33. data/data/doc/xmpp4r/examples/basic/component.rb +11 -0
  34. data/data/doc/xmpp4r/examples/basic/echo.rb +37 -0
  35. data/data/doc/xmpp4r/examples/basic/jabbersend.rb +41 -0
  36. data/data/doc/xmpp4r/examples/basic/mass_sender.rb +68 -0
  37. data/data/doc/xmpp4r/examples/basic/muc_owner_config.rb +12 -0
  38. data/data/doc/xmpp4r/examples/basic/mucinfo.rb +41 -0
  39. data/data/doc/xmpp4r/examples/basic/mucsimplebot.rb +82 -0
  40. data/data/doc/xmpp4r/examples/basic/register.rb +42 -0
  41. data/data/doc/xmpp4r/examples/basic/remove_registration.rb +18 -0
  42. data/data/doc/xmpp4r/examples/basic/roster.rb +44 -0
  43. data/data/doc/xmpp4r/examples/basic/rosterprint.rb +50 -0
  44. data/data/doc/xmpp4r/examples/basic/rosterrename.rb +34 -0
  45. data/data/doc/xmpp4r/examples/basic/rosterwatch.rb +171 -0
  46. data/data/doc/xmpp4r/examples/basic/send_vcard.rb +67 -0
  47. data/data/doc/xmpp4r/examples/basic/tune_client.rb +56 -0
  48. data/data/doc/xmpp4r/examples/basic/tune_server.rb +58 -0
  49. data/data/doc/xmpp4r/examples/basic/versionbot.rb +75 -0
  50. data/lib/xmpp4r.rb +116 -0
  51. data/lib/xmpp4r/base64.rb +32 -0
  52. data/lib/xmpp4r/bytestreams.rb +15 -0
  53. data/lib/xmpp4r/bytestreams/helper/filetransfer.rb +319 -0
  54. data/lib/xmpp4r/bytestreams/helper/ibb/base.rb +257 -0
  55. data/lib/xmpp4r/bytestreams/helper/ibb/initiator.rb +31 -0
  56. data/lib/xmpp4r/bytestreams/helper/ibb/target.rb +54 -0
  57. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb +152 -0
  58. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb +86 -0
  59. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb +198 -0
  60. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb +65 -0
  61. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb +79 -0
  62. data/lib/xmpp4r/bytestreams/iq/bytestreams.rb +170 -0
  63. data/lib/xmpp4r/bytestreams/iq/si.rb +206 -0
  64. data/lib/xmpp4r/callbacks.rb +133 -0
  65. data/lib/xmpp4r/caps.rb +1 -0
  66. data/lib/xmpp4r/caps/c.rb +67 -0
  67. data/lib/xmpp4r/caps/helper/generator.rb +160 -0
  68. data/lib/xmpp4r/caps/helper/helper.rb +84 -0
  69. data/lib/xmpp4r/client.rb +344 -0
  70. data/lib/xmpp4r/command/helper/responder.rb +53 -0
  71. data/lib/xmpp4r/command/iq/command.rb +154 -0
  72. data/lib/xmpp4r/component.rb +103 -0
  73. data/lib/xmpp4r/connection.rb +223 -0
  74. data/lib/xmpp4r/dataforms.rb +5 -0
  75. data/lib/xmpp4r/dataforms/x/data.rb +297 -0
  76. data/lib/xmpp4r/debuglog.rb +63 -0
  77. data/lib/xmpp4r/delay.rb +5 -0
  78. data/lib/xmpp4r/delay/x/delay.rb +99 -0
  79. data/lib/xmpp4r/discovery.rb +8 -0
  80. data/lib/xmpp4r/discovery/helper/helper.rb +58 -0
  81. data/lib/xmpp4r/discovery/helper/responder.rb +165 -0
  82. data/lib/xmpp4r/discovery/iq/discoinfo.rb +211 -0
  83. data/lib/xmpp4r/discovery/iq/discoitems.rb +147 -0
  84. data/lib/xmpp4r/errors.rb +284 -0
  85. data/lib/xmpp4r/feature_negotiation.rb +5 -0
  86. data/lib/xmpp4r/feature_negotiation/iq/feature.rb +28 -0
  87. data/lib/xmpp4r/framework/base.rb +55 -0
  88. data/lib/xmpp4r/framework/bot.rb +148 -0
  89. data/lib/xmpp4r/httpbinding.rb +5 -0
  90. data/lib/xmpp4r/httpbinding/client.rb +275 -0
  91. data/lib/xmpp4r/idgenerator.rb +37 -0
  92. data/lib/xmpp4r/iq.rb +221 -0
  93. data/lib/xmpp4r/jid.rb +167 -0
  94. data/lib/xmpp4r/last.rb +2 -0
  95. data/lib/xmpp4r/last/helper/helper.rb +37 -0
  96. data/lib/xmpp4r/last/iq/last.rb +67 -0
  97. data/lib/xmpp4r/location.rb +2 -0
  98. data/lib/xmpp4r/location/helper/helper.rb +56 -0
  99. data/lib/xmpp4r/location/location.rb +179 -0
  100. data/lib/xmpp4r/message.rb +180 -0
  101. data/lib/xmpp4r/muc.rb +14 -0
  102. data/lib/xmpp4r/muc/helper/mucbrowser.rb +92 -0
  103. data/lib/xmpp4r/muc/helper/mucclient.rb +462 -0
  104. data/lib/xmpp4r/muc/helper/simplemucclient.rb +332 -0
  105. data/lib/xmpp4r/muc/iq/mucadmin.rb +23 -0
  106. data/lib/xmpp4r/muc/iq/mucadminitem.rb +20 -0
  107. data/lib/xmpp4r/muc/iq/mucowner.rb +15 -0
  108. data/lib/xmpp4r/muc/item.rb +143 -0
  109. data/lib/xmpp4r/muc/x/muc.rb +70 -0
  110. data/lib/xmpp4r/muc/x/mucuserinvite.rb +60 -0
  111. data/lib/xmpp4r/muc/x/mucuseritem.rb +36 -0
  112. data/lib/xmpp4r/presence.rb +232 -0
  113. data/lib/xmpp4r/pubsub.rb +8 -0
  114. data/lib/xmpp4r/pubsub/children/configuration.rb +86 -0
  115. data/lib/xmpp4r/pubsub/children/event.rb +49 -0
  116. data/lib/xmpp4r/pubsub/children/item.rb +35 -0
  117. data/lib/xmpp4r/pubsub/children/items.rb +53 -0
  118. data/lib/xmpp4r/pubsub/children/node_config.rb +48 -0
  119. data/lib/xmpp4r/pubsub/children/publish.rb +38 -0
  120. data/lib/xmpp4r/pubsub/children/retract.rb +41 -0
  121. data/lib/xmpp4r/pubsub/children/subscription.rb +62 -0
  122. data/lib/xmpp4r/pubsub/children/subscription_config.rb +67 -0
  123. data/lib/xmpp4r/pubsub/children/unsubscribe.rb +48 -0
  124. data/lib/xmpp4r/pubsub/helper/nodebrowser.rb +129 -0
  125. data/lib/xmpp4r/pubsub/helper/nodehelper.rb +156 -0
  126. data/lib/xmpp4r/pubsub/helper/oauth_service_helper.rb +90 -0
  127. data/lib/xmpp4r/pubsub/helper/servicehelper.rb +456 -0
  128. data/lib/xmpp4r/pubsub/iq/pubsub.rb +19 -0
  129. data/lib/xmpp4r/query.rb +15 -0
  130. data/lib/xmpp4r/reliable.rb +168 -0
  131. data/lib/xmpp4r/rexmladdons.rb +157 -0
  132. data/lib/xmpp4r/roster.rb +7 -0
  133. data/lib/xmpp4r/roster/helper/roster.rb +522 -0
  134. data/lib/xmpp4r/roster/iq/roster.rb +215 -0
  135. data/lib/xmpp4r/roster/x/roster.rb +138 -0
  136. data/lib/xmpp4r/rpc.rb +2 -0
  137. data/lib/xmpp4r/rpc/helper/client.rb +123 -0
  138. data/lib/xmpp4r/rpc/helper/server.rb +74 -0
  139. data/lib/xmpp4r/rpc/helper/xmlrpcaddons.rb +67 -0
  140. data/lib/xmpp4r/rpc/iq/rpc.rb +23 -0
  141. data/lib/xmpp4r/sasl.rb +248 -0
  142. data/lib/xmpp4r/semaphore.rb +38 -0
  143. data/lib/xmpp4r/stream.rb +599 -0
  144. data/lib/xmpp4r/streamparser.rb +85 -0
  145. data/lib/xmpp4r/test/listener_mocker.rb +118 -0
  146. data/lib/xmpp4r/tune.rb +2 -0
  147. data/lib/xmpp4r/tune/helper/helper.rb +58 -0
  148. data/lib/xmpp4r/tune/tune.rb +113 -0
  149. data/lib/xmpp4r/vcard.rb +6 -0
  150. data/lib/xmpp4r/vcard/helper/vcard.rb +84 -0
  151. data/lib/xmpp4r/vcard/iq/vcard.rb +109 -0
  152. data/lib/xmpp4r/version.rb +7 -0
  153. data/lib/xmpp4r/version/helper/responder.rb +72 -0
  154. data/lib/xmpp4r/version/helper/simpleresponder.rb +44 -0
  155. data/lib/xmpp4r/version/iq/version.rb +105 -0
  156. data/lib/xmpp4r/x.rb +37 -0
  157. data/lib/xmpp4r/xhtml.rb +1 -0
  158. data/lib/xmpp4r/xhtml/html.rb +115 -0
  159. data/lib/xmpp4r/xmpp4r.rb +20 -0
  160. data/lib/xmpp4r/xmppelement.rb +168 -0
  161. data/lib/xmpp4r/xmppstanza.rb +162 -0
  162. data/setup.rb +1586 -0
  163. data/test/bytestreams/tc_ibb.rb +188 -0
  164. data/test/bytestreams/tc_socks5bytestreams.rb +114 -0
  165. data/test/caps/tc_helper.rb +158 -0
  166. data/test/dataforms/tc_data.rb +81 -0
  167. data/test/delay/tc_xdelay.rb +51 -0
  168. data/test/discovery/tc_responder.rb +91 -0
  169. data/test/last/tc_helper.rb +75 -0
  170. data/test/lib/assert_equal_xml.rb +14 -0
  171. data/test/lib/clienttester.rb +149 -0
  172. data/test/muc/tc_muc_mucclient.rb +834 -0
  173. data/test/muc/tc_muc_simplemucclient.rb +114 -0
  174. data/test/muc/tc_mucowner.rb +50 -0
  175. data/test/pubsub/tc_helper.rb +785 -0
  176. data/test/pubsub/tc_nodeconfig.rb +61 -0
  177. data/test/pubsub/tc_subscriptionconfig.rb +41 -0
  178. data/test/reliable/tc_disconnect_cleanup.rb +334 -0
  179. data/test/reliable/tc_disconnect_exception.rb +37 -0
  180. data/test/reliable/tc_listener_mocked_test.rb +68 -0
  181. data/test/reliable/tc_reliable_connection.rb +31 -0
  182. data/test/roster/tc_helper.rb +524 -0
  183. data/test/roster/tc_iqqueryroster.rb +173 -0
  184. data/test/roster/tc_xroster.rb +73 -0
  185. data/test/rpc/tc_helper.rb +96 -0
  186. data/test/tc_callbacks.rb +129 -0
  187. data/test/tc_class_names.rb +146 -0
  188. data/test/tc_client.rb +30 -0
  189. data/test/tc_errors.rb +146 -0
  190. data/test/tc_idgenerator.rb +30 -0
  191. data/test/tc_iq.rb +113 -0
  192. data/test/tc_iqquery.rb +31 -0
  193. data/test/tc_jid.rb +204 -0
  194. data/test/tc_message.rb +131 -0
  195. data/test/tc_presence.rb +150 -0
  196. data/test/tc_rexml.rb +139 -0
  197. data/test/tc_stream.rb +167 -0
  198. data/test/tc_streamComponent.rb +95 -0
  199. data/test/tc_streamError.rb +129 -0
  200. data/test/tc_streamSend.rb +59 -0
  201. data/test/tc_streamparser.rb +125 -0
  202. data/test/tc_xmppstanza.rb +135 -0
  203. data/test/ts_xmpp4r.rb +44 -0
  204. data/test/tune/tc_helper_recv.rb +82 -0
  205. data/test/tune/tc_helper_send.rb +74 -0
  206. data/test/tune/tc_tune.rb +79 -0
  207. data/test/vcard/tc_helper.rb +49 -0
  208. data/test/vcard/tc_iqvcard.rb +62 -0
  209. data/test/version/tc_helper.rb +60 -0
  210. data/test/version/tc_iqqueryversion.rb +97 -0
  211. data/test/xhtml/tc_html.rb +41 -0
  212. data/tools/gen_requires.bash +31 -0
  213. data/tools/xmpp4r-gemspec-test.rb +11 -0
  214. data/xmpp4r.gemspec +238 -0
  215. metadata +280 -0
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift '../../../../../lib'
4
+
5
+ require 'xmpp4r'
6
+ require 'xmpp4r/roster/iq/roster'
7
+
8
+ # Command line argument checking
9
+
10
+ if ARGV.size < 4
11
+ puts("Usage: ./rosterrename.rb <your jid> <password> <jid to rename> <new name> [<group1> ... <groupn>]")
12
+ exit
13
+ end
14
+
15
+ # Building up the connection
16
+
17
+ #Jabber::debug = true
18
+
19
+ jid = Jabber::JID.new(ARGV[0])
20
+
21
+ cl = Jabber::Client.new(jid)
22
+ cl.connect
23
+ cl.auth(ARGV[1])
24
+
25
+ # The iq stanza
26
+ iq = Jabber::Iq.new(:set)
27
+ # The new roster instance and item element
28
+ iq.add(Jabber::Roster::IqQueryRoster.new).add(Jabber::Roster::RosterItem.new(ARGV[2], ARGV[3])).groups = ARGV[4..ARGV.size]
29
+
30
+ # Sending the stanza
31
+ cl.send(iq)
32
+
33
+ # Don't look at the results:
34
+ cl.close
@@ -0,0 +1,171 @@
1
+ #!/usr/bin/ruby
2
+ #
3
+ # XMPP4R - XMPP Library for Ruby
4
+ # Copyright (C) 2005 Stephan Maka <stephan@spaceboyz.net>
5
+ # Released under Ruby's license (see the LICENSE file) or GPL, at your option
6
+ #
7
+ #
8
+ # Roster-Watch example
9
+ #
10
+ #
11
+ # Learn how a roster looks like
12
+ # how presences are received
13
+ # about subscription requests and answers
14
+ # what vCards contain
15
+ #
16
+ # It's recommended to insert 'p' commands in this script. :-)
17
+ #
18
+ # This script does:
19
+ #
20
+ # * Listing roster changes
21
+ #
22
+ # * Subscribe to roster items which have a subscription of "none" or "from"
23
+ # WARNING: Chances are that you don't want that :-)
24
+ #
25
+ # * Requesting vCards for unnamed items in your roster and renaming them
26
+ # to the <NICKNAME/> or <FN/> field in the vCard
27
+ #
28
+ # * Listing presence changes
29
+ #
30
+ # * Listing subscription and unsubscription requests and answers
31
+
32
+ $:.unshift '../../../../../lib/'
33
+
34
+ require 'xmpp4r'
35
+ require 'xmpp4r/roster/helper/roster'
36
+ require 'xmpp4r/vcard/helper/vcard'
37
+
38
+ # Command line argument checking
39
+
40
+ if ARGV.size != 2
41
+ puts("Usage: ./rosterwatch.rb <jid> <password>")
42
+ exit
43
+ end
44
+
45
+ # Building up the connection
46
+
47
+ #Jabber::debug = true
48
+
49
+ jid = Jabber::JID.new(ARGV[0])
50
+
51
+ cl = Jabber::Client.new(jid)
52
+ cl.connect
53
+ cl.auth(ARGV[1])
54
+
55
+ # The roster instance
56
+ roster = Jabber::Roster::Helper.new(cl)
57
+
58
+ # Callback to handle updated roster items
59
+ roster.add_update_callback { |olditem,item|
60
+ if [:from, :none].include?(item.subscription) && item.ask != :subscribe
61
+ puts("Subscribing to #{item.jid}")
62
+ item.subscribe
63
+ end
64
+
65
+ # Print the item
66
+ if olditem.nil?
67
+ # We didn't knew before:
68
+ puts("#{item.iname} (#{item.jid}, #{item.subscription}) #{item.groups.join(', ')}")
69
+ else
70
+ # Showing whats different:
71
+ puts("#{olditem.iname} (#{olditem.jid}, #{olditem.subscription}) #{olditem.groups.join(', ')} -> #{item.iname} (#{item.jid}, #{item.subscription}) #{item.groups.join(', ')}")
72
+ end
73
+
74
+ # If the item has no name associated...
75
+ unless item.iname
76
+ Thread.new do
77
+ puts("#{item.jid} has no nickname... getting vCard")
78
+ begin
79
+ # ...get a vCard
80
+ vcard = Jabber::Vcard::Helper.new(cl).get(item.jid.strip)
81
+
82
+ unless vcard.nil?
83
+ # Rename him to vCard's <NICKNAME/> field
84
+ if vcard['NICKNAME']
85
+ item.iname = vcard['NICKNAME']
86
+ puts("Renaming #{item.jid} to #{vcard['NICKNAME']}")
87
+ item.send
88
+ # Rename him to vCard's <FN/> field
89
+ elsif vcard['FN']
90
+ item.iname = vcard['FN']
91
+ puts("Renaming #{item.jid} to #{vcard['FN']}")
92
+ item.send
93
+ # We've got a lazy one
94
+ else
95
+ puts("#{item.jid} provided no details in vCard")
96
+ end
97
+ end
98
+
99
+ rescue Exception => e
100
+ # This will be (mostly) thrown by Jabber::Vcard::Helper#get
101
+ puts("Error getting vCard for #{item.jid}: #{e.to_s}")
102
+ end
103
+ end
104
+ end
105
+ }
106
+
107
+ # Presence updates:
108
+ roster.add_presence_callback { |item,oldpres,pres|
109
+ # Can't look for something that just does not exist...
110
+ if pres.nil?
111
+ # ...so create it:
112
+ pres = Jabber::Presence.new
113
+ end
114
+ if oldpres.nil?
115
+ # ...so create it:
116
+ oldpres = Jabber::Presence.new
117
+ end
118
+
119
+ # Print name and jid:
120
+ name = "#{pres.from}"
121
+ if item.iname
122
+ name = "#{item.iname} (#{pres.from})"
123
+ end
124
+ puts(name)
125
+
126
+ # Print type changes:
127
+ unless oldpres.type.nil? && pres.type.nil?
128
+ puts(" Type: #{oldpres.type.inspect} -> #{pres.type.inspect}")
129
+ end
130
+ # Print show changes:
131
+ unless oldpres.show.nil? && pres.show.nil?
132
+ puts(" Show: #{oldpres.show.to_s.inspect} -> #{pres.show.to_s.inspect}")
133
+ end
134
+ # Print status changes:
135
+ unless oldpres.status.nil? && pres.status.nil?
136
+ puts(" Status: #{oldpres.status.to_s.inspect} -> #{pres.status.to_s.inspect}")
137
+ end
138
+ # Print priority changes:
139
+ unless oldpres.priority.nil? && pres.priority.nil?
140
+ puts(" Priority: #{oldpres.priority.inspect} -> #{pres.priority.inspect}")
141
+ end
142
+
143
+ # Note: presences with type='error' will reflect our own show/status/priority
144
+ # as it is mostly just a reply from a server. This is *not* a bug.
145
+ }
146
+
147
+ # Subscription requests and responses:
148
+ subscription_callback = lambda { |item,pres|
149
+ name = pres.from
150
+ if item != nil && item.iname != nil
151
+ name = "#{item.iname} (#{pres.from})"
152
+ end
153
+ case pres.type
154
+ when :subscribe then puts("Subscription request from #{name}")
155
+ when :subscribed then puts("Subscribed to #{name}")
156
+ when :unsubscribe then puts("Unsubscription request from #{name}")
157
+ when :unsubscribed then puts("Unsubscribed from #{name}")
158
+ else raise "The Roster Helper is buggy!!! subscription callback with type=#{pres.type}"
159
+ end
160
+ }
161
+ roster.add_subscription_callback(0, nil, &subscription_callback)
162
+ roster.add_subscription_request_callback(0, nil, &subscription_callback)
163
+
164
+ # Send initial presence
165
+ # this is important for receiving presence of subscribed users
166
+ cl.send(Jabber::Presence.new.set_show(:dnd).set_status('Watching my roster change...'))
167
+
168
+ # Main loop:
169
+ Thread.stop
170
+
171
+ cl.close
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/ruby
2
+
3
+ # Demonstration of the Vcard helper class
4
+ #
5
+ # * Retrieves your own vCard
6
+ # * Modify fields given on the command line
7
+ # * Dumps the vCard
8
+ # * Send your vCard to the server
9
+
10
+ $:.unshift('../../../../../lib')
11
+
12
+ require 'xmpp4r'
13
+ require 'xmpp4r/vcard/helper/vcard'
14
+ include Jabber
15
+
16
+
17
+ # settings
18
+ if ARGV.length < 2
19
+ puts "Usage:\t./send_vcard.rb <jid> <password> [<field1>=<value1> [... <fieldN>=<valueN>] ]"
20
+ puts "Example:\t./send_vcard.rb user@server/resource password NICKNAME=User \"FN=A user\""
21
+ exit 1
22
+ end
23
+
24
+ # Do the client stuff...
25
+ myJID = JID.new(ARGV.shift)
26
+ myPassword = ARGV.shift
27
+ cl = Client.new(myJID)
28
+ cl.connect
29
+ cl.auth(myPassword)
30
+
31
+ # The Vcard helper
32
+ vcard_helper = Vcard::Helper.new(cl)
33
+
34
+ begin
35
+ puts "Retrieving vCard information for #{cl.jid.strip}"
36
+ vcard = vcard_helper.get
37
+
38
+
39
+ # Inspect the command line for vCard fields to be changed
40
+ ARGV.each { |arg|
41
+ arg.scan(/^(.+?)=(.*)$/) { |field,text|
42
+ puts "field #{field}: #{vcard[field].inspect} => #{text.inspect}"
43
+ vcard[field] = text
44
+ }
45
+ }
46
+
47
+ # Dump the vCard
48
+ vcard.fields.each { |field|
49
+ if field.split(/\//).pop == 'BINVAL'
50
+ puts "#{field}:\tBINVAL"
51
+ else
52
+ puts "#{field}:\t#{vcard[field].inspect}"
53
+ end
54
+ }
55
+
56
+ begin
57
+ puts "Sending vCard information for #{cl.jid.strip}"
58
+ vcard_helper.set(vcard)
59
+ rescue Exception => e
60
+ puts "Sorry, we stumbled upon the following when sending the vCard of #{cl.jid.strip}: #{e.to_s.inspect}"
61
+ end
62
+
63
+ rescue Exception => e
64
+ puts "Sorry, we stumbled upon the following when requesting the vCard of #{cl.jid.strip}: #{e.to_s.inspect}"
65
+ end
66
+
67
+ cl.close
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift '../../../../../lib'
4
+
5
+ require 'xmpp4r'
6
+ require 'xmpp4r/roster'
7
+ require 'xmpp4r/discovery'
8
+ require 'xmpp4r/caps'
9
+ require 'xmpp4r/tune'
10
+
11
+
12
+ #
13
+ # Echo tunes received via XEP-0118 User Tune notifications
14
+ #
15
+ # See Jabber::UserTune::Helper for the gory details
16
+ #
17
+
18
+ if ARGV.length != 3
19
+ puts "Usage: ruby tune_client.rb <jid> <pw> <tune-playing-jid>"
20
+ exit 1
21
+ end
22
+
23
+ jid = ARGV[0]
24
+ pw = ARGV[1]
25
+ dj_jid = ARGV[2]
26
+
27
+ #Jabber::debug=true
28
+ cl = Jabber::Client.new(Jabber::JID.new(jid))
29
+ cl.connect
30
+ cl.auth(pw)
31
+
32
+ # PEP (XEP-0163 says we need:
33
+ # - a 'both' subscription to the dj
34
+ # - told the server that we support the '...tune+notify' feature
35
+ # before we can receive events
36
+ roster = Jabber::Roster::Helper.new(cl)
37
+ roster.add_subscription_request_callback(0, nil) do |item,pres|
38
+ roster.accept_subscription(pres.from)
39
+ end
40
+
41
+ caps = Jabber::Caps::Helper.new(cl,
42
+ [Jabber::Discovery::Identity.new('client', nil, 'pc')],
43
+ [Jabber::Discovery::Feature.new('http://jabber.org/protocol/tune+notify')]
44
+ )
45
+
46
+ t = Jabber::UserTune::Helper.new(cl, dj_jid)
47
+ t.add_usertune_callback do |tune|
48
+ puts "from:#{dj_jid} tune:#{tune.artist} plays #{tune.title}"
49
+ end
50
+
51
+ p = Jabber::Presence.new()
52
+ p.type = :subscribe
53
+ p.to = dj_jid
54
+ cl.send p
55
+
56
+ Thread.stop
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift '../../../../../lib'
4
+
5
+ require 'xmpp4r'
6
+ require 'xmpp4r/roster'
7
+ require 'xmpp4r/tune'
8
+ require 'rbosa'
9
+
10
+ #
11
+ # Send XEP-0118 User Tune events...
12
+ #
13
+ # See Jabber::UserTune::Helper for the gory details...
14
+ #
15
+ # NB needs rbosa library to access iTunes - only on MacOSX
16
+ #
17
+
18
+ if ARGV.length != 2:
19
+ puts "Usage: ruby tune_server.rb <jid> <pw>"
20
+ exit 1
21
+ end
22
+
23
+ jid=ARGV[0]
24
+ pw=ARGV[1]
25
+
26
+ Jabber::debug=true
27
+
28
+ cl = Jabber::Client.new(jid)
29
+ cl.connect
30
+ cl.auth(pw)
31
+
32
+ # Following XEP-0163 PEP we need to
33
+ # ensure we have a 'both' subscription to the Tune client
34
+ roster = Jabber::Roster::Helper.new(cl)
35
+ roster.add_subscription_request_callback do |item,pres|
36
+ roster.accept_subscription(pres.from)
37
+
38
+ reply = pres.answer
39
+ reply.type = :subscribe
40
+ cl.send(reply)
41
+ end
42
+
43
+ cl.send(Jabber::Presence.new.set_show(:chat))
44
+
45
+ t=Jabber::UserTune::Helper.new(cl, nil)
46
+
47
+ itunes=OSA.app('iTunes')
48
+
49
+ loop do
50
+ track = itunes.current_track
51
+
52
+ if track
53
+ puts "Now playing: #{track.name} by #{track.artist}"
54
+ t.now_playing(Jabber::UserTune::Tune.new(track.artist, track.name))
55
+ end
56
+
57
+ sleep 5
58
+ end
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift '../../../../../lib'
4
+
5
+ require 'xmpp4r'
6
+ require 'xmpp4r/version/iq/version'
7
+ require 'xmpp4r/version/helper/simpleresponder'
8
+
9
+
10
+ # A Hash containing all Version Query answers with their JIDs as keys:
11
+ versions = {}
12
+
13
+ # Command line argument checking
14
+
15
+ if ARGV.size != 2
16
+ puts("Usage: ./versionbot.rb <jid> <password>")
17
+ exit
18
+ end
19
+
20
+ # Building up the connection
21
+
22
+ #Jabber::debug = true
23
+
24
+ jid = Jabber::JID.new(ARGV[0])
25
+
26
+ cl = Jabber::Client.new(jid)
27
+ cl.connect
28
+ cl.auth(ARGV[1])
29
+
30
+ cl.on_exception { |*a|
31
+ p a[0].backtrace
32
+ exit!
33
+ }
34
+
35
+ # I'm not sure about the portability of 'uname -sr' here ;-)
36
+ # but that's all needed to answer version queries:
37
+ Jabber::Version::SimpleResponder.new(cl, 'xmpp4r Versionbot example', Jabber::XMPP4R_VERSION, IO.popen('uname -sr').readlines.to_s.strip)
38
+
39
+
40
+ cl.add_iq_callback { |iq|
41
+ # Filter for version query results
42
+ if (iq.type == :result) && iq.query.kind_of?(Jabber::Version::IqQueryVersion)
43
+ puts "Version query result from #{iq.from}"
44
+ # Keep track of results per JID
45
+ versions[iq.from] = iq.query
46
+ # Print details
47
+ puts " Name: #{iq.query.iname.inspect}"
48
+ puts " Version: #{iq.query.version.inspect}"
49
+ puts " OS: #{iq.query.os.inspect}"
50
+ end
51
+ }
52
+
53
+ cl.add_presence_callback { |pres|
54
+ # Already fingerprinted or offline?
55
+ unless versions.has_key?(pres.from) || (pres.type == :unavailable) || (pres.type == :error)
56
+ # Construct a new query
57
+ iq = Jabber::Iq.new(:get, pres.from)
58
+ # and ask for the version
59
+ iq.query = Jabber::Version::IqQueryVersion.new
60
+ puts "Asking #{iq.to} for his/her/its version"
61
+ versions[pres.from] = :asking
62
+ cl.send(iq)
63
+ end
64
+ }
65
+
66
+ # Send initial presence
67
+ cl.send(Jabber::Presence.new.set_show(:xa).set_status('I am the evil fingerprinting robot'))
68
+
69
+ # Main loop:
70
+ loop do
71
+ cl.process
72
+ sleep(1)
73
+ end
74
+
75
+ cl.close