Доработать бота для Telegram (диалоги с чатом поддержки)

5 000 руб. за проект
11 июня 2022, 00:57 • 5 откликов • 31 просмотр
Имеется бот, который проводит покупки через себя, отправляет ссылки на ресурсы по запросу, и пересылает сообщения в личку менеджерам поддержки (и от них обратно пользователям), в режиме поддержки. Python + Aiogram.

@dp.message_handler(state=SupportChat.dialogue)
async def any_message_answer(message: types.Message, state: FSMContext):
if 'Завершить' not in message.text:
if message.from_user.id in config.managers_id:
if message.reply_to_message:
try:
parsing_target = '[(]{1}(.{0,20})[)]{1}'
reply_id = re.findall(parsing_target, str(message.reply_to_message.text))
username_parsing = '([@]{1}.{0,30})[ (]{2}'
username = re.findall(username_parsing, str(message.reply_to_message.text))
await bot.send_message(chat_id=reply_id[0],
text='Ответ от менеджера: \n\n'
f'{message.text}')
try:
await bot.send_message(chat_id=message.from_user.id,
text=f'Ваш ответ для {username[0]} был успешно доставлен')
message_set = False
reply_message_id = message.reply_to_message.message_id
message_list = db_api.get_all_messages()
for message_data in message_list:
local_message_list = ast.literal_eval(message_data[1])
for local_messages in local_message_list:
if local_messages['message_id'] == reply_message_id:
messages_set_id = message_data[0]
message_set = True
if message_set:
old_message_data = db_api.get_singe_message(id=messages_set_id)
local_old_message_list = ast.literal_eval(old_message_data[1])
old_text = old_message_data[2]
for old_local_messages in local_old_message_list:
await bot.edit_message_text(chat_id=old_local_messages['chat_id'], message_id=old_local_messages['message_id'], text=f"{old_text}\n\n✓")
db_api.delete_message(id=messages_set_id)

except IndexError:
await bot.send_message(chat_id=message.from_user.id,
text=f'Ваш ответ для {reply_id[0]} был успешно доставлен')
except IndexError:
await bot.send_message(chat_id=message.from_user.id,
text=f"Не удается найти идентификатор пользователя или имя пользователя в этом сообщении")
else:
await bot.send_message(chat_id=message.from_user.id,
text='Вы можете только отвечать на сообщения')
else:
if await state.get_state() == SupportChat.dialogue.state:
current_messages_list = []
for managers in config.managers_id:
text_to_send = f"Сообщение от @{message.from_user.username} \({message.from_user.id}\):\n\n{message.text}"
message_data = (await bot.send_message(chat_id=managers,
text=text_to_send))
current_messages_list.append({
'message_id': message_data['message_id'],
'chat_id': message_data['chat']['id']
})
db_api.add_message(message_data=str(current_messages_list), text=text_to_send)
await bot.send_message(chat_id=message.from_user.id,
text='Ваше сообщение успешно доставлено менеджеру')
else:
await SupportChat.idle.set()
await message.answer(
f"Общение с поддержкой завершено",
reply_markup=get_keyboard())

Данный код работает, но не совсем хорошо. Есть ряд проблем: после завершения общения с поддержкой бот подвисает и нельзя далее с ним работать. Сообщения должны отправляться в специальный чат с сотрудниками поддержки, и они отвечают реплаем на сообщения от бота. Ответы должны отправляться через бота обратившимся людям, возможно нескольким одновременно. Также необходимо, чтобы данный функционал распространялся на отправляемый пользователями медиаконтент - фото, аудио, видео. И после нажатия на кнопку "Завершить поддержку" (обычную или инлайновую, прикрепляемую к каждому сообщению от бота) бот переходил в режим выбора существующего меню. Для работы данной части кода используется файловая sqllite, можно использовать уже подключенную БД postgresql, можно использовать только память, можно продолжить с sqllite. Сохранение состояния бота после его перезагрузки не обязательно и не принципиально. Он может забывать всё что было в процессе общения до перезагрузки.
Отзывы
Специалист повторно помог решить поставленную задачу, всё было сделано отлично, в срок и с душой. Рекомендую!
2 года назад
R50 364a7e6607ce2f8dd460a8009bf7e0d1
Фрилансер
 
2 года назад