Skip to content

Python製のDiscord用Bot(Zoom.usのブレイクアウトルーム的機能、Slackのリアク字チャンネラー的機能があります! ScrapboxのURLが展開できるようになりました!(設定すれば))

License

Notifications You must be signed in to change notification settings

tetsuya-ki/discord-bot-heroku

Repository files navigation

このBotについて

Discord用のBot。discord.pyのBot Commands Frameworkを使用して実装。大まかな機能ごとにCogを分けて開発しているため、不要な機能はCogを削除するだけで削除可能(一部機能に依存関係あり)。同様に、Cogを追加すれば機能追加も可能。v1.0.0からスラッシュコマンドに対応しました

Table of Contesnts

機能

通常用カテゴリ(messagecog.pyで実装)

/voice group メンバー数を指定:指定されたメンバー数になるように、適当な数のチームに分ける(コマンド実行者がボイスチャンネルに接続している必要アリ。サーバーに複数のボイスチャンネルがある必要アリ。Zoomのブレイクアウトルーム機能からインスパイアされ、作成したもの)
image(voice group)

/voice team チーム数指定:メンバー数が均等になるよう、指定された数に分ける(コマンド実行者がボイスチャンネルに接続している必要アリ。サーバーに複数のボイスチャンネルがある必要アリ。Zoomのブレイクアウトルーム機能からインスパイアされ、作成したもの)
image(voice team)

/voice members ボイスチャンネルに接続しているメンバーリストを取得
image(voice members)

/simple-poll 簡易的な投票機能(「/」なしの場合と、ありの場合で動作が変わる)。

  • 「/」なしの場合、YES, NOの投票となる
  • 「/」あり場合、「/」より前の部分がタイトルになり、それ以降が投票される項目になる
    image(poll-2) image(poll-2)

/radikoSearch ラジコの番組表を検索する機能

  • もっとも単純なキーワードのみ指定
    image(radikoSearch) image(radikoSearch)

  • 検索対象(過去、未来、すべて)はプルダウン、地域はオートコンプリートで指定

    • 地域についてはdiscord側の制限で25個までしか設定できなかったため、全地域で使用できない点に注意(申し訳ないですが、近場の他県で検索ください) image(radikoSearch)
  • 以下、画像は差し代わっていないが、過去と同様の仕組みとなっている

    • 0を設定すると当日として扱われる image(radikoSearch)
    • 日付の桁数で扱いが変わる(1桁はx日後として扱われ、2桁は当月の日付と扱われ、4桁は今年の月日として扱われる)
      image(radikoSearch)
  • /count-message

    • メッセージを数え、ランキングにするコマンド
    • チャンネル名、(チャンネルごとに)数える数などを指定できる
      • all_flagで、「すべて」を指定するとすべてのチャンネルを数える
        • channelで特定のチャンネルのみ数えることも可能
      • count_numbersでチャンネルごとに読み込む数を指定できる
      • ranking_numで集計する順位を指定できる(「5」と入力した場合、5位まで表示)
      • reply_is_hiddenで結果を全員に見せるか指定できる(デフォルトは公開) image(count-message)
  • /count-reaction

    • リアクションを数え、ランキングにするコマンド
    • チャンネル名、(チャンネルごとに)数える数などを指定できる
      • all_flagで、「すべて」を指定するとすべてのチャンネルを数える
        • channelで特定のチャンネルのみ数えることも可能
      • count_numbersでチャンネルごとに読み込む数を指定できる
      • ranking_numで集計する順位を指定できる(「5」と入力した場合、5位まで表示)
      • reply_is_hiddenで結果を全員に見せるか指定できる(デフォルトは公開) image(count-reaction)

管理用カテゴリ(admincog.pyで実装)

/channel チャンネルを操作するコマンド(サブコマンド必須)。チャンネルの操作権限を渡すと、削除も可能だから嫌だなと思って作ったコマンド。

  • channel makeでPublicなチャンネルを作成

    • ただし、カテゴリの権限に同期されるため注意(想定通りの結果にならない可能性アリ) image(channel_make)
  • channel private-makeでPrivateなチャンネルを作成
    image(channel_privateMake)

  • channel role-deleteでチャンネルからロールを削除
    image(channel_roleDelete)

  • channel role-deleteでチャンネルからロールを削除失敗
    image(channel_roleDelete-2)

  • channel topicでチャンネルにトピックを設定
    image(channel_topic)

/channel delete-message 指定したキーワードを含むメッセージを削除(自分とBot※のメッセージのみ削除される)※Botを削除対象とするかは環境変数で指定可能。デフォルトは削除しない
image(deleteMessage) image(deleteMessage)

/get-audit-log 監査ログを取得。とっても重たい上に見づらい。。。いつかなんとかしたい(AuditLogChangesをわかりやすく表示する方法あるのかな。。。)

