@TemaGerb

Как добавлять кнопки в aiogram из Sqlite3?

Я хочу сделать что-то типа интернет магазина. Когда пользователь вводит команду /start бот отправляет ему список кнопок из 3 штук городов. Выбирая одну из них, ему должно показывать товары. Я сделал админ панель и добавление товаров. Данные сохраняются у меня в базу данных. Трудом сделал добавление кнопок, но она отправляется сразу после того, как добавил. Мне же нужно, чтобы они появлялись в начальных подкнопках.

spoiler
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.dispatcher import FSMContext
from keyboards import *
import database as db
from database import *
from aiogram.types import InlineKeyboardMarkup,ReplyKeyboardMarkup,InlineKeyboardButton
import os
import sqlite3 as sq
from sqlite3 import *
storage = MemoryStorage()
bot = Bot('')
dp = Dispatcher(bot=bot, storage=storage)
ADMIN_ID = 


async def on_startup(_):
    await db.db_start()
    print('Бот успешно запущен!')


class NewOrder(StatesGroup):
    type = State()
    item = State()
    rayon = State()
    tip = State()
    buttons_order = State()
    sendmoney = State()
    task = State()

main_inline_markup = InlineKeyboardMarkup(row_width=2)
@dp.message_handler(commands=['start'])
async def cmd_start(message: types.Message):
    await db.cmd_start_db(message.from_user.id)
    await message.answer_sticker('CAACAgIAAxkBAAMpZBAAAfUO9xqQuhom1S8wBMW98ausAAI4CwACTuSZSzKxR9LZT4zQLwQ')
    await message.answer(f'{message.from_user.first_name}, добро пожаловать в магазин кроссовок!',
                         reply_markup=inline_markup)
    if message.from_user.id == ADMIN_ID:
        await message.answer('Вы авторизовались как администратор!', reply_markup=main_admin)


@dp.callback_query_handler(lambda callback_query: callback_query.data == 'doneck')
async def process_doneck_callback(callback_query: types.CallbackQuery):
    # Ваша логика для обработки нажатия на кнопку "doneck"
    await bot.answer_callback_query(callback_query.id, text="Вы выбрали Донецк")

    # Дополнительная логика, если необходимо
    # ...

    # Возможно, вы хотите отправить какое-то сообщение после нажатия кнопки
    await bot.send_message(callback_query.from_user.id, text="Вы выбрали Донецк")

@dp.message_handler(commands=['id'])
async def cmd_id(message: types.Message):
    await message.answer(f'{message.from_user.id}')


@dp.message_handler(text='Каталог')
async def catalog(message: types.Message):
    await message.answer('Выберите категорию', reply_markup=inline_markup)


@dp.message_handler(text='Корзина')
async def cart(message: types.Message):
    await message.answer('Корзина пуста!')


@dp.message_handler(text='Контакты')
async def contacts(message: types.Message):
    await message.answer('Покупать товар у него: @mesudoteach')


@dp.message_handler(text='Админ-панель')
async def contacts(message: types.Message):
    if message.from_user.id == ADMIN_ID:
        await message.answer('Вы вошли в админ-панель', reply_markup=admin_panel)
    else:
        await message.reply('Я тебя не понимаю.')

@dp.message_handler(text='Отмена',state=NewOrder)
async def back(message: types.Message, state: FSMContext):
    if message.text == 'Отмена':
        await state.finish()
        await message.answer(text='Добро пожаловать!',reply_markup=inline_markup)
        if message.from_user.id == ADMIN_ID:
            await message.answer(text='Админ панель возвращена',reply_markup=main_admin)
@dp.message_handler(text='Добавить товар')
async def item_add(message: types.Message):
    if message.from_user.id == ADMIN_ID:
        await NewOrder.type.set()
        await message.answer('Выберите город', reply_markup=inline_markup)
    else:
        await message.reply('Я тебя не понимаю.')

@dp.callback_query_handler(state=NewOrder.type)
async def type(callback: types.CallbackQuery, state: FSMContext):
    async with state.proxy() as data:
        data['type'] = callback.data
    await callback.message.answer(text='Напишите название товара',reply_markup=cancel)
    await NewOrder.next()
