matrix_sdk 2.7.0 → 2.8.0
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/CHANGELOG.md +7 -0
- data/lib/matrix_sdk/bot/base.rb +5 -1
- data/lib/matrix_sdk/client.rb +6 -3
- data/lib/matrix_sdk/mxid.rb +1 -1
- data/lib/matrix_sdk/protocols/cs.rb +2 -0
- data/lib/matrix_sdk/room.rb +64 -67
- data/lib/matrix_sdk/util/state_event_cache.rb +92 -0
- data/lib/matrix_sdk/util/tinycache.rb +4 -10
- data/lib/matrix_sdk/util/tinycache_adapter.rb +6 -0
- data/lib/matrix_sdk/version.rb +1 -1
- data/lib/matrix_sdk.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd493a721423c1f1a7da7b2ff678ad8e1a949f258fe613616ebedab39d5ae204
|
4
|
+
data.tar.gz: 52e6563d1dbb42cd5acddf3809df720fb6ecc5b6f49cbdc14606450e908c32c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1fa0a6cbae2b6fa8ab91961df79082017be6a50028cc7b318ad70a5be9c76b8488b4b24cbef5e5a768ac34076236430683d518c18fccb296290599427bd71095
|
7
|
+
data.tar.gz: f62ad6791ee5f3921869d2431e55e3a1f44501af1b8c966a957fbcacbcaf809edb2e47b8d8b65d1393c268ff58b19e21fc966b1660c671d4d257121bf832dadf
|
data/CHANGELOG.md
CHANGED
data/lib/matrix_sdk/bot/base.rb
CHANGED
@@ -47,11 +47,15 @@ module MatrixSdk::Bot
|
|
47
47
|
client.join_room(ev[:room_id])
|
48
48
|
end
|
49
49
|
|
50
|
+
@event = nil
|
51
|
+
|
50
52
|
logger.warn 'The bot abstraction is not fully finalized and can be expected to change.'
|
51
53
|
end
|
52
54
|
|
53
55
|
def logger
|
54
|
-
@logger
|
56
|
+
return @logger if instance_variable_defined?(:@logger) && @logger
|
57
|
+
|
58
|
+
self.class.logger
|
55
59
|
end
|
56
60
|
|
57
61
|
def self.logger
|
data/lib/matrix_sdk/client.rb
CHANGED
@@ -21,8 +21,8 @@ module MatrixSdk
|
|
21
21
|
# @!attribute sync_filter [rw] The global sync filter
|
22
22
|
# @return [Hash,String] A filter definition, either as defined by the
|
23
23
|
# Matrix spec, or as an identifier returned by a filter creation request
|
24
|
-
attr_reader :api
|
25
|
-
attr_accessor :cache, :sync_filter, :
|
24
|
+
attr_reader :api
|
25
|
+
attr_accessor :cache, :sync_filter, :next_batch
|
26
26
|
|
27
27
|
events :error, :event, :account_data, :presence_event, :invite_event, :leave_event, :ephemeral_event, :state_event
|
28
28
|
ignore_inspect :api,
|
@@ -75,7 +75,6 @@ module MatrixSdk
|
|
75
75
|
@identity_server = nil
|
76
76
|
@mxid = nil
|
77
77
|
|
78
|
-
@sync_token = nil
|
79
78
|
@sync_thread = nil
|
80
79
|
@sync_filter = { room: { timeline: { limit: params.fetch(:sync_filter_limit, 20) }, state: { lazy_load_members: true } } }
|
81
80
|
|
@@ -99,6 +98,9 @@ module MatrixSdk
|
|
99
98
|
@mxid = params[:user_id]
|
100
99
|
end
|
101
100
|
|
101
|
+
alias sync_token next_batch
|
102
|
+
alias sync_token= next_batch=
|
103
|
+
|
102
104
|
# Gets the currently logged in user's MXID
|
103
105
|
#
|
104
106
|
# @return [MXID] The MXID of the current user
|
@@ -684,6 +686,7 @@ module MatrixSdk
|
|
684
686
|
# TODO Run this in a thread?
|
685
687
|
room.tinycache_adapter.cleanup
|
686
688
|
room.account_data.tinycache_adapter.cleanup
|
689
|
+
room.room_state.tinycache_adapter.cleanup
|
687
690
|
end
|
688
691
|
end
|
689
692
|
|
data/lib/matrix_sdk/mxid.rb
CHANGED
@@ -12,7 +12,7 @@ module MatrixSdk
|
|
12
12
|
|
13
13
|
# TODO: Community-as-a-Room / Profile-as-a-Room, in case they're going for room aliases
|
14
14
|
@sigil = identifier[0]
|
15
|
-
@localpart, @domain, @port = identifier[1
|
15
|
+
@localpart, @domain, @port = identifier[1..].split(':')
|
16
16
|
@port = @port.to_i if @port
|
17
17
|
|
18
18
|
raise ArgumentError, 'Identifier is not a valid MXID' unless valid?
|
@@ -519,6 +519,8 @@ module MatrixSdk::Protocols::CS
|
|
519
519
|
request(:put, client_api_latest, "/rooms/#{room_id}/state/#{event_type}#{"/#{state_key}" unless state_key.nil?}", body: content, query: query)
|
520
520
|
end
|
521
521
|
|
522
|
+
alias set_room_state send_state_event
|
523
|
+
|
522
524
|
# Sends a message event to a room
|
523
525
|
# @param room_id [MXID,String] The room ID to send the message event to
|
524
526
|
# @param event_type [String] The event type of the message
|
data/lib/matrix_sdk/room.rb
CHANGED
@@ -37,9 +37,6 @@ module MatrixSdk
|
|
37
37
|
cached :aliases, unless: proc { |args| args.any? }, cache_level: :all, expires_in: 60 * 60
|
38
38
|
cached :all_members, unless: proc { |args| args.any? }, cache_level: :all, expires_in: 60 * 60
|
39
39
|
|
40
|
-
# Much simpler to look up, and lighter data-wise, so the cache is wider
|
41
|
-
cached :canonical_alias, :name, :avatar_url, :topic, :guest_access, :join_rule, :power_levels, cache_level: :some, expires_in: 15 * 60
|
42
|
-
|
43
40
|
alias room_id id
|
44
41
|
alias members joined_members
|
45
42
|
|
@@ -84,6 +81,12 @@ module MatrixSdk
|
|
84
81
|
|
85
82
|
@prev_batch = nil
|
86
83
|
|
84
|
+
%i[name topic canonical_alias avatar_url].each do |type|
|
85
|
+
room_state.tinycache_adapter.write("m.room.#{type}", { type => data.delete(type) }) if data.key? type
|
86
|
+
end
|
87
|
+
room_state.tinycache_adapter.write('m.room.join_rules', { join_rule: data.delete(:join_rule) }) if data.key? :join_rule
|
88
|
+
room_state.tinycache_adapter.write('m.room.history_visibility', { history_visibility: data.delete(:world_readable) ? :world_readable : nil }) if data.key? :world_readable
|
89
|
+
|
87
90
|
data.each do |k, v|
|
88
91
|
next if %i[client].include? k
|
89
92
|
|
@@ -175,7 +178,7 @@ module MatrixSdk
|
|
175
178
|
|
176
179
|
# @return [String, nil] the canonical alias of the room
|
177
180
|
def canonical_alias
|
178
|
-
|
181
|
+
get_state('m.room.canonical_alias')[:alias]
|
179
182
|
rescue MatrixSdk::MatrixNotFoundError
|
180
183
|
nil
|
181
184
|
end
|
@@ -208,7 +211,7 @@ module MatrixSdk
|
|
208
211
|
#
|
209
212
|
# @return [String,nil] The room name - if any
|
210
213
|
def name
|
211
|
-
|
214
|
+
get_state('m.room.name')[:name]
|
212
215
|
rescue MatrixNotFoundError
|
213
216
|
# No room name has been specified
|
214
217
|
nil
|
@@ -244,7 +247,7 @@ module MatrixSdk
|
|
244
247
|
#
|
245
248
|
# @return [String,nil] The avatar URL - if any
|
246
249
|
def avatar_url
|
247
|
-
|
250
|
+
get_state('m.room.avatar_url')[:url]
|
248
251
|
rescue MatrixNotFoundError
|
249
252
|
# No avatar has been set
|
250
253
|
nil
|
@@ -254,7 +257,7 @@ module MatrixSdk
|
|
254
257
|
#
|
255
258
|
# @return [String,nil] The topic of the room
|
256
259
|
def topic
|
257
|
-
|
260
|
+
get_state('m.room.topic')[:topic]
|
258
261
|
rescue MatrixNotFoundError
|
259
262
|
# No room name has been specified
|
260
263
|
nil
|
@@ -264,14 +267,14 @@ module MatrixSdk
|
|
264
267
|
#
|
265
268
|
# @return [:can_join,:forbidden] The current guest access right
|
266
269
|
def guest_access
|
267
|
-
|
270
|
+
get_state('m.room.guest_access')[:guest_access]&.to_sym
|
268
271
|
end
|
269
272
|
|
270
273
|
# Gets the join rule for the room
|
271
274
|
#
|
272
275
|
# @return [:public,:knock,:invite,:private] The current join rule
|
273
276
|
def join_rule
|
274
|
-
|
277
|
+
get_state('m.room.join_rules')[:join_rule]&.to_sym
|
275
278
|
end
|
276
279
|
|
277
280
|
# Checks if +guest_access+ is set to +:can_join+
|
@@ -289,11 +292,27 @@ module MatrixSdk
|
|
289
292
|
join_rule == :knock
|
290
293
|
end
|
291
294
|
|
295
|
+
def room_state
|
296
|
+
return MatrixSdk::Util::StateEventCache.new self if client.cache == :none
|
297
|
+
|
298
|
+
@room_state ||= MatrixSdk::Util::StateEventCache.new self
|
299
|
+
end
|
300
|
+
|
301
|
+
# Gets a state object in the room
|
302
|
+
def get_state(type, state_key: nil)
|
303
|
+
room_state[type, state_key]
|
304
|
+
end
|
305
|
+
|
306
|
+
# Sets a state object in the room
|
307
|
+
def set_state(type, data, state_key: nil)
|
308
|
+
room_state[type, state_key] = data
|
309
|
+
end
|
310
|
+
|
292
311
|
# Gets the history visibility of the room
|
293
312
|
#
|
294
313
|
# @return [:invited,:joined,:shared,:world_readable] The current history visibility for the room
|
295
314
|
def history_visibility
|
296
|
-
|
315
|
+
get_state('m.room.history_visibility')[:history_visibility]&.to_sym
|
297
316
|
end
|
298
317
|
|
299
318
|
# Checks if the room history is world readable
|
@@ -309,7 +328,7 @@ module MatrixSdk
|
|
309
328
|
# @param canonical_only [Boolean] Should the list of aliases only contain the canonical ones
|
310
329
|
# @return [Array[String]] The assigned room aliases
|
311
330
|
def aliases(canonical_only: true)
|
312
|
-
canonical =
|
331
|
+
canonical = get_state('m.room.canonical_alias') rescue {}
|
313
332
|
aliases = ([canonical[:alias]].compact + (canonical[:alt_aliases] || [])).uniq.sort
|
314
333
|
return aliases if canonical_only
|
315
334
|
|
@@ -598,8 +617,7 @@ module MatrixSdk
|
|
598
617
|
#
|
599
618
|
# @return [Response] The content of the m.room.create event
|
600
619
|
def creation_info
|
601
|
-
|
602
|
-
client.api.get_room_creation_info(id)
|
620
|
+
room_state['m.room.create']
|
603
621
|
end
|
604
622
|
|
605
623
|
# Retrieves the type of the room
|
@@ -607,9 +625,6 @@ module MatrixSdk
|
|
607
625
|
# @return ['m.space',String,nil] The type of the room
|
608
626
|
def room_type
|
609
627
|
# Can't change, so a permanent cache is ok
|
610
|
-
return @room_type if @room_type_retrieved || @room_type
|
611
|
-
|
612
|
-
@room_type_retrieved = true
|
613
628
|
@room_type ||= creation_info[:type]
|
614
629
|
end
|
615
630
|
|
@@ -617,6 +632,7 @@ module MatrixSdk
|
|
617
632
|
#
|
618
633
|
# @return [String] The version of the room
|
619
634
|
def room_version
|
635
|
+
# Can't change, so a permanent cache is ok
|
620
636
|
@room_version ||= creation_info[:room_version]
|
621
637
|
end
|
622
638
|
|
@@ -691,8 +707,7 @@ module MatrixSdk
|
|
691
707
|
#
|
692
708
|
# @param name [String] The new name to set
|
693
709
|
def name=(name)
|
694
|
-
|
695
|
-
client.api.set_room_name(id, name)
|
710
|
+
room_state['m.room.name'] = { name: name }
|
696
711
|
name
|
697
712
|
end
|
698
713
|
|
@@ -700,7 +715,7 @@ module MatrixSdk
|
|
700
715
|
#
|
701
716
|
# @return [Boolean] if the name was changed or not
|
702
717
|
def reload_name!
|
703
|
-
|
718
|
+
room_state.expire('m.room.name')
|
704
719
|
end
|
705
720
|
alias refresh_name! reload_name!
|
706
721
|
|
@@ -708,8 +723,7 @@ module MatrixSdk
|
|
708
723
|
#
|
709
724
|
# @param topic [String] The new topic to set
|
710
725
|
def topic=(topic)
|
711
|
-
|
712
|
-
client.api.set_room_topic(id, topic)
|
726
|
+
room_state['m.room.topic'] = { topic: topic }
|
713
727
|
topic
|
714
728
|
end
|
715
729
|
|
@@ -717,7 +731,7 @@ module MatrixSdk
|
|
717
731
|
#
|
718
732
|
# @return [Boolean] if the topic was changed or not
|
719
733
|
def reload_topic!
|
720
|
-
|
734
|
+
room_state.expire('m.room.topic')
|
721
735
|
end
|
722
736
|
alias refresh_topic! reload_topic!
|
723
737
|
|
@@ -736,6 +750,7 @@ module MatrixSdk
|
|
736
750
|
# @note The list of aliases is not sorted, ordering changes will result in
|
737
751
|
# alias list updates.
|
738
752
|
def reload_aliases!
|
753
|
+
room_state.expire('m.room.canonical_alias')
|
739
754
|
clear_aliases_cache
|
740
755
|
end
|
741
756
|
alias refresh_aliases! reload_aliases!
|
@@ -752,8 +767,7 @@ module MatrixSdk
|
|
752
767
|
#
|
753
768
|
# @param join_rule [:invite,:public] The join rule of the room
|
754
769
|
def join_rule=(join_rule)
|
755
|
-
|
756
|
-
tinycache_adapter.write(:join_rule, join_rule)
|
770
|
+
room_state['m.room.join_rules'] = { join_rule: join_rule }
|
757
771
|
join_rule
|
758
772
|
end
|
759
773
|
|
@@ -769,8 +783,7 @@ module MatrixSdk
|
|
769
783
|
#
|
770
784
|
# @param guest_access [:can_join,:forbidden] The new guest access status of the room
|
771
785
|
def guest_access=(guest_access)
|
772
|
-
|
773
|
-
tinycache_adapter.write(:guest_access, guest_access)
|
786
|
+
room_state['m.room.guest_access'] = { guest_access: guest_access }
|
774
787
|
guest_access
|
775
788
|
end
|
776
789
|
|
@@ -781,8 +794,7 @@ module MatrixSdk
|
|
781
794
|
avatar_url = URI(avatar_url) unless avatar_url.is_a? URI
|
782
795
|
raise ArgumentError, 'Must be a valid MXC URL' unless avatar_url.is_a? URI::MXC
|
783
796
|
|
784
|
-
|
785
|
-
tinycache_adapter.write(:avatar_url, avatar_url)
|
797
|
+
room_state['m.room.avatar_url'] = { avatar_url: avatar_url }
|
786
798
|
avatar_url
|
787
799
|
end
|
788
800
|
|
@@ -792,7 +804,7 @@ module MatrixSdk
|
|
792
804
|
# @return [Hash] The current power levels as set for the room
|
793
805
|
# @see Protocols::CS#get_power_levels
|
794
806
|
def power_levels
|
795
|
-
|
807
|
+
get_state('m.room.power_levels')
|
796
808
|
end
|
797
809
|
|
798
810
|
# Gets the power level of a user in the room
|
@@ -889,8 +901,9 @@ module MatrixSdk
|
|
889
901
|
def modify_user_power_levels(users = nil, users_default = nil)
|
890
902
|
return false if users.nil? && users_default.nil?
|
891
903
|
|
892
|
-
|
893
|
-
|
904
|
+
room_state.tinycache_adapter.expire 'm.room.power_levels'
|
905
|
+
|
906
|
+
data = power_levels
|
894
907
|
data[:users_default] = users_default unless users_default.nil?
|
895
908
|
|
896
909
|
if users
|
@@ -908,7 +921,7 @@ module MatrixSdk
|
|
908
921
|
end
|
909
922
|
end
|
910
923
|
|
911
|
-
|
924
|
+
room_state['m.room.power_levels'] = data
|
912
925
|
true
|
913
926
|
end
|
914
927
|
|
@@ -920,8 +933,9 @@ module MatrixSdk
|
|
920
933
|
def modify_required_power_levels(events = nil, params = {})
|
921
934
|
return false if events.nil? && (params.nil? || params.empty?)
|
922
935
|
|
923
|
-
|
924
|
-
|
936
|
+
room_state.tinycache_adapter.expire 'm.room.power_levels'
|
937
|
+
|
938
|
+
data = power_levels
|
925
939
|
data.merge!(params)
|
926
940
|
data.delete_if { |_k, v| v.nil? }
|
927
941
|
|
@@ -931,7 +945,7 @@ module MatrixSdk
|
|
931
945
|
data[:events].delete_if { |_k, v| v.nil? }
|
932
946
|
end
|
933
947
|
|
934
|
-
|
948
|
+
room_state['m.room.power_levels'] = data
|
935
949
|
true
|
936
950
|
end
|
937
951
|
|
@@ -948,26 +962,6 @@ module MatrixSdk
|
|
948
962
|
tinycache_adapter.write(:joined_members, members)
|
949
963
|
end
|
950
964
|
|
951
|
-
def handle_power_levels(event)
|
952
|
-
tinycache_adapter.write(:power_levels, event[:content])
|
953
|
-
end
|
954
|
-
|
955
|
-
def handle_room_name(event)
|
956
|
-
tinycache_adapter.write(:name, event.dig(*%i[content name]))
|
957
|
-
end
|
958
|
-
|
959
|
-
def handle_room_topic(event)
|
960
|
-
tinycache_adapter.write(:topic, event.dig(*%i[content topic]))
|
961
|
-
end
|
962
|
-
|
963
|
-
def handle_room_guest_access(event)
|
964
|
-
tinycache_adapter.write(:guest_access, event.dig(*%i[content guest_access])&.to_sym)
|
965
|
-
end
|
966
|
-
|
967
|
-
def handle_room_join_rules(event)
|
968
|
-
tinycache_adapter.write(:join_rule, event.dig(*%i[content join_rule])&.to_sym)
|
969
|
-
end
|
970
|
-
|
971
965
|
def handle_room_member(event)
|
972
966
|
return unless client.cache == :all
|
973
967
|
|
@@ -982,7 +976,8 @@ module MatrixSdk
|
|
982
976
|
end
|
983
977
|
|
984
978
|
def handle_room_canonical_alias(event)
|
985
|
-
|
979
|
+
room_state.tinycache_adapter.write('m.room.canonical_alias', event[:content], expires_in: room_state.cache_time)
|
980
|
+
canonical_alias = event.dig(*%i[content alias])
|
986
981
|
|
987
982
|
data = tinycache_adapter.read(:aliases) || []
|
988
983
|
data << canonical_alias
|
@@ -1003,16 +998,6 @@ module MatrixSdk
|
|
1003
998
|
}
|
1004
999
|
end
|
1005
1000
|
|
1006
|
-
INTERNAL_HANDLERS = {
|
1007
|
-
'm.room.canonical_alias' => :handle_room_canonical_alias,
|
1008
|
-
'm.room.guest_access' => :handle_room_guest_access,
|
1009
|
-
'm.room.join_rules' => :handle_room_join_rules,
|
1010
|
-
'm.room.member' => :handle_room_member,
|
1011
|
-
'm.room.name' => :handle_room_name,
|
1012
|
-
'm.room.power_levels' => :handle_power_levels,
|
1013
|
-
'm.room.topic' => :handle_room_topic
|
1014
|
-
}.freeze
|
1015
|
-
|
1016
1001
|
def put_event(event)
|
1017
1002
|
ensure_room_handlers[:event].fire(MatrixEvent.new(self, event), event[:type]) if room_handlers?
|
1018
1003
|
|
@@ -1037,8 +1022,20 @@ module MatrixSdk
|
|
1037
1022
|
ensure_room_handlers[:ephemeral_event].fire(MatrixEvent.new(self, event), event[:type])
|
1038
1023
|
end
|
1039
1024
|
|
1025
|
+
INTERNAL_HANDLERS = {
|
1026
|
+
'm.room.canonical_alias' => :handle_room_canonical_alias,
|
1027
|
+
'm.room.member' => :handle_room_member
|
1028
|
+
}.freeze
|
1029
|
+
|
1040
1030
|
def put_state_event(event)
|
1041
|
-
|
1031
|
+
if INTERNAL_HANDLERS.key? event[:type]
|
1032
|
+
send(INTERNAL_HANDLERS[event[:type]], event)
|
1033
|
+
elsif client.cache != :none
|
1034
|
+
adapter = room_state.tinycache_adapter
|
1035
|
+
key = event[:type]
|
1036
|
+
key += "|#{event[:state_key]}" unless event[:state_key].nil? || event[:state_key].empty?
|
1037
|
+
adapter.write(key, event[:content], expires_in: room_state.cache_time)
|
1038
|
+
end
|
1042
1039
|
|
1043
1040
|
return unless room_handlers?
|
1044
1041
|
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MatrixSdk::Util
|
4
|
+
class StateEventCache
|
5
|
+
extend MatrixSdk::Extensions
|
6
|
+
extend MatrixSdk::Util::Tinycache
|
7
|
+
include Enumerable
|
8
|
+
|
9
|
+
attr_reader :room
|
10
|
+
|
11
|
+
attr_accessor :cache_time
|
12
|
+
|
13
|
+
ignore_inspect :client, :room, :tinycache_adapter
|
14
|
+
|
15
|
+
def initialize(room, cache_time: 30 * 60, **_params)
|
16
|
+
raise ArgumentError, 'Must be given a Room instance' unless room.is_a? MatrixSdk::Room
|
17
|
+
|
18
|
+
@room = room
|
19
|
+
@cache_time = cache_time
|
20
|
+
end
|
21
|
+
|
22
|
+
def client
|
23
|
+
@room.client
|
24
|
+
end
|
25
|
+
|
26
|
+
def reload!
|
27
|
+
tinycache_adapter.clear
|
28
|
+
end
|
29
|
+
|
30
|
+
def keys
|
31
|
+
tinycache_adapter.send(:cache).keys.map do |type|
|
32
|
+
real_type = type.split('|').first
|
33
|
+
state_key = type.split('|').last
|
34
|
+
state_key = nil if state_key == real_type
|
35
|
+
|
36
|
+
[real_type, state_key]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def values
|
41
|
+
keys.map { |key| tinycache_adapter.read(key) }
|
42
|
+
end
|
43
|
+
|
44
|
+
def size
|
45
|
+
keys.count
|
46
|
+
end
|
47
|
+
|
48
|
+
def key?(type, key = nil)
|
49
|
+
keys.key?("#{type}#{key ? "|#{key}" : ''}")
|
50
|
+
end
|
51
|
+
|
52
|
+
def expire(type, key = nil)
|
53
|
+
tinycache_adapter.expire("#{type}#{key ? "|#{key}" : ''}")
|
54
|
+
end
|
55
|
+
|
56
|
+
def each(live: false)
|
57
|
+
return to_enum(__method__, live: live) { keys.count } unless block_given?
|
58
|
+
|
59
|
+
keys.each do |type|
|
60
|
+
real_type = type.split('|').first
|
61
|
+
state_key = type.split('|').last
|
62
|
+
state_key = nil if state_key == real_type
|
63
|
+
|
64
|
+
v = live ? self[real_type, key: state_key] : tinycache_adapter.read(type)
|
65
|
+
# hash = v.hash
|
66
|
+
yield [real_type, state_key], v
|
67
|
+
# self[key] = v if hash != v.hash
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def delete(type, key = nil)
|
72
|
+
type = type.to_s unless type.is_a? String
|
73
|
+
client.api.set_room_state(room.id, type, {}, **{ state_key: key }.compact)
|
74
|
+
tinycache_adapter.delete("#{type}#{key ? "|#{key}" : ''}")
|
75
|
+
end
|
76
|
+
|
77
|
+
def [](type, key = nil)
|
78
|
+
type = type.to_s unless type.is_a? String
|
79
|
+
tinycache_adapter.fetch("#{type}#{key ? "|#{key}" : ''}", expires_in: @cache_time) do
|
80
|
+
client.api.get_room_state(room.id, type, **{ key: key }.compact)
|
81
|
+
rescue MatrixSdk::MatrixNotFoundError
|
82
|
+
{}
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def []=(type, key = nil, value) # rubocop:disable Style/OptionalArguments Not possible to put optional last
|
87
|
+
type = type.to_s unless type.is_a? String
|
88
|
+
client.api.set_room_state(room.id, type, value, **{ state_key: key }.compact)
|
89
|
+
tinycache_adapter.write("#{type}#{key ? "|#{key}" : ''}", value)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -76,24 +76,18 @@ module MatrixSdk::Util
|
|
76
76
|
define_method(method_names[:with_cache]) do |*args|
|
77
77
|
tinycache_adapter.fetch(__send__(method_names[:cache_key], *args), expires_in: expires_in) do
|
78
78
|
named = args.delete_at(-1) if args.last.is_a? Hash
|
79
|
+
named ||= {}
|
79
80
|
|
80
|
-
|
81
|
-
__send__(method_names[:without_cache], *args, **named)
|
82
|
-
else
|
83
|
-
__send__(method_names[:without_cache], *args)
|
84
|
-
end
|
81
|
+
__send__(method_names[:without_cache], *args, **named)
|
85
82
|
end
|
86
83
|
end
|
87
84
|
|
88
85
|
define_method(method_names[:without_cache]) do |*args|
|
89
86
|
orig = method(method_name).super_method
|
90
87
|
named = args.delete_at(-1) if args.last.is_a? Hash
|
88
|
+
named ||= {}
|
91
89
|
|
92
|
-
|
93
|
-
orig.call(*args, **named)
|
94
|
-
else
|
95
|
-
orig.call(*args)
|
96
|
-
end
|
90
|
+
orig.call(*args, **named)
|
97
91
|
end
|
98
92
|
|
99
93
|
define_method(method_names[:clear_cache]) do |*args|
|
data/lib/matrix_sdk/version.rb
CHANGED
data/lib/matrix_sdk.rb
CHANGED
@@ -38,6 +38,7 @@ module MatrixSdk
|
|
38
38
|
|
39
39
|
module Util
|
40
40
|
autoload :AccountDataCache, 'matrix_sdk/util/account_data_cache'
|
41
|
+
autoload :StateEventCache, 'matrix_sdk/util/state_event_cache'
|
41
42
|
autoload :Tinycache, 'matrix_sdk/util/tinycache'
|
42
43
|
autoload :TinycacheAdapter, 'matrix_sdk/util/tinycache_adapter'
|
43
44
|
end
|
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.8.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: 2022-08-
|
11
|
+
date: 2022-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mocha
|
@@ -113,6 +113,7 @@ files:
|
|
113
113
|
- lib/matrix_sdk/util/account_data_cache.rb
|
114
114
|
- lib/matrix_sdk/util/events.rb
|
115
115
|
- lib/matrix_sdk/util/extensions.rb
|
116
|
+
- lib/matrix_sdk/util/state_event_cache.rb
|
116
117
|
- lib/matrix_sdk/util/tinycache.rb
|
117
118
|
- lib/matrix_sdk/util/tinycache_adapter.rb
|
118
119
|
- lib/matrix_sdk/util/uri.rb
|