2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Slack+Colaboratoryでワードウルフするスニペット

Posted at

随分リモートワークも定着してきたご時世+新入生・新入社員も多い季節なので、リモートでもサクッとできるレクリエーション「ワードウルフ」をサポートするプログラムを作ったのでメモしておきます。

プログラムとしてはなんら難しいことはしてないのですが、Slack・Colaboratoryを連携すると色々応用ができそうなのでTipsをまとめておきます。

ワードウルフ

細かいルールは他サイトを検索してください。こことか。
【全てわかる】『ワードウルフ』少数派探しゲームを徹底紹介

やることとしては、

  • 2つのワードを選ぶ
  • 参加者を”狼”と”市民”に分ける
  • 参加者それぞれにワードを通知する → SlackのDMにする
  • 最後に結果を通知する

Colaboratory上での実装

最終的には図のようになります。

  • 最初にSlack通知の設定
  • 次に参加者とテーマの候補の入力
  • 最後に答え合わせ

image.png

事前準備部分

#@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 としてマークダウン形式で書いていくこともできます。

image.png

また、文の末尾に #@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)

ゲーム後に通知する部分です。

順番に動かすと、

image.png

こんな感じで通知されれば成功です。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?