exetel 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/exetel.gemspec +1 -1
- data/lib/exetel/api.rb +150 -0
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/exetel.gemspec
CHANGED
data/lib/exetel/api.rb
CHANGED
@@ -47,3 +47,153 @@ module Exetel
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
+
|
51
|
+
|
52
|
+
module Clickatell
|
53
|
+
# This module provides the core implementation of the Clickatell
|
54
|
+
# HTTP service.
|
55
|
+
class API
|
56
|
+
attr_accessor :auth_options
|
57
|
+
|
58
|
+
class << self
|
59
|
+
# Authenticates using the given credentials and returns an
|
60
|
+
# API instance with the authentication options set to use the
|
61
|
+
# resulting session_id.
|
62
|
+
def authenticate(api_id, username, password)
|
63
|
+
api = self.new
|
64
|
+
session_id = api.authenticate(api_id, username, password)
|
65
|
+
api.auth_options = { :session_id => session_id }
|
66
|
+
api
|
67
|
+
end
|
68
|
+
|
69
|
+
# Set to true to enable debugging (off by default)
|
70
|
+
attr_accessor :debug_mode
|
71
|
+
|
72
|
+
# Enable secure mode (SSL)
|
73
|
+
attr_accessor :secure_mode
|
74
|
+
|
75
|
+
# Allow customizing URL
|
76
|
+
attr_accessor :api_service_host
|
77
|
+
|
78
|
+
# Set to true to test message sending; this will not actually send
|
79
|
+
# messages but will collect sent messages in a testable collection.
|
80
|
+
# (off by default)
|
81
|
+
attr_accessor :test_mode
|
82
|
+
end
|
83
|
+
self.debug_mode = false
|
84
|
+
self.secure_mode = false
|
85
|
+
self.test_mode = false
|
86
|
+
|
87
|
+
# Creates a new API instance using the specified +auth options+.
|
88
|
+
# +auth_options+ is a hash containing either a :session_id or
|
89
|
+
# :username, :password and :api_key.
|
90
|
+
#
|
91
|
+
# Some API calls (authenticate, ping etc.) do not require any
|
92
|
+
# +auth_options+. +auth_options+ can be updated using the accessor methods.
|
93
|
+
def initialize(auth_options={})
|
94
|
+
@auth_options = auth_options
|
95
|
+
end
|
96
|
+
|
97
|
+
# Authenticates using the specified credentials. Returns
|
98
|
+
# a session_id if successful which can be used in subsequent
|
99
|
+
# API calls.
|
100
|
+
def authenticate(api_id, username, password)
|
101
|
+
response = execute_command('auth', 'http',
|
102
|
+
:api_id => api_id,
|
103
|
+
:user => username,
|
104
|
+
:password => password
|
105
|
+
)
|
106
|
+
parse_response(response)['OK']
|
107
|
+
end
|
108
|
+
|
109
|
+
# Pings the service with the specified session_id to keep the
|
110
|
+
# session alive.
|
111
|
+
def ping(session_id)
|
112
|
+
execute_command('ping', 'http', :session_id => session_id)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Sends a message +message_text+ to +recipient+. Recipient
|
116
|
+
# number should have an international dialing prefix and
|
117
|
+
# no leading zeros (unless you have set a default prefix
|
118
|
+
# in your clickatell account centre).
|
119
|
+
#
|
120
|
+
# Additional options:
|
121
|
+
# :from - the from number/name
|
122
|
+
# :set_mobile_originated - mobile originated flag
|
123
|
+
# :client_message_id - user specified message id that can be used in place of Clickatell issued API message ID for querying message
|
124
|
+
# Returns a new message ID if successful.
|
125
|
+
def send_message(recipient, message_text, opts={})
|
126
|
+
valid_options = opts.only(:from, :mo, :callback, :climsgid)
|
127
|
+
valid_options.merge!(:req_feat => '48') if valid_options[:from]
|
128
|
+
valid_options.merge!(:mo => '1') if opts[:set_mobile_originated]
|
129
|
+
valid_options.merge!(:climsgid => opts[:client_message_id]) if opts[:client_message_id]
|
130
|
+
recipient = recipient.join(",")if recipient.is_a?(Array)
|
131
|
+
response = execute_command('sendmsg', 'http',
|
132
|
+
{:to => recipient, :text => message_text}.merge(valid_options)
|
133
|
+
)
|
134
|
+
response = parse_response(response)
|
135
|
+
response.is_a?(Array) ? response.map { |r| r['ID'] } : response['ID']
|
136
|
+
end
|
137
|
+
|
138
|
+
def send_wap_push(recipient, media_url, notification_text='', opts={})
|
139
|
+
valid_options = opts.only(:from)
|
140
|
+
valid_options.merge!(:req_feat => '48') if valid_options[:from]
|
141
|
+
response = execute_command('si_push', 'mms',
|
142
|
+
{:to => recipient, :si_url => media_url, :si_text => notification_text, :si_id => 'foo'}.merge(valid_options)
|
143
|
+
)
|
144
|
+
parse_response(response)['ID']
|
145
|
+
end
|
146
|
+
|
147
|
+
# Returns the status of a message. Use message ID returned
|
148
|
+
# from original send_message call.
|
149
|
+
def message_status(message_id)
|
150
|
+
response = execute_command('querymsg', 'http', :apimsgid => message_id)
|
151
|
+
parse_response(response)['Status']
|
152
|
+
end
|
153
|
+
|
154
|
+
# Returns the number of credits remaining as a float.
|
155
|
+
def account_balance
|
156
|
+
response = execute_command('getbalance', 'http')
|
157
|
+
parse_response(response)['Credit'].to_f
|
158
|
+
end
|
159
|
+
|
160
|
+
def sms_requests
|
161
|
+
@sms_requests ||= []
|
162
|
+
end
|
163
|
+
|
164
|
+
protected
|
165
|
+
def execute_command(command_name, service, parameters={}) #:nodoc:
|
166
|
+
executor = CommandExecutor.new(auth_hash, self.class.secure_mode, self.class.debug_mode, self.class.test_mode)
|
167
|
+
result = executor.execute(command_name, service, parameters)
|
168
|
+
|
169
|
+
(sms_requests << executor.sms_requests).flatten! if self.class.test_mode
|
170
|
+
|
171
|
+
result
|
172
|
+
end
|
173
|
+
|
174
|
+
def parse_response(raw_response) #:nodoc:
|
175
|
+
Clickatell::Response.parse(raw_response)
|
176
|
+
end
|
177
|
+
|
178
|
+
def auth_hash #:nodoc:
|
179
|
+
if @auth_options[:session_id]
|
180
|
+
{ :session_id => @auth_options[:session_id] }
|
181
|
+
elsif @auth_options[:api_id]
|
182
|
+
{ :user => @auth_options[:username],
|
183
|
+
:password => @auth_options[:password],
|
184
|
+
:api_id => @auth_options[:api_key] }
|
185
|
+
else
|
186
|
+
{}
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
%w( api/command
|
194
|
+
api/command_executor
|
195
|
+
api/error
|
196
|
+
api/message_status
|
197
|
+
).each do |lib|
|
198
|
+
require File.join(File.dirname(__FILE__), lib)
|
199
|
+
end
|