Страницы с url картинками через реакции. Как разделить для пользователей возможности листать независимо?

Данный код позволяет изменять содержание сообщения через нажатие на заранее созданные реакции. Здесь создана имитация перелистывания страниц с картинками, из бд вызывается url адрес картинки и передаётся в сообщение. По нажатию на кнопки в реакции картинка меняется на следующую в списке. Происходит по нажатию прибавление или убавление переменной, которая как раз и указывает числом на индекс объекта, вызываемого из списка.

Суть: проблема в том, что переменная v глобальная и если один человек листает такой список, то это происходит для всех. Если объявить переменную внутри функции, то она будет после каждого нажатия на реакцию принимать это значение (ноль) и только затем изменяться, что полностью рушит работу страниц.

Есть ли варианты, как это исправить?

Сохранять url каждый в отдельной переменной или на странице embed'а не вариант, их слишком много будет, необходимо именно из бд брать.

Если есть наглядная документация по новый кнопкам, то это могло бы решить проблему

    v = 0
    @bot.event
    async def on_raw_reaction_add(payload):
        cur.execute(f"""SELECT URL FROM images ORDER BY nA DESC""")
        art = cur.fetchall()
        user = payload.member
        channel = payload.channel_id
        message = payload.message_id
        channel = bot.get_channel(channel)
        message = await channel.fetch_message(message)
        global v

        if payload.emoji.name == "⬅️":
            v += 1
            await message.edit(content=f"{art[v][0]}")
            if user != bot.user:
                for reaction in message.reactions:
                    await reaction.remove(user)

        elif payload.emoji.name == "➡️":
            v -= 1
            await message.edit(content=f"{art[v][0]}")
            if user != bot.user:
                for reaction in message.reactions:
                    await reaction.remove(user)

Ответы (1 шт):

Автор решения: mrBars1k

Я так и не нашёл нормальный и адекватный способ это реализовать, поэтому сделал как любой уважающий себя нелюдь - сделал мега костыль:

    @bot.event
    async def on_raw_reaction_add(payload):
        user = payload.member
        channel1 = payload.channel_id
        message1 = payload.message_id
        channel = bot.get_channel(channel1)
        message = await channel.fetch_message(message1)

        if f'{message1}' == f'{message1}':
            if payload.emoji.name == "➡️":
                if user != bot.user:
                    cur.execute(f"""SELECT v FROM test WHERE id = '{message1}'""")
                    va = cur.fetchone()
                    cur.execute(f"""UPDATE test SET v = {va[0]} + 1 WHERE id = '{message1}'""")
                    adb.commit()

                    cur.execute(f"""SELECT v FROM test WHERE id = '{message1}'""")
                    sss = cur.fetchall()
                    artid = sss[0][0]
                    cur.execute("""SELECT URL from images ORDER BY nA ASC""")
                    art = cur.fetchall()
                    await message.edit(content=f"{artid + 1}\n{art[artid][0]}")
                    for reaction in message.reactions:
                        await reaction.remove(user)

            elif payload.emoji.name == "⬅️":
                if user != bot.user:
                    cur.execute(f"""SELECT v FROM test WHERE id = '{message1}'""")
                    va = cur.fetchone()
                    cur.execute(f"""UPDATE test SET v = {va[0]} - 1 WHERE id = '{message1}'""")
                    adb.commit()
                    cur.execute(f"""SELECT v FROM test WHERE id = '{message1}'""")
                    sss = cur.fetchall()
                    artid = sss[0][0]
                    cur.execute("""SELECT URL from images ORDER BY nA ASC""")
                    art = cur.fetchall()
                    await message.edit(content=f"{artid + 1}\n{art[artid][0]}")
                    if user != bot.user:
                        for reaction in message.reactions:
                            await reaction.remove(user)
    ```

И также команда для вызова сообщения с картинками, которые нужно листать. После вызова, id этого поста записывается в бд.
@bot.command()
async def nn(ctx):
    await ctx.send('Nyaa')
    last = ctx.channel.last_message_id
    message = await ctx.channel.fetch_message(int(last))
    channel = bot.get_channel(1021497810589339719)
    # message = await channel.fetch_message(1023646768145113230)
    cur.execute(f"""INSERT INTO test (v, id) VALUES ('0', '{last}')""")
    adb.commit()
    cur.execute("""SELECT URL FROM images WHERE nA = '1'""")
    image = cur.fetchone()
    await message.edit(content=f"1\n{image[0]}")
    time.sleep(1)
    await message.add_reaction('⬅️')
    await message.add_reaction('➡️')
```

Здесь переменная хранится в базе данных sqlite3 и вместо обычных операции, происходят sql запросы, имитирующие операции с обычными переменными. Это сделано, чтобы "переменная" была независима и разделена на каждый пост. В таблице значение переменных связано с каждым созданным постом, где необходимо листать сообщение. Чтобы изменялось только нужное сообщение, а не все, я сделал проверку id поста с постом, где поставили реакцию. Если совпадает, то можно менять.

Не рекомендую повторять это, но оно работает.

→ Ссылка