過去に 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 ライブラリを使って読み込みます。あとは諸々を初期化します。
import { Game } from "@gathertown/gather-game-client"
import dotenv from "dotenv"
import webSocket from "isomorphic-ws"
dotenv.config() //.envファイルを読み込めるようにする
global.WebSocket = webSocket //websocketの何かの初期化
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
という関数が使えます。
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 系お役立ちリンク集
- 自分と同じように困っている人が大概いる forum:
- https://forum.gather.town/
- ほとんどここのコードを参考にしました。
- gather の http の api
- gather の websocket の api:
- gather にいる人が slack からわかるプロダクト。DM とかもできるらしい: