Discordに簡易的な投票システムを構築するよ
どもども、久しぶりの更新になりました。
今回は、みなさんおなじみのDiscordに簡単な投票システムを構築してみようと思います。やり方は簡単。Pythonを使ってBOTを作り、そいつをグループに入れることで、投票システムにするだけです。
OS : Ubuntu 16.04 LTS, MacOS
言語 : Python3.6.0
Contents
0. 方法
今回は、”簡易的な投票システム”ということで、Discordの機能を使って簡単に作成していきます。
自分はDiscord歴が浅いのですが、Discordを使って投票をやろうと思うと、スタンプを使って「A案に賛成ならXXのスタンプをB案に賛成ならOOのスタンプを…」という風に頑張るのがよくある使い方みたいです。
ですが、Discordさんでは一つの投稿に対していくらでもスタンプをつけることができるので、上記の例では”XX”と”OO”両方のスタンプをつけることができます。これでは、残念ながらちゃんとした”投票”とは言えません。
そこで、今回はこの方法にBOTを噛ませることで、一人一票の投票システムを作っていこうと思います。
偉そうなことを書きましたが、つまりは、一つの投票に対してスタンプを一つだけに制限する方法を紹介します。
1. 下準備
まずは、DiscordにBOTを置くための下準備をします。
ただ、この説明は長くなってしまうので、以前書いた記事を参考に”3. サーバーに登録”のところまで作業してください。
下記のプログラムでトークンを使用するので、メモしておいてください。
2. プログラムを書く
では、本記事メインのコードを掲載します。基本的にはコードに記述しているコメント通りの動作をします。プログラムを実行するためには、コードないのTOKENの部分を自身のものに書き換えてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#coding: utf-8 import discord client = discord.Client() TOKEN = "ご自身のトーーーークン" # 各ユーザのリアクション(スタンプ)を保存して置くためのdict from collections import defaultdict user_reaction_dic = defaultdict(dict) # リアクションが追加された時の処理 @client.event async def on_reaction_add(reaction, user): # リアクションが追加されたメッセージの取得 message = reaction.message # この投稿に対してこれまでにリアクションしたかを判定 if message.id not in user_reaction_dic[user.id]: # 新しく登録された絵文字なので情報を保存しておく user_reaction_dic[user.id][message.id] = reaction.emoji else: # 前回の絵文字を削除して更新する await client.remove_reaction(message, user_reaction_dic[user.id][message.id], user) user_reaction_dic[user.id][message.id] = reaction.emoji # リアクションが削除された時の処理 @client.event async def on_reaction_remove(reaction, user): # リアクションが追加されたメッセージの取得 message = reaction.message # 保存してあるリアクション情報と一致したらそれを削除しておく if user_reaction_dic[user.id][message.id] == reaction.emoji: del user_reaction_dic[user.id][message.id] # BOTを実行 client.run(TOKEN) |
これをサーバーとかで実行して置くと、一つの投稿に対して一つのスタンプしか登録することができなくなります。
これで簡易的な投票システムは完成です。ちなみに、上記のコードでは、プログラムの実行ちゅは全てのチャンネルでスタンプ数が一つになってしまうので、必要なら以下のコードを”on_reaction_add”の下あたりに追加して、チャンネルIDを書くことで実行するチャンネルを制限することができます。
1 2 3 |
# 投票部屋じゃなかったら処理せず終了 if message.channel.id != "BET_ROOM_ID": return |
チャンネルのIDはWeb版でDiscordにアクセスして、調べたいチャンネルにアクセスした時のURLから簡単にわかります。
https://discordapp.com/channels/[サーバーのID]/[チャンネルID←これ]
以上で簡易的な投票システムの構築でした。
Discordの機能を使うことで簡単にできたと思います。
コーディングで分からないことがあれば
プログラミングや環境構築で分からないことがあったら『teratail』というエンジニア特化型のQ&Aサービスがオススメです。自分もどうしても分からないことがあったら、時々質問しにいきますが、かなりニッチな質問にも意外と早く回答がつくのでとても頼もしいです。という宣伝でした。
おわりに
というわけで、DiscordのBOT記事第二弾でした。需要は限りなく少ないかと思いますが、気にしません。今回はDiscordの機能を使うことで簡単に実現することができましたが、よりちゃんと作りたいのであれば、Discordの機能だけでなく、プログラム側でデータベースなどを利用するのがいいと思います。
ディスカッション
コメント一覧
はじめまして、拝見させて頂きましたが、素晴らしいですね。
アフィリエイトのスクリプトなど、もう少しカスタムなどご依頼は可能でしょうか。
宜しくお願い致します。
コメントありがとうございます!
最近目が回る忙しさで、あまり作業に時間を割くことができません……。
なのでお受けできるかは、カスタムの内容によります……。
ありがとう御座います。
詳細を非公開でお伝えしたいのですが、メールを頂くことは可能でしょうか。
宜しくお願い致します。