我正在设计一个 Discord 机器人,它基本上可以在整个服务器中用于不同的有用任务,例如获取服务器统计信息、DM 用户以及(这个问题的主题)进行民意调查。我的代码很长,所以我只会包括导入、重要变量、我遇到问题的实际代码以及我运行我的机器人的结尾:
from profanity import profanity
import os, random, discord, asyncio, praw
from discord.utils import get
from discord.ext import commands
from dotenv import load_dotenv
from discord.ext.commands import Bot
load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
intents = discord.Intents().all()
intents.members = True
bot = commands.Bot(command_prefix="!!", case_insensitive=True, intents=intents)
devmode = False
@bot.command(name='makePoll', help="Makes a new poll that other users can vote for. Bob Bot may be erroring out because it does not have the highest permissions in the server, so you will need to give it roles to kick users.")
async def makeapoll(ctx,*, message : str):
embed=discord.Embed(title=random.choice(pollNames), description=message, color=0xfcd602)
embed.set_author(name=ctx.author.display_name + " (you can end this poll by reacting with this: ?)", url=random.choice(aintsupposedtobeheresunnyboy), icon_url=ctx.author.avatar_url)
mymsg = await ctx.send(embed=embed)
await mymsg.add_reaction('✅')
await mymsg.add_reaction('❌')
def check(reaction, user):
return user == ctx.message.author and str(reaction.emoji) == '?'
try:
reaction, user = await bot.wait_for('reaction_add', timeout=60.0, check=check)
except asyncio.TimeoutError:
await ctx.send("Some kind of error occured. Sowwy.")
deletionEmbed = discord.Embed(title="This ends now!", value="It's over, Anakin... I have the high ground", color=0xfcd602)
deletionEmbed.add_field(name="The poll ended!", value=f"The poll's author {ctx.author.display_name} just declared that the poll ended. RIP poll :(\n\nFor those of you who missed the question, here it is: *{message}*\n\n{ctx.author.display_name}, the results of the poll should have been DMed to you right about now. Happy statistical advancement!", inline=False)
await mymsg.edit(embed=deletionEmbed)
bot.run(TOKEN)
基本上,我想在这里做的是,当民意调查的作者对红点 ?(用于正式停止民意调查)做出反应时,我的机器人直接向民意调查的作者发送最新消息有关谁对任何反应做出反应的信息。例如,如果两个人用复选标记做出反应,三个人用一个叉号做出反应,我希望机器人向民意调查的作者发送这些统计信息:2 个勾号和 3 个叉号。如果另一个用户在投票后回复了支票,我不想反映这些变化。我尝试使用 add_raw_reaction 函数,但这似乎也不起作用。我该如何解决这个问题?
答案 0 :(得分:0)
您可以在 wait_for
完成后(当作者做出反应或超时时)获取投票统计数据并发送包含这些数字的 DM。为此,您首先需要重新获取消息,以便您可以获取更新后的反应数据,因为原始 Message
对象不会自行更新。
mymsg = await mymsg.channel.fetch_message(mymsg.id)
之后,您可以从消息中获取 Reaction
对象并编译一个字典,将表情符号映射到它们的数量。与其只是遍历 Message.reactions
,因为它可能包含无关的表情符号,最好有一个只包含投票、✅ 和 ❌ 一部分的表情符号的列表,然后只获取那些使用 {{ 的人的反应1}}。
discord.utils.get
现在有了存储在 choices = ['✅', '❌']
counts = {}
for emoji in choices:
reaction = discord.utils.get(mymsg.reactions, emoji=emoji)
counts[emoji] = reaction.count - 1 # minus 1 to exclude the bot
中的数字,您可以选择想要的统计数据格式,然后调用作者的 count
以发送 DM。
.send()