Module: Discorb::Messageable

Included in:
DMChannel, NewsChannel, TextChannel, ThreadChannel, User
Defined in:
lib/discorb/modules.rb

Overview

Module for sending and reading messages.

Instance Method Summary collapse

Instance Method Details

#delete_message!(message_id, reason: nil) -> Async::Task<void> Also known as: destroy_message!

Delete a message.

Parameters:

  • message_id (#to_s)

    The message id.

  • reason (String) (defaults to: nil)

    The reason for deleting the message.

Returns:

  • (Async::Task<void>)

    The task.



114
115
116
117
118
# File 'lib/discorb/modules.rb', line 114

def delete_message!(message_id, reason: nil)
  Async do
    @client.http.request(Route.new("/channels/#{channel_id.wait}/messages/#{message_id}", "//channels/:channel_id/messages/:message_id", :delete), audit_log_reason: reason).wait
  end
end

#edit_message(message_id, content = Discorb::Unset, embed: Discorb::Unset, embeds: Discorb::Unset, allowed_mentions: Discorb::Unset, attachments: Discorb::Unset, components: Discorb::Unset, supress: Discorb::Unset) -> Async::Task<void>

Note:

The arguments of this method are defaultly set to Discorb::Unset. Specify value to set the value, if not don't specify or specify Discorb::Unset.

Edit a message.

Parameters:

  • message_id (#to_s)

    The message id.

  • content (String) (defaults to: Discorb::Unset)

    The message content.

  • embed (Discorb::Embed) (defaults to: Discorb::Unset)

    The embed to send.

  • embeds (Array<Discorb::Embed>) (defaults to: Discorb::Unset)

    The embeds to send.

  • allowed_mentions (Discorb::AllowedMentions) (defaults to: Discorb::Unset)

    The allowed mentions.

  • attachments (Array<Discorb::Attachment>) (defaults to: Discorb::Unset)

    The new attachments.

  • components (Array<Discorb::Component>, Array<Array<Discorb::Component>>) (defaults to: Discorb::Unset)

    The components to send.

  • supress (Boolean) (defaults to: Discorb::Unset)

    Whether to supress embeds.

Returns:

  • (Async::Task<void>)

    The task.



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
101
102
103
# File 'lib/discorb/modules.rb', line 73

def edit_message(message_id, content = Discorb::Unset, embed: Discorb::Unset, embeds: Discorb::Unset, allowed_mentions: Discorb::Unset,
                                                       attachments: Discorb::Unset, components: Discorb::Unset, supress: Discorb::Unset)
  Async do
    payload = {}
    payload[:content] = content if content != Discorb::Unset
    tmp_embed = if embed != Discorb::Unset
        [embed]
      elsif embeds != Discorb::Unset
        embeds
      end
    payload[:embeds] = tmp_embed.map(&:to_hash) if tmp_embed
    payload[:allowed_mentions] =
      allowed_mentions == Discorb::Unset ? @client.allowed_mentions.to_hash : allowed_mentions.to_hash(@client.allowed_mentions)
    payload[:components] = Component.to_payload(components) if components != Discorb::Unset
    payload[:flags] = (supress ? 1 << 2 : 0) if supress != Discorb::Unset
    if attachments != Discorb::Unset
      payload[:attachments] = attachments.map.with_index do |a, i|
        {
          id: i,
          filename: a.filename,
          description: a.description,
        }
      end
    end
    @client.http.multipart_request(
      Route.new("/channels/#{channel_id.wait}/messages/#{message_id}", "//channels/:channel_id/messages/:message_id", :patch),
      payload,
      attachments == Discorb::Unset ? [] : attachments
    ).wait
  end
end

#fetch_message(id) -> Async::Task<Discorb::Message>

Fetch a message from ID.

Parameters:

Returns:

Raises:



131
132
133
134
135
136
# File 'lib/discorb/modules.rb', line 131

def fetch_message(id)
  Async do
    _resp, data = @client.http.request(Route.new("/channels/#{channel_id.wait}/messages/#{id}", "//channels/:channel_id/messages/:message_id", :get)).wait
    Message.new(@client, data.merge({ guild_id: @guild_id.to_s }))
  end
end

#fetch_messages(limit = 50, before: nil, after: nil, around: nil) -> Async::Task<Array<Discorb::Message>>

Fetch a message history.

Parameters:

  • limit (Integer) (defaults to: 50)

    The number of messages to fetch.

  • before (Discorb::Snowflake) (defaults to: nil)

    The ID of the message to fetch before.

  • after (Discorb::Snowflake) (defaults to: nil)

    The ID of the message to fetch after.

  • around (Discorb::Snowflake) (defaults to: nil)

    The ID of the message to fetch around.

Returns:



149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/discorb/modules.rb', line 149

def fetch_messages(limit = 50, before: nil, after: nil, around: nil)
  Async do
    params = {
      limit: limit,
      before: Discorb::Utils.try(after, :id),
      after: Discorb::Utils.try(around, :id),
      around: Discorb::Utils.try(before, :id),
    }.filter { |_k, v| !v.nil? }.to_h
    _resp, messages = @client.http.request(Route.new("/channels/#{channel_id.wait}/messages?#{URI.encode_www_form(params)}", "//channels/:channel_id/messages", :get)).wait
    messages.map { |m| Message.new(@client, m.merge({ guild_id: @guild_id.to_s })) }
  end
end

#fetch_pins -> Async::Task<Array<Discorb::Message>>

Fetch the pinned messages in the channel.

Returns:

  • (Async::Task<Array<Discorb::Message>>)

    The pinned messages in the channel.



168
169
170
171
172
173
# File 'lib/discorb/modules.rb', line 168

def fetch_pins
  Async do
    _resp, data = @client.http.request(Route.new("/channels/#{channel_id.wait}/pins", "//channels/:channel_id/pins", :get)).wait
    data.map { |pin| Message.new(@client, pin) }
  end
end

#pin_message(message, reason: nil) -> Async::Task<void>

Pin a message in the channel.

Parameters:

  • message (Discorb::Message)

    The message to pin.

  • reason (String) (defaults to: nil)

    The reason of pinning the message.

Returns:

  • (Async::Task<void>)

    The task.



184
185
186
187
188
# File 'lib/discorb/modules.rb', line 184

def pin_message(message, reason: nil)
  Async do
    @client.http.request(Route.new("/channels/#{channel_id.wait}/pins/#{message.id}", "//channels/:channel_id/pins/:message_id", :put), {}, audit_log_reason: reason).wait
  end
end

#post(content = nil, tts: false, embed: nil, embeds: nil, allowed_mentions: nil, reference: nil, components: nil, attachment: nil, attachments: nil) -> Async::Task<Discorb::Message> Also known as: send_message

Post a message to the channel.

Parameters:

Returns:



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/discorb/modules.rb', line 24

def post(content = nil, tts: false, embed: nil, embeds: nil, allowed_mentions: nil,
                        reference: nil, components: nil, attachment: nil, attachments: nil)
  Async do
    payload = {}
    payload[:content] = content if content
    payload[:tts] = tts
    tmp_embed = if embed
        [embed]
      elsif embeds
        embeds
      end
    payload[:embeds] = tmp_embed.map(&:to_hash) if tmp_embed
    payload[:allowed_mentions] =
      allowed_mentions ? allowed_mentions.to_hash(@client.allowed_mentions) : @client.allowed_mentions.to_hash
    payload[:message_reference] = reference.to_reference if reference
    payload[:components] = Component.to_payload(components) if components
    attachments ||= attachment ? [attachment] : []

    payload[:attachments] = attachments.map.with_index do |a, i|
      {
        id: i,
        filename: a.filename,
        description: a.description,
      }
    end

    _resp, data = @client.http.multipart_request(Route.new("/channels/#{channel_id.wait}/messages", "//channels/:channel_id/messages", :post), payload, attachments).wait
    Message.new(@client, data.merge({ guild_id: @guild_id.to_s }))
  end
end

#typing -> Object

Trigger the typing indicator in the channel. If block is given, trigger typing indicator during executing block.

Examples:

channel.typing do
  channel.post("Waiting for 60 seconds...")
  sleep 60
  channel.post("Done!")
end


217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
# File 'lib/discorb/modules.rb', line 217

def typing
  if block_given?
    begin
      post_task = Async do
        loop do
          @client.http.request(Route.new("/channels/#{@id}/typing", "//channels/:channel_id/typing", :post), {})
          sleep(5)
        end
      end
      yield
    ensure
      post_task.stop
    end
  else
    Async do |_task|
      @client.http.request(Route.new("/channels/#{@id}/typing", "//channels/:channel_id/typing", :post), {})
    end
  end
end

#unpin_message(message, reason: nil) -> Async::Task<void>

Unpin a message in the channel.

Parameters:

  • message (Discorb::Message)

    The message to unpin.

  • reason (String) (defaults to: nil)

    The reason of unpinning the message.

Returns:

  • (Async::Task<void>)

    The task.



199
200
201
202
203
# File 'lib/discorb/modules.rb', line 199

def unpin_message(message, reason: nil)
  Async do
    @client.http.request(Route.new("/channels/#{channel_id.wait}/pins/#{message.id}", "//channels/:channel_id/pins/:message_id", :delete), audit_log_reason: reason).wait
  end
end