Class: MatrixSdk::Room

Inherits:
Object show all
Extended by:
Extensions, Util::Tinycache
Includes:
Logging
Defined in:
lib/matrix_sdk/room.rb

Overview

A class for tracking the information about a room on Matrix

Direct Known Subclasses

MatrixSdk::Rooms::Space

Constant Summary

Constants included from Util::Tinycache

Util::Tinycache::CACHE_LEVELS

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Extensions

ignore_inspect

Methods included from Util::Tinycache

adapter, adapter=, cached, extended, tinycache_adapter_config

Methods included from Logging

#logger, #logger=

Constructor Details

#initialize(client, room_id, data = {}) ⇒ Room

Note:

This method isn’t supposed to be used directly, rather rooms should be retrieved from the Client abstraction.

Create a new room instance

Parameters:

  • client (Client)

    The underlying connection

  • room_id (MXID)

    The room ID

  • data (Hash) (defaults to: {})

    Additional data to assign to the room

Options Hash (data):

  • :name (String)

    The current name of the room

  • :topic (String)

    The current topic of the room

  • :canonical_alias (String, MXID)

    The canonical alias of the room

  • :aliases (Array(String, MXID))

    All non-canonical aliases of the room

  • :join_rule (:invite, :public, :knock)

    The join rule for the room

  • :guest_access (:can_join, :forbidden)

    The guest access setting for the room

  • :world_readable (Boolean)

    If the room is readable by the entire world

  • :members (Array(User))

    The list of joined members

  • :events (Array(Object))

    The list of current events in the room

  • :members_loaded (Boolean)

    If the list of members is already loaded

  • :event_history_limit (Integer) — default: 10

    The limit of events to store for the room

  • :avatar_url (String, URI)

    The avatar URL for the room

  • :prev_batch (String)

    The previous batch token for backfill

Raises:

  • (ArgumentError)


67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/matrix_sdk/room.rb', line 67

def initialize(client, room_id, data = {})
  if client.is_a? Room
    copy = client
    client = copy.client
    room_id = copy.id
    # data = copy.attributes
  end

  raise ArgumentError, 'Must be given a Client instance' unless client.is_a? Client

  @client = client
  room_id = MXID.new room_id unless room_id.is_a?(MXID)
  raise ArgumentError, 'room_id must be a valid Room ID' unless room_id.room_id?

  @events = []
  @event_history_limit = 10
  @room_type = nil

  @prev_batch = nil

  data.each do |k, v|
    next if %i[client].include? k

    if respond_to?("#{k}_cached?".to_sym) && send("#{k}_cached?".to_sym)
      tinycache_adapter.write(k, v)
    elsif instance_variable_defined? "@#{k}"
      instance_variable_set("@#{k}", v)
    end
  end

  @id = room_id.to_s

  logger.debug "Created room #{room_id}"
end

Instance Attribute Details

#clientClient (readonly)

Returns the client for the room.

Returns:

  • (Client)

    the client for the room



25
# File 'lib/matrix_sdk/room.rb', line 25

attr_reader :id, :client, :events

#event_history_limitFixnum

Returns the limit of events to keep in the event log.

Returns:

  • (Fixnum)

    the limit of events to keep in the event log



16
17
18
# File 'lib/matrix_sdk/room.rb', line 16

def event_history_limit
  @event_history_limit
end

#eventsObject (readonly)

Returns the value of attribute events.



25
# File 'lib/matrix_sdk/room.rb', line 25

attr_reader :id, :client, :events

#idString (readonly) Also known as: room_id

Returns the internal ID of the room.

Returns:

  • (String)

    the internal ID of the room



25
26
27
# File 'lib/matrix_sdk/room.rb', line 25

def id
  @id
end

#on_ephemeral_eventObject (readonly)



138
139
140
# File 'lib/matrix_sdk/room.rb', line 138

def on_ephemeral_event
  ensure_room_handlers[:ephemeral_event]
end

#on_eventObject (readonly)



126
127
128
# File 'lib/matrix_sdk/room.rb', line 126

def on_event
  ensure_room_handlers[:event]
end

#on_state_eventObject (readonly)



132
133
134
# File 'lib/matrix_sdk/room.rb', line 132

def on_state_event
  ensure_room_handlers[:state_event]
end

Instance Method Details

#add_alias(room_alias) ⇒ Boolean

Add an alias to the room

Returns:

  • (Boolean)

    if the addition was successful or not



664
665
666
667
668
# File 'lib/matrix_sdk/room.rb', line 664

