2023-5-27

gatherのbotの解説

過去に gather_bot の作り方について解説した文章が出てきたので、公開しておきます。これを書いたのは 2021 年で、現在も情報が正しいかは検証していません。すみません。気が向いたら更新します…

こちらのコードを書いた時の解説になります。 https://github.com/nac-39/slack-bot_gather_member

bot を作った背景

所属しているサークルで gather を導入しており、外からだと何人そのスペースにいるかはわかるけど、誰がいるのかはわからないため gather に入りづらいという問題が起こっていました(人数多いし盛り上がってるのかな?と思って入ったら先輩しかいなくて気まずい等)。そこで色々考えたのですが、最終的に slack の bot を作るということに落ち着きました。

slack-bot_gather_member のコードの解説

制作に使用したのが、npm で配布されている gather のライブラリで、gather-game-client です。 URL: https://www.npmjs.com/package/@gathertown/gather-game-client

npm なので nodejs で使うことができます。nodejs はサーバーサイドで動く javascript です。 gather の api-key を gather にロクインした状態で  https://gather.town/apiKeys  ここから取得し、環境変数に入れるか、.env ファイルに記述して nodejs の dotenv ライブラリを使って読み込みます。あとは諸々を初期化します。

javascript
import { Game } from "@gathertown/gather-game-client"
import dotenv from "dotenv"
import webSocket from "isomorphic-ws"
dotenv.config() //.envファイルを読み込めるようにする
global.WebSocket = webSocket //websocketの何かの初期化
javascript
const onConnected = (connected) => {
  console.log("Connected: ", connected)
  game.enter(process.env.SPACE_ID)
  console.log(Object.keys(game.players))
  console.log(game.getStats())
}
// gatherのgameクラス初期化
const game = new Game(process.env.SPACE_ID, () =>
  Promise.resolve({ apiKey: process.env.API_KEY })
)
game.connect()
game.subscribeToConnection(onConnected)

これで自分のアカウントがログインしているスペースの情報をゲットする準備が出来ました。 あとは、game クラスに含まれている諸々の関数を使って色々な情報をゲットすることができます。 例えば、プレイヤーがスペースに入ったことを検知するにはgame.subscribeToEventという関数が使えます。

javascript
game.subscribeToEvent("playerJoins", (player) => {
    console.log("playerJoined");
    setTimeout(async () => {
        Object.keys(game.players).forEach((e) => {
        console.log(game.getPlayer(e));
    }, 5000); // プレイヤーが入室してからgame.playersに反映されるのに少し時間がかる
});

この subscribeToEvent の第一引数に何が入るかはここに書いてあります。

私がやったことあるのはここまでなので、マップの操作とかはわからないです。

もろもろ

  • Gather の API は後方互換性とかはあまり考えずに開発していくそうなので、もしかしたらコードが古くなると使えなくなるかもしれません。(websocket api のドキュメントに書いてありましたし、実際 v35->v36 に上がった時に動かなくなりました。npm のバージョンを上げたら動きましたがいつ動かなくなるかわかりません。)
  • github に Dockerfile も上げてあるので、その環境でなら動作するはずです。
  • slack に投稿する方は slack bolt というライブラリを使いました。http 叩くコードを書かなくて良いのでとても楽です。

gather の API 系お役立ちリンク集