1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
module SMSFu
class Client
DELIVERY_METHODS = [:action_mailer, :pony]
attr_accessor :delivery, :pony_config
# Sets up a new SMSFu::Client. Allows for use of ActionMailer or
# Pony for e-mail delivery. Pony requires :pony_config to be
# defined to work properly.
#
# * ActionMailer 3
# sms_fu = SMSFu::Client.configure(:delivery => :action_mailer)
#
# * Pony 1.0
# sms_fu = SMSFu::Client.configure(:delivery => :pony,
# :pony_config => { :via => :sendmail })
#
def self.configure(opts = {})
new(opts)
end
def initialize(opts = {})
self.delivery = opts[:delivery].to_sym
self.pony_config = opts[:pony_config]
raise SMSFuException.new("Pony configuration required") if @delivery == :pony && @pony_config.nil?
end
def delivery=(new_delivery)
if DELIVERY_METHODS.include?(new_delivery.to_sym)
@delivery = new_delivery
else
raise SMSFuException.new("Delivery options can only be: '#{DELIVERY_METHODS.join(", ")}'")
end
end
# Delivers the SMS message in the form of an e-mail
# sms_fu.deliver("1234567890","at&t","hello world")
def deliver(number, carrier, message, options = {})
raise SMSFuException.new("Can't deliver blank message to #{format_number(number)}") if message.nil? || message.empty?
limit = options[:limit] || message.length
from = options[:from] || SMSFu.from_address
message = message[0..limit-1]
email = SMSFu.sms_address(number,carrier)
if @delivery == :pony
Pony.mail({:to => email, :body => message, :from => from}.merge!(@pony_config))
else
SMSNotifier.send_sms(email, message, from).deliver
end
end
end
class << self
def config_yaml
@@config_yaml ||= YAML::load(File.open("#{template_directory}/sms_fu.yml"))
end
# Returns back a list of all carriers
# SMSFu.carriers
def carriers
config_yaml['carriers']
end
def from_address
config_yaml['config']['from_address']
end
def carrier_name(key)
carrier(key)['name']
end
def carrier_email(key)
carrier(key.downcase)['value']
end
def carrier(key)
raise SMSFuException.new("Carrier (#{key}) is not supported") unless SMSFu.carriers.has_key?(key.downcase)
carriers[key]
end
# Returns back a properly formatted SMS e-mail address
# SMSFu.sms_address("1234567890","at&t")
def sms_address(number,carrier)
raise SMSFuException.new("Missing number or carrier") if number.nil? || carrier.nil?
format_number(number) + carrier_email(carrier.downcase)
end
protected
def format_number(number)
stripped = number.gsub("-","").strip
formatted = (stripped.length == 11 && stripped[0,1] == "1") ? stripped[1..stripped.length] : stripped
raise SMSFuException.new("Number (#{number}) is not formatted correctly") unless valid_number?(formatted)
formatted
end
def valid_number?(number)
number.length >= 10 && number[/^.\d+$/]
end
def template_directory
directory = defined?(Rails) ? "#{Rails.root}/config" : "#{File.dirname(__FILE__)}/../../templates"
if (defined?(Rails) && Rails.env == 'test')
"#{File.dirname(__FILE__)}/../../templates"
else
directory
end
end
end
end
class SMSFuException < StandardError; end
|