rumeme 0.3.0 → 0.4.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.
- data/CHANGELOG +12 -0
- data/README.rdoc +6 -3
- data/lib/rumeme/sms_interface.rb +42 -33
- data/lib/rumeme/sms_reply.rb +27 -25
- data/lib/rumeme/version.rb +1 -1
- data/lib/rumeme.rb +0 -1
- data/rumeme.gemspec +2 -2
- metadata +12 -6
- data/lib/rumeme/generator.rb +0 -110
data/CHANGELOG
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
Version 0.4.0 - 2012-10-30
|
2
|
+
===============================================================================
|
3
|
+
|
4
|
+
Stan Carver II (6):
|
5
|
+
changed send_messages to return true or false instead of raising an error
|
6
|
+
added send_messages! to raise an error
|
7
|
+
change inverted if not conditionals to unless
|
8
|
+
refactored message_id_sign out of create_login_string
|
9
|
+
consolidated self references with a << self block
|
10
|
+
added my name to the credits as a contributor
|
11
|
+
|
12
|
+
|
1
13
|
Version 0.3.0 - 2012-02-17
|
2
14
|
===============================================================================
|
3
15
|
|
data/README.rdoc
CHANGED
@@ -9,7 +9,7 @@ Just execute
|
|
9
9
|
gem install rumeme
|
10
10
|
|
11
11
|
== Usage
|
12
|
-
|
12
|
+
First, add Rumeme initialization
|
13
13
|
|
14
14
|
Rumeme.configure do |config|
|
15
15
|
config.username = 'xxx'
|
@@ -40,7 +40,10 @@ Where xxxxxxxxxxx is phone number.
|
|
40
40
|
* Add unit tests,
|
41
41
|
|
42
42
|
= Credits
|
43
|
-
RuMeMe is maintained by
|
43
|
+
RuMeMe is maintained by Anatoliy Plastinin, and is funded by {Cloud Castle, LLC}[http://cloudcastlegroup.com/].
|
44
|
+
|
45
|
+
= Contributors
|
46
|
+
Stan Carver II
|
44
47
|
|
45
48
|
= License
|
46
|
-
Still looking for license. But the software is provided "as is", without warranty of any kind.
|
49
|
+
Still looking for license. But the software is provided "as is", without warranty of any kind.
|
data/lib/rumeme/sms_interface.rb
CHANGED
@@ -79,7 +79,7 @@ module Rumeme
|
|
79
79
|
# Return the list of replies we have received.
|
80
80
|
def check_replies
|
81
81
|
response_message, response_code = post_data_to_server("CHECKREPLY2.0\r\n.\r\n")
|
82
|
-
return
|
82
|
+
return unless response_code == 150
|
83
83
|
|
84
84
|
messages = response_message.split("\r\n")[1..-2].map{|message_line| SmsReply.parse(message_line)} # check @use_message_id
|
85
85
|
confirm_replies_received if @replies_auto_confirm && messages.size > 0
|
@@ -106,57 +106,66 @@ module Rumeme
|
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
|
-
# Sends all the messages that have been added with the
|
110
|
-
#
|
109
|
+
# Sends all the messages that have been added with the add_message command.
|
110
|
+
# returns boolean. true if successful, false if not.
|
111
111
|
def send_messages
|
112
112
|
post_string = @message_list.map(&:post_string).join
|
113
113
|
text_buffer = "MESSAGES2.0\r\n#{post_string}.\r\n"
|
114
114
|
response_message, response_code = post_data_to_server(text_buffer)
|
115
|
+
response_code == 100
|
116
|
+
end
|
115
117
|
|
116
|
-
|
118
|
+
# Sends all the messages that have been added with the add_message command.
|
119
|
+
# Raises exception if not successful
|
120
|
+
def send_messages!
|
121
|
+
raise BadServerResponse.new('error during sending messages') unless send_messages
|
117
122
|
end
|
118
123
|
|
119
124
|
private
|
120
125
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
126
|
+
class << self
|
127
|
+
def head_tail_split message, max_len
|
128
|
+
return [message, nil] if message.length < max_len
|
129
|
+
pattern = /\s\.,!;:-\)/
|
130
|
+
index = message[0..max_len].rindex(pattern) || max_len
|
131
|
+
[message[0..index], message[index+1 .. -1]]
|
132
|
+
end
|
127
133
|
|
128
|
-
|
129
|
-
|
130
|
-
|
134
|
+
def split_message_internal message
|
135
|
+
list =[]
|
136
|
+
sizes = Enumerator.new {|yielder| yielder << 152; yielder << 155 while true}
|
131
137
|
|
132
|
-
|
133
|
-
|
134
|
-
|
138
|
+
until message.nil? do
|
139
|
+
head, message = head_tail_split(message, sizes.next)
|
140
|
+
list << head
|
141
|
+
end
|
142
|
+
|
143
|
+
list
|
135
144
|
end
|
136
145
|
|
137
|
-
|
138
|
-
|
146
|
+
def split_message message
|
147
|
+
messages = split_message_internal message
|
148
|
+
message_index = 1
|
149
|
+
total_messages = messages.size
|
150
|
+
["#{messages[0]}...(1/#{total_messages})"].concat(messages[1..-1].map {|msg| "(#{message_index+=1}/#{total_messages})#{msg}"})
|
151
|
+
end
|
139
152
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
["#{messages[0]}...(1/#{total_messages})"].concat(messages[1..-1].map {|msg| "(#{message_index+=1}/#{total_messages})#{msg}"})
|
153
|
+
# Strip invalid characters from the phone number.
|
154
|
+
def strip_invalid phone
|
155
|
+
phone.nil? ? "+#{phone.gsub(/[^0-9]/, '')}" : nil
|
156
|
+
end
|
145
157
|
end
|
146
|
-
|
158
|
+
|
147
159
|
def process_long_message message
|
148
160
|
return [message] if message.length <= 160
|
149
161
|
@long_messages_processor.call(message)
|
150
162
|
end
|
151
163
|
|
152
|
-
|
153
|
-
|
154
|
-
return nil if phone.nil?
|
155
|
-
"+#{phone.gsub(/[^0-9]/, '')}"
|
164
|
+
def message_id_sign
|
165
|
+
@use_message_id ? '#' : ''
|
156
166
|
end
|
157
|
-
|
167
|
+
|
158
168
|
def create_login_string # can be calculate once at initialization
|
159
|
-
message_id_sign = @use_message_id? '#' :''
|
160
169
|
"m4u\r\nUSER=#{@username}#{message_id_sign}\r\nPASSWORD=#{@password}\r\nVER=PHP1.0\r\n"
|
161
170
|
end
|
162
171
|
|
@@ -175,8 +184,8 @@ module Rumeme
|
|
175
184
|
data = resp.body
|
176
185
|
p resp
|
177
186
|
p data
|
178
|
-
|
179
|
-
raise BadServerResponse.new('http response code != 200')
|
187
|
+
|
188
|
+
raise BadServerResponse.new('http response code != 200') unless response.code.to_i == 200
|
180
189
|
|
181
190
|
if data =~ /^.+<TITLE>(.+)<\/TITLE>.+<BODY>(.+)<\/BODY>.+/m
|
182
191
|
parsed_title, parsed_body = $1, $2
|
@@ -184,7 +193,7 @@ module Rumeme
|
|
184
193
|
raise BadServerResponse.new('not html')
|
185
194
|
end
|
186
195
|
|
187
|
-
raise BadServerResponse.new('bad title')
|
196
|
+
raise BadServerResponse.new('bad title') unless parsed_title == "M4U SMSMASTER"
|
188
197
|
|
189
198
|
response_message = parsed_body.strip
|
190
199
|
|
data/lib/rumeme/sms_reply.rb
CHANGED
@@ -8,34 +8,36 @@ module Rumeme
|
|
8
8
|
@phone_number, @message, @message_id, @when, @status = phone_number, message, message_id, _when, status
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
class << self
|
12
|
+
# Unescape any escaped characters in the string.
|
13
|
+
def unescape line
|
14
|
+
line.nil? ? nil : line.gsub('\n', "\n").gsub('\r', "\r").gsub('\\\\', "\\")
|
15
|
+
end
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
# Parse a reply from a string.
|
18
|
+
# Format is: messageID phone when message /(\d+)\s(\d+)\s(\d+)\s(.+)/
|
19
|
+
# Or if no message ID: phone when message /(\d+)\s(\d+)\s(.+)/
|
20
|
+
# Or if delivery receipt: messageID messageStatus when /(\d+)\s(\d)\s(\d+)/
|
21
|
+
# current implementation ignores use_message_id setting (as original code)
|
22
|
+
def parse line
|
23
|
+
p "parsing line: #{line}"
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
25
|
+
message_id, status, message, phone, when_ = case line
|
26
|
+
when /^(\d+)\s(\d)\s(\d+)/
|
27
|
+
#process delivery report
|
28
|
+
[$1.to_i, $2.to_i, nil, nil, $3.to_i]
|
29
|
+
when /^(\d+)\s\+?(\d+)\s(\d+)\s(.+)/
|
30
|
+
#process message with id
|
31
|
+
[$1.to_i, MessageStatus::NONE, unescape($4), $2, $3.to_i]
|
32
|
+
when /^\+?(\d+)\s(\d+)\s(.+)/
|
33
|
+
#process message without id
|
34
|
+
[nil, MessageStatus::NONE, unescape($3), $1, $2.to_i]
|
35
|
+
else
|
36
|
+
raise ArgumentError.new("can't parse line: #{line}")
|
37
|
+
end
|
37
38
|
|
38
|
-
|
39
|
+
return SmsReply.new(phone, message, message_id, when_, status)
|
40
|
+
end
|
39
41
|
end
|
40
42
|
|
41
43
|
def delivery_report?
|
data/lib/rumeme/version.rb
CHANGED
data/lib/rumeme.rb
CHANGED
data/rumeme.gemspec
CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.name = "rumeme"
|
10
10
|
s.version = Rumeme::VERSION
|
11
11
|
|
12
|
-
s.authors = ["Anatoliy Plastinin, Cloud Castle LLC"]
|
13
|
-
s.email = ["antlypls@gmail.com"]
|
12
|
+
s.authors = ["Anatoliy Plastinin, Cloud Castle LLC", "Stan Carver II, A1 Web Consulting"]
|
13
|
+
s.email = ["antlypls@gmail.com", "stan@a1webconsulting.com"]
|
14
14
|
|
15
15
|
s.homepage = "http://github.com/programmable/rumeme"
|
16
16
|
s.summary = "Ruby SDK for Message Media SMS Gateway API"
|
metadata
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rumeme
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Anatoliy Plastinin, Cloud Castle LLC
|
9
|
+
- Stan Carver II, A1 Web Consulting
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2012-
|
13
|
+
date: 2012-11-01 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: shoulda
|
16
|
-
requirement:
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
17
18
|
none: false
|
18
19
|
requirements:
|
19
20
|
- - ! '>='
|
@@ -21,10 +22,16 @@ dependencies:
|
|
21
22
|
version: '0'
|
22
23
|
type: :development
|
23
24
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
25
31
|
description: Ruby SDK for Message Media SMS Gateway API
|
26
32
|
email:
|
27
33
|
- antlypls@gmail.com
|
34
|
+
- stan@a1webconsulting.com
|
28
35
|
executables: []
|
29
36
|
extensions: []
|
30
37
|
extra_rdoc_files:
|
@@ -38,7 +45,6 @@ files:
|
|
38
45
|
- Rakefile
|
39
46
|
- lib/rumeme.rb
|
40
47
|
- lib/rumeme/configuration.rb
|
41
|
-
- lib/rumeme/generator.rb
|
42
48
|
- lib/rumeme/message_status.rb
|
43
49
|
- lib/rumeme/sms_interface.rb
|
44
50
|
- lib/rumeme/sms_message.rb
|
@@ -71,7 +77,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
77
|
version: '0'
|
72
78
|
requirements: []
|
73
79
|
rubyforge_project:
|
74
|
-
rubygems_version: 1.8.
|
80
|
+
rubygems_version: 1.8.23
|
75
81
|
signing_key:
|
76
82
|
specification_version: 3
|
77
83
|
summary: Ruby SDK for Message Media SMS Gateway API
|
data/lib/rumeme/generator.rb
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
# from ruby 1.8.7 source
|
2
|
-
|
3
|
-
class Generator
|
4
|
-
include Enumerable
|
5
|
-
|
6
|
-
# Creates a new generator either from an Enumerable object or from a
|
7
|
-
# block.
|
8
|
-
#
|
9
|
-
# In the former, block is ignored even if given.
|
10
|
-
#
|
11
|
-
# In the latter, the given block is called with the generator
|
12
|
-
# itself, and expected to call the +yield+ method for each element.
|
13
|
-
def initialize(enum = nil, &block)
|
14
|
-
if enum
|
15
|
-
@block = proc { |g|
|
16
|
-
enum.each { |x| g.yield x }
|
17
|
-
}
|
18
|
-
else
|
19
|
-
@block = block
|
20
|
-
end
|
21
|
-
|
22
|
-
@index = 0
|
23
|
-
@queue = []
|
24
|
-
@cont_next = @cont_yield = @cont_endp = nil
|
25
|
-
|
26
|
-
if @cont_next = callcc { |c| c }
|
27
|
-
@block.call(self)
|
28
|
-
|
29
|
-
@cont_endp.call(nil) if @cont_endp
|
30
|
-
end
|
31
|
-
|
32
|
-
self
|
33
|
-
end
|
34
|
-
|
35
|
-
# Yields an element to the generator.
|
36
|
-
def yield(value)
|
37
|
-
if @cont_yield = callcc { |c| c }
|
38
|
-
@queue << value
|
39
|
-
@cont_next.call(nil)
|
40
|
-
end
|
41
|
-
|
42
|
-
self
|
43
|
-
end
|
44
|
-
|
45
|
-
# Returns true if the generator has reached the end.
|
46
|
-
def end?()
|
47
|
-
if @cont_endp = callcc { |c| c }
|
48
|
-
@cont_yield.nil? && @queue.empty?
|
49
|
-
else
|
50
|
-
@queue.empty?
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# Returns true if the generator has not reached the end yet.
|
55
|
-
def next?()
|
56
|
-
!end?
|
57
|
-
end
|
58
|
-
|
59
|
-
# Returns the current index (position) counting from zero.
|
60
|
-
def index()
|
61
|
-
@index
|
62
|
-
end
|
63
|
-
|
64
|
-
# Returns the current index (position) counting from zero.
|
65
|
-
def pos()
|
66
|
-
@index
|
67
|
-
end
|
68
|
-
|
69
|
-
# Returns the element at the current position and moves forward.
|
70
|
-
def next()
|
71
|
-
if end?
|
72
|
-
raise EOFError, "no more elements available"
|
73
|
-
end
|
74
|
-
|
75
|
-
if @cont_next = callcc { |c| c }
|
76
|
-
@cont_yield.call(nil) if @cont_yield
|
77
|
-
end
|
78
|
-
|
79
|
-
@index += 1
|
80
|
-
|
81
|
-
@queue.shift
|
82
|
-
end
|
83
|
-
|
84
|
-
# Returns the element at the current position.
|
85
|
-
def current()
|
86
|
-
if @queue.empty?
|
87
|
-
raise EOFError, "no more elements available"
|
88
|
-
end
|
89
|
-
|
90
|
-
@queue.first
|
91
|
-
end
|
92
|
-
|
93
|
-
# Rewinds the generator.
|
94
|
-
def rewind()
|
95
|
-
initialize(nil, &@block) if @index.nonzero?
|
96
|
-
|
97
|
-
self
|
98
|
-
end
|
99
|
-
|
100
|
-
# Rewinds the generator and enumerates the elements.
|
101
|
-
def each
|
102
|
-
rewind
|
103
|
-
|
104
|
-
until end?
|
105
|
-
yield self.next
|
106
|
-
end
|
107
|
-
|
108
|
-
self
|
109
|
-
end
|
110
|
-
end
|