SlackbotカスタムレスポンスでNKODICEする

TL;DR

Slackの標準機能のSlackbotカスタムレスポンスで、話題のゲームNKODICEができるようにしてみた。

f:id:haranicle:20210620074830p:plain
顧客が求めていたもの

設定方法だけ知りたい人はここだけ読めばOK

Slackbotカスタムレスポンスへの設定方法

NKODICEとは

ksymさんが開発した「チンチロ」をベースとしたゲーム。

store.steampowered.com

(今回この記事の公開についてksymさんにご快諾いただきました。ありがとうございます🙏)

Slackbotカスタムレスポンスとは

slack.com

Slackにデフォルトに入っている機能*1で、Slackで任意のキーワードが発言された時にSlackbotに事前に設定した返答をさせることができる。

返答の内容は、改行で区切ることよって複数の候補の中からランダムに選択させることができる。

f:id:haranicle:20210620070350p:plain
Add Slackbotカスタムレスポンス

f:id:haranicle:20210620070430p:plain
Slackbotカスタムレスポンスの例

返答の最大文字数

ドキュメントなどには書かれていないが、調査したところ返答に設定できる文字数は

最大で4000 (改行も1文字としてカウント)だった。

返答をPythonで作る

すべての返答を手作業で作ると大変なので、Pythonで作る。 サイコロが3つのときは、こんな感じのコードでできそうだ。

dice = ['お', 'ち', 'ま', 'う', 'ん', 'こ']
for i in dice:
    for j in dice:
        for k in dice:
            print(f'{i}{j}{k}')

NKODICEに必要な返答の文字数

サイコロがn個の時、返答をすべて書き出すのに必要な文字数(改行込み)は以下の数式によって求められる。

6n*(n+1)-1

この解をまとめるとこう

サイコロの個数 返答をすべて書き出すのに必要な文字数
1 11
2 107
3 863
4 6479
5 46655
6 326591
7 2239487

返答に登録できる最大文字数は4000なので、サイコロは3つが限界だった。

サイコロが3つだと、最強の役であるOCHINCHINが成立しない。悲しい。どうにかしてOCHINCHINしたい。

文字数を節約してサイコロの個数を増やす方法を考える

同じ出目は削除する

赤青緑の3つのサイコロを投げた時、うんことうんこ が出ることがあるが、NKODICEは順不同なのでどちらも同じ出目として扱う。

出目の表現に必要な文字数を節約するために、同じ組み合わせの出目を削除した。

同じ組み合わせの出目の削除は目のソート結果をsetに代入するで実装した。

dice = ['お', 'ち', 'ま', 'う', 'ん', 'こ']
all_rolls = set()
for i in range(6):
    for j in range(6):
        for k in range(6):
            sorted_roll = sorted([i]+[j]+[k])
            a = ''
            for r in sorted_roll:
                a += str(dice[r])
            all_rolls.add(a)
for r in all_rolls:
    print(r)

ただし、この手を使うと役が出る確率が代わってしまう。

例えば、赤と青のコインを投げたときの結果を書き出すと以下のようになる。

  • 表表
  • 表裏
  • 裏表
  • 裏裏

本来は 表裏 の組み合わせが出る確率は50%だが、同じ組み合わせの出目を削除する処理をすると、 表裏 の組み合わせが出る確率は33.3%になってしまう。

今回はどうしてもOCHINCHINしたかったので、この問題を許容することにした。

役はCustom Emojiで表現

役ができた時に派手な表現をしたかったのでCustom Emojiを使った。 Custom Emojiの作成にはMEGAMOJIを使わせていただいた。

zk-phi.github.io

f:id:haranicle:20210620080853g:plainf:id:haranicle:20210620080858p:plainf:id:haranicle:20210620080901p:plainf:id:haranicle:20210620080904p:plainf:id:haranicle:20210620080908p:plainf:id:haranicle:20210620080911p:plainf:id:haranicle:20210620080914p:plain

返答も含めて出力するコードはここ。サイコロ5個が限界だった。

github.com

サイコロ5個あればOCHINCHINを出すことができる。良かった。

Slackbotカスタムレスポンスへの設定方法

Slackbotカスタムレスポンス

slack.com

  • When someone says に んこ,nko を入力
  • Slackbot respondsに以下を入力

Slackbot respondsに書く内容

Custom Emojiの登録

ワークスペースにカスタム絵文字を追加する | Slack

登録するファイルは以下の好きな方からダウンロード。(zipでダウンロードがおすすめ)

*1:プラグインなどの導入が不要なのでどんな環境でも利用しやすいのが良いところ