slackの投票機能が好きだったのでそれっぽいものをつくってみた。 少しアレンジを加えて投票ではなく募集機能になっている。
動作
.rect@数字
を送るとこんな感じで動く
↩
で取り消し,⏫
で参加する
集まらなかった時は、自分で✖
,:heavy_multiplication_x:
リアクションを付けてあげると募集が終わる
人望がなくても安心な設計
ソース
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を探して打った方がいいかもしれない