@Frik44

Как можно заменить использование базы данных?

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? Буду благодарен за помощь, сам не могу понять что делать
  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
@olololollloo
пользуйтесь state
он для каждого юзера будет своим
from aiogram.dispatcher.filters.state import StatesGroup, State

добавляем в самиобработчики state: FSMContext
@dp.callback_query_handler(lambda callback_query: callback_query.data.startswith('LoadYoutube_'), state='*')
async def LoadYoutube_callback(tg: types.CallbackQuery, state: FSMContext):


потом где нужно сохранить:
async with state.proxy() as data:
    data = 'text'

и где нужно забрать:
async with state.proxy() as data:
    text = data
print(text)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы