🛒

Discordのイベントと対応するdiscordgoの構造体

2024/06/27に公開

はじめに

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{}型から各ハンドラー型にダウンキャストしています.

最後に

なにか,間違っている点があればコメント等で教えていただけると幸いです.

付録

対応表

実装されていないものに関しては空白

イベント名 構造体名
Hello
Ready Ready
Resumed Resumed
Reconnect
Invalid Session
Application Command Permissions Update ApplicationCommandPermissionsUpdate
Auto Moderation Rule Create AutoModerationRuleCreate
Auto Moderation Rule Update AutoModerationRuleUpdate
Auto Moderation Rule Delete AutoModerationRuleDelete
Auto Moderation Action Execution AutoModerationActionExecution
Channel Create ChannelCreate
Channel Update ChannelUpdate
Channel Delete ChannelDelete
Channel Pins Update ChannelPinsUpdate
Thread Create ThreadCreate
Thread Update ThreadUpdate
Thread Delete ThreadDelete
Thread List Sync ThreadListSync
Thread Member Update ThreadMemberUpdate
Thread Members Update ThreadMembersUpdate
Entitlement Create
Entitlement Update
Entitlement Delete
Guild Create GuildCreate
Guild Update GuildUpdate
Guild Delete GuildDelete
Guild Audit Log Entry Create GuildAuditLogEntryCreate
Guild Ban Add GuildBanAdd
Guild Ban Remove GuildBanRemove
Guild Emojis Update GuildEmojisUpdate
Guild Stickers Update
Guild Integrations Update GuildIntegrationsUpdate
Guild Member Add GuildMemberAdd
Guild Member Remove GuildMemberRemove
Guild Member Update GuildMemberUpdate
Guild Members Chunk GuildMembersChunk
Guild Role Create GuildRoleCreate
Guild Role Update GuildRoleUpdate
Guild Role Delete GuildRoleDelete
Guild Scheduled Event Create GuildScheduledEventCreate
Guild Scheduled Event Update GuildScheduledEventUpdate
Guild Scheduled Event Delete GuildScheduledEventDelete
Guild Scheduled Event User Add GuildScheduledEventUserAdd
Guild Scheduled Event User Remove GuildScheduledEventUserRemove
Integration Create
Integration Update
Integration Delete
Interaction Create InteractionCreate
Invite Create InviteCreate
Invite Delete InviteDelete
Message Create MessageCreate
Message Update MessageUpdate
Message Delete MessageDelete
Message Delete Bulk MessageDeleteBulk
Message Reaction Add MessageReactionAdd
Message Reaction Remove MessageReactionAdd
Message Reaction Remove All MessageReactionRemoveAll
Message Reaction Remove Emoji
Presence Update PresenceUpdate
Stage Instance Create StageInstanceEventCreate
Stage Instance Update StageInstanceEventUpdate
Stage Instance Delete StageInstanceEventDelete
Typing Start TypingStart
User Update UserUpdate
Voice State Update VoiceServerUpdate
Voice Server Update VoiceStateUpdate
Webhooks Update VoiceStateUpdate
Message Poll Vote Add
Message Poll Vote Remove
GitHubで編集を提案

Discussion