niazpardaz_sms 1.0.2
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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +35 -0
- data/CHANGELOG.md +38 -0
- data/Gemfile +15 -0
- data/LICENSE +21 -0
- data/README.md +518 -0
- data/Rakefile +35 -0
- data/lib/generators/niazpardaz_sms/install/install_generator.rb +26 -0
- data/lib/generators/niazpardaz_sms/install/templates/README +36 -0
- data/lib/generators/niazpardaz_sms/install/templates/niazpardaz_sms.rb +18 -0
- data/lib/niazpardaz_sms/client.rb +331 -0
- data/lib/niazpardaz_sms/errors/niazpardaz_api_error.rb +41 -0
- data/lib/niazpardaz_sms/models/responses.rb +261 -0
- data/lib/niazpardaz_sms/models/result_codes.rb +440 -0
- data/lib/niazpardaz_sms/railtie.rb +34 -0
- data/lib/niazpardaz_sms/version.rb +5 -0
- data/lib/niazpardaz_sms.rb +67 -0
- metadata +96 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: e4793bbddd7bbaceef2d5959e0233c90292f5e11230cb4e94613bf0db9fb1c55
|
|
4
|
+
data.tar.gz: dbe84c58e2dc06902b28c422b4d12599c51d584499cf4b79b0ddd9cbb6ba6a28
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 80a7f4826ab2c93234005507de892437dc88f11161bdc000be3f55c2fa338d112de0e622ff3dca45aa0f85b693c87ef0d4cbba4156da09aaf86d6e26f512bed5
|
|
7
|
+
data.tar.gz: 56e777cbe89886f6d6dfc3ea1aa04da9b5faa653b23e9f65572b9281ae178ef5a83948c89a309cd1ce89488c6613933322bc2833c4c09582a3480ff7d7a1603d
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# .rubocop.yml
|
|
2
|
+
AllCops:
|
|
3
|
+
NewCops: enable
|
|
4
|
+
TargetRubyVersion: 2.6
|
|
5
|
+
SuggestExtensions: false
|
|
6
|
+
Exclude:
|
|
7
|
+
- 'bin/**/*'
|
|
8
|
+
- 'vendor/**/*'
|
|
9
|
+
|
|
10
|
+
Metrics/ClassLength:
|
|
11
|
+
Max: 200
|
|
12
|
+
|
|
13
|
+
Metrics/MethodLength:
|
|
14
|
+
Max: 25
|
|
15
|
+
|
|
16
|
+
Metrics/AbcSize:
|
|
17
|
+
Max: 35
|
|
18
|
+
|
|
19
|
+
Layout/LineLength:
|
|
20
|
+
Max: 250
|
|
21
|
+
|
|
22
|
+
Naming/AccessorMethodName:
|
|
23
|
+
Enabled: false
|
|
24
|
+
|
|
25
|
+
Style/HashSyntax:
|
|
26
|
+
EnforcedStyle: ruby19_no_mixed_keys
|
|
27
|
+
|
|
28
|
+
Style/RaiseArgs:
|
|
29
|
+
Enabled: false
|
|
30
|
+
|
|
31
|
+
Style/IfUnlessModifier:
|
|
32
|
+
Enabled: false
|
|
33
|
+
|
|
34
|
+
Gemspec/OrderedDependencies:
|
|
35
|
+
Enabled: false
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
تمام تغییرات قابل توجه این پروژه در این فایل مستند میشود.
|
|
4
|
+
|
|
5
|
+
فرمت بر اساس [Keep a Changelog](https://keepachangelog.com/fa/1.0.0/) است
|
|
6
|
+
و این پروژه از [Semantic Versioning](https://semver.org/lang/fa/) پیروی میکند.
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [1.0.2] - 2025-02-16
|
|
11
|
+
|
|
12
|
+
### اضافه شده
|
|
13
|
+
- کلاینت اصلی `NiazpardazSms::Client` برای ارتباط با API
|
|
14
|
+
- ارسال پیامک تکی (`send_sms`)
|
|
15
|
+
- ارسال پیامک گروهی (`send_bulk_sms`)
|
|
16
|
+
- ارسال پیامک LikeToLike (`send_sms_like_to_like`)
|
|
17
|
+
- ارسال پیامک صوتی OTP (`send_voice_otp`)
|
|
18
|
+
- گزارش تحویل پیامک گروهی (`get_batch_delivery`)
|
|
19
|
+
- گزارش تحویل پیامک LikeToLike (`get_delivery_like_to_like`)
|
|
20
|
+
- دریافت اعتبار حساب (`get_credit`)
|
|
21
|
+
- دریافت شمارههای فرستنده (`get_sender_numbers`)
|
|
22
|
+
- دریافت تعداد پیامکهای دریافتی (`get_inbox_count`)
|
|
23
|
+
- دریافت پیامکها (`get_messages`)
|
|
24
|
+
- دریافت پیامکها بر اساس بازه زمانی (`get_messages_by_date_range`)
|
|
25
|
+
- استخراج شمارههای لیست سیاه (`extract_telecom_blacklist_numbers`)
|
|
26
|
+
- بررسی شماره در لیست سیاه (`number_is_in_telecom_blacklist`)
|
|
27
|
+
- بررسی محتوای پیامک (`check_sms_content`)
|
|
28
|
+
- پشتیبانی از Rails با Railtie و Generator
|
|
29
|
+
- پشتیبانی از Sinatra
|
|
30
|
+
- پشتیبانی از Hanami
|
|
31
|
+
- پشتیبانی از سایر فریمورکهای Ruby
|
|
32
|
+
- مدلهای کامل برای تمام پاسخهای API
|
|
33
|
+
- کدهای نتیجه با توضیحات فارسی
|
|
34
|
+
- مدیریت خطا با کلاسهای اختصاصی
|
|
35
|
+
- مستندات کامل به زبان فارسی
|
|
36
|
+
|
|
37
|
+
[Unreleased]: https://github.com/NiazpardazSms/niazpardaz-sms-ruby/compare/v1.0.2...HEAD
|
|
38
|
+
[1.0.0]: https://github.com/NiazpardazSms/niazpardaz-sms-ruby/releases/tag/v1.0.2
|
data/Gemfile
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
source 'https://rubygems.org'
|
|
4
|
+
|
|
5
|
+
# Specify your gem's dependencies in niazpardaz_sms.gemspec
|
|
6
|
+
gemspec
|
|
7
|
+
|
|
8
|
+
group :development, :test do
|
|
9
|
+
gem 'bundler', '>= 2.0', '< 5.0'
|
|
10
|
+
gem 'rake', '~> 13.0'
|
|
11
|
+
gem 'rspec', '~> 3.0'
|
|
12
|
+
gem 'rubocop', '~> 1.0'
|
|
13
|
+
gem 'vcr', '~> 6.0'
|
|
14
|
+
gem 'webmock', '~> 3.0'
|
|
15
|
+
end
|
data/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Niazpardaz
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
# NiazpardazSms SDK for Ruby
|
|
2
|
+
|
|
3
|
+
کتابخانه رسمی Ruby برای کار با API پیامکی نیازپرداز
|
|
4
|
+
|
|
5
|
+
[](https://badge.fury.io/rb/niazpardaz_sms)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
|
|
8
|
+
## نصب
|
|
9
|
+
|
|
10
|
+
### Bundler (توصیه شده)
|
|
11
|
+
|
|
12
|
+
به فایل `Gemfile` اضافه کنید:
|
|
13
|
+
|
|
14
|
+
```ruby
|
|
15
|
+
gem 'niazpardaz_sms'
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
سپس اجرا کنید:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
bundle install
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### نصب مستقیم
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
gem install niazpardaz_sms
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## پیکربندی
|
|
31
|
+
|
|
32
|
+
### Ruby خالص
|
|
33
|
+
|
|
34
|
+
```ruby
|
|
35
|
+
require 'niazpardaz_sms'
|
|
36
|
+
|
|
37
|
+
# روش 1: ایجاد مستقیم کلاینت
|
|
38
|
+
client = NiazpardazSms::Client.new('YOUR_API_KEY')
|
|
39
|
+
|
|
40
|
+
# روش 2: پیکربندی سراسری
|
|
41
|
+
NiazpardazSms.configure do |config|
|
|
42
|
+
config.default_api_key = 'YOUR_API_KEY'
|
|
43
|
+
config.default_timeout = 30
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
client = NiazpardazSms.client
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Rails
|
|
50
|
+
|
|
51
|
+
1. اجرای generator:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
rails generate niazpardaz_sms:install
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
2. ویرایش فایل `config/initializers/niazpardaz_sms.rb`:
|
|
58
|
+
|
|
59
|
+
```ruby
|
|
60
|
+
NiazpardazSms.configure do |config|
|
|
61
|
+
config.default_api_key = ENV.fetch('NIAZPARDAZ_API_KEY', nil)
|
|
62
|
+
end
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
3. یا استفاده از Rails credentials:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
rails credentials:edit
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
niazpardaz_sms:
|
|
73
|
+
api_key: YOUR_API_KEY
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Sinatra
|
|
77
|
+
|
|
78
|
+
```ruby
|
|
79
|
+
require 'sinatra'
|
|
80
|
+
require 'niazpardaz_sms'
|
|
81
|
+
|
|
82
|
+
configure do
|
|
83
|
+
NiazpardazSms.configure do |config|
|
|
84
|
+
config.default_api_key = ENV['NIAZPARDAZ_API_KEY']
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
post '/send_sms' do
|
|
89
|
+
client = NiazpardazSms.client
|
|
90
|
+
result = client.send_sms(
|
|
91
|
+
from_number: params[:from],
|
|
92
|
+
to_number: params[:to],
|
|
93
|
+
message: params[:message]
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
json result.success? ? { status: 'ok', id: result.batch_sms_id } : { status: 'error' }
|
|
97
|
+
end
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Hanami
|
|
101
|
+
|
|
102
|
+
```ruby
|
|
103
|
+
# config/providers/niazpardaz_sms.rb
|
|
104
|
+
Hanami.app.register_provider :niazpardaz_sms do
|
|
105
|
+
start do
|
|
106
|
+
require 'niazpardaz_sms'
|
|
107
|
+
|
|
108
|
+
NiazpardazSms.configure do |config|
|
|
109
|
+
config.default_api_key = ENV['NIAZPARDAZ_API_KEY']
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
register 'niazpardaz_sms.client', NiazpardazSms.client
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## شروع سریع
|
|
118
|
+
|
|
119
|
+
```ruby
|
|
120
|
+
require 'niazpardaz_sms'
|
|
121
|
+
|
|
122
|
+
# ساخت کلاینت با API Key
|
|
123
|
+
client = NiazpardazSms::Client.new('YOUR_API_KEY')
|
|
124
|
+
|
|
125
|
+
# ارسال پیامک
|
|
126
|
+
result = client.send_sms(
|
|
127
|
+
from_number: '10001234',
|
|
128
|
+
to_number: '09123456789',
|
|
129
|
+
message: 'سلام از نیازپرداز!'
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
if result.success?
|
|
133
|
+
puts "شناسه ارسال: #{result.batch_sms_id}"
|
|
134
|
+
else
|
|
135
|
+
puts "خطا: #{result.result_description}"
|
|
136
|
+
end
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## امکانات
|
|
140
|
+
|
|
141
|
+
### ارسال پیامک تکی
|
|
142
|
+
|
|
143
|
+
```ruby
|
|
144
|
+
result = client.send_sms(
|
|
145
|
+
from_number: '10001234',
|
|
146
|
+
to_number: '09123456789',
|
|
147
|
+
message: 'متن پیامک',
|
|
148
|
+
is_flash: false,
|
|
149
|
+
send_delay: nil
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
puts "شناسه ارسال: #{result.batch_sms_id}"
|
|
153
|
+
puts "وضعیت: #{result.result_description}"
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### ارسال گروهی (یک متن به چند شماره)
|
|
157
|
+
|
|
158
|
+
```ruby
|
|
159
|
+
result = client.send_bulk_sms(
|
|
160
|
+
from_number: '10001234',
|
|
161
|
+
to_numbers: ['09123456789', '09198765432'],
|
|
162
|
+
message: 'پیام گروهی',
|
|
163
|
+
is_flash: false
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
puts "شناسه ارسال: #{result.batch_sms_id}"
|
|
167
|
+
puts "وضعیت: #{result.result_description}"
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### ارسال LikeToLike (هر شماره پیام مخصوص خودش)
|
|
171
|
+
|
|
172
|
+
```ruby
|
|
173
|
+
result = client.send_sms_like_to_like(
|
|
174
|
+
from_number: '10001234',
|
|
175
|
+
to_numbers: ['09123456789', '09198765432'],
|
|
176
|
+
messages: ['سلام علی جان', 'سلام رضا جان']
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
puts "SmsId: #{result.sms_id}"
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### ارسال پیامک صوتی OTP
|
|
183
|
+
|
|
184
|
+
```ruby
|
|
185
|
+
result = client.send_voice_otp(
|
|
186
|
+
from_number: '10001234',
|
|
187
|
+
to_number: '09123456789',
|
|
188
|
+
otp: '12345'
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
puts "شناسه ارسال: #{result.batch_sms_id}"
|
|
192
|
+
puts "وضعیت: #{result.result_description}"
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### گزارش تحویل ارسال گروهی
|
|
196
|
+
|
|
197
|
+
```ruby
|
|
198
|
+
delivery = client.get_batch_delivery(
|
|
199
|
+
batch_sms_id: 123456,
|
|
200
|
+
page_index: 1,
|
|
201
|
+
page_size: 100
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
if delivery.success?
|
|
205
|
+
delivery.delivery_hash.each do |number, status|
|
|
206
|
+
puts "#{number}: #{NiazpardazSms::Models::SmsDeliveryStatus.description(status)}"
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### گزارش تحویل ارسال LikeToLike
|
|
212
|
+
|
|
213
|
+
```ruby
|
|
214
|
+
delivery = client.get_delivery_like_to_like(sms_id: 789)
|
|
215
|
+
|
|
216
|
+
if delivery.success?
|
|
217
|
+
delivery.numbers.each_with_index do |number, i|
|
|
218
|
+
puts "#{number}: #{delivery.delivery_status[i]}"
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### اعتبار
|
|
224
|
+
|
|
225
|
+
```ruby
|
|
226
|
+
credit = client.get_credit
|
|
227
|
+
|
|
228
|
+
if credit.success?
|
|
229
|
+
puts "اعتبار: #{credit.credit}"
|
|
230
|
+
end
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### شمارههای فرستنده
|
|
234
|
+
|
|
235
|
+
```ruby
|
|
236
|
+
senders = client.get_sender_numbers
|
|
237
|
+
|
|
238
|
+
senders.senders.each do |sender|
|
|
239
|
+
puts sender
|
|
240
|
+
end
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### تعداد پیامکهای دریافتی
|
|
244
|
+
|
|
245
|
+
```ruby
|
|
246
|
+
inbox_count = client.get_inbox_count(is_read: false)
|
|
247
|
+
puts "تعداد: #{inbox_count.inbox_count}"
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### لیست پیامکها
|
|
251
|
+
|
|
252
|
+
```ruby
|
|
253
|
+
messages = client.get_messages(
|
|
254
|
+
message_type: 1,
|
|
255
|
+
from_numbers: '10001234',
|
|
256
|
+
page_index: 1,
|
|
257
|
+
page_size: 50
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
if messages.success?
|
|
261
|
+
messages.messages.each do |message|
|
|
262
|
+
puts "متن پیامک: #{message.content}"
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### دریافت پیامکها بر اساس بازه زمانی
|
|
268
|
+
|
|
269
|
+
```ruby
|
|
270
|
+
messages = client.get_messages_by_date_range(
|
|
271
|
+
message_type: 1,
|
|
272
|
+
from_numbers: '10001234',
|
|
273
|
+
from_date: Time.now - 86400, # دیروز
|
|
274
|
+
to_date: Time.now
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
if messages.success?
|
|
278
|
+
messages.messages.each do |message|
|
|
279
|
+
puts "متن پیامک: #{message.content}"
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### لیست سیاه مخابرات (بررسی یک شماره)
|
|
285
|
+
|
|
286
|
+
```ruby
|
|
287
|
+
result = client.number_is_in_telecom_blacklist(number: '09123456789')
|
|
288
|
+
puts "در لیست سیاه: #{result.blacklisted?}"
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### لیست سیاه مخابرات (استخراج شمارههای لیست سیاه از یک لیست)
|
|
292
|
+
|
|
293
|
+
```ruby
|
|
294
|
+
blacklist = client.extract_telecom_blacklist_numbers(
|
|
295
|
+
numbers: ['09123456789', '09198765432', '09351234567']
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
if blacklist.success?
|
|
299
|
+
blacklist.blacklist_numbers.each do |number|
|
|
300
|
+
puts number
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### بررسی محتوای پیامک
|
|
306
|
+
|
|
307
|
+
```ruby
|
|
308
|
+
check = client.check_sms_content(message: 'متن پیامک تست')
|
|
309
|
+
puts "متن معتبر است: #{check.valid?}"
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## کدهای نتیجه
|
|
315
|
+
|
|
316
|
+
### کدهای نتیجه ارسال (SendResultCode)
|
|
317
|
+
|
|
318
|
+
| کد | مقدار | توضیحات |
|
|
319
|
+
|---:|-------|--------:|
|
|
320
|
+
| 0 | SEND_WAS_SUCCESSFUL | ارسال موفق ✅ |
|
|
321
|
+
| 1 | INVALID_USER_NAME_OR_PASSWORD | نام کاربر یا رمز نامعتبر |
|
|
322
|
+
| 2 | USER_BLOCKED | کاربر مسدود |
|
|
323
|
+
| 3 | INVALID_SENDER_NUMBER | شماره فرستنده نامعتبر |
|
|
324
|
+
| 4 | LIMITATION_IN_DAILY_SEND | محدودیت روزانه |
|
|
325
|
+
| 5 | LIMITATION_IN_RECEIVER_COUNT | حداکثر 1000 گیرنده |
|
|
326
|
+
| 6 | SENDER_LINE_IS_INACTIVE | خط غیرفعال |
|
|
327
|
+
| 7 | SMS_CONTENT_FILTERED_WORDS_IS_INCLUDED | کلمات فیلتر شده |
|
|
328
|
+
| 8 | NO_CREDIT | اعتبار ناکافی |
|
|
329
|
+
| 9 | SYSTEM_BEING_UPDATED | در حال بروزرسانی |
|
|
330
|
+
| 10 | WEB_SERVICE_NOT_ACTIVE | وب سرویس غیرفعال |
|
|
331
|
+
| 11 | NOT_IMPLEMENTED | پیاده سازی نشده |
|
|
332
|
+
| 12 | LIKE_TO_LIKE_RECEIVER_AND_MESSAGE_COUNT_SHOULD_EQUAL | تعداد پیام و شماره نابرابر |
|
|
333
|
+
| 13 | LIMITATION_IN_MESSAGE_CONTENT_COUNT | حداکثر 100 پیام |
|
|
334
|
+
| 14 | USER_TARIFF_NOT_DETERMINED | تعرفه تعریف نشده |
|
|
335
|
+
| 15 | DUPLICATE_SEND_SMS | ارسال تکراری |
|
|
336
|
+
| 16 | INVALID_NUMBER_EMPTY_OR_BLACKLIST | شماره نامعتبر یا بلاک لیست |
|
|
337
|
+
| 17 | TEXT_NOT_FOUND | متن خالی |
|
|
338
|
+
| 18 | NOT_VALID_TEMPLATE_FOUND | مغایرت با قالب |
|
|
339
|
+
| 19 | USER_EXPIRED | کاربر منقضی |
|
|
340
|
+
| 20 | USER_IS_NOT_ACTIVE | کاربر غیرفعال |
|
|
341
|
+
| 21 | INVALID_PARAMETERS | پارامتر نامعتبر |
|
|
342
|
+
| 22 | IP_BLOCKED | آی پی بلاک شده |
|
|
343
|
+
| 23 | ENQUEUE_FAILED | خطا در صف ارسال |
|
|
344
|
+
| 24 | DUPLICATE_REQUEST_THRESHOLD | درخواست تکراری |
|
|
345
|
+
| 25 | INVALID_API_KEY | ApiKey نامعتبر |
|
|
346
|
+
| 26 | ERROR_CREATE_VOICE_FILE | خطا در ساخت فایل صوتی |
|
|
347
|
+
|
|
348
|
+
### کدهای نتیجه گزارش تحویل (DeliveryResultCode)
|
|
349
|
+
|
|
350
|
+
| کد | مقدار | توضیحات |
|
|
351
|
+
|---:|-------|--------:|
|
|
352
|
+
| 0 | SUCCESS | موفق ✅ |
|
|
353
|
+
| -1 | SERVICE_CONNECTION_ERROR | خطا در ارتباط با سرویس دهنده |
|
|
354
|
+
| -2 | INVALID_BATCH_SMS_ID | پیام با این کد وجود ندارد |
|
|
355
|
+
| -3 | REPORT_EXPIRED | مهلت یک هفته ای گزارش پایان یافته |
|
|
356
|
+
| -4 | MESSAGE_IN_QUEUE | پیام در صف ارسال مخابرات است |
|
|
357
|
+
| -5 | TOO_EARLY | حداقل یک دقیقه بعد از ارسال اقدام نمایید |
|
|
358
|
+
| -6 | IP_BLOCKED | آی پی بلاک شده |
|
|
359
|
+
| -7 | INVALID_API_KEY | ApiKey نامعتبر |
|
|
360
|
+
|
|
361
|
+
### وضعیت تحویل پیامک (SmsDeliveryStatus)
|
|
362
|
+
|
|
363
|
+
| کد | مقدار | توضیحات |
|
|
364
|
+
|---:|-------|--------:|
|
|
365
|
+
| 0 | SENT_TO_TELECOM | ارسال شده به مخابرات |
|
|
366
|
+
| 1 | DELIVERED | رسیده به گوشی ✅ |
|
|
367
|
+
| 2 | NOT_DELIVERED | نرسیده به گوشی |
|
|
368
|
+
| 3 | SMS_FAILED | خطای مخابراتی |
|
|
369
|
+
| 4 | UNKNOWN_ERROR | خطای نامشخص |
|
|
370
|
+
| 5 | RECEIVED_BY_TELECOM | رسیده به مخابرات |
|
|
371
|
+
| 6 | NOT_RECEIVED_BY_TELECOM | نرسیده به مخابرات |
|
|
372
|
+
| 7 | BLACKLISTED | مسدود شده توسط مقصد |
|
|
373
|
+
| 8 | UNKNOWN | نامشخص |
|
|
374
|
+
| 9 | REJECTED_BY_TELECOM | مخابرات پیام را مردود اعلام کرد |
|
|
375
|
+
| 10 | CANCELED | کنسل شده توسط اپراتور |
|
|
376
|
+
| 11 | NOT_SENT | ارسال نشده |
|
|
377
|
+
| 12 | NO_TELEGRAM | تلگرام ندارد |
|
|
378
|
+
| 13 | IN_QUEUE | در صف ارسال |
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## مدیریت خطا
|
|
383
|
+
|
|
384
|
+
```ruby
|
|
385
|
+
begin
|
|
386
|
+
result = client.send_sms(
|
|
387
|
+
from_number: '10001234',
|
|
388
|
+
to_number: '09123456789',
|
|
389
|
+
message: 'تست'
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
unless result.success?
|
|
393
|
+
puts "خطا: #{result.result_description}"
|
|
394
|
+
end
|
|
395
|
+
rescue NiazpardazSms::Errors::ValidationError => e
|
|
396
|
+
puts "خطای اعتبارسنجی: #{e.message}"
|
|
397
|
+
rescue NiazpardazSms::Errors::ApiError => e
|
|
398
|
+
puts "خطای API: #{e.message}"
|
|
399
|
+
puts "کد خطا: #{e.error_code}"
|
|
400
|
+
puts "وضعیت HTTP: #{e.http_status}"
|
|
401
|
+
rescue NiazpardazSms::Errors::NetworkError => e
|
|
402
|
+
puts "خطای شبکه: #{e.message}"
|
|
403
|
+
end
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
## تنظیمات پیشرفته
|
|
409
|
+
|
|
410
|
+
### استفاده از Faraday سفارشی
|
|
411
|
+
|
|
412
|
+
```ruby
|
|
413
|
+
require 'faraday'
|
|
414
|
+
|
|
415
|
+
connection = Faraday.new do |faraday|
|
|
416
|
+
faraday.request :json
|
|
417
|
+
faraday.response :json
|
|
418
|
+
faraday.adapter :net_http
|
|
419
|
+
faraday.options.timeout = 60
|
|
420
|
+
faraday.options.open_timeout = 10
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
client = NiazpardazSms::Client.new('YOUR_API_KEY', connection: connection)
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### تنظیم Timeout
|
|
427
|
+
|
|
428
|
+
```ruby
|
|
429
|
+
client = NiazpardazSms::Client.new('YOUR_API_KEY', timeout: 60)
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### تغییر Base URL
|
|
433
|
+
|
|
434
|
+
```ruby
|
|
435
|
+
client = NiazpardazSms::Client.new(
|
|
436
|
+
'YOUR_API_KEY',
|
|
437
|
+
base_url: 'https://custom-url.example.com/api'
|
|
438
|
+
)
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
---
|
|
442
|
+
|
|
443
|
+
## استفاده در Background Jobs
|
|
444
|
+
|
|
445
|
+
### Sidekiq
|
|
446
|
+
|
|
447
|
+
```ruby
|
|
448
|
+
class SendSmsJob
|
|
449
|
+
include Sidekiq::Job
|
|
450
|
+
|
|
451
|
+
def perform(to_number, message)
|
|
452
|
+
client = NiazpardazSms.client
|
|
453
|
+
result = client.send_sms(
|
|
454
|
+
from_number: ENV['SMS_FROM_NUMBER'],
|
|
455
|
+
to_number: to_number,
|
|
456
|
+
message: message
|
|
457
|
+
)
|
|
458
|
+
|
|
459
|
+
unless result.success?
|
|
460
|
+
raise "SMS failed: #{result.result_description}"
|
|
461
|
+
end
|
|
462
|
+
end
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
# استفاده
|
|
466
|
+
SendSmsJob.perform_async('09123456789', 'سلام!')
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
### ActiveJob (Rails)
|
|
470
|
+
|
|
471
|
+
```ruby
|
|
472
|
+
class SendSmsJob < ApplicationJob
|
|
473
|
+
queue_as :default
|
|
474
|
+
|
|
475
|
+
def perform(to_number, message)
|
|
476
|
+
client = NiazpardazSms.client
|
|
477
|
+
result = client.send_sms(
|
|
478
|
+
from_number: ENV['SMS_FROM_NUMBER'],
|
|
479
|
+
to_number: to_number,
|
|
480
|
+
message: message
|
|
481
|
+
)
|
|
482
|
+
|
|
483
|
+
unless result.success?
|
|
484
|
+
raise "SMS failed: #{result.result_description}"
|
|
485
|
+
end
|
|
486
|
+
end
|
|
487
|
+
end
|
|
488
|
+
|
|
489
|
+
# استفاده
|
|
490
|
+
SendSmsJob.perform_later('09123456789', 'سلام!')
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
---
|
|
494
|
+
|
|
495
|
+
## سازگاری
|
|
496
|
+
|
|
497
|
+
- Ruby 2.6+
|
|
498
|
+
- Ruby 3.0+
|
|
499
|
+
- Rails 5.2+
|
|
500
|
+
- Rails 6.x
|
|
501
|
+
- Rails 7.x
|
|
502
|
+
- Sinatra
|
|
503
|
+
- Hanami
|
|
504
|
+
- Grape
|
|
505
|
+
- و سایر فریمورکهای Ruby
|
|
506
|
+
|
|
507
|
+
## وابستگیها
|
|
508
|
+
|
|
509
|
+
- faraday (>= 1.0, < 3.0)
|
|
510
|
+
|
|
511
|
+
## مجوز
|
|
512
|
+
|
|
513
|
+
MIT License
|
|
514
|
+
|
|
515
|
+
## پشتیبانی
|
|
516
|
+
|
|
517
|
+
- 📚 مستندات: https://niazpardaz-sms.com/webservice
|
|
518
|
+
- 🐛 گزارش باگ: [GitHub Issues](https://github.com/NiazpardazSms/niazpardaz-sms-ruby/issues)
|
data/Rakefile
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bundler/gem_tasks'
|
|
4
|
+
require 'rspec/core/rake_task'
|
|
5
|
+
require 'rubocop/rake_task'
|
|
6
|
+
|
|
7
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
8
|
+
RuboCop::RakeTask.new
|
|
9
|
+
|
|
10
|
+
task default: %i[spec rubocop]
|
|
11
|
+
|
|
12
|
+
desc 'Open an interactive console'
|
|
13
|
+
task :console do
|
|
14
|
+
require 'irb'
|
|
15
|
+
require 'niazpardaz_sms'
|
|
16
|
+
ARGV.clear
|
|
17
|
+
IRB.start
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
namespace :gem do
|
|
21
|
+
desc 'Build the gem'
|
|
22
|
+
task :build do
|
|
23
|
+
system 'gem build niazpardaz_sms.gemspec'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
desc 'Install the gem locally'
|
|
27
|
+
task install: :build do
|
|
28
|
+
system 'gem install niazpardaz_sms-*.gem'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
desc 'Push the gem to RubyGems'
|
|
32
|
+
task push: :build do
|
|
33
|
+
system 'gem push niazpardaz_sms-*.gem'
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rails/generators/base'
|
|
4
|
+
|
|
5
|
+
module NiazpardazSms
|
|
6
|
+
module Generators
|
|
7
|
+
# Generator برای نصب و پیکربندی NiazpardazSms در Rails
|
|
8
|
+
#
|
|
9
|
+
# @example اجرای generator
|
|
10
|
+
# rails generate niazpardaz_sms:install
|
|
11
|
+
#
|
|
12
|
+
class InstallGenerator < Rails::Generators::Base
|
|
13
|
+
source_root File.expand_path('templates', __dir__)
|
|
14
|
+
|
|
15
|
+
desc 'ایجاد فایل پیکربندی NiazpardazSms برای Rails'
|
|
16
|
+
|
|
17
|
+
def create_initializer_file
|
|
18
|
+
template 'niazpardaz_sms.rb', 'config/initializers/niazpardaz_sms.rb'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def show_readme
|
|
22
|
+
readme 'README' if behavior == :invoke
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|