Python 将上下文传递给后台任务discord.py

Python 将上下文传递给后台任务discord.py,python,python-3.x,discord,discord.py,Python,Python 3.x,Discord,Discord.py,discord上的服务器所有者要求我为他向我的bot添加自定义货币系统(bot仅在此服务器上)。为了鼓励活动,我们没有使用日报系统,相反,我的想法是每7分钟弹出一条带有图像的消息,用户必须在图像上添加“反应”。为了方便和控制输入,我想给我的图像添加一个反应,这样用户只需单击反应,它就会添加数量 在排除所有这些背景的情况下,以下是作为背景任务的问题。我不知道如何将上下文传递给反应 async def my_background_task(): await bot.wait_until_re

discord上的服务器所有者要求我为他向我的bot添加自定义货币系统(bot仅在此服务器上)。为了鼓励活动,我们没有使用日报系统,相反,我的想法是每7分钟弹出一条带有图像的消息,用户必须在图像上添加“反应”。为了方便和控制输入,我想给我的图像添加一个反应,这样用户只需单击反应,它就会添加数量

在排除所有这些背景的情况下,以下是作为背景任务的问题。我不知道如何将上下文传递给反应

async def my_background_task():
    await bot.wait_until_ready()
    counter = 0
    channel = discord.Object(id='446782521070321664')
    while not bot.is_closed:
        counter += 1
        with open('vbuck.png', 'rb') as f:
            await bot.send_file(channel, f) #sends a png of a vbuck
            await bot.add_reaction(discord.message,'<:vbuck:441740047897591809>') #This is the Reaction part 
    await asyncio.sleep(420) # task runs every 7 min seconds
bot.loop.create_task(my_background_task())
async def my_background_task():
等待机器人。等待直到准备就绪()
计数器=0
channel=discord.Object(id='446782521070321664')
而不是关闭bot.u时:
计数器+=1
以open('vbuck.png','rb')作为f:
等待机器人。发送文件(通道,f)#发送vbuck的png
等待机器人。添加反应(discord.message“”)#这是反应部分
等待asyncio.sleep(420)#任务每7分每秒运行一次
bot.loop.create_任务(my_background_task())

如果你能给我建议,这将是伟大的,如果你觉得额外慷慨的代码+解释将不胜感激,我从这个项目学习python

如果我正确理解了这个问题,那么您应该等待用户对您发布的文件做出反应,然后根据反应奖励他们。我假设您使用的是discord.py 1.0版或更高版本

据我所知,后台任务本身不能传递给任何上下文,因为它不像特定上下文中的注释那样被调用。 然而,API()声明有一个侦听器来监听消息的反应,这意味着您可以简单地使用

@bot.event
async def on_reaction_add(reaction, user):
    #here do some checks on reaction.message and to check that it is actually
    #the correct message being reacted too and avoid multiple reactions of one user.
API还将告诉您可以对消息执行何种检查。当你让机器人发布消息时,你可以给消息一个特定的签名(像
time.time()
这样的时间戳似乎已经足够了),然后访问
reaction.message.content
并将其与当前时间进行比较。为此,我将修改您的后台任务,如下所示:

async def my_background_task():
    await bot.wait_until_ready()
    counter = 0
    channel = bot.get_channel(id='446782521070321664')

    while not bot.is_closed:
        counter += 1
        mess = "maybe a timestamp"
        e = discord.Embed()
        e.set_image(url = "some cool image maybe randomly chosen, please no vbucks")
        await channel.send(mess, embed = e) #sends a message with embed picture
        await asyncio.sleep(420) # task runs every 7 min
然后,消息内容将只是
消息


希望这有帮助。

您需要保存
发送文件返回的
消息
对象(已发送的消息)。然后您可以在中使用该
消息
对象来等待反应

async def task():
    await bot.wait_until_ready()
    channel = discord.Object(id='446782521070321664')
    vbuck = discord.utils.get(bot.get_all_emojis(), name='vbuck')
    check = lambda reaction, user: user != bot.user
    while not bot.is_closed:
        msg = await bot.send_file(channel, 'vbuck.png') #sends a png of a vbuck
        await bot.add_reaction(msg, vbuck) 
        for _ in range(7*60):
            res = await bot.wait_for_reaction(message=msg, emoji=vbuck, check=check, timeout=1)
            if res:
                # res.user reacted to the message

如果您使用的是客户机类(我认为它不适用于Bot类,是吗?)。同样作为信息:在1.0中+wait_for_reaction现在是client.wait_for('reaction_add',…)并使用了一点differently@Banana哪些部分不能与机器人一起工作
Bot
Client
的一个子类,我还没有找到
Client
可以做一些
Bot
做不到的事情的地方。你说得对,我不知道它是Client的一个子类,我一定是瞎了:(