matrix_sdk 2.1.0 → 2.3.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 +37 -0
- data/README.md +1 -1
- data/lib/matrix_sdk.rb +6 -1
- data/lib/matrix_sdk/api.rb +87 -45
- data/lib/matrix_sdk/client.rb +56 -42
- data/lib/matrix_sdk/errors.rb +4 -0
- data/lib/matrix_sdk/mxid.rb +9 -14
- data/lib/matrix_sdk/protocols/cs.rb +61 -37
- data/lib/matrix_sdk/protocols/msc.rb +1 -1
- data/lib/matrix_sdk/response.rb +3 -1
- data/lib/matrix_sdk/room.rb +312 -109
- data/lib/matrix_sdk/user.rb +8 -0
- data/lib/matrix_sdk/{extensions.rb → util/events.rb} +4 -86
- data/lib/matrix_sdk/util/extensions.rb +90 -0
- data/lib/matrix_sdk/util/tinycache.rb +122 -0
- data/lib/matrix_sdk/util/tinycache_adapter.rb +72 -0
- data/lib/matrix_sdk/version.rb +1 -1
- metadata +10 -8
- data/lib/matrix_sdk/application_service.rb +0 -212
    
        data/lib/matrix_sdk/errors.rb
    CHANGED
    
    | @@ -41,9 +41,13 @@ module MatrixSdk | |
| 41 41 | 
             
              end
         | 
| 42 42 |  | 
| 43 43 | 
             
              class MatrixNotAuthorizedError < MatrixRequestError; end
         | 
| 44 | 
            +
             | 
| 44 45 | 
             
              class MatrixForbiddenError < MatrixRequestError; end
         | 
| 46 | 
            +
             | 
| 45 47 | 
             
              class MatrixNotFoundError < MatrixRequestError; end
         | 
| 48 | 
            +
             | 
| 46 49 | 
             
              class MatrixConflictError < MatrixRequestError; end
         | 
| 50 | 
            +
             | 
| 47 51 | 
             
              class MatrixTooManyRequestsError < MatrixRequestError; end
         | 
| 48 52 |  | 
| 49 53 | 
             
              # An error raised when errors occur in the connection layer
         | 
    
        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
         | 
| @@ -584,7 +584,7 @@ module MatrixSdk::Protocols::CS | |
| 584 584 | 
             
                }
         | 
| 585 585 | 
             
                content.merge!(params.fetch(:extra_content)) if params.key? :extra_content
         | 
| 586 586 |  | 
| 587 | 
            -
                send_message_event(room_id, 'm.room.message', content, params)
         | 
| 587 | 
            +
                send_message_event(room_id, 'm.room.message', content, **params)
         | 
| 588 588 | 
             
              end
         | 
| 589 589 |  | 
| 590 590 | 
             
              # Send a geographic location to a room
         | 
| @@ -610,7 +610,7 @@ module MatrixSdk::Protocols::CS | |
| 610 610 | 
             
                content[:info][:thumbnail_url] = params.delete(:thumbnail_url) if params.key? :thumbnail_url
         | 
| 611 611 | 
             
                content[:info][:thumbnail_info] = params.delete(:thumbnail_info) if params.key? :thumbnail_info
         | 
| 612 612 |  | 
| 613 | 
            -
                send_message_event(room_id, 'm.room.message', content, params)
         | 
| 613 | 
            +
                send_message_event(room_id, 'm.room.message', content, **params)
         | 
| 614 614 | 
             
              end
         | 
| 615 615 |  | 
| 616 616 | 
             
              # Send a plaintext message to a room
         | 
| @@ -628,7 +628,7 @@ module MatrixSdk::Protocols::CS | |
| 628 628 | 
             
                  msgtype: params.delete(:msg_type) { 'm.text' },
         | 
| 629 629 | 
             
                  body: message
         | 
| 630 630 | 
             
                }
         | 
| 631 | 
            -
                send_message_event(room_id, 'm.room.message', content, params)
         | 
| 631 | 
            +
                send_message_event(room_id, 'm.room.message', content, **params)
         | 
| 632 632 | 
             
              end
         | 
| 633 633 |  | 
| 634 634 | 
             
              # Send a plaintext emote to a room
         | 
| @@ -646,7 +646,7 @@ module MatrixSdk::Protocols::CS | |
| 646 646 | 
             
                  msgtype: params.delete(:msg_type) { 'm.emote' },
         | 
| 647 647 | 
             
                  body: emote
         | 
| 648 648 | 
             
                }
         | 
| 649 | 
            -
                send_message_event(room_id, 'm.room.message', content, params)
         | 
| 649 | 
            +
                send_message_event(room_id, 'm.room.message', content, **params)
         | 
| 650 650 | 
             
              end
         | 
| 651 651 |  | 
| 652 652 | 
             
              # Send a plaintext notice to a room
         | 
| @@ -664,7 +664,7 @@ module MatrixSdk::Protocols::CS | |
| 664 664 | 
             
                  msgtype: params.delete(:msg_type) { 'm.notice' },
         | 
| 665 665 | 
             
                  body: notice
         | 
| 666 666 | 
             
                }
         | 
| 667 | 
            -
                send_message_event(room_id, 'm.room.message', content, params)
         | 
| 667 | 
            +
                send_message_event(room_id, 'm.room.message', content, **params)
         | 
| 668 668 | 
             
              end
         | 
| 669 669 |  | 
| 670 670 | 
             
              # Report an event in a room
         | 
| @@ -702,7 +702,7 @@ module MatrixSdk::Protocols::CS | |
| 702 702 | 
             
              # @return [Response] A response hash with the message information containing :start, :end, and :chunk fields
         | 
| 703 703 | 
             
              # @see https://matrix.org/docs/spec/client_server/latest.html#get-matrix-client-r0-rooms-roomid-messages
         | 
| 704 704 | 
             
              #      The Matrix Spec, for more information about the call and response
         | 