def add_alias(room_alias)
  client.api.set_room_alias(id, room_alias)
  tinycache_adapter.read(:aliases) << room_alias if tinycache_adapter.exist?(:aliases)
  true
end

#add_tag(tag, **data) ⇒ Object

Add a tag to the room

Parameters:

  • tag (String)

    The tag to add

  • data (Hash)

    The data to assign to the tag



609
610
611
612
# File 'lib/matrix_sdk/room.rb', line 609

def add_tag(tag, **data)
  client.api.add_user_tag(client.mxid, id, tag, data)
  true
end

#admin!(user, level: 100) ⇒ Object

Make a user an admin in the room

Parameters:

  • user (User, MXID, String)

    The user to give admin privileges

  • level (Integer) (defaults to: 100)

    The power level to set the user to

Raises:

  • (ArgumentError)

See Also:



769
770
771
772
773
774
775
776
777
# File 'lib/matrix_sdk/room.rb', line 769

def admin!(user, level: 100)
  return true if admin?(user, target_level: level)

  user = user.id if user.is_a? User
  user = MXID.new(user.to_s) unless user.is_a? MXID
  raise ArgumentError, 'Must provide a valid user or MXID' unless user.user?

  modify_user_power_levels({ user.to_s.to_sym => level })
end

#admin?(user, target_level: 100) ⇒ Boolean

Check if a user is an admin in the room

Parameters:

  • user (User, MXID, String)

    The user to check for admin privileges

  • target_level (Integer) (defaults to: 100)

    The power level that’s to be considered as admin privileges

Returns:

  • (Boolean)

    If the requested user has a power level highe enough to be an admin

See Also:



757
758
759
760
761
762
# File 'lib/matrix_sdk/room.rb', line 757

def admin?(user, target_level: 100)
  level = user_powerlevel(user, use_default: false)
  return false unless level

  level >= target_level
end

#aliases(canonical_only: true) ⇒ Array[String]

Gets the room aliases

Parameters:

  • canonical_only (Boolean) (defaults to: true)

    Should the list of aliases only contain the canonical ones

Returns:

  • (Array[String])

    The assigned room aliases



279
280
281
282
283
284
285
# File 'lib/matrix_sdk/room.rb', line 279

def aliases(canonical_only: true)
  canonical = client.api.get_room_state(id, 'm.room.canonical_alias') rescue {}
  aliases = ([canonical[:alias]].compact + (canonical[:alt_aliases] || [])).uniq.sort
  return aliases if canonical_only

  (aliases + client.api.get_room_aliases(id).aliases).uniq.sort
end

#all_members(**params) ⇒ Array(User)

Note:

This will also count members who’ve knocked, been invited, have left, or have been banned.

Get all members (member events) in the room

Parameters:

  • params (Hash)

    Additional query parameters to pass to the room member listing - e.g. for filtering purposes.

Returns:

  • (Array(User))

    The complete list of members in the room, regardless of membership state



195
196
197
# File 'lib/matrix_sdk/room.rb', line 195

def all_members(**params)
  client.api.get_room_members(id, **params)[:chunk].map { |ch| client.get_user(ch[:state_key]) }
end

#allow_guests=(allow_guests) ⇒ Object

Sets if guests are allowed in the room

Parameters:

  • allow_guests (Boolean)

    If guests are allowed to join or not



700
701
702
703
# File 'lib/matrix_sdk/room.rb', line 700

def allow_guests=(allow_guests)
  self.guest_access = (allow_guests ? :can_join : :forbidden)
  allow_guests
end

#avatar_urlString?

Gets the avatar url of the room - if any

Returns:

  • (String, nil)

    The avatar URL - if any



214
215
216
217
218
219
# File 'lib/matrix_sdk/room.rb', line 214

def avatar_url
  client.api.get_room_avatar(id)[:url]
rescue MatrixNotFoundError
  # No avatar has been set
  nil
end

#avatar_url=(avatar_url) ⇒ Object

Sets a new avatar URL for the room

Parameters:

  • avatar_url (URI::MXC)

    The mxc:// URL for the new room avatar

Raises:

  • (ArgumentError)


717
718
719
720
721
722
723
724
# File 'lib/matrix_sdk/room.rb', line 717

def avatar_url=(avatar_url)
  avatar_url = URI(avatar_url) unless avatar_url.is_a? URI
  raise ArgumentError, 'Must be a valid MXC URL' unless avatar_url.is_a? URI::MXC

  client.api.set_room_avatar(id, avatar_url)
  tinycache_adapter.write(:avatar_url, avatar_url)
  avatar_url
