TL;DR
Slackの標準機能のSlackbotカスタムレスポンスで、話題のゲームNKODICEができるようにしてみた。
顧客が求めていたもの
設定方法だけ知りたい人はここだけ読めばOK
Slackbotカスタムレスポンスへの設定方法
NKODICEとは
ksym さんが開発した「チンチロ」をベースとしたゲーム。
store.steampowered.com
(今回この記事の公開についてksym さんにご快諾いただきました。ありがとうございます🙏)
Slackbotカスタムレスポンスとは
slack.com
Slackにデフォルトに入っている機能*1 で、Slackで任意のキーワードが発言された時にSlackbotに事前に設定した返答をさせることができる。
返答の内容は、改行で区切ることよって複数の候補の中からランダムに選択させることができる。
Add Slackbotカスタムレスポンス
Slackbotカスタムレスポンスの例
返答の最大文字数
ドキュメントなどには書かれていないが、調査したところ返答に設定できる文字数は
最大で4000 (改行も1文字としてカウント)だった。
すべての返答を手作業で作ると大変なので、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
返答も含めて出力するコードはここ。サイコロ5個が限界だった。
github.com
サイコロ5個あればOCHINCHINを出すことができる。良かった。
Slackbotカスタムレスポンスへの設定方法
Slackbotカスタムレスポンス
slack.com
When someone says に んこ,nko
を入力
Slackbot respondsに以下を入力
Slackbot respondsに書く内容
Custom Emojiの登録
ワークスペースにカスタム絵文字を追加する | Slack
登録するファイルは以下の好きな方からダウンロード。(zipでダウンロードがおすすめ)