| 705 | 
            -
              def get_room_messages(room_id, token, direction | 
| 705 | 
            +
              def get_room_messages(room_id, token, direction:, limit: 10, **params)
         | 
| 706 706 | 
             
                query = {
         | 
| 707 707 | 
             
                  from: token,
         | 
| 708 708 | 
             
                  dir: direction,
         | 
| @@ -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 |  | 
| @@ -780,7 +804,7 @@ module MatrixSdk::Protocols::CS | |
| 780 804 | 
             
              # @see https://matrix.org/docs/spec/client_server/latest.html#m-room-name
         | 
| 781 805 | 
             
              #      The Matrix Spec, for more information about the event and data
         | 
| 782 806 | 
             
              def get_room_name(room_id, **params)
         | 
| 783 | 
            -
                get_room_state(room_id, 'm.room.name', params)
         | 
| 807 | 
            +
                get_room_state(room_id, 'm.room.name', **params)
         | 
| 784 808 | 
             
              end
         | 
| 785 809 |  | 
| 786 810 | 
             
              # Sets the display name of a room
         | 
| @@ -795,7 +819,7 @@ module MatrixSdk::Protocols::CS | |
| 795 819 | 
             
                content = {
         | 
| 796 820 | 
             
                  name: name
         | 
| 797 821 | 
             
                }
         | 
| 798 | 
            -
                send_state_event(room_id, 'm.room.name', content, params)
         | 
| 822 | 
            +
                send_state_event(room_id, 'm.room.name', content, **params)
         | 
| 799 823 | 
             
              end
         | 
| 800 824 |  | 
| 801 825 | 
             
              # Gets the current topic of a room
         | 
| @@ -808,7 +832,7 @@ module MatrixSdk::Protocols::CS | |
| 808 832 | 
             
              # @see https://matrix.org/docs/spec/client_server/latest.html#m-room-topic
         | 
| 809 833 | 
             
              #      The Matrix Spec, for more information about the event and data
         | 
| 810 834 | 
             
              def get_room_topic(room_id, **params)
         | 
| 811 | 
            -
                get_room_state(room_id, 'm.room.topic', params)
         | 
| 835 | 
            +
                get_room_state(room_id, 'm.room.topic', **params)
         | 
| 812 836 | 
             
              end
         | 
| 813 837 |  | 
| 814 838 | 
             
              # Sets the topic of a room
         | 
| @@ -823,7 +847,7 @@ module MatrixSdk::Protocols::CS | |
| 823 847 | 
             
                content = {
         | 
| 824 848 | 
             
                  topic: topic
         | 
| 825 849 | 
             
                }
         | 
| 826 | 
            -
                send_state_event(room_id, 'm.room.topic', content, params)
         | 
| 850 | 
            +
                send_state_event(room_id, 'm.room.topic', content, **params)
         | 
| 827 851 | 
             
              end
         | 
| 828 852 |  | 
| 829 853 | 
             
              # Gets the current avatar URL of a room
         | 
| @@ -836,7 +860,7 @@ module MatrixSdk::Protocols::CS | |
| 836 860 | 
             
              # @see https://matrix.org/docs/spec/client_server/latest.html#m-room-avatar
         | 
| 837 861 | 
             
              #      The Matrix Spec, for more information about the event and data
         | 
| 838 862 | 
             
              def get_room_avatar(room_id, **params)
         | 
| 839 | 
            -
                get_room_state(room_id, 'm.room.avatar', params)
         | 
| 863 | 
            +
                get_room_state(room_id, 'm.room.avatar', **params)
         | 
| 840 864 | 
             
              end
         | 
| 841 865 |  | 
| 842 866 | 
             
              # Sets the avatar URL for a room
         | 
| @@ -851,7 +875,7 @@ module MatrixSdk::Protocols::CS | |
| 851 875 | 
             
                content = {
         | 
| 852 876 | 
             
                  url: url
         | 
| 853 877 | 
             
                }
         | 
| 854 | 
            -
                send_state_event(room_id, 'm.room.avatar', content, params)
         | 
| 878 | 
            +
                send_state_event(room_id, 'm.room.avatar', content, **params)
         | 
| 855 879 | 
             
              end
         | 
| 856 880 |  | 
| 857 881 | 
             
              # Gets a list of current aliases of a room
         | 
| @@ -878,7 +902,7 @@ module MatrixSdk::Protocols::CS | |
| 878 902 | 
             
              #      .compact
         | 
| 879 903 | 
             
              #   # => ["#synapse:im.kabi.tk", "#synapse:matrix.org", "#synapse-community:matrix.org", "#synapse-ops:matrix.org", "#synops:matrix.org", ...
         | 
| 880 904 | 
             
              def get_room_aliases(room_id, **params)
         | 
| 881 | 
            -
                get_room_state(room_id, 'm.room.aliases', params)
         | 
| 905 | 
            +
                get_room_state(room_id, 'm.room.aliases', **params)
         | 
| 882 906 | 
             
              end
         | 
| 883 907 |  | 
| 884 908 | 
             
              # Gets a list of pinned events in a room
         | 
| @@ -891,7 +915,7 @@ module MatrixSdk::Protocols::CS | |
| 891 915 | 
             
              # @see https://matrix.org/docs/spec/client_server/latest.html#m-room-pinned-events
         | 
| 892 916 | 
             
              #      The Matrix Spec, for more information about the event and data
         | 
| 893 917 | 
             
              def get_room_pinned_events(room_id, **params)
         | 
| 894 | 
            -
                get_room_state(room_id, 'm.room.pinned_events', params)
         | 
| 918 | 
            +
                get_room_state(room_id, 'm.room.pinned_events', **params)
         | 
| 895 919 | 
             
              end
         | 
| 896 920 |  | 
| 897 921 | 
             
              # Sets the list of pinned events in a room
         | 
| @@ -906,7 +930,7 @@ module MatrixSdk::Protocols::CS | |
| 906 930 | 
             
                content = {
         | 
| 907 931 | 
             
                  pinned: events
         | 
| 908 932 | 
             
                }
         | 
| 909 | 
            -
                send_state_event(room_id, 'm.room.pinned_events', content, params)
         | 
| 933 | 
            +
                send_state_event(room_id, 'm.room.pinned_events', content, **params)
         | 
| 910 934 | 
             
              end
         | 
| 911 935 |  | 
| 912 936 | 
             
              # Gets the configured power levels for a room
         | 
| @@ -918,7 +942,7 @@ module MatrixSdk::Protocols::CS | |
| 918 942 | 
             
              # @see https://matrix.org/docs/spec/client_server/latest.html#m-room-power-levels
         | 
| 919 943 | 
             
              #      The Matrix Spec, for more information about the event and data
         | 
| 920 944 | 
             
              def get_room_power_levels(room_id, **params)
         | 
| 921 | 
            -
                get_room_state(room_id, 'm.room.power_levels', params)
         | 
| 945 | 
            +
                get_room_state(room_id, 'm.room.power_levels', **params)
         | 
| 922 946 | 
             
              end
         | 
| 923 947 | 
             
              alias get_power_levels get_room_power_levels
         | 
| 924 948 |  | 
| @@ -932,7 +956,7 @@ module MatrixSdk::Protocols::CS | |
| 932 956 | 
             
              #      The Matrix Spec, for more information about the event and data
         | 
| 933 957 | 
             
              def set_room_power_levels(room_id, content, **params)
         | 
| 934 958 | 
             
                content[:events] = {} unless content.key? :events
         | 
| 935 | 
            -
                send_state_event(room_id, 'm.room.power_levels', content, params)
         | 
| 959 | 
            +
                send_state_event(room_id, 'm.room.power_levels', content, **params)
         | 
| 936 960 | 
             
              end
         | 
| 937 961 | 
             
              alias set_power_levels set_room_power_levels
         | 
| 938 962 |  | 
| @@ -945,7 +969,7 @@ module MatrixSdk::Protocols::CS | |
| 945 969 | 
             
              # @see https://matrix.org/docs/spec/client_server/latest.html#m-room-join-rules
         | 
| 946 970 | 
             
              #      The Matrix Spec, for more information about the event and data
         | 
| 947 971 | 
             
              def get_room_join_rules(room_id, **params)
         | 
| 948 | 
            -
                get_room_state(room_id, 'm.room.join_rules', params)
         | 
| 972 | 
            +
                get_room_state(room_id, 'm.room.join_rules', **params)
         | 
| 949 973 | 
             
              end
         | 
| 950 974 |  | 
| 951 975 | 
             
              # Sets the join rules for a room
         | 
| @@ -961,7 +985,7 @@ module MatrixSdk::Protocols::CS | |
| 961 985 | 
             
                  join_rule: join_rule
         | 
| 962 986 | 
             
                }
         | 
| 963 987 |  | 
| 964 | 
            -
                send_state_event(room_id, 'm.room.join_rules', content, params)
         | 
| 988 | 
            +
                send_state_event(room_id, 'm.room.join_rules', content, **params)
         | 
| 965 989 | 
             
              end
         | 
| 966 990 |  | 
| 967 991 | 
             
              # Gets the guest access settings for a room
         | 
| @@ -973,7 +997,7 @@ module MatrixSdk::Protocols::CS | |
| 973 997 | 
             
              # @see https://matrix.org/docs/spec/client_server/latest.html#m-room-guest-access
         | 
| 974 998 | 
             
              #      The Matrix Spec, for more information about the event and data
         | 
| 975 999 | 
             
              def get_room_guest_access(room_id, **params)
         | 
| 976 | 
            -
                get_room_state(room_id, 'm.room.guest_access', params)
         | 
| 1000 | 
            +
                get_room_state(room_id, 'm.room.guest_access', **params)
         | 
| 977 1001 | 
             
              end
         | 
| 978 1002 |  | 
| 979 1003 | 
             
              # Sets the guest access settings for a room
         | 
| @@ -989,7 +1013,7 @@ module MatrixSdk::Protocols::CS | |
| 989 1013 | 
             
                  guest_access: guest_access
         | 
| 990 1014 | 
             
                }
         | 
| 991 1015 |  | 
| 992 | 
            -
                send_state_event(room_id, 'm.room.guest_access', content, params)
         | 
| 1016 | 
            +
                send_state_event(room_id, 'm.room.guest_access', content, **params)
         | 
| 993 1017 | 
             
              end
         | 
| 994 1018 |  | 
| 995 1019 | 
             
              # Gets the creation configuration object for a room
         | 
| @@ -1001,7 +1025,7 @@ module MatrixSdk::Protocols::CS | |
| 1001 1025 | 
             
              # @see https://matrix.org/docs/spec/client_server/latest.html#m-room-create
         | 
| 1002 1026 | 
             
              #      The Matrix Spec, for more information about the event and data
         | 
| 1003 1027 | 
             
              def get_room_creation_info(room_id, **params)
         | 
| 1004 | 
            -
                get_room_state(room_id, 'm.room.create', params)
         | 
| 1028 | 
            +
                get_room_state(room_id, 'm.room.create', **params)
         | 
| 1005 1029 | 
             
              end
         | 
| 1006 1030 |  | 
| 1007 1031 | 
             
              # Gets the encryption configuration for a room
         | 
| @@ -1013,7 +1037,7 @@ module MatrixSdk::Protocols::CS | |
| 1013 1037 | 
             
              # @see https://matrix.org/docs/spec/client_server/latest.html#m-room-encryption
         | 
| 1014 1038 | 
             
              #      The Matrix Spec, for more information about the event and data
         | 
| 1015 1039 | 
             
              def get_room_encryption_settings(room_id, **params)
         | 
| 1016 | 
            -
                get_room_state(room_id, 'm.room.encryption', params)
         | 
| 1040 | 
            +
                get_room_state(room_id, 'm.room.encryption', **params)
         | 
| 1017 1041 | 
             
              end
         | 
| 1018 1042 |  | 
| 1019 1043 | 
             
              # Sets the encryption configuration for a room
         | 
| @@ -1032,7 +1056,7 @@ module MatrixSdk::Protocols::CS | |
| 1032 1056 | 
             
                  rotation_period_ms: rotation_period_ms,
         | 
| 1033 1057 | 
             
                  rotation_period_msgs: rotation_period_msgs
         | 
| 1034 1058 | 
             
                }
         | 
| 1035 | 
            -
                send_state_event(room_id, 'm.room.encryption', content, params)
         | 
| 1059 | 
            +
                send_state_event(room_id, 'm.room.encryption', content, **params)
         | 
| 1036 1060 | 
             
              end
         | 
| 1037 1061 |  | 
| 1038 1062 | 
             
              # Gets the history availabiilty for a room
         | 
| @@ -1044,7 +1068,7 @@ module MatrixSdk::Protocols::CS | |
| 1044 1068 | 
             
              # @see https://matrix.org/docs/spec/client_server/latest.html#m-room-history-visibility
         | 
| 1045 1069 | 
             
              #      The Matrix Spec, for more information about the event and data
         | 
| 1046 1070 | 
             
              def get_room_history_visibility(room_id, **params)
         | 
| 1047 | 
            -
                get_room_state(room_id, 'm.room.history_visibility', params)
         | 
| 1071 | 
            +
                get_room_state(room_id, 'm.room.history_visibility', **params)
         | 
| 1048 1072 | 
             
              end
         | 
| 1049 1073 |  | 
| 1050 1074 | 
             
              # Sets the history availability for a room
         | 
| @@ -1060,7 +1084,7 @@ module MatrixSdk::Protocols::CS | |
| 1060 1084 | 
             
                  history_visibility: visibility
         | 
| 1061 1085 | 
             
                }
         | 
| 1062 1086 |  | 
| 1063 | 
            -
                send_state_event(room_id, 'm.room.history_visibility', content, params)
         | 
| 1087 | 
            +
                send_state_event(room_id, 'm.room.history_visibility', content, **params)
         | 
| 1064 1088 | 
             
              end
         | 
| 1065 1089 |  | 
| 1066 1090 | 
             
              # Gets the server ACLs for a room
         | 
| @@ -1072,7 +1096,7 @@ module MatrixSdk::Protocols::CS | |
| 1072 1096 | 
             
              # @see https://matrix.org/docs/spec/client_server/latest.html#m-room-server-acl
         | 
| 1073 1097 | 
             
              #      The Matrix Spec, for more information about the event and data
         | 
| 1074 1098 | 
             
              def get_room_server_acl(room_id, **params)
         | 
| 1075 | 
            -
                get_room_state(room_id, 'm.room.server_acl', params)
         | 
| 1099 | 
            +
                get_room_state(room_id, 'm.room.server_acl', **params)
         | 
| 1076 1100 | 
             
              end
         | 
| 1077 1101 |  | 
| 1078 1102 | 
             
              # Sets the server ACL configuration for a room
         | 
| @@ -1085,14 +1109,14 @@ 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,
         | 
| 1092 1116 | 
             
                  deny: deny
         | 
| 1093 1117 | 
             
                }
         | 
| 1094 1118 |  | 
| 1095 | 
            -
                send_state_event(room_id, 'm.room.server_acl', content, params)
         | 
| 1119 | 
            +
                send_state_event(room_id, 'm.room.server_acl', content, **params)
         | 
| 1096 1120 | 
             
              end
         | 
| 1097 1121 |  | 
| 1098 1122 | 
             
              def leave_room(room_id, **params)
         | 
| @@ -1637,7 +1661,7 @@ module MatrixSdk::Protocols::CS | |
| 1637 1661 |  | 
| 1638 1662 | 
             
                room_id = ERB::Util.url_encode room_id.to_s
         | 
| 1639 1663 |  | 
| 1640 | 
            -
                request(:get, :client_r0, "/rooms/#{room_id}/members", query: query)
         | 
| 1664 | 
            +
                request(:get, :client_r0, "/rooms/#{room_id}/members", query: query.merge(params))
         | 
| 1641 1665 | 
             
              end
         | 
| 1642 1666 |  | 
| 1643 1667 | 
             
              # Gets a list of the joined members in a room
         | 
| @@ -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
         | 
| @@ -1823,7 +1847,7 @@ module MatrixSdk::Protocols::CS | |
| 1823 1847 | 
             
              # @see https://matrix.org/docs/spec/client_server/latest#get-matrix-client-r0-pushrules
         | 
| 1824 1848 | 
             
              #      The Matrix Spec, for more information about the parameters and data
         | 
| 1825 1849 | 
             
              def get_pushrules
         | 
| 1826 | 
            -
                request(:get, :client_r0, '/pushrules')
         | 
| 1850 | 
            +
                request(:get, :client_r0, '/pushrules/')
         | 
| 1827 1851 | 
             
              end
         | 
| 1828 1852 |  | 
| 1829 1853 | 
             
              # Retrieves a single registered push rule for the current user
         | 
| @@ -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
    
    | @@ -1,62 +1,45 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            require 'matrix_sdk'
         | 
| 4 | 
            +
            require 'matrix_sdk/util/events'
         | 
| 5 | 
            +
            require 'matrix_sdk/util/tinycache'
         | 
| 4 6 |  | 
| 5 7 | 
             
            module MatrixSdk
         | 
| 6 8 | 
             
              # A class for tracking the information about a room on Matrix
         | 
| 7 9 | 
             
              class Room
         | 
| 8 10 | 
             
                extend MatrixSdk::Extensions
         | 
| 11 | 
            +
                extend MatrixSdk::Util::Tinycache
         | 
| 9 12 | 
             
                include MatrixSdk::Logging
         | 
| 10 13 |  | 
| 11 | 
            -
                # @!attribute [rw] canonical_alias
         | 
| 12 | 
            -
                #   @return [String, nil] the canonical alias of the room
         | 
| 13 14 | 
             
                # @!attribute [rw] event_history_limit
         | 
| 14 15 | 
             
                #   @return [Fixnum] the limit of events to keep in the event log
         | 
| 15 | 
            -
                attr_accessor : | 
| 16 | 
            +
                attr_accessor :event_history_limit
         | 
| 16 17 | 
             
                # @!attribute [r] id
         | 
| 17 18 | 
             
                #   @return [String] the internal ID of the room
         | 
| 18 19 | 
             
                # @!attribute [r] client
         | 
