🔖

GoでDiscord Botを作る(入門編)

2024/06/27に公開

はじめに

以前,この記事で紹介しているような Bot を Go で作成したのですが,Go で Discord Bot を作る方法についての情報が少なかったため,今持っている知識の整理も兼ねて少し記事として残しておこうと思います.
今後,Discord Bot を Go で作ろうと思っている人の参考に少しでもなればいいなと思います.

また,今回の記事では,Discord Bot を Go で作る部分のみ解説するため,Discord Bot をサーバーに参加させる方法やトークンの取得方法などは省略します.適宜,参考リンクを乗せていこうと思うので困ったらドキュメントを参照してもらえると幸いです.

Go で Discord Bot を作る

Go で,Discord Bot を作る方法はいくつかありますが今回はdiscordgoを使って Discord Bot を作る方法の解説です.
執筆時点でのdiscordgoのバージョンは,v0.28.1です.

discordgoを使った Bot 開発の流れ

discordgoを使って Bot を開発する場合,以下のような流れになります.

  1. discordgoのセッションを作成する.
  2. discordgoに登録するハンドラを実装する
  3. discordgoのセッションにハンドラを登録する

追って説明していきたいと思います.

1. 前準備

前準備として,Go の開発環境を用意しgo mod initgo.modを作成しておいてください.
その後,必要なライブラリをダウンロードします.

go get github.com/bwmarrin/discordgo

2. discordgo のセッションを作成する.

discordgo で Bot を動かすのに必要なセッションを作成します.なお,これ以降のサンプルコードでは説明の簡略化のためにエラーが返されたとき,必要でない場合はpanicで終了させています.実際には適切に処理するようにしてください.

package main

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

func main(){
  session, err := discordgo.New("Bot " + os.Getenv("DISCORD_TOKEN"))
  if err != nil {
    panic(err)
  }
}

discordgo.Newを呼び出すことでセッションを作成することができます.まだこの時点では,Discord のサーバーと通信していません.この関数を呼び出すときには,引数にトークンを指定する必要があります.
基本的にはBotのあとに,半角スペースを1文字入れ,Developer Potal で発行したトークンを指定すればよいです.

3. 各イベントに対して,対応したシグネイチャーの関数を定義する

discordgoの難しいポイントなのですが,イベントハンドラーは引数の型によってどのイベントに対応するのかというのが変わってきます.
詳しくは,後日,別の記事にまとめようと思うので気になる人はその日まで待っていてください.
例えば,メッセージが作成されたときになにか処理をしたい場合は以下のようになります.

func Handler(s *discordgo.Session, m *discordgo.MessageCreate) { /* do something */ }

第一引数には,discordgo の Session 構造体が渡され,第 2 引数には各イベントに対応した構造体が指定されます.
Session 構造体は,Discord API の機能を呼び出すのに使用されチャンネルに返信する場合などは Session 構造体に定義されている関数を使用する必要があります.

4. イベントハンドラーをセッションに登録する.

#3で定義した関数を#2で作成したセッションに登録することで特定のイベント発生時に処理を行わせることができます.
登録するには,session のAddHandler()関数を呼び出せば良いです.
そのため,上記の例だと以下のようになります.

package main

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

func main(){
  session, err := discordgo.New("Bot " + os.Getenv("DISCORD_TOKEN"))
  if err != nil {
    panic(err)
  }
  session.AddHandler(Handler)
}

func Handler(s *discordgo.Session, m *discordgo.MessageCreate) { /* do something */ }

5. 起動する

最後に,session.Open()を呼び出すことで Bot が別 goroutine で実行されます.また,この関数は Bot が起動すると処理が終了し main 関数が続けて実行されます.
そのため,外部からシグナルが送られるまで処理を続けたい場合などはチャンネルやコンテキストを使ってメイン goroutine をブロックする必要があります.

まとめ

今回の内容はこれだけですが,今後discordgoのより詳しい使い方などをまとめた記事も書いていこうと思っているのでもしよければそちらの方も読んでもらえると嬉しいです.

GitHubで編集を提案

Discussion