随分リモートワークも定着してきたご時世+新入生・新入社員も多い季節なので、リモートでもサクッとできるレクリエーション「ワードウルフ」をサポートするプログラムを作ったのでメモしておきます。
プログラムとしてはなんら難しいことはしてないのですが、Slack・Colaboratoryを連携すると色々応用ができそうなのでTipsをまとめておきます。
ワードウルフ
細かいルールは他サイトを検索してください。こことか。
【全てわかる】『ワードウルフ』少数派探しゲームを徹底紹介
やることとしては、
- 2つのワードを選ぶ
- 参加者を”狼”と”市民”に分ける
- 参加者それぞれにワードを通知する → SlackのDMにする
- 最後に結果を通知する
Colaboratory上での実装
最終的には図のようになります。
- 最初にSlack通知の設定
- 次に参加者とテーマの候補の入力
- 最後に答え合わせ
事前準備部分
#@title BOT設定
!pip install slackweb
import slackweb
import random
slack = slackweb.Slack(url="https://hooks.slack.com/services/xxxxxxx/xxxxxxx/xxxxxxxxx")
username="\u30EF\u30FC\u30C9\u30A6\u30EB\u30D5\u901A\u77E5" #@param {type:"string"}
icon_emoji=":wolf:" #@param {type:"string"}
Webhooks
Slackへの通知を送るためにwebhookのurlを取得しておく必要があります。
詳しい手順は Slack での Incoming Webhook の利用 等をご覧ください。
すでに何かしら自作アプリを設定している場合は slack api | Your Apps からアプリを選択し、Basic Information → Add features and functionality を選ぶとIncoming Webhooksの設定があります。
ColabのTips
colaboratory独自の記述もあります。
まず、 #@title
は説明を加える記載になります。上図のようにプログラムとは別に説明文章が表示されます。
#@markdown
としてマークダウン形式で書いていくこともできます。
また、文の末尾に #@param {type:"string"}
となっている部分は入力フォームを作るものです。
テキストボックス以外にも様々な入力フォームが用意されているので、興味がある方はこちらをどうぞ。
ソースコードを隠すこともできる(ダブルクリックする)ので、非エンジニアの人でも使うだけならこうしておけば抵抗少ないかも。
2行目は必要なライブラリをインストールします(先頭に!つけるとコマンド実行できます)。今回はslack通知を楽にしてくれるライブラリを導入しています。
設定+通知部分
#@markdown ##ワードウルフ設定
参加者 = "@user, @aaa, @bbb, @ccc, @ddd" #@param {type:"string"}
テーマ候補 = "\u5409\u91CE\u5BB6,\u677E\u5C4B,\u3059\u304D\u5BB6,\u306A\u304B\u536F" #@param {type:"string"}
user_all = [u.strip() for u in 参加者.split(",")]
theme_list = [t.strip() for t in テーマ候補.split(",")]
wolf_users = random.sample(user_all, 1) #人数も変えられるはず
wolf_word, other_word = random.sample(theme_list, 2)
for user in user_all:
if user in wolf_users:
theme = wolf_word
else:
theme = other_word
slack.notify(text='あなたのテーマ: %s' % theme, channel=user, username=username, icon_emoji=icon_emoji)
参加者のユーザアカウント名を@付きで記載します。また、テーマ候補も同様にカンマ区切りでリストアップします。
プログラムでやっているのは
- ランダムに狼を1人決める
- テーマの中からワードをランダムに2つ選び、片方を狼用・もう片方を市民用とする
- それぞれのユーザに通知
だけです。
例外処理とかはしてないです。
答えの通知部分
#@markdown ##答え合わせ
for user in user_all:
if user in wolf_users:
theme = wolf_word
role = "狼"
else:
theme = other_word
role = "市民"
slack.notify(text='あなたは %s でした。\nテーマは %s vs %s でした。' % (role, wolf_word, other_word), channel=user, username=username, icon_emoji=icon_emoji)
ゲーム後に通知する部分です。
順番に動かすと、
こんな感じで通知されれば成功です。