end

#backfill_messages(*args, reverse: false, limit: 10) ⇒ Object

Note:

This will trigger the ‘on_event` events as messages are added

Backfills messages into the room history

Parameters:

  • reverse (Boolean) (defaults to: false)

    whether to fill messages in reverse or not

  • limit (Integer) (defaults to: 10)

    the maximum number of messages to backfill



427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
# File 'lib/matrix_sdk/room.rb', line 427

def backfill_messages(*args, reverse: false, limit: 10)
  # To be backwards-compatible
  if args.length == 2
    reverse = args.first
    limit = args.last
  end

  data = client.api.get_room_messages(id, @prev_batch, direction: :b, limit: limit)

  events = data[:chunk]
  events.reverse! unless reverse
  events.each do |ev|
    put_event(ev)
  end
  true
end

#ban_user(user_id, reason = '') ⇒ Boolean

Bans a user from the room

Parameters:

  • user_id (String, User)

    the MXID of the user

  • reason (String) (defaults to: '')

    the reason for the ban

Returns:

  • (Boolean)

    wether the action succeeded



474
475
476
477
478
# File 'lib/matrix_sdk/room.rb', line 474

def ban_user(user_id, reason = '')
  user_id = user_id.id if user_id.is_a? MatrixSdk::User
  client.api.ban_user(id, user_id, reason: reason)
  true
end

#canonical_aliasString?

Returns the canonical alias of the room.

Returns:

  • (String, nil)

    the canonical alias of the room



171
172
173
174
175
# File 'lib/matrix_sdk/room.rb', line 171

def canonical_alias
  client.api.get_room_state(id, 'm.room.canonical_alias')[:alias]
rescue MatrixSdk::MatrixNotFoundError
  nil
end

#creation_infoResponse

Gets the room creation information

Returns:

  • (Response)

    The content of the m.room.create event



537
538
539
540
# File 'lib/matrix_sdk/room.rb', line 537

def creation_info
  # Not caching here, easier to cache the important values separately instead
  client.api.get_room_creation_info(id)
end

#display_nameString

Note:

This method will populate the #members list if it has to fall back to the member name generation.

Gets a human-readable name for the room

This will return #name or #canonical_alias if they’ve been set, otherwise it will query the API for members and generate a string from a subset of their names.

Returns:

  • (String)

    a human-readable name for the room



155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/matrix_sdk/room.rb', line 155

def display_name
  return name if name
  return canonical_alias if canonical_alias

  members = joined_members
            .reject { |m| m.user_id == client.mxid }
            .map(&:display_name)

  return members.first if members.one?
  return "#{members.first} and #{members.last}" if members.count == 2
  return "#{members.first} and #{members.count - 1} others" if members.count > 2

  'Empty Room'
end

#get_account_data(type) ⇒ Hash

Retrieves a custom entry from the room-specific account data

Parameters:

  • type (String)

    the data type to retrieve

Returns:

  • (Hash)

    the data that was stored under the given type



503
504
505
# File 'lib/matrix_sdk/room.rb', line 503

def (type)
  client.api.(client.mxid, id, type)
end

#guest_access:can_join, :forbidden

Gets the guest access rights for the room

Returns:

  • (:can_join, :forbidden)

    The current guest access right



234
235
236
# File 'lib/matrix_sdk/room.rb', line 234

def guest_access
  client.api.get_room_guest_access(id)[:guest_access]&.to_sym
end

#guest_access=(guest_access) ⇒ Object

Sets the guest access status for the room

Parameters:

  • guest_access (:can_join, :forbidden)

    The new guest access status of the room



708
709
710
711
712
# File 'lib/matrix_sdk/room.rb', line 708

def guest_access=(guest_access)
  client.api.set_room_guest_access(id, guest_access)
  tinycache_adapter.write(:guest_access, guest_access)
  guest_access
end

#guest_access?Boolean

Checks if guest_access is set to :can_join

Returns:

  • (Boolean)


246
247
248
# File 'lib/matrix_sdk/room.rb', line 246

def guest_access?
  guest_access == :can_join
end

#history_visibility:invited, ...

Gets the history visibility of the room

Returns:

  • (:invited, :joined, :shared, :world_readable)

    The current history visibility for the room



263
264
265
# File 'lib/matrix_sdk/room.rb', line 263

def history_visibility
  client.api.get_room_state(id, 'm.room.history_visibility')[:history_visibility]&.to_sym
end

#inspectString

An inspect method that skips a handful of instance variables to avoid flooding the terminal with debug data.

Returns:

  • (String)

    a regular inspect string without the data for some variables



31
# File 'lib/matrix_sdk/room.rb', line 31

ignore_inspect :client, :events, :prev_batch, :logger, :tinycache_adapter

#invite_only=(invite_only) ⇒ Object

Sets if the room should be invite only or not

Parameters:

  • invite_only (Boolean)

    If it should be invite only or not



683
684
685
686
# File 'lib/matrix_sdk/room.rb', line 683

def invite_only=(invite_only)
  self.join_rule = invite_only ? :invite : :public
  invite_only
end

#invite_only?Boolean

Checks if join_rule is set to :invite

Returns:

  • (Boolean)


251
252
253
# File 'lib/matrix_sdk/room.rb', line 251

def invite_only?
  join_rule == :invite
end

#invite_user(user_id) ⇒ Boolean

Invites a user into the room

Parameters:

  • user_id (String, User)

    the MXID of the user

Returns:

  • (Boolean)

    wether the action succeeded



452
453
454
455
456
# File 'lib/matrix_sdk/room.rb', line 452

def invite_user(user_id)
  user_id = user_id.id if user_id.is_a? MatrixSdk::User
  client.api.invite_user(id, user_id)
  true
end

#join_rule:public, ...

Gets the join rule for the room

Returns:

  • (:public, :knock, :invite, :private)

    The current join rule



241
242
243
# File 'lib/matrix_sdk/room.rb', line 241

def join_rule
  client.api.get_room_join_rules(id)[:join_rule]&.to_sym
end

#join_rule=(join_rule) ⇒ Object

Sets the join rule of the room

Parameters:

  • join_rule (:invite, :public)

    The join rule of the room



691
692
693
694
695
# File 'lib/matrix_sdk/room.rb', line 691

def join_rule=(join_rule)
  client.api.set_room_join_rules(id, join_rule)
  tinycache_adapter.write(:join_rule, join_rule)
  join_rule
end

#joined_membersArray(User)

Populates and returns the #members array

Returns:

  • (Array(User))

    The list of members in the room



180
181
182
183
184
185
186
# File 'lib/matrix_sdk/room.rb', line 180

def joined_members
  client.api.get_room_joined_members(id)[:joined].map do |mxid, data|
    User.new(client, mxid.to_s,
             display_name: data.fetch(:display_name, nil),
             avatar_url: data.fetch(:avatar_url, nil))
  end
end

#kick_user(user_id, reason = '') ⇒ Boolean

Kicks a user from the room

Parameters:

  • user_id (String, User)

    the MXID of the user

  • reason (String) (defaults to: '')

    the reason for the kick

Returns:

  • (Boolean)

    wether the action succeeded



463
464
465
466
467
# File 'lib/matrix_sdk/room.rb', line 463

def kick_user(user_id, reason = '')
  user_id = user_id.id if user_id.is_a? MatrixSdk::User
  client.api.kick_user(id, user_id, reason: reason)
  true
end

#knock_only?Boolean

Checks if join_rule is set to :knock

Returns:

  • (Boolean)


256
257
258
# File 'lib/matrix_sdk/room.rb', line 256

def knock_only?
  join_rule == :knock
end

#leaveBoolean

Requests to be removed from the room

Returns:

  • (Boolean)

    wether the request succeeded



493
494
495
496
497
# File 'lib/matrix_sdk/room.rb', line 493

def leave
  client.api.leave_room(id)
  client.instance_variable_get(:@rooms).delete id
  true
end

#membersObject



44
# File 'lib/matrix_sdk/room.rb', line 44

alias members joined_members

#moderator!(user, level: 50) ⇒ Object

Make a user a moderator in the room

Parameters:

  • user (User, MXID, String)

    The user to give moderator privileges

  • level (Integer) (defaults to: 50)

    The power level to set the user to

Raises:

  • (ArgumentError)

See Also:



797
798
799
800
801
802
803
804
805
# File 'lib/matrix_sdk/room.rb', line 797

def moderator!(user, level: 50)
  return true if moderator?(user, target_level: level)

  user = user.id if user.is_a? User
  user = MXID.new(user.to_s) unless user.is_a? MXID
  raise ArgumentError, 'Must provide a valid user or MXID' unless user.user?

  modify_user_power_levels({ user.to_s.to_sym => level })
end

#moderator?(user, target_level: 50) ⇒ Boolean

Check if a user is a moderator in the room

Parameters:

  • user (User, MXID, String)

    The user to check for admin privileges

  • target_level (Integer) (defaults to: 50)

    The power level that’s to be considered as admin privileges

Returns:

  • (Boolean)

    If the requested user has a power level highe enough to be an admin

See Also:



785
786
787
788
789
790
# File 'lib/matrix_sdk/room.rb', line 785

def moderator?(user, target_level: 50)
  level = user_powerlevel(user, use_default: false)
  return false unless level

  level >= target_level
end

#modify_required_power_levels(events = nil, params = {}) ⇒ Boolean

Modifies the required power levels for actions in the room

Parameters:

  • events (Hash) (defaults to: nil)

    the event-specific power levels to change

  • params (Hash) (defaults to: {})

    other power-level params to change

Returns:

  • (Boolean)

    if the change was successful



843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
# File 'lib/matrix_sdk/room.rb', line 843

def modify_required_power_levels(events = nil, params = {})
  return false if events.nil? && (params.nil? || params.empty?)

  data = power_levels_without_cache
  tinycache_adapter.write(:power_levels, data)
  data.merge!(params)
  data.delete_if { |_k, v| v.nil? }

  if events
    data[:events] = {} unless data.key? :events
    data[:events].merge!(events)
    data[:events].delete_if { |_k, v| v.nil? }
  end

  client.api.set_power_levels(id, data)
  true
end

#modify_user_power_levels(users = nil, users_default = nil) ⇒ Boolean

Modifies the power levels of the room

Parameters:

  • users (Hash) (defaults to: nil)

    the user-specific power levels to set or remove

  • users_default (Hash) (defaults to: nil)

    the default user power levels to set

Returns:

  • (Boolean)

    if the change was successful



812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
# File 'lib/matrix_sdk/room.rb', line 812

def modify_user_power_levels(users = nil, users_default = nil)
  return false if users.nil? && users_default.nil?

  data = power_levels_without_cache
  tinycache_adapter.write(:power_levels, data)
  data[:users_default] = users_default unless users_default.nil?

  if users
    data[:users] = {} unless data.key? :users
    users.each do |user, level|
      user = user.id if user.is_a? User
      user = MXID.new(user.to_s) unless user.is_a? MXID
      raise ArgumentError, 'Must provide a valid user or MXID' unless user.user?

      if level.nil?
        data[:users].delete(user.to_s.to_sym)
      else
        data[:users][user.to_s.to_sym] = level
      end
    end
  end

  client.api.set_power_levels(id, data)
  true
end

#nameString?

Note:

Will cache the current name for 15 minutes

Gets the current name of the room, querying the API if necessary

Returns:

  • (String, nil)

    The room name - if any



204
205
206
207
208
209
# File 'lib/matrix_sdk/room.rb', line 204

def name
  client.api.get_room_name(id)[:name]
rescue MatrixNotFoundError
  # No room name has been specified
  nil
end

#name=(name) ⇒ Object

Sets a new name on the room

Parameters:

  • name (String)

    The new name to set



630
631
632
633
634
# File 'lib/matrix_sdk/room.rb', line 630

def name=(name)
  tinycache_adapter.write(:name, name)
  client.api.set_room_name(id, name)
  name
end

#power_levelsHash

Note:

The returned power levels are cached for a minute

Get the power levels of the room

Returns:

  • (Hash)

    The current power levels as set for the room

See Also:



731
732
733
# File 'lib/matrix_sdk/room.rb', line 731

def power_levels
  client.api.get_power_levels(id)
end

#redact_message(event_id, reason = nil) ⇒ Object

Redacts a message from the room

Parameters:

  • event_id (String)

    the ID of the event to redact

  • reason (String, nil) (defaults to: nil)

    the reason for the redaction



407
408
409
410
# File 'lib/matrix_sdk/room.rb', line 407

def redact_message(event_id, reason = nil)
  client.api.redact_event(id, event_id, reason: reason)
  true
end

#reload!Object Also known as: refresh!

Refreshes the room state caches for name, topic, and aliases



619
620
621
622
623
624
# File 'lib/matrix_sdk/room.rb', line 619

def reload!
  reload_name!
  reload_topic!
  reload_aliases!
  true
end

#reload_aliases!Boolean Also known as: refresh_aliases!

Note:

The list of aliases is not sorted, ordering changes will result in alias list updates.

Reloads the list of aliases by an API query

Returns:

  • (Boolean)

    if the alias list was updated or not



675
676
677
# File 'lib/matrix_sdk/room.rb', line 675

def reload_aliases!
  clear_aliases_cache
end

#reload_name!Boolean Also known as: refresh_name!

Reloads the name of the room

Returns:

  • (Boolean)

    if the name was changed or not



639
640
641
# File 'lib/matrix_sdk/room.rb', line 639

def reload_name!
  clear_name_cache
end

#reload_topic!Boolean Also known as: refresh_topic!

Reloads the topic of the room

Returns:

  • (Boolean)

    if the topic was changed or not



656
657
658
# File 'lib/matrix_sdk/room.rb', line 656

def reload_topic!
  clear_topic_cache
end

#remove_tag(tag) ⇒ Object

Remove a tag from the room

Parameters:

  • tag (String)

    The tag to remove



600
601
602
603
# File 'lib/matrix_sdk/room.rb', line 600

def remove_tag(tag)
  client.api.remove_user_tag(client.mxid, id, tag)
  true
end

#report_message(event_id, reason:, score: -100)) ⇒ Object

Reports a message in the room

Parameters:

  • event_id (MXID, String)

    The ID of the event to redact

  • reason (String)

    The reason for the report

  • score (Integer) (defaults to: -100))

    The severity of the report in the range of -100 - 0



417
418
419
420
# File 'lib/matrix_sdk/room.rb', line 417

def report_message(event_id, reason:, score: -100)
  client.api.report_event(id, event_id, reason: reason, score: score)
  true
end

#room_type'm.space', ...

Retrieves the type of the room

Returns:

  • ('m.space', String, nil)

    The type of the room



545
546
547
548
549
550
551
# File 'lib/matrix_sdk/room.rb', line 545

def room_type
  # Can't change, so a permanent cache is ok
  return @room_type if @room_type_retrieved || @room_type

  @room_type_retrieved = true
  @room_type ||= creation_info[:type]
end

#room_versionString

Retrieves the room version

Returns:

  • (String)

    The version of the room



556
557
558
# File 'lib/matrix_sdk/room.rb', line 556

def room_version
  @room_version ||= creation_info[:room_version]
end

#send_audio(url, name, audio_info = {}) ⇒ Object

Note:

The URLs should all be of the ‘mxc://’ schema

Sends a link to an audio clip to the room

Parameters:

  • url (String, URI)

    the URL to the audio clip

  • name (String)

    the name of the audio clip

  • audio_info (Hash) (defaults to: {})

    extra information about the audio clip

Options Hash (audio_info):

  • :duration (Integer)

    the duration of the audio clip in milliseconds

  • :mimetype (String)

    the MIME type of the audio clip

  • :size (Integer)

    the size of the audio clip in bytes



399
400
401
# File 'lib/matrix_sdk/room.rb', line 399

def send_audio(url, name, audio_info = {})
  client.api.send_content(id, url, name, 'm.audio', extra_information: audio_info)
end

#send_emote(text) ⇒ Object

Sends an emote (/me) message to the room

Parameters:

  • text (String)

    the emote to send



321
322
323
# File 'lib/matrix_sdk/room.rb', line 321

def send_emote(text)
  client.api.send_emote(id, text)
end

#send_file(url, name, file_info = {}) ⇒ Object

Note:

The URLs should all be of the ‘mxc://’ schema

Sends a link to a generic file to the room

Parameters:

  • url (String, URI)

    the URL to the file

  • name (String)

    the name of the file

  • file_info (Hash) (defaults to: {})

    extra information about the file

Options Hash (file_info):

  • :mimetype (String)

    the MIME type of the file

  • :size (Integer)

    the size of the file in bytes

  • :thumbnail_url (String, URI)

    the URL to a thumbnail of the file

  • :thumbnail_info (Hash)

    ThumbnailInfo about the thumbnail file



335
336
337
# File 'lib/matrix_sdk/room.rb', line 335

def send_file(url, name, file_info = {})
  client.api.send_content(id, url, name, 'm.file', extra_information: file_info)
end

#send_html(html, body = nil, msgtype: nil, format: nil) ⇒ Object

Sends a custom HTML message to the room

Parameters:

  • html (String)

    the HTML message to send

  • body (String, nil) (defaults to: nil)

    a plain-text representation of the object (Will default to the HTML with all tags stripped away)

  • msgtype (String) (defaults to: nil)

    (‘m.text’) The message type for the message

  • format (String) (defaults to: nil)

    (‘org.matrix.custom.html’) The message format

See Also:



307
308
309
310
311
312
313
314
315
316
# File 'lib/matrix_sdk/room.rb', line 307

def send_html(html, body = nil, msgtype: nil, format: nil)
  content = {
    body: body || html.gsub(/<\/?[^>]*>/, ''),
    msgtype: msgtype || 'm.text',
    format: format || 'org.matrix.custom.html',
    formatted_body: html
  }

  client.api.send_message_event(id, 'm.room.message', content)
end

#send_image(url, name, image_info = {}) ⇒ Object

Note:

The URLs should all be of the ‘mxc://’ schema

Sends a link to an image to the room

Parameters:

  • url (String, URI)

    the URL to the image

  • name (String)

    the name of the image

  • image_info (Hash) (defaults to: {})

    extra information about the image

Options Hash (image_info):

  • :h (Integer)

    the height of the image in pixels

  • :w (Integer)

    the width of the image in pixels

  • :mimetype (String)

    the MIME type of the image

  • :size (Integer)

    the size of the image in bytes

  • :thumbnail_url (String, URI)

    the URL to a thumbnail of the image

  • :thumbnail_info (Hash)

    ThumbnailInfo about the thumbnail image



358
359
360
# File 'lib/matrix_sdk/room.rb', line 358

def send_image(url, name, image_info = {})
  client.api.send_content(id, url, name, 'm.image', extra_information: image_info)
end

#send_location(geo_uri, name, thumbnail_url = nil, thumbnail_info = {}) ⇒ Object

Note:

The thumbnail URL should be of the ‘mxc://’ schema

Sends a location object to the room

Parameters:

  • geo_uri (String, URI)

    the geo-URL (e.g. geo:<coords>) of the location

  • name (String)

    the name of the location

  • thumbnail_url (String, URI) (defaults to: nil)

    the URL to a thumbnail image of the location

  • thumbnail_info (Hash) (defaults to: {})

    a ThumbnailInfo for the location thumbnail



369
370
371
# File 'lib/matrix_sdk/room.rb', line 369

def send_location(geo_uri, name, thumbnail_url = nil, thumbnail_info = {})
  client.api.send_location(id, geo_uri, name, thumbnail_url: thumbnail_url, thumbnail_info: thumbnail_info)
end

#send_notice(text) ⇒ Object

Sends a notice (bot) message to the room

Parameters:

  • text (String)

    the notice to send



342
343
344
# File 'lib/matrix_sdk/room.rb', line 342

def send_notice(text)
  client.api.send_notice(id, text)
end

#send_text(text) ⇒ Object

Sends a plain-text message to the room

Parameters:

  • text (String)

    the message to send



294
295
296
# File 'lib/matrix_sdk/room.rb', line 294

def send_text(text)
  client.api.send_message(id, text)
end

#send_video(url, name, video_info = {}) ⇒ Object

Note:

The URLs should all be of the ‘mxc://’ schema

Sends a link to a video to the room

Parameters:

  • url (String, URI)

    the URL to the video

  • name (String)

    the name of the video

  • video_info (Hash) (defaults to: {})

    extra information about the video

Options Hash (video_info):

  • :duration (Integer)

    the duration of the video in milliseconds

  • :h (Integer)

    the height of the video in pixels

  • :w (Integer)

    the width of the video in pixels

  • :mimetype (String)

    the MIME type of the video

  • :size (Integer)

    the size of the video in bytes

  • :thumbnail_url (String, URI)

    the URL to a thumbnail of the video

  • :thumbnail_info (Hash)

    ThumbnailInfo about the thumbnail of the video



386
387
388
# File 'lib/matrix_sdk/room.rb', line 386

def send_video(url, name, video_info = {})
  client.api.send_content(id, url, name, 'm.video', extra_information: video_info)
end

#set_account_data(type, account_data) ⇒ Object

Stores a custom entry into the room-specific account data

Parameters:

  • type (String)

    the data type to store

  • account_data (Hash)

    the data to store



511
512
513
514
# File 'lib/matrix_sdk/room.rb', line 511

def (type, )
  client.api.(client.mxid, id, type, )
  true
end

#set_user_profile(display_name: nil, avatar_url: nil, reason: nil) ⇒ Object

Note:

the avatar URL should be a mxc:// URI

Changes the room-specific user profile

Parameters:

  • display_name (String) (defaults to: nil)

    the new display name to use in the room

  • avatar_url (String, URI) (defaults to: nil)

    the new avatar URL to use in the room



521
522
523
524
525
526
527
528
529
530
531
532
# File 'lib/matrix_sdk/room.rb', line 521

def (display_name: nil, avatar_url: nil, reason: nil)
  return nil unless display_name || avatar_url

  data = client.api.get_membership(id, client.mxid)
  raise "Can't set profile if you haven't joined the room" unless data[:membership] == 'join'

  data[:displayname] = display_name unless display_name.nil?
  data[:avatar_url] = avatar_url unless avatar_url.nil?

  client.api.set_membership(id, client.mxid, 'join', reason || 'Updating room profile information', data)
  true
end

#space?Boolean?

Checks if the room is a Matrix Space

Returns:

  • (Boolean, nil)

    True if the room is a space



563
564
565
566
567
# File 'lib/matrix_sdk/room.rb', line 563

def space?
  room_type == 'm.space'
rescue MatrixSdk::MatrixForbiddenError, MatrixSdk::MatrixNotFoundError
  nil
end

#tagsResponse

Returns a list of the room tags

Examples:

Managing tags

room.tags
# => { :room_tag => { data: false } }
room.tags.add('some_tag', data: true)
# => { :some_tag => { data: true }, :room_tag => { data: false} }
room.tags.remove('room_tag')
# => { :some_tag => { data: true} }

Returns:

  • (Response)

    A list of the tags and their data, with add and remove methods implemented



579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
# File 'lib/matrix_sdk/room.rb', line 579

def tags
  client.api.get_user_tags(client.mxid, id)[:tags].tap do |tag_obj|
    tag_obj.instance_variable_set(:@room, self)
    tag_obj.define_singleton_method(:room) do
      @room
    end
    tag_obj.define_singleton_method(:add) do |tag, **data|
      @room.add_tag(tag.to_s.to_sym, **data)
      self[tag.to_s.to_sym] = data
      self
    end
    tag_obj.define_singleton_method(:remove) do |tag|
      @room.remove_tag(tag.to_s.to_sym)
      delete tag.to_s.to_sym
    end
  end
end

#to_sObject



112
113
114
115
116
117
118
# File 'lib/matrix_sdk/room.rb', line 112

def to_s
  prefix = canonical_alias if canonical_alias_has_value?
  prefix ||= id
  return "#{prefix} | #{name}" if name_has_value?

  prefix
end

#to_spaceObject

Casting operators



106
107
108
109
110
# File 'lib/matrix_sdk/room.rb', line 106

def to_space
  return nil unless space?

  Rooms::Space.new self, nil
end

#topicString?

Gets the room topic - if any

Returns:

  • (String, nil)

    The topic of the room



224
225
226
227
228
229
# File 'lib/matrix_sdk/room.rb', line 224

def topic
  client.api.get_room_topic(id)[:topic]
rescue MatrixNotFoundError
  # No room name has been specified
  nil
end

#topic=(topic) ⇒ Object

Sets a new topic on the room

Parameters:

  • topic (String)

    The new topic to set



647
648
649
650
651
# File 'lib/matrix_sdk/room.rb', line 647

def topic=(topic)
  tinycache_adapter.write(:topic, topic)
  client.api.set_room_topic(id, topic)
  topic
end

#unban_user(user_id) ⇒ Boolean

Unbans a user from the room

Parameters:

  • user_id (String, User)

    the MXID of the user

Returns:

  • (Boolean)

    wether the action succeeded



484
485
486
487
488
# File 'lib/matrix_sdk/room.rb', line 484

def unban_user(user_id)
  user_id = user_id.id if user_id.is_a? MatrixSdk::User
  client.api.unban_user(id, user_id)
  true
end

#user_powerlevel(user, use_default: true) ⇒ Integer?

Gets the power level of a user in the room

Parameters:

  • user (User, MXID, String)

    The user to check the power level for

  • use_default (Boolean) (defaults to: true)

    Should the user default level be checked if no user-specific one exists

Returns:

  • (Integer, nil)

    The current power level for the requested user, nil if there’s no user specific level and use_default is false

Raises:

  • (ArgumentError)


741
742
743
744
745
746
747
748
749
# File 'lib/matrix_sdk/room.rb', line 741

def user_powerlevel(user, use_default: true)
  user = user.id if user.is_a? User
  user = MXID.new(user.to_s) unless user.is_a? MXID
  raise ArgumentError, 'Must provide a valid user or MXID' unless user.user?

  level = power_levels.dig(:users, user.to_s.to_sym)
  level = power_levels[:users_default] || 0 if level.nil? && use_default
  level
end

#world_readable?Boolean Also known as: world_readable

Checks if the room history is world readable

Returns:

  • (Boolean)

    If the history is world readable



270
271
272
# File 'lib/matrix_sdk/room.rb', line 270

def world_readable?
  history_visibility == :world_readable
end