Задать вопрос
@xx_RuBiCoN_xx

Почему не срабатывает хандлер после функции?

Пытаюсь сделать чат поддержки в боте телеграм. Задумка такая: пользователь тыкает текст "Спросить оператора" пишет сообщение, оно пересылается операторам с инлайн кнопкой "подключиться к диалогу". Любой свободный оператор тыкает эту кнопку, ему и пользователю присваивается статус in_dialog и после этого стоит хандлер, который должен срабатывать на сообщения оператора и пользователя если их статусы == in_dialog. Но почему то не срабатывает. Думал ошибка в условии хандлера - заменил на True - не помогло - молчит. Вызвал принудительно функцию которая внутри хандлера - переслало автоматом сразу последнее сообщение и оператору, и пользователю. Ставил хандлер в самое начала кода - ничего, ставил хандлер внутрь условия во время подключения оператора к пользователю - ничего. Принтов натыкал везде - таблицы и айдишники передаёт правильно. Да и если бы не правильно - оно бы не переслало сообщения друг другу во время принудительного вызова.

Вопрос: что не так? Почему хандлер не срабатывает?

P.S. Основной код у меня в файле start.py. Там стоит вызов функции supportConnect(bot, message), а уже в файле operatorAdd.py вот этот код:

spoiler
import telebot
from telebot import types
from btn import token, text48, text49, text50, text53, text54, text55, text51, cancel_btn, join_dialog_btn

bot = telebot.TeleBot(token)


operators_id = [тут ид]
operator_mode = {}
user_mode = {}


def supportConnect(bot, message):
   global user_help_id
   user_help_id = message.chat.id
   print('user_help_id = message.chat.id', user_help_id)
   remove_keyboard = types.ReplyKeyboardRemove()
   keyboard = types.InlineKeyboardMarkup()
   keyboard.add(cancel_btn)
   bot.send_message(message.chat.id, text=text48, reply_markup=remove_keyboard)
   bot.send_message(message.chat.id, text=text49, reply_markup=keyboard)
   bot.register_next_step_handler(message, lambda msg: supportWait(bot, msg))

def supportWait(bot, message):
   for operator_id in operators_id:
      keyboard = types.InlineKeyboardMarkup()
      keyboard.add(join_dialog_btn)
      bot.send_message(operator_id, f"Поступило новое сообщение в службу поддержки.\n\nUser ID: {message.from_user.id}\nUsername: @{message.from_user.username}\n\nВопрос клиента:\n<b>{message.text}</b>", parse_mode="HTML", reply_markup=keyboard)
   bot.send_message(message.chat.id, text=text50)

   @bot.callback_query_handler(func=lambda call: call.data == 'join_dialog_btn')
   def join_dialog(call):
      print('def join_dialog(call)')
      # Получаем идентификатор оператора и пользователя
      global operator
      operator = call.message.chat.id
      print('operator_id = call.message.chat.id', operator)
      global user_help_id
      print('global user_help_id', user_help_id)
      # Проверяем, наличие и состояние оператора
      if operator not in operator_mode:
         print('operator_mode', operator_mode)
         operator_mode[operator] = "not_in_dialog"
         print("дали нот ин")

      if operator in operator_mode:
         match operator_mode[operator]:
            case 'not_in_dialog':
               print('if')
               # Отправляем сообщение оператору о подключении к диалогу
               bot.send_message(operator, text53)
               # Отправляем сообщение пользователю о подключении оператора
               bot.send_message(user_help_id, text51)
               # Устанавливаем состояние оператора как "в диалоге"
               print('operator_mode[operator]', operator_mode[operator])
               operator_mode[operator] = 'in_dialog'
               print('operator_mode', operator_mode)
               # Добавляем пользователя в user_mode
               print('user_help_id', user_help_id)
               user_mode[user_help_id] = 'in_dialog'
               print('user_mode', user_mode)

            case 'in_dialog':
               print('elif')
               # Отправляем сообщение оператору о том, что он уже в диалоге
               bot.send_message(operator, text54)
      
      elif user_help_id in user_mode:
         match user_mode[user_help_id]:
            case 'in_dialog':
               print('elif2')
               # Отправляем сообщение оператору о том, что кто-то уже подключился
               bot.send_message(operator, text55)

# Обработчик сообщений от пользователя
@bot.message_handler(func=lambda message: user_mode[user_help_id] and operator_mode[operator] == 'in_dialog')
def dialog_message(message):
   if operator is not None:
      bot.send_message(operator, message.text)
   else:
      bot.send_message(user_help_id, "Оператор не подключен.")

   if user_help_id is not None:
      bot.send_message(user_help_id, message.text)
   else:
      bot.send_message(operator, "User Help ID не установлен.")
  • Вопрос задан
  • 42 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
RimMirK
@RimMirK
Вроде человек. Вроде учусь. Вроде пайтону
декораторы не так работают.
и еще
- bot.register_next_step_handler(message, lambda msg: supportWait(bot, msg))
+ bot.register_next_step_handler(message, supportWait, msg, bot)
- def supportWait(bot, message):
+ def supportWait(message, bot: telebot.TeleBot):
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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