yong-stropheruby 0.0.6 → 0.1.0

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 (5) hide show
  1. data/Manifest.txt +1 -0
  2. data/README.rdoc +15 -136
  3. data/Rakefile +1 -1
  4. data/examples/xmpp_client.rb +65 -0
  5. metadata +2 -1
data/Manifest.txt CHANGED
@@ -4,6 +4,7 @@ Manifest.txt
4
4
  PostInstall.txt
5
5
  README.rdoc
6
6
  Rakefile
7
+ examples/xmpp_client.rb
7
8
  ext/md5.c
8
9
  ext/parser.c
9
10
  ext/util.c
data/README.rdoc CHANGED
@@ -1,143 +1,22 @@
1
- = strophe_ruby
1
+ == OVERVIEW
2
2
 
3
- http://stropheruby.rubyforge.org
3
+ Stropheruby is a ruby bindings for Strophe, a C library for writing XMPP clients.
4
4
 
5
- == DESCRIPTION:
5
+ This is a fork of flamontagne's stropheruby (http://github.com/flamontagne/stropheruby/tree/master) with the following improvements:
6
6
 
7
- Ruby bindings for Strophe 'http://code.stanziq.com/strophe/', a C library for
8
- writing XMPP clients. If all you need is a simple XMPP bot that
9
- react to message and presence notifications, you might be better off
10
- with XMPPBot, which is an implementation I wrote on top of StropheRuby.
7
+ * A patched version of libstrophe (trunk) is included. So there is no extra library to install.
8
+ * (libstrophe) Fixed a timeout issue on Mac OSX: http://groups.google.com/group/strophe-dev/browse_thread/thread/ef4cb19785020fb6
9
+ * (libstrophe) Fixed basic auth: http://groups.google.com/group/strophe-dev/browse_thread/thread/b770f72c83d1a0b9
10
+ * (libstrophe) Changed xmpp_run_once's return code so that the application can tell if an error or timeout occurs
11
+ * (stropheruby) Added send_raw_string method
12
+ * (stropheruby) Detect login failure
13
+ * (stropheruby) Fix resource leak
11
14
 
12
- IMPORTANT : This gem is quite experimental currently... it is not ready
13
- for production!
15
+ == INSTALLATION
14
16
 
15
- Strophe 'http://code.stanziq.com/strophe/' is a robust and well written
16
- C library that allows the developer to implement XMPP clients.
17
+ sudo gem sources -a http://gems.github.com
18
+ sudo gem install yong-stropheruby
17
19
 
18
- I wanted to be able to use the power of this library with the ruby
19
- syntax. I didn't use SWIG to generate the bindings for 2 reasons :
20
+ == EXAMPLE
20
21
 
