🔖

【Go】Discordのbotでメッセージ一覧を取得する

2023/01/02に公開

discordgoを使用して、Discordに送信されたメッセージを取得する方法を備忘録としてメモします。

使用する関数

func (s *Session) ChannelMessages(channelID string, limit int, beforeID, afterID, aroundID string) (st []*Message, err error)

docはこちらです。

レスポンスの配列(スライス)は、新→古の順番で遡って入っています。
条件を指定しない限り、配列の0番目は、最新の投稿です。

引数の指定方法

  • channelID メッセージを取得したいチャンネルIDです
  • limit 取得する件数を指定できます。1回に取得できる上限は100です
  • beforeID メッセージIDが入ります。指定した場合、指定したメッセージを含まず、それよりも前のメッセージを取得します。
  • afterID メッセージIDが入ります。指定した場合、指定したメッセージを含まず、それよりも後のメッセージを取得します。
  • aroundIDメッセージIDが入ります。指定した場合、指定したメッセージの周辺を取得します(未検証のため、docの翻訳のみ)

チャンネル内の全てのメッセージを取得するサンプル

package message_create

import (
	"fmt"
	"github.com/bwmarrin/discordgo"
	"log"
)

const (
	Command   = "!cmd"
	ChannelID = "<チャンネルID>"
)

func OutputMessages(s *discordgo.Session, m *discordgo.MessageCreate) {
	if m.Content != Command {
		return
	}

	const limit = 100 // 上限の数を指定

	var (
		beforeID string
		messages []*discordgo.Message
	)

	for {
		c, err := s.ChannelMessages(
			ChannelID, // channelID
			limit,     // limit
			beforeID,  // beforeID
			"",        // afterID
			"",        // aroundID
		)
		if err != nil {
			log.Fatal(err)
		}

		messages = append(messages, c...)

		// limitで指定した件数と一致しない(それ以下)は終了
		if len(c) != limit {
			break
		}

		// 上限まで取得した場合は未取得のものがある可能性が残っているため、
		// 取得した最後のメッセージIDをbeforeIDを設定
		beforeID = c[len(c)-1].ID
	}

	// メッセージの一覧を出力
	for _, msg := range messages {
		fmt.Println(msg.Author)
	}
}

Discussion