とらのメモ

IT関係やガジェットについての雑記

Discordに投票機能をつける

slackの投票機能が好きだったのでそれっぽいものをつくってみた。 少しアレンジを加えて投票ではなく募集機能になっている。

動作

.rect@数字を送るとこんな感じで動く で取り消し,で参加する
bottest.gif

集まらなかった時は、自分で,:heavy_multiplication_x:リアクションを付けてあげると募集が終わる 人望がなくても安心な設計 image.png

ソース

import discord

client = discord.Client()

@client.event
async def on_message(message):
    """メンバー募集 (.rect@数字)"""
    if message.content.startswith(".rect"):
        mcount = int(message.content[6:len(message.content)])
        text= "あと{}人 募集中\n"
        revmsg = text.format(mcount)
        #friend_list 押した人のList
        frelist = []
        msg = await client.send_message(message.channel, revmsg)

        #投票の欄
        await client.add_reaction(msg, '\u21a9')
        await client.add_reaction(msg, '⏫')
        await client.pin_message(msg)

        #リアクションをチェックする
        while len(frelist) < int(message.content[6:len(message.content)]):
            target_reaction = await client.wait_for_reaction(message=msg)
            #発言したユーザが同一でない場合 真
            if target_reaction.user != msg.author:
                #==============================================================
                #押された絵文字が既存のものの場合 >> 左 del
                if target_reaction.reaction.emoji == '\u21a9':
                    #==========================================================
                    #◀のリアクションに追加があったら反応 frelistにuser.nameがあった場合 真
                    if target_reaction.user.name in frelist:
                        frelist.remove(target_reaction.user.name)
                        mcount += 1
                        #リストから名前削除
                        await client.edit_message(msg, text.format(mcount) +
                                                        '\n'.join(frelist))
                            #メッセージを書き換え

                    else:
                        pass
                #==============================================================
                #押された絵文字が既存のものの場合 >> 右 add
                elif target_reaction.reaction.emoji == '⏫':
                    if target_reaction.user.name in frelist:
                        pass

                    else:
                        frelist.append(target_reaction.user.name)
                        #リストに名前追加
                        mcount = mcount - 1
                        await client.edit_message(msg, text.format(mcount) +
                                                        '\n'.join(frelist))


                elif target_reaction.reaction.emoji == '✖':
                        await client.edit_message(msg, '募集終了\n'+ '\n'.join(frelist))
                        await client.unpin_message(msg)
                        break
                await client.remove_reaction(msg, target_reaction.reaction.emoji, target_reaction.user)
                #ユーザーがつけたリアクションを消す※権限によってはエラー
                #==============================================================
        else:
            await client.edit_message(msg, '募集終了\n'+ '\n'.join(frelist))



client.run("あなたのトーーーーーーーーーーーークン")

await client.remove_reaction(msg, target_reaction.reaction.emoji, target_reaction.user) は、リアクションを自動で消してくれて便利だけどサーバーで権限がないとエラーが出るので注意 discorddeveloperのサイトで変更できたはず

await client.pin_message(msg)await client.unpin_message(msg)は募集が終わるまでメッセージをピン留めしてくれる。 コメントアウトして機能をとめてもいいかも

参考にしたサイト

【Discord】リアクションをスイッチとして使う【Python3】 リアクションをスイッチとして使う発想はなかったのでとても参考になった 4KaNEさんに感謝

UnicodeのEmojiの一覧 絵文字のまま入れるとエラーが出るものもあるのでここからUnicordを探して打った方がいいかもしれない