| 19 20 | 
             
                #   @return [Client] the client for the room
         | 
| 20 | 
            -
                # @!attribute [rw] name
         | 
| 21 | 
            -
                #   @return [String, nil] the user-provided name of the room
         | 
| 22 | 
            -
                #   @see reload_name!
         | 
| 23 | 
            -
                # @!attribute [rw] topic
         | 
| 24 | 
            -
                #   @return [String, nil] the user-provided topic of the room
         | 
| 25 | 
            -
                #   @see reload_topic!
         | 
| 26 | 
            -
                # @!attribute [r] aliases
         | 
| 27 | 
            -
                #   @return [Array(String)] a list of user-set aliases for the room
         | 
| 28 | 
            -
                #   @see add_alias
         | 
| 29 | 
            -
                #   @see reload_alias!
         | 
| 30 | 
            -
                # @!attribute [rw] join_rule
         | 
| 31 | 
            -
                #   @return [:invite, :public] the join rule for the room -
         | 
| 32 | 
            -
                #                    either +:invite+ or +:public+
         | 
| 33 | 
            -
                # @!attribute [rw] guest_access
         | 
| 34 | 
            -
                #   @return [:can_join, :forbidden] the guest access for the room -
         | 
| 35 | 
            -
                #                    either +:can_join+ or +:forbidden+
         | 
| 36 | 
            -
                # @!attribute [r] members
         | 
| 37 | 
            -
                #   @return [Array(User)] the members of the room
         | 
| 38 | 
            -
                #   @see reload_members!
         | 
| 39 21 | 
             
                # @!attribute [r] events
         | 
| 40 22 | 
             
                #   @return [Array(Object)] the last +event_history_limit+ events to arrive in the room
         | 
| 41 23 | 
             
                #   @see https://matrix.org/docs/spec/client_server/r0.3.0.html#get-matrix-client-r0-sync
         | 
| 42 24 | 
             
                #        The timeline events are what will end up in here
         | 
| 43 | 
            -
                attr_reader :id, :client, : | 
| 25 | 
            +
                attr_reader :id, :client, :events
         | 
| 44 26 |  | 
| 45 | 
            -
                # @!attribute [r] on_event
         | 
| 46 | 
            -
                #   @return [EventHandlerArray] The list of event handlers for all events
         | 
| 47 | 
            -
                # @!attribute [r] on_state_event
         | 
| 48 | 
            -
                #   @return [EventHandlerArray] The list of event handlers for only state events
         | 
| 49 | 
            -
                # @!attribute [r] on_ephemeral_event
         | 
| 50 | 
            -
                #   @return [EventHandlerArray] The list of event handlers for only ephemeral events
         | 
| 51 | 
            -
                events :event, :state_event, :ephemeral_event
         | 
| 52 27 | 
             
                # @!method inspect
         | 
| 53 28 | 
             
                #   An inspect method that skips a handful of instance variables to avoid
         | 
| 54 29 | 
             
                #   flooding the terminal with debug data.
         | 
| 55 30 | 
             
                #   @return [String] a regular inspect string without the data for some variables
         | 
| 56 | 
            -
                ignore_inspect :client, : | 
| 57 | 
            -
             | 
| 31 | 
            +
                ignore_inspect :client, :events, :prev_batch, :logger
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                # Requires heavy lookups, so they're cached for an hour
         | 
| 34 | 
            +
                cached :joined_members, :aliases, cache_level: :all, expires_in: 60 * 60
         | 
| 35 | 
            +
                # Only cache unfiltered requests for all members
         | 
| 36 | 
            +
                cached :all_members, unless: proc { |args| args.any? }, cache_level: :all, expires_in: 3600
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                # Much simpler to look up, and lighter data-wise, so the cache is wider
         | 
| 39 | 
            +
                cached :canonical_alias, :name, :avatar_url, :topic, :guest_access, :join_rule, :power_levels, cache_level: :some, expires_in: 15 * 60
         | 
| 58 40 |  | 
| 59 41 | 
             
                alias room_id id
         | 
| 42 | 
            +
                alias members joined_members
         | 
| 60 43 |  | 
| 61 44 | 
             
                # Create a new room instance
         | 
| 62 45 | 
             
                #
         | 
| @@ -82,38 +65,52 @@ module MatrixSdk | |
| 82 65 | 
             
                def initialize(client, room_id, data = {})
         | 
| 83 66 | 
             
                  raise ArgumentError, 'Must be given a Client instance' unless client.is_a? Client
         | 
| 84 67 |  | 
| 68 | 
            +
                  @client = client
         | 
| 85 69 | 
             
                  room_id = MXID.new room_id unless room_id.is_a?(MXID)
         | 
| 86 70 | 
             
                  raise ArgumentError, 'room_id must be a valid Room ID' unless room_id.room_id?
         | 
| 87 71 |  | 
| 88 | 
            -
                  event_initialize
         | 
| 89 | 
            -
             | 
| 90 | 
            -
                  @name = nil
         | 
| 91 | 
            -
                  @topic = nil
         | 
| 92 | 
            -
                  @canonical_alias = nil
         | 
| 93 | 
            -
                  @aliases = []
         | 
| 94 | 
            -
                  @join_rule = nil
         | 
| 95 | 
            -
                  @guest_access = nil
         | 
| 96 | 
            -
                  @world_readable = nil
         | 
| 97 | 
            -
                  @members = []
         | 
| 98 72 | 
             
                  @events = []
         | 
| 99 | 
            -
                  @members_loaded = false
         | 
| 100 73 | 
             
                  @event_history_limit = 10
         | 
| 101 | 
            -
                  @avatar_url = nil
         | 
| 102 74 |  | 
| 103 75 | 
             
                  @prev_batch = nil
         | 
| 104 76 |  | 
| 105 77 | 
             
                  data.each do |k, v|
         | 
| 106 | 
            -
                     | 
| 78 | 
            +
                    next if %i[client].include? k
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                    if respond_to?("#{k}_cached?".to_sym) && send("#{k}_cached?".to_sym)
         | 
| 81 | 
            +
                      tinycache_adapter.write(k, v)
         | 
| 82 | 
            +
                    elsif instance_variable_defined? "@#{k}"
         | 
| 83 | 
            +
                      instance_variable_set("@#{k}", v)
         | 
| 84 | 
            +
                    end
         | 
| 107 85 | 
             
                  end
         | 
| 108 86 |  | 
| 109 | 
            -
                  @client = client
         | 
| 110 87 | 
             
                  @id = room_id.to_s
         | 
| 111 88 |  | 
| 112 | 
            -
                  @name_checked = Time.new(0)
         | 
| 113 | 
            -
             | 
| 114 89 | 
             
                  logger.debug "Created room #{room_id}"
         | 
| 115 90 | 
             
                end
         | 
| 116 91 |  | 
| 92 | 
            +
                #
         | 
| 93 | 
            +
                # Event handlers
         | 
| 94 | 
            +
                #
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                # @!attribute [r] on_event
         | 
| 97 | 
            +
                #   @return [EventHandlerArray] The list of event handlers for all events
         | 
| 98 | 
            +
                def on_event
         | 
| 99 | 
            +
                  ensure_room_handlers[:event]
         | 
| 100 | 
            +
                end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                # @!attribute [r] on_state_event
         | 
| 103 | 
            +
                #   @return [EventHandlerArray] The list of event handlers for only state events
         | 
| 104 | 
            +
                def on_state_event
         | 
| 105 | 
            +
                  ensure_room_handlers[:state_event]
         | 
| 106 | 
            +
                end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                # @!attribute [r] on_ephemeral_event
         | 
| 109 | 
            +
                #   @return [EventHandlerArray] The list of event handlers for only ephemeral events
         | 
| 110 | 
            +
                def on_ephemeral_event
         | 
| 111 | 
            +
                  ensure_room_handlers[:ephemeral_event]
         | 
| 112 | 
            +
                end
         | 
| 113 | 
            +
             | 
| 117 114 | 
             
                #
         | 
| 118 115 | 
             
                # State readers
         | 
| 119 116 | 
             
                #
         | 
