import sqlite3
from aiogram import Bot, types, executor
from aiogram.dispatcher import Dispatcher
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup, CallbackQuery
bot = Bot(token='token')
dp = Dispatcher(bot)
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
cursor.execute('CREATE TABLE IF NOT EXISTS buttons (id INTEGER PRIMARY KEY, text TEXT, active INTEGER DEFAULT 0)')
conn.commit()
def get_buttons():
buttons = []
cursor.execute('SELECT * FROM buttons')
for row in cursor.fetchall():
button_text = row[1]
active = bool(row[2])
button = InlineKeyboardButton(text=button_text, callback_data=f'toggle_{button_text}')
if active:
button.text = ' ' + button_text
else:
button.text = ' ' + button_text
buttons.append(button)
return buttons
def toggle_button(button_text):
cursor.execute('SELECT active FROM buttons WHERE text = ?', (button_text,))
active = bool(cursor.fetchone()[0])
new_active = int(not active)
cursor.execute('UPDATE buttons SET active = ? WHERE text = ?', (new_active, button_text))
conn.commit()
@dp.message_handler(commands=['start'])
async def start_command(message: types.Message):
buttons = get_buttons()
keyboard = InlineKeyboardMarkup(row_width=2)
keyboard.add(*buttons)
await message.answer('Выберите кнопки:', reply_markup=keyboard)
@dp.callback_query_handler(lambda c: c.data.startswith('toggle_'))
async def process_callback_toggle(callback_query: CallbackQuery):
button_text = callback_query.data.replace('toggle_', '')
toggle_button(button_text)
buttons = get_buttons()
keyboard = InlineKeyboardMarkup(row_width=2)
but = InlineKeyboardButton(text='Дальше', callback_data='go')
keyboard.add(*buttons)
keyboard.add(but)
await bot.edit_message_reply_markup(chat_id=callback_query.message.chat.id, message_id=callback_query.message.message_id, reply_markup=keyboard)
@dp.callback_query_handler(lambda c: c.data == 'go')
async def process_callback_go(callback_query: CallbackQuery):
active_buttons = []
cursor.execute('SELECT text FROM buttons WHERE active = 1')
for row in cursor.fetchall():
active_buttons.append(row[0])
data = 'go_' + '_'.join(active_buttons)
await bot.answer_callback_query(callback_query.id)
await bot.send_message(callback_query.message.chat.id, f'Вы выбрали: {", ".join(active_buttons)}', reply_markup=None)
if name == 'main':
executor.start_polling(dp, skip_updates=True)
суть в том что я беру activate с базы данных, но для каждого пользователя должен быть свой выбор. Мне не нужно сохранять то что один раз выбрал пользователь, так что хранить activate для каждого пользователя тоже не выход. Может быть как то с помощью call.data? Буду благодарен за помощь, сам не могу понять что делать