🔖
【Go】Discordのbotでメッセージ一覧を取得する
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