Module: Discorb::Messageable

Included in:
DMChannel, TextChannel, ThreadChannel, User, VoiceChannel
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.



155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/discorb/modules.rb', line 155

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.



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/discorb/modules.rb', line 98

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] = if allowed_mentions == Discorb::Unset
      @client.allowed_mentions.to_hash
    else
      allowed_mentions.to_hash(@client.allowed_mentions)
    end
    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:



183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/discorb/modules.rb', line 183

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:



211
212
213
214
215
216
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 211

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 do |m|
      Message.new(@client, m.merge({ guild_id: @guild_id.to_s }))
    end
  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.



243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
# File 'lib/discorb/modules.rb', line 243

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.



269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
# File 'lib/discorb/modules.rb', line 269

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# 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] = (
      if allowed_mentions
        allowed_mentions.to_hash(@client.allowed_mentions)
      else
        @client.allowed_mentions.to_hash
      end
    )
    payload[
      :message_reference
    ] = reference.to_reference.to_hash 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


324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
# File 'lib/discorb/modules.rb', line 324

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
      ret = yield
    ensure
      post_task.stop
    end
    ret
  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.



295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
# File 'lib/discorb/modules.rb', line 295

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