Permalink
Browse files

Исправление в работе с sms-гейтом.

  • Loading branch information...
1 parent 4be0f04 commit 1a63b63f78214490fd14d342338e6a98724e97b4 @Tyralion Tyralion committed Mar 18, 2013
Showing with 77 additions and 27 deletions.
  1. +1 −0 .gitignore
  2. +76 −26 lib/sms.rb
  3. +0 −1 lib/watcher.rb
View
@@ -1,3 +1,4 @@
+.DS_Store
.bundle
*.lock
*.log
View
@@ -1,34 +1,54 @@
# encoding: utf-8
+require "net/http"
# SMS.login('you@email.address', 'password')
-# SMS.message('78887779999', 'Привет')
+# SMS.message('79630897252', 'Привет')
module SMS
HOST = 'api.sms24x7.ru'
PHONE_RE = /\A(\+7|7|8)(\d{10})\Z/
- class TimeoutError < ::StandardError; end
- class SessionExpired < ::StandardError; end
- class BaseError < ::StandardError; end
- class InterfaceError < ::StandardError; end
- class AuthError < ::StandardError; end
- class NoLoginError < ::StandardError; end
- class BalanceError < ::StandardError; end
- class SpamError < ::StandardError; end
- class EncodingError < ::StandardError; end
- class NoGateError < ::StandardError; end
- class OtherError < ::StandardError; end
+ class Error < ::StandardError; end
+
+ class AuthError < ::SMS::Error; end
+ class TimeoutError < ::SMS::Error; end
+
+ class AccountBlockedError < ::SMS::Error; end
+ class UndefinedError < ::SMS::Error; end
+ class ApiVersionError < ::SMS::Error; end
+ class ArgumentsError < ::SMS::Error; end
+ class UnauthorizedPartnerError < ::SMS::Error; end
+ class SaveError < ::SMS::Error; end
+ class ActionRejectedError < ::SMS::Error; end
+ class PasswordError < ::SMS::Error; end
+ class SessionExpiredError < ::SMS::Error; end
+ class AccountNotFoundError < ::SMS::Error; end
+ class SenderNameError < ::SMS::Error; end
+ class DeliveryError < ::SMS::Error; end
+
+ class DomainBusyError < ::SMS::Error; end
+ class TarifNotFoundError < ::SMS::Error; end
+ class MessagesNotDeliveryError < ::SMS::Error; end
+
+ class BaseError < ::SMS::Error; end
+ class InterfaceError < ::SMS::Error; end
+ class NoLoginError < ::SMS::Error; end
+ class BalanceError < ::SMS::Error; end
+ class SpamError < ::SMS::Error; end
+ class EncodingError < ::SMS::Error; end
+ class NoGateError < ::SMS::Error; end
+ class OtherError < ::SMS::Error; end
class << self
def valid_phone?(phone)
- !(phone.to_s.gsub(/\D/, "") =~ ::SMS::PHONE_RE).nil?
+ !((phone || "").to_s.gsub(/\D/, "") =~ ::SMS::PHONE_RE).nil?
end # valid_phone?
def convert_phone(phone, prefix = "7")
- r = phone.to_s.gsub(/\D/, "").scan(::SMS::PHONE_RE)
+ r = (phone || "").to_s.gsub(/\D/, "").scan(::SMS::PHONE_RE)
r.empty? ? nil : "#{prefix}#{r.last.last}"
end # convert_phone
@@ -55,7 +75,7 @@ def message(phone, text, params = {})
begin
data = request(request)[:data]
- rescue ::SMS::TimeoutError, ::SMS::SessionExpired
+ rescue ::SMS::TimeoutError, ::SMS::SessionExpiredError
logout
auth
retry
@@ -91,7 +111,8 @@ def auth
:password => @password
})
- raise ::SMS::InterfaceError, "Login request OK, but no 'sid' set" unless (sid = responce[:data]["sid"])
+ sid = responce[:data]["sid"]
+ raise ::SMS::InterfaceError, "Login request OK, but no 'sid' set" if sid.nil?
@cookie = "sid=#{::CGI::escape(sid)}"
end # auth
@@ -111,24 +132,53 @@ def request(request = {})
header = {}
header["Cookie"] = @cookie if @cookie
- res = http.post('/', ::URI.encode_www_form(request), header)
- json = ::JSON.parse(res.body)
+ res = http.post('/', ::URI.encode_www_form(request), header)
+
+ if res.code.to_i != 200
+ raise ::SMS::InterfaceError, "#{res.message} (#{res.code})"
+ end
+
+ json = ::JSON.parse(res.body) rescue {}
unless (response = json['response']) && (msg = response['msg']) && (error_code = msg['err_code'])
raise ::SMS::InterfaceError, 'Empty some necessary data fields'
end
if (error_code = error_code.to_i) > 0
- case error_code.to_i
- when 2 then raise ::SMS::AuthError, 'AuthError'
- when 3 then raise ::SMS::TimeoutError, 'TimeoutError'
- when 18 then raise ::SMS::SessionExpired, 'SessionExpired'
- when 29 then raise ::SMS::NoGateError, 'NoGateError'
- when 35 then raise ::SMS::EncodingError, 'EncodingError'
- when 36 then raise ::SMS::BalanceError, 'No money'
+ case error_code
+
+ when 2 then raise ::SMS::AuthError, 'AuthError. Неверный логин или пароль.'
+ when 3 then raise ::SMS::TimeoutError, 'TimeoutError. Вы были неактивный более 24 минут. В целях безопасности авторизуйтесь заново.'
+
+ when 4 then raise ::SMS::AccountBlockedError, 'AccountBlockedError. Ваш аккаутн заблокирован, обратитесь к администратору.'
+ when 5 then raise ::SMS::UndefinedError, 'UndefinedError. Неизвестный метод.'
+ when 6 then raise ::SMS::ApiVersionError, 'ApiVersionError. Указанной версии API не существует.'
+ when 7 then raise ::SMS::ArgumentsError, 'ArgumentsError. Заданы не все необходимые параметры.'
+ when 10 then raise ::SMS::UnauthorizedPartnerError, 'UnauthorizedPartnerError. Данный партнер не авторизован.'
+ when 11 then raise ::SMS::SaveError, 'SaveError. При сохранении произошла ошибка.'
+ when 15 then raise ::SMS::ActionRejectedError, 'ActionRejectedError. Действие запрещено.'
+ when 16 then raise ::SMS::PasswordError, 'PasswordError. Пароль указан неверно.'
+ when 18 then raise ::SMS::SessionExpiredError, 'SessionExpiredError. Сессия устарела.'
+ when 19 then raise ::SMS::Error, 'Error. Произошла ошибка.'
+
+ when 22 then raise ::SMS::AccountNotFoundError, 'AccountNotFoundError. Учетной записи не существует.'
+
+ when 29 then raise ::SMS::NoGateError, 'NoGateError. Сотовый оператор не подключен.'
+ when 35 then raise ::SMS::EncodingError, 'EncodingError. Кодировка текста сообщения не соотвествует заявленной.'
+ when 36 then raise ::SMS::BalanceError, 'BalanceError. Недостаточно средств, пополните баланс.'
when 37, 38, 59 then raise ::SMS::SpamError, 'Spam'
- when 42 then raise ::SMS::NoLoginError, 'NoLoginError'
+
+ when 39 then raise ::SMS::SenderNameError, 'SenderNameError. Недопустимое имя отправителя.'
+ when 40 then raise ::SMS::DeliveryError, 'DeliveryError. Невозможно доставить.'
+ when 42 then raise ::SMS::NoLoginError, 'NoLoginError. Авторизуйтесь, чтобы продолжить.'
+
+ when 43 then raise ::SMS::DomainBusyError, 'DomainBusyError. Домен занят.'
+ when 45 then raise ::SMS::BaseError, 'BaseError. Не найдены базоввые настройки кабинета.'
+ when 44, 47 then raise ::SMS::TarifNotFoundError, 'TarifNotFoundError. Не найден преднастроенный тариф, доступный при регистрации.'
+
+ when 58 then raise ::SMS::MessagesNotDeliveryError, 'MessagesNotDeliveryError. Ни одного сообщения отправлено не было.'
+
else raise ::SMS::OtherError, "Communication to API failed. Error code: #{error_code}"
end
View
@@ -1,5 +1,4 @@
# encoding: utf-8
-require "net/http"
require "json"
require "cgi"
require "uri"

0 comments on commit 1a63b63

Please sign in to comment.