Создание нескольких inline-кнопок по нажатию. Aiogram
я хочу реализовать такие же inline-кнопки, как и в этом боте: https://t.me/CubeDice_Bot. Т.е при нажатии на обыкновенную кнопку, создавать inline-кнопку. Я совершил попытку это реализовать, но столкнулся с проблемой. Если два пользователя создают "комнаты", то старые "комнаты" тоже переименовываются. Я уверен, что сама моя задумка неверна, буду рад хоть каким-то мыслям!
Основной файл
#CREATE ROOMS
global message_list #COUNTER (переделать в БД)
message_list = []
global count_list
count_list = [1, 2, 3, 4, 5] #Костыль
async def create_rooms(message: types.Message):
#COUNTER
message_list.append(message.text)
count = len(message_list)
#CREATE INLINE BUTTONS
if count == 1:
but1 = await in_kb.test(message.from_user.first_name, count_list)
await message.answer('Список комнат:\n➖➖➖➖➖➖➖➖➖➖➖', reply_markup = but1[0])
if count == 2:
but2 = await in_kb.test(message.from_user.first_name, count_list)
await message.answer('Список комнат:\n➖➖➖➖➖➖➖➖➖➖➖', reply_markup = but2[1])
if count == 3:
but3 = await in_kb.test(message.from_user.first_name, count_list)
await message.answer('Список комнат:\n➖➖➖➖➖➖➖➖➖➖➖', reply_markup = but3[2])
if count == 4:
but4 = await in_kb.test(message.from_user.first_name, count_list)
await message.answer('Список комнат:\n➖➖➖➖➖➖➖➖➖➖➖', reply_markup = but4[3])
if count == 5:
but5 = await in_kb.test(message.from_user.first_name, count_list)
await message.answer('Список комнат:\n➖➖➖➖➖➖➖➖➖➖➖', reply_markup = but5[4])
if count > 5:
await message.answer('Больше пяти комнат создавать нельзя!')
#CALLBACK ANSWER TO INLINE BUTTONS
@dp.callback_query_handler(Text(contains=f'{message.from_user.first_name}&{count_list[0]}'))
async def join_room1(callback_query: types.CallbackQuery):
await callback_query.answer(f'Вы вошли в комнату №{count_list[0]}', show_alert=True)
@dp.callback_query_handler(Text(contains=f'{message.from_user.first_name}&{count_list[1]}'))
async def join_room2(callback_query: types.CallbackQuery):
await callback_query.answer(f'Вы вошли в комнату №{count_list[1]}', show_alert=True)
@dp.callback_query_handler(Text(contains=f'{message.from_user.first_name}&{count_list[2]}'))
async def join_room3(callback_query: types.CallbackQuery):
await callback_query.answer(f'Вы вошли в комнату №{count_list[2]}', show_alert=True)
@dp.callback_query_handler(Text(contains=f'{message.from_user.first_name}&{count_list[3]}'))
async def join_room4(callback_query: types.CallbackQuery):
await callback_query.answer(f'Вы вошли в комнату №{count_list[3]}', show_alert=True)
@dp.callback_query_handler(Text(contains=f'{message.from_user.first_name}&{count_list[4]}'))
async def join_room5(callback_query: types.CallbackQuery):
await callback_query.answer(f'Вы вошли в комнату №{count_list[4]}', show_alert=True)
**Создание кнопки**
async def test(user_name, count_list):
a1 = InlineKeyboardButton(f'{user_name} | комната №{count_list[0]}',\
callback_data = f'{user_name}&{count_list[0]}')
a2 = InlineKeyboardButton(f'{user_name} | комната №{count_list[1]}',\
callback_data = f'{user_name}&{count_list[1]}')
a3 = InlineKeyboardButton(f'{user_name} | комната №{count_list[2]}',\
callback_data = f'{user_name}&{count_list[2]}')
a4 = InlineKeyboardButton(f'{user_name} | комната №{count_list[3]}',\
callback_data = f'{user_name}&{count_list[3]}')
a5 = InlineKeyboardButton(f'{user_name} | комната №{count_list[4]}',\
callback_data = f'{user_name}&{count_list[4]}')
room_kb1 = InlineKeyboardMarkup()
room_kb2 = InlineKeyboardMarkup()
room_kb3 = InlineKeyboardMarkup()
room_kb4 = InlineKeyboardMarkup()
room_kb5 = InlineKeyboardMarkup()
room_kb1.add(a1)
room_kb2.add(a1).add(a2)
room_kb3.add(a1).add(a2).add(a3)
room_kb4.add(a1).add(a2).add(a3).add(a4)
room_kb5.add(a1).add(a2).add(a3).add(a4).add(a5)
room_list =[room_kb1, room_kb2, room_kb3, room_kb4, room_kb5]
return room_list
Ответы (1 шт):
Автор решения: VlasssaDassa
→ Ссылка
Главный файл В callback можно написать свою логику
import sqlite_db as sq
import inline_kb as in_kb
#CREATE ROOMS
async def create_rooms(message: types.Message):
count = await sq.sql_count_rooms(message.from_user.id)
if count[0] < 5:
await sq.sql_counter_rooms(message.from_user.id)
await message.answer('Комната создана ✅')
else:
await message.answer('Больше пяти комнат создавать нельзя!')
#PRINT LIST ROOMS
async def list_rooms(message: types.Message):
data = await sq.sql_data()
await message.answer('Список комнат:\n---------', reply_markup = in_kb.rooms(data))
#CALLBACK ANSWER
@dp.callback_query_handler(lambda call: True)
async def stoptopupcall(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id) #-Ответ.
userinfo = await sq.sql_test(callback_query.data[:-2]) #-Ищет инфу в БД по tgid
if userinfo: #-если инфа есть, даёт её, если нет, то не даёт.
await bot.send_message(callback_query.from_user.id, f'ID: {userinfo[0]}\nName: {userinfo[1]}\nTgid:{userinfo[2]}')
Клавиатура Генерация клавиатуры через цикл
def rooms(data):
rooms = InlineKeyboardMarkup()
rooms.row_width = 1
for i in data:
for count in range(1, i[3]+1):
rooms.add(InlineKeyboardButton(f'{i[1]} | комната №{count}', callback_data=f'{i[2]}${count}'))
return rooms
Файл с БД
#Choice all
async def sql_data():
return cur.execute('SELECT * FROM Create_rooms')
#Count
async def sql_count_rooms(id):
return cur.execute('SELECT count FROM Create_rooms WHERE tgid = ?', (id, )).fetchone()
#Counter
async def sql_counter_rooms(id):
res = cur.execute('SELECT count FROM Create_rooms WHERE tgid == ?', (id, )).fetchone()
print (res)
count = res[0]
count += 1
cur.execute('UPDATE Create_rooms SET count = ? WHERE tgid = ?', (count, id))
base.commit()
#test
async def sql_test(test):
return cur.execute('SELECT * FROM Create_rooms WHERE tgid = ?', (test, )).fetchone()