/purge メッセージを削除(自分とBot※のメッセージのみ削除される)※Botを削除対象とするかは環境変数で指定可能。デフォルトは削除しない
image(purge)

リアクションチャンネラーカテゴリ(reactionchannelercog.pyで実装)

/reaction-channeler リアクションチャンネラーを操作するコマンド(サブコマンド必須)。Slackのリアク字チャンネラーからインスパイアされ、作成したもの。

  • リアクションチャンネラー追加
    image(reaction-channeler_add) image(reaction-channeler_add)

  • リアクションチャンネラー削除
    image(reaction-channeler_delete) image(reaction-channeler_delete)

  • リアクションチャンネラー表示
    image(reactionChanneler_list)

  • リアクションチャンネラー全削除
    image(reaction-channeler_purge)

その他、リアクションによって発動する機能をまとめている。:pushpin:をつけると、ピン留めする機能(メッセージ編集権限を与えるのは微妙だが、ピン留めさせたかったため)や、リアクションによってチャンネルに投稿する機能(リアクションチャンネラー機能とする)、:ok_hand:をつけると画像を保存する機能。

-:pushpin: のイベント
image(pushpin)

  • リアクションチャンネラーの対象のリアクションを追加すると、
    image(reaction-channeler)

  • あらかじめ指定されたチャンネルへリンクが投稿される
    image(reaction-channeler-2)

  • v1.0.0で画像も表示するように改善
    image(reaction-channeler-2)

  • 環境変数で設定しておけば、別のギルドのチャンネルへリンクを投稿することもできる(v0.7.1で実装)
    image(reaction-channeler-3)

ゲームカテゴリ(gamecog.pyで実装)

/start-word-wolf ワードウルフを行うコマンド。お題を修正したい場合jsonファイルを変更すること

  • ワードウルフ開始(これは時間が経過し、ネタバレ投稿された画像)
    image(wordWolf-1)

  • BotからくるDMの様子
    image(wordWolf-2)

/start-ng-word-game NGワードゲームを行うコマンド。お題を修正したい場合jsonファイルを変更すること(ワードウルフ機能と共用)

  • NGワードゲーム開始

    • ボタンで参加、離脱、開始できるように変更 image(wordWolf-1)
  • 時間が経過し、ネタバレ投稿された画像 image(ngWordGame-1)

  • BotからくるDMの様子
    image(ngWordGame-2)

/coyoteGame コヨーテを行うコマンド

  • コヨーテ開始(説明が長いですがやれば分かります!)

    • 説明の長さが選べます
      • 普通: 普通にゲームできる程度省略したもの(デフォルト)
      • 詳しく: 詳しく説明
      • 無し: 説明なし(Botでやったことある人たち用) image(coyoteGame_start) image(coyoteGame_start)
    • 参加するボタンで参加できます
  • コヨーテ開始

    • 相手のカードを見るボタン
      image(coyote_button_display)
    • コヨーテ!(モーダルでコヨーテする相手のID、相手の値を入力)
      image(coyote_button_coyote)
    • カード能力説明
      • 特殊カードなどの意味を忘れたときに使用します
        image(coyote_button_description-card)
    • 状況説明
      • 現在相手のHPやターンなど忘れたときに使用します
        image(coyote_button_description-all)
    • 状況説明(ネタバレ)
      • 基本的には使わないでください
      • 場に出してあるカードも含めて表示されます(説明などの時に使用してください)
        • 灰色がかっているところをクリック(タップ)すると表示されます image(coyote_button_description-all))
    • コヨーテ!されると、その結果が表示されます image(coyote_button_coyote-2)
    • その後、「状況説明(全て)」を押すこともできます(山札も見えるのでやめた方がいいかもしれません) image(coyote_button2_description-all)
  • 次ターン以降

    • ディールすることで次ターンが始まります image(coyote_button2_deal)
  • コヨーテの終了

    • 生き残りが1名になった時点でゲームが終了します image(coyote_finish)
  • コヨーテ開始(自分でデッキを設定)

    • デフォルトのデッキが初期表示されているので好きに編集します
    • 新しい能力の追加などは不可能です(-100〜100までの数値の追加や、特殊カードの枚数変更などのみ) image(coyoteGame_setDeckAndStart)

