Задать вопрос
a777mp198
@a777mp198
Python developer

Возможно ли добавить функцию в бота aiogram, которая будет удалять/изменять текст сообщения?

Всем добрый день!
Доброго времени суток! У меня есть телеграм-бот с базой данных. В базе данных хранятся "заявки", которые могут просматривать одновременно несколько пользователей, для дальнейшей обработки этих заявок. При выведении информации (заявок) из БД - к каждому сообщению (заявке) прикреплена 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)
  • Вопрос задан
  • 334 просмотра
Подписаться 1 Простой 4 комментария
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Нужно хранить в БД ID всех сообщений бота консультантам, которые описывают данную заявку. При обработке заявки пройтись по списку ID для данной заявки и удалить сообщение (ну или отредактировать).
Простейшая таблица вида "ID сообщения - ID заявки" тут справится.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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