em-msn 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/msn/messenger.rb +28 -13
- data/lib/msn/nexus.rb +2 -2
- data/lib/msn/notification_server.rb +27 -3
- data/lib/msn/protocol.rb +4 -3
- data/lib/msn/switchboard.rb +1 -1
- data/lib/msn/version.rb +1 -1
- metadata +1 -1
data/lib/msn/messenger.rb
CHANGED
@@ -2,6 +2,17 @@ class Msn::Messenger
|
|
2
2
|
attr_reader :username
|
3
3
|
attr_reader :password
|
4
4
|
|
5
|
+
class << self
|
6
|
+
attr_accessor :logger
|
7
|
+
|
8
|
+
def log_info(message)
|
9
|
+
return unless logger
|
10
|
+
|
11
|
+
logger.info message
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
|
5
16
|
def initialize(username, password)
|
6
17
|
@username = username
|
7
18
|
@password = password
|
@@ -52,11 +63,6 @@ class Msn::Messenger
|
|
52
63
|
@notification_server.get_contacts
|
53
64
|
end
|
54
65
|
|
55
|
-
def send_contact_command(email, command, list)
|
56
|
-
username, domain = email.split '@', 2
|
57
|
-
@notification_server.send_payload_command_and_wait command, %Q(<ml><d n="#{domain}"><c n="#{username}" t="1" l="#{list}" /></d></ml>)
|
58
|
-
end
|
59
|
-
|
60
66
|
def on_ready(&handler)
|
61
67
|
@on_ready_handler = handler
|
62
68
|
end
|
@@ -73,6 +79,10 @@ class Msn::Messenger
|
|
73
79
|
@on_message_handler = handler
|
74
80
|
end
|
75
81
|
|
82
|
+
def on_message_ack(&handler)
|
83
|
+
@on_message_ack_handler = handler
|
84
|
+
end
|
85
|
+
|
76
86
|
def on_contact_request(&handler)
|
77
87
|
@on_contact_request = handler
|
78
88
|
end
|
@@ -81,10 +91,23 @@ class Msn::Messenger
|
|
81
91
|
@notification_server.send_message email, text
|
82
92
|
end
|
83
93
|
|
94
|
+
def close
|
95
|
+
@notification_server.close_connection
|
96
|
+
end
|
97
|
+
|
98
|
+
def send_contact_command(email, command, list)
|
99
|
+
username, domain = email.split '@', 2
|
100
|
+
@notification_server.send_payload_command_and_wait command, %Q(<ml><d n="#{domain}"><c n="#{username}" t="1" l="#{list}" /></d></ml>)
|
101
|
+
end
|
102
|
+
|
84
103
|
def accept_message(message)
|
85
104
|
call_handler @on_message_handler, message
|
86
105
|
end
|
87
106
|
|
107
|
+
def accept_message_ack(id, status)
|
108
|
+
call_handler @on_message_ack_handler, id, status
|
109
|
+
end
|
110
|
+
|
88
111
|
def contact_request(email, display_name)
|
89
112
|
call_handler @on_contact_request, email, display_name
|
90
113
|
end
|
@@ -106,13 +129,5 @@ class Msn::Messenger
|
|
106
129
|
Fiber.new { handler.call(*args) }.resume
|
107
130
|
end
|
108
131
|
end
|
109
|
-
|
110
|
-
def self.debug
|
111
|
-
@debug
|
112
|
-
end
|
113
|
-
|
114
|
-
def self.debug=(debug)
|
115
|
-
@debug = debug
|
116
|
-
end
|
117
132
|
end
|
118
133
|
|
data/lib/msn/nexus.rb
CHANGED
@@ -52,8 +52,8 @@ class Msn::Nexus
|
|
52
52
|
|
53
53
|
# Check invalid login
|
54
54
|
fault = xml.xpath("//S:Fault/faultstring")
|
55
|
-
if fault
|
56
|
-
raise Msn::AuthenticationError.new(fault.text)
|
55
|
+
if fault.length > 0
|
56
|
+
raise Msn::AuthenticationError.new(fault.first.text)
|
57
57
|
end
|
58
58
|
|
59
59
|
rstr = xml.xpath "//wst:RequestSecurityTokenResponse[wsp:AppliesTo/wsa:EndpointReference/wsa:Address='messengerclear.live.com']", Namespaces
|
@@ -11,6 +11,9 @@ class Msn::NotificationServer < EventMachine::Connection
|
|
11
11
|
@guid = Guid.new.to_s
|
12
12
|
@switchboards = {}
|
13
13
|
|
14
|
+
@message_id = 1
|
15
|
+
@message_ids = {}
|
16
|
+
|
14
17
|
on_event 'ADL' do |header, data|
|
15
18
|
data = Nokogiri::XML(data)
|
16
19
|
domain = data.xpath('//ml/d').first['n']
|
@@ -26,21 +29,31 @@ class Msn::NotificationServer < EventMachine::Connection
|
|
26
29
|
end
|
27
30
|
|
28
31
|
def send_message(email, text)
|
32
|
+
message_id = @message_id
|
33
|
+
@message_id += 1
|
34
|
+
|
29
35
|
switchboard = @switchboards[email]
|
30
36
|
if switchboard
|
31
|
-
switchboard.send_message text
|
37
|
+
trid = switchboard.send_message text
|
38
|
+
@message_ids[trid] = message_id
|
32
39
|
else
|
33
40
|
Fiber.new do
|
34
41
|
response = xfr "SB"
|
35
42
|
switchboard = create_switchboard email, response[3]
|
36
43
|
switchboard.on_event 'JOI' do
|
37
44
|
switchboard.clear_event 'JOI'
|
38
|
-
switchboard.send_message text
|
45
|
+
trid = switchboard.send_message text
|
46
|
+
@message_ids[trid] = message_id
|
39
47
|
end
|
40
48
|
switchboard.usr username_guid, response[5]
|
41
|
-
switchboard.cal email
|
49
|
+
cal_response = switchboard.cal email
|
50
|
+
if cal_response[0] == '217'
|
51
|
+
messenger.accept_message_ack message_id, :offline
|
52
|
+
end
|
42
53
|
end.resume
|
43
54
|
end
|
55
|
+
|
56
|
+
message_id
|
44
57
|
end
|
45
58
|
|
46
59
|
def username
|
@@ -137,6 +150,12 @@ class Msn::NotificationServer < EventMachine::Connection
|
|
137
150
|
def create_switchboard(email, host_and_port)
|
138
151
|
host, port = host_and_port.split(':')
|
139
152
|
switchboard = EM.connect host, port, Msn::Switchboard, messenger
|
153
|
+
switchboard.on_event 'ACK' do |header|
|
154
|
+
notify_ack header[1].to_i, :ack
|
155
|
+
end
|
156
|
+
switchboard.on_event 'NAK' do |header|
|
157
|
+
notify_ack header[1].to_i, :nak
|
158
|
+
end
|
140
159
|
switchboard.on_event 'BYE' do |header|
|
141
160
|
destroy_switchboard email if header[1] =~ /#{email}/
|
142
161
|
end
|
@@ -148,6 +167,11 @@ class Msn::NotificationServer < EventMachine::Connection
|
|
148
167
|
switchboard.close_connection if switchboard
|
149
168
|
end
|
150
169
|
|
170
|
+
def notify_ack(trid, status)
|
171
|
+
id = @message_ids.delete(trid)
|
172
|
+
messenger.accept_message_ack id, status if id
|
173
|
+
end
|
174
|
+
|
151
175
|
def unbind
|
152
176
|
if @reconnect_host
|
153
177
|
reconnect @reconnect_host, @reconnect_port.to_i
|
data/lib/msn/protocol.rb
CHANGED
@@ -7,7 +7,7 @@ module Msn::Protocol
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def receive_line(line)
|
10
|
-
|
10
|
+
Msn::Messenger.log_info "<< #{line}"
|
11
11
|
|
12
12
|
pieces = line.split(' ')
|
13
13
|
|
@@ -47,7 +47,7 @@ module Msn::Protocol
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def receive_binary_data(data)
|
50
|
-
|
50
|
+
Msn::Messenger.log_info "<<* #{data}"
|
51
51
|
|
52
52
|
handle_event @header, data
|
53
53
|
end
|
@@ -91,9 +91,10 @@ module Msn::Protocol
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def send_command_internal(text)
|
94
|
-
|
94
|
+
Msn::Messenger.log_info ">> #{text}"
|
95
95
|
send_data text
|
96
96
|
@trid += 1
|
97
|
+
@trid - 1
|
97
98
|
end
|
98
99
|
|
99
100
|
def on_event(kind, &block)
|
data/lib/msn/switchboard.rb
CHANGED
@@ -17,7 +17,7 @@ class Msn::Switchboard < EventMachine::Connection
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def send_message(text)
|
20
|
-
send_payload_command "MSG", "
|
20
|
+
send_payload_command "MSG", "A", "MIME-Version: 1.0\r\nContent-Type: text/plain; charset=UTF-8\r\nUser-Agent: pidgin/2.10.5devel\r\nX-MMS-IM-Format: FN=Segoe%20UI; EF=; CO=0; PF=0; RL=0\r\n\r\n#{text}"
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
data/lib/msn/version.rb
CHANGED