/start-ohgiri-game 大喜利を始めるコマンド。お題を修正したい場合jsonファイルを変更するか、後述の環境変数でJSONを返すURLを設定すること

  • 大喜利開始(数字を渡すと、勝利点が設定される。すぐ終わらせたいなら、/start-ohgiri-game win_point:1等で実行)

    • 参加方法についてはv1.0.0からボタン式に変更
    • コマンドは以下のように表示される
      image(ohgiri_start)
    • コマンドを実行すると以下のように返信される
      image(ohgiri_start2)
    • 参加ボタンを押すと、ゲームに参加する
      image(ohgiri_button_join)
    • 離脱ボタンを押すと、ゲームから離脱する(ゲーム中に離脱できてしまうがやらない方が良い)
      image(ohgiri_button_leave)
    • 開始ボタンを押すと、ゲームが始まる(人数が集まっている場合)
      image(ohgiri_button_start)
    • ターンが始まると、お題が与えられる
      • 回答、状況説明、カードを捨てる(1ポイント減点)ができる
        image(ohgiri_turn)
  • 「回答する」ボタンを押して、メニューから大喜利の回答を選ぶ

    • 複数選択するパターンもあり、選ばれた順番に回答を格納する(表示順ではない)
      image(ohgiri_answer)
  • 「状況を確認する」ボタンを押すと、大喜利の状況説明される(経過ターン、現在の親、お題、それぞれの得点などが表示される)
    image(ohgiri_description)

  • 大喜利の回答カードを捨てることも可能(いい回答が手札にない場合使うコマンド)
    image(ohgiri_discard)

  • 親が回答を選択

    • ダミーのカードが1枚紛れ込んでおり、ダミーを選択した場合は親のポイントが1点減点され、親が継続する
    • 人間のカードが選択された場合、選ばれた人間に1ポイント加点し、その人物が次の親になる image(ohgiri_choice)
  • 親が回答を選択しゲーム終了するところ(誰かが勝利点に到達したら終了)
    image(ohgiri_choice2_game_over)

メッセージイベント用(onmessagecog.pyで実装)

  • コマンドを使って実行する訳ではない機能
    • メッセージ投稿時に発動する、ScrapboxのURL展開機能(環境変数の説明SCRAPBOX_SID_AND_PROJECTNAMEで指定した対象のみ) image(help)

    • メッセージ編集時(discordによるURLの展開時)に発動する、画像保存機能(環境変数の説明のSAVE_FILE_MESSAGEで指定した対象のみ) image(help)

    • メッセージ投稿時に発動する、TwitterのURL展開機能(環境変数の説明USE_TWITTER_EXPANDEDが未指定またはTRUEのとき実行)(v1.0.1にて追加)

      • 実行したくない場合、USE_TWITTER_EXPANDED=FALSEとすること
      • 表示例1(画像あり)
        image(twitter_expander1)
      • 表示例2(画像なし)
        image(twitter_expander2)

カテゴリ未設定(削除されました)

環境変数の説明

  • DISCORD_TOKEN = "discord_bot_token"
    • ここにDiscord Botのトークンを貼り付ける(とても重要。これをしないと動かない)
  • LOG_LEVEL = INFO
    • ログレベルを設定したい場合、設定する。デフォルトはWARN。DEBUG, INFO, WARN, ERRORが設定可能
  • AUDIT_LOG_SEND_CHANNEL = "guild1.audit_log_send_channel_id1;guild1.audit_log_send_channel_id1"
    • 管理用のチャンネルを記載する。ギルドID.管理用のチャンネルIDの形式で記載する。複数ある場合は、「;」を挟む必要がある
  • IS_HEROKU = True
    • Herokuで動かす場合、Trueとする(discordのチャンネルを使用し、リアクションチャネラーのデータが消えないように試みる(reaction_channel_controlを作成し、そこにjsonデータを添付することでデータを保持する))
  • SAVE_FILE_MESSAGE = "twitter"
    • 保存したい画像ファイルをもつURLの一部を指定。正規表現対応。複数ある場合はパイプ(|)などを駆使すること
  • FIRST_REACTION_CHECK = True
    • すでにリアクションが付けられた物について、リアクションチャンネラーを発動しないかどうかの設定。基本的にはTrueがオススメ。寂しいときはFalseでもOK(何回だってチャンネルに転記されちゃいますが!)
  • REACTION_CHANNELER_PERMIT_WEBHOOK_ID = "webhook_id"
    • リアクションチャンネラー機能の拡張設定。ここにWebhook IDか「all」という文字列を記載すると、リアクションチャンネラー機能でWebhookが使用できる(v0.7.1で追加で実装)
      • リアクションを設定するだけで、別のギルドにメッセージを転送することができるようになる
    • この環境変数にWebhook IDがない、または、allが記載されていない場合、登録は可能だが、実際に実行はされない
      • 勝手にリアクションチャンネラーを登録され情報が流出することを防ぐため、環境変数で指定がない限り実行されないようにする(少し面倒かもしれない)
  • SCRAPBOX_SID_AND_PROJECTNAME = "all:scrapbox_sid@projectname1,projectname2;guild1:scrapbox_sid@projectname3"
    • Scrapboxの展開をする際に使用する、sidとプロジェクト名についての設定
    • 設定が複数存在する場合、「;」を挟む必要がある
    • 左端のallの部分(対象ギルド)をギルドIDにすると、指定のギルドでしか展開しない。allの場合、すべてのギルドで発動
    • sidを適用したいプロジェクトが複数ある場合、「,」(コンマ)を挟む必要がある
  • PURGE_TARGET_IS_ME_AND_BOT=False
    • /purgeコマンド、/channel delete-messageコマンドで削除する対象にBotを含むかの設定(設定がない場合は、自分の投稿のみが削除対象)
  • OHGIRI_JSON_URL=ohgiri_json_url
    • 大喜利機能で使用するJSONをURLから取得する場合に設定(Cogを読み込む際に取得されます)
  • WORDWOLF_JSON_URL=wordwolf_json_url
    • ワードウルフ機能で使用するJSONをURLから取得する場合に設定(Cogを読み込む際に取得されます)。環境変数がない場合は、jsonファイルを使用
  • NGWORD_GAME_JSON_URL=ngword_game_json_url
    • NGワードゲーム機能で使用するJSONをURLから取得する場合に設定(Cogを読み込む際に取得されます)。環境変数がない場合は、jsonファイルを使用
  • USE_IF_AVAILABLE_FILE=False
    • 各JSONファイルがあればそちらを優先的に使用するかどうか。デフォルトはFalse。v1.0.0で追加
      • テストする時、毎回同じものをダウンロードしていて意味ないなと思ったため追加
  • APPLICATION_ID="99999999"
    • あなたのBotのAPPLICATION IDを指定する(スラッシュコマンドを使う上で設定が必須となります)。v1.0.0で追加
  • ENABLE_SLASH_COMMAND_GUILD_ID="99999999"
    • あなたのBotのテストする際はテスト用のギルドですぐに使用したいものと思われます(グローバルコマンドは適用まで時間がかかってしまう)
    • その場合、この環境変数にテスト用ギルドのIDを設定することで、すぐにスラッシュコマンドが試せます(ギルドコマンドとして設定する)。v1.0.0で追加
      • 設定が複数存在する場合、「;」を挟む必要がある
      • 例) ENABLE_SLASH_COMMAND_GUILD_ID="99999999;88888888;77777777"
  • USE_TWITTER_EXPANDED=FALSE
    • TwitterのURLを展開する機能
    • 未指定またはTRUEのとき実行(v1.0.1にて追加)

