rfetion 0.5.3 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.3
1
+ 0.5.4
@@ -8,7 +8,7 @@ require 'openssl'
8
8
  require 'logger'
9
9
 
10
10
  class Fetion
11
- attr_accessor :mobile_no, :sid, :password, :seq, :ssic, :guid, :uri
11
+ attr_accessor :mobile_no, :sid, :password, :call, :seq, :alive, :ssic, :guid, :uri
12
12
  attr_reader :user_id, :contacts, :buddy_lists, :response, :nickname, :receives
13
13
 
14
14
  FETION_URL = 'http://221.176.31.39/ht/sd.aspx'
@@ -51,9 +51,9 @@ class Fetion
51
51
  def Fetion.keep_alive(options)
52
52
  Fetion.open(options) do
53
53
  get_contacts
54
- keep_alive
54
+ pulse
55
55
  sleep(15)
56
- keep_alive
56
+ pulse
57
57
  p receives
58
58
  end
59
59
  end
@@ -284,6 +284,14 @@ class Fetion
284
284
  @logger.info "fetion keep alive success"
285
285
  end
286
286
 
287
+ def pulse(expected=SipcMessage::OK)
288
+ @logger.info "fetion pulse"
289
+
290
+ curl_exec(SIPP, next_url, expected)
291
+
292
+ @logger.info "fetion pulse success"
293
+ end
294
+
287
295
  def logout
288
296
  @logger.info "fetion logout"
289
297
 
@@ -318,6 +326,14 @@ class Fetion
318
326
  @logger.info "fetion msg received success"
319
327
  end
320
328
 
329
+ def close_session
330
+ @logger.info "fetion close_session"
331
+
332
+ curl_exec(SipcMessage.close_session(self))
333
+
334
+ @logger.info "fetion close_session success"
335
+ end
336
+
321
337
  def parse_ssic(response)
322
338
  raise Fetion::LoginException.new('Fetion Error: Login failed.') unless Net::HTTPSuccess === response
323
339
  raise Fetion::LoginException.new('Fetion Error: No ssic found in cookie.') unless response['set-cookie'] =~ /ssic=(.*);/
@@ -345,10 +361,6 @@ class Fetion
345
361
  @logger.debug "sid: " + @sid
346
362
  end
347
363
 
348
- def pulse(expected=SipcMessage::OK)
349
- curl_exec(SIPP, next_url, expected)
350
- end
351
-
352
364
  def curl_exec(body='', url=next_url, expected=SipcMessage::OK)
353
365
  @logger.debug "fetion curl exec"
354
366
  @logger.debug "url: #{url}"
@@ -381,37 +393,10 @@ class Fetion
381
393
  @logger.debug "key: #{@key}"
382
394
  @logger.debug "signature: #{@signature}"
383
395
  @logger.debug "response: #{@response}"