21
- 1. I wanted to learn how to write a C extension for ruby
22
- 2. I didn't like how SWIG generate gazilions of lines of code
23
-
24
- My other project, XMPPBot, is an implementation of Strophe Ruby that
25
- allows the ruby developer to write a XMPP bot in a few lines of code.
26
-
27
- == CURRENT PROBLEMS:
28
-
29
- - Currently no Support for TLS encryption (Coming soon as it's rather important)
30
- - Cannot terminate the loop with CTRL-C
31
- - Socket disconnects after being inactive for too long
32
- - Cannot output log data in a file
33
-
34
-
35
- == EXAMPLE OF USE
36
-
37
- require 'strophe_ruby'
38
-
39
- def announce_presence
40
- stanza = StropheRuby::Stanza.new
41
- stanza.name = "presence"
42
- @conn.send(stanza)
43
- end
44
-
45
- def register_callbacks
46
- #Accept all subscriptions
47
- @conn.add_handler("presence") do |pres|
48
- if pres.type == "subscribe"
49
- #we accept
50
- p = StropheRuby::Stanza.new
51
- p.name = "presence"
52
- p.type = "subscribed"
53
- p.set_attribute("to",pres.attribute("from"))
54
- @conn.send(p)
55
-
56
- #then it's our turn to send our subscription request
57
- p = StropheRuby::Stanza.new
58
- p.name = "presence"
59
- p.type = "subscribe"
60
- p.set_attribute("to",pres.attribute("from"))
61
- @conn.send(p)
62
- end
63
- end
64
-
65
- #simple echo for messages
66
- @conn.add_handler("message") do |msg|
67
-
68
- if msg.child_by_name("body")
69
- top_stanza = StropheRuby::Stanza.new
70
- top_stanza.name="message"
71
- top_stanza.type="chat"
72
- top_stanza.set_attribute("to", msg.attribute("from"))
73
-
74
- body_stanza = StropheRuby::Stanza.new
75
- body_stanza.name="body"
76
-
77
- text_stanza = StropheRuby::Stanza.new
78
- text_stanza.text = msg.child_by_name("body").text
79
-
80
- body_stanza.add_child(text_stanza)
81
- top_stanza.add_child(body_stanza)
82
- @conn.send(top_stanza)
83
- end
84
- end
85
- end
86
-
87
-
88
- #Prepare the strophe library
89
- StropheRuby::EventLoop.prepare
90
-
91
- #create the runtime context and specify the logging level (WARN,INFO,ERROR or DEBUG)
92
- @ctx=StropheRuby::Context.new(StropheRuby::Logging::DEBUG)
93
-
94
- #create the connection passing it the context
95
- @conn=StropheRuby::Connection.new(@ctx)
96
-
97
- #set the jid and password
98
- @conn.jid = 'bot@example.com'
99
- @conn.password = 'secret'
100
-
101
- #Try to connect
102
- @conn.connect do |status|
103
- if status == StropheRuby::ConnectionEvents::CONNECT
104
- #We are connected.
105
- announce_presence
106
- register_callbacks
107
- else
108
- @conn.disconnect
109
- end
110
- end
111
-
112
-
113
- #Start the event loop
114
- StropheRuby::EventLoop.run(@ctx)
115
-
116
- puts 'Disconnected'
117
-
118
- == INSTALL:
119
-
120
- gem install strophe_ruby
121
-
122
- == LICENSE:
123
-
124
- Copyright (c) 2008 François Lamontagne
125
-
126
- Permission is hereby granted, free of charge, to any person obtaining
127
- a copy of this software and associated documentation files (the
128
- 'Software'), to deal in the Software without restriction, including
129
- without limitation the rights to use, copy, modify, merge, publish,
130
- distribute, sublicense, and/or sell copies of the Software, and to
131
- permit persons to whom the Software is furnished to do so, subject to
132
- the following conditions:
133
-
134
- The above copyright notice and this permission notice shall be
135
- included in all copies or substantial portions of the Software.
136
-
137
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
138
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
139
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
140
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
141
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
142
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
143
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ See example.rb
data/Rakefile CHANGED
@@ -3,7 +3,7 @@ require 'hoe'
3
3
 
4
4
  EXT = "ext/strophe_ruby.#{Hoe::DLEXT}"
5
5
 
6
- Hoe.new('stropheruby', '0.0.6') do |p|
6
+ Hoe.new('stropheruby', '0.1.0') do |p|
7
7
  p.developer('François Lamontagne', 'flamontagne@gmail.com')
8
8
  p.summary = 'strophe_ruby'
9
9
 
@@ -0,0 +1,65 @@
1
+ require 'strophe_ruby'
2
+
3
+ class XmppClient
4
+ def query_roster(jid, password)
5
+ new_connection(jid, password) {
6
+ current_stage = 1
7
+ @connection.add_handler("iq") do |iq|
8
+ case current_stage
9
+ when 1
10
+ @connection.send_raw_string("<iq type='get' id='1238647002'><query xmlns='jabber:iq:roster'/></iq>")
11
+ current_stage += 1
12
+ else
13
+ StropheRuby::EventLoop.stop(@ctx)
14
+ end
15
+ end
16
+ }
17
+ end
18
+
19
+ private
20
+
21
+ def new_connection(jid, password)
22
+ lib = StropheRuby::EventLoop.prepare
23
+ @ctx = StropheRuby::Context.new(StropheRuby::Logging::DEBUG)
24
+ @connection = StropheRuby::Connection.new(@ctx)
25
+ @connection.jid = jid
26
+ @connection.password = password
27
+ connected = false
28
+ @connection.connect do |status|
29
+ if !connected
30
+ connected = true
31
+ if status != StropheRuby::ConnectionEvents::CONNECT
32
+ #do somthing after login fails
33
+ raise 'failed to login'
34
+ else
35
+ #do something after login
36
+ yield if block_given?
37
+ end
38
+ end
39
+ end
40
+
41
+ run_event_loop_until_timeout_or_stopped_by_callback!
42
+ end
43
+
44
+ #run event loop until timeout or 'StropheRuby::EventLoop.stop' is called inside callback
45
+ def run_event_loop_until_timeout_or_stopped_by_callback!(timeout = 3000)
46
+ raise 'unexpected state' if (@ctx.loop_status != StropheRuby::EventLoop::LOOP_NOTSTARTED)
47
+ @ctx.loop_status = StropheRuby::EventLoop::LOOP_RUNNING
48
+
49
+ while @ctx.loop_status == StropheRuby::EventLoop::LOOP_RUNNING
50
+ #return if the socket is idle for more than timeout (in millisecond)
51
+ if StropheRuby::EventLoop.run_once(@ctx, timeout) != 0
52
+ @connection.disconnect
53
+ return false
54
+ end
55
+ end
56
+
57
+ @connection.disconnect
58
+ return true
59
+ end
60
+ end
61
+
62
+ if $0 == __FILE__
63
+ client = XmppClient.new
64
+ client.query_roster("a1@localhost", 'a1')
65
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yong-stropheruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Fran\xC3\xA7ois Lamontagne"
@@ -74,6 +74,7 @@ files:
74
74
  - test/test_strophe_ruby.rb
75
75
  - test/test_strophe_ruby_extn.rb
76
76
  - ext/extconf.rb
77
+ - examples/xmpp_client.rb
77
78
  has_rdoc: true
78
79
  homepage:
79
80
  post_install_message: