for operator in operators_id:
keyboard = types.InlineKeyboardMarkup()
keyboard.add(join_dialog_btn)
for operators in operators_id:
if user_help_id in user_mode and user_mode[user_help_id] != 'not_in_dialog':
user_mode[user_help_id] = "not_in_dialog"
if user_help_id in user_mode and user_mode[user_help_id] != 'not_in_dialog':
user_mode[user_help_id] = "not_in_dialog"
global operator
Вынести все обработчики на верхний уровень
Отделить логику оператора от логики пользователя
@bot.message_handler(func=lambda message: message.from_user.id == operator)
, а логика пользователя в @bot.message_handler(func=lambda message: message.from_user.id == user_help_id)
. Ну и часть в условиях if elif, т.к. не вижу вариантов по другому их устроитьГде-то хранить соответствие chat_id пользователя - chat_id назначенного оператора
Не забывать, что пользователь может успеть оставить несколько сообщений до того, как оператор примет запрос - их все нужно не потерять
...нужно много чего дорабатывать, включая сценарии завершения работы, переключения на другого оператора итд итп, контроль за тем, чтобы пользователя не взяли два оператора одновременно
if user_help_id in user_mode:
match operator_mode[operator]:
case 'in_dialog':
bot.answer_callback_query(call.id, text54)
match user_mode[user_help_id]:
case 'in_dialog':
bot.answer_callback_query(call.id, text55)
case 'end_dialog':
bot.answer_callback_query(call.id, text59)
@bot.callback_query_handler(func=lambda call: call.data == 'join_dialog_btn')
@bot.message_handler(content_types=["text"])
. Соответственно после этого все уточняющие хандлеры типа @bot.message_handler(func=lambda message: message.text == text11)
не срабатывали. Изменил, поправил - заработало. Пасыба) ...
print('user_mode:', user_mode, '| operator_mode:', operator_mode)
print('user_help_id', user_help_id, '| operator', operator)
# Обработчик сообщений от оператора
@bot.message_handler(func=lambda message: message.from_user.id == operator)
def dialog_message_operator(message):
operator_text = message.text
print('message.text operatora: ', message.text)
if user_mode[user_help_id] and operator_mode[operator] == 'in_dialog':
bot.send_message(user_help_id, operator_text)
else:
bot.send_message(operator, 'Что-то пошло не так...')
# Обработчик сообщений от пользователя
@bot.message_handler(func=lambda message: message.from_user.id == user_help_id)
def dialog_message_user(message):
user_help_id_text = message.text
print('message.text usera: ', message.text)
if user_mode[user_help_id] and operator_mode[operator] == 'in_dialog':
bot.send_message(operator, user_help_id_text)
else:
bot.send_message(user_help_id, 'Что-то пошло не так...')
if operator_id not in operator_mode:
operator_mode[operator_id] = "not_in_dialog"
if operator_id in operator_mode:
match operator_mode[operator_id]:
case 'not_in_dialog':
print('if')
# Отправляем сообщение оператору о подключении к диалогу
bot.send_message(call.message.chat.id, text53)
# Устанавливаем состояние оператора как "в диалоге"
operator_mode[call.from_user.id] = 'in_dialog'
# Добавляем пользователя в user_mode
user_mode[user_id] = 'in_dialog'
add_table_btn1 = types.InlineKeyboardButton('Текст', callback_data='addbtn.' + calldata1)
add_table_btn2 = types.InlineKeyboardButton('Текст', callback_data='addbtn.' + calldata2)
add_table_btn3 = types.InlineKeyboardButton('Текст', callback_data='addbtn.' + calldata3)
add_table_btn4 = types.InlineKeyboardButton('Текст', callback_data='addbtn.' + calldata4)
add_table_btn5 = types.InlineKeyboardButton('Текст', callback_data='addbtn.' + calldata5)
add_table_btn6 = types.InlineKeyboardButton('Текст', callback_data='addbtn.' + calldata6)
add_table_btn7 = types.InlineKeyboardButton('Текст', callback_data='addbtn.' + calldata7)
add_table_btn8 = types.InlineKeyboardButton('Текст', callback_data='addbtn.' + calldata8)
add_table_btn9 = types.InlineKeyboardButton('Текст', callback_data='addbtn.' + calldata9)
add_table_btn10 = types.InlineKeyboardButton('Текст', callback_data='addbtn.' + calldata10)
add_table_btn11 = types.InlineKeyboardButton('Текст', callback_data='addbtn.' + calldata11)
def handle_adm_btn1(bot, message):
print("handle_adm_btn1 вызвана")
keyboard = types.InlineKeyboardMarkup()
keyboard.add(add_table_btn1, add_table_btn2)
keyboard.add(add_table_btn3, add_table_btn4)
keyboard.add(add_table_btn5, add_table_btn6)
keyboard.add(add_table_btn7, add_table_btn8)
keyboard.add(add_table_btn9, add_table_btn10)
keyboard.add(add_table_btn11)
# Отправляем сообщение с запросом выбора таблицы
bot.send_message(message.chat.id, text39, reply_markup=keyboard)
@bot.callback_query_handler(func=lambda call: call.data.startswith('btn1.'))
def chekCallData(call):
allowed_data = ('addbtn.' + calldata1, 'addbtn.' + calldata2, 'addbtn.' + calldata3, 'addbtn.' + calldata4, 'addbtn.' + calldata5, 'addbtn.' + calldata6, 'addbtn.' + calldata7, 'addbtn.' + calldata8, 'addbtn.' + calldata9, 'addbtn.' + calldata10, 'addbtn.' + calldata11)
table_name = call.data.replace('addbtn.', '')
handle_table_selection(bot, message, table_name)
print("handle_table_selection вызывается")
def handle_adm_btn1(bot, message):
print("handle_adm_btn1 вызвана")
keyboard = types.InlineKeyboardMarkup()
keyboard.add(table_btn1, table_btn2)
keyboard.add(table_btn3, table_btn4)
keyboard.add(table_btn5, table_btn6)
keyboard.add(table_btn7, table_btn8)
keyboard.add(table_btn9, table_btn10)
keyboard.add(table_btn11)
# Отправляем сообщение с запросом выбора таблицы
bot.send_message(message.chat.id, text39, reply_markup=keyboard)
bot.clear_step_handler_by_chat_id(message.chat.id)
print("clear_step_handler_by_chat_id до колбек")
@bot.callback_query_handler(func=lambda call: True)
def chekCallData(call):
allowed_data = (calldata1, calldata2, calldata3, calldata4, calldata5, calldata6, calldata7, calldata8, calldata9, calldata10, calldata11)
table_name = call.data
handle_table_selection(bot, message, table_name)
bot.clear_step_handler_by_chat_id(message.chat.id)
print("clear_step_handler_by_chat_id после колбек")
handle_adm_btn1 вызвана
clear_step_handler_by_chat_id до колбек
clear_step_handler_by_chat_id после колбек
handle_table_selection вызвана
Некст степ хандлер input вызван
Функция number_input вызвана
clear_step_handler_by_chat_id
handle_adm_btn2 вызвана
clear_step_handler_by_chat_id до колбек
clear_step_handler_by_chat_id после колбек
handle_table_selection вызвана
Некст степ хандлер input вызван
Функция number_input вызвана
clear_step_handler_by_chat_id
При полностью вынесеном хандлере на фотографии - пересылает все фото в чат но по одной. В медиагруппу не собираются вообще никак...