@dp.message_handler(state=NewOrder.item)
async def iteM(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['item'] = message.text
    await message.answer(text='Напишите название района',reply_markup=cancel)
    await NewOrder.next()
@dp.message_handler(state=NewOrder.rayon)
async def Rayon(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['rayon'] = message.text
    await message.answer(text='Введите тип',reply_markup=cancel)
    await NewOrder.next()
@dp.message_handler(state=NewOrder.tip)
async def tip(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['tip'] = message.text
    await message.answer(text='Введите значение',reply_markup=cancel)
    await NewOrder.next()
@dp.message_handler(state=NewOrder.buttons_order)
async def buttons_order(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['buttons_order'] = message.text
    await message.answer(text='Введите кнопки для подтверждения',reply_markup=cancel)
    await NewOrder.next()
@dp.message_handler(state=NewOrder.sendmoney)
async def sendmoney(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['sendmoney'] = message.text
    await message.answer(text='Деньги слать сюда',reply_markup=cancel)
    await NewOrder.next()
@dp.message_handler(state=NewOrder.task)
async def task(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['task'] = message.text
    # Вызов функции для сохранения данных в базе данных
    await db.add_item_don(state)
    # Получаем имя товара из базы данных
    item_name = data.get('item')
    # Создаем подкнопку для инлайн-клавиатуры
    new_item_inline_button = InlineKeyboardButton(item_name, callback_data=f"{item_name}")
    # Добавляем подкнопку к глобальной инлайн-клавиатуре
    main_inline_markup.insert(new_item_inline_button)

    # Обновляем клавиатуру у кнопки "Донецк"
    await bot.send_message(
        chat_id=message.chat.id,
        text=f'Товар {item_name} создан',
        reply_markup=main_inline_markup
    )
    await state.finish()

if __name__ == '__main__':
    executor.start_polling(dp, on_startup=on_startup, skip_updates=True)

Вот что у меня в базе данных:
spoiler
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.dispatcher import FSMContext
import sqlite3 as sq
import aiosqlite


async def db_start():
    global db, cur
    db = await aiosqlite.connect('tg.db')
    cur = await db.cursor()

    await cur.execute("CREATE TABLE IF NOT EXISTS accounts("
                      "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                      "tg_id INTEGER, "
                      "cart_id TEXT)")
    await cur.execute("CREATE TABLE IF NOT EXISTS items_doneck("
                      "i_id INTEGER PRIMARY KEY AUTOINCREMENT, "
                      "item TEXT, "
                      "rayon TEXT, "
                      "tip TEXT, "
                      "buttons_order TEXT, "
                      "sendmoney TEXT, "
                      "task TEXT) ")
    await cur.execute("CREATE TABLE IF NOT EXISTS items_makeevka("
                      "i_id INTEGER PRIMARY KEY AUTOINCREMENT, "
                      "item TEXT, "
                      "rayon TEXT, "
                      "tip TEXT, "
                      "buttons_order TEXT, "
                      "sendmoney TEXT, "
                      "task TEXT) ")
    await cur.execute("CREATE TABLE IF NOT EXISTS items_gorl("
                      "i_id INTEGER PRIMARY KEY AUTOINCREMENT, "
                      "item TEXT, "
                      "rayon TEXT, "
                      "tip TEXT, "
                      "buttons_order TEXT, "
                      "sendmoney TEXT, "
                      "task TEXT) ")
    await db.commit()

async def cmd_start_db(user_id):
    user = await cur.execute("SELECT * FROM accounts WHERE tg_id == {key}".format(key=user_id))
    user = await user.fetchone()
    if not user:
        await cur.execute("INSERT INTO accounts (tg_id) VALUES ({key})".format(key=user_id))
        await db.commit()

async def add_item_don(state):
    async with state.proxy() as data:
        try:
            await cur.execute("INSERT INTO items_doneck (item, rayon, tip, buttons_order, sendmoney, task) VALUES (?, ?, ?, ?, ?, ?)",
                              (data['item'], data['rayon'], data['tip'], data['buttons_order'], data['sendmoney'], data['task']))
            await db.commit()
        except Exception as e:
            print("Error while adding item to items_don:", e)
  • Вопрос задан
  • 83 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы