matrix_sdk 2.1.3 → 2.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 +6 -0
- data/lib/matrix_sdk/api.rb +30 -22
- data/lib/matrix_sdk/client.rb +24 -2
- data/lib/matrix_sdk/extensions.rb +3 -1
- data/lib/matrix_sdk/mxid.rb +9 -14
- data/lib/matrix_sdk/protocols/cs.rb +31 -7
- data/lib/matrix_sdk/protocols/msc.rb +1 -1
- data/lib/matrix_sdk/response.rb +3 -1
- data/lib/matrix_sdk/room.rb +1 -3
- data/lib/matrix_sdk/user.rb +8 -0
- data/lib/matrix_sdk/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f16ccd1ed10b02a963b9dbd736e577375ca41b26fb45743bc0344f219b1d70f
|
4
|
+
data.tar.gz: 3d8eef54f71ccf9e04c0da896e6189fd8d4c2c34c269e2890de37dd4cec023a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 01de0cccbcf0724a101526190ea4e164ec1235daaa0e0c3d42ed445e760246b2b81a054ba4bd7e88229fdb0833e4fe3a8624a4de3dfd032bfa50b4f23946caf1
|
7
|
+
data.tar.gz: 1b177862e3b01aef4c10de6a4318b8348a5c6e00885f0b137ce13a269bf0d5579e6a72b93a87a9366b8d75ec2549518a7d21f2da5db4d7f1d60fa464ff11d83b
|
data/CHANGELOG.md
CHANGED
data/lib/matrix_sdk/api.rb
CHANGED
@@ -268,23 +268,6 @@ module MatrixSdk
|
|
268
268
|
u.query = [u.query, URI.encode_www_form(options.fetch(:query))].flatten.compact.join('&') if options[:query]
|
269
269
|
u.query = nil if u.query.nil? || u.query.empty?
|
270
270
|
end
|
271
|
-
request = Net::HTTP.const_get(method.to_s.capitalize.to_sym).new url.request_uri
|
272
|
-
request.body = options[:body] if options.key? :body
|
273
|
-
request.body = request.body.to_json if options.key?(:body) && !request.body.is_a?(String)
|
274
|
-
request.body_stream = options[:body_stream] if options.key? :body_stream
|
275
|
-
|
276
|
-
global_headers.each { |h, v| request[h] = v }
|
277
|
-
if request.body || request.body_stream
|
278
|
-
request.content_type = 'application/json'
|
279
|
-
request.content_length = (request.body || request.body_stream).size
|
280
|
-
end
|
281
|
-
|
282
|
-
request['authorization'] = "Bearer #{access_token}" if access_token && !options.fetch(:skip_auth, false)
|
283
|
-
if options.key? :headers
|
284
|
-
options[:headers].each do |h, v|
|
285
|
-
request[h.to_s.downcase] = v
|
286
|
-
end
|
287
|
-
end
|
288
271
|
|
289
272
|
failures = 0
|
290
273
|
loop do
|
@@ -292,10 +275,11 @@ module MatrixSdk
|
|
292
275
|
|
293
276
|
req_id = ('A'..'Z').to_a.sample(4).join
|
294
277
|
|
295
|
-
|
278
|
+
req_obj = construct_request(url: url, method: method, **options)
|
279
|
+
print_http(req_obj, id: req_id)
|
296
280
|
begin
|
297
281
|
dur_start = Time.now
|
298
|
-
response = http.request
|
282
|
+
response = http.request req_obj
|
299
283
|
dur_end = Time.now
|
300
284
|
duration = dur_end - dur_start
|
301
285
|
rescue EOFError
|
@@ -344,14 +328,38 @@ module MatrixSdk
|
|
344
328
|
|
345
329
|
private
|
346
330
|
|
331
|
+
def construct_request(method:, url:, **options)
|
332
|
+
request = Net::HTTP.const_get(method.to_s.capitalize.to_sym).new url.request_uri
|
333
|
+
|
334
|
+
# FIXME: Handle bodies better, avoid duplicating work
|
335
|
+
request.body = options[:body] if options.key? :body
|
336
|
+
request.body = request.body.to_json if options.key?(:body) && !request.body.is_a?(String)
|
337
|
+
request.body_stream = options[:body_stream] if options.key? :body_stream
|
338
|
+
|
339
|
+
global_headers.each { |h, v| request[h] = v }
|
340
|
+
if request.body || request.body_stream
|
341
|
+
request.content_type = 'application/json'
|
342
|
+
request.content_length = (request.body || request.body_stream).size
|
343
|
+
end
|
344
|
+
|
345
|
+
request['authorization'] = "Bearer #{access_token}" if access_token && !options.fetch(:skip_auth, false)
|
346
|
+
if options.key? :headers
|
347
|
+
options[:headers].each do |h, v|
|
348
|
+
request[h.to_s.downcase] = v
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
352
|
+
request
|
353
|
+
end
|
354
|
+
|
347
355
|
def print_http(http, body: true, duration: nil, id: nil)
|
348
356
|
return unless logger.debug?
|
349
357
|
|
350
358
|
if http.is_a? Net::HTTPRequest
|
351
|
-
dir = "#{id ? id
|
359
|
+
dir = "#{id ? "#{id} : " : nil}>"
|
352
360
|
logger.debug "#{dir} Sending a #{http.method} request to `#{http.path}`:"
|
353
361
|
else
|
354
|
-
dir = "#{id ? id
|
362
|
+
dir = "#{id ? "#{id} : " : nil}<"
|
355
363
|
logger.debug "#{dir} Received a #{http.code} #{http.message} response:#{duration ? " [#{(duration * 1000).to_i}ms]" : nil}"
|
356
364
|
end
|
357
365
|
http.to_hash.map { |k, v| "#{k}: #{k == 'authorization' ? '[ REDACTED ]' : v.join(', ')}" }.each do |h|
|
@@ -360,7 +368,7 @@ module MatrixSdk
|
|
360
368
|
logger.debug dir
|
361
369
|
if body
|
362
370
|
clean_body = JSON.parse(http.body) rescue nil if http.body
|
363
|
-
clean_body.
|
371
|
+
clean_body.each_key { |k| clean_body[k] = '[ REDACTED ]' if %w[password access_token].include?(k) }.to_json if clean_body.is_a? Hash
|
364
372
|
clean_body = clean_body.to_s if clean_body
|
365
373
|
logger.debug "#{dir} #{clean_body.length < 200 ? clean_body : clean_body.slice(0..200) + "... [truncated, #{clean_body.length} Bytes]"}" if clean_body
|
366
374
|
end
|
data/lib/matrix_sdk/client.rb
CHANGED
@@ -156,6 +156,27 @@ module MatrixSdk
|
|
156
156
|
rooms
|
157
157
|
end
|
158
158
|
|
159
|
+
# Gets a list of all direct chat rooms (1:1 chats / direct message chats) for the currenct user
|
160
|
+
#
|
161
|
+
# @return [Hash[String,Array[String]]] A mapping of MXIDs to a list of direct rooms with that user
|
162
|
+
def direct_rooms
|
163
|
+
Hash[api.get_account_data(mxid, 'm.direct').map do |mxid, rooms|
|
164
|
+
[mxid.to_s, rooms]
|
165
|
+
end]
|
166
|
+
end
|
167
|
+
|
168
|
+
# Gets a direct message room for the given user if one exists
|
169
|
+
#
|
170
|
+
# @note Will return the oldest room if multiple exist
|
171
|
+
# @return [Room,nil] A direct message room if one exists
|
172
|
+
def direct_room(mxid)
|
173
|
+
mxid = MatrixSdk::MXID.new mxid.to_s unless mxid.is_a? MatrixSdk::MXID
|
174
|
+
raise ArgumentError, 'Must be a valid user ID' unless mxid.user?
|
175
|
+
|
176
|
+
room_id = direct_rooms[mxid.to_s]&.first
|
177
|
+
ensure_room room_id if room_id
|
178
|
+
end
|
179
|
+
|
159
180
|
# Gets a list of all relevant rooms, either the ones currently handled by
|
160
181
|
# the client, or the list of currently joined ones if no rooms are handled
|
161
182
|
#
|
@@ -433,10 +454,11 @@ module MatrixSdk
|
|
433
454
|
errors = 0
|
434
455
|
thread, cancel_token = api.msc2108_sync_sse(params) do |data, event:, id:|
|
435
456
|
@next_batch = id if id
|
436
|
-
|
457
|
+
case event.to_sym
|
458
|
+
when :sync
|
437
459
|
handle_sync_response(data)
|
438
460
|
errors = 0
|
439
|
-
|
461
|
+
when :sync_error
|
440
462
|
logger.error "SSE Sync error received; #{data.type}: #{data.message}"
|
441
463
|
errors += 1
|
442
464
|
|
data/lib/matrix_sdk/mxid.rb
CHANGED
@@ -32,13 +32,13 @@ module MatrixSdk
|
|
32
32
|
#
|
33
33
|
# @return [String]
|
34
34
|
def homeserver
|
35
|
-
port_s = port ?
|
35
|
+
port_s = port ? ":#{port}" : ''
|
36
36
|
domain ? domain + port_s : ''
|
37
37
|
end
|
38
38
|
|
39
39
|
# Gets the homserver part of the ID as a suffix (':homeserver')
|
40
40
|
def homeserver_suffix
|
41
|
-
|
41
|
+
":#{homeserver}" if domain
|
42
42
|
end
|
43
43
|
|
44
44
|
def to_s
|
@@ -49,18 +49,13 @@ module MatrixSdk
|
|
49
49
|
#
|
50
50
|
# @return [Symbol] The MXID type, one of (:user_id, :room_id, :event_id, :group_id, or :room_alias)
|
51
51
|
def type
|
52
|
-
|
53
|
-
|
54
|
-
:
|
55
|
-
|
56
|
-
:
|
57
|
-
|
58
|
-
|
59
|
-
when '+'
|
60
|
-
:group_id
|
61
|
-
when '#'
|
62
|
-
:room_alias
|
63
|
-
end
|
52
|
+
{
|
53
|
+
'@' => :user_id,
|
54
|
+
'!' => :room_id,
|
55
|
+
'$' => :event_id,
|
56
|
+
'+' => :group_id,
|
57
|
+
'#' => :room_alias
|
58
|
+
}[sigil]
|
64
59
|
end
|
65
60
|
|
66
61
|
# Checks if the ID is valid
|
@@ -767,6 +767,30 @@ module MatrixSdk::Protocols::CS
|
|
767
767
|
request(:get, :client_r0, "/rooms/#{room_id}/state", query: query)
|
768
768
|
end
|
769
769
|
|
770
|
+
# Retrieves number of events that happened just before and after the specified event
|
771
|
+
#
|
772
|
+
# @param room_id [MXID,String] The room to get events from.
|
773
|
+
# @param event_id [MXID,String] The event to get context around.
|
774
|
+
# @option params [Integer] :limit (10) The limit of messages to retrieve
|
775
|
+
# @option params [String] :filter A filter to limit the retrieval to
|
776
|
+
# @return [Response] A response hash with contextual event information
|
777
|
+
# @see https://matrix.org/docs/spec/client_server/r0.6.1#get-matrix-client-r0-rooms-roomid-context-eventid
|
778
|
+
# The Matrix Spec, for more information about the call and response
|
779
|
+
# @example Find event context with filter and limit specified
|
780
|
+
# api.get_room_event_context('#room:example.com', '$event_id:example.com', filter: { types: ['m.room.message'] }.to_json, limit: 20)
|
781
|
+
def get_room_event_context(room_id, event_id, **params)
|
782
|
+
query = {}
|
783
|
+
query[:user_id] = params.delete(:user_id) if protocol?(:AS) && params.key?(:user_id)
|
784
|
+
|
785
|
+
query[:limit] = params.fetch(:limit) if params.key? :limit
|
786
|
+
query[:filter] = params.fetch(:filter) if params.key? :filter
|
787
|
+
|
788
|
+
room_id = ERB::Util.url_encode room_id.to_s
|
789
|
+
event_id = ERB::Util.url_encode event_id.to_s
|
790
|
+
|
791
|
+
request(:get, :client_r0, "/rooms/#{room_id}/context/#{event_id}", query: query)
|
792
|
+
end
|
793
|
+
|
770
794
|
## Specialized getters for specced state
|
771
795
|
#
|
772
796
|
|
@@ -1085,7 +1109,7 @@ module MatrixSdk::Protocols::CS
|
|
1085
1109
|
# @return [Response] The resulting state event
|
1086
1110
|
# @see https://matrix.org/docs/spec/client_server/latest.html#m-room-guest-server-acl
|
1087
1111
|
# The Matrix Spec, for more information about the event and data
|
1088
|
-
def set_room_server_acl(room_id, allow_ip_literals: false,
|
1112
|
+
def set_room_server_acl(room_id, allow:, deny:, allow_ip_literals: false, **params)
|
1089
1113
|
content = {
|
1090
1114
|
allow_ip_literals: allow_ip_literals,
|
1091
1115
|
allow: allow,
|
@@ -1712,7 +1736,7 @@ module MatrixSdk::Protocols::CS
|
|
1712
1736
|
# # => { :device_keys => { :'@alice:example.com' => { :ABCDEFGHIJ => { ...
|
1713
1737
|
# @see https://matrix.org/docs/spec/client_server/latest#post-matrix-client-r0-keys-query
|
1714
1738
|
# The Matrix Spec, for more information about the parameters and data
|
1715
|
-
def keys_query(timeout: nil,
|
1739
|
+
def keys_query(device_keys:, timeout: nil, token: nil, **params)
|
1716
1740
|
body = {
|
1717
1741
|
timeout: (timeout || 10) * 1000,
|
1718
1742
|
device_keys: device_keys
|
@@ -1834,7 +1858,7 @@ module MatrixSdk::Protocols::CS
|
|
1834
1858
|
# @return [Response] A response hash containing the full data of the requested push rule
|
1835
1859
|
# @see https://matrix.org/docs/spec/client_server/latest#get-matrix-client-r0-pushrules-scope-kind-ruleid
|
1836
1860
|
# The Matrix Spec, for more information about the parameters and data
|
1837
|
-
def get_pushrule(scope: 'global'
|
1861
|
+
def get_pushrule(kind:, id:, scope: 'global')
|
1838
1862
|
scope = ERB::Util.url_encode scope.to_s
|
1839
1863
|
kind = ERB::Util.url_encode kind.to_s
|
1840
1864
|
id = ERB::Util.url_encode id.to_s
|
@@ -1850,7 +1874,7 @@ module MatrixSdk::Protocols::CS
|
|
1850
1874
|
# @return [Response] A response hash containing an :enabled key for if the rule is enabled or not
|
1851
1875
|
# @see https://matrix.org/docs/spec/client_server/latest#get-matrix-client-r0-pushrules-scope-kind-ruleid-enabled
|
1852
1876
|
# The Matrix Spec, for more information about the parameters and data
|
1853
|
-
def get_pushrule_enabled(scope: 'global'
|
1877
|
+
def get_pushrule_enabled(kind:, id:, scope: 'global')
|
1854
1878
|
scope = ERB::Util.url_encode scope.to_s
|
1855
1879
|
kind = ERB::Util.url_encode kind.to_s
|
1856
1880
|
id = ERB::Util.url_encode id.to_s
|
@@ -1867,7 +1891,7 @@ module MatrixSdk::Protocols::CS
|
|
1867
1891
|
# @return [Response] An empty response hash if the push rule was enabled/disabled successfully
|
1868
1892
|
# @see https://matrix.org/docs/spec/client_server/latest#put-matrix-client-r0-pushrules-scope-kind-ruleid-enabled
|
1869
1893
|
# The Matrix Spec, for more information about the parameters and data
|
1870
|
-
def set_pushrule_enabled(enabled, scope: 'global'
|
1894
|
+
def set_pushrule_enabled(enabled, kind:, id:, scope: 'global')
|
1871
1895
|
scope = ERB::Util.url_encode scope.to_s
|
1872
1896
|
kind = ERB::Util.url_encode kind.to_s
|
1873
1897
|
id = ERB::Util.url_encode id.to_s
|
@@ -1887,7 +1911,7 @@ module MatrixSdk::Protocols::CS
|
|
1887
1911
|
# @return [Response] A response hash containing an :enabled key for if the rule is enabled or not
|
1888
1912
|
# @see https://matrix.org/docs/spec/client_server/latest#get-matrix-client-r0-pushrules-scope-kind-ruleid-actions
|
1889
1913
|
# The Matrix Spec, for more information about the parameters and data
|
1890
|
-
def get_pushrule_actions(scope: 'global'
|
1914
|
+
def get_pushrule_actions(kind:, id:, scope: 'global')
|
1891
1915
|
scope = ERB::Util.url_encode scope.to_s
|
1892
1916
|
kind = ERB::Util.url_encode kind.to_s
|
1893
1917
|
id = ERB::Util.url_encode id.to_s
|
@@ -1904,7 +1928,7 @@ module MatrixSdk::Protocols::CS
|
|
1904
1928
|
# @return [Response] An empty response hash if the push rule actions were modified successfully
|
1905
1929
|
# @see https://matrix.org/docs/spec/client_server/latest#put-matrix-client-r0-pushrules-scope-kind-ruleid-actions
|
1906
1930
|
# The Matrix Spec, for more information about the parameters and data
|
1907
|
-
def set_pushrule_actions(actions, scope: 'global'
|
1931
|
+
def set_pushrule_actions(actions, kind:, id:, scope: 'global')
|
1908
1932
|
scope = ERB::Util.url_encode scope.to_s
|
1909
1933
|
kind = ERB::Util.url_encode kind.to_s
|
1910
1934
|
id = ERB::Util.url_encode id.to_s
|
@@ -47,7 +47,7 @@ module MatrixSdk::Protocols::MSC
|
|
47
47
|
query[:user_id] = params.delete(:user_id) if protocol?(:AS) && params.key?(:user_id)
|
48
48
|
|
49
49
|
req = Net::HTTP::Get.new(homeserver.dup.tap do |u|
|
50
|
-
u.path = api_to_path
|
50
|
+
u.path = "#{api_to_path :client_r0}/sync/sse"
|
51
51
|
u.query = URI.encode_www_form(query)
|
52
52
|
end)
|
53
53
|
req['accept'] = 'text/event-stream'
|
data/lib/matrix_sdk/response.rb
CHANGED
data/lib/matrix_sdk/room.rb
CHANGED
@@ -104,7 +104,6 @@ module MatrixSdk
|
|
104
104
|
logger.debug "Created room #{room_id}"
|
105
105
|
end
|
106
106
|
|
107
|
-
|
108
107
|
#
|
109
108
|
# Event handlers
|
110
109
|
#
|
@@ -127,7 +126,6 @@ module MatrixSdk
|
|
127
126
|
ensure_room_handlers[:ephemeral_event]
|
128
127
|
end
|
129
128
|
|
130
|
-
|
131
129
|
#
|
132
130
|
# State readers
|
133
131
|
#
|
@@ -365,7 +363,7 @@ module MatrixSdk
|
|
365
363
|
# @param reverse [Boolean] whether to fill messages in reverse or not
|
366
364
|
# @param limit [Integer] the maximum number of messages to backfill
|
367
365
|
# @note This will trigger the `on_event` events as messages are added
|
368
|
-
def backfill_messages(reverse = false, limit = 10)
|
366
|
+
def backfill_messages(reverse = false, limit = 10) # rubocop:disable Style/OptionalBooleanParameter
|
369
367
|
data = client.api.get_room_messages(id, @prev_batch, direction: :b, limit: limit)
|
370
368
|
|
371
369
|
events = data[:chunk]
|
data/lib/matrix_sdk/user.rb
CHANGED
@@ -122,6 +122,14 @@ module MatrixSdk
|
|
122
122
|
Time.now - (since / 1000)
|
123
123
|
end
|
124
124
|
|
125
|
+
# Gets a direct message room with the user if one exists
|
126
|
+
#
|
127
|
+
# @return [Room,nil] A direct message room if one exists
|
128
|
+
# @see MatrixSdk::Client#direct_room
|
129
|
+
def direct_room
|
130
|
+
client.direct_room(id)
|
131
|
+
end
|
132
|
+
|
125
133
|
# Returns all the current device keys for the user, retrieving them if necessary
|
126
134
|
def device_keys
|
127
135
|
@device_keys ||= client.api.keys_query(device_keys: { id => [] }).yield_self do |resp|
|
data/lib/matrix_sdk/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: matrix_sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.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: 2020-
|
11
|
+
date: 2020-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mocha
|