rumeme 0.1.3 → 0.1.4
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 +10 -0
- data/lib/rumeme/configuration.rb +5 -0
- data/lib/rumeme/sms_interface.rb +49 -77
- data/lib/rumeme/sms_message.rb +1 -1
- data/lib/rumeme/sms_reply.rb +19 -51
- data/lib/rumeme/version.rb +1 -1
- metadata +3 -3
data/CHANGELOG
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
Version 0.1.4 - 2010-03-12
|
2
|
+
===============================================================================
|
3
|
+
|
4
|
+
antlypls (3):
|
5
|
+
reimplement SmsReply.parse
|
6
|
+
minor refactoring of constructor code
|
7
|
+
refactoring
|
8
|
+
|
9
|
+
|
1
10
|
Version 0.1.3 - 2010-03-11
|
2
11
|
===============================================================================
|
3
12
|
|
@@ -33,3 +42,4 @@ antlypls (5):
|
|
33
42
|
|
34
43
|
|
35
44
|
|
45
|
+
|
data/lib/rumeme/configuration.rb
CHANGED
@@ -5,6 +5,7 @@ module Rumeme
|
|
5
5
|
attr_accessor :password
|
6
6
|
attr_accessor :use_message_id
|
7
7
|
attr_accessor :secure
|
8
|
+
attr_accessor :replies_auto_confirm
|
8
9
|
|
9
10
|
#
|
10
11
|
# possible values
|
@@ -12,6 +13,10 @@ module Rumeme
|
|
12
13
|
# :split - splits messages into small (less than 160 ch) messages
|
13
14
|
# :cut - sends only first 160 symbols
|
14
15
|
attr_accessor :long_messages_strategy
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@replies_auto_confirm = true
|
19
|
+
end
|
15
20
|
end
|
16
21
|
end
|
17
22
|
|
data/lib/rumeme/sms_interface.rb
CHANGED
@@ -20,55 +20,32 @@ module Rumeme
|
|
20
20
|
# characters to be sent as special concatenated messages. For this
|
21
21
|
# to take effect, the allowSplitting parameter must be set to false.
|
22
22
|
def initialize
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
Rumeme.configuration.tap{ |cfg|
|
24
|
+
@username = cfg.username
|
25
|
+
@password = cfg.password
|
26
|
+
@use_message_id = cfg.use_message_id
|
27
|
+
@secure = cfg.secure
|
28
|
+
@long_messages_strategy = cfg.long_messages_strategy
|
29
|
+
@replies_auto_confirm = cfg.replies_auto_confirm
|
30
|
+
}
|
28
31
|
|
29
32
|
@response_code = -1
|
30
33
|
@response_message = nil
|
31
34
|
@message_list = []
|
32
|
-
@http_proxy = nil
|
33
|
-
@http_proxy_port = 80
|
34
|
-
@http_proxy_auth = nil
|
35
|
-
@https_proxy = nil
|
36
|
-
@https_proxy_port = 443
|
37
|
-
@https_proxy_auth = nil
|
38
|
-
@text_buffer = nil
|
39
35
|
@server_list = ["smsmaster.m4u.com.au", "smsmaster1.m4u.com.au", "smsmaster2.m4u.com.au"]
|
40
36
|
end
|
41
37
|
|
42
|
-
|
43
|
-
# Set the HTTP proxy server, if one is being used.
|
44
|
-
# Also specify an optional proxy username and password.
|
45
|
-
# only for php version
|
46
|
-
def set_http_proxy proxy, port = 80, username = nil, password = nil
|
47
|
-
@http_proxy, @http_proxy_port = proxy, port
|
48
|
-
@http_proxy_username, @http_proxy_password = username, password
|
49
|
-
@http_proxy_auth = Base64.encode64("#{username}:#{password}").chop unless username.nil? || password.nil?
|
50
|
-
raise 'proxy is not supported'
|
51
|
-
end
|
52
|
-
|
53
|
-
# Set the HTTPS proxy server, if one is being used.
|
54
|
-
# Also specify an optional proxy username and password.
|
55
|
-
# only for php version
|
56
|
-
def set_https_proxy proxy, port = 443, username = nil, password = nil
|
57
|
-
@https_proxy, @https_proxy_port = proxy, port
|
58
|
-
@https_proxy_auth = Base64.encode64("#{username}:#{password}").chop unless username.nil? || password.nil?
|
59
|
-
raise 'proxy is not supported'
|
60
|
-
end
|
61
|
-
|
62
38
|
# Add a message to be sent.
|
63
39
|
def add_message args
|
64
40
|
p 'in add_message '
|
65
|
-
|
41
|
+
phone_number = self.class.strip_invalid(args[:phone_number]) #not good idea, modifying original args, from outer scope (antlypls)
|
42
|
+
message = args[:message]
|
66
43
|
|
67
|
-
raise ArgumentError.new("phone_number is empty") if
|
68
|
-
raise ArgumentError.new("message is empty") if
|
44
|
+
raise ArgumentError.new("phone_number is empty") if phone_number.nil? || phone_number.empty?
|
45
|
+
raise ArgumentError.new("message is empty") if message.nil? || message.empty?
|
69
46
|
|
70
|
-
messages = process_long_message(
|
71
|
-
@message_list.concat(messages.map{|
|
47
|
+
messages = process_long_message(message)
|
48
|
+
@message_list.concat(messages.map{|msg| SmsMessage.new(args.merge({:message => msg, :phone_number => phone_number}))})
|
72
49
|
end
|
73
50
|
|
74
51
|
# Clear all the messages from the list.
|
@@ -76,8 +53,8 @@ module Rumeme
|
|
76
53
|
@message_list.clear
|
77
54
|
end
|
78
55
|
|
79
|
-
def open_server_connection server
|
80
|
-
port, use_ssl = secure ? [443, true] : [80, false]
|
56
|
+
def open_server_connection server
|
57
|
+
port, use_ssl = @secure ? [443, true] : [80, false]
|
81
58
|
|
82
59
|
http_connection = Net::HTTP.new(server, port)
|
83
60
|
http_connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
@@ -92,14 +69,14 @@ module Rumeme
|
|
92
69
|
end
|
93
70
|
|
94
71
|
# Return the list of replies we have received.
|
95
|
-
def check_replies
|
72
|
+
def check_replies
|
96
73
|
p 'in check_replies'
|
97
74
|
|
98
75
|
response_message, response_code = post_data_to_server("CHECKREPLY2.0\r\n.\r\n")
|
99
76
|
return if response_code != 150
|
100
77
|
|
101
|
-
messages = response_message.split("\r\n")[1..-2].map{|message_line| SmsReply.parse(message_line
|
102
|
-
confirm_replies_received if
|
78
|
+
messages = response_message.split("\r\n")[1..-2].map{|message_line| SmsReply.parse(message_line)} # check @use_message_id
|
79
|
+
confirm_replies_received if @replies_auto_confirm && messages.size > 0
|
103
80
|
|
104
81
|
return messages
|
105
82
|
end
|
@@ -131,16 +108,11 @@ module Rumeme
|
|
131
108
|
# Sends all the messages that have been added with the
|
132
109
|
# add_message command.
|
133
110
|
def send_messages
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
s = "#{sm.message_id} #{sm.phone_number} #{sm.delay} #{sm.validity_period} "
|
138
|
-
s << (sm.delivery_report ? "1 " : "0 ")
|
139
|
-
s << "#{sm.message}\r\n"
|
140
|
-
text_buffer << s
|
141
|
-
}
|
142
|
-
text_buffer << ".\r\n"
|
111
|
+
post_string = @message_list.map{ |message|
|
112
|
+
"#{message.message_id} #{message.phone_number} #{message.delay} #{message.validity_period} #{message.delivery_report ? 1 : 0} #{message.message}\r\n"
|
113
|
+
}.join
|
143
114
|
|
115
|
+
text_buffer = "MESSAGES2.0\r\n#{post_string}.\r\n"
|
144
116
|
response_message, response_code = post_data_to_server(text_buffer)
|
145
117
|
|
146
118
|
return response_code == 100 ? true : false
|
@@ -148,24 +120,11 @@ module Rumeme
|
|
148
120
|
|
149
121
|
private
|
150
122
|
|
151
|
-
def
|
152
|
-
return [message] if message.length
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
when :cut
|
157
|
-
[message[0..160]]
|
158
|
-
when :split
|
159
|
-
SmsInterface.split_message message
|
160
|
-
else
|
161
|
-
raise 'unknown long_messages_strategy'
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
def self.split_message message
|
166
|
-
messages = split_message_internal message
|
167
|
-
i = 1
|
168
|
-
["#{messages[0]}...(1/#{messages.size})"].concat(messages[1..-1].map {|m| "(#{i+=1}/#{messages.size})#{m}"})
|
123
|
+
def self.head_tail_split message, max_len
|
124
|
+
return [message, nil] if message.length < max_len
|
125
|
+
pattern = /\s\.,!;:-\)/
|
126
|
+
index = message[0..max_len].rindex(pattern) || max_len
|
127
|
+
[message[0..index], message[index+1 .. -1]]
|
169
128
|
end
|
170
129
|
|
171
130
|
def self.split_message_internal message
|
@@ -182,23 +141,36 @@ module Rumeme
|
|
182
141
|
list
|
183
142
|
end
|
184
143
|
|
185
|
-
def self.
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
144
|
+
def self.split_message message
|
145
|
+
messages = split_message_internal message
|
146
|
+
message_index = 1
|
147
|
+
["#{messages[0]}...(1/#{messages.size})"].concat(messages[1..-1].map {|msg| "(#{message_index+=1}/#{messages.size})#{msg}"})
|
148
|
+
end
|
149
|
+
|
150
|
+
def process_long_message message
|
151
|
+
return [message] if message.length <= 160
|
152
|
+
case @long_messages_strategy
|
153
|
+
when :send
|
154
|
+
[message]
|
155
|
+
when :cut
|
156
|
+
[message[0..160]]
|
157
|
+
when :split
|
158
|
+
split_message message
|
159
|
+
else
|
160
|
+
raise 'unknown long_messages_strategy'
|
161
|
+
end
|
190
162
|
end
|
191
163
|
|
192
164
|
# Strip invalid characters from the phone number.
|
193
|
-
def strip_invalid phone
|
194
|
-
return if phone.nil?
|
165
|
+
def self.strip_invalid phone
|
166
|
+
return nil if phone.nil?
|
195
167
|
"+#{phone.gsub(/[^0-9]/, '')}"
|
196
168
|
end
|
197
169
|
|
198
170
|
def post_data_to_server data
|
199
171
|
p 'post_data_to_server'
|
200
172
|
|
201
|
-
http_connection = open_server_connection(@server_list[0]
|
173
|
+
http_connection = open_server_connection(@server_list[0])
|
202
174
|
|
203
175
|
text_buffer = "m4u\r\nUSER=#{@username}"
|
204
176
|
if @use_message_id
|
data/lib/rumeme/sms_message.rb
CHANGED
@@ -8,7 +8,7 @@ module Rumeme
|
|
8
8
|
# this defaults must be moved to global configuration
|
9
9
|
defaults = {:phone_number => nil, :message => nil, :message_id => 0, :delay => 0, :validity_period => ValidityPeriod::THREE_DAYS, :delivery_report => false}
|
10
10
|
params = defaults.merge args
|
11
|
-
defaults.keys.each {|
|
11
|
+
defaults.keys.each {|key| instance_variable_set("@#{key.to_s}".to_sym, params[key])}
|
12
12
|
|
13
13
|
raise ArgumentError.new("phone_number is empty") if @phone_number.nil? || @phone_number.empty?
|
14
14
|
raise ArgumentError.new("message is empty") if @message.nil? || @message.empty?
|
data/lib/rumeme/sms_reply.rb
CHANGED
@@ -14,60 +14,28 @@ module Rumeme
|
|
14
14
|
line.nil? ? nil : line.gsub('\n', "\n").gsub('\r', "\r").gsub('\\\\', "\\")
|
15
15
|
end
|
16
16
|
|
17
|
-
#Parse a reply from a string.
|
18
|
-
# Format is: messageID phone when message
|
19
|
-
# Or if no message ID: phone when message
|
20
|
-
# Or if delivery receipt: messageID messageStatus when
|
21
|
-
#
|
22
|
-
def self.parse line
|
23
|
-
p "parsing line: #{line}
|
24
|
-
|
25
|
-
status =
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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 self.parse line
|
23
|
+
p "parsing line: #{line}"
|
24
|
+
|
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
35
|
else
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
prev_idx = idx + 1
|
40
|
-
if (idx = line.index(' ', idx + 1)) == nil
|
41
|
-
return nil
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
phone = line[prev_idx .. idx - 1]
|
46
|
-
|
47
|
-
if phone.length == 1
|
48
|
-
status = case phone # why not use to_i ??
|
49
|
-
when "1"
|
50
|
-
MessageStatus::PENDING
|
51
|
-
when "2"
|
52
|
-
MessageStatus::DELIVERED
|
53
|
-
when "3"
|
54
|
-
MessageStatus::FAILED
|
55
|
-
else
|
56
|
-
nil
|
57
|
-
end
|
58
|
-
phone = ""
|
59
|
-
end
|
60
|
-
|
61
|
-
prev_idx = idx + 1;
|
62
|
-
idx = line.index(' ', idx + 1) || line.length
|
63
|
-
|
64
|
-
if line[prev_idx .. idx-1] =~ /\d+/
|
65
|
-
when_ = $&.to_i
|
66
|
-
else
|
67
|
-
return nil
|
36
|
+
raise ArgumentError.new("can't parse line: #{line}")
|
68
37
|
end
|
69
38
|
|
70
|
-
message = (status != MessageStatus::NONE) || (line.length < idx + 2) ? "" : unescape(line[idx + 1 .. -1])
|
71
39
|
return SmsReply.new(phone, message, message_id, when_, status)
|
72
40
|
end
|
73
41
|
|
data/lib/rumeme/version.rb
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 4
|
9
|
+
version: 0.1.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- antlypls
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-03-
|
17
|
+
date: 2010-03-12 00:00:00 +04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|