投稿日:2020-01-27最終更新:2020-02-19クロス元の投稿をみる(https://rabbit-from-h...)はじめにdiscordのボイスチャットにいるメンバーを、コマンド一つでチーム分けを自動で行ってくれるbotを、discord公式APIラッパーのdiscord.pyを利用して作成してみました!なお、以下の内容については、他のところでたくさん触れられてりることもあり、本記事では触れません。以下のサイトを参考にしてみてください。Forkするリポジトリを下記のmake-teamに変えて、作成すればすぐにチーム分けbotを利用できます。基本的な仕様は、以下のサイトを参考にさせてもらいました。https://ojige.hatenablog.com/entry/2018/07/26/131120チームをつくる方法は、とりあえず3つ用意しました。以下のコマンドをテキストチャンネルに入力することで、チーム作成が可能です。ボイスチャンネルに入らないまま実行すると、botから実行できなかった旨のメッセージが届きます。指定した数が0だったり、ボイスチャンネルのメンバー以上の数を指定すると、botから実行できなかった旨のメッセージが届きます。指定した数のチームを作成メンバー数が同じになるように作成チーム数を指定しなくても実行可。人数差は考慮されないまま、指定されたチーム数を作成チーム数を指定しなくても実行可。実行例どれも以下のような形で、botからメッセージが届く。└grouping.py一つのpythonファイルにまとめてもよかったのですが、以下の理由でこの構成にしました。他のbotにチーム分けのアクションを追加したいときに、一つのファイルだと面倒。この構成なら「grouping.py」を移動させて、移動先のコマンドを受け取る処理(main.py)だけを書き直すだけで済む。全体の流れとしては、以下の通り。一つ一つ説明していきます。commands.Bot(command_prefix='/')ここで、botがコマンドだと認識するためのプレフィックスとなります。チーム数」でコマンド入力することで実行されるようになります。上記の形で書くと、botが起動したときに呼び出されます。今回は呼び出されると、自身のbotの情報を標準出力するものとなってます。「XXXX」に、ユーザに入力してもらうコマンドを指定します。「XXXX」に"command"を指定した場合、「/command」がbotを動作させるためのコマンドになります。引数に指定されている「ctx」は、必須となります。この「ctx」を利用することで、ユーザ名やボイスチャンネルのステータスやら、discord上の情報を取得できます。「A」の部分に、コマンド入力時に指定した数が入ります。Trueこのset_memでは、コマンド入力者のボイスチャンネルのステータス(どかしらのボイスチャンネルに入っているか)を確認しています。ボイスチャンネルに入っている場合のみ、コマンド入力者が入っているボイスチャンネルのメンバーリストを取得しています。ctx.author.voiceコマンド入力者のボイスチャンネルのステータスを確認することができます。ctx.author.voice.channel.membersコマンド入力者が入っているボイスチャンネルのメンバーリストを取得することができます。チーム分けできる数を指定してください。('\n'.join(team))さて、ようやく今回のメインです!今回3つのチーム分けの方法を用意しましたが、どれも処理の方法は概ね同じです。ここでは、「チームメンバー数が均等になるチーム分け」の処理を例に、説明したいと思います。set_mem()でメンバーリストを取得したあと、リストを一度シャッフルします。次に、チーム数をもとにして、均等に分けたときに余る人数を算出します。余る人がいる場合は、余る人数分だけ、シャッフルしたリストから末尾にいる人を除きます。Cさん以下の形で、チーム分け完了後の状況をまとめる配列に格納します。]余る人数分除いた後は、残ったメンバーリストでチーム分けを行います。チーム分けにはスライスを使いました。チーム数分だけスライスします。※"0"始まり(チーム1の場合、"0"となる)スライスを利用した場合の例は以下の通りです。チーム2[C,F,J]スライスした後、最終的には以下の配列になります。ctx.channel.send(msg)チームが分け終わると、チーム分けが完了している配列をメッセージとして送信します。配列そのままを送信すると、改行されず一行の文面として送信されます。見づらいメッセージとなってしまうため、配列の各要素の末尾に改行コードを付けて送信します。ctx.channel.sendコマンドが入力されたチャンネルに、メッセージを送信します。以上が、チーム分けの大まかな実装部分になります。ソースはgithubに載せてあるので、よかったらみてください!https://github.com/Rabbit-from-hat/make-teamおわりにpythonをはじめて使ったのですが、すごい書きやすくて楽しかったです。こんな書き方しないなど、規則的におかしいところを見つけ次第直していこうと思います。今回は基本的な(?)チーム分けしかできなかったので、このチーム分けのbotを改修してきたいなーと思います。機会があればまた記事にします。RabbitFromHat.qrunch.io作ったアプリや、その他技術的な備忘録を書くブログ。Qrunch.netサーバー提供フィードバックを送信する。