xmpp4r-robot 0.1 → 0.2.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGES.md +12 -0
- data/README.md +5 -5
- data/Rakefile +2 -2
- data/lib/xmpp4r/robot.rb +82 -29
- data/xmpp4r-robot.gemspec +8 -6
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62c1f2e10c7d3b9bbff8750f1c122e67e6e20665
|
4
|
+
data.tar.gz: eca785d782872d6076e81d2d872e9a8a5f0059bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e11bfd191df92527c20cd4a1765e53336955af0c9878d121bfe9393e611c6fd56a455b915093f69e915b15cf95c062449249fb5e6c68780f74b6104e4bdb9e28
|
7
|
+
data.tar.gz: 3af9add9f15286f162cb96c5c250e4ff624d2f40f9ab9b106f7ac03a89f79dcdcf007ccb93473688c32b5d590378eb35081a353434c0ae1c28484cb5029bddd9
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
/pkg/
|
data/CHANGES.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# CHANGES
|
2
|
+
|
3
|
+
## xmpp4r-robot 0.2.0 -- 2014-01-23
|
4
|
+
|
5
|
+
* Jabber::Robot#start would now act as restart.
|
6
|
+
* Jabber::Robot#roster added which would return a list of roster,
|
7
|
+
with the state of :available, :away, :unavailable, and :unknown.
|
8
|
+
* Now we never consume any events.
|
9
|
+
|
10
|
+
## xmpp4r-robot 0.1 -- 2014-01-22
|
11
|
+
|
12
|
+
* Birthday!
|
data/README.md
CHANGED
@@ -35,9 +35,9 @@ robot = Jabber::Robot.new('someone@gmail.com', 'awesome password',
|
|
35
35
|
:retry_time => 10,
|
36
36
|
:auto_accept_subscription => true)
|
37
37
|
|
38
|
-
robot.notify_presence do |from,
|
39
|
-
#
|
40
|
-
puts "#{from} is #{
|
38
|
+
robot.notify_presence do |from, status|
|
39
|
+
# status could be one of :available, :away, :unavailable
|
40
|
+
puts "#{from} is #{status}"
|
41
41
|
end
|
42
42
|
|
43
43
|
robot.notify_message do |from, body|
|
@@ -47,10 +47,10 @@ robot.notify_message do |from, body|
|
|
47
47
|
robot.subscribe(from) if body == 'subscribe' # demonstrate how we subscribe
|
48
48
|
end
|
49
49
|
|
50
|
-
robot.start
|
50
|
+
p robot.start.roster
|
51
51
|
|
52
52
|
rd, wr = IO.pipe
|
53
|
-
Signal.trap('INT'){ wr.puts
|
53
|
+
Signal.trap('INT'){ wr.puts }
|
54
54
|
rd.gets
|
55
55
|
|
56
56
|
robot.stop
|
data/Rakefile
CHANGED
data/lib/xmpp4r/robot.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
|
2
|
+
require 'set'
|
3
|
+
|
2
4
|
require 'xmpp4r'
|
3
5
|
require 'xmpp4r/roster'
|
4
6
|
|
@@ -10,36 +12,58 @@ class Jabber::Robot
|
|
10
12
|
@username = username
|
11
13
|
@password = password
|
12
14
|
@errback = errback
|
15
|
+
@roster = {:available => Set.new,
|
16
|
+
:away => Set.new,
|
17
|
+
:unavailable => Set.new}
|
13
18
|
|
14
19
|
@retry_time = Float(opts[:retry_time] || 0)
|
15
20
|
@auto_accept_subscription = opts[:auto_accept_subscription]
|
16
21
|
end
|
17
22
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
23
|
+
def inspect
|
24
|
+
"#<#{self.class.name} username=#{username.inspect}>"
|
25
|
+
end
|
26
|
+
|
22
27
|
def client
|
23
28
|
@client ||= Jabber::Client.new(Jabber::JID::new(username))
|
24
29
|
end
|
25
30
|
|
31
|
+
def helper
|
32
|
+
@helper ||= Jabber::Roster::Helper.new(client, false)
|
33
|
+
end
|
34
|
+
|
26
35
|
def start
|
36
|
+
if @client # restart
|
37
|
+
stop
|
38
|
+
@client = nil
|
39
|
+
end
|
40
|
+
initialize_callbacks
|
27
41
|
connect
|
28
42
|
login
|
29
|
-
initialize_callbacks
|
30
43
|
available
|
44
|
+
self
|
31
45
|
end
|
32
46
|
|
33
47
|
def stop
|
34
48
|
client.close
|
49
|
+
self
|
35
50
|
end
|
36
51
|
|
37
52
|
def connect
|
38
53
|
client.connect
|
54
|
+
self
|
39
55
|
end
|
40
56
|
|
41
57
|
def login
|
42
58
|
client.auth(password)
|
59
|
+
self
|
60
|
+
end
|
61
|
+
|
62
|
+
##### getters #####
|
63
|
+
|
64
|
+
def roster sync=false
|
65
|
+
sync_roster if sync || @roster[:unknown].nil?
|
66
|
+
@roster
|
43
67
|
end
|
44
68
|
|
45
69
|
##### actions #####
|
@@ -49,33 +73,34 @@ class Jabber::Robot
|
|
49
73
|
end
|
50
74
|
|
51
75
|
# e.g. robot.message('someone@example.com', 'Hi!')
|
52
|
-
def message
|
53
|
-
client.send(Jabber::Message::new(
|
76
|
+
def message to_jid, body
|
77
|
+
client.send(Jabber::Message::new(to_jid, body).set_type(:chat))
|
54
78
|
end
|
55
79
|
|
56
80
|
# e.g. robot.subscribe('someone@example.com')
|
57
|
-
def subscribe
|
58
|
-
|
81
|
+
def subscribe to_jid
|
82
|
+
client.send(Jabber::Presence.new.set_type(:subscribe).set_to(to_jid))
|
59
83
|
end
|
60
84
|
|
61
85
|
##### callbacks #####
|
62
86
|
|
63
|
-
# e.g. robot.notify_presence{ |from,
|
87
|
+
# e.g. robot.notify_presence{ |from, status| puts "#{from} is #{status}" }
|
88
|
+
# The status could be one of :available, :away, :unavailable
|
64
89
|
def notify_presence
|
65
90
|
client.add_presence_callback do |presence|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
:
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
end
|
91
|
+
status = presence.type ||
|
92
|
+
case presence.show # http://xmpp.org/rfcs/rfc3921.html
|
93
|
+
when nil, :chat
|
94
|
+
:available
|
95
|
+
when :away, :dnd, :xa
|
96
|
+
:away
|
97
|
+
else
|
98
|
+
raise "What's this show? #{presence.show}"
|
99
|
+
end
|
76
100
|
|
77
101
|
protect_yield do
|
78
|
-
yield(jid_to_username(presence.from),
|
102
|
+
yield(jid_to_username(presence.from), status)
|
103
|
+
false
|
79
104
|
end
|
80
105
|
end
|
81
106
|
end
|
@@ -84,8 +109,10 @@ class Jabber::Robot
|
|
84
109
|
def notify_message
|
85
110
|
client.add_message_callback do |message|
|
86
111
|
protect_yield do
|
87
|
-
|
88
|
-
message.body
|
112
|
+
if message.body
|
113
|
+
yield(jid_to_username(message.from), message.body.strip)
|
114
|
+
end
|
115
|
+
false
|
89
116
|
end
|
90
117
|
end
|
91
118
|
end
|
@@ -93,10 +120,6 @@ class Jabber::Robot
|
|
93
120
|
##### private #####
|
94
121
|
|
95
122
|
private
|
96
|
-
def roster
|
97
|
-
@roster ||= Jabber::Roster::Helper.new(client)
|
98
|
-
end
|
99
|
-
|
100
123
|
def initialize_callbacks
|
101
124
|
client.on_exception do |exp|
|
102
125
|
errback.call(exp) if errback
|
@@ -109,8 +132,23 @@ class Jabber::Robot
|
|
109
132
|
start
|
110
133
|
end
|
111
134
|
|
112
|
-
|
113
|
-
|
135
|
+
client.add_presence_callback do |presence|
|
136
|
+
if auto_accept_subscription && presence.type == :subscribe
|
137
|
+
subscribe(presence.from)
|
138
|
+
end
|
139
|
+
false
|
140
|
+
end
|
141
|
+
|
142
|
+
notify_presence do |jid, status|
|
143
|
+
@roster[:unknown].delete(jid) if @roster[:unknown]
|
144
|
+
|
145
|
+
[:available, :away, :unavailable].each do |type|
|
146
|
+
if type == status
|
147
|
+
@roster[type].add(jid)
|
148
|
+
else
|
149
|
+
@roster[type].delete(jid)
|
150
|
+
end
|
151
|
+
end
|
114
152
|
end
|
115
153
|
end
|
116
154
|
|
@@ -123,4 +161,19 @@ class Jabber::Robot
|
|
123
161
|
rescue => e
|
124
162
|
errback.call(e) if errback
|
125
163
|
end
|
164
|
+
|
165
|
+
def sync_roster
|
166
|
+
clear_roster_semaphore
|
167
|
+
helper.get_roster
|
168
|
+
helper.wait_for_roster
|
169
|
+
@roster[:unknown] =
|
170
|
+
Set.new(helper.items.keys.map(&method(:jid_to_username))) -
|
171
|
+
@roster[:available] - @roster[:away] - @roster[:unavailable]
|
172
|
+
end
|
173
|
+
|
174
|
+
# a hack to let us always get the latest roster
|
175
|
+
def clear_roster_semaphore
|
176
|
+
helper.instance_variable_get(:@roster_wait).
|
177
|
+
instance_variable_set(:@tickets, 0)
|
178
|
+
end
|
126
179
|
end
|
data/xmpp4r-robot.gemspec
CHANGED
@@ -1,19 +1,21 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: xmpp4r-robot 0.
|
2
|
+
# stub: xmpp4r-robot 0.2.0 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "xmpp4r-robot"
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "0.2.0"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib"]
|
10
10
|
s.authors = ["Lin Jen-Shin (godfat)"]
|
11
|
-
s.date = "2014-01-
|
11
|
+
s.date = "2014-01-23"
|
12
12
|
s.description = "Simple XMPP client built upon xmpp4r. Intended for building simple robots."
|
13
13
|
s.email = ["godfat (XD) godfat.org"]
|
14
14
|
s.files = [
|
15
|
+
".gitignore",
|
15
16
|
".gitmodules",
|
16
17
|
".travis.yml",
|
18
|
+
"CHANGES.md",
|
17
19
|
"Gemfile",
|
18
20
|
"LICENSE",
|
19
21
|
"README.md",
|
@@ -32,11 +34,11 @@ Gem::Specification.new do |s|
|
|
32
34
|
s.specification_version = 4
|
33
35
|
|
34
36
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
35
|
-
s.add_runtime_dependency(%q<xmpp4r>, ["
|
37
|
+
s.add_runtime_dependency(%q<xmpp4r>, ["~> 0.5"])
|
36
38
|
else
|
37
|
-
s.add_dependency(%q<xmpp4r>, ["
|
39
|
+
s.add_dependency(%q<xmpp4r>, ["~> 0.5"])
|
38
40
|
end
|
39
41
|
else
|
40
|
-
s.add_dependency(%q<xmpp4r>, ["
|
42
|
+
s.add_dependency(%q<xmpp4r>, ["~> 0.5"])
|
41
43
|
end
|
42
44
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xmpp4r-robot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lin Jen-Shin (godfat)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xmpp4r
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
19
|
+
version: '0.5'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
26
|
+
version: '0.5'
|
27
27
|
description: Simple XMPP client built upon xmpp4r. Intended for building simple robots.
|
28
28
|
email:
|
29
29
|
- godfat (XD) godfat.org
|
@@ -31,8 +31,10 @@ executables: []
|
|
31
31
|
extensions: []
|
32
32
|
extra_rdoc_files: []
|
33
33
|
files:
|
34
|
+
- ".gitignore"
|
34
35
|
- ".gitmodules"
|
35
36
|
- ".travis.yml"
|
37
|
+
- CHANGES.md
|
36
38
|
- Gemfile
|
37
39
|
- LICENSE
|
38
40
|
- README.md
|