Всем добрый день!
Доброго времени суток! У меня есть телеграм-бот с базой данных. В базе данных хранятся "заявки", которые могут просматривать одновременно несколько пользователей, для дальнейшей обработки этих заявок. При выведении информации (заявок) из БД - к каждому сообщению (заявке) прикреплена inline-кнопка. Служит она для того, чтобы изменить статус заявки после её обработки. Вопрос заключается в следующем: с помощью каких инструментов можно реализовать изменение текста сообщений (заявки) после её обработки у других пользователей?
К примеру:
Пользователь 1 вывел 3 заявки из БД.
В это время
Пользователь 2 так же, вывел те же 3 заявки из БД.
Предположим,
Пользователь 1 обработал Заявку №2, и нажал inline-кнопку "Заявка №2 обработана".
И нужно чтобы после нажатия кнопки текст Заявки №2 изменился на "Заявка №2 обработана" как у
Пользователя 1, так и у
Пользователя 2, в его диалоге с ботом. Данная функция необходима для того, чтобы не производилось несколько звонков от разных операторов по одной и той же заявке.
Вот пример кода, с помощью которого производится вывод информации (заявок) из БД и их дальнейшая "обработка":
@dp.callback_query_handler(text='applications')
async def sql_read(call):
conn = sqlite3.connect('reg_database.db', check_same_thread=False)
cur = conn.cursor()
result = cur.execute('SELECT * FROM callback WHERE department="2" AND status="no"').fetchone()
if result is None:
await call.message.edit_text('<b>Все заявки обработаны.</b>\nКак только появится новая заявка - '
'Вы получите соответствующие уведомление.')
else:
await call.message.edit_text('Заявки, по которым Вы ещё не звонили: ')
for ret in cur.execute('SELECT * FROM callback WHERE department="2" AND status="no"').fetchall():
await bot.send_message(call.message.chat.id, f'<b>Заявка №{ret[0]}</b>\n<b>Н/Д №</b> <i>{ret[2]}</i>;\n<b>Телефон:</b> <i>{ret[3]}</i>;\n'
f'<b>Имя:</b> <i>{ret[4]}</i>;\n<b>Комментарий:</b> <i>{ret[5]}</i>.', reply_markup=InlineKeyboardMarkup().add(
InlineKeyboardButton(f'Заявка №{ret[0]} обработана', callback_data=f'processed {ret[0]}')
))
await asyncio.sleep(0.5)
conn.commit()
@dp.callback_query_handler(text='application')
async def new_application(call):
conn = sqlite3.connect('reg_database.db', check_same_thread=False)
cur = conn.cursor()
cur.execute('SELECT max(id) FROM callback WHERE department="2" AND status="no"')
result = cur.fetchone()[0] # id последней записи
if result is None:
await call.message.edit_text('<b>Все заявки обработаны.</b>\nКак только появится новая заявка - '
'Вы получите соответствующие уведомление.')
else:
await call.message.edit_text('Последняя добавленная заявка: ')
for ret in cur.execute(f'SELECT * FROM callback WHERE id={result}').fetchall():
await bot.send_message(call.message.chat.id, f'<b>NEW Заявка №{ret[0]}</b>\n<b>Н/Д №</b> <i>{ret[2]}</i>;\n<b>Телефон:</b> <i>{ret[3]}</i>;\n'
f'<b>Имя:</b> <i>{ret[4]}</i>;\n<b>Комментарий:</b> <i>{ret[5]}</i>.', reply_markup=InlineKeyboardMarkup().add(
InlineKeyboardButton(f'Заявка №{ret[0]} обработана', callback_data=f'processed {ret[0]}')
))
conn.commit()
async def application_update(data):
conn = sqlite3.connect('reg_database.db', check_same_thread=False)
cur = conn.cursor()
cur_day = datetime.now()
cur.execute('''UPDATE callback SET status="yes" WHERE id == ?''', (data,))
cur.execute(f'''UPDATE callback SET cur_time="{cur_day}" WHERE id == ?''', (data,))
conn.commit()
@dp.callback_query_handler(lambda x: x.data and x.data.startswith('processed '))
async def application_yes(call: CallbackQuery):
await application_update(call.data.replace('processed ', ''))
cur_day = datetime.now()
cur_data = date.today()
cur_time = cur_day.time().replace(microsecond=0)
await call.message.edit_text(f'<b>Заявка №{call.data.replace("processed ", "")} обработана.</b>\nБольше Вы её не увидите.\n'
f'Дата: {cur_data};\nВремя: {cur_time}.')
await call.answer(text=f'Заявка №{call.data.replace("processed ", "")} обработана.', show_alert=True)