Страницы с 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 шт):
Я так и не нашёл нормальный и адекватный способ это реализовать, поэтому сделал как любой уважающий себя нелюдь - сделал мега костыль:
@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 поста с постом, где поставили реакцию. Если совпадает, то можно менять.
Не рекомендую повторять это, но оно работает.