Передать контекст в фоновую задачу discord.py - PullRequest
0 голосов
/ 18 мая 2018

Владелец сервера, находящийся в раздоре, попросил меня добавить систему ботов в мой бот для него (бот только на этом сервере).Чтобы поощрять активность, мы не использовали систему ежедневных сообщений, и вместо этого моя идея заключалась в том, чтобы каждые 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())

Если бы вы могли дать мне совет, который был бы великолепен, и если вы чувствуете себя очень щедрым, Code + объяснение будет оценено. Я изучаю Python из этогопроект.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Вам необходимо сохранить объект Message, который возвращает send_file (сообщение, которое было отправлено). Затем вы можете использовать этот Message объект в Client.wait_for_reaction для ожидания реакции.

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
0 голосов
/ 01 апреля 2019

Если я правильно понял вопрос, вы хотите подождать, пока пользователи отреагируют на файл, который вы разместили, а затем наградить их за эту реакцию. Я предполагаю, что вы используете discord.py версии 1.0 или выше.

Само фоновое задание, насколько я знаю, не может быть передано никакому контексту - потому что оно не вызывается как комментарий в определенном контексте. Однако API (https://discordpy.readthedocs.io/en/rewrite/api.html#discord.on_reaction_add) утверждает, что имеется прослушиватель реакций на сообщения, что означает, что вы можете просто использовать

@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

тогда содержание сообщения будет просто message.

Надеюсь, это поможет.

...