384
- elsif sipc_response.contain?('I')
385
- create_session(sipc_response)
386
- elsif sipc_response.contain?('O')
387
- session_connected(sipc_response)
388
- else
389
- response.body.scan(%r{<results>.*?</results>}).each do |results|
390
- doc = Nokogiri::XML(results)
391
- doc.root.xpath("/results/user-info/personal").each do |personal_element|
392
- @nickname = personal_element['nickname']
393
- @logger.debug "nickname: #@nickname"
394
- end
395
- doc.root.xpath("/results/user-info/contact-list/buddy-lists/buddy-list").each do |buddy_list|
396
- @buddy_lists << Fetion::BuddyList.parse(buddy_list)
397
- end
398
- doc.root.xpath("/results/user-info/contact-list/buddies/b").each do |buddy|
399
- @buddies << {:uri => buddy["u"]}
400
- end
401
- end
402
-
403
- response.body.scan(%r{<events>.*?</events>}).each do |events|
404
- doc = Nokogiri::XML(events)
405
- doc.root.xpath("/events/event[@type='PresenceChanged']/contacts/c").each do |c|
406
- contact = contacts.find {|contact| contact.id == c['id']}
407
- if contact
408
- contact.status = c.children.first['b']
409
- else
410
- @contacts << Fetion::Contact.parse(c) unless c['id'] == @user_id
411
- end
412
- end
413
- end
414
-
396
+ end
397
+ create_session(sipc_response) if sipc_response.contain?('I')
398
+ session_connected(sipc_response) if sipc_response.contain?('O')
399
+ if sipc_response.contain?('M')
415
400
  receive_messages = response.body.scan(%r{M #{@sid} SIP-C/4.0.*?BN}m)
416
401
  receive_messages = response.body.scan(%r{M #{@sid} SIP-C/4.0.*?SIPP\r?\n?$}m) if receive_messages.empty?
417
402
  receive_messages.each do |message_response|
@@ -429,6 +414,32 @@ class Fetion
429
414
  msg_received(message_response)
430
415
  end
431
416
  end
417
+
418
+ response.body.scan(%r{<results>.*?</results>}).each do |results|
419
+ doc = Nokogiri::XML(results)
420
+ doc.root.xpath("/results/user-info/personal").each do |personal_element|
421
+ @nickname = personal_element['nickname']
422
+ @logger.debug "nickname: #@nickname"
423
+ end
424
+ doc.root.xpath("/results/user-info/contact-list/buddy-lists/buddy-list").each do |buddy_list|
425
+ @buddy_lists << Fetion::BuddyList.parse(buddy_list)
426
+ end
427
+ doc.root.xpath("/results/user-info/contact-list/buddies/b").each do |buddy|
428
+ @buddies << {:uri => buddy["u"]}
429
+ end
430
+ end
431
+
432
+ response.body.scan(%r{<events>.*?</events>}).each do |events|
433
+ doc = Nokogiri::XML(events)
434
+ doc.root.xpath("/events/event[@type='PresenceChanged']/contacts/c").each do |c|
435
+ contact = contacts.find {|contact| contact.id == c['id']}
436
+ if contact
437
+ contact.status = c.children.first['b']
438
+ else
439
+ @contacts << Fetion::Contact.parse(c) unless c['id'] == @user_id
440
+ end
441
+ end
442
+ end
432
443
  end
433
444
  sipc_response
434
445
  end
@@ -2,12 +2,12 @@ require 'guid'
2
2
 
3
3
  class SipcMessage
4
4
  def self.register_first(fetion)
5
- sipc_create(:command => 'R', :F => fetion.sid, :I => 1, :Q => '1 R', :CN => ::Guid.new.hexdigest.upcase, :CL => %Q|type="pc" ,version="#{Fetion::VERSION}"|, :with_l => false)
5
+ sipc_create(:command => 'R', :F => fetion.sid, :I => 1, :Q => "#{fetion.next_alive} R", :CN => ::Guid.new.hexdigest.upcase, :CL => %Q|type="pc" ,version="#{Fetion::VERSION}"|, :with_l => false)
6
6
  end
7
7
 
8
8
  def self.register_second(fetion)
9
9
  body = %Q|<args><device machine-code="B04B5DA2F5F1B8D01A76C0EBC841414C" /><caps value="ff" /><events value="7f" /><user-info mobile-no="#{fetion.mobile_no}" user-id="#{fetion.user_id}"><personal version="0" attributes="v4default" /><custom-config version="0" /><contact-list version="0" buddy-attributes="v4default" /></user-info><credentials domains="fetion.com.cn;m161.com.cn;www.ikuwa.cn;games.fetion.com.cn" /><presence><basic value="400" desc="" /></presence></args>|
10
- sipc_create(:command => 'R', :F => fetion.sid, :I => 1, :Q => '2 R', :A => %Q|Digest response="#{fetion.response}",algorithm="SHA1-sess-v4"|, :AK => 'ak-value', :body => body)
10
+ sipc_create(:command => 'R', :F => fetion.sid, :I => 1, :Q => "#{fetion.next_alive} R", :A => %Q|Digest response="#{fetion.response}",algorithm="SHA1-sess-v4"|, :AK => 'ak-value', :body => body)
11
11
  end
12
12
 
13
13
  def self.get_group_list(fetion)
@@ -55,7 +55,7 @@ class SipcMessage
55
55
  end
56
56
 
57
57
  def self.logout(fetion)
58
- sipc_create(:command => 'R', :F => fetion.sid, :I => 1, :Q => '3 R', :X => 0, :with_l => false)
58
+ sipc_create(:command => 'R', :F => fetion.sid, :I => 1, :Q => "#{fetion.next_alive} R", :X => 0, :with_l => false)
59
59
  end
60
60
 
61
61
  def self.create_session(fetion, last_sipc_response)
@@ -105,6 +105,11 @@ class SipcMessage
105
105
  sipc_create(:command => 'B', :F => fetion.sid, :I => fetion.next_call, :Q => '2 B', :T => "sip:#{receiver_uri}", :with_l => false)
106
106
  end
107
107
 
108
+ def self.keep_alive(fetion)
109
+ body = %Q|<args><credentials domains="fetion.com.cn;m161.com.cn;www.ikuwa.cn;games.fetion.com.cn" /></args>|
110
+ sipc_create(:command => 'R', :F => fetion.sid, :I => 1, :Q => "#{fetion.next_alive} R", :N => 'KeepAlive', :body => body)
111
+ end
112
+
108
113
  def self.sipc_response(http_response_body, fetion)
109
114
  return if http_response_body == Fetion::SIPP
110
115
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rfetion}
8
- s.version = "0.5.3"
8
+ s.version = "0.5.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Richard Huang"]
12
- s.date = %q{2010-05-16}
12
+ s.date = %q{2010-05-17}
13
13
  s.description = %q{rfetion is a ruby gem for China Mobile fetion service that you can send SMS free.}
14
14
  s.email = %q{flyerhzm@gmail.com}
15
15
  s.executables = ["rfetion", "rfetion"]
@@ -495,7 +495,7 @@ EOF
495
495
  end
496
496
  end
497
497
 
498
- describe "keep-alive" do
498
+ describe "pulse" do
499
499
  before :each do
500
500
  @fetion.instance_variable_set(:@seq, 10)
501
501
  @fetion.instance_variable_set(:@sid, "730020377")
@@ -516,7 +516,7 @@ Q: 11 BN
516
516
  EOF
517
517
  response_body.gsub!("\n", "\r\n")
518
518
  FakeWeb.register_uri(:post, "http://221.176.31.39/ht/sd.aspx?t=s&i=11", :body => response_body)
519
- @fetion.keep_alive
519
+ @fetion.pulse
520
520
  @fetion.contacts.find {|contact| contact.id == '295098062'}.status.should == "400"
521
521
  end
522
522
 
@@ -574,7 +574,7 @@ EOF
574
574
  response_body.gsub!("\n", "\r\n")
575
575
  FakeWeb.register_uri(:post, "http://221.176.31.39/ht/sd.aspx?t=s&i=14", :body => response_body)
576
576
  FakeWeb.register_uri(:post, "http://221.176.31.39/ht/sd.aspx?t=s&i=15", :body => "SIPP")
577
- @fetion.keep_alive
577
+ @fetion.pulse
578
578
  @fetion.receives.collect {|r| r.sip}.should == ["638993408@fetion.com.cn;p=2242"]
579
579
  @fetion.receives.collect {|r| r.sent_at}.should == [Time.parse("Sun, 16 May 2010 02:16:00 GMT")]
580
580
  @fetion.receives.collect {|r| r.text}.should == ["test"]
@@ -632,7 +632,7 @@ EOF
632
632
  response_body.gsub!("\n", "\r\n")
633
633
  FakeWeb.register_uri(:post, "http://221.176.31.39/ht/sd.aspx?t=s&i=13", :body => response_body)
634
634
  FakeWeb.register_uri(:post, "http://221.176.31.39/ht/sd.aspx?t=s&i=14", :body => "SIPP")
635
- @fetion.keep_alive
635
+ @fetion.pulse
636
636
  @fetion.receives.collect {|r| r.sip}.should == ["638993408@fetion.com.cn;p=2242"]
637
637
  @fetion.receives.collect {|r| r.sent_at}.should == [Time.parse("Sun, 16 May 2010 02:16:00 GMT")]
638
638
  @fetion.receives.collect {|r| r.text}.should == ["test"]
@@ -654,6 +654,11 @@ testtesttestSIPP
654
654
  EOF
655
655
  response_body.gsub!("\n", "\r\n")
656
656
  FakeWeb.register_uri(:post, "http://221.176.31.39/ht/sd.aspx?t=s&i=11", :body => response_body)
657
+ FakeWeb.register_uri(:post, "http://221.176.31.39/ht/sd.aspx?t=s&i=12", :body => "SIPP")
658
+ @fetion.pulse
659
+ @fetion.receives.collect {|r| r.sip}.should == ["638993408@fetion.com.cn;p=2242"]
660
+ @fetion.receives.collect {|r| r.sent_at}.should == [Time.parse("Tue, 11 May 2010 15:18:56 GMT")]
661
+ @fetion.receives.collect {|r| r.text}.should == ["testtesttest"]
657
662
  end
658
663
  end
659
664
  end
@@ -19,6 +19,7 @@ describe SipcMessage do
19
19
  Guid.stubs(:new).returns(guid)
20
20
  guid.stubs(:hexdigest).returns(hexdigest)
21
21
  hexdigest.stubs(:upcase).returns("19D28D4978125CAA4F6E54277BA7D9EF")
22
+ @fetion.alive = 0
22
23
  sipc_message =<<-EOF
23
24
  R fetion.com.cn SIP-C/4.0
24
25
  F: 730020377
@@ -34,6 +35,7 @@ EOF
34
35
  end
35
36
 
36
37
  it "should get register_second" do
38
+ @fetion.alive = 1
37
39
  sipc_message =<<-EOF
38
40
  R fetion.com.cn SIP-C/4.0
39
41
  F: 730020377
@@ -229,7 +231,26 @@ m=message SIPP
229
231
  EOF
230
232
  http_response_body.gsub!("\n", "\r\n").chomp!
231
233
  last_sipc_response = SipcMessage.sipc_response(http_response_body, @fetion)
232
- sipc_message = %Q|SIP-C/4.0 200 OK\r\nI: -13\r\nQ: 14 I\r\nF: sip:638993408@fetion.com.cn;p=2242\r\nK: text/plain\r\nK: text/html-fragment\r\nK: multiparty\r\nK: nudge\r\nL: 129\r\n\r\nv=0\r\no=-0 0 IN 127.0.0.1:8001\r\ns=session\r\nc=IN IP4 127.0.0.1:8001\r\nt=0 0\r\nm=message 8001 sip sip:730020377@fetion.com.cn;p=6907\r\nSIPP|
234
+ sipc_message =<<-EOF
235
+ SIP-C/4.0 200 OK
236
+ I: -13
237
+ Q: 14 I
238
+ F: sip:638993408@fetion.com.cn;p=2242
239
+ K: text/plain
240
+ K: text/html-fragment
241
+ K: multiparty
242
+ K: nudge
243
+ L: 129
244
+
245
+ v=0
246
+ o=-0 0 IN 127.0.0.1:8001
247
+ s=session
248
+ c=IN IP4 127.0.0.1:8001
249
+ t=0 0
250
+ m=message 8001 sip sip:730020377@fetion.com.cn;p=6907
251
+ SIPP
252
+ EOF
253
+ sipc_message.gsub!("\n", "\r\n").chomp!
233
254
  SipcMessage.create_session(@fetion, last_sipc_response).should == sipc_message
234
255
  end
235
256
 
@@ -294,6 +315,22 @@ EOF
294
315
  SipcMessage.msg_received(@fetion, http_response_body).should == sipc_message
295
316
  end
296
317
 
318
+ it "should keep alive" do
319
+ @fetion.alive = 3
320
+ sipc_message =<<-EOF
321
+ R fetion.com.cn SIP-C/4.0
322
+ F: 730020377
323
+ I: 1
324
+ Q: 4 R
325
+ N: KeepAlive
326
+ L: 97
327
+
328
+ <args><credentials domains="fetion.com.cn;m161.com.cn;www.ikuwa.cn;games.fetion.com.cn" /></args>SIPP
329
+ EOF
330
+ sipc_message.gsub!("\n", "\r\n").chomp!
331
+ SipcMessage.keep_alive(@fetion).should == sipc_message
332
+ end
333
+
297
334
  it "should close session" do
298
335
  @fetion.call = 5
299
336
  sipc_message =<<-EOF
@@ -310,6 +347,7 @@ EOF
310
347
  end
311
348
 
312
349
  it "should logout" do
350
+ @fetion.alive = 2
313
351
  sipc_message =<<-EOF
314
352
  R fetion.com.cn SIP-C/4.0
315
353
  F: 730020377
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rfetion
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Huang
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-05-16 00:00:00 -06:00
12
+ date: 2010-05-17 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency