Class: Rubycord::Message

Inherits:
Object
  • Object
show all
Includes:
IDObject
Defined in:
lib/rubycord/data/message.rb

Overview

A message on Discord that was sent to a text channel

Instance Attribute Summary collapse

Attributes included from IDObject

#id

Instance Method Summary collapse

Methods included from IDObject

#==, #creation_time, synthesise

Instance Attribute Details

#attachmentsArray<Attachment> (readonly)



34
35
36
# File 'lib/rubycord/data/message.rb', line 34

def attachments
  @attachments
end

#authorMember, User (readonly) Also known as: user, writer



13
14
15
# File 'lib/rubycord/data/message.rb', line 13

def author
  @author
end

#channelChannel (readonly)



18
19
20
# File 'lib/rubycord/data/message.rb', line 18

def channel
  @channel
end

#componentsArray<Component> (readonly)



72
73
74
# File 'lib/rubycord/data/message.rb', line 72

def components
  @components
end

#contentString (readonly) Also known as: text, to_s



7
8
9
# File 'lib/rubycord/data/message.rb', line 7

def content
  @content
end

#editedtrue, false (readonly) Also known as: edited?



50
51
52
# File 'lib/rubycord/data/message.rb', line 50

def edited
  @edited
end

#edited_timestampTime (readonly) Also known as: edit_timestamp



24
25
26
# File 'lib/rubycord/data/message.rb', line 24

def edited_timestamp
  @edited_timestamp
end

#embedsArray<Embed> (readonly)



37
38
39
# File 'lib/rubycord/data/message.rb', line 37

def embeds
  @embeds
end

#mention_everyonetrue, false (readonly) Also known as: mention_everyone?, mentions_everyone?



54
55
56
# File 'lib/rubycord/data/message.rb', line 54

def mention_everyone
  @mention_everyone
end

#mentionsArray<User> (readonly)



28
29
30
# File 'lib/rubycord/data/message.rb', line 28

def mentions
  @mentions
end

#nonceString (readonly)



47
48
49
# File 'lib/rubycord/data/message.rb', line 47

def nonce
  @nonce
end

#pinnedtrue, false (readonly) Also known as: pinned?



59
60
61
# File 'lib/rubycord/data/message.rb', line 59

def pinned
  @pinned
end

#reactionsArray<Reaction> (readonly)



40
41
42
# File 'lib/rubycord/data/message.rb', line 40

def reactions
  @reactions
end

#role_mentionsArray<Role> (readonly)



31
32
33
# File 'lib/rubycord/data/message.rb', line 31

def role_mentions
  @role_mentions
end

#serverServer? (readonly)



66
67
68
# File 'lib/rubycord/data/message.rb', line 66

def server
  @server
end

#timestampTime (readonly)



21
22
23
# File 'lib/rubycord/data/message.rb', line 21

def timestamp
  @timestamp
end

#ttstrue, false (readonly) Also known as: tts?



43
44
45
# File 'lib/rubycord/data/message.rb', line 43

def tts
  @tts
end

#typeInteger (readonly)



63
64
65
# File 'lib/rubycord/data/message.rb', line 63

def type
  @type
end

#webhook_idInteger? (readonly)



69
70
71
# File 'lib/rubycord/data/message.rb', line 69

def webhook_id
  @webhook_id
end

Instance Method Details

#all_reaction_users(limit: 100) ⇒ Hash<String => Array<User>>

Returns a hash of all reactions to a message as keys and the users that reacted to it as values.

Examples:

Get all the users that reacted to a message for a giveaway.

giveaway_participants = message.all_reaction_users


332
333
334
335
# File 'lib/rubycord/data/message.rb', line 332

def all_reaction_users(limit: 100)
  all_reactions = @reactions.map { |r| {r.to_s => reacted_with(r, limit: limit)} }
  all_reactions.reduce({}, :merge)
end

#await(key, attributes = {}) ⇒ Object

Deprecated.

Will be changed to blocking behavior in v4.0. Use #await! instead.

Add an Await for a message with the same user and channel.

See Also:



228
229
230
# File 'lib/rubycord/data/message.rb', line 228

def await(key, attributes = {}, &)
  @bot.add_await(key, Rubycord::Events::MessageEvent, {from: @author.id, in: @channel.id}.merge(attributes), &)
end

#await!(attributes = {}) ⇒ Object

Add a blocking Await for a message with the same user and channel.

See Also:



234
235
236
# File 'lib/rubycord/data/message.rb', line 234

def await!(attributes = {}, &)
  @bot.add_await!(Rubycord::Events::MessageEvent, {from: @author.id, in: @channel.id}.merge(attributes), &)
end

#await_reaction(key, attributes = {}) ⇒ Object

Deprecated.

Will be changed to blocking behavior in v4.0. Use #await_reaction! instead.

Add an Await for a reaction to be added on this message.

See Also:



241
242
243
# File 'lib/rubycord/data/message.rb', line 241

def await_reaction(key, attributes = {}, &)
  @bot.add_await(key, Rubycord::Events::ReactionAddEvent, {message: @id}.merge(attributes), &)
end

#await_reaction!(attributes = {}) ⇒ Object

Add a blocking Await for a reaction to be added on this message.

See Also:



247
248
249
# File 'lib/rubycord/data/message.rb', line 247

def await_reaction!(attributes = {}, &)
  @bot.add_await!(Rubycord::Events::ReactionAddEvent, {message: @id}.merge(attributes), &)
end

#buttonsArray<Components::Button>



391
392
393
394
395
396
397
398
399
400
401
402
# File 'lib/rubycord/data/message.rb', line 391

def buttons
  results = @components.collect do |component|
    case component
    when Components::Button
      component
    when Components::ActionRow
      component.buttons
    end
  end

  results.flatten.compact
end

#chat_input_command?true, false

Whether or not this message was of type "CHAT_INPUT_COMMAND"



377
378
379
# File 'lib/rubycord/data/message.rb', line 377

def chat_input_command?
  @type == 20
end

#create_reaction(reaction) ⇒ Object Also known as: react

Reacts to a message.



289
290
291
292
293
# File 'lib/rubycord/data/message.rb', line 289

def create_reaction(reaction)
  reaction = reaction.to_reaction if reaction.respond_to?(:to_reaction)
  API::Channel.create_reaction(@bot.token, @channel.id, @id, reaction)
  nil
end

#delete(reason = nil) ⇒ Object

Deletes this message.



206
207
208
209
# File 'lib/rubycord/data/message.rb', line 206

def delete(reason = nil)
  API::Channel.delete_message(@bot.token, @channel.id, @id, reason)
  nil
end

#delete_all_reactionsObject

Removes all reactions from this message.



353
354
355
# File 'lib/rubycord/data/message.rb', line 353

def delete_all_reactions
  API::Channel.delete_all_reactions(@bot.token, @channel.id, @id)
end

#delete_own_reaction(reaction) ⇒ Object

Deletes this client's reaction on this message.



347
348
349
350
# File 'lib/rubycord/data/message.rb', line 347

def delete_own_reaction(reaction)
  reaction = reaction.to_reaction if reaction.respond_to?(:to_reaction)
  API::Channel.delete_own_reaction(@bot.token, @channel.id, @id, reaction)
end

#delete_reaction(user, reaction) ⇒ Object

Deletes a reaction made by a user on this message.



340
341
342
343
# File 'lib/rubycord/data/message.rb', line 340

def delete_reaction(user, reaction)
  reaction = reaction.to_reaction if reaction.respond_to?(:to_reaction)
  API::Channel.delete_user_reaction(@bot.token, @channel.id, @id, reaction, user.resolve_id)
end

#edit(new_content, new_embeds = nil, new_components = nil) ⇒ Message

Edits this message to have the specified content instead. You can only edit your own messages.



197
198
199
200
201
202
203
# File 'lib/rubycord/data/message.rb', line 197

def edit(new_content, new_embeds = nil, new_components = nil)
  new_embeds = (new_embeds.instance_of?(Array) ? new_embeds.map(&:to_hash) : [new_embeds&.to_hash]).compact
  new_components = new_components.to_a

  response = API::Channel.edit_message(@bot.token, @channel.id, @id, new_content, [], new_embeds, new_components)
  Message.new(JSON.parse(response), @bot)
end

#emojiArray<Emoji>



262
263
264
265
266
267
# File 'lib/rubycord/data/message.rb', line 262

def emoji
  return if @content.nil?
  return @emoji unless @emoji.empty?

  @emoji = @bot.parse_mentions(@content).select { |el| el.is_a? Rubycord::Emoji }
end

#emoji?true, false

Check if any emoji were used in this message.



271
272
273
# File 'lib/rubycord/data/message.rb', line 271

def emoji?
  emoji&.empty?
end

#from_bot?true, false



252
253
254
# File 'lib/rubycord/data/message.rb', line 252

def from_bot?
  @author&.current_bot?
end

#inspectObject

The inspect method is overwritten to give more useful output



358
359
360
# File 'lib/rubycord/data/message.rb', line 358

def inspect
  "<Message content=\"#{@content}\" id=#{@id} timestamp=#{@timestamp} author=#{@author} channel=#{@channel}>"
end


363
364
365
# File 'lib/rubycord/data/message.rb', line 363

def link
  "https://discord.com/channels/#{@server&.id || "@me"}/#{@channel.id}/#{@id}"
end

#my_reactionsArray<Reaction>

Returns the reactions made by the current bot or user.



283
284
285
# File 'lib/rubycord/data/message.rb', line 283

def my_reactions
  @reactions.select(&:me)
end

#pin(reason = nil) ⇒ Object

Pins this message



212
213
214
215
216
# File 'lib/rubycord/data/message.rb', line 212

def pin(reason = nil)
  API::Channel.pin_message(@bot.token, @channel.id, @id, reason)
  @pinned = true
  nil
end

#reacted_with(reaction, limit: 100) ⇒ Array<User>

Returns the list of users who reacted with a certain reaction.

Examples:

Get all the users that reacted with a thumbs up.

thumbs_up_reactions = message.reacted_with("\u{1F44D}")


303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
# File 'lib/rubycord/data/message.rb', line 303

def reacted_with(reaction, limit: 100)
  reaction = reaction.to_reaction if reaction.respond_to?(:to_reaction)
  reaction = reaction.to_s if reaction.respond_to?(:to_s)

  get_reactions = proc do |fetch_limit, after_id = nil|
    resp = API::Channel.get_reactions(@bot.token, @channel.id, @id, reaction, nil, after_id, fetch_limit)
    return JSON.parse(resp).map { |d| User.new(d, @bot) }
  end

  # Can be done without pagination
  return get_reactions.call(limit) if limit && limit <= 100

  paginator = Paginator.new(limit, :down) do |last_page|
    if last_page && last_page.count < 100
      []
    else
      get_reactions.call(100, last_page&.last&.id)
    end
  end

  paginator.to_a
end

#reactions?true, false

Check if any reactions were used in this message.



277
278
279
# File 'lib/rubycord/data/message.rb', line 277

def reactions?
  !@reactions.empty?
end

#referenced_messageMessage?



382
383
384
385
386
387
388
# File 'lib/rubycord/data/message.rb', line 382

def referenced_message
  return @referenced_message if @referenced_message
  return nil unless @message_reference

  referenced_channel = @bot.channel(@message_reference["channel_id"])
  @referenced_message = referenced_channel.message(@message_reference["message_id"])
end

#reply(content) ⇒ Message

Deprecated.

Please use #respond.

Replies to this message with the specified content.



165
166
167
# File 'lib/rubycord/data/message.rb', line 165

def reply(content)
  @channel.send_message(content)
end

#reply!(content, tts: false, embed: nil, attachments: nil, allowed_mentions: {}, mention_user: false, components: nil) ⇒ Message

Responds to this message as an inline reply.



178
179
180
181
182
183
184
# File 'lib/rubycord/data/message.rb', line 178

def reply!(content, tts: false, embed: nil, attachments: nil, allowed_mentions: {}, mention_user: false, components: nil)
  allowed_mentions = {parse: []} if allowed_mentions == false
  allowed_mentions = allowed_mentions.to_hash.transform_keys(&:to_sym)
  allowed_mentions[:replied_user] = mention_user

  respond(content, tts, embed, attachments, allowed_mentions, self, components)
end

#reply?true, false

Whether or not this message was sent in reply to another message



371
372
373
# File 'lib/rubycord/data/message.rb', line 371

def reply?
  !@referenced_message.nil?
end

#respond(content, tts = false, embed = nil, attachments = nil, allowed_mentions = nil, message_reference = nil, components = nil) ⇒ Message

Sends a message to this channel.



187
188
189
# File 'lib/rubycord/data/message.rb', line 187

def respond(content, tts = false, embed = nil, attachments = nil, allowed_mentions = nil, message_reference = nil, components = nil)
  @channel.send_message(content, tts, embed, attachments, allowed_mentions, message_reference, components)
end

#to_messageRubycord::Message Also known as: message

to_message -> self or message



406
407
408
# File 'lib/rubycord/data/message.rb', line 406

def to_message
  self
end

#unpin(reason = nil) ⇒ Object

Unpins this message



219
220
221
222
223
# File 'lib/rubycord/data/message.rb', line 219

def unpin(reason = nil)
  API::Channel.unpin_message(@bot.token, @channel.id, @id, reason)
  @pinned = false
  nil
end

#webhook?true, false



257
258
259
# File 'lib/rubycord/data/message.rb', line 257

def webhook?
  !@webhook_id.nil?
end