ローコストでつくる discord bot

スプラトゥーン3まわりでやってる人が多くて、いろんなクラスタの人たちと遊べて楽しい

ゲームのウデマエの方はてんでなんだけど集まってワイワイゲームするのがシンプルに楽しいので、エンジョイな人たちとスムーズ楽しめるようになんらかのサポートツールを作ってみようかなと

...というのは建前で、discord の新しい API を触ってみたかったのでいろいろ試してみたの巻

ソースは https://github.com/e-jigsaw/dika3

discord のこれまでの bot は listen するサーバがどっかに常時建ってないといけないので面倒だったが、ある程度妥協すれば bot っぽいものを作れるようになっていた

https://discord.com/developers/docs/interactions/application-commands

じゃあ deno deploy で簡単に bot っぽいものが作れるジャンということで deno で実装する

アプリケーションを作成して、OAuth2 URL Generator から applications.commands にだけチェックをいれた URL を作成して admin の権限をもってるサーバに放り込む

アプリケーションの intersection の endpoint の登録をすると ping が飛んでくるので pong してやらないと登録されなかった

https://github.com/e-jigsaw/dika3/blob/4967e60650214c19bb94aabaff1409e1eb0a70a6/src/index.ts こんな感じのコードを deno deploy にあげておいたら通った

deno deploy の env に discord の public key を登録しておく

コマンドの登録は https://github.com/e-jigsaw/dika3/blob/f07abc07f02440046159380f7d6b3454499402b8/src/register.ts こういう感じで、bot の token と guild(サーバ) の ID を指定して登録する

グローバルに登録ということもできるらしいが、時間がかかったりすることもあるらしい

すると、メッセージのところで右クリックした際に アプリ ってセクションのところに任意のコマンドを生やすことができる

今回は各種バトルの今と次のマップを返すコマンドをつくる

えむおんセンパイが突貫で API https://spla3.yuu26.com/ を作ってくれているのでこいつを使わせてもらう

まずはコマンドが実行されたらレスポンスを返す部分で

https://github.com/e-jigsaw/dika3/blob/4967e60650214c19bb94aabaff1409e1eb0a70a6/src/index.ts#L40-L48

ApplicationCommand = 2 でリクエストが飛んでくるので適切な json を返してやるとそれがメッセージとして表示される仕組み

https://discord.com/developers/docs/interactions/receiving-and-responding

なるほどね

レスポンスに components ってのをつけてやるとボタンやセレクトメニュー、テキスト入力なんかを返せる

ので、最初は select を2つ返してそれぞれほしい組み合わせを選ぶ式にしてみたが、interaction として返ってくるのは選択されたソレだけなので選択されてない方が何選択されているのかがわからない

どうにかできないものかと調べてみたのだが、調べた限りでは intersection を cache として保存しておいて時限で突合するみたいな仕組みだったのでなんだかなと

しょうがないので Midjourny みたいにボタンのテーブルを作る方式にした

まあボタン6コなら許容だろう...

各ボタンに custom_id を指定しておいて、それを基に spla3 API を叩いて情報を返す

レスポンスには embeds というフィールドがあって、ここに画像やらなんやら仕込める

https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-response-object-interaction-callback-data-structure

イイ感じ

ちなみに地図情報は手作業で登録していってここが一番だるかった10マップx5ルールである...

でも毎回右クリックして実行するのもだるいなということに気付いたので

レスポンスには components も同居できるのでアンサーにもボタンを仕込んでやれば(これも midjourney 方式)楽チンになった

似てるかもしれんページ