Не срабатывает обработчик кнопки в других чатах aiogram, python

Рейтинг: 0Ответов: 1Опубликовано: 27.03.2023

Всем привет, может кто сталкивался , ботом по чатам отправляется сообщение с заказом и кнопкой принять, как обрабатывать эту кнопку от разных юзеров? Ниже код, срабатывает только если подтверждаешь заявку в текущем чате, обработка с других чатов не работает. Подскажите куда копать.

@dp.message_handler(commands=['pub'])
async def pub_r(message: types.Message):
    ADMIN = 69727700000
    mid = message.chat.id
    if ADMIN == mid:
        await message.answer("Сколько работников нужно?\n(Подсказка: 2 )")
        await UserState.col.set()

@dp.message_handler(state=UserState.col)
async def g_col(message: types.Message, state: FSMContext):
    await state.update_data(col=message.text)
    await message.answer("Введите адрес заявки?\n(Подсказка: Мариупольское шс. д.27а )")
    await UserState.next()

@dp.message_handler(state=UserState.ad)
async def g_ad(message: types.Message, state: FSMContext):
    await state.update_data(ad=message.text)
    await message.answer("Что будем делать?\n(Подсказка: описать задачу )")
    await UserState.next()

@dp.message_handler(state=UserState.task)
async def g_task(message: types.Message, state: FSMContext):
    await state.update_data(task=message.text)
    await message.answer("Когда необходимо начать работы?\n(Подсказка: в течении часа, либо указать дату и время )")
    await UserState.next()

@dp.message_handler(state=UserState.start)
async def g_start(message: types.Message, state: FSMContext):
    await state.update_data(start=message.text)
    await message.answer("Оплата?\n(Подсказка: 235.00 р./час, минималка 2 часа )")
    await UserState.next()


@dp.message_handler(state=UserState.cash)
async def g_finall(message: types.Message, state: FSMContext):
    await state.update_data(cash=message.text)
    data = await state.get_data()
    await message.answer(f" Предварительный просмотр заявки \n\n"
                         f"Всего работников нужно: {data['col']}\n"
                         f"Адрес: {data['ad']}\n" 
                         f"Что будем делать: {data['task']}\n"
                         f"Начало работ: {data['start']}\n"
                         f"Оплата: {data['cash']}",reply_markup = InlineKeyboardMarkup(inline_keyboard=[[
                         InlineKeyboardButton(text="Заполнить заново", callback_data='edit'),
                         InlineKeyboardButton(text="Публикация", callback_data="pub")]]))
    print(data)
    await UserState.next()

@dp.callback_query_handler(lambda c: c.data == 'edit',state=UserState.clback)
async def edit(call: types.CallbackQuery,state: FSMContext):
    await call.message.answer('Сколько работников нужно?')
    await UserState.col.set()




@dp.callback_query_handler(lambda c: c.data == 'pub',state=UserState.clback)
async def pub(call: types.CallbackQuery,state: FSMContext):
    markup = InlineKeyboardMarkup(row_width=1)
    item1 = InlineKeyboardButton("Принять заказ", callback_data='zakaz')
    item2 = InlineKeyboardButton("Правила", callback_data='2')
    markup.add(item1, item2)
    data = await state.get_data()
    await call.message.answer('Заявка отправлена')
    query_chat_id = await chat_id_selectq()
    for chats in query_chat_id:
        if chats[1] != 0:
            await bot.send_message(chats[0],f"Всего работников нужно:{data['col']}\nАдрес: {data['ad']}\nЧто делать:{data['task']}\nНачало работ:{data['start']}\nОплата:{data['cash']}",reply_markup = markup)
    #await state.finish()
    await UserState.next()

@dp.callback_query_handler(lambda c: c.data == 'zakaz',state=UserState.zakaz)
async def pub(call: types.CallbackQuery,state: FSMContext):
    markup = InlineKeyboardMarkup(row_width=1)
    item1 = InlineKeyboardButton("Одобрить", callback_data='approve')
    item2 = InlineKeyboardButton("Отклонить", callback_data='reject')
    markup.add(item1, item2)
    query_user = await user_profile(chat_id=call.message.chat.id)
    print(query_user)
    await bot.send_message(6972770000,f"Привет, я готов взять заказ\nИмя:{query_user[1]}\nФамилия: {query_user[2]}\nДата рождения:{query_user[3]}\nТелефон:{query_user[4]}",reply_markup = markup)
    await state.finish()
    #await UserState.next()

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

Ответы

▲ 0

нужно сохранять информацию о чате (id чата, откуда пришел запрос) и юзере, который нажал на кнопку. Предлагаю за сохранение взять бд

from sqlalchemy import create_engine, Column, Integer, String, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class Order(Base):
    __tablename__ = 'orders'

    id = Column(Integer, primary_key=True)
    user_id = Column(Integer)
    chat_id = Column(Integer)
    col = Column(Integer)
    ad = Column(String)
    task = Column(String)
    start = Column(String)
    cash = Column(String)
    status = Column(Boolean, default=False)

engine = create_engine('postgresql://user:password@localhost/dbname')
Session = sessionmaker(bind=engine)
session = Session()

@dp.callback_query_handler(lambda c: c.data == 'pub',state=UserState.clback)
async def pub(call: types.CallbackQuery,state: FSMContext):
    data = await state.get_data()
    order = Order(user_id=call.message.chat.id, chat_id=data['chat_id'], col=data['col'], ad=data['ad'], task=data['task'], start=data['start'], cash=data['cash'])
    session.add(order)
    session.commit()
    markup = InlineKeyboardMarkup(row_width=1)
    item1 = InlineKeyboardButton("Принять заказ", callback_data='zakaz')
    item2 = InlineKeyboardButton("Правила", callback_data='2')
    markup.add(item1, item2)
    await call.message.answer('Заявка отправлена')
    query_chat_id = await chat_id_selectq()
    for chats in query_chat_id:
        if chats[1] != 0:
            await bot.send_message(chats[0],f"Всего работников нужно:{data['col']}\nАдрес: {data['ad']}\nЧто делать:{data['task']}\nНачало работ:{data['start']}\nОплата:{data['cash']}",reply_markup = markup)
    #await state.finish()
    await UserState.next()