qismo 0.9.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -12
- data/Gemfile.lock +1 -1
- data/lib/qismo/api.rb +281 -154
- data/lib/qismo/client.rb +31 -19
- data/lib/qismo/model.rb +10 -10
- data/lib/qismo/util.rb +1 -1
- data/lib/qismo/version.rb +1 -1
- data/lib/qismo.rb +18 -20
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 23e999cca8b986d2783ea662573e0fab71db0c0bb1e6bf0a1603b4442eea6acc
|
4
|
+
data.tar.gz: fc35ba076ba1c6597e1fb8f13b26c2a4319a92dc8c0a6215529c4f5aff2b9a09
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d45397820b9bdf5214ff8e45d164f2253824d20c4e8d2017d3c4cec9993c1e550e51754f4743be566b5296edb90d6eb7b1c6b82f098f25ce67b74db87422ee31
|
7
|
+
data.tar.gz: 40b3d89d5d06bce5e7460d7d36b3c0010da9fd583f0e7d66574a052be6b61bfda33688751380b32c1b6e436553f79f0661a739941e742aaf876800707fbb19cf
|
data/.rubocop.yml
CHANGED
@@ -5,15 +5,4 @@ AllCops:
|
|
5
5
|
TargetRubyVersion: 2.6
|
6
6
|
Exclude:
|
7
7
|
- "bin/**/*"
|
8
|
-
- "examples/*"
|
9
|
-
|
10
|
-
Style/StringLiterals:
|
11
|
-
Enabled: true
|
12
|
-
EnforcedStyle: double_quotes
|
13
|
-
|
14
|
-
Style/StringLiteralsInInterpolation:
|
15
|
-
Enabled: true
|
16
|
-
EnforcedStyle: double_quotes
|
17
|
-
|
18
|
-
Layout/LineLength:
|
19
|
-
Max: 120
|
8
|
+
- "examples/*"
|
data/Gemfile.lock
CHANGED
data/lib/qismo/api.rb
CHANGED
@@ -2,25 +2,29 @@
|
|
2
2
|
|
3
3
|
module Qismo
|
4
4
|
module Api
|
5
|
+
# @!parse include Qismo::Client
|
6
|
+
|
5
7
|
# List customer rooms
|
6
8
|
#
|
7
|
-
# @
|
8
|
-
# @
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
# @see https://s.id/list-customer-rooms
|
10
|
+
# @param options [Hash]
|
11
|
+
# @return [Qismo::CollectionObject]
|
12
|
+
def rooms(options = {})
|
13
|
+
body = post("/api/v2/customer_rooms", options)
|
14
|
+
CollectionObject.new(
|
12
15
|
body.data.customer_rooms,
|
13
16
|
prev_page: body.meta&.cursor_before,
|
14
17
|
next_page: body.meta&.cursor_after,
|
15
|
-
prev_func: -> { rooms(
|
16
|
-
next_func: -> { rooms(
|
18
|
+
prev_func: -> { rooms(options.merge(cursor_before: body.meta&.cursor_before)) },
|
19
|
+
next_func: -> { rooms(options.merge(cursor_after: body.meta&.cursor_after)) },
|
17
20
|
)
|
18
21
|
end
|
19
22
|
|
20
23
|
# Get room by id
|
21
24
|
#
|
25
|
+
# @see https://s.id/get-room-by-room-id
|
22
26
|
# @param room_id [Integer]
|
23
|
-
# @return [Qismo::
|
27
|
+
# @return [Qismo::SingleObject]
|
24
28
|
def room(room_id)
|
25
29
|
body = get("/api/v2/customer_rooms/#{room_id}")
|
26
30
|
if body.data.customer_room.nil?
|
@@ -32,23 +36,26 @@ module Qismo
|
|
32
36
|
|
33
37
|
# List tags inside room
|
34
38
|
#
|
39
|
+
# @see https://s.id/list-room-tags
|
35
40
|
# @param room_id [Integer]
|
36
|
-
# @return [Qismo::
|
41
|
+
# @return [Qismo::CollectionObject]
|
37
42
|
def room_tags(room_id)
|
38
|
-
get("/api/v2/room_tags/#{room_id}").data
|
43
|
+
CollectionObject.new(get("/api/v2/room_tags/#{room_id}").data)
|
39
44
|
end
|
40
45
|
|
41
46
|
# Add room tag
|
42
47
|
#
|
48
|
+
# @see https://s.id/add-room-tag
|
43
49
|
# @param room_id [Integer]
|
44
|
-
# @param
|
45
|
-
# @return [Qismo::
|
46
|
-
def add_room_tag(room_id,
|
47
|
-
post("/api/v2/room_tags/#{room_id}", tag:
|
50
|
+
# @param tag_name [String]
|
51
|
+
# @return [Qismo::SingleObject]
|
52
|
+
def add_room_tag(room_id, tag_name)
|
53
|
+
post("/api/v2/room_tags/#{room_id}", tag: tag_name).data
|
48
54
|
end
|
49
55
|
|
50
56
|
# Delete room tag
|
51
57
|
#
|
58
|
+
# @see https://s.id/delete-room-tag
|
52
59
|
# @param room_id [Integer]
|
53
60
|
# @param tag_id [Integer]
|
54
61
|
# @return [TrueClass]
|
@@ -59,68 +66,88 @@ module Qismo
|
|
59
66
|
|
60
67
|
# List room additional info
|
61
68
|
#
|
69
|
+
# @see https://s.id/list-room-info
|
62
70
|
# @param room_id [Integer]
|
63
|
-
# @return [Qismo::
|
71
|
+
# @return [Qismo::CollectionObject]
|
64
72
|
def room_additional_info(room_id)
|
65
|
-
|
66
|
-
|
73
|
+
CollectionObject.new(
|
74
|
+
get(
|
75
|
+
"/api/v1/qiscus/room/#{room_id}/user_info",
|
76
|
+
).data&.extras&.user_properties,
|
77
|
+
) || CollectionObject.new
|
67
78
|
end
|
68
79
|
|
80
|
+
alias_method :room_info, :room_additional_info
|
81
|
+
|
69
82
|
# Set room additional info
|
70
83
|
#
|
84
|
+
# @see https://s.id/set-room-info
|
71
85
|
# @note This will replace your current room additional info
|
72
86
|
# @param room_id [Integer]
|
73
|
-
# @param
|
74
|
-
# @return [Qismo::
|
75
|
-
def set_room_additional_info(room_id,
|
76
|
-
|
77
|
-
|
87
|
+
# @param additional_info [Array<Hash>]
|
88
|
+
# @return [Qismo::CollectionObject]
|
89
|
+
def set_room_additional_info(room_id, additional_info)
|
90
|
+
CollectionObject.new(
|
91
|
+
post(
|
92
|
+
"/api/v1/qiscus/room/#{room_id}/user_info",
|
93
|
+
user_properties: additional_info,
|
94
|
+
).data&.extras&.user_properties,
|
95
|
+
) || CollectionObject.new
|
78
96
|
end
|
79
97
|
|
98
|
+
alias_method :set_room_info, :set_room_additional_info
|
99
|
+
alias_method :create_room_info, :set_room_additional_info
|
100
|
+
alias_method :create_room_additional_info, :set_room_additional_info
|
101
|
+
|
80
102
|
# Update room additional info
|
81
103
|
#
|
82
104
|
# @param room_id [Integer]
|
83
|
-
# @param
|
84
|
-
# @return [Qismo::
|
85
|
-
def update_room_additional_info(room_id,
|
105
|
+
# @param additional_info [Array]
|
106
|
+
# @return [Qismo::CollectionObject]
|
107
|
+
def update_room_additional_info(room_id, additional_info)
|
86
108
|
old_additional_info = room_additional_info(room_id)
|
87
109
|
new_additional_info = (additional_info + old_additional_info).uniq { |h| h.values_at("key") }
|
88
|
-
set_room_additional_info(room_id,
|
110
|
+
set_room_additional_info(room_id, new_additional_info)
|
89
111
|
end
|
90
112
|
|
113
|
+
alias_method :update_room_info, :update_room_additional_info
|
114
|
+
|
91
115
|
# List Whatsapp broadcast history inside room
|
92
116
|
#
|
117
|
+
# @see https://s.id/list-room-broadcast-history
|
93
118
|
# @param room_id [Integer]
|
94
|
-
# @param
|
95
|
-
# @return [Qismo::
|
96
|
-
def room_broadcast_history(room_id,
|
97
|
-
body = get("/api/v2/customer_rooms/#{room_id}/broadcast_history",
|
119
|
+
# @param options [Hash]
|
120
|
+
# @return [Qismo::CollectionObject]
|
121
|
+
def room_broadcast_history(room_id, options = {})
|
122
|
+
body = get("/api/v2/customer_rooms/#{room_id}/broadcast_history", options)
|
98
123
|
|
99
124
|
next_page = body.meta.page < body.meta.total_page ? (body.meta.page + 1) : nil
|
100
125
|
prev_page = body.meta.page > 1 ? (body.meta.page - 1) : nil
|
101
126
|
|
102
|
-
|
127
|
+
CollectionObject.new(
|
103
128
|
body.data.broadcast_logs,
|
104
129
|
next_page: next_page,
|
105
130
|
prev_page: prev_page,
|
106
|
-
next_func: -> { room_broadcast_history(
|
107
|
-
prev_func: -> { room_broadcast_history(
|
131
|
+
next_func: -> { room_broadcast_history(options.merge(page: next_page)) },
|
132
|
+
prev_func: -> { room_broadcast_history(options.merge(page: prev_page)) },
|
108
133
|
)
|
109
134
|
end
|
110
135
|
|
111
136
|
# Assign agent to room
|
112
137
|
#
|
138
|
+
# @see https://s.id/assign-agent
|
113
139
|
# @param room_id [Integer]
|
114
140
|
# @param agent_id [Integer]
|
115
|
-
# @param
|
116
|
-
# @return [Qismo::
|
117
|
-
def assign_agent(room_id, agent_id,
|
118
|
-
body = post("/api/v1/admin/service/assign_agent",
|
141
|
+
# @param options [Hash]
|
142
|
+
# @return [Qismo::SingleObject]
|
143
|
+
def assign_agent(room_id, agent_id, options = {})
|
144
|
+
body = post("/api/v1/admin/service/assign_agent", options.merge(room_id: room_id.to_s, agent_id: agent_id))
|
119
145
|
body.data.added_agent
|
120
146
|
end
|
121
147
|
|
122
148
|
# Remove agent from room
|
123
149
|
#
|
150
|
+
# @see https://s.id/remove-agent
|
124
151
|
# @param room_id [Integer]
|
125
152
|
# @param agent_id [Integer]
|
126
153
|
# @return [TrueClass]
|
@@ -131,13 +158,14 @@ module Qismo
|
|
131
158
|
|
132
159
|
# Resolve room
|
133
160
|
#
|
161
|
+
# @see https://s.id/resolve-room
|
134
162
|
# @param room_id [Integer]
|
135
163
|
# @param last_comment_id [Integer]
|
136
|
-
# @param
|
137
|
-
# @return [Qismo::
|
138
|
-
def resolve_room(room_id, last_comment_id,
|
164
|
+
# @param options [Hash]
|
165
|
+
# @return [Qismo::SingleObject]
|
166
|
+
def resolve_room(room_id, last_comment_id, options = {})
|
139
167
|
body = post("/api/v1/admin/service/mark_as_resolved",
|
140
|
-
|
168
|
+
options.merge(room_id: room_id.to_s, last_comment_id: last_comment_id))
|
141
169
|
body.data.service
|
142
170
|
end
|
143
171
|
|
@@ -145,59 +173,63 @@ module Qismo
|
|
145
173
|
|
146
174
|
# Get agent that can be assigned to room
|
147
175
|
#
|
176
|
+
# @see https://s.id/allocate-agent
|
148
177
|
# @param source [String]
|
149
|
-
# @param
|
150
|
-
# @return [Qismo::
|
151
|
-
def allocate_agent(source,
|
152
|
-
body = post("/api/v1/admin/service/allocate_agent",
|
178
|
+
# @param options [Hash]
|
179
|
+
# @return [Qismo::SingleObject]
|
180
|
+
def allocate_agent(source, options = {})
|
181
|
+
body = post("/api/v1/admin/service/allocate_agent", options.merge(source: source))
|
153
182
|
body.data.agent
|
154
183
|
end
|
155
184
|
|
156
185
|
# Get agent that can be allocated to room and automatically assign them
|
157
186
|
#
|
187
|
+
# @see https://s.id/allocate-and-assign-agent
|
158
188
|
# @param room_id [Integer]
|
159
|
-
# @param
|
160
|
-
# @return [Qismo::
|
161
|
-
def allocate_and_assign_agent(room_id,
|
162
|
-
body = post("/api/v1/admin/service/allocate_assign_agent",
|
189
|
+
# @param options [Hash]
|
190
|
+
# @return [Qismo::SingleObject]
|
191
|
+
def allocate_and_assign_agent(room_id, options = {})
|
192
|
+
body = post("/api/v1/admin/service/allocate_assign_agent", options.merge(room_id: room_id))
|
163
193
|
body.data.agent
|
164
194
|
end
|
165
195
|
|
166
196
|
# List agents that are not in room and can be assigned to room
|
167
197
|
#
|
198
|
+
# @see https://s.id/list-other-agents
|
168
199
|
# @param room_id [Integer]
|
169
|
-
# @param
|
170
|
-
# @return [Qismo::
|
171
|
-
def other_agents(room_id,
|
172
|
-
body = get("/api/v2/admin/service/other_agents",
|
173
|
-
|
200
|
+
# @param options [Hash]
|
201
|
+
# @return [Qismo::CollectionObject]
|
202
|
+
def other_agents(room_id, options = {})
|
203
|
+
body = get("/api/v2/admin/service/other_agents", options.merge(room_id: room_id))
|
204
|
+
CollectionObject.new(
|
174
205
|
body.data.agents,
|
175
206
|
prev_page: body.meta&.cursor_before,
|
176
207
|
next_page: body.meta&.cursor_after,
|
177
|
-
prev_func: -> { other_agents(
|
178
|
-
next_func: -> { other_agents(
|
208
|
+
prev_func: -> { other_agents(options.merge(cursor_before: body.meta&.cursor_before)) },
|
209
|
+
next_func: -> { other_agents(options.merge(cursor_after: body.meta&.cursor_after)) },
|
179
210
|
)
|
180
211
|
end
|
181
212
|
|
182
213
|
# List available agents in room
|
183
214
|
#
|
215
|
+
# @see https://s.id/list-available-agents
|
184
216
|
# @param room_id [Integer]
|
185
|
-
# @param
|
186
|
-
# @return [Qismo::
|
187
|
-
def available_agents(room_id,
|
188
|
-
body = get("/api/v2/admin/service/available_agents",
|
189
|
-
|
217
|
+
# @param options [Hash]
|
218
|
+
# @return [Qismo::CollectionObject]
|
219
|
+
def available_agents(room_id, options = {})
|
220
|
+
body = get("/api/v2/admin/service/available_agents", options.merge(room_id: room_id))
|
221
|
+
CollectionObject.new(
|
190
222
|
body.data.agents,
|
191
223
|
prev_page: body.meta&.cursor_before,
|
192
224
|
next_page: body.meta&.cursor_after,
|
193
|
-
prev_func: -> { available_agents(
|
194
|
-
next_func: -> { available_agents(
|
225
|
+
prev_func: -> { available_agents(options.merge(cursor_before: body.meta&.cursor_before)) },
|
226
|
+
next_func: -> { available_agents(options.merge(cursor_after: body.meta&.cursor_after)) },
|
195
227
|
)
|
196
228
|
end
|
197
229
|
|
198
230
|
# Get new session webhook config
|
199
231
|
#
|
200
|
-
# @return [Qismo::
|
232
|
+
# @return [Qismo::SingleObject]
|
201
233
|
def new_session_webhook
|
202
234
|
get("/api/v2/app/config/new_session_webhook").data.configs
|
203
235
|
end
|
@@ -205,15 +237,15 @@ module Qismo
|
|
205
237
|
# Set new session webhook
|
206
238
|
#
|
207
239
|
# @param url [String]
|
208
|
-
# @param
|
209
|
-
# @return [Qismo::
|
210
|
-
def set_new_session_webhook(url,
|
211
|
-
post("/api/v2/app/config/new_session_webhook",
|
240
|
+
# @param options [Hash]
|
241
|
+
# @return [Qismo::SingleObject]
|
242
|
+
def set_new_session_webhook(url, options = {})
|
243
|
+
post("/api/v2/app/config/new_session_webhook", options.merge(url: url)).data.configs
|
212
244
|
end
|
213
245
|
|
214
246
|
# Get auth webhook config
|
215
247
|
#
|
216
|
-
# @return [Qismo::
|
248
|
+
# @return [Qismo::SingleObject]
|
217
249
|
def auth_webhook
|
218
250
|
get("/api/v2/app/config/auth_webhook").data.configs
|
219
251
|
end
|
@@ -221,15 +253,15 @@ module Qismo
|
|
221
253
|
# Set auth webhook
|
222
254
|
#
|
223
255
|
# @param url [String]
|
224
|
-
# @param
|
225
|
-
# @return [Qismo::
|
226
|
-
def set_auth_webhook(url,
|
227
|
-
post("/api/v2/app/config/auth_webhook",
|
256
|
+
# @param options [Hash]
|
257
|
+
# @return [Qismo::SingleObject]
|
258
|
+
def set_auth_webhook(url, options = {})
|
259
|
+
post("/api/v2/app/config/auth_webhook", options.merge(url: url)).data.configs
|
228
260
|
end
|
229
261
|
|
230
262
|
# Get resolve webhook config
|
231
263
|
#
|
232
|
-
# @return [Qismo::
|
264
|
+
# @return [Qismo::SingleObject]
|
233
265
|
def resolve_webhook
|
234
266
|
get("/api/v1/app/webhook/mark_as_resolved").data
|
235
267
|
end
|
@@ -237,116 +269,127 @@ module Qismo
|
|
237
269
|
# Set resolve webhook
|
238
270
|
#
|
239
271
|
# @param url [String]
|
240
|
-
# @param
|
241
|
-
# @return [Qismo::
|
242
|
-
def set_resolve_webhook(url,
|
243
|
-
post("/api/v1/app/webhook/mark_as_resolved",
|
272
|
+
# @param options [Hash]
|
273
|
+
# @return [Qismo::SingleObject]
|
274
|
+
def set_resolve_webhook(url, options = {})
|
275
|
+
post("/api/v1/app/webhook/mark_as_resolved", options.merge(url: url)).data
|
244
276
|
end
|
245
277
|
|
246
278
|
# List agents
|
247
279
|
#
|
248
|
-
# @
|
249
|
-
# @
|
250
|
-
|
251
|
-
|
252
|
-
|
280
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#849205ca-00d9-4356-9fdd-f05bff777b4e
|
281
|
+
# @param options [Hash]
|
282
|
+
# @return [Qismo::CollectionObject]
|
283
|
+
def agents(options = {})
|
284
|
+
if options[:page].nil? || options[:page].empty?
|
285
|
+
options[:page] = 1
|
253
286
|
end
|
254
287
|
|
255
|
-
body = get("/api/v2/admin/agents",
|
288
|
+
body = get("/api/v2/admin/agents", options)
|
256
289
|
|
257
290
|
total_page = (body.meta.total_count.to_f / body.meta.per_page.to_f).ceil
|
258
|
-
next_page =
|
259
|
-
prev_page =
|
291
|
+
next_page = options[:page] < total_page ? (options[:page] + 1) : nil
|
292
|
+
prev_page = options[:page] > 1 ? (options[:page] - 1) : nil
|
260
293
|
|
261
|
-
|
294
|
+
CollectionObject.new(
|
262
295
|
body.data.agents,
|
263
296
|
next_page: next_page,
|
264
297
|
prev_page: prev_page,
|
265
|
-
next_func: -> { agents(
|
266
|
-
prev_func: -> { agents(
|
298
|
+
next_func: -> { agents(options.merge(page: next_page)) },
|
299
|
+
prev_func: -> { agents(options.merge(page: prev_page)) },
|
267
300
|
)
|
268
301
|
end
|
269
302
|
|
270
303
|
# List agents by id
|
271
304
|
#
|
272
|
-
# @
|
273
|
-
# @
|
274
|
-
|
275
|
-
|
305
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#3db6c8c8-8ffe-4a88-b630-41f9d5b62298
|
306
|
+
# @param ids [Array<Integer>]
|
307
|
+
# @return [Qismo::CollectionObject]
|
308
|
+
def agents_by_ids(ids)
|
309
|
+
CollectionObject.new(get("/api/v1/admin/agents/get_by_ids", { "ids[]": ids }).data) || CollectionObject.new
|
276
310
|
end
|
277
311
|
|
278
312
|
# List agents by divisions
|
279
313
|
#
|
280
|
-
# @
|
281
|
-
# @param
|
282
|
-
# @
|
283
|
-
|
284
|
-
|
314
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#94eeb9cb-dd70-4baf-9f63-361e7922299a
|
315
|
+
# @param division_ids [Array<Integer>]
|
316
|
+
# @param options [Hash]
|
317
|
+
# @return [Qismo::CollectionObject]
|
318
|
+
def agents_by_divisions(division_ids, options = {})
|
319
|
+
body = get("/api/v2/admin/agents/by_division", options.merge({ "division_ids[]": division_ids }))
|
285
320
|
|
286
321
|
next_page = body.meta.page < body.meta.total_page ? (body.meta.page + 1) : nil
|
287
322
|
prev_page = body.meta.page > 1 ? (body.meta.page - 1) : nil
|
288
323
|
|
289
|
-
|
324
|
+
CollectionObject.new(
|
290
325
|
body.data,
|
291
326
|
next_page: next_page,
|
292
327
|
prev_page: prev_page,
|
293
|
-
next_func: -> { agents_by_divisions(
|
294
|
-
prev_func: -> { agents_by_divisions(
|
328
|
+
next_func: -> { agents_by_divisions(options.merge(page: next_page)) },
|
329
|
+
prev_func: -> { agents_by_divisions(options.merge(page: prev_page)) },
|
295
330
|
)
|
296
331
|
end
|
297
332
|
|
298
333
|
# Get agent by id
|
299
334
|
#
|
335
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#c6184a6b-ba4d-4f3e-a4da-c6d0fa4597af
|
300
336
|
# @param agent_id [Integer]
|
301
|
-
# @return [Qismo::
|
337
|
+
# @return [Qismo::SingleObject]
|
302
338
|
def agent(agent_id)
|
303
339
|
get("/api/v2/admin/agent/#{agent_id}").data.agent
|
304
340
|
end
|
305
341
|
|
306
342
|
# Get office hour config
|
307
343
|
#
|
308
|
-
# @
|
344
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#6f3f0cb0-a391-4945-b01a-95ce81138913
|
345
|
+
# @return [Qismo::SingleObject]
|
309
346
|
def office_hours
|
310
347
|
data = get("/api/v1/admin/office_hours").data
|
311
348
|
data_hash = data.as_json
|
312
349
|
data_hash["is_in_office_hour"] = Util.in_office_hour?(data)
|
313
350
|
|
314
|
-
|
351
|
+
SingleObject.new(data_hash)
|
315
352
|
end
|
316
353
|
|
317
354
|
# List WA broadcast templates
|
318
355
|
#
|
319
|
-
# @
|
320
|
-
# @
|
321
|
-
|
322
|
-
|
356
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#e38d2244-9559-4015-99d5-8c707f6c01bd
|
357
|
+
# @param options [Hash]
|
358
|
+
# @return [Qismo::CollectionObject]
|
359
|
+
def wa_broadcast_templates(options = {})
|
360
|
+
body = get("/api/v3/admin/hsm", options)
|
323
361
|
|
324
362
|
meta = body.meta
|
325
363
|
next_page = meta.page < meta.total_page ? (meta.page + 1) : nil
|
326
364
|
prev_page = meta.page > 1 ? (meta.page - 1) : nil
|
327
365
|
|
328
|
-
|
366
|
+
CollectionObject.new(
|
329
367
|
body.data.hsm_templates,
|
330
368
|
next_page: next_page,
|
331
369
|
prev_page: prev_page,
|
332
|
-
next_func: -> { wa_broadcast_templates(
|
333
|
-
prev_func: -> { wa_broadcast_templates(
|
370
|
+
next_func: -> { wa_broadcast_templates(options.merge(page: next_page)) },
|
371
|
+
prev_func: -> { wa_broadcast_templates(options.merge(page: prev_page)) },
|
334
372
|
)
|
335
373
|
end
|
336
374
|
|
375
|
+
alias_method :wa_message_templates, :wa_broadcast_templates
|
376
|
+
alias_method :wa_outbound_templates, :wa_broadcast_templates
|
377
|
+
|
337
378
|
# Send WA outbound message
|
338
379
|
#
|
339
|
-
# @
|
340
|
-
# @
|
341
|
-
|
342
|
-
|
380
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#d0183cf6-deca-439b-aff3-2e2f007c15a9
|
381
|
+
# @param options [Hash]
|
382
|
+
# @return [Qismo::SingleObject]
|
383
|
+
def send_wa_outbound(options = {})
|
384
|
+
post("/api/v3/admin/broadcast/client", options).data
|
343
385
|
end
|
344
386
|
|
345
387
|
# Upload wa broadcast file that want to be sent in broadcast
|
346
388
|
#
|
389
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#030acde2-21cf-4373-8d11-075206053c1d
|
347
390
|
# @param file [HTTP::FormData]
|
348
391
|
# @param template_detail_id [Integer]
|
349
|
-
# @return [Qismo::
|
392
|
+
# @return [Qismo::SingleObject]
|
350
393
|
def upload_wa_broadcast_csv(file, template_detail_id)
|
351
394
|
raise ArgumentError, "Invalid file" unless file.is_a?(HTTP::FormData::File)
|
352
395
|
|
@@ -355,88 +398,98 @@ module Qismo
|
|
355
398
|
|
356
399
|
# Send wa broadcast
|
357
400
|
#
|
358
|
-
# @
|
359
|
-
# @
|
360
|
-
|
361
|
-
|
401
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#717c1a12-facb-4945-aed5-04557696b873
|
402
|
+
# @param options [Hash]
|
403
|
+
# @return [Qismo::SingleObject]
|
404
|
+
def send_wa_broadcast(options = {})
|
405
|
+
post("/api/v3/admin/broadcast/send_broadcast", options).data.broadcast_job
|
362
406
|
end
|
363
407
|
|
408
|
+
alias_method :create_wa_broadcast, :send_wa_broadcast
|
409
|
+
|
364
410
|
# List wa broadcast jobs
|
365
411
|
#
|
366
|
-
# @
|
367
|
-
# @
|
368
|
-
|
369
|
-
|
412
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#3a4caa8b-eef4-427f-adcb-d065989899c9
|
413
|
+
# @param options [Hash]
|
414
|
+
# @return [Qismo::CollectionObject]
|
415
|
+
def wa_broadcast_jobs(options = {})
|
416
|
+
body = get("/api/v2/admin/broadcast_jobs", options)
|
370
417
|
|
371
418
|
prev_page = body.meta.page > 1 ? (body.meta.meta - 1) : nil
|
372
419
|
next_page = body.meta.page < body.meta.total_page ? (body.meta.page + 1) : nil
|
373
420
|
|
374
|
-
|
421
|
+
CollectionObject.new(
|
375
422
|
body.data.broadcast_jobs,
|
376
423
|
next_page: next_page,
|
377
424
|
prev_page: prev_page,
|
378
|
-
next_func: -> { wa_broadcast_jobs(
|
379
|
-
prev_func: -> { wa_broadcast_jobs(
|
425
|
+
next_func: -> { wa_broadcast_jobs(options.merge(page: next_page)) },
|
426
|
+
prev_func: -> { wa_broadcast_jobs(options.merge(page: prev_page)) },
|
380
427
|
)
|
381
428
|
end
|
382
429
|
|
383
430
|
# Get wa broadcast job by id
|
384
431
|
#
|
432
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#ed0806c8-2e4a-4ea4-8acb-45c84c63c2da
|
385
433
|
# @param broadcast_job_id [Integer]
|
386
|
-
# @return [Qismo::
|
434
|
+
# @return [Qismo::SingleObject]
|
387
435
|
def wa_broadcast_job(broadcast_job_id)
|
388
436
|
get("/api/v2/admin/broadcast_jobs/#{broadcast_job_id}").data.broadcast_job
|
389
437
|
end
|
390
438
|
|
391
439
|
# List wa broadcast logs
|
392
440
|
#
|
441
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#3f2d8ba8-ab14-43b2-af82-74c8b766216f
|
393
442
|
# @param broadcast_job_id [Integer]
|
394
|
-
# @param
|
395
|
-
# @return [Qismo::
|
396
|
-
def wa_broadcast_logs(broadcast_job_id,
|
397
|
-
body = get("/api/v2/admin/broadcast_logs/#{broadcast_job_id}",
|
443
|
+
# @param options [Hash]
|
444
|
+
# @return [Qismo::CollectionObject]
|
445
|
+
def wa_broadcast_logs(broadcast_job_id, options = {})
|
446
|
+
body = get("/api/v2/admin/broadcast_logs/#{broadcast_job_id}", options)
|
398
447
|
|
399
448
|
prev_page = body.meta.page > 1 ? (body.meta.meta - 1) : nil
|
400
449
|
next_page = body.meta.page < body.meta.total_page ? (body.meta.page + 1) : nil
|
401
450
|
|
402
|
-
|
451
|
+
CollectionObject.new(
|
403
452
|
body.data.broadcast_logs,
|
404
453
|
next_page: next_page,
|
405
454
|
prev_page: prev_page,
|
406
|
-
next_func: -> { wa_broadcast_logs(
|
407
|
-
prev_func: -> { wa_broadcast_jobs(
|
455
|
+
next_func: -> { wa_broadcast_logs(options.merge(page: next_page)) },
|
456
|
+
prev_func: -> { wa_broadcast_jobs(options.merge(page: prev_page)) },
|
408
457
|
)
|
409
458
|
end
|
410
459
|
|
411
460
|
# Send message as bot
|
412
461
|
#
|
413
|
-
# @
|
462
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#bb77c653-5daa-4e1c-a866-43bca7c494fc
|
463
|
+
# @param options [Hash]
|
414
464
|
# @return [TrueClass]
|
415
|
-
def send_bot_message(
|
416
|
-
post("#{app_id}/bot",
|
465
|
+
def send_bot_message(options = {})
|
466
|
+
post("#{app_id}/bot", options)
|
417
467
|
true
|
418
468
|
end
|
419
469
|
|
420
470
|
# Enable chabot in room
|
421
471
|
#
|
472
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#494d825f-a49c-4b18-954e-eaaccb738bcd
|
422
473
|
# @param room_id [Integer]
|
423
474
|
# @return [TrueClass]
|
424
|
-
def
|
475
|
+
def enable_bot_in_room(room_id)
|
425
476
|
post("/bot/#{room_id}/activate", is_active: true)
|
426
477
|
true
|
427
478
|
end
|
428
479
|
|
429
|
-
# Disable
|
480
|
+
# Disable chatbot in room
|
430
481
|
#
|
482
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#494d825f-a49c-4b18-954e-eaaccb738bcd
|
431
483
|
# @param room_id [Integer]
|
432
484
|
# @return [TrueClass]
|
433
|
-
def
|
485
|
+
def disable_bot_in_room(room_id)
|
434
486
|
post("/bot/#{room_id}/activate", is_active: false)
|
435
487
|
true
|
436
488
|
end
|
437
489
|
|
438
490
|
# Handover room from chatbot to human agent
|
439
491
|
#
|
492
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#40867e85-7412-4e0d-84bd-e2506df23df8
|
440
493
|
# @param room_id [Integer]
|
441
494
|
# @return [TrueClass]
|
442
495
|
def handover_room_from_bot(room_id)
|
@@ -446,36 +499,110 @@ module Qismo
|
|
446
499
|
|
447
500
|
# Handover room from chatbot to human agent in specific divisions
|
448
501
|
#
|
502
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#8218db08-9753-4d74-ae5f-0ee62f8579b9
|
449
503
|
# @param room_id [Integer]
|
450
|
-
# @param
|
451
|
-
# @param
|
504
|
+
# @param roles [Array<Integer>]
|
505
|
+
# @param options [Hash]
|
452
506
|
# @return [TrueClass]
|
453
|
-
def handover_room_from_bot_to_division(room_id, roles,
|
454
|
-
post("/#{app_id}/bot/#{room_id}/hand_over_to_role",
|
507
|
+
def handover_room_from_bot_to_division(room_id, roles, options = {})
|
508
|
+
post("/#{app_id}/bot/#{room_id}/hand_over_to_role", options.merge(roles: roles))
|
455
509
|
true
|
456
510
|
end
|
457
511
|
|
458
512
|
# Initiate chat using Qiscus widget channel
|
459
513
|
#
|
514
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#d5a555de-59e0-4705-9582-c216d79e9390
|
460
515
|
# @param user_id [String]
|
461
516
|
# @param name [String]
|
462
|
-
# @param
|
463
|
-
# @return [Qismo::
|
464
|
-
def initiate_widget_chat(user_id, name,
|
465
|
-
|
466
|
-
post("/api/v2/qiscus/initiate_chat",
|
517
|
+
# @param options [Hash]
|
518
|
+
# @return [Qismo::SingleObject]
|
519
|
+
def initiate_widget_chat(user_id, name, options = {})
|
520
|
+
options = options.merge(app_id: app_id, user_id: user_id, name: name)
|
521
|
+
post("/api/v2/qiscus/initiate_chat", options).data.customer_room
|
467
522
|
end
|
468
523
|
|
524
|
+
alias_method :initiate_chat, :initiate_widget_chat
|
525
|
+
|
469
526
|
# Send message to custom channel
|
470
527
|
#
|
528
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#aee54b21-68f1-4d31-9d81-d3c73b3e125b
|
471
529
|
# @param identifier_key [String]
|
472
530
|
# @param user_id [String]
|
473
531
|
# @param name [String]
|
474
|
-
# @param
|
475
|
-
# @return [Qismo::
|
476
|
-
def send_message_to_custom_channel(identifier_key, user_id, name,
|
532
|
+
# @param options [Hash]
|
533
|
+
# @return [Qismo::SingleObject]
|
534
|
+
def send_message_to_custom_channel(identifier_key, user_id, name, options = {})
|
477
535
|
post("/#{app_id}/api/v2/custom_channel/send",
|
478
|
-
|
536
|
+
options.merge(identifier_key: identifier_key, user_id: user_id, name: name)).data
|
537
|
+
end
|
538
|
+
|
539
|
+
# List integrated channels
|
540
|
+
#
|
541
|
+
# @see https://documenter.getpostman.com/view/8259884/TVsuCSeT#aee54b21-68f1-4d31-9d81-d3c73b3e125b
|
542
|
+
# @return [Qismo::SingleObject]
|
543
|
+
def channels
|
544
|
+
get("/api/v2/channels").data
|
545
|
+
end
|
546
|
+
|
547
|
+
# Create customchannel
|
548
|
+
#
|
549
|
+
# @param identifier_key [String]
|
550
|
+
# @param name [String]
|
551
|
+
# @param webhook_url [String]
|
552
|
+
# @param options [Hash]
|
553
|
+
# @return [Qismo::SingleObject]
|
554
|
+
def create_custom_channel(identifier_key, name, webhook_url, options = {})
|
555
|
+
options = options.merge(
|
556
|
+
identifier_key: identifier_key,
|
557
|
+
name: name,
|
558
|
+
webhook_url: webhook_url,
|
559
|
+
)
|
560
|
+
|
561
|
+
options[:is_active] = true unless options[:is_active].nil?
|
562
|
+
|
563
|
+
post("/api/v1/custom_channel/connect", options.merge).data
|
564
|
+
end
|
565
|
+
|
566
|
+
# Update custom channel
|
567
|
+
#
|
568
|
+
# @param id [Integer]
|
569
|
+
# @param options [Hash]
|
570
|
+
# @return [Qismo::SingleObject]
|
571
|
+
def update_custom_channel(id, options = {})
|
572
|
+
channel = channels.custom_channels.find { |cc| cc.id == id }
|
573
|
+
if channel.nil?
|
574
|
+
raise Qismo::NotFoundError.new("Channel not found", status_code: 404, response_body: nil)
|
575
|
+
end
|
576
|
+
|
577
|
+
channel_hash = JSON.parse(channel.to_json, symbolize_names: true)
|
578
|
+
new_channel_config = channel_hash.merge(options)
|
579
|
+
|
580
|
+
post("/api/v1/custom_channel/connect/update", new_channel_config).data
|
581
|
+
end
|
582
|
+
|
583
|
+
# Activate custom channel
|
584
|
+
#
|
585
|
+
# @param id [Integer]
|
586
|
+
# @return [Qismo::SingleObject]
|
587
|
+
def activate_custom_channel(id)
|
588
|
+
update_custom_channel(id, is_active: true)
|
589
|
+
end
|
590
|
+
|
591
|
+
# Deactivate custom channel
|
592
|
+
#
|
593
|
+
# @param id [Integer]
|
594
|
+
# @return [Qismo::SingleObject]
|
595
|
+
def deactivate_custom_channel(id)
|
596
|
+
update_custom_channel(id, is_active: false)
|
597
|
+
end
|
598
|
+
|
599
|
+
# Delete custom channel
|
600
|
+
#
|
601
|
+
# @param id [Integer]
|
602
|
+
# @return [TrueClass]
|
603
|
+
def delete_custom_channel(id)
|
604
|
+
post("/api/v2/custom_channel/connect/#{id}/delete")
|
605
|
+
true
|
479
606
|
end
|
480
607
|
end
|
481
608
|
end
|
data/lib/qismo/client.rb
CHANGED
@@ -28,9 +28,9 @@ module Qismo
|
|
28
28
|
|
29
29
|
# Initialize client
|
30
30
|
#
|
31
|
-
# @param
|
32
|
-
def initialize(
|
33
|
-
DEFAULT_OPTIONS.merge(
|
31
|
+
# @param options [Hash]
|
32
|
+
def initialize(options = {})
|
33
|
+
DEFAULT_OPTIONS.merge(options).each do |key, value|
|
34
34
|
instance_variable_set("@#{key}", value)
|
35
35
|
end
|
36
36
|
end
|
@@ -39,43 +39,55 @@ module Qismo
|
|
39
39
|
#
|
40
40
|
# @param path [String]
|
41
41
|
# @param body [Hash]
|
42
|
-
# @return [Qismo::
|
42
|
+
# @return [Qismo::SingleObject]
|
43
43
|
def post(path, body = {})
|
44
44
|
request(:post, path, json: body)
|
45
45
|
end
|
46
46
|
|
47
|
-
#
|
47
|
+
# Send HTTP request with post method to upload file
|
48
48
|
#
|
49
49
|
# @param path [String]
|
50
50
|
# @param body [Hash]
|
51
|
-
# @return [Qismo::
|
51
|
+
# @return [Qismo::SingleObject]
|
52
52
|
def post_upload(path, body = {})
|
53
53
|
request(:post, form: body)
|
54
54
|
end
|
55
55
|
|
56
|
-
# Send
|
56
|
+
# Send HTTP request with get method
|
57
57
|
#
|
58
58
|
# @param path [String]
|
59
59
|
# @param params [Hash]
|
60
|
-
# @return [Qismo::
|
61
|
-
def get(path,
|
60
|
+
# @return [Qismo::SingleObject]
|
61
|
+
def get(path, params = {})
|
62
62
|
request(:get, path, params: params)
|
63
63
|
end
|
64
64
|
|
65
|
-
|
66
|
-
|
65
|
+
# Send HTTP request with delete method
|
66
|
+
#
|
67
|
+
# @param path [String]
|
68
|
+
# @param params [Hash]
|
69
|
+
# @return [Qismo::SingleObject]
|
70
|
+
def delete(path, params = {})
|
71
|
+
request(:delete, path, params: params)
|
67
72
|
end
|
68
73
|
|
69
|
-
# Send
|
74
|
+
# Send HTTP request
|
70
75
|
#
|
71
76
|
# @param method [Symbol, String]
|
72
77
|
# @param path [String]
|
73
|
-
# @param
|
74
|
-
# @
|
75
|
-
|
76
|
-
|
78
|
+
# @param headers [Hash]
|
79
|
+
# @param params [Hash]
|
80
|
+
# @param json [Hash]
|
81
|
+
# @return [Qismo::SingleObject]
|
82
|
+
def request(method, path, headers: {}, params: {}, json: {})
|
83
|
+
res = connection.request(method, @url + path, {
|
84
|
+
headers: headers,
|
85
|
+
params: params,
|
86
|
+
json: json,
|
87
|
+
})
|
88
|
+
|
77
89
|
if res.status.success?
|
78
|
-
return
|
90
|
+
return SingleObject.new(JSON.parse(res.to_s))
|
79
91
|
end
|
80
92
|
|
81
93
|
if res.status.server_error?
|
@@ -83,10 +95,10 @@ module Qismo
|
|
83
95
|
end
|
84
96
|
|
85
97
|
if res.status.client_error?
|
86
|
-
body =
|
98
|
+
body = SingleObject.new(JSON.parse(res.to_s))
|
87
99
|
|
88
100
|
error = body.errors
|
89
|
-
error = error.message if error.is_a?(
|
101
|
+
error = error.message if error.is_a?(SingleObject)
|
90
102
|
|
91
103
|
error_klass_map = {
|
92
104
|
400 => BadRequestError,
|
data/lib/qismo/model.rb
CHANGED
@@ -3,14 +3,14 @@
|
|
3
3
|
module Qismo
|
4
4
|
# Class to handle http response body
|
5
5
|
#
|
6
|
-
class
|
6
|
+
class SingleObject
|
7
7
|
# Initiate data object
|
8
8
|
#
|
9
|
-
# @param
|
10
|
-
def initialize(
|
11
|
-
|
9
|
+
# @param options [Hash]
|
10
|
+
def initialize(options = {})
|
11
|
+
options.each do |key, value|
|
12
12
|
value = if value.is_a?(Array)
|
13
|
-
handle_array(value)
|
13
|
+
CollectionObject.new(handle_array(value))
|
14
14
|
elsif value.is_a?(Hash)
|
15
15
|
self.class.new(value)
|
16
16
|
elsif value.is_a?(TrueClass) || value.is_a?(FalseClass)
|
@@ -54,15 +54,15 @@ module Qismo
|
|
54
54
|
|
55
55
|
# Class to handle response body that contain pagination
|
56
56
|
#
|
57
|
-
class
|
57
|
+
class CollectionObject < Array
|
58
58
|
# Initiate collection
|
59
59
|
#
|
60
|
-
# @param data [Qismo::
|
60
|
+
# @param data [Qismo::SingleObject]
|
61
61
|
# @param prev_page [String, Integer]
|
62
62
|
# @param next_page [String, Integer]
|
63
63
|
# @param prev_func [Proc, NilClass]
|
64
64
|
# @param next_func [Proc, NilClass]
|
65
|
-
def initialize(data, prev_page: nil, next_page: nil, prev_func: -> { nil }, next_func: -> { nil })
|
65
|
+
def initialize(data = [], prev_page: nil, next_page: nil, prev_func: -> { nil }, next_func: -> { nil })
|
66
66
|
super(data)
|
67
67
|
|
68
68
|
@prev_page = prev_page
|
@@ -87,14 +87,14 @@ module Qismo
|
|
87
87
|
|
88
88
|
# Call api request for next page
|
89
89
|
#
|
90
|
-
# @return [Qismo::
|
90
|
+
# @return [Qismo::SingleObject, Qismo::CollectionObject]
|
91
91
|
def next_page
|
92
92
|
@next_func.call if has_next_page?
|
93
93
|
end
|
94
94
|
|
95
95
|
# Call api request for previous page
|
96
96
|
#
|
97
|
-
# @return [Qismo::
|
97
|
+
# @return [Qismo::SingleObject, Qismo::CollectionObject]
|
98
98
|
def prev_page
|
99
99
|
@prev_func.call if has_prev_page?
|
100
100
|
end
|
data/lib/qismo/util.rb
CHANGED
data/lib/qismo/version.rb
CHANGED
data/lib/qismo.rb
CHANGED
@@ -11,7 +11,8 @@ require "qismo/api"
|
|
11
11
|
require "qismo/client"
|
12
12
|
|
13
13
|
module Qismo
|
14
|
-
# @!
|
14
|
+
# @!parse extend Qismo::Api
|
15
|
+
|
15
16
|
class << self
|
16
17
|
def configure
|
17
18
|
yield client
|
@@ -21,34 +22,31 @@ module Qismo
|
|
21
22
|
|
22
23
|
# Initiate Qismo ruby client
|
23
24
|
#
|
24
|
-
# @param
|
25
|
+
# @param options [Hash]
|
25
26
|
# @return [Qismo::Client]
|
26
|
-
def new(
|
27
|
-
@client = Client.new(
|
27
|
+
def new(options = {})
|
28
|
+
@client = Client.new(options)
|
28
29
|
end
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
# @return [Qismo::Client]
|
32
|
+
def client
|
33
|
+
@client ||= Client.new
|
34
|
+
end
|
33
35
|
|
34
|
-
|
35
|
-
end
|
36
|
-
else
|
37
|
-
def method_missing(method, *args, &block)
|
38
|
-
return super unless client.respond_to?(method)
|
36
|
+
private
|
39
37
|
|
40
|
-
|
41
|
-
|
42
|
-
end
|
38
|
+
def method_missing(method, *args, &block)
|
39
|
+
return super unless client.respond_to?(method)
|
43
40
|
|
44
|
-
|
45
|
-
Qismo::Client.instance_methods.include?(method_name)
|
41
|
+
client.send(method * args, &block)
|
46
42
|
end
|
47
43
|
|
48
|
-
|
44
|
+
def respond_to?(method_name, include_private = false)
|
45
|
+
client.respond_to?(method_name, include_private) || super(method_name, include_private)
|
46
|
+
end
|
49
47
|
|
50
|
-
def
|
51
|
-
|
48
|
+
def respond_to_missing?(method_name, include_private = false)
|
49
|
+
client.respond_to?(method_name, include_private) || super(method_name, include_private)
|
52
50
|
end
|
53
51
|
end
|
54
52
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qismo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Qiscus Integration
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-12-
|
11
|
+
date: 2022-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -129,12 +129,14 @@ files:
|
|
129
129
|
- lib/qismo/model.rb
|
130
130
|
- lib/qismo/util.rb
|
131
131
|
- lib/qismo/version.rb
|
132
|
-
homepage: https://qiscus
|
132
|
+
homepage: https://bitbucket.org/qiscus/qismo-rb
|
133
133
|
licenses:
|
134
134
|
- MIT
|
135
135
|
metadata:
|
136
136
|
allowed_push_host: https://rubygems.org
|
137
137
|
source_code_uri: https://bitbucket.org/qiscus/qismo-rb
|
138
|
+
homepage_uri: https://bitbucket.org/qiscus/qismo-rb
|
139
|
+
documentation_uri: https://www.rubydoc.info/gems/qismo
|
138
140
|
post_install_message:
|
139
141
|
rdoc_options: []
|
140
142
|
require_paths:
|
@@ -153,5 +155,5 @@ requirements: []
|
|
153
155
|
rubygems_version: 3.1.6
|
154
156
|
signing_key:
|
155
157
|
specification_version: 4
|
156
|
-
summary: Qiscus Omnichannel
|
158
|
+
summary: Ruby wrapper for Qiscus Omnichannel public API
|
157
159
|
test_files: []
|