stupid_sms 0.1.0

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.
@@ -0,0 +1,90 @@
1
+ require 'stupid_sms/version'
2
+ require 'stupid_sms/sms_client'
3
+
4
+ require 'global_phone'
5
+ require 'honey_format'
6
+
7
+ module StupidSMS
8
+ GlobalPhone.db_path = 'global_phone.json'
9
+
10
+ MAX_SMS_LENGTH = 160.0
11
+
12
+ def self.send_bulk_message(csv_string:, delimiter: ',', template:, dry_run: false)
13
+ csv = HoneyFormat::CSV.new(csv_string, delimiter: delimiter)
14
+
15
+ longest_body = 0
16
+ successfully_sent_count = 0
17
+ csv.each_row do |person|
18
+ phone = normalize_phone(person.phone)
19
+ if invalid_phone?(phone)
20
+ puts "[StupidSMS ERROR] Couldn't send SMS to phone number: #{person.phone}"
21
+ next
22
+ end
23
+
24
+ body = template % person.to_h
25
+ longest_body = body.length if body.length > longest_body
26
+
27
+ send_status = if dry_run
28
+ true
29
+ else
30
+ send_message(recipient: phone, body: body)
31
+ end
32
+
33
+ if send_status
34
+ sms_count = (body.length / MAX_SMS_LENGTH).floor + 1 # Number of SMS sent
35
+ successfully_sent_count += sms_count
36
+ end
37
+ end
38
+
39
+ puts '============================'
40
+ puts "Dry run: #{dry_run}"
41
+ puts "Longest sms: #{longest_body}"
42
+ puts "Recipients: #{csv.rows.length}"
43
+ puts "Sent messages: #{successfully_sent_count}"
44
+ end
45
+
46
+ def self.send_message(recipient:, body:)
47
+ client.send_message(from: from_number, to: recipient, body: body)
48
+ true
49
+ rescue Twilio::REST::RequestError => e # the user has unsubscribed
50
+ puts "[StupidSMS ERROR] Twilio::REST::RequestError to: #{recipient} body: #{body}"
51
+ puts e
52
+ false
53
+ end
54
+
55
+ def self.invalid_phone?(phone)
56
+ GlobalPhone.validate(phone, :se) ? false : true
57
+ end
58
+
59
+ def self.normalize_phone(phone)
60
+ GlobalPhone.normalize(phone, :se)
61
+ end
62
+
63
+ def self.client
64
+ @client ||= SMSClient.new(account_sid: account_sid, auth_token: auth_token)
65
+ end
66
+
67
+ def self.from_number=(from_number)
68
+ @from_number = from_number
69
+ end
70
+
71
+ def self.auth_token=(auth_token)
72
+ @auth_token = auth_token
73
+ end
74
+
75
+ def self.account_sid=(account_sid)
76
+ @account_sid = account_sid
77
+ end
78
+
79
+ def self.from_number
80
+ @from_number || ENV.fetch('TWILIO_NUMBER')
81
+ end
82
+
83
+ def self.auth_token
84
+ @auth_token || ENV.fetch('TWILIO_AUTH_TOKEN')
85
+ end
86
+
87
+ def self.account_sid
88
+ @account_sid || ENV.fetch('TWILIO_ACCOUNT_SID')
89
+ end
90
+ end
@@ -0,0 +1,15 @@
1
+ require 'twilio-ruby'
2
+
3
+ module StupidSMS
4
+ class SMSClient
5
+ def initialize(account_sid:, auth_token:)
6
+ @client = Twilio::REST::Client.new(account_sid, auth_token)
7
+ end
8
+
9
+ def send_message(from:, to:, body:)
10
+ puts "[StupidSMS] FROM: #{from}, TO: #{to}, BODY: #{body}"
11
+
12
+ @client.messages.create(from: from, to: to, body: body)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ module StupidSMS
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'stupid_sms/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'stupid_sms'
8
+ spec.version = StupidSMS::VERSION
9
+ spec.authors = ['Jacob Burenstam']
10
+ spec.email = ['burenstam@gmail.com']
11
+
12
+ spec.summary = %q{Send SMS with ease.}
13
+ spec.description = %q{Send SMS with ease, either one by one or in bulk.}
14
+ spec.homepage = 'https://github.com/young-skilled/stupid_sms'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_dependency 'twilio-ruby', '~> 4.11'
23
+ spec.add_dependency 'honey_format', '~> 0.2'
24
+ spec.add_dependency 'global_phone', '~> 1.0'
25
+
26
+ spec.add_development_dependency 'bundler', '~> 1.11'
27
+ spec.add_development_dependency 'rake', '~> 10.0'
28
+ spec.add_development_dependency 'byebug'
29
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stupid_sms
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jacob Burenstam
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-10-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: twilio-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.11'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: honey_format
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: global_phone
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.11'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.11'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Send SMS with ease, either one by one or in bulk.
98
+ email:
99
+ - burenstam@gmail.com
100
+ executables:
101
+ - stupid_sms
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - Gemfile
107
+ - LICENSE.txt
108
+ - README.md
109
+ - Rakefile
110
+ - bin/console
111
+ - bin/setup
112
+ - exe/stupid_sms
113
+ - global_phone.json
114
+ - lib/stupid_sms.rb
115
+ - lib/stupid_sms/sms_client.rb
116
+ - lib/stupid_sms/version.rb
117
+ - stupid_sms.gemspec
118
+ homepage: https://github.com/young-skilled/stupid_sms
119
+ licenses:
120
+ - MIT
121
+ metadata: {}
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ requirements: []
137
+ rubyforge_project:
138
+ rubygems_version: 2.5.1
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: Send SMS with ease.
142
+ test_files: []