DCSS webtileチャットボットbeemの紹介

この記事はRoguelike Advent Calendar 2019の1日目の記事です。

DCSS webtileチャットボットbeem

現在私が運営しているDungeon Crawl Stone Soupサーバーに先日からチャットボット機能が付いたので紹介いたします。
付いたと言っても、私自身がボットを運用しているわけではないのですが……(本家開発チームのgammafunk氏が運用しています)


特定の手順を踏むことによって通常のチャットにbeemというユーザーが常駐するようになり、コマンドを送ることによってプレイに役立つ情報を得たり、特に役立たないメッセージを得たりします。

常駐のさせ方

まず、beemが既に常駐しているユーザーのプレイを観戦し、チャット欄に

!subscribe

と入力することで自分のプレイ時に常駐させることができます。
beemが常駐している状態で、

!unsubscribe

と入力すると、常駐設定を取り消すことができます。

……はて、常駐しているプレイヤーがいないと常駐させることができないのならば、最初に常駐させた人はどうやって常駐させたのでしょうか?
という疑問が湧いてくるところですが、beemがチャットに入ってくる条件はもう一つあります。
beemは(通常設定では)4人以上観戦者が入っているゲームを「賑わっている」と判断して自動的に観戦開始します。そのチャンネルに入って!subscribeを入力し、改めて自分のプレイを開始しましょう。

botのコマンドいろいろ

IRCやDiscordの公式チャンネルにいるbotとほぼ共通のコマンドが使用できるようです。

!help

beemの簡単な自己紹介を表示し、説明書へのリンクを張ります。

??[文字列]

LearnDBに登録された項目を表示します。例えば、

??sigmund
beem: sigmund[1/4]: A yellow @ with a shiny scythe, a magic wand, and a necklace of player skulls. A notoriously lethal early-game unique human wizard. Spells: throw flame, confuse, invisibility, magic dart.

複数個文章が投稿されているワードについてはデフォルトでは一番最初のものを表示します。
項目番号を指定したい場合は以下のようにします。

??sigmund[4]
beem: sigmund[4/4]: Proof that Crawl hates you and wants you to die.
@??[モンスター英名]

モンスターの情報を出します。例:

@??the royal jelly
beem: Royal Jelly (J) | Spd: 14 | HD: 21 | HP: 196-273 | AC/EV: 8/4 | Dam: 50(acid:7d3), 30(acid:7d3) | eats doors, see invisible, unbreathing | Res: magic(180), poison, acid+++, blind, drown | Vul: silver | XP: 14306 | Sz: Large | Int: brainless.

接頭辞を%??にすると、Cheibriadosボットで処理を行うようになります。文字列が変わらないこともあります。
Cheibriadosボットでは、バージョンを指定して情報を出すこともできます。

%0.15?cigotuvi's monster
beem: royal jelly (J) | Spd: 14 | HD: 21 | HP: 230 | AC/EV: 8/4 | Dam: 50(acid:7d3), 30(acid:7d3) | eats items, sense invisible | Res: magic(196), poison, acid+++, asphyx, drown | Vul: silver | XP: 14176 | Sz: Medium | Int: plant.
!lg

一つ前のゲーム(Last Game)の情報を出します。

!lm

最後に表示されたmilestone表示を出します。

!won [プレイヤー名]

[プレイヤー名]の脱出した回数や組み合わせを出力します。
プレイヤー名を省略した場合は、今プレイ中のプレイヤーの情報を出します。

!gamesby [プレイヤー名]

[プレイヤー名]のゲームプレイ情報を出します。(最高スコア、累計スコアなど)
プレイヤー名を省略した場合は、今プレイ中のプレイヤーの情報を出します。

!apt [種族名]

[種族名]のスキル適性を出力します。

%git [コミットidやブランチ名]

DCSSのgitリポジトリにおけるコミットの情報を出します。例:

%git 0a147b9
beem: gammafunk * 0.17-a0-488-g0a147b9: A new wizlab: Lehudib's Moon Base (5 years ago, 8 files, 203+ 1-) https://github.com/crawl/crawl.git/commit/0a147b9ce386

%git stone_soup-0.24
beem: Aidan Holm * 0.24.0-37-gcf1ca85: Fix various small alignment issues (10 days ago, 2 files, 8+ 2-) https://github.com/crawl/crawl.git/commit/cf1ca852f132
!firestorm [文字列]

[プレイヤー名] points at [文字列] and mumbles some strange words. A raging storm of fire appears! The great blast of fire engulfs [文字列]!というメッセージを返します。単なるジョークコマンドです。

ゲームプレイヤーだけに反応するようにする

万一観客がbotのコマンドで荒らし行為を行ってきたときなどは、以下のコマンドでプレイヤーのみに反応するようにできます。

!player-only on

解除するときは

!player-only off

とします。