| @@ -142,19 +139,33 @@ module MatrixSdk | |
| 142 139 | 
             
                  'Empty Room'
         | 
| 143 140 | 
             
                end
         | 
| 144 141 |  | 
| 142 | 
            +
                # @return [String, nil] the canonical alias of the room
         | 
| 143 | 
            +
                def canonical_alias
         | 
| 144 | 
            +
                  client.api.get_room_state(id, 'm.room.canonical_alias')[:alias]
         | 
| 145 | 
            +
                rescue MatrixSdk::MatrixNotFoundError
         | 
| 146 | 
            +
                  nil
         | 
| 147 | 
            +
                end
         | 
| 148 | 
            +
             | 
| 145 149 | 
             
                # Populates and returns the #members array
         | 
| 146 150 | 
             
                #
         | 
| 147 151 | 
             
                # @return [Array(User)] The list of members in the room
         | 
| 148 152 | 
             
                def joined_members
         | 
| 149 | 
            -
                   | 
| 150 | 
            -
             | 
| 151 | 
            -
             | 
| 152 | 
            -
             | 
| 153 | 
            -
                                           display_name: data.fetch(:display_name, nil),
         | 
| 154 | 
            -
                                           avatar_url: data.fetch(:avatar_url, nil)))
         | 
| 153 | 
            +
                  client.api.get_room_joined_members(id)[:joined].map do |mxid, data|
         | 
| 154 | 
            +
                    User.new(client, mxid.to_s,
         | 
| 155 | 
            +
                             display_name: data.fetch(:display_name, nil),
         | 
| 156 | 
            +
                             avatar_url: data.fetch(:avatar_url, nil))
         | 
| 155 157 | 
             
                  end
         | 
| 156 | 
            -
             | 
| 157 | 
            -
             | 
| 158 | 
            +
                end
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                # Get all members (member events) in the room
         | 
| 161 | 
            +
                #
         | 
| 162 | 
            +
                # @note This will also count members who've knocked, been invited, have left, or have been banned.
         | 
| 163 | 
            +
                #
         | 
| 164 | 
            +
                # @param params [Hash] Additional query parameters to pass to the room member listing - e.g. for filtering purposes.
         | 
| 165 | 
            +
                #
         | 
| 166 | 
            +
                # @return [Array(User)] The complete list of members in the room, regardless of membership state
         | 
| 167 | 
            +
                def all_members(**params)
         | 
| 168 | 
            +
                  client.api.get_room_members(id, **params)[:chunk].map { |ch| client.get_user(ch[:state_key]) }
         | 
| 158 169 | 
             
                end
         | 
| 159 170 |  | 
| 160 171 | 
             
                # Gets the current name of the room, querying the API if necessary
         | 
| @@ -163,10 +174,7 @@ module MatrixSdk | |
| 163 174 | 
             
                #
         | 
| 164 175 | 
             
                # @return [String,nil] The room name - if any
         | 
| 165 176 | 
             
                def name
         | 
| 166 | 
            -
                   | 
| 167 | 
            -
             | 
| 168 | 
            -
                  @name_checked = Time.now
         | 
| 169 | 
            -
                  @name ||= client.api.get_room_name(id)
         | 
| 177 | 
            +
                  client.api.get_room_name(id)[:name]
         | 
| 170 178 | 
             
                rescue MatrixNotFoundError
         | 
| 171 179 | 
             
                  # No room name has been specified
         | 
| 172 180 | 
             
                  nil
         | 
| @@ -176,18 +184,34 @@ module MatrixSdk | |
| 176 184 | 
             
                #
         | 
| 177 185 | 
             
                # @return [String,nil] The avatar URL - if any
         | 
| 178 186 | 
             
                def avatar_url
         | 
| 179 | 
            -
                   | 
| 187 | 
            +
                  client.api.get_room_avatar(id)[:url]
         | 
| 180 188 | 
             
                rescue MatrixNotFoundError
         | 
| 181 189 | 
             
                  # No avatar has been set
         | 
| 182 190 | 
             
                  nil
         | 
| 183 191 | 
             
                end
         | 
| 184 192 |  | 
| 193 | 
            +
                # Gets the room topic - if any
         | 
| 194 | 
            +
                #
         | 
| 195 | 
            +
                # @return [String,nil] The topic of the room
         | 
| 196 | 
            +
                def topic
         | 
| 197 | 
            +
                  client.api.get_room_topic(id)[:topic]
         | 
| 198 | 
            +
                rescue MatrixNotFoundError
         | 
| 199 | 
            +
                  # No room name has been specified
         | 
| 200 | 
            +
                  nil
         | 
| 201 | 
            +
                end
         | 
| 202 | 
            +
             | 
| 203 | 
            +
                # Gets the guest access rights for the room
         | 
| 204 | 
            +
                #
         | 
| 205 | 
            +
                # @return [:can_join,:forbidden] The current guest access right
         | 
| 185 206 | 
             
                def guest_access
         | 
| 186 | 
            -
                   | 
| 207 | 
            +
                  client.api.get_room_guest_access(id)[:guest_access].to_sym
         | 
| 187 208 | 
             
                end
         | 
| 188 209 |  | 
| 210 | 
            +
                # Gets the join rule for the room
         | 
| 211 | 
            +
                #
         | 
| 212 | 
            +
                # @return [:public,:knock,:invite,:private] The current join rule
         | 
| 189 213 | 
             
                def join_rule
         | 
| 190 | 
            -
                   | 
| 214 | 
            +
                  client.api.get_room_join_rules(id)[:join_rule].to_sym
         | 
| 191 215 | 
             
                end
         | 
| 192 216 |  | 
| 193 217 | 
             
                # Checks if +guest_access+ is set to +:can_join+
         | 
| @@ -200,6 +224,34 @@ module MatrixSdk | |
| 200 224 | 
             
                  join_rule == :invite
         | 
| 201 225 | 
             
                end
         | 
| 202 226 |  | 
| 227 | 
            +
                # Gets the history visibility of the room
         | 
| 228 | 
            +
                #
         | 
| 229 | 
            +
                # @return [:invited,:joined,:shared,:world_readable] The current history visibility for the room
         | 
| 230 | 
            +
                def history_visibility
         | 
| 231 | 
            +
                  client.api.get_room_state(id, 'm.room.history_visibility')[:history_visibility].to_sym
         | 
| 232 | 
            +
                end
         | 
| 233 | 
            +
             | 
| 234 | 
            +
                # Checks if the room history is world readable
         | 
| 235 | 
            +
                #
         | 
| 236 | 
            +
                # @return [Boolean] If the history is world readable
         | 
| 237 | 
            +
                def world_readable?
         | 
| 238 | 
            +
                  history_visibility == :world_readable
         | 
| 239 | 
            +
                end
         | 
| 240 | 
            +
                alias world_readable world_readable?
         | 
| 241 | 
            +
             | 
| 242 | 
            +
                # Gets the room aliases
         | 
| 243 | 
            +
                #
         | 
| 244 | 
            +
                # @return [Array[String]] The assigned room aliases
         | 
| 245 | 
            +
                def aliases
         | 
| 246 | 
            +
                  client.api.get_room_aliases(id).aliases
         | 
| 247 | 
            +
                rescue MatrixNotFoundError
         | 
| 248 | 
            +
                  data = client.api.get_room_state_all(id)
         | 
| 249 | 
            +
                  data.select { |chunk| chunk[:type] == 'm.room.aliases' && chunk.key?(:content) && chunk[:content].key?(:aliases) }
         | 
| 250 | 
            +
                      .map { |chunk| chunk[:content][:aliases] }
         | 
| 251 | 
            +
                      .flatten
         | 
| 252 | 
            +
                      .compact
         | 
| 253 | 
            +
                end
         | 
| 254 | 
            +
             | 
| 203 255 | 
             
                #
         | 
| 204 256 | 
             
                # Message handling
         | 
| 205 257 | 
             
                #
         | 
| @@ -340,7 +392,13 @@ module MatrixSdk | |
| 340 392 | 
             
                # @param reverse [Boolean] whether to fill messages in reverse or not
         | 
| 341 393 | 
             
                # @param limit [Integer] the maximum number of messages to backfill
         | 
| 342 394 | 
             
                # @note This will trigger the `on_event` events as messages are added
         | 
| 343 | 
            -
                def backfill_messages(reverse  | 
| 395 | 
            +
                def backfill_messages(*args, reverse: false, limit: 10)
         | 
| 396 | 
            +
                  # To be backwards-compatible
         | 
| 397 | 
            +
                  if args.length == 2
         | 
| 398 | 
            +
                    reverse = args.first
         | 
| 399 | 
            +
                    limit = args.last
         | 
| 400 | 
            +
                  end
         | 
| 401 | 
            +
             | 
| 344 402 | 
             
                  data = client.api.get_room_messages(id, @prev_batch, direction: :b, limit: limit)
         | 
| 345 403 |  | 
| 346 404 | 
             
                  events = data[:chunk]
         | 
| @@ -458,7 +516,7 @@ module MatrixSdk | |
| 458 516 | 
             
                      @room
         | 
| 459 517 | 
             
                    end
         | 
| 460 518 | 
             
                    tag_obj.define_singleton_method(:add) do |tag, **data|
         | 
| 461 | 
            -
                      @room.add_tag(tag.to_s.to_sym, data)
         | 
| 519 | 
            +
                      @room.add_tag(tag.to_s.to_sym, **data)
         | 
| 462 520 | 
             
                      self[tag.to_s.to_sym] = data
         | 
| 463 521 | 
             
                      self
         | 
| 464 522 | 
             
                    end
         | 
| @@ -503,22 +561,16 @@ module MatrixSdk | |
| 503 561 | 
             
                #
         | 
| 504 562 | 
             
                # @param name [String] The new name to set
         | 
| 505 563 | 
             
                def name=(name)
         | 
| 564 | 
            +
                  tinycache_adapter.write(:name, name)
         | 
| 506 565 | 
             
                  client.api.set_room_name(id, name)
         | 
| 507 | 
            -
                   | 
| 566 | 
            +
                  name
         | 
| 508 567 | 
             
                end
         | 
| 509 568 |  | 
| 510 569 | 
             
                # Reloads the name of the room
         | 
| 511 570 | 
             
                #
         | 
| 512 571 | 
             
                # @return [Boolean] if the name was changed or not
         | 
| 513 572 | 
             
                def reload_name!
         | 
| 514 | 
            -
                   | 
| 515 | 
            -
                           client.api.get_room_name(id)
         | 
| 516 | 
            -
                         rescue MatrixNotFoundError
         | 
| 517 | 
            -
                           nil
         | 
| 518 | 
            -
                         end
         | 
| 519 | 
            -
                  changed = data[:name] != @name
         | 
| 520 | 
            -
                  @name = data[:name] if changed
         | 
| 521 | 
            -
                  changed
         | 
| 573 | 
            +
                  clear_name_cache
         | 
| 522 574 | 
             
                end
         | 
| 523 575 | 
             
                alias refresh_name! reload_name!
         | 
| 524 576 |  | 
| @@ -526,22 +578,16 @@ module MatrixSdk | |
| 526 578 | 
             
                #
         | 
| 527 579 | 
             
                # @param topic [String] The new topic to set
         | 
| 528 580 | 
             
                def topic=(topic)
         | 
| 581 | 
            +
                  tinycache_adapter.write(:topic, topic)
         | 
| 529 582 | 
             
                  client.api.set_room_topic(id, topic)
         | 
| 530 | 
            -
                   | 
| 583 | 
            +
                  topic
         | 
| 531 584 | 
             
                end
         | 
| 532 585 |  | 
| 533 586 | 
             
                # Reloads the topic of the room
         | 
| 534 587 | 
             
                #
         | 
| 535 588 | 
             
                # @return [Boolean] if the topic was changed or not
         | 
| 536 589 | 
             
                def reload_topic!
         | 
| 537 | 
            -
                   | 
| 538 | 
            -
                           client.api.get_room_topic(id)
         | 
| 539 | 
            -
                         rescue MatrixNotFoundError
         | 
| 540 | 
            -
                           nil
         | 
| 541 | 
            -
                         end
         | 
| 542 | 
            -
                  changed = data[:topic] != @topic
         | 
| 543 | 
            -
                  @topic = data[:topic] if changed
         | 
| 544 | 
            -
                  changed
         | 
| 590 | 
            +
                  clear_topic_cache
         | 
| 545 591 | 
             
                end
         | 
| 546 592 | 
             
                alias refresh_topic! reload_topic!
         | 
| 547 593 |  | 
| @@ -550,7 +596,7 @@ module MatrixSdk | |
| 550 596 | 
             
                # @return [Boolean] if the addition was successful or not
         | 
| 551 597 | 
             
                def add_alias(room_alias)
         | 
| 552 598 | 
             
                  client.api.set_room_alias(id, room_alias)
         | 
| 553 | 
            -
                   | 
| 599 | 
            +
                  tinycache_adapter.read(:aliases) << room_alias if tinycache_adapter.exist?(:aliases)
         | 
| 554 600 | 
             
                  true
         | 
| 555 601 | 
             
                end
         | 
| 556 602 |  | 
| @@ -560,21 +606,7 @@ module MatrixSdk | |
| 560 606 | 
             
                # @note The list of aliases is not sorted, ordering changes will result in
         | 
| 561 607 | 
             
                #       alias list updates.
         | 
| 562 608 | 
             
                def reload_aliases!
         | 
| 563 | 
            -
                   | 
| 564 | 
            -
                    new_aliases = client.api.get_room_aliases(id).aliases
         | 
| 565 | 
            -
                  rescue MatrixNotFoundError
         | 
| 566 | 
            -
                    data = client.api.get_room_state_all(id)
         | 
| 567 | 
            -
                    new_aliases = data.select { |chunk| chunk[:type] == 'm.room.aliases' && chunk.key?(:content) && chunk[:content].key?(:aliases) }
         | 
| 568 | 
            -
                                      .map { |chunk| chunk[:content][:aliases] }
         | 
| 569 | 
            -
                                      .flatten
         | 
| 570 | 
            -
                                      .compact
         | 
| 571 | 
            -
                  end
         | 
| 572 | 
            -
             | 
| 573 | 
            -
                  return false if new_aliases.nil?
         | 
| 574 | 
            -
             | 
| 575 | 
            -
                  changed = new_aliases != aliases
         | 
| 576 | 
            -
                  @aliases = new_aliases if changed
         | 
| 577 | 
            -
                  changed
         | 
| 609 | 
            +
                  clear_aliases_cache
         | 
| 578 610 | 
             
                end
         | 
| 579 611 | 
             
                alias refresh_aliases! reload_aliases!
         | 
| 580 612 |  | 
| @@ -583,7 +615,7 @@ module MatrixSdk | |
| 583 615 | 
             
                # @param invite_only [Boolean] If it should be invite only or not
         | 
| 584 616 | 
             
                def invite_only=(invite_only)
         | 
| 585 617 | 
             
                  self.join_rule = invite_only ? :invite : :public
         | 
| 586 | 
            -
                   | 
| 618 | 
            +
                  invite_only
         | 
| 587 619 | 
             
                end
         | 
| 588 620 |  | 
| 589 621 | 
             
                # Sets the join rule of the room
         | 
| @@ -591,7 +623,8 @@ module MatrixSdk | |
| 591 623 | 
             
                # @param join_rule [:invite,:public] The join rule of the room
         | 
| 592 624 | 
             
                def join_rule=(join_rule)
         | 
| 593 625 | 
             
                  client.api.set_room_join_rules(id, join_rule)
         | 
| 594 | 
            -
                   | 
| 626 | 
            +
                  tinycache_adapter.write(:join_rule, join_rule)
         | 
| 627 | 
            +
                  join_rule
         | 
| 595 628 | 
             
                end
         | 
| 596 629 |  | 
| 597 630 | 
             
                # Sets if guests are allowed in the room
         | 
| @@ -599,7 +632,7 @@ module MatrixSdk | |
| 599 632 | 
             
                # @param allow_guests [Boolean] If guests are allowed to join or not
         | 
| 600 633 | 
             
                def allow_guests=(allow_guests)
         | 
| 601 634 | 
             
                  self.guest_access = (allow_guests ? :can_join : :forbidden)
         | 
| 602 | 
            -
                   | 
| 635 | 
            +
                  allow_guests
         | 
| 603 636 | 
             
                end
         | 
| 604 637 |  | 
| 605 638 | 
             
                # Sets the guest access status for the room
         | 
| @@ -607,7 +640,8 @@ module MatrixSdk | |
| 607 640 | 
             
                # @param guest_access [:can_join,:forbidden] The new guest access status of the room
         | 
| 608 641 | 
             
                def guest_access=(guest_access)
         | 
| 609 642 | 
             
                  client.api.set_room_guest_access(id, guest_access)
         | 
| 610 | 
            -
                   | 
| 643 | 
            +
                  tinycache_adapter.write(:guest_access, guest_access)
         | 
| 644 | 
            +
                  guest_access
         | 
| 611 645 | 
             
                end
         | 
| 612 646 |  | 
| 613 647 | 
             
                # Sets a new avatar URL for the room
         | 
| @@ -618,7 +652,89 @@ module MatrixSdk | |
| 618 652 | 
             
                  raise ArgumentError, 'Must be a valid MXC URL' unless avatar_url.is_a? URI::MATRIX
         | 
| 619 653 |  | 
| 620 654 | 
             
                  client.api.set_room_avatar(id, avatar_url)
         | 
| 621 | 
            -
                   | 
| 655 | 
            +
                  tinycache_adapter.write(:avatar_url, avatar_url)
         | 
| 656 | 
            +
                  avatar_url
         | 
| 657 | 
            +
                end
         | 
| 658 | 
            +
             | 
| 659 | 
            +
                # Get the power levels of the room
         | 
| 660 | 
            +
                #
         | 
| 661 | 
            +
                # @note The returned power levels are cached for a minute
         | 
| 662 | 
            +
                # @return [Hash] The current power levels as set for the room
         | 
| 663 | 
            +
                # @see Protocols::CS#get_power_levels
         | 
| 664 | 
            +
                def power_levels
         | 
| 665 | 
            +
                  client.api.get_power_levels(id)
         | 
| 666 | 
            +
                end
         | 
| 667 | 
            +
             | 
| 668 | 
            +
                # Gets the power level of a user in the room
         | 
| 669 | 
            +
                #
         | 
| 670 | 
            +
                # @param user [User,MXID,String] The user to check the power level for
         | 
| 671 | 
            +
                # @param use_default [Boolean] Should the user default level be checked if no user-specific one exists
         | 
| 672 | 
            +
                # @return [Integer,nil] The current power level for the requested user, nil if there's no user specific level
         | 
| 673 | 
            +
                #   and use_default is false
         | 
| 674 | 
            +
                def user_powerlevel(user, use_default: true)
         | 
| 675 | 
            +
                  user = user.id if user.is_a? User
         | 
| 676 | 
            +
                  user = MXID.new(user.to_s) unless user.is_a? MXID
         | 
| 677 | 
            +
                  raise ArgumentError, 'Must provide a valid user or MXID' unless user.user?
         | 
| 678 | 
            +
             | 
| 679 | 
            +
                  level = power_levels[:users][user.to_s.to_sym]
         | 
| 680 | 
            +
                  level = power_levels[:users_default] || 0 if level.nil? && use_default
         | 
| 681 | 
            +
                  level
         | 
| 682 | 
            +
                end
         | 
| 683 | 
            +
             | 
| 684 | 
            +
                # Check if a user is an admin in the room
         | 
| 685 | 
            +
                #
         | 
| 686 | 
            +
                # @param user [User,MXID,String] The user to check for admin privileges
         | 
| 687 | 
            +
                # @param target_level [Integer] The power level that's to be considered as admin privileges
         | 
| 688 | 
            +
                # @return [Boolean] If the requested user has a power level highe enough to be an admin
         | 
| 689 | 
            +
                # @see #user_powerlevel
         | 
| 690 | 
            +
                def admin?(user, target_level: 100)
         | 
| 691 | 
            +
                  level = user_powerlevel(user, use_default: false)
         | 
| 692 | 
            +
                  return false unless level
         | 
| 693 | 
            +
             | 
| 694 | 
            +
                  level >= target_level
         | 
| 695 | 
            +
                end
         | 
| 696 | 
            +
             | 
| 697 | 
            +
                # Make a user an admin in the room
         | 
| 698 | 
            +
                #
         | 
| 699 | 
            +
                # @param user [User,MXID,String] The user to give admin privileges
         | 
| 700 | 
            +
                # @param level [Integer] The power level to set the user to
         | 
| 701 | 
            +
                # @see #modify_user_power_levels
         | 
| 702 | 
            +
                def admin!(user, level: 100)
         | 
| 703 | 
            +
                  return true if admin?(user, target_level: level)
         | 
| 704 | 
            +
             | 
| 705 | 
            +
                  user = user.id if user.is_a? User
         | 
| 706 | 
            +
                  user = MXID.new(user.to_s) unless user.is_a? MXID
         | 
| 707 | 
            +
                  raise ArgumentError, 'Must provide a valid user or MXID' unless user.user?
         | 
| 708 | 
            +
             | 
| 709 | 
            +
                  modify_user_power_levels({ user.to_s.to_sym => level })
         | 
| 710 | 
            +
                end
         | 
| 711 | 
            +
             | 
| 712 | 
            +
                # Check if a user is a moderator in the room
         | 
| 713 | 
            +
                #
         | 
| 714 | 
            +
                # @param user [User,MXID,String] The user to check for admin privileges
         | 
| 715 | 
            +
                # @param target_level [Integer] The power level that's to be considered as admin privileges
         | 
| 716 | 
            +
                # @return [Boolean] If the requested user has a power level highe enough to be an admin
         | 
| 717 | 
            +
                # @see #user_powerlevel
         | 
| 718 | 
            +
                def moderator?(user, target_level: 50)
         | 
| 719 | 
            +
                  level = user_powerlevel(user, use_default: false)
         | 
| 720 | 
            +
                  return false unless level
         | 
| 721 | 
            +
             | 
| 722 | 
            +
                  level >= target_level
         | 
| 723 | 
            +
                end
         | 
| 724 | 
            +
             | 
| 725 | 
            +
                # Make a user a moderator in the room
         | 
| 726 | 
            +
                #
         | 
| 727 | 
            +
                # @param user [User,MXID,String] The user to give moderator privileges
         | 
| 728 | 
            +
                # @param level [Integer] The power level to set the user to
         | 
| 729 | 
            +
                # @see #modify_user_power_levels
         | 
| 730 | 
            +
                def moderator!(user, level: 50)
         | 
| 731 | 
            +
                  return true if moderator?(user, target_level: level)
         | 
| 732 | 
            +
             | 
| 733 | 
            +
                  user = user.id if user.is_a? User
         | 
| 734 | 
            +
                  user = MXID.new(user.to_s) unless user.is_a? MXID
         | 
| 735 | 
            +
                  raise ArgumentError, 'Must provide a valid user or MXID' unless user.user?
         | 
| 736 | 
            +
             | 
| 737 | 
            +
                  modify_user_power_levels({ user.to_s.to_sym => level })
         | 
| 622 738 | 
             
                end
         | 
| 623 739 |  | 
| 624 740 | 
             
                # Modifies the power levels of the room
         | 
| @@ -629,7 +745,8 @@ module MatrixSdk | |
| 629 745 | 
             
                def modify_user_power_levels(users = nil, users_default = nil)
         | 
| 630 746 | 
             
                  return false if users.nil? && users_default.nil?
         | 
| 631 747 |  | 
| 632 | 
            -
                  data =  | 
| 748 | 
            +
                  data = power_levels_without_cache
         | 
| 749 | 
            +
                  tinycache_adapter.write(:power_levels, data)
         | 
| 633 750 | 
             
                  data[:users_default] = users_default unless users_default.nil?
         | 
| 634 751 |  | 
| 635 752 | 
             
                  if users
         | 
| @@ -650,7 +767,8 @@ module MatrixSdk | |
| 650 767 | 
             
                def modify_required_power_levels(events = nil, params = {})
         | 
| 651 768 | 
             
                  return false if events.nil? && (params.nil? || params.empty?)
         | 
| 652 769 |  | 
| 653 | 
            -
                  data =  | 
| 770 | 
            +
                  data = power_levels_without_cache
         | 
| 771 | 
            +
                  tinycache_adapter.write(:power_levels, data)
         | 
| 654 772 | 
             
                  data.merge!(params)
         | 
| 655 773 | 
             
                  data.delete_if { |_k, v| v.nil? }
         | 
| 656 774 |  | 
| @@ -667,18 +785,103 @@ module MatrixSdk | |
| 667 785 | 
             
                private
         | 
| 668 786 |  | 
| 669 787 | 
             
                def ensure_member(member)
         | 
| 788 | 
            +
                  tinycache_adapter.write(:joined_members, []) unless tinycache_adapter.exist? :joined_members
         | 
| 789 | 
            +
             | 
| 790 | 
            +
                  members = tinycache_adapter.read(:joined_members) || []
         | 
| 670 791 | 
             
                  members << member unless members.any? { |m| m.id == member.id }
         | 
| 671 792 | 
             
                end
         | 
| 672 793 |  | 
| 794 | 
            +
                def handle_power_levels(event)
         | 
| 795 | 
            +
                  tinycache_adapter.write(:power_levels, event[:content])
         | 
| 796 | 
            +
                end
         | 
| 797 | 
            +
             | 
| 798 | 
            +
                def handle_room_name(event)
         | 
| 799 | 
            +
                  tinycache_adapter.write(:name, event[:content][:name])
         | 
| 800 | 
            +
                end
         | 
| 801 | 
            +
             | 
| 802 | 
            +
                def handle_room_topic(event)
         | 
| 803 | 
            +
                  tinycache_adapter.write(:topic, event[:content][:topic])
         | 
| 804 | 
            +
                end
         | 
| 805 | 
            +
             | 
| 806 | 
            +
                def handle_room_guest_access(event)
         | 
| 807 | 
            +
                  tinycache_adapter.write(:guest_access, event[:content][:guest_access].to_sym)
         | 
| 808 | 
            +
                end
         | 
| 809 | 
            +
             | 
| 810 | 
            +
                def handle_room_join_rules(event)
         | 
| 811 | 
            +
                  tinycache_adapter.write(:join_rule, event[:content][:join_rule].to_sym)
         | 
| 812 | 
            +
                end
         | 
| 813 | 
            +
             | 
| 814 | 
            +
                def handle_room_member(event)
         | 
| 815 | 
            +
                  return unless client.cache == :all
         | 
| 816 | 
            +
             | 
| 817 | 
            +
                  if event[:content][:membership] == 'join'
         | 
| 818 | 
            +
                    ensure_member(client.get_user(event[:state_key]).dup.tap do |u|
         | 
| 819 | 
            +
                      u.instance_variable_set :@display_name, event[:content][:displayname]
         | 
| 820 | 
            +
                    end)
         | 
| 821 | 
            +
                  elsif tinycache_adapter.exist? :joined_members
         | 
| 822 | 
            +
                    members = tinycache_adapter.read(:joined_members)
         | 
| 823 | 
            +
                    members.delete_if { |m| m.id == event[:state_key] }
         | 
| 824 | 
            +
                  end
         | 
| 825 | 
            +
                end
         | 
| 826 | 
            +
             | 
| 827 | 
            +
                def handle_room_canonical_alias(event)
         | 
| 828 | 
            +
                  canonical_alias = tinycache_adapter.write :canonical_alias, event[:content][:alias]
         | 
| 829 | 
            +
             | 
| 830 | 
            +
                  data = tinycache_adapter.read(:aliases) || []
         | 
| 831 | 
            +
                  data << canonical_alias
         | 
| 832 | 
            +
                  tinycache_adapter.write(:aliases, data)
         | 
| 833 | 
            +
                end
         | 
| 834 | 
            +
             | 
| 835 | 
            +
                def handle_room_aliases(event)
         | 
| 836 | 
            +
                  tinycache_adapter.write(:aliases, []) unless tinycache_adapter.exist? :aliases
         | 
| 837 | 
            +
             | 
| 838 | 
            +
                  aliases = tinycache_adapter.read(:aliases) || []
         | 
| 839 | 
            +
                  aliases.concat event[:content][:aliases]
         | 
| 840 | 
            +
             | 
| 841 | 
            +
                  tinycache_adapter.write(:aliases, aliases)
         | 
| 842 | 
            +
                end
         | 
| 843 | 
            +
             | 
| 844 | 
            +
                def room_handlers?
         | 
| 845 | 
            +
                  client.instance_variable_get(:@room_handlers).key? id
         | 
| 846 | 
            +
                end
         | 
| 847 | 
            +
             | 
| 848 | 
            +
                def ensure_room_handlers
         | 
| 849 | 
            +
                  client.instance_variable_get(:@room_handlers)[id] ||= {
         | 
| 850 | 
            +
                    event: MatrixSdk::EventHandlerArray.new,
         | 
| 851 | 
            +
                    state_event: MatrixSdk::EventHandlerArray.new,
         | 
| 852 | 
            +
                    ephemeral_event: MatrixSdk::EventHandlerArray.new
         | 
| 853 | 
            +
                  }
         | 
| 854 | 
            +
                end
         | 
| 855 | 
            +
             | 
| 856 | 
            +
                INTERNAL_HANDLERS = {
         | 
| 857 | 
            +
                  'm.room.aliases' => :handle_room_aliases,
         | 
| 858 | 
            +
                  'm.room.canonical_alias' => :handle_room_canonical_alias,
         | 
| 859 | 
            +
                  'm.room.guest_access' => :handle_room_guest_access,
         | 
| 860 | 
            +
                  'm.room.join_rules' => :handle_room_join_rules,
         | 
| 861 | 
            +
                  'm.room.member' => :handle_room_member,
         | 
| 862 | 
            +
                  'm.room.name' => :handle_room_name,
         | 
| 863 | 
            +
                  'm.room.power_levels' => :handle_power_levels,
         | 
| 864 | 
            +
                  'm.room.topic' => :handle_room_topic
         | 
| 865 | 
            +
                }.freeze
         | 
| 673 866 | 
             
                def put_event(event)
         | 
| 867 | 
            +
                  ensure_room_handlers[:event].fire(MatrixEvent.new(self, event), event[:type]) if room_handlers?
         | 
| 868 | 
            +
             | 
| 674 869 | 
             
                  @events.push event
         | 
| 675 870 | 
             
                  @events.shift if @events.length > @event_history_limit
         | 
| 676 | 
            -
             | 
| 677 | 
            -
                  fire_event MatrixEvent.new(self, event)
         | 
| 678 871 | 
             
                end
         | 
| 679 872 |  | 
| 680 873 | 
             
                def put_ephemeral_event(event)
         | 
| 681 | 
            -
                   | 
| 874 | 
            +
                  return unless room_handlers?
         | 
| 875 | 
            +
             | 
| 876 | 
            +
                  ensure_room_handlers[:ephemeral_event].fire(MatrixEvent.new(self, event), event[:type])
         | 
| 877 | 
            +
                end
         | 
| 878 | 
            +
             | 
| 879 | 
            +
                def put_state_event(event)
         | 
| 880 | 
            +
                  send(INTERNAL_HANDLERS[event[:type]], event) if INTERNAL_HANDLERS.key? event[:type]
         | 
| 881 | 
            +
             | 
| 882 | 
            +
                  return unless room_handlers?
         | 
| 883 | 
            +
             | 
| 884 | 
            +
                  ensure_room_handlers[:state_event].fire(MatrixEvent.new(self, event), event[:type])
         | 
| 682 885 | 
             
                end
         | 
| 683 886 | 
             
              end
         | 
| 684 887 | 
             
            end
         |