Serenityを使ってDiscordをRustから遊ぶ

はじまり

ちょっと作りたいものがあったのでDiscordのAPIを調べてました。

ぶっちゃけた話、Pythonでdiscord.pyを使った方が楽なんだと思うんですけど、Pythonをみたら発狂して転げ回る病気にかかったということにしているので今回はRustで。


RustでDiscordAPIを叩くライブラリを探してみるとSorenityというライブラリが見つかりました。

github.com

日本語で説明しているページが見当たらなかったので、しばらくあちこちにらめっこしながら、とりあえずサンプルが動いたのでそこまで書いておきます。

下準備

まずはDiscord向けのbotを作る準備をしないといけません。Discord向けのアプリを作るためにまずデベロッパーポータルへ行きましょう。

discordapp.com

Discordにログインした状態でアクセスすると、下のようなページが出ると思います。

f:id:sorenuts:20190604213214p:plain
アプリケーションを作る

右上の"New Application"をクリックし、作成するアプリケーションの名前を入力して作成します。

日本語でも大丈夫みたいですね。

作成すると下のようなページが出るはずです。

f:id:sorenuts:20190604214002p:plain
アプリケーションを作った

そうしたら上図の赤丸のBOTをクリックします。

f:id:sorenuts:20190604214209p:plain
BOTページ

右のADDBOTをクリックすると、

"ADD A BOT TO THIS APP? "
"Adding a bot user gives your app visible life in Discord. However, this action is irrevocable! Choose wisely."

と、「bot追加したらもう戻れねえぜ!賢い選択を。」的なことを聞かれるので"Yes, do it !"を力強くクリックしましょう。


余談ですが、"Choose wisely"は『インディー・ジョーンズ/最後の聖戦』を元ネタとするミームみたいですね

それはさておき、クリックすると、

f:id:sorenuts:20190604215502p:plain
BOTが生まれた

上図のようなページに移動します。

"A wild bot has appeared!"
「あ!やせいの BOTが とびだしてきた!」ですかね。
Discordは本当にゲーム関連の洒落が多くて素敵ですね。

それもさておき、上図の赤丸部分がプログラムで使用することになるトークンです。後で使います。覚えておいてください。

訪れるたびに毎回少しずつ変化しますが、いつ作ったものを使っても問題ないです。


次に、左カラムのOAuth2をクリックします。

移動先のページをスクロールすると、下図のようなチェックボックスが大量に出てくるかと思います。

f:id:sorenuts:20190604220335p:plain
OAuth2のURLジェネレータ

ここではbotにチェックを入れます。するとさらに下に下図のようなチェックボックス群が出てきます。

f:id:sorenuts:20190604220521p:plain
BOTの権限設定

このチェックボックスbotに与える権限を設定できます。これはbotを招待する際に権限オフにもできます。

とりあえず試すために管理者にチェックを入れます。

その後2つ上の図の赤丸でリンクをコピーし、それにアクセスすると下図のような画面が出ます。

f:id:sorenuts:20190604220823p:plain
BOTをサーバーに追加する

そこから追加するサーバーを選んで認証を押してやると

f:id:sorenuts:20190604221006p:plain
BOTがスポーンした

BOTがサーバーに参加します。
が、当然このままでは何もできません。
プログラムで動かしてやる必要があります。

SerenityでDiscord BOTを動かす

とりあえずSerenityをcloneしてきましょう。

git clone https://github.com/serenity-rs/serenity.git

そうしたらexampleディレクトリ内の01_basic_ping_botに移動しましょう。

cd serenity/examples/01_basic_ping_bot/

それでもってcargo run・・・といきたいところですが、このままだと「トークンの環境変数がないぞ」と怒られて動きません。
トークンをプログラム内か環境変数に書いてやる必要があります。

コードをいじらないで動かす場合は、

export DISCORD_TOKEN=<ここにトークン>

とでもしておけばいいと思います。

コードをいじって動かす場合は45,46行目の

    let token = env::var("DISCORD_TOKEN")
        .expect("Expected a token in the environment");

    let token = "ここにトークン"

としておきましょう。

そうしたらcargo runします。


無事起動し、サーバーに接続できると、コンソールに

<BOTの名前> is connected!

が出ますので、そうしたらDiscord上で"!ping"と書き込んでやると・・・

f:id:sorenuts:20190604222931p:plain
こいつ・・・動くぞ・・・!
動きましたね。

まとめ

というわけで、SerenityでRustからDiscord BOTを動かしてみました。
学校から動かしたらプロキシに引っかかって動かなかったり、cargo run自体が通らなかったり、そもそもサンプルコードを真剣に読んでなかったりと手こずりましたが、無事動いたのでよしとします。

今後はこれを使って、前からやりたかったことをやってみようと思います。

最後まで読んでいただき、ありがとうございました。


PS:どこかインターンに行きたい・・・