class Smstraffic::SMS

Attributes

errors[R]
id[R]
message[RW]
phone[RW]
status[R]
subject[RW]

Public Class Methods

new(phone, subject, message, translit=nil) click to toggle source
# File lib/smstraffic/sms.rb, line 12
def initialize(phone, subject, message, translit=nil)
  @phone = phone.to_s.length == 10 ? "7#{phone}".to_i : phone
  @subject = subject
  @message = message
  @status = 'not-sent'
  @translit = translit.nil? ? @@translit : translit
  @errors = []

  validate!
end
settings=(settings={}) click to toggle source
# File lib/smstraffic/sms.rb, line 23
def self.settings=(settings={})
  @@login = settings[:login]
  @@password = settings[:password]
  @@server = settings[:server]
  @@routeGroupId = settings[:routeGroupId]
  @@port = 80
  @@ssl_port = 443
  @@ssl = !settings[:ssl].nil? ? settings[:ssl] : true # connect using ssl by default
  @@translit = !settings[:translit].nil? ? settings[:translit] : false # use translit or not
  validate_settings!
end
ssl() click to toggle source
# File lib/smstraffic/sms.rb, line 39
def self.ssl
  @@ssl
end
ssl=(flag) click to toggle source
# File lib/smstraffic/sms.rb, line 35
def self.ssl=(flag)
  @@ssl = flag
end
status(id) click to toggle source

> SMS status codes:

        СТАТУС              ТИП
'Нет статуса (blank)' - Промежуточный
'Acceptd'             - Промежуточный
'Delivered'           - Окончательный
'Non Delivered' -     - Окончательный
'Rejected'            - Окончательный
'Expired'             - Окончательный
'Deleted'             - Окончательный
'Unknown status'      - Окончательный
# File lib/smstraffic/sms.rb, line 121
def self.status(id)
  establish_connection.start do |http|
    request = Net::HTTP::Get.new(status_url id)
    response = http.request(request)
    body = response.body
    hash = Hash.from_xml(Nokogiri::XML(body).to_s)['reply']
    hash['status'] || hash['error'] #status or error
  end
end

Private Class Methods

establish_connection() click to toggle source
# File lib/smstraffic/sms.rb, line 147
def self.establish_connection
  port = @@ssl ? @@ssl_port : @@port
  http = Net::HTTP.new(@@server, port)
  http.use_ssl = @@ssl
  http
end
status_url(msg_id) click to toggle source
# File lib/smstraffic/sms.rb, line 167
def self.status_url(msg_id)
  "/smartdelivery-in/multi.php?login=#{@@login}&password=#{@@password}&operation=status&sms_id=#{msg_id}"
end
validate_settings!() click to toggle source
# File lib/smstraffic/sms.rb, line 154
def self.validate_settings!
  raise ArgumentError, "Login should be defined for #{self}." if @@login.nil?
  raise ArgumentError, "Password should be defined for #{self}." if @@password.nil?
  raise ArgumentError, "Server should be defined for #{self}." if @@server.nil?
end

Public Instance Methods

send() click to toggle source

> SMS send status codes:

401 - Не указан логин
402 - Не указан пароль
403 - Не указаны номера телефонов
404 - Несовместимые параметры запроса
405 - Не указан текст сообщения
406 - wap push сообщение слишком длинное
407 - Не указан ни один телефон
408 - Неподдерживаемый тип сообщения: "тип_сообщения"
409 - Не указан udh
410 - Автоматическая разбивка бинарных сообщений не поддерживается
411 - Неверный логин или пароль
412 - Неверный IP
413 - Такой группы не существует: "имя_группы"
414 - В группе нет ни одного телефона
415 - Недостаточно средств
416 - Неверный формат даты начала рассылки: "дата_старта_рассылки"
417 - Дата начала рассылки "дата_старта_рассылки" находится в прошлом
418 - Идентификаторы не предоставляются для отложенных сообщений
419 - Вам не разрешено использовать данный маршрут
420 - Сообщение "текст_сообщения" слишком длинное
421 - Имя отправителя слишком длинное
422 - Не указан телефон в строке "номер_строки": "строка"
423 - Пустое сообщение для телефона "номер_телефона"
424 - Сообщение "текст_сообщения" для телефона "номер_телефона" слишком длинное
425 - Номер телефона "номер_телефона" слишком короткий. Ни одно сообщение не было отправлено
426 - Номер телефона "номер_телефона" слишком длинный. Ни одно сообщение не было отправлено
427 - "номер_телефона": неверная длина номера телефона. Ни одно сообщение не было отправлено
428 - "номер_телефона": неверный формат номера телефона. Ни одно сообщение не было отправлено
429 - "номер_телефона": неподдерживаемый оператор. Ни одно сообщение не было отправлено
430 - "номер_телефона": неверный номер телефона. Ни одно сообщение не было отправлено
431 - Телефон +"номер_телефона" не подписан на рассылку. Ни одно сообщение не было отправлено
432 - Заблокированный номер телефона: "номер_телефона". Ни одно сообщение не было отправлено
433 - Не указан параметр sms_id
434 - Такого сообщения нет или оно вам не принадлежит
435 - Невозможно отменить сообщение "sms_id"
436 - Отправитель "отправитель" запрещен
437 - Сообщение превышает 160 символов после транслитерации "текст_сообщения"
438 - В сообщении найден шаблон, но не задана ни одна группа
439 - Вы не можете отправлять SMS­сообщения через HTTP
440 - Параметр "phones" не задан или задан некорректно
441 - Неверный формат файла параметров
442 - Неверное число параметров
501 - Время окончания рассылки в прошлом
502 - Время начала рассылки больше времени окончания рассылки
1000 - Временные проблемы на сервере
# File lib/smstraffic/sms.rb, line 90
def send
  #return stubbed_send if (defined?(Rails) && !Rails.env.production?)
  self.class.establish_connection.start do |http|
    request = Net::HTTP::Get.new(send_url)
    response = http.request(request)
    body = response.body
    hash = Hash.from_xml(Nokogiri::XML(body).to_s)['reply']
    result = hash['result']
    if result == 'OK'
      @status = 'sent'
      @id = hash['message_infos']['message_info']['sms_id']
      true
    else
      @errors << "#{result}: code: #{hash['code']}, description: #{hash['description']}"
      false
    end
  end
end
update_status() click to toggle source
# File lib/smstraffic/sms.rb, line 131
def update_status
  return @status if @id.nil?
  code, status = self.class.status(@id)
  return code unless code == 'ok'
  @status = status
end
validate!() click to toggle source
# File lib/smstraffic/sms.rb, line 138
def validate!
  raise ArgumentError, "Phone should be assigned to #{self.class}." if @phone.nil?
  raise ArgumentError, "Phone number should contain only numbers. Minimum length is 11. #{@phone.inspect} is given." unless "#{@phone}" =~ /^[0-9]{11}$/
  raise ArgumentError, "Subject should be assigned to #{self.class}." if @subject.nil?
  raise ArgumentError, "Message should be assigned to #{self.class}." if @message.nil?
end

Private Instance Methods

send_url() click to toggle source
# File lib/smstraffic/sms.rb, line 160
def send_url
  message, rus = @translit ? [Russian.translit(@message), 0] : [@message, 1]
  message = URI.encode(message)
  subject = URI.encode(@subject)
  "/smartdelivery-in/multi.php?login=#{@@login}&password=#{@@password}&phones=#{@phone}&message=#{message}&want_sms_ids=1&routeGroupId=#{@@routeGroupId}&rus=#{rus}&originator=#{subject}"
end