sendbird 0.0.1 → 0.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 +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +2 -0
- data/README.md +236 -11
- data/config/secrets.example.yml +6 -1
- data/lib/sendbird.rb +8 -3
- data/lib/sendbird/application_api.rb +57 -0
- data/lib/sendbird/client.rb +75 -5
- data/lib/sendbird/configuration.rb +1 -1
- data/lib/sendbird/group_channel.rb +40 -36
- data/lib/sendbird/group_channel_api.rb +48 -0
- data/lib/sendbird/invalid_request.rb +4 -0
- data/lib/sendbird/message.rb +33 -31
- data/lib/sendbird/message_api.rb +42 -0
- data/lib/sendbird/{meta_counter.rb → meta_counter_api.rb} +1 -1
- data/lib/sendbird/{meta_data.rb → meta_data_api.rb} +1 -1
- data/lib/sendbird/{open_channel.rb → open_channel_api.rb} +1 -1
- data/lib/sendbird/request_handler.rb +41 -0
- data/lib/sendbird/request_handler/request.rb +41 -0
- data/lib/sendbird/request_handler/request_merger.rb +44 -0
- data/lib/sendbird/user.rb +149 -27
- data/lib/sendbird/user_api.rb +1 -1
- data/lib/sendbird/version.rb +1 -1
- metadata +12 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 96641c7ad6c001d69d96555bcae0d61fbf6fa3db
|
4
|
+
data.tar.gz: 7fc0e43271a581040130ff43e7444151c333b3db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3dbe8cb40265ff89e2b23ca19875d35860a65d51df3d8b02ba2fe4fe53ff35443cea9b1639cd3e6dea032b1f534bad2764e9be154d6e2a2c7940f1de1ad56431
|
7
|
+
data.tar.gz: 4244a7940324e66f5a70746cffff360353c79df2f518493d1a01a10a44bc7ff6701345696c8967725a5568b315a8ed4bd8a5511176c80f8300cc5e9cad576920
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,28 +1,254 @@
|
|
1
1
|
# Sendbird
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
Sendbird is a ruby Wrapper for the Sendbird [API](https://docs.sendbird.com/platform)
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
9
|
-
Add this line to your application's Gemfile:
|
10
|
-
|
11
7
|
```ruby
|
12
8
|
gem 'sendbird'
|
13
9
|
```
|
14
10
|
|
15
|
-
|
11
|
+
## Requirements
|
16
12
|
|
17
|
-
|
13
|
+
You must provide:
|
14
|
+
- Your list of applications, been the Applications name and its Api Key.
|
15
|
+
- Your username and password.
|
16
|
+
You can find your applications list [here](https://dashboard.sendbird.com).
|
17
|
+
By setting a default, will set the api_key in the request where need, if not you will have to provide a app parameter to every method call.
|
18
18
|
|
19
|
-
Or install it yourself as:
|
20
19
|
|
21
|
-
|
20
|
+
Rails way:
|
21
|
+
```ruby
|
22
|
+
Sendbird.config do |c|
|
23
|
+
c.applications = {app_name: 'API_KEY'}
|
24
|
+
c.user = 'username'
|
25
|
+
c.password = 'password'
|
26
|
+
c.default_app = 'app_name'
|
27
|
+
end
|
28
|
+
```
|
29
|
+
|
30
|
+
Ruby way:
|
31
|
+
```ruby
|
32
|
+
Sendbird.applications = {app_name: 'API_KEY'}
|
33
|
+
Sendbird.user = 'username'
|
34
|
+
Sendbird.password = 'password'
|
35
|
+
Sendbird.default_app = 'app_name'
|
36
|
+
```
|
22
37
|
|
23
38
|
## Usage
|
24
39
|
|
25
|
-
|
40
|
+
## Api
|
41
|
+
|
42
|
+
There are two types of classes inside the Wrapper the one ending with Api, like `Sendbird::UserApi` or `Sendbird::MessageApi`, this classes act like simple wrapper for the Sendbird api.
|
43
|
+
|
44
|
+
The Sendbird Api is quite big, to understand how to work with this gem, just remenber that every event from the api map to a class method from that Api class.
|
45
|
+
|
46
|
+
Example:
|
47
|
+
```ruby
|
48
|
+
body = {
|
49
|
+
"user_id" => "string",
|
50
|
+
"nickname" => "string",
|
51
|
+
"profile_url" => "string",
|
52
|
+
"issue_access_token" => "boolean"
|
53
|
+
}
|
54
|
+
Sendbird::UserApi.create(body)
|
55
|
+
```
|
56
|
+
|
57
|
+
All methods that accept a variables in the uri, they will argument in order for the method, and all request arguments or parameters, are the last arguments as hash.
|
58
|
+
|
59
|
+
Example for event [Message send](https://docs.sendbird.com/platform#messages):
|
60
|
+
```ruby
|
61
|
+
request_body = {
|
62
|
+
"message_type" => "MESG",
|
63
|
+
"user_id" => "string",
|
64
|
+
"message" => "string",
|
65
|
+
"data" => "string",
|
66
|
+
"mark_as_read" => "boolean"
|
67
|
+
}
|
68
|
+
Sendbird::MessageApi.send('group_channels', 'group_channels_url', request_body)
|
69
|
+
```
|
70
|
+
|
71
|
+
Example for event [User list](https://docs.sendbird.com/platform#messages):
|
72
|
+
```ruby
|
73
|
+
request_parameters = {
|
74
|
+
"token" => "string",
|
75
|
+
"limit" => "int",
|
76
|
+
"user_ids" => "string"
|
77
|
+
}
|
78
|
+
Sendbird::UserApi.list(request_parameters)
|
79
|
+
```
|
80
|
+
|
81
|
+
Example for sending a message to a different app:
|
82
|
+
```ruby
|
83
|
+
request_parameters = {
|
84
|
+
"token" => "string",
|
85
|
+
"limit" => "int",
|
86
|
+
"user_ids" => "string",
|
87
|
+
"app" => 'string' # This app has to be in the configuration
|
88
|
+
}
|
89
|
+
Sendbird::UserApi.list(request_parameters)
|
90
|
+
```
|
91
|
+
|
92
|
+
All methods return a `Sendbird::Response` with have the next methods:
|
93
|
+
#### body
|
94
|
+
Returns the parsed body of the request
|
95
|
+
#### status
|
96
|
+
Returns the status code of the request
|
97
|
+
#### error_code
|
98
|
+
Returns the error_code from the request, if their is one
|
99
|
+
#### error_message
|
100
|
+
Returns the error_message from the request, if their is one
|
101
|
+
|
102
|
+
## List of all classes and it's class methods.
|
103
|
+
|
104
|
+
### Sendbird::UserApi
|
105
|
+
```ruby
|
106
|
+
view(user_id)
|
107
|
+
create(body)
|
108
|
+
list(params={})
|
109
|
+
update(user_id, body)
|
110
|
+
unread_count(user_id)
|
111
|
+
activate(user_id, body)
|
112
|
+
block(user_id, body)
|
113
|
+
unblock(user_id, unblock_user_id)
|
114
|
+
block_list(user_id, params={})
|
115
|
+
mark_as_read_all(user_id)
|
116
|
+
register_gcm_token(user_id, token)
|
117
|
+
register_apns_token(user_id, token)
|
118
|
+
unregister_gcm_token(user_id, token)
|
119
|
+
unregister_apns_token(user_id, token)
|
120
|
+
unregister_all_device_token(user_id)
|
121
|
+
push_preferences(user_id)
|
122
|
+
update_push_preferences(user_id, body)
|
123
|
+
delete_push_preferences(user_id)
|
124
|
+
```
|
125
|
+
|
126
|
+
### Sendbird::OpenChannelApi
|
127
|
+
```ruby
|
128
|
+
view(channel_url, params={})
|
129
|
+
create(body={})
|
130
|
+
list(params={})
|
131
|
+
destroy(channel_url)
|
132
|
+
update(channel_url, body)
|
133
|
+
participants(channel_url, params)
|
134
|
+
freeze(channel_url, body)
|
135
|
+
ban_user(channel_url, body)
|
136
|
+
ban_list(channel_url, params={})
|
137
|
+
ban_update(channel_url, user_id, body)
|
138
|
+
ban_delete(channel_url, user_id)
|
139
|
+
ban_view(channel_url, user_id)
|
140
|
+
mute(channel_url, body)
|
141
|
+
mute_list(channel_url, params={})
|
142
|
+
mute_delete(channel_url, user_id)
|
143
|
+
mute_view(channel_url, user_id)
|
144
|
+
```
|
145
|
+
|
146
|
+
### Sendbird::GroupChannelApi
|
147
|
+
```ruby
|
148
|
+
create(body)
|
149
|
+
list(params={})
|
150
|
+
update(channel_url, body)
|
151
|
+
destroy(channel_url)
|
152
|
+
view(channel_url, params={})
|
153
|
+
members(channel_url, params={})
|
154
|
+
is_member?(channel_url, user_id)
|
155
|
+
invite(channel_url, body)
|
156
|
+
hide(channel_url, body)
|
157
|
+
leave(channel_url, body)
|
158
|
+
```
|
159
|
+
|
160
|
+
### Sendbird::MetaCounterApi && Sendbird::MetaDataApi
|
161
|
+
```ruby
|
162
|
+
create(channel_type, channel_url, body)
|
163
|
+
view(channel_type, channel_url, params={})
|
164
|
+
view_by_key(channel_type, channel_url, key)
|
165
|
+
update(channel_type, channel_url, body)
|
166
|
+
update_by_key(channel_type, channel_url, key, body)
|
167
|
+
destroy(channel_type, channel_url)
|
168
|
+
destroy_by_key(channel_type, channel_url, key)
|
169
|
+
```
|
170
|
+
|
171
|
+
### Sendbird::ApplicationApi
|
172
|
+
```ruby
|
173
|
+
create(body)
|
174
|
+
list(params={})
|
175
|
+
destroy_all
|
176
|
+
destroy
|
177
|
+
profanaty(body={})
|
178
|
+
ccu
|
179
|
+
mau(params={})
|
180
|
+
dau(params={})
|
181
|
+
daily_message_count(params={})
|
182
|
+
gcm_push_configuration
|
183
|
+
apns_push_configuration
|
184
|
+
```
|
185
|
+
|
186
|
+
## Interface
|
187
|
+
|
188
|
+
This is the second type of class inside the gem, acts as interface.
|
189
|
+
|
190
|
+
Currently only supporting `User`, in the future I will add the rest of interfaces.
|
191
|
+
|
192
|
+
There are three ways to interact with the user interface:
|
193
|
+
|
194
|
+
#### Block
|
195
|
+
```ruby
|
196
|
+
Sendbird::User.new('testing_user_interface_1') do |u|
|
197
|
+
u.nickname('Yolo')
|
198
|
+
u.profile_url('udbue')
|
199
|
+
u.timezone('Europe/London')
|
200
|
+
u.request!
|
201
|
+
end
|
202
|
+
```
|
203
|
+
|
204
|
+
#### Chain Methods
|
205
|
+
```ruby
|
206
|
+
user = Sendbird::User.new('testing_user_interface_1')
|
207
|
+
user.nickname('Yolo').profile_url('udbue').timezone('Europe/London').request!
|
208
|
+
```
|
209
|
+
|
210
|
+
#### Simple methods
|
211
|
+
```ruby
|
212
|
+
user = Sendbird::User.new('testing_user_interface_1')
|
213
|
+
user.nickname='Yolo'
|
214
|
+
user.profile_url=('udbue')
|
215
|
+
user.timezone=('Europe/London')
|
216
|
+
user.request!
|
217
|
+
```
|
218
|
+
|
219
|
+
This interface provide you with multiple methods to work with the Sendbird Api:
|
220
|
+
|
221
|
+
```ruby
|
222
|
+
user_information=(user_information={})
|
223
|
+
nickname=(nickname)
|
224
|
+
profile_url=(profile_url)
|
225
|
+
issue_access_token=(issue_access_token)
|
226
|
+
push_preferences=(push_preferences={})
|
227
|
+
timezone=(timezone)
|
228
|
+
start_hour=(start_hour)
|
229
|
+
end_hour=(end_hour)
|
230
|
+
start_min=(start_min)
|
231
|
+
end_min=(end_min)
|
232
|
+
activate
|
233
|
+
deactivate
|
234
|
+
mark_as_read_all
|
235
|
+
register_gcm_token(token)
|
236
|
+
register_apns_token(token)
|
237
|
+
unregister_gcm_token(token)
|
238
|
+
unregister_apns_token(token)
|
239
|
+
unregister_all_device_token
|
240
|
+
```
|
241
|
+
|
242
|
+
The interface will store all the pending requests called before the `request!`, when triggering the `request!` method will optimize how many request, have to be done, you don't have to worry about that.
|
243
|
+
|
244
|
+
The User interface also provide some attributes: `gcm_tokens` and `apns_tokens`, they will store the different token this user have, so by triggering any of the `register_*` methods will store or remove from this attributes.
|
245
|
+
|
246
|
+
The user interface also provide some getter methods that will execute the request instantly, this methods return the info response body. This methods are:
|
247
|
+
```ruby
|
248
|
+
get_user
|
249
|
+
get_unread_count
|
250
|
+
get_push_preferences
|
251
|
+
```
|
26
252
|
|
27
253
|
## Development
|
28
254
|
|
@@ -38,4 +264,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERN
|
|
38
264
|
## License
|
39
265
|
|
40
266
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
41
|
-
|
data/config/secrets.example.yml
CHANGED
data/lib/sendbird.rb
CHANGED
@@ -1,14 +1,19 @@
|
|
1
1
|
require "sendbird/client"
|
2
2
|
require "sendbird/configuration"
|
3
|
+
require "sendbird/invalid_request"
|
3
4
|
require "sendbird/response"
|
5
|
+
require "sendbird/request_handler"
|
6
|
+
require "sendbird/application_api"
|
4
7
|
require "sendbird/user_api"
|
5
8
|
require "sendbird/user"
|
6
|
-
require "sendbird/
|
9
|
+
require "sendbird/open_channel_api"
|
10
|
+
require "sendbird/group_channel_api"
|
7
11
|
require "sendbird/group_channel"
|
12
|
+
require "sendbird/message_api"
|
8
13
|
require "sendbird/message"
|
9
14
|
require "sendbird/meta_base"
|
10
|
-
require "sendbird/
|
11
|
-
require "sendbird/
|
15
|
+
require "sendbird/meta_data_api"
|
16
|
+
require "sendbird/meta_counter_api"
|
12
17
|
require "sendbird/version"
|
13
18
|
|
14
19
|
module Sendbird
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Sendbird
|
2
|
+
class ApplicationApi
|
3
|
+
extend Client
|
4
|
+
ENDPOINT = 'applications'.freeze
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def create(body)
|
8
|
+
post_http_basic(path: build_url, body: body)
|
9
|
+
end
|
10
|
+
|
11
|
+
def list(params={})
|
12
|
+
get_http_basic(path: build_url, params: params)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Right now this endpoint is failing in there site
|
16
|
+
# def view
|
17
|
+
# get(path: build_url)
|
18
|
+
# end
|
19
|
+
|
20
|
+
def destroy_all
|
21
|
+
delete_http_basic(path: build_url)
|
22
|
+
end
|
23
|
+
|
24
|
+
def destroy
|
25
|
+
delete(path: build_url)
|
26
|
+
end
|
27
|
+
|
28
|
+
def profanaty(body={})
|
29
|
+
put(path: build_url('profanity'), body: body)
|
30
|
+
end
|
31
|
+
|
32
|
+
def ccu
|
33
|
+
get(path: build_url('ccu'))
|
34
|
+
end
|
35
|
+
|
36
|
+
def mau(params={})
|
37
|
+
get(path: build_url('mau'), params: params)
|
38
|
+
end
|
39
|
+
|
40
|
+
def dau(params={})
|
41
|
+
get(path: build_url('dau'), params: params)
|
42
|
+
end
|
43
|
+
|
44
|
+
def daily_message_count(params={})
|
45
|
+
get(path: build_url('daily_count'), params: params)
|
46
|
+
end
|
47
|
+
|
48
|
+
def gcm_push_configuration
|
49
|
+
get(path: build_url('push', 'gcm'))
|
50
|
+
end
|
51
|
+
|
52
|
+
def apns_push_configuration
|
53
|
+
get(path: build_url('push', 'apns'))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/sendbird/client.rb
CHANGED
@@ -3,12 +3,24 @@ require 'faraday'
|
|
3
3
|
module Sendbird
|
4
4
|
module Client
|
5
5
|
class ApiKeyMissingError < StandardError; end
|
6
|
+
class HttpBasicMissing < StandardError; end
|
7
|
+
class NotValidApplication < StandardError; end
|
8
|
+
|
6
9
|
PUBLIC_METHODS = [:get, :post, :put, :delete]
|
7
10
|
|
8
11
|
PUBLIC_METHODS.each do |method|
|
9
12
|
define_method(method) do |path: , params: nil , body: nil|
|
10
|
-
|
11
|
-
|
13
|
+
params, body, app = get_app_from_params_or_body(params, body)
|
14
|
+
fail ApiKeyMissingError.new(api_key_message) unless api_key(app)
|
15
|
+
response = api_token_request(method: method, path: path, params: params, body: body)
|
16
|
+
Response.new(response.status, response.body)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
PUBLIC_METHODS.each do |method|
|
21
|
+
define_method("#{method}_http_basic") do |path: , params: nil , body: nil|
|
22
|
+
fail HttpBasicMissing.new(http_basic_message) if sendbird_user.nil? || sendbird_password.nil?
|
23
|
+
response = http_basic_request(method: method, path: path, params: params, body: body)
|
12
24
|
Response.new(response.status, response.body)
|
13
25
|
end
|
14
26
|
end
|
@@ -22,7 +34,33 @@ module Sendbird
|
|
22
34
|
end
|
23
35
|
end
|
24
36
|
|
37
|
+
|
25
38
|
private
|
39
|
+
|
40
|
+
def get_app_from_params_or_body(params, body)
|
41
|
+
app = if params && params.has_key?(:app)
|
42
|
+
params.delete(:app)
|
43
|
+
elsif body && body.has_key?(:app)
|
44
|
+
body.delete(:app)
|
45
|
+
else
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
[params, body, app]
|
49
|
+
end
|
50
|
+
|
51
|
+
def api_key(app)
|
52
|
+
if app
|
53
|
+
if api_key = Sendbird.applications[app]
|
54
|
+
@api_key = api_key
|
55
|
+
else
|
56
|
+
fail NotValidApplication.new(invalid_application_message(app))
|
57
|
+
end
|
58
|
+
else
|
59
|
+
@api_key = Sendbird.applications[Sendbird.default_app]
|
60
|
+
end
|
61
|
+
@api_key
|
62
|
+
end
|
63
|
+
|
26
64
|
def conn
|
27
65
|
@conn ||= Faraday.new(url: Sendbird::Configuration::SENDBIRD_ENDPOINT) do |c|
|
28
66
|
c.request :url_encoded
|
@@ -30,17 +68,49 @@ module Sendbird
|
|
30
68
|
end
|
31
69
|
end
|
32
70
|
|
33
|
-
def
|
71
|
+
def http_basic_conn
|
72
|
+
@http_basic_conn ||= Faraday.new(url: Sendbird::Configuration::SENDBIRD_ENDPOINT) do |c|
|
73
|
+
c.request :url_encoded
|
74
|
+
c.adapter Faraday.default_adapter
|
75
|
+
c.basic_auth(sendbird_user, sendbird_password)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def sendbird_user
|
80
|
+
Sendbird.user
|
81
|
+
end
|
82
|
+
|
83
|
+
def sendbird_password
|
84
|
+
Sendbird.password
|
85
|
+
end
|
86
|
+
|
87
|
+
def api_token_request(method:, path:, params:, body:)
|
34
88
|
conn.send(method) do |req|
|
35
89
|
req.url path, params
|
36
|
-
req.headers['Api-Token'] =
|
90
|
+
req.headers['Api-Token'] = @api_key
|
91
|
+
req.headers['Content-Type'] = 'application/json, charset=utf8'
|
92
|
+
req.body = body.to_json if body
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def http_basic_request(method:, path:, params:, body:)
|
97
|
+
http_basic_conn.send(method) do |req|
|
98
|
+
req.url path, params
|
37
99
|
req.headers['Content-Type'] = 'application/json, charset=utf8'
|
38
100
|
req.body = body.to_json if body
|
39
101
|
end
|
40
102
|
end
|
41
103
|
|
42
104
|
def api_key_message
|
43
|
-
'
|
105
|
+
'Plase set up your applications and default_app'
|
106
|
+
end
|
107
|
+
|
108
|
+
def http_basic_message
|
109
|
+
'Please set up you http basic information to be able to execute this requets'
|
110
|
+
end
|
111
|
+
|
112
|
+
def invalid_application_message(app)
|
113
|
+
"Application name (#{app}) not found in the configuration, please check your configuration"
|
44
114
|
end
|
45
115
|
end
|
46
116
|
end
|
@@ -1,48 +1,52 @@
|
|
1
1
|
module Sendbird
|
2
2
|
class GroupChannel
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
put(path: build_url(channel_url), body: body)
|
17
|
-
end
|
18
|
-
|
19
|
-
def destroy(channel_url)
|
20
|
-
delete(path: build_url(channel_url))
|
21
|
-
end
|
3
|
+
class MissingUserId < StandardError; end
|
4
|
+
include RequestHandler
|
5
|
+
|
6
|
+
api_class GroupChannelApi
|
7
|
+
default_arg :channel_url
|
8
|
+
|
9
|
+
attr_reader :channel_url, :user_id, :pending_requests
|
10
|
+
def initialize(channel_url, user_id = :missing_user_id)
|
11
|
+
@channel_url = channel_url
|
12
|
+
@user_id = user_id
|
13
|
+
@pending_requests = {}
|
14
|
+
yield(self) if block_given?
|
15
|
+
end
|
22
16
|
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
def name=(name)
|
18
|
+
merge_arguments(:update, {name: name})
|
19
|
+
self
|
20
|
+
end
|
26
21
|
|
27
|
-
|
28
|
-
|
29
|
-
|
22
|
+
def cover_url=(cover_url)
|
23
|
+
merge_arguments(:update, {cover_url: cover_url})
|
24
|
+
self
|
25
|
+
end
|
30
26
|
|
31
|
-
|
32
|
-
|
33
|
-
|
27
|
+
def data=(data)
|
28
|
+
merge_arguments(:update, {data: data})
|
29
|
+
self
|
30
|
+
end
|
34
31
|
|
35
|
-
|
36
|
-
|
37
|
-
|
32
|
+
def is_distinct=(is_distinct)
|
33
|
+
merge_arguments(:update, {is_distinct: is_distinct})
|
34
|
+
self
|
35
|
+
end
|
38
36
|
|
39
|
-
|
40
|
-
|
41
|
-
|
37
|
+
def send_message(type, data)
|
38
|
+
message.send(type, data)
|
39
|
+
end
|
42
40
|
|
43
|
-
|
44
|
-
|
41
|
+
def message
|
42
|
+
return @message if defined?(@message)
|
43
|
+
if user_id == :missing_user_id
|
44
|
+
raise MissingUserId, 'Please provide an user_id at initialize to been able to use send_message'
|
45
45
|
end
|
46
|
+
@message ||= Message.new(user_id, channel_url, 'group_channels')
|
46
47
|
end
|
48
|
+
|
49
|
+
private
|
50
|
+
attr_writer :pending_requests
|
47
51
|
end
|
48
52
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Sendbird
|
2
|
+
class GroupChannelApi
|
3
|
+
extend Client
|
4
|
+
ENDPOINT = 'group_channels'.freeze
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def create(body)
|
8
|
+
post(path: build_url, body: body)
|
9
|
+
end
|
10
|
+
|
11
|
+
def list(params={})
|
12
|
+
get(path: build_url, params: params)
|
13
|
+
end
|
14
|
+
|
15
|
+
def update(channel_url, body)
|
16
|
+
put(path: build_url(channel_url), body: body)
|
17
|
+
end
|
18
|
+
|
19
|
+
def destroy(channel_url)
|
20
|
+
delete(path: build_url(channel_url))
|
21
|
+
end
|
22
|
+
|
23
|
+
def view(channel_url, params={})
|
24
|
+
get(path: build_url(channel_url), params: params)
|
25
|
+
end
|
26
|
+
|
27
|
+
def members(channel_url, params={})
|
28
|
+
get(path: build_url(channel_url, 'members'), params: params)
|
29
|
+
end
|
30
|
+
|
31
|
+
def is_member?(channel_url, user_id)
|
32
|
+
get(path: build_url(channel_url, 'members', user_id))
|
33
|
+
end
|
34
|
+
|
35
|
+
def invite(channel_url, body)
|
36
|
+
post(path: build_url(channel_url, 'invite'), body: body)
|
37
|
+
end
|
38
|
+
|
39
|
+
def hide(channel_url, body)
|
40
|
+
put(path: build_url(channel_url, 'hide'), body: body)
|
41
|
+
end
|
42
|
+
|
43
|
+
def leave(channel_url, body)
|
44
|
+
put(path: build_url(channel_url, 'leave'), body: body)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/sendbird/message.rb
CHANGED
@@ -1,42 +1,44 @@
|
|
1
1
|
module Sendbird
|
2
2
|
class Message
|
3
|
-
|
3
|
+
class InvalidMessageType < StandardError; end
|
4
|
+
attr_reader :user_id, :channel_url, :channel_type
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
# Get messages function can be called only
|
11
|
-
# from Park or Enterprise plan.
|
12
|
-
def list(channel_type, channel_url, params)
|
13
|
-
get(path: build_url(channel_type, channel_url, 'messages'), params: params)
|
14
|
-
end
|
15
|
-
|
16
|
-
def view(channel_type, channel_url, message_id)
|
17
|
-
get(path: build_url(channel_type, channel_url, 'messages', message_id))
|
18
|
-
end
|
19
|
-
|
20
|
-
def destroy(channel_type, channel_url, message_id)
|
21
|
-
delete(path: build_url(channel_type, channel_url, 'messages', message_id))
|
22
|
-
end
|
23
|
-
|
24
|
-
def mark_as_read(channel_type, channel_url, body)
|
25
|
-
put(path: build_url(channel_type, channel_url, 'messages', 'mark_as_read'), body: body)
|
26
|
-
end
|
6
|
+
def initialize(user_id, channel_url, channel_type)
|
7
|
+
@user_id = user_id
|
8
|
+
@channel_url = channel_url
|
9
|
+
@channel_type = channel_type
|
10
|
+
end
|
27
11
|
|
28
|
-
|
29
|
-
|
30
|
-
|
12
|
+
def send(type, data)
|
13
|
+
MessageApi.send(channel_type, channel_url, message_body(type).merge(data))
|
14
|
+
self
|
15
|
+
end
|
31
16
|
|
32
|
-
|
33
|
-
|
17
|
+
private
|
18
|
+
def message_type(type)
|
19
|
+
case type
|
20
|
+
when :text then 'MESG'
|
21
|
+
when :file then 'FILE'
|
22
|
+
when :admin then 'ADMM'
|
23
|
+
else
|
24
|
+
raise InvalidMessageType, "Please provide a valid message type, valid types are: [:text, :file, :admin]"
|
34
25
|
end
|
35
26
|
end
|
36
27
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
28
|
+
def message_body(type)
|
29
|
+
case type
|
30
|
+
when :text, :file
|
31
|
+
{
|
32
|
+
"message_type": message_type(type),
|
33
|
+
"user_id": user_id
|
34
|
+
}
|
35
|
+
when :admin
|
36
|
+
{
|
37
|
+
"message_type": message_type(type),
|
38
|
+
}
|
39
|
+
else
|
40
|
+
raise InvalidMessageType, "Please provide a valid message type, valid types are: [:text, :file, :admin]"
|
41
|
+
end
|
40
42
|
end
|
41
43
|
end
|
42
44
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Sendbird
|
2
|
+
class MessageApi
|
3
|
+
extend Client
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def send(channel_type, channel_url, body)
|
7
|
+
post(path: build_url(channel_type, channel_url, 'messages'), body: body)
|
8
|
+
end
|
9
|
+
|
10
|
+
# Get messages function can be called only
|
11
|
+
# from Park or Enterprise plan.
|
12
|
+
def list(channel_type, channel_url, params)
|
13
|
+
get(path: build_url(channel_type, channel_url, 'messages'), params: params)
|
14
|
+
end
|
15
|
+
|
16
|
+
def view(channel_type, channel_url, message_id)
|
17
|
+
get(path: build_url(channel_type, channel_url, 'messages', message_id))
|
18
|
+
end
|
19
|
+
|
20
|
+
def destroy(channel_type, channel_url, message_id)
|
21
|
+
delete(path: build_url(channel_type, channel_url, 'messages', message_id))
|
22
|
+
end
|
23
|
+
|
24
|
+
def mark_as_read(channel_type, channel_url, body)
|
25
|
+
put(path: build_url(channel_type, channel_url, 'messages', 'mark_as_read'), body: body)
|
26
|
+
end
|
27
|
+
|
28
|
+
def count(channel_type, channel_url)
|
29
|
+
get(path: build_url(channel_type, channel_url, 'messages', 'total_count'))
|
30
|
+
end
|
31
|
+
|
32
|
+
def unread_count(channel_type, channel_url, params)
|
33
|
+
get(path: build_url(channel_type, channel_url, 'messages', 'unread_count'), params: params)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.build_url(*args)
|
38
|
+
args_dup = args.dup
|
39
|
+
args_dup.join('/')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_relative "./request_handler/request"
|
2
|
+
require_relative "./request_handler/request_merger"
|
3
|
+
|
4
|
+
module Sendbird
|
5
|
+
module RequestHandler
|
6
|
+
def self.included(base)
|
7
|
+
base.extend ClassMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
def request!
|
11
|
+
Request.new(pending_requests, api_class, default_arg).execute
|
12
|
+
rescue InvalidRequest => e
|
13
|
+
raise e
|
14
|
+
ensure
|
15
|
+
self.pending_requests = {}
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def merge_arguments(method, args, callback=nil)
|
20
|
+
self.pending_requests = RequestMerger.call(pending_requests, method, args, callback)
|
21
|
+
end
|
22
|
+
|
23
|
+
def default_arg
|
24
|
+
self.send(self.class.instance_variable_get(:@default_arg))
|
25
|
+
end
|
26
|
+
|
27
|
+
def api_class
|
28
|
+
self.class.instance_variable_get(:@api_class)
|
29
|
+
end
|
30
|
+
|
31
|
+
module ClassMethods
|
32
|
+
def api_class(api_class)
|
33
|
+
@api_class = api_class
|
34
|
+
end
|
35
|
+
|
36
|
+
def default_arg(method)
|
37
|
+
@default_arg = method
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Sendbird
|
2
|
+
module RequestHandler
|
3
|
+
class Request
|
4
|
+
attr_reader :pending_requests, :api_class, :default_argument
|
5
|
+
def initialize(pending_requests, api_class, default_argument)
|
6
|
+
@pending_requests = pending_requests
|
7
|
+
@api_class = api_class
|
8
|
+
@default_argument = default_argument
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute
|
12
|
+
pending_requests.each do |method, params|
|
13
|
+
response = case params[:args]
|
14
|
+
when Array
|
15
|
+
if params[:args].any?
|
16
|
+
api_class.send(method, default_argument, *params[:args])
|
17
|
+
else
|
18
|
+
api_class.send(method, default_argument)
|
19
|
+
end
|
20
|
+
when Hash
|
21
|
+
api_class.send(method, default_argument, params[:args])
|
22
|
+
end
|
23
|
+
handle_response_status(response, method, params[:args])
|
24
|
+
execute_callbacks(params[:callback], response)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def handle_response_status(response, method, arguments)
|
29
|
+
if response.status != 200
|
30
|
+
raise InvalidRequest, "#{response.error_message} executing #{method} with arguments: #{arguments}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def execute_callbacks(callbacks, response)
|
35
|
+
callbacks.each do |cb|
|
36
|
+
cb.call(response)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Sendbird
|
2
|
+
module RequestHandler
|
3
|
+
class RequestMerger
|
4
|
+
def self.call(pending_requests, method, args, callback)
|
5
|
+
new(pending_requests, method, args, callback).merge
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader :pending_requests, :method, :args, :callback
|
9
|
+
def initialize(pending_requests, method, args, callback)
|
10
|
+
@pending_requests = pending_requests
|
11
|
+
@method = method
|
12
|
+
@args = args
|
13
|
+
@callback = callback
|
14
|
+
end
|
15
|
+
|
16
|
+
def merge
|
17
|
+
pending_requests[method] ||= {}
|
18
|
+
case args
|
19
|
+
when Hash
|
20
|
+
merge_hash_arguments(args)
|
21
|
+
else
|
22
|
+
merge_rest_of_arguments(args)
|
23
|
+
end
|
24
|
+
append_callbacks(args)
|
25
|
+
pending_requests
|
26
|
+
end
|
27
|
+
|
28
|
+
def merge_hash_arguments(args)
|
29
|
+
pending_requests[method][:args] ||= {}
|
30
|
+
pending_requests[method][:args] = pending_requests[method][:args].merge(args)
|
31
|
+
end
|
32
|
+
|
33
|
+
def merge_rest_of_arguments(args)
|
34
|
+
pending_requests[method][:args] ||= []
|
35
|
+
pending_requests[method][:args] = pending_requests[method][:args] << args if args
|
36
|
+
end
|
37
|
+
|
38
|
+
def append_callbacks(args)
|
39
|
+
pending_requests[method][:callback] ||= []
|
40
|
+
pending_requests[method][:callback] = pending_requests[method][:callback] << callback if callback
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/sendbird/user.rb
CHANGED
@@ -1,56 +1,178 @@
|
|
1
1
|
module Sendbird
|
2
|
-
class User
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
2
|
+
class User
|
3
|
+
include RequestHandler
|
4
|
+
|
5
|
+
api_class UserApi
|
6
|
+
default_arg :user_id
|
7
|
+
|
8
|
+
attr_reader :user_id, :pending_requests, :gcm_tokens, :apns_tokens
|
9
|
+
def initialize(user_id)
|
10
|
+
@user_id = user_id
|
11
|
+
@gcm_tokens = []
|
12
|
+
@apns_tokens = []
|
13
|
+
@pending_requests = {}
|
14
|
+
yield(self) if block_given?
|
15
|
+
end
|
16
|
+
|
17
|
+
def in_sync?
|
18
|
+
pending_requests.empty?
|
19
|
+
end
|
20
|
+
|
21
|
+
#Getters
|
22
|
+
def get_user
|
23
|
+
response = UserApi.view(user_id)
|
24
|
+
if response.status == 200
|
25
|
+
response.body
|
26
|
+
else
|
27
|
+
raise InvalidRequest.new(
|
28
|
+
error_message(
|
29
|
+
response.error_message,
|
30
|
+
__method__,
|
31
|
+
user_id
|
32
|
+
)
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_unread_count
|
38
|
+
response = UserApi.unread_count(user_id)
|
39
|
+
if response.status == 200
|
40
|
+
response.body['unread_count']
|
41
|
+
else
|
42
|
+
raise InvalidRequest.new(
|
43
|
+
error_message(
|
44
|
+
response.error_message,
|
45
|
+
__method__,
|
46
|
+
user_id
|
47
|
+
)
|
48
|
+
)
|
15
49
|
end
|
16
50
|
end
|
17
51
|
|
18
|
-
|
52
|
+
def get_push_preferences
|
53
|
+
response = UserApi.push_preferences(user_id)
|
54
|
+
if response.status == 200
|
55
|
+
response.body
|
56
|
+
else
|
57
|
+
raise InvalidRequest.new(
|
58
|
+
error_message(
|
59
|
+
response.error_message,
|
60
|
+
__method__,
|
61
|
+
user_id
|
62
|
+
)
|
63
|
+
)
|
64
|
+
end
|
65
|
+
end
|
19
66
|
|
20
|
-
|
21
|
-
|
67
|
+
# Setters
|
68
|
+
def user_information=(user_information={})
|
69
|
+
merge_arguments(:update, user_information)
|
70
|
+
self
|
22
71
|
end
|
72
|
+
alias_method :user_information, :user_information=
|
23
73
|
|
24
|
-
def
|
25
|
-
|
74
|
+
def nickname=(nickname)
|
75
|
+
merge_arguments(:update, {nickname: nickname})
|
76
|
+
self
|
26
77
|
end
|
78
|
+
alias_method :nickname, :nickname=
|
27
79
|
|
28
|
-
def
|
29
|
-
|
80
|
+
def profile_url=(profile_url)
|
81
|
+
merge_arguments(:update, {profile_url: profile_url})
|
82
|
+
self
|
30
83
|
end
|
84
|
+
alias_method :profile_url, :profile_url=
|
31
85
|
|
32
|
-
def
|
33
|
-
|
86
|
+
def issue_access_token=(issue_access_token)
|
87
|
+
merge_arguments(:update, {issue_access_token: issue_access_token})
|
88
|
+
self
|
89
|
+
end
|
90
|
+
alias_method :issue_access_token, :issue_access_token=
|
91
|
+
|
92
|
+
def activate
|
93
|
+
merge_arguments(:activate, { activate: true })
|
94
|
+
self
|
95
|
+
end
|
96
|
+
|
97
|
+
def deactivate
|
98
|
+
merge_arguments(:activate, { activate: false })
|
99
|
+
self
|
100
|
+
end
|
101
|
+
|
102
|
+
def push_preferences=(push_preferences={})
|
103
|
+
merge_arguments(:update_push_preferences, push_preferences)
|
104
|
+
self
|
34
105
|
end
|
106
|
+
alias_method :push_preferences, :push_preferences=
|
107
|
+
|
108
|
+
def timezone=(timezone)
|
109
|
+
merge_arguments(:update_push_preferences, { timezone: timezone })
|
110
|
+
self
|
111
|
+
end
|
112
|
+
alias_method :timezone, :timezone=
|
113
|
+
|
114
|
+
def start_hour=(start_hour)
|
115
|
+
merge_arguments(:update_push_preferences, { start_hour: start_hour })
|
116
|
+
self
|
117
|
+
end
|
118
|
+
alias_method :start_hour, :start_hour=
|
119
|
+
|
120
|
+
def end_hour=(end_hour)
|
121
|
+
merge_arguments(:update_push_preferences, { end_hour: end_hour })
|
122
|
+
self
|
123
|
+
end
|
124
|
+
alias_method :end_hour, :end_hour=
|
125
|
+
|
126
|
+
def start_min=(start_min)
|
127
|
+
merge_arguments(:update_push_preferences, { start_min: start_min })
|
128
|
+
self
|
129
|
+
end
|
130
|
+
alias_method :start_min, :start_min=
|
131
|
+
|
132
|
+
def end_min=(end_min)
|
133
|
+
merge_arguments(:update_push_preferences, { end_min: end_min })
|
134
|
+
self
|
135
|
+
end
|
136
|
+
alias_method :end_min, :end_min=
|
35
137
|
|
36
138
|
def register_gcm_token(token)
|
37
|
-
|
139
|
+
merge_arguments(:register_gcm_token, token, ->(response){ self.gcm_tokens << response.body['token'] })
|
140
|
+
self
|
38
141
|
end
|
39
142
|
|
40
143
|
def register_apns_token(token)
|
41
|
-
|
144
|
+
merge_arguments(:register_apns_token, token, ->(response){ self.apns_tokens << response.body['token'] })
|
145
|
+
self
|
42
146
|
end
|
43
147
|
|
44
148
|
def unregister_gcm_token(token)
|
45
|
-
|
149
|
+
merge_arguments(:unregister_gcm_token, token, ->(response){ self.gcm_tokens.delete(response.body['token'])})
|
150
|
+
self
|
46
151
|
end
|
47
152
|
|
48
153
|
def unregister_apns_token(token)
|
49
|
-
|
154
|
+
merge_arguments(:unregister_apns_token, token, ->(response){ self.apns_tokens.delete(response.body['token'])})
|
155
|
+
self
|
50
156
|
end
|
51
157
|
|
52
158
|
def unregister_all_device_token
|
53
|
-
|
159
|
+
merge_arguments(:unregister_all_device_token, nil, ->(response) { self.apns_tokens = []; self.gcm_tokens = []; })
|
160
|
+
self
|
161
|
+
end
|
162
|
+
|
163
|
+
def mark_as_read_all
|
164
|
+
merge_arguments(:mark_as_read_all, {})
|
165
|
+
self
|
166
|
+
end
|
167
|
+
|
168
|
+
def group_channel(channel_url)
|
169
|
+
GroupChannel.new(channel_url, user_id)
|
170
|
+
end
|
171
|
+
|
172
|
+
private
|
173
|
+
attr_writer :pending_requests, :apns_tokens, :gcm_tokens
|
174
|
+
def error_message(error_message, method_name, args)
|
175
|
+
"Invalid request for User with user_id: #{user_id}, error message: #{error_message} the request method was #{method_name} with args: #{args}"
|
54
176
|
end
|
55
177
|
end
|
56
178
|
end
|
data/lib/sendbird/user_api.rb
CHANGED
data/lib/sendbird/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sendbird
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GustavoCaso
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -128,14 +128,21 @@ files:
|
|
128
128
|
- bin/setup
|
129
129
|
- config/secrets.example.yml
|
130
130
|
- lib/sendbird.rb
|
131
|
+
- lib/sendbird/application_api.rb
|
131
132
|
- lib/sendbird/client.rb
|
132
133
|
- lib/sendbird/configuration.rb
|
133
134
|
- lib/sendbird/group_channel.rb
|
135
|
+
- lib/sendbird/group_channel_api.rb
|
136
|
+
- lib/sendbird/invalid_request.rb
|
134
137
|
- lib/sendbird/message.rb
|
138
|
+
- lib/sendbird/message_api.rb
|
135
139
|
- lib/sendbird/meta_base.rb
|
136
|
-
- lib/sendbird/
|
137
|
-
- lib/sendbird/
|
138
|
-
- lib/sendbird/
|
140
|
+
- lib/sendbird/meta_counter_api.rb
|
141
|
+
- lib/sendbird/meta_data_api.rb
|
142
|
+
- lib/sendbird/open_channel_api.rb
|
143
|
+
- lib/sendbird/request_handler.rb
|
144
|
+
- lib/sendbird/request_handler/request.rb
|
145
|
+
- lib/sendbird/request_handler/request_merger.rb
|
139
146
|
- lib/sendbird/response.rb
|
140
147
|
- lib/sendbird/user.rb
|
141
148
|
- lib/sendbird/user_api.rb
|