廃止された環境変数

  • COUNT_RANK_SETTING
    • /countMessage/countReactionで使用するランキングの数を保持する環境変数
    • スラッシュコマンドで指摘できるようにしたため、v1.0.0で廃止

ローカルでの動かし方(Poetry)

  1. Install Poetry
    https://python-poetry.org/docs/#installation

  2. Install modules
    poetry install

  3. create .env
    .env.sampleを参考に.envを作成する
    Botはこちらで作成し、トークンを取得する(トークンは厳重に管理すること!)
    *環境変数を修正する際は、環境変数の説明を参照すること!

  4. Start Bot
    poetry run python assistantbot.py

ローカルでの動かし方(Poetryを使用しない方法)

  • 詳しくはwikiを参照ください!
  1. Install modules
    Mac: pip3 install -r requirements.txt
    Windows: py -3 pip install -r requirements.txt

  2. create .env
    .env.sampleを参考に.envを作成する
    Botはこちらで作成し、トークンを取得する(トークンは厳重に管理すること!)
    *環境変数を修正する際は、環境変数の説明を参照すること!

  3. Start Bot
    Mac: python3 assistantbot.py
    Windows: py -3 assistantbot.py

Dockerでの動かし方

  • 詳しくはwikiを参照ください!
  1. Docker imageを作成(または、Docker HubからPull)
    1-1. Make Docker Image(Build by yourself)
    docker build . -t discordbotheroku:latest .
    1-2. Pull from Docker Hub
    docker pull tk2812/discord-bot-heroku:latest

  2. Make .env-docker file
    .env-docker.sampleを参考に.env-dockerを作成する(=の両端はスペース無しが良さそう。以下のスタイルなら動いた)
    Botはこちらで作成し、トークンを取得する(トークンは厳重に管理すること!)
    *環境変数を修正する際は、環境変数の説明を参照すること!

    DISCORD_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    ...
  3. Run docker container
    このBOTの場合、環境変数はファイル指定がオススメだが、普通に指定しても動くはず(Build by yourself)。
    docker run --env-file ./cogs/modules/files/.env-docker discordbotheroku:latest もしくは
    docker run --env-file ./cogs/modules/files/.env-docker docker.io/tk2812/discord-bot-heroku:latest

About

Python製のDiscord用Bot(Zoom.usのブレイクアウトルーム的機能、Slackのリアク字チャンネラー的機能があります! ScrapboxのURLが展開できるようになりました!(設定すれば))

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages