matrix_sdk 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/lib/matrix_sdk/api.rb +23 -3
- data/lib/matrix_sdk/client.rb +4 -3
- data/lib/matrix_sdk/errors.rb +2 -1
- data/lib/matrix_sdk/extensions.rb +1 -1
- data/lib/matrix_sdk/protocols/cs.rb +389 -51
- data/lib/matrix_sdk/room.rb +24 -13
- data/lib/matrix_sdk/version.rb +1 -1
- metadata +12 -31
- data/.gitignore +0 -9
- data/.gitlab-ci.yml +0 -41
- data/.rubocop.yml +0 -53
- data/.travis.yml +0 -5
- data/Gemfile +0 -4
- data/Rakefile +0 -15
- data/examples/simple_client.rb +0 -148
- data/matrix-sdk.gemspec +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 540f933e3c288eb2cfb590fdc95ba37b44b7e507754885a0a2f02c0227977ab8
|
4
|
+
data.tar.gz: 6ebee0cb09293d01ce214cbc718d811954d3e6265c683dce008f4538bfa7d278
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '08783bd47d2b55dfeda55bb1301d934f3314f7e642bfa6518d0233e9d29087328658729aa5288c146dbbf0c5c3ddf263bc4c1cb6c85789ff32a95e7397248f3b'
|
7
|
+
data.tar.gz: e06303208ca67b7ae2494ae11561c0a59eb1d02d6b9cfa634b0208f1161358cebdecbe44f505019358e928cd424aaa9d5dd6eaaf009192eed138c43f324e17d0
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## 1.2.0 - 2019-06-28
|
2
|
+
|
3
|
+
- Adds getters and setters for more specced room state
|
4
|
+
- Fixes handling of the timeout parameter for the sync endpoint (#7)
|
5
|
+
- Additionally also now allows for running sync with a nil timeout
|
6
|
+
- Cleans up the CS protocol implementation slightly, removing a mutation that's not supposed to be there
|
7
|
+
- Cleans up the gemspec slightly, no longer uses `git ls-files`
|
8
|
+
- Add support for explicitly setting proxy config for API
|
9
|
+
|
1
10
|
## v1.1.1 - 2019-06-05
|
2
11
|
|
3
12
|
- Fixes a faulty include which broke the single implemented S2S endpoint
|
data/lib/matrix_sdk/api.rb
CHANGED
@@ -22,7 +22,7 @@ module MatrixSdk
|
|
22
22
|
}.freeze
|
23
23
|
|
24
24
|
attr_accessor :access_token, :connection_address, :connection_port, :device_id, :autoretry, :global_headers
|
25
|
-
attr_reader :homeserver, :validate_certificate, :read_timeout, :protocols, :well_known
|
25
|
+
attr_reader :homeserver, :validate_certificate, :read_timeout, :protocols, :well_known, :proxy_uri
|
26
26
|
|
27
27
|
ignore_inspect :access_token, :logger
|
28
28
|
|
@@ -53,6 +53,7 @@ module MatrixSdk
|
|
53
53
|
@protocols = [@protocols] unless @protocols.is_a? Array
|
54
54
|
@protocols << :CS if @protocols.include?(:AS) && !@protocols.include?(:CS)
|
55
55
|
|
56
|
+
@proxy_uri = params.fetch(:proxy_uri, nil)
|
56
57
|
@connection_address = params.fetch(:address, nil)
|
57
58
|
@connection_port = params.fetch(:port, nil)
|
58
59
|
@access_token = params.fetch(:access_token, nil)
|
@@ -178,6 +179,18 @@ module MatrixSdk
|
|
178
179
|
@homeserver = hs_info
|
179
180
|
end
|
180
181
|
|
182
|
+
# @param [URI] proxy_uri The URI for the proxy to use
|
183
|
+
# @return [URI]
|
184
|
+
def proxy_uri=(proxy_uri)
|
185
|
+
proxy_uri = URI(proxy_uri.to_s) unless proxy_uri.is_a? URI
|
186
|
+
|
187
|
+
if @http && @proxy_uri != proxy_uri
|
188
|
+
@http.finish
|
189
|
+
@http = nil
|
190
|
+
end
|
191
|
+
@proxy_uri = proxy_uri
|
192
|
+
end
|
193
|
+
|
181
194
|
def request(method, api, path, **options)
|
182
195
|
url = homeserver.dup.tap do |u|
|
183
196
|
u.path = api_to_path(api) + path
|
@@ -262,8 +275,15 @@ module MatrixSdk
|
|
262
275
|
end
|
263
276
|
|
264
277
|
def http
|
265
|
-
@http
|
266
|
-
|
278
|
+
return @http if @http&.active?
|
279
|
+
|
280
|
+
host = (@connection_address || homeserver.host)
|
281
|
+
port = (@connection_port || homeserver.port)
|
282
|
+
@http ||= if proxy_uri
|
283
|
+
Net::HTTP.new(host, port, proxy_uri.host, proxy_uri.port, proxy_uri.user, proxy_uri.password)
|
284
|
+
else
|
285
|
+
Net::HTTP.new(host, port)
|
286
|
+
end
|
267
287
|
|
268
288
|
@http.read_timeout = read_timeout
|
269
289
|
@http.use_ssl = homeserver.scheme == 'https'
|
data/lib/matrix_sdk/client.rb
CHANGED
@@ -205,8 +205,9 @@ module MatrixSdk
|
|
205
205
|
ensure_room(data.room_id)
|
206
206
|
end
|
207
207
|
|
208
|
-
def join_room(room_id_or_alias)
|
209
|
-
|
208
|
+
def join_room(room_id_or_alias, server_name: [])
|
209
|
+
server_name = [server_name] unless server_name.is_a? Array
|
210
|
+
data = api.join_room(room_id_or_alias, server_name: server_name)
|
210
211
|
ensure_room(data.fetch(:room_id, room_id_or_alias))
|
211
212
|
end
|
212
213
|
|
@@ -266,7 +267,7 @@ module MatrixSdk
|
|
266
267
|
|
267
268
|
attempts = 0
|
268
269
|
data = loop do
|
269
|
-
begin
|
270
|
+
begin
|
270
271
|
break api.sync extra_params
|
271
272
|
rescue MatrixSdk::MatrixTimeoutError => e
|
272
273
|
raise e if (attempts += 1) >= params.fetch(:allow_sync_retry, 0)
|
data/lib/matrix_sdk/errors.rb
CHANGED
@@ -7,7 +7,7 @@ module MatrixSdk
|
|
7
7
|
|
8
8
|
# An error specialized and raised for failed requests
|
9
9
|
class MatrixRequestError < MatrixError
|
10
|
-
attr_reader :code, :httpstatus, :message
|
10
|
+
attr_reader :code, :data, :httpstatus, :message
|
11
11
|
alias error message
|
12
12
|
|
13
13
|
def self.class_by_code(code)
|
@@ -30,6 +30,7 @@ module MatrixSdk
|
|
30
30
|
@code = error[:errcode]
|
31
31
|
@httpstatus = status
|
32
32
|
@message = error[:error]
|
33
|
+
@data = error.reject { |k, _v| %i[errcode error].include? k }
|
33
34
|
|
34
35
|
super error[:error]
|
35
36
|
end
|
@@ -98,7 +98,7 @@ module MatrixSdk
|
|
98
98
|
|
99
99
|
def fire(event, filter = nil)
|
100
100
|
reverse_each do |_k, h|
|
101
|
-
begin
|
101
|
+
begin
|
102
102
|
h[:block].call(event) if event.matches?(h[:filter], filter)
|
103
103
|
rescue StandardError => e
|
104
104
|
logger.error "#{e.class.name} occurred when firing event (#{event})\n#{e}"
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rubocop:disable Metrics/ModuleLength
|
3
4
|
module MatrixSdk::Protocols::CS
|
4
5
|
# Gets the available client API versions
|
5
6
|
# @return [Array]
|
6
7
|
def client_api_versions
|
7
|
-
@client_api_versions ||= request(:get, :client, '/versions').versions.tap do |vers|
|
8
|
+
(@client_api_versions ||= request(:get, :client, '/versions')).versions.tap do |vers|
|
8
9
|
vers.instance_eval <<-'CODE', __FILE__, __LINE__ + 1
|
9
10
|
def latest
|
10
11
|
last
|
@@ -14,9 +15,9 @@ module MatrixSdk::Protocols::CS
|
|
14
15
|
end
|
15
16
|
|
16
17
|
# Gets the list of available unstable client API features
|
17
|
-
# @return [
|
18
|
+
# @return [Hash]
|
18
19
|
def client_api_unstable_features
|
19
|
-
@
|
20
|
+
(@client_api_versions ||= request(:get, :client, '/versions')).unstable_features.tap do |vers|
|
20
21
|
vers.instance_eval <<-'CODE', __FILE__, __LINE__ + 1
|
21
22
|
def has?(feature)
|
22
23
|
fetch(feature, nil)
|
@@ -25,8 +26,10 @@ module MatrixSdk::Protocols::CS
|
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
29
|
+
# Gets the list of available methods for logging in
|
30
|
+
# @return [Response]
|
28
31
|
def allowed_login_methods
|
29
|
-
request(:get, :client_r0, '/login')
|
32
|
+
request(:get, :client_r0, '/login')
|
30
33
|
end
|
31
34
|
|
32
35
|
# Runs the client API /sync method
|
@@ -37,16 +40,14 @@ module MatrixSdk::Protocols::CS
|
|
37
40
|
# @option params [Boolean] :full_state Should the sync include the full state
|
38
41
|
# @option params [Boolean] :set_presence Should the sync set the user status to online
|
39
42
|
# @return [Response]
|
40
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
43
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#get-matrix-client-r0-sync
|
41
44
|
# For more information on the parameters and what they mean
|
42
45
|
def sync(timeout: 30.0, **params)
|
43
|
-
query =
|
44
|
-
timeout: timeout
|
45
|
-
}.merge(params).select do |k, _v|
|
46
|
+
query = params.select do |k, _v|
|
46
47
|
%i[since filter full_state set_presence].include? k
|
47
48
|
end
|
48
49
|
|
49
|
-
query[:timeout] = (
|
50
|
+
query[:timeout] = (timeout * 1000).to_i if timeout
|
50
51
|
query[:timeout] = params.delete(:timeout_ms).to_i if params.key? :timeout_ms
|
51
52
|
query[:user_id] = params.delete(:user_id) if protocol?(:AS) && params.key?(:user_id)
|
52
53
|
|
@@ -66,7 +67,7 @@ module MatrixSdk::Protocols::CS
|
|
66
67
|
# @option params [Boolean] :store_token (true) Should the resulting access token be stored for the API
|
67
68
|
# @option params [Boolean] :store_device_id (store_token value) Should the resulting device ID be stored for the API
|
68
69
|
# @return [Response]
|
69
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
70
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#post-matrix-client-r0-register
|
70
71
|
# For options that are permitted in this call
|
71
72
|
def register(kind: 'user', **params)
|
72
73
|
query = {}
|
@@ -118,7 +119,7 @@ module MatrixSdk::Protocols::CS
|
|
118
119
|
# @option params [String] :initial_device_display_name (USER_AGENT) The device display name to specify for this login attempt
|
119
120
|
# @option params [String] :device_id The device ID to set on the login
|
120
121
|
# @return [Response] A response hash with the parameters :user_id, :access_token, :home_server, and :device_id.
|
121
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
122
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#post-matrix-client-r0-login
|
122
123
|
# The Matrix Spec, for more information about the call and response
|
123
124
|
def login(login_type: 'm.login.password', **params)
|
124
125
|
query = {}
|
@@ -142,7 +143,7 @@ module MatrixSdk::Protocols::CS
|
|
142
143
|
|
143
144
|
# Logs out the currently logged in user
|
144
145
|
# @return [Response] An empty response if the logout was successful
|
145
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
146
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#post-matrix-client-r0-logout
|
146
147
|
# The Matrix Spec, for more information about the call and response
|
147
148
|
def logout(**params)
|
148
149
|
query = {}
|
@@ -201,7 +202,7 @@ module MatrixSdk::Protocols::CS
|
|
201
202
|
# @option params [String] :room_alias A room alias to apply on creation
|
202
203
|
# @option params [Boolean] :invite Should the room be created invite-only
|
203
204
|
# @return [Response] A response hash with ...
|
204
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
205
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#post-matrix-client-r0-createroom
|
205
206
|
# The Matrix Spec, for more information about the call and response
|
206
207
|
def create_room(visibility: :public, **params)
|
207
208
|
query = {}
|
@@ -222,7 +223,7 @@ module MatrixSdk::Protocols::CS
|
|
222
223
|
# @param params [Hash] Extra room join options
|
223
224
|
# @option params [String[]] :server_name A list of servers to perform the join through
|
224
225
|
# @return [Response] A response hash with the parameter :room_id
|
225
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
226
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#post-matrix-client-r0-join-roomidoralias
|
226
227
|
# The Matrix Spec, for more information about the call and response
|
227
228
|
# @todo Add support for 3rd-party signed objects
|
228
229
|
def join_room(id_or_alias, **params)
|
@@ -245,8 +246,8 @@ module MatrixSdk::Protocols::CS
|
|
245
246
|
# @param params [Hash] Options for the request
|
246
247
|
# @option params [String] :state_key The state key of the event, if there is one
|
247
248
|
# @return [Response] A response hash with the parameter :event_id
|
248
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
249
|
-
# https://matrix.org/docs/spec/client_server/r0.
|
249
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#put-matrix-client-r0-rooms-roomid-state-eventtype-statekey
|
250
|
+
# https://matrix.org/docs/spec/client_server/r0.5.0.html#put-matrix-client-r0-rooms-roomid-state-eventtype
|
250
251
|
# The Matrix Spec, for more information about the call and response
|
251
252
|
def send_state_event(room_id, event_type, content, **params)
|
252
253
|
query = {}
|
@@ -266,7 +267,7 @@ module MatrixSdk::Protocols::CS
|
|
266
267
|
# @param params [Hash] Options for the request
|
267
268
|
# @option params [Integer] :txn_id The ID of the transaction, or automatically generated
|
268
269
|
# @return [Response] A response hash with the parameter :event_id
|
269
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
270
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#put-matrix-client-r0-rooms-roomid-send-eventtype-txnid
|
270
271
|
# The Matrix Spec, for more information about the call and response
|
271
272
|
def send_message_event(room_id, event_type, content, **params)
|
272
273
|
query = {}
|
@@ -289,7 +290,7 @@ module MatrixSdk::Protocols::CS
|
|
289
290
|
# @option params [String] :reason The reason for the redaction
|
290
291
|
# @option params [Integer] :txn_id The ID of the transaction, or automatically generated
|
291
292
|
# @return [Response] A response hash with the parameter :event_id
|
292
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
293
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#put-matrix-client-r0-rooms-roomid-redact-eventid-txnid
|
293
294
|
# The Matrix Spec, for more information about the call and response
|
294
295
|
def redact_event(room_id, event_id, **params)
|
295
296
|
query = {}
|
@@ -344,10 +345,10 @@ module MatrixSdk::Protocols::CS
|
|
344
345
|
# @option params [Hash] :extra_content Extra data to insert into the content hash
|
345
346
|
# @return [Response] A response hash with the parameter :event_id
|
346
347
|
# @see send_message_event For more information on the underlying call
|
347
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
348
|
-
# https://matrix.org/docs/spec/client_server/r0.
|
349
|
-
# https://matrix.org/docs/spec/client_server/r0.
|
350
|
-
# https://matrix.org/docs/spec/client_server/r0.
|
348
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-image
|
349
|
+
# https://matrix.org/docs/spec/client_server/r0.5.0.html#m-file
|
350
|
+
# https://matrix.org/docs/spec/client_server/r0.5.0.html#m-video
|
351
|
+
# https://matrix.org/docs/spec/client_server/r0.5.0.html#m-audio
|
351
352
|
# The Matrix Spec, for more information about the call and response
|
352
353
|
def send_content(room_id, url, name, msg_type, **params)
|
353
354
|
content = {
|
@@ -372,7 +373,7 @@ module MatrixSdk::Protocols::CS
|
|
372
373
|
# @option params [Hash] :thumbnail_info Image information about the location thumbnail
|
373
374
|
# @return [Response] A response hash with the parameter :event_id
|
374
375
|
# @see send_message_event For more information on the underlying call
|
375
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
376
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-location
|
376
377
|
# The Matrix Spec, for more information about the call and response
|
377
378
|
def send_location(room_id, geo_uri, name, **params)
|
378
379
|
content = {
|
@@ -395,7 +396,7 @@ module MatrixSdk::Protocols::CS
|
|
395
396
|
# @option params [String] :msg_type ('m.text') The message type to send
|
396
397
|
# @return [Response] A response hash with the parameter :event_id
|
397
398
|
# @see send_message_event For more information on the underlying call
|
398
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
399
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-text
|
399
400
|
# The Matrix Spec, for more information about the call and response
|
400
401
|
def send_message(room_id, message, **params)
|
401
402
|
content = {
|
@@ -413,7 +414,7 @@ module MatrixSdk::Protocols::CS
|
|
413
414
|
# @option params [String] :msg_type ('m.emote') The message type to send
|
414
415
|
# @return [Response] A response hash with the parameter :event_id
|
415
416
|
# @see send_message_event For more information on the underlying call
|
416
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
417
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-emote
|
417
418
|
# The Matrix Spec, for more information about the call and response
|
418
419
|
def send_emote(room_id, emote, **params)
|
419
420
|
content = {
|
@@ -431,7 +432,7 @@ module MatrixSdk::Protocols::CS
|
|
431
432
|
# @option params [String] :msg_type ('m.notice') The message type to send
|
432
433
|
# @return [Response] A response hash with the parameter :event_id
|
433
434
|
# @see send_message_event For more information on the underlying call
|
434
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
435
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-notice
|
435
436
|
# The Matrix Spec, for more information about the call and response
|
436
437
|
def send_notice(room_id, notice, **params)
|
437
438
|
content = {
|
@@ -451,7 +452,7 @@ module MatrixSdk::Protocols::CS
|
|
451
452
|
# @option params [String] :to A token to limit retrieval to
|
452
453
|
# @option params [String] :filter A filter to limit the retrieval to
|
453
454
|
# @return [Response] A response hash with the message information containing :start, :end, and :chunk fields
|
454
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
455
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#get-matrix-client-r0-rooms-roomid-messages
|
455
456
|
# The Matrix Spec, for more information about the call and response
|
456
457
|
def get_room_messages(room_id, token, direction, limit: 10, **params)
|
457
458
|
query = {
|
@@ -473,7 +474,7 @@ module MatrixSdk::Protocols::CS
|
|
473
474
|
# @param room_id [MXID,String] The room ID to read from
|
474
475
|
# @param state_type [String] The state type to read
|
475
476
|
# @return [Response] A response hash with the contents of the state event
|
476
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
477
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#get-matrix-client-r0-rooms-roomid-state-eventtype
|
477
478
|
# The Matrix Spec, for more information about the call and response
|
478
479
|
def get_room_state(room_id, state_type = nil, key: nil, **params)
|
479
480
|
query = {}
|
@@ -486,17 +487,30 @@ module MatrixSdk::Protocols::CS
|
|
486
487
|
request(:get, :client_r0, "/rooms/#{room_id}/state#{state_type.empty? ? nil : "/#{state_type}"}#{key.empty? ? nil : "/#{key}"}", query: query)
|
487
488
|
end
|
488
489
|
|
489
|
-
|
490
|
+
## Specialized getters for specced state
|
491
|
+
#
|
492
|
+
|
493
|
+
# Gets the current display name of a room
|
490
494
|
#
|
491
495
|
# @param room_id [MXID,String] The room ID to look up
|
496
|
+
# @param [Hash] params Extra options to provide to the request, see #get_room_state
|
492
497
|
# @return [Response] A response hash with the parameter :name
|
498
|
+
# @raise [MatrixNotFoundError] Raised if no name has been set on the room
|
493
499
|
# @see get_room_state
|
494
|
-
# @see https://matrix.org/docs/spec/client_server/r0.
|
500
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-name
|
495
501
|
# The Matrix Spec, for more information about the event and data
|
496
502
|
def get_room_name(room_id, **params)
|
497
503
|
get_room_state(room_id, 'm.room.name', params)
|
498
504
|
end
|
499
505
|
|
506
|
+
# Sets the display name of a room
|
507
|
+
#
|
508
|
+
# @param [MXID,String] room_id The room ID to work on
|
509
|
+
# @param [String] name The new name of the room
|
510
|
+
# @param [Hash] params Extra options to set on the request, see #send_state_event
|
511
|
+
# @return [Response] The resulting state event
|
512
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-name
|
513
|
+
# The Matrix Spec, for more information about the event and data
|
500
514
|
def set_room_name(room_id, name, **params)
|
501
515
|
content = {
|
502
516
|
name: name
|
@@ -504,10 +518,27 @@ module MatrixSdk::Protocols::CS
|
|
504
518
|
send_state_event(room_id, 'm.room.name', content, params)
|
505
519
|
end
|
506
520
|
|
521
|
+
# Gets the current topic of a room
|
522
|
+
#
|
523
|
+
# @param [MXID,String] room_id The room ID to look up
|
524
|
+
# @param [Hash] params Extra options to provide to the request, see #get_room_state
|
525
|
+
# @return [Response] A response hash with the parameter :topic
|
526
|
+
# @raise [MatrixNotFoundError] Raised if no topic has been set on the room
|
527
|
+
# @see get_room_state
|
528
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-topic
|
529
|
+
# The Matrix Spec, for more information about the event and data
|
507
530
|
def get_room_topic(room_id, **params)
|
508
531
|
get_room_state(room_id, 'm.room.topic', params)
|
509
532
|
end
|
510
533
|
|
534
|
+
# Sets the topic of a room
|
535
|
+
#
|
536
|
+
# @param [MXID,String] room_id The room ID to work on
|
537
|
+
# @param [String] topic The new topic of the room
|
538
|
+
# @param [Hash] params Extra options to set on the request, see #send_state_event
|
539
|
+
# @return [Response] The resulting state event
|
540
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-topic
|
541
|
+
# The Matrix Spec, for more information about the event and data
|
511
542
|
def set_room_topic(room_id, topic, **params)
|
512
543
|
content = {
|
513
544
|
topic: topic
|
@@ -515,14 +546,274 @@ module MatrixSdk::Protocols::CS
|
|
515
546
|
send_state_event(room_id, 'm.room.topic', content, params)
|
516
547
|
end
|
517
548
|
|
518
|
-
|
549
|
+
# Gets the current avatar URL of a room
|
550
|
+
#
|
551
|
+
# @param [MXID,String] room_id The room ID to look up
|
552
|
+
# @param [Hash] params Extra options to provide to the request, see #get_room_state
|
553
|
+
# @return [Response] A response hash with the parameters :url and (optionally) :info
|
554
|
+
# @raise [MatrixNotFoundError] Raised if no avatar has been set on the room
|
555
|
+
# @see get_room_state
|
556
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-avatar
|
557
|
+
# The Matrix Spec, for more information about the event and data
|
558
|
+
def get_room_avatar(room_id, **params)
|
559
|
+
get_room_state(room_id, 'm.room.avatar', params)
|
560
|
+
end
|
561
|
+
|
562
|
+
# Sets the avatar URL for a room
|
563
|
+
#
|
564
|
+
# @param [MXID,String] room_id The room ID to work on
|
565
|
+
# @param [String,URI] url The new avatar URL for the room
|
566
|
+
# @param [Hash] params Extra options to set on the request, see #send_state_event
|
567
|
+
# @return [Response] The resulting state event
|
568
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-avatar
|
569
|
+
# The Matrix Spec, for more information about the event and data
|
570
|
+
def set_room_avatar(room_id, url, **params)
|
571
|
+
content = {
|
572
|
+
url: url
|
573
|
+
}
|
574
|
+
send_state_event(room_id, 'm.room.avatar', content, params)
|
575
|
+
end
|
576
|
+
|
577
|
+
# Gets a list of current aliases of a room
|
578
|
+
#
|
579
|
+
# @param [MXID,String] room_id The room ID to look up
|
580
|
+
# @param [Hash] params Extra options to provide to the request, see #get_room_state
|
581
|
+
# @return [Response] A response hash with the array :aliases
|
582
|
+
# @raise [MatrixNotFoundError] Raised if no aliases has been set on the room by the specified HS
|
583
|
+
# @see get_room_state
|
584
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-avatar
|
585
|
+
# The Matrix Spec, for more information about the event and data
|
586
|
+
# @example Looking up aliases for a room
|
587
|
+
# api.get_room_aliases('!QtykxKocfZaZOUrTwp:matrix.org')
|
588
|
+
# # MatrixSdk::MatrixNotFoundError: HTTP 404 (M_NOT_FOUND): Event not found.
|
589
|
+
# api.get_room_aliases('!QtykxKocfZaZOUrTwp:matrix.org', key: 'matrix.org')
|
590
|
+
# # => {:aliases=>["#matrix:matrix.org"]}
|
591
|
+
# api.get_room_aliases('!QtykxKocfZaZOUrTwp:matrix.org', key: 'kittenface.studio')
|
592
|
+
# # => {:aliases=>["#worlddominationhq:kittenface.studio"]}
|
593
|
+
# @example A way to find all aliases for a room
|
594
|
+
# api.get_room_state('!mjbDjyNsRXndKLkHIe:matrix.org')
|
595
|
+
# .select { |ch| ch[:type] == 'm.room.aliases' }
|
596
|
+
# .map { |ch| ch[:content][:aliases] }
|
597
|
+
# .flatten
|
598
|
+
# .compact
|
599
|
+
# # => ["#synapse:im.kabi.tk", "#synapse:matrix.org", "#synapse-community:matrix.org", "#synapse-ops:matrix.org", "#synops:matrix.org", ...
|
600
|
+
def get_room_aliases(room_id, **params)
|
601
|
+
get_room_state(room_id, 'm.room.aliases', params)
|
602
|
+
end
|
603
|
+
|
604
|
+
# Gets a list of pinned events in a room
|
605
|
+
#
|
606
|
+
# @param [MXID,String] room_id The room ID to look up
|
607
|
+
# @param [Hash] params Extra options to provide to the request, see #get_room_state
|
608
|
+
# @return [Response] A response hash with the array :pinned
|
609
|
+
# @raise [MatrixNotFoundError] Raised if no aliases has been set on the room by the specified HS
|
610
|
+
# @see get_room_state
|
611
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-pinned-events
|
612
|
+
# The Matrix Spec, for more information about the event and data
|
613
|
+
def get_room_pinned_events(room_id, **params)
|
614
|
+
get_room_state(room_id, 'm.room.pinned_events', params)
|
615
|
+
end
|
616
|
+
|
617
|
+
# Sets the list of pinned events in a room
|
618
|
+
#
|
619
|
+
# @param [MXID,String] room_id The room ID to work on
|
620
|
+
# @param [Array[String]] events The new list of events to set as pinned
|
621
|
+
# @param [Hash] params Extra options to set on the request, see #send_state_event
|
622
|
+
# @return [Response] The resulting state event
|
623
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-pinned-events
|
624
|
+
# The Matrix Spec, for more information about the event and data
|
625
|
+
def set_room_pinned_events(room_id, events, **params)
|
626
|
+
content = {
|
627
|
+
pinned: events
|
628
|
+
}
|
629
|
+
send_state_event(room_id, 'm.room.pinned_events', content, params)
|
630
|
+
end
|
631
|
+
|
632
|
+
# Gets the configured power levels for a room
|
633
|
+
#
|
634
|
+
# @param [MXID,String] room_id The room ID to look up
|
635
|
+
# @param [Hash] params Extra options to provide to the request, see #get_room_state
|
636
|
+
# @return [Response] A response hash with power level information
|
637
|
+
# @see get_room_state
|
638
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-power-levels
|
639
|
+
# The Matrix Spec, for more information about the event and data
|
640
|
+
def get_room_power_levels(room_id, **params)
|
519
641
|
get_room_state(room_id, 'm.room.power_levels', params)
|
520
642
|
end
|
643
|
+
alias get_power_levels get_room_power_levels
|
521
644
|
|
522
|
-
|
645
|
+
# Sets the configuration for power levels in a room
|
646
|
+
#
|
647
|
+
# @param [MXID,String] room_id The room ID to work on
|
648
|
+
# @param [Hash] content The new power level configuration
|
649
|
+
# @param [Hash] params Extra options to set on the request, see #send_state_event
|
650
|
+
# @return [Response] The resulting state event
|
651
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-power-levels
|
652
|
+
# The Matrix Spec, for more information about the event and data
|
653
|
+
def set_room_power_levels(room_id, content, **params)
|
523
654
|
content[:events] = {} unless content.key? :events
|
524
655
|
send_state_event(room_id, 'm.room.power_levels', content, params)
|
525
656
|
end
|
657
|
+
alias set_power_levels set_room_power_levels
|
658
|
+
|
659
|
+
# Gets the join rules for a room
|
660
|
+
#
|
661
|
+
# @param [MXID,String] room_id The room ID to look up
|
662
|
+
# @param [Hash] params Extra options to provide to the request, see #get_room_state
|
663
|
+
# @return [Response] A response hash with the key :join_rule
|
664
|
+
# @see get_room_state
|
665
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-join-rules
|
666
|
+
# The Matrix Spec, for more information about the event and data
|
667
|
+
def get_room_join_rules(room_id, **params)
|
668
|
+
get_room_state(room_id, 'm.room.join_rules', params)
|
669
|
+
end
|
670
|
+
|
671
|
+
# Sets the join rules for a room
|
672
|
+
#
|
673
|
+
# @param [MXID,String] room_id The room ID to work on
|
674
|
+
# @param [String,Symbol] join_rule The new join rule setting (Currently only public and invite are implemented)
|
675
|
+
# @param [Hash] params Extra options to set on the request, see #send_state_event
|
676
|
+
# @return [Response] The resulting state event
|
677
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-join-rules
|
678
|
+
# The Matrix Spec, for more information about the event and data
|
679
|
+
def set_room_join_rules(room_id, join_rule, **params)
|
680
|
+
content = {
|
681
|
+
join_rule: join_rule
|
682
|
+
}
|
683
|
+
|
684
|
+
send_state_event(room_id, 'm.room.join_rules', content, params)
|
685
|
+
end
|
686
|
+
|
687
|
+
# Gets the guest access settings for a room
|
688
|
+
#
|
689
|
+
# @param [MXID,String] room_id The room ID to look up
|
690
|
+
# @param [Hash] params Extra options to provide to the request, see #get_room_state
|
691
|
+
# @return [Response] A response hash with the key :guest_acces, either :can_join or :forbidden
|
692
|
+
# @see get_room_state
|
693
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-guest-access
|
694
|
+
# The Matrix Spec, for more information about the event and data
|
695
|
+
def get_room_guest_access(room_id, **params)
|
696
|
+
get_room_state(room_id, 'm.room.guest_access', params)
|
697
|
+
end
|
698
|
+
|
699
|
+
# Sets the guest access settings for a room
|
700
|
+
#
|
701
|
+
# @param [MXID,String] room_id The room ID to work on
|
702
|
+
# @param [:can_join, :forbidden] guest_access The new guest access setting for the room
|
703
|
+
# @param [Hash] params Extra options to set on the request, see #send_state_event
|
704
|
+
# @return [Response] The resulting state event
|
705
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-guest-access
|
706
|
+
# The Matrix Spec, for more information about the event and data
|
707
|
+
def set_room_guest_access(room_id, guest_access, **params)
|
708
|
+
content = {
|
709
|
+
guest_access: guest_access
|
710
|
+
}
|
711
|
+
|
712
|
+
send_state_event(room_id, 'm.room.guest_access', content, params)
|
713
|
+
end
|
714
|
+
|
715
|
+
# Gets the creation configuration object for a room
|
716
|
+
#
|
717
|
+
# @param [MXID,String] room_id The room ID to look up
|
718
|
+
# @param [Hash] params Extra options to provide to the request, see #get_room_state
|
719
|
+
# @return [Response] A response hash with the configuration the room was created for
|
720
|
+
# @see get_room_state
|
721
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-create
|
722
|
+
# The Matrix Spec, for more information about the event and data
|
723
|
+
def get_room_creation_info(room_id, **params)
|
724
|
+
get_room_state(room_id, 'm.room.create', params)
|
725
|
+
end
|
726
|
+
|
727
|
+
# Gets the encryption configuration for a room
|
728
|
+
#
|
729
|
+
# @param [MXID,String] room_id The room ID to look up
|
730
|
+
# @param [Hash] params Extra options to provide to the request, see #get_room_state
|
731
|
+
# @return [Response] A response hash with the configuration the room was created for
|
732
|
+
# @see get_room_state
|
733
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-encryption
|
734
|
+
# The Matrix Spec, for more information about the event and data
|
735
|
+
def get_room_encryption_settings(room_id, **params)
|
736
|
+
get_room_state(room_id, 'm.room.encryption', params)
|
737
|
+
end
|
738
|
+
|
739
|
+
# Sets the encryption configuration for a room
|
740
|
+
#
|
741
|
+
# @param [MXID,String] room_id The room ID to work on
|
742
|
+
# @param ['m.megolm.v1.aes-sha2'] algorithm The encryption algorithm to use
|
743
|
+
# @param [Integer] rotation_period_ms The interval between key rotation in milliseconds
|
744
|
+
# @param [Integer] rotation_period_msgs The interval between key rotation in messages
|
745
|
+
# @param [Hash] params Extra options to set on the request, see #send_state_event
|
746
|
+
# @return [Response] The resulting state event
|
747
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-guest-encryption
|
748
|
+
# The Matrix Spec, for more information about the event and data
|
749
|
+
def set_room_encryption_settings(room_id, algorithm: 'm.megolm.v1.aes-sha2', rotation_period_ms: 1 * 7 * 24 * 60 * 60 * 1000, rotation_period_msgs: 100, **params)
|
750
|
+
content = {
|
751
|
+
algorithm: algorithm,
|
752
|
+
rotation_period_ms: rotation_period_ms,
|
753
|
+
rotation_period_msgs: rotation_period_msgs
|
754
|
+
}
|
755
|
+
send_state_event(room_id, 'm.room.encryption', content, params)
|
756
|
+
end
|
757
|
+
|
758
|
+
# Gets the history availabiilty for a room
|
759
|
+
#
|
760
|
+
# @param [MXID,String] room_id The room ID to look up
|
761
|
+
# @param [Hash] params Extra options to provide to the request, see #get_room_state
|
762
|
+
# @return [Response] A response hash with the key :history_visibility
|
763
|
+
# @see get_room_state
|
764
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-history-visibility
|
765
|
+
# The Matrix Spec, for more information about the event and data
|
766
|
+
def get_room_history_visibility(room_id, **params)
|
767
|
+
get_room_state(room_id, 'm.room.history_visibility', params)
|
768
|
+
end
|
769
|
+
|
770
|
+
# Sets the history availability for a room
|
771
|
+
#
|
772
|
+
# @param [MXID,String] room_id The room ID to work on
|
773
|
+
# @param [:invited, :joined, :shared, :world_readable] visibility The new history visibility level
|
774
|
+
# @param [Hash] params Extra options to set on the request, see #send_state_event
|
775
|
+
# @return [Response] The resulting state event
|
776
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-guest-history-visibility
|
777
|
+
# The Matrix Spec, for more information about the event and data
|
778
|
+
def set_room_history_visibility(room_id, visibility, **params)
|
779
|
+
content = {
|
780
|
+
history_visibility: visibility
|
781
|
+
}
|
782
|
+
|
783
|
+
send_state_event(room_id, 'm.room.history_visibility', content, params)
|
784
|
+
end
|
785
|
+
|
786
|
+
# Gets the server ACLs for a room
|
787
|
+
#
|
788
|
+
# @param [MXID,String] room_id The room ID to look up
|
789
|
+
# @param [Hash] params Extra options to provide to the request, see #get_room_state
|
790
|
+
# @return [Response] A response hash with server ACL information
|
791
|
+
# @see get_room_state
|
792
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-server-acl
|
793
|
+
# The Matrix Spec, for more information about the event and data
|
794
|
+
def get_room_server_acl(room_id, **params)
|
795
|
+
get_room_state(room_id, 'm.room.server_acl', params)
|
796
|
+
end
|
797
|
+
|
798
|
+
# Sets the server ACL configuration for a room
|
799
|
+
#
|
800
|
+
# @param [MXID,String] room_id The room ID to work on
|
801
|
+
# @param [Boolean] allow_ip_literals If HSes with literal IP domains should be allowed
|
802
|
+
# @param [Array[String]] allow A list of HS wildcards that are allowed to communicate with the room
|
803
|
+
# @param [Array[String]] deny A list of HS wildcards that are denied from communicating with the room
|
804
|
+
# @param [Hash] params Extra options to set on the request, see #send_state_event
|
805
|
+
# @return [Response] The resulting state event
|
806
|
+
# @see https://matrix.org/docs/spec/client_server/r0.5.0.html#m-room-guest-server-acl
|
807
|
+
# The Matrix Spec, for more information about the event and data
|
808
|
+
def set_room_server_acl(room_id, allow_ip_literals: false, allow:, deny:, **params)
|
809
|
+
content = {
|
810
|
+
allow_ip_literals: allow_ip_literals,
|
811
|
+
allow: allow,
|
812
|
+
deny: deny
|
813
|
+
}
|
814
|
+
|
815
|
+
send_state_event(room_id, 'm.room.server_acl', content, params)
|
816
|
+
end
|
526
817
|
|
527
818
|
def leave_room(room_id, **params)
|
528
819
|
query = {}
|
@@ -774,16 +1065,34 @@ module MatrixSdk::Protocols::CS
|
|
774
1065
|
request(:get, :client_r0, "/profile/#{user_id}", query: query)
|
775
1066
|
end
|
776
1067
|
|
777
|
-
|
1068
|
+
# Converts a Matrix content URL (mxc://) to a media download URL
|
1069
|
+
# @param [String,URI] mxcurl The Matrix content URL to convert
|
1070
|
+
# @param [String,URI] source A source HS to use for the convertion, defaults to the connected HS
|
1071
|
+
# @return [URI] The full download URL for the requested piece of media
|
1072
|
+
#
|
1073
|
+
# @example Converting a MXC URL
|
1074
|
+
# url = 'mxc://example.com/media_hash'
|
1075
|
+
#
|
1076
|
+
# api.get_download_url(url)
|
1077
|
+
# # => #<URI::HTTPS https://example.com/_matrix/media/r0/download/example.com/media_hash>
|
1078
|
+
# api.get_download_url(url, source: 'matrix.org')
|
1079
|
+
# # => #<URI::HTTPS https://matrix.org/_matrix/media/r0/download/example.com/media_hash>
|
1080
|
+
def get_download_url(mxcurl, source: nil, **_params)
|
778
1081
|
mxcurl = URI.parse(mxcurl.to_s) unless mxcurl.is_a? URI
|
779
1082
|
raise 'Not a mxc:// URL' unless mxcurl.is_a? URI::MATRIX
|
780
1083
|
|
781
|
-
homeserver.dup
|
1084
|
+
source ||= homeserver.dup
|
1085
|
+
source = URI(hs.to_s) unless hs.is_a? URI
|
1086
|
+
source.tap do |u|
|
782
1087
|
full_path = ERB::Util.url_encode mxcurl.full_path.to_s
|
783
1088
|
u.path = "/_matrix/media/r0/download/#{full_path}"
|
784
1089
|
end
|
785
1090
|
end
|
786
1091
|
|
1092
|
+
# Gets the room ID for an alias
|
1093
|
+
# @param [String,MXID] room_alias The room alias to look up
|
1094
|
+
# @return [Response] An object containing the :room_id key and a key of :servers that know of the room
|
1095
|
+
# @raise [MatrixNotFoundError] No room with the requested alias exists
|
787
1096
|
def get_room_id(room_alias, **params)
|
788
1097
|
query = {}
|
789
1098
|
query[:user_id] = params.delete(:user_id) if protocol?(:AS) && params.key?(:user_id)
|
@@ -793,6 +1102,11 @@ module MatrixSdk::Protocols::CS
|
|
793
1102
|
request(:get, :client_r0, "/directory/room/#{room_alias}", query: query)
|
794
1103
|
end
|
795
1104
|
|
1105
|
+
# Sets the room ID for an alias
|
1106
|
+
# @param [String,MXID] room_id The room to set an alias for
|
1107
|
+
# @param [String,MXID] room_alias The alias to configure for the room
|
1108
|
+
# @return [Response] An empty object denoting success
|
1109
|
+
# @raise [MatrixConflictError] The alias is already in use
|
796
1110
|
def set_room_alias(room_id, room_alias, **params)
|
797
1111
|
query = {}
|
798
1112
|
query[:user_id] = params.delete(:user_id) if protocol?(:AS) && params.key?(:user_id)
|
@@ -805,6 +1119,9 @@ module MatrixSdk::Protocols::CS
|
|
805
1119
|
request(:put, :client_r0, "/directory/room/#{room_alias}", body: content, query: query)
|
806
1120
|
end
|
807
1121
|
|
1122
|
+
# Remove an alias from its room
|
1123
|
+
# @param [String,MXID] room_alias The alias to remove
|
1124
|
+
# @return [Response] An empty object denoting success
|
808
1125
|
def remove_room_alias(room_alias, **params)
|
809
1126
|
query = {}
|
810
1127
|
query[:user_id] = params.delete(:user_id) if protocol?(:AS) && params.key?(:user_id)
|
@@ -823,45 +1140,63 @@ module MatrixSdk::Protocols::CS
|
|
823
1140
|
request(:get, :client_r0, "/rooms/#{room_id}/members", query: query)
|
824
1141
|
end
|
825
1142
|
|
826
|
-
|
827
|
-
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
send_state_event(room_id, 'm.room.join_rules', params.merge(content))
|
832
|
-
end
|
833
|
-
|
834
|
-
def set_guest_access(room_id, guest_access, **params)
|
835
|
-
# raise ArgumentError, '`guest_access` must be one of [:can_join, :forbidden]' unless %i[can_join forbidden].include? guest_access
|
836
|
-
content = {
|
837
|
-
guest_access: guest_access
|
838
|
-
}
|
839
|
-
|
840
|
-
send_state_event(room_id, 'm.room.guest_access', params.merge(content))
|
841
|
-
end
|
842
|
-
|
1143
|
+
# Gets a list of the current users registered devices
|
1144
|
+
# @return [Response] An object including all information about the users devices.
|
1145
|
+
# @see https://matrix.org/docs/spec/client_server/r0.4.0#get-matrix-client-r0-devices
|
1146
|
+
# The Matrix Spec, for more information about the data
|
843
1147
|
def get_devices
|
844
1148
|
request(:get, :client_r0, '/devices')
|
845
1149
|
end
|
846
1150
|
|
1151
|
+
# Gets the information about a certain client device
|
1152
|
+
# @param [String] device_id The ID of the device to look up
|
1153
|
+
# @return [Response] An object containing all available device information
|
1154
|
+
# @see https://matrix.org/docs/spec/client_server/r0.4.0#get-matrix-client-r0-devices-deviceid
|
1155
|
+
# The Matrix Spec, for more information about the data
|
847
1156
|
def get_device(device_id)
|
848
1157
|
device_id = ERB::Util.url_encode device_id.to_s
|
849
1158
|
|
850
1159
|
request(:get, :client_r0, "/devices/#{device_id}")
|
851
1160
|
end
|
852
1161
|
|
1162
|
+
# Sets the metadata for a device
|
1163
|
+
# @param [String] device_id The ID of the device to modify
|
1164
|
+
# @param [String] display_name The new display name to set for the device
|
1165
|
+
# @see https://matrix.org/docs/spec/client_server/r0.4.0#put-matrix-client-r0-devices-deviceid
|
1166
|
+
# The Matrix Spec, for more information about the data
|
853
1167
|
def set_device(device_id, display_name:)
|
854
1168
|
device_id = ERB::Util.url_encode device_id.to_s
|
855
1169
|
|
856
1170
|
request(:put, :client_r0, "/devices/#{device_id}", body: { display_name: display_name })
|
857
1171
|
end
|
858
1172
|
|
1173
|
+
# Removes a device from the current user
|
1174
|
+
# @param [String] device_id The device to remove
|
1175
|
+
# @param [Hash] auth Authentication data for the removal request
|
1176
|
+
# @raise [MatrixNotAuthorizeedError] The request did not contain enough authentication information,
|
1177
|
+
# the data in this error will include the necessary information to perform interactive auth
|
1178
|
+
# @see https://matrix.org/docs/spec/client_server/r0.4.0#delete-matrix-client-r0-devices-deviceid
|
1179
|
+
# The Matrix Spec, for more information about the data
|
859
1180
|
def delete_device(device_id, auth:)
|
860
1181
|
device_id = ERB::Util.url_encode device_id.to_s
|
861
1182
|
|
862
1183
|
request(:delete, :client_r0, "/devices/#{device_id}", body: { auth: auth })
|
863
1184
|
end
|
864
1185
|
|
1186
|
+
# Run a query for device keys
|
1187
|
+
# @param [Numeric] timeout The timeout - in seconds - for the query
|
1188
|
+
# @param [Array] device_keys The list of devices to query
|
1189
|
+
# @param [String] token The sync token that led to this query - if any
|
1190
|
+
# @param [Hash] params Additional parameters
|
1191
|
+
# @option params [Integer] timeout_ms The timeout in milliseconds for the query, overrides _timeout_
|
1192
|
+
# @example Looking up all the device keys for a user
|
1193
|
+
# api.keys_query(device_keys: { '@alice:example.com': [] })
|
1194
|
+
# # => { :device_keys => { :'@alice:example.com' => { :JLAFKJWSCS => { ...
|
1195
|
+
# @example Looking up a specific device for a user
|
1196
|
+
# api.keys_query(device_keys: { '@alice:example.com': ['ABCDEFGHIJ'] })
|
1197
|
+
# # => { :device_keys => { :'@alice:example.com' => { :ABCDEFGHIJ => { ...
|
1198
|
+
# @see https://matrix.org/docs/spec/client_server/r0.4.0#post-matrix-client-r0-keys-query
|
1199
|
+
# The Matrix Spec, for more information about the parameters and data
|
865
1200
|
def keys_query(timeout: nil, device_keys:, token: nil, **params)
|
866
1201
|
body = {
|
867
1202
|
timeout: (timeout || 10) * 1000,
|
@@ -873,6 +1208,8 @@ module MatrixSdk::Protocols::CS
|
|
873
1208
|
request(:post, :client_r0, '/keys/query', body: body)
|
874
1209
|
end
|
875
1210
|
|
1211
|
+
# Gets the MXID of the currently logged-in user
|
1212
|
+
# @return [Response] An object containing the key :user_id
|
876
1213
|
def whoami?(**params)
|
877
1214
|
query = {}
|
878
1215
|
query[:user_id] = params.delete(:user_id) if protocol?(:AS) && params.key?(:user_id)
|
@@ -880,3 +1217,4 @@ module MatrixSdk::Protocols::CS
|
|
880
1217
|
request(:get, :client_r0, '/account/whoami', query: query)
|
881
1218
|
end
|
882
1219
|
end
|
1220
|
+
# rubocop:enable Metrics/ModuleLength
|
data/lib/matrix_sdk/room.rb
CHANGED
@@ -139,18 +139,18 @@ module MatrixSdk
|
|
139
139
|
|
140
140
|
# Gets the avatar url of the room - if any
|
141
141
|
def avatar_url
|
142
|
-
@avatar_url ||= client.api.
|
142
|
+
@avatar_url ||= client.api.get_room_avatar(id).url
|
143
143
|
rescue MatrixNotFoundError
|
144
144
|
# No avatar has been set
|
145
145
|
nil
|
146
146
|
end
|
147
147
|
|
148
148
|
def guest_access
|
149
|
-
@guest_access ||= client.api.
|
149
|
+
@guest_access ||= client.api.get_room_guest_access(id).guest_access.to_sym
|
150
150
|
end
|
151
151
|
|
152
152
|
def join_rule
|
153
|
-
@join_rule ||= client.api.
|
153
|
+
@join_rule ||= client.api.get_room_join_rules(id).join_rule.to_sym
|
154
154
|
end
|
155
155
|
|
156
156
|
# Checks if +guest_access+ is set to +:can_join+
|
@@ -374,15 +374,24 @@ module MatrixSdk
|
|
374
374
|
true
|
375
375
|
end
|
376
376
|
|
377
|
+
# Returns a list of the room tags
|
378
|
+
# @return [Response] A list of the tags and their data, with add and remove methods implemented
|
379
|
+
# @example Managing tags
|
380
|
+
# room.tags
|
381
|
+
# # => { :room_tag => { data: false } }
|
382
|
+
# room.tags.add('some_tag', data: true)
|
383
|
+
# # => { :some_tag => { data: true }, :room_tag => { data: false} }
|
384
|
+
# room.tags.remove('room_tag')
|
385
|
+
# # => { :some_tag => { data: true} }
|
377
386
|
def tags
|
378
387
|
client.api.get_user_tags(client.mxid, id)[:tags].tap do |tag_obj|
|
379
388
|
tag_obj.instance_variable_set(:@room, self)
|
380
389
|
tag_obj.define_singleton_method(:room) do
|
381
390
|
@room
|
382
391
|
end
|
383
|
-
tag_obj.define_singleton_method(:add) do |tag,
|
384
|
-
@room.add_tag(tag.to_s.to_sym,
|
385
|
-
self[tag.to_s.to_sym] =
|
392
|
+
tag_obj.define_singleton_method(:add) do |tag, **data|
|
393
|
+
@room.add_tag(tag.to_s.to_sym, data)
|
394
|
+
self[tag.to_s.to_sym] = data
|
386
395
|
self
|
387
396
|
end
|
388
397
|
tag_obj.define_singleton_method(:remove) do |tag|
|
@@ -392,13 +401,18 @@ module MatrixSdk
|
|
392
401
|
end
|
393
402
|
end
|
394
403
|
|
404
|
+
# Remove a tag from the room
|
405
|
+
# @param [String] tag The tag to remove
|
395
406
|
def remove_tag(tag)
|
396
407
|
client.api.remove_user_tag(client.mxid, id, tag)
|
397
408
|
true
|
398
409
|
end
|
399
410
|
|
400
|
-
|
401
|
-
|
411
|
+
# Add a tag to the room
|
412
|
+
# @param [String] tag The tag to add
|
413
|
+
# @param [Hash] data The data to assign to the tag
|
414
|
+
def add_tag(tag, **data)
|
415
|
+
client.api.add_user_tag(client.mxid, id, tag, data)
|
402
416
|
true
|
403
417
|
end
|
404
418
|
|
@@ -466,7 +480,7 @@ module MatrixSdk
|
|
466
480
|
# alias list updates.
|
467
481
|
def reload_aliases!
|
468
482
|
begin
|
469
|
-
new_aliases = client.api.
|
483
|
+
new_aliases = client.api.get_room_aliases(id).aliases
|
470
484
|
rescue MatrixNotFoundError
|
471
485
|
data = client.api.get_room_state(id)
|
472
486
|
new_aliases = data.select { |chunk| chunk[:type] == 'm.room.aliases' && chunk.key?(:content) && chunk[:content].key?(:aliases) }
|
@@ -507,10 +521,7 @@ module MatrixSdk
|
|
507
521
|
avatar_url = URI(avatar_url) unless avatar_url.is_a? URI
|
508
522
|
raise ArgumentError, 'Must be a valid MXC URL' unless avatar_url.is_a? URI::MATRIX
|
509
523
|
|
510
|
-
|
511
|
-
url: avatar_url
|
512
|
-
}
|
513
|
-
client.api.send_state_event(id, 'm.room.avatar', content)
|
524
|
+
client.api.set_room_avatar(id, avatar_url)
|
514
525
|
@avatar_url = avatar_url
|
515
526
|
end
|
516
527
|
|
data/lib/matrix_sdk/version.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: matrix_sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Olofsson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-06-
|
11
|
+
date: 2019-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: logging
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '2'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '2'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: mocha
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,36 +67,32 @@ dependencies:
|
|
81
67
|
- !ruby/object:Gem::Version
|
82
68
|
version: '0'
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
70
|
+
name: logging
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
86
72
|
requirements:
|
87
|
-
- - "
|
73
|
+
- - "~>"
|
88
74
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
90
|
-
type: :
|
75
|
+
version: '2'
|
76
|
+
type: :runtime
|
91
77
|
prerelease: false
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
|
-
- - "
|
80
|
+
- - "~>"
|
95
81
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
82
|
+
version: '2'
|
97
83
|
description: SDK for applications using the Matrix protocol
|
98
84
|
email:
|
99
85
|
- ace@haxalot.com
|
100
86
|
executables: []
|
101
87
|
extensions: []
|
102
|
-
extra_rdoc_files:
|
88
|
+
extra_rdoc_files:
|
89
|
+
- CHANGELOG.md
|
90
|
+
- LICENSE.txt
|
91
|
+
- README.md
|
103
92
|
files:
|
104
|
-
- ".gitignore"
|
105
|
-
- ".gitlab-ci.yml"
|
106
|
-
- ".rubocop.yml"
|
107
|
-
- ".travis.yml"
|
108
93
|
- CHANGELOG.md
|
109
|
-
- Gemfile
|
110
94
|
- LICENSE.txt
|
111
95
|
- README.md
|
112
|
-
- Rakefile
|
113
|
-
- examples/simple_client.rb
|
114
96
|
- lib/matrix_sdk.rb
|
115
97
|
- lib/matrix_sdk/api.rb
|
116
98
|
- lib/matrix_sdk/application_service.rb
|
@@ -126,7 +108,6 @@ files:
|
|
126
108
|
- lib/matrix_sdk/room.rb
|
127
109
|
- lib/matrix_sdk/user.rb
|
128
110
|
- lib/matrix_sdk/version.rb
|
129
|
-
- matrix-sdk.gemspec
|
130
111
|
homepage: https://github.com/ananace/ruby-matrix-sdk
|
131
112
|
licenses:
|
132
113
|
- MIT
|
data/.gitignore
DELETED
data/.gitlab-ci.yml
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
---
|
2
|
-
image: "ruby:2.6"
|
3
|
-
|
4
|
-
# Cache gems in between builds
|
5
|
-
cache:
|
6
|
-
paths:
|
7
|
-
- vendor/ruby
|
8
|
-
|
9
|
-
before_script:
|
10
|
-
- gem install bundler -N
|
11
|
-
- bundle install -j $(nproc) --path vendor
|
12
|
-
|
13
|
-
rubocop:
|
14
|
-
before_script: []
|
15
|
-
script:
|
16
|
-
- gem install rubocop -N
|
17
|
-
- rubocop lib
|
18
|
-
|
19
|
-
test:
|
20
|
-
coverage: '/\((\d+.\d+\%)\) covered/'
|
21
|
-
script:
|
22
|
-
- GENERATE_REPORTS=true CI_REPORTS=reports bundle exec rake test
|
23
|
-
artifacts:
|
24
|
-
expire_in: 1 week
|
25
|
-
paths:
|
26
|
-
- coverage/
|
27
|
-
reports:
|
28
|
-
junit: "reports/TEST-*.xml"
|
29
|
-
|
30
|
-
pages:
|
31
|
-
stage: deploy
|
32
|
-
before_script: []
|
33
|
-
script:
|
34
|
-
- gem install yard -N
|
35
|
-
- yard doc -o public/
|
36
|
-
artifacts:
|
37
|
-
paths:
|
38
|
-
- public/
|
39
|
-
only:
|
40
|
-
- master
|
41
|
-
when: always
|
data/.rubocop.yml
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
AllCops:
|
2
|
-
TargetRubyVersion: 2.6
|
3
|
-
Exclude:
|
4
|
-
- '*.spec'
|
5
|
-
- 'Rakefile'
|
6
|
-
|
7
|
-
# Broken in CI
|
8
|
-
Lint/Void:
|
9
|
-
Enabled: false
|
10
|
-
|
11
|
-
Style/ClassAndModuleChildren:
|
12
|
-
Enabled: false
|
13
|
-
|
14
|
-
# Don't enforce documentation
|
15
|
-
Style/Documentation:
|
16
|
-
Enabled: false
|
17
|
-
|
18
|
-
Metrics/ClassLength:
|
19
|
-
Enabled: false
|
20
|
-
|
21
|
-
Metrics/MethodLength:
|
22
|
-
Max: 50
|
23
|
-
|
24
|
-
# Matrix has a lot of methods in the CS API
|
25
|
-
Metrics/ModuleLength:
|
26
|
-
Max: 500
|
27
|
-
|
28
|
-
Metrics/LineLength:
|
29
|
-
Max: 190
|
30
|
-
|
31
|
-
Style/RescueModifier:
|
32
|
-
Enabled: false
|
33
|
-
|
34
|
-
Style/RegexpLiteral:
|
35
|
-
Enabled: false
|
36
|
-
|
37
|
-
Style/MultilineBlockChain:
|
38
|
-
Enabled: false
|
39
|
-
|
40
|
-
Metrics/AbcSize:
|
41
|
-
Enabled: false
|
42
|
-
|
43
|
-
Metrics/CyclomaticComplexity:
|
44
|
-
Enabled: false
|
45
|
-
|
46
|
-
Metrics/PerceivedComplexity:
|
47
|
-
Enabled: false
|
48
|
-
|
49
|
-
Style/FormatStringToken:
|
50
|
-
Enabled: false
|
51
|
-
|
52
|
-
Naming/AccessorMethodName:
|
53
|
-
Enabled: false
|
data/.travis.yml
DELETED
data/Gemfile
DELETED
data/Rakefile
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require "bundler/gem_tasks"
|
2
|
-
require "rake/testtask"
|
3
|
-
|
4
|
-
Rake::TestTask.new(:test) do |t|
|
5
|
-
t.libs << "test"
|
6
|
-
t.libs << "lib"
|
7
|
-
t.test_files = FileList['test/**/*_test.rb']
|
8
|
-
end
|
9
|
-
|
10
|
-
if ENV['GENERATE_REPORTS'] == 'true'
|
11
|
-
require 'ci/reporter/rake/test_unit'
|
12
|
-
task :test => 'ci:setup:testunit'
|
13
|
-
end
|
14
|
-
|
15
|
-
task :default => :test
|
data/examples/simple_client.rb
DELETED
@@ -1,148 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'io/console'
|
4
|
-
require 'matrix_sdk'
|
5
|
-
|
6
|
-
# A filter to only discover joined rooms
|
7
|
-
ROOM_DISCOVERY_FILTER = {
|
8
|
-
event_fields: %w[sender membership],
|
9
|
-
presence: { senders: [], types: [] },
|
10
|
-
account_data: { senders: [], types: [] },
|
11
|
-
room: {
|
12
|
-
ephemeral: { senders: [], types: [] },
|
13
|
-
state: {
|
14
|
-
senders: [],
|
15
|
-
types: [
|
16
|
-
'm.room.aliases',
|
17
|
-
'm.room.canonical_alias',
|
18
|
-
'm.room.member'
|
19
|
-
],
|
20
|
-
lazy_load_members: true
|
21
|
-
},
|
22
|
-
timeline: { senders: [], types: [] },
|
23
|
-
account_data: { senders: [], types: [] }
|
24
|
-
}
|
25
|
-
}.freeze
|
26
|
-
|
27
|
-
# A filter to only retrieve messages from rooms
|
28
|
-
ROOM_STATE_FILTER = {
|
29
|
-
presence: { senders: [], types: [] },
|
30
|
-
account_data: { senders: [], types: [] },
|
31
|
-
room: {
|
32
|
-
ephemeral: { senders: [], types: [] },
|
33
|
-
state: {
|
34
|
-
types: ['m.room.member'],
|
35
|
-
lazy_load_members: true
|
36
|
-
},
|
37
|
-
timeline: {
|
38
|
-
types: ['m.room.message']
|
39
|
-
},
|
40
|
-
account_data: { senders: [], types: [] }
|
41
|
-
}
|
42
|
-
}.freeze
|
43
|
-
|
44
|
-
|
45
|
-
class SimpleClient < MatrixSdk::Client
|
46
|
-
def initialize(hs_url)
|
47
|
-
super hs_url, sync_filter_limit: 10
|
48
|
-
|
49
|
-
@pls = {}
|
50
|
-
@tracked_rooms = []
|
51
|
-
@filter = ROOM_STATE_FILTER.dup
|
52
|
-
end
|
53
|
-
|
54
|
-
def add_listener(room)
|
55
|
-
room.on_event.add_handler { |ev| on_message(room, ev) }
|
56
|
-
@tracked_rooms << room.id
|
57
|
-
end
|
58
|
-
|
59
|
-
def run
|
60
|
-
# Only track messages from the listened rooms
|
61
|
-
@filter[:room][:rooms] = @tracked_rooms
|
62
|
-
start_listener_thread(filter: @filter.to_json)
|
63
|
-
end
|
64
|
-
|
65
|
-
private
|
66
|
-
|
67
|
-
def get_user_level(room, mxid)
|
68
|
-
levels = @pls[room.id] ||= api.get_power_levels(room.id)[:users]
|
69
|
-
levels[mxid.to_sym]
|
70
|
-
end
|
71
|
-
|
72
|
-
def on_message(room, event)
|
73
|
-
case event.type
|
74
|
-
when 'm.room.member'
|
75
|
-
puts "[#{Time.now.strftime '%H:%M'}] #{event[:content][:displayname]} joined." if event.membership == 'join'
|
76
|
-
when 'm.room.message'
|
77
|
-
user = get_user event.sender
|
78
|
-
admin_level = get_user_level(room, user.id) || 0
|
79
|
-
prefix = ' '
|
80
|
-
prefix = '+' if admin_level >= 50
|
81
|
-
prefix = '@' if admin_level >= 100
|
82
|
-
if %w[m.text m.notice].include? event.content[:msgtype]
|
83
|
-
notice = event.content[:msgtype] == 'm.notice'
|
84
|
-
puts "[#{Time.now.strftime '%H:%M'}] <#{prefix}#{user.display_name}> #{"\033[1;30m" if notice}#{event.content[:body]}#{"\033[0m" if notice}"
|
85
|
-
elsif event[:content][:msgtype] == 'm.emote'
|
86
|
-
puts "[#{Time.now.strftime '%H:%M'}] *#{prefix}#{user.display_name} #{event.content[:body]}"
|
87
|
-
else
|
88
|
-
puts "[#{Time.now.strftime '%H:%M'}] <#{prefix}#{user.display_name}> (#{event.content[:msgtype]}) #{event.content[:body]} - #{api.get_download_url event.content[:url]}"
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
if $PROGRAM_NAME == __FILE__
|
95
|
-
raise "Usage: #{$PROGRAM_NAME} [-d] homeserver_url room_id_or_alias" unless ARGV.length >= 2
|
96
|
-
begin
|
97
|
-
if ARGV.first == '-d'
|
98
|
-
Thread.abort_on_exception = true
|
99
|
-
MatrixSdk.debug!
|
100
|
-
ARGV.shift
|
101
|
-
end
|
102
|
-
|
103
|
-
client = SimpleClient.new ARGV.first
|
104
|
-
ARGV.shift
|
105
|
-
|
106
|
-
print 'Username: '
|
107
|
-
user = STDIN.gets.strip
|
108
|
-
puts 'Password: '
|
109
|
-
password = STDIN.noecho(&:gets).strip
|
110
|
-
|
111
|
-
puts 'Logging in...'
|
112
|
-
client.login(user, password, no_sync: true)
|
113
|
-
|
114
|
-
# Only retrieve list of joined room in first sync
|
115
|
-
sync_filter = client.sync_filter.merge(ROOM_DISCOVERY_FILTER)
|
116
|
-
sync_filter[:room][:state][:senders] << client.mxid
|
117
|
-
client.listen_for_events(timeout: 5, filter: sync_filter.to_json)
|
118
|
-
|
119
|
-
puts 'Finding room...'
|
120
|
-
room = client.find_room(ARGV.last)
|
121
|
-
room ||= begin
|
122
|
-
puts 'Joining room...'
|
123
|
-
client.join_room(ARGV.last)
|
124
|
-
end
|
125
|
-
|
126
|
-
client.add_listener(room)
|
127
|
-
|
128
|
-
puts 'Starting listener'
|
129
|
-
client.run
|
130
|
-
|
131
|
-
puts 'Entering main loop'
|
132
|
-
loop do
|
133
|
-
print '> '
|
134
|
-
msg = STDIN.gets.strip
|
135
|
-
break if msg.start_with? '/quit'
|
136
|
-
|
137
|
-
if msg.start_with? '/me'
|
138
|
-
room.send_emote msg.gsub(/\/me\s*/, '')
|
139
|
-
else
|
140
|
-
room.send_text msg
|
141
|
-
end
|
142
|
-
end
|
143
|
-
rescue Interrupt
|
144
|
-
puts 'Interrupted, exiting...'
|
145
|
-
ensure
|
146
|
-
client.logout if client && client.logged_in?
|
147
|
-
end
|
148
|
-
end
|
data/matrix-sdk.gemspec
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require File.join File.expand_path('lib', __dir__), 'matrix_sdk/version'
|
4
|
-
|
5
|
-
Gem::Specification.new do |spec|
|
6
|
-
spec.name = 'matrix_sdk'
|
7
|
-
spec.version = MatrixSdk::VERSION
|
8
|
-
spec.authors = ['Alexander Olofsson']
|
9
|
-
spec.email = ['ace@haxalot.com']
|
10
|
-
|
11
|
-
spec.summary = 'SDK for applications using the Matrix protocol'
|
12
|
-
spec.description = spec.summary
|
13
|
-
spec.homepage = 'https://github.com/ananace/ruby-matrix-sdk'
|
14
|
-
spec.license = 'MIT'
|
15
|
-
|
16
|
-
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
|
-
f.match(%r{^(test|spec|features)/})
|
18
|
-
end
|
19
|
-
spec.require_paths = ['lib']
|
20
|
-
|
21
|
-
spec.add_dependency 'logging', '~> 2'
|
22
|
-
|
23
|
-
spec.add_development_dependency 'mocha'
|
24
|
-
spec.add_development_dependency 'rake'
|
25
|
-
spec.add_development_dependency 'simplecov'
|
26
|
-
spec.add_development_dependency 'test-unit'
|
27
|
-
|
28
|
-
# TODO: Put this in a better location
|
29
|
-
spec.add_development_dependency 'ci_reporter_test_unit'
|
30
|
-
end
|