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)

    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)


65
66
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
# File 'lib/matrix_sdk/room.rb', line 65

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)



136
137
138
# File 'lib/matrix_sdk/room.rb', line 136

def on_ephemeral_event
  ensure_room_handlers[:ephemeral_event]
end

#on_eventObject (readonly)



124
125
126
# File 'lib/matrix_sdk/room.rb', line 124

def on_event
  ensure_room_handlers[:event]
end

#on_state_eventObject (readonly)



130
131
132
# File 'lib/matrix_sdk/room.rb', line 130

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



658
659
660
661
662
# File 'lib/matrix_sdk/room.rb', line 658

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



603
604
605
606
# File 'lib/matrix_sdk/room.rb', line 603

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:



763
764
765
766
767
768
769
770
771
# File 'lib/matrix_sdk/room.rb', line 763

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:



751
752
753
754
755
756
# File 'lib/matrix_sdk/room.rb', line 751

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

  level >= target_level
end

#aliasesArray[String]

Gets the room aliases

Returns:

  • (Array[String])

    The assigned room aliases



271
272
273
274
275
276
277
278
279
# File 'lib/matrix_sdk/room.rb', line 271

def aliases
  client.api.get_room_aliases(id).aliases
rescue MatrixNotFoundError
  data = client.api.get_room_state_all(id)
  data.select { |chunk| chunk[:type] == 'm.room.aliases' && chunk.key?(:content) && chunk[:content].key?(:aliases) }
      .map { |chunk| chunk[:content][:aliases] }
      .flatten
      .compact
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



193
194
195
# File 'lib/matrix_sdk/room.rb', line 193

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



694
695
696
697
# File 'lib/matrix_sdk/room.rb', line 694

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



212
213
214
215
216
217
# File 'lib/matrix_sdk/room.rb', line 212

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)


711
712
713
714
715
716
717
718
# File 'lib/matrix_sdk/room.rb', line 711

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



421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
# File 'lib/matrix_sdk/room.rb', line 421

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



468
469
470
471
472
# File 'lib/matrix_sdk/room.rb', line 468

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



169
170
171
172
173
# File 'lib/matrix_sdk/room.rb', line 169

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



531
532
533
534
# File 'lib/matrix_sdk/room.rb', line 531

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



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

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



497
498
499
# File 'lib/matrix_sdk/room.rb', line 497

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



232
233
234
# File 'lib/matrix_sdk/room.rb', line 232

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



702
703
704
705
706
# File 'lib/matrix_sdk/room.rb', line 702

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)


244
245
246
# File 'lib/matrix_sdk/room.rb', line 244

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



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

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



677
678
679
680
# File 'lib/matrix_sdk/room.rb', line 677

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)


249
250
251
# File 'lib/matrix_sdk/room.rb', line 249

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



446
447
448
449
450
# File 'lib/matrix_sdk/room.rb', line 446

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



239
240
241
# File 'lib/matrix_sdk/room.rb', line 239

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



685
686
687
688
689
# File 'lib/matrix_sdk/room.rb', line 685

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



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

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



457
458
459
460
461
# File 'lib/matrix_sdk/room.rb', line 457

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

#leaveBoolean

Requests to be removed from the room

Returns:

  • (Boolean)

    wether the request succeeded



487
488
489
490
491
# File 'lib/matrix_sdk/room.rb', line 487

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

#membersObject



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

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:



791
792
793
794
795
796
797
798
799
# File 'lib/matrix_sdk/room.rb', line 791

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:



779
780
781
782
783
784
# File 'lib/matrix_sdk/room.rb', line 779

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



828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
# File 'lib/matrix_sdk/room.rb', line 828

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



806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
# File 'lib/matrix_sdk/room.rb', line 806

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
    data[:users].merge!(users)
    data[:users].delete_if { |_k, v| v.nil? }
  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



202
203
204
205
206
207
# File 'lib/matrix_sdk/room.rb', line 202

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



624
625
626
627
628
# File 'lib/matrix_sdk/room.rb', line 624

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:



725
726
727
# File 'lib/matrix_sdk/room.rb', line 725

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



401
402
403
404
# File 'lib/matrix_sdk/room.rb', line 401

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



613
614
615
616
617
618
# File 'lib/matrix_sdk/room.rb', line 613

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



669
670
671
# File 'lib/matrix_sdk/room.rb', line 669

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



633
634
635
# File 'lib/matrix_sdk/room.rb', line 633

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



650
651
652
# File 'lib/matrix_sdk/room.rb', line 650

def reload_topic!
  clear_topic_cache
end

#remove_tag(tag) ⇒ Object

Remove a tag from the room

Parameters:

  • tag (String)

    The tag to remove



594
595
596
597
# File 'lib/matrix_sdk/room.rb', line 594

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



411
412
413
414
# File 'lib/matrix_sdk/room.rb', line 411

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



539
540
541
542
543
544
545
# File 'lib/matrix_sdk/room.rb', line 539

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



550
551
552
# File 'lib/matrix_sdk/room.rb', line 550

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



393
394
395
# File 'lib/matrix_sdk/room.rb', line 393

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



315
316
317
# File 'lib/matrix_sdk/room.rb', line 315

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



329
330
331
# File 'lib/matrix_sdk/room.rb', line 329

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:



301
302
303
304
305
306
307
308
309
310
# File 'lib/matrix_sdk/room.rb', line 301

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



352
353
354
# File 'lib/matrix_sdk/room.rb', line 352

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



363
364
365
# File 'lib/matrix_sdk/room.rb', line 363

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



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

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



288
289
290
# File 'lib/matrix_sdk/room.rb', line 288

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



380
381
382
# File 'lib/matrix_sdk/room.rb', line 380

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



505
506
507
508
# File 'lib/matrix_sdk/room.rb', line 505

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



515
516
517
518
519
520
521
522
523
524
525
526
# File 'lib/matrix_sdk/room.rb', line 515

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



557
558
559
560
561
# File 'lib/matrix_sdk/room.rb', line 557

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



573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
# File 'lib/matrix_sdk/room.rb', line 573

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



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

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



104
105
106
107
108
# File 'lib/matrix_sdk/room.rb', line 104

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



222
223
224
225
226
227
# File 'lib/matrix_sdk/room.rb', line 222

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



641
642
643
644
645
# File 'lib/matrix_sdk/room.rb', line 641

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



478
479
480
481
482
# File 'lib/matrix_sdk/room.rb', line 478

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)


735
736
737
738
739
740
741
742
743
# File 'lib/matrix_sdk/room.rb', line 735

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[: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



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

def world_readable?
  history_visibility == :world_readable
end