🛒
Discordのイベントと対応するdiscordgoの構造体
はじめに
Go で Discord Bot を作る場合discordgo
を使うのですが,欲しいイベントをどのように受け取ればいいのかわからず少し詰まったため備忘録的な感じで残しておこうと思います.
Discord API で受け取れるイベント
詳細はドキュメントに記載されています.
よく,使いそうなものを抜粋すると
イベント名 | 概要 |
---|---|
Message Create | メッセージが作成された |
Message Update | メッセージが編集されました |
Message Delete | メッセージが削除された |
Typing Start | ユーザーがチャンネルに入力を始めた |
Voice State Update | 誰かが音声チャンネルに参加、退出、移動した |
などです.これ以外にも Discord API から受け取ることのできるイベントは数多く有るため必要なイベントがわからない場合は公式ドキュメントを読んでみると良いと思います.
disordgo との対応
discordgo の構造体とイベントの対応表は付録: 対応表にまとめてあります.完全に自力で調査を行ったため間違いなどが有ると思いますがその場合は コメント などで連絡していただけると幸いです.
discordgo 内部の実装
少しだけ,discordgo 内部の実装に関して説明しておきたいと思います.
まず,discordgo でイベントハンドラーを定義するにはdiscordgo.Session
構造体のAddHandler
関数を呼び出すことで登録することができます.
ここで,AddHandler
関数の定義を確認すると,discordgo の event.goに以下のように定義されています.
event.go
func (s *Session) AddHandler(handler interface{}) func() {
eh := handlerForInterface(handler)
if eh == nil {
s.log(LogError, "Invalid handler type, handler will never be called")
return func() {}
}
return s.addEventHandler(eh)
}
interface{}
型を受け取り関数を返しています.この関数は,コメントにも書かれているとおり呼び出すことでイベントハンドラーを削除することができます.
また,この中でhandlerForInterface
関数がinterface{}
型から各ハンドラー型にダウンキャストしています.
最後に
なにか,間違っている点があればコメント等で教えていただけると幸いです.
付録
対応表
実装されていないものに関しては空白
Discussion