Задать вопрос
  • Почему пересылается всё кроме последней фото?

    @xx_RuBiCoN_xx Автор вопроса
    @bot.message_handler(content_types=['photo'])
    def handle_photos(message):
        media_group = []
        medium_photos = [next((photo for photo in message.photo if photo.file_size < 500000), None)]
        for photo in medium_photos:
            media_group.append(types.InputMediaPhoto(photo.file_id))
        print('media_group: ',media_group)
        bot.send_media_group(chatAdmin, media=media_group)


    При полностью вынесеном хандлере на фотографии - пересылает все фото в чат но по одной. В медиагруппу не собираются вообще никак...
  • Почему пересылается всё кроме последней фото?

    @xx_RuBiCoN_xx Автор вопроса
    Использовал ещё копирование сообщения - в медиагрупе пересылает только первое фото, а не всю группу. Но почему?

    bot.copy_message(chat_id=chatAdmin, from_chat_id=msgNews.chat.id, message_id=msgNews.message_id, reply_markup=acrKeyboard)
  • Как настроить бота на ветку чата, а не на весь чат?

    @xx_RuBiCoN_xx Автор вопроса
    Короче подключил бота и смотрел на чат айди сообщений по разным веткам, в главной ветке - везде айдишник одинаковый, и колличество пользователей везде одинаковое. Видимо технически не возможно настроить бот только на одну ветку.
  • Почему не обновляется header.twig?

    @xx_RuBiCoN_xx Автор вопроса
    Виталий Першин, не думаю, что дело в хосте - всё остальное меняется моментально. Что значит обновить модификатор в 4ой версии опенкарта? До 3ей там прям вкладка была "модификаторы", а в 4 как я понимаю шестерёнка на главной странице админки всем этим занимается вроде, нет? Не могу найти
  • Почему не перехватываются медиа сообщения?

    @xx_RuBiCoN_xx Автор вопроса
    theurus, так работает, да. Просто при таком раскладе надо заморачиваться сброс хандлера делать после этого, чтобы не было конфликта в таком же хандлере в другом месте. Но всё равно спасибо
  • Почему хандлер не срабатывает повторно?

    @xx_RuBiCoN_xx Автор вопроса
    Проблема с путаницей операторов была тут:
    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"
  • Почему хандлер не срабатывает повторно?

    @xx_RuBiCoN_xx Автор вопроса
    Методом тыка понял, что эта часть кода мешает:
    if user_help_id in user_mode and user_mode[user_help_id] != 'not_in_dialog':
           user_mode[user_help_id] = "not_in_dialog"

    Если я это убираю - хандлер начинает срабатывать повторно o_O Но почему?

    Также, если я убираю эту часть, бот начинает путать айдишники операторов, а именно того кто нажал на "Подключиться" в следующей функции меняет на второго оператора и сходит с ума...

    Пытаюсь короче дальше разобраться...
  • Почему хандлер не срабатывает повторно?

    @xx_RuBiCoN_xx Автор вопроса
    Спасибо за столь подробный отзыв и уделённое время, но есть ряд примечаний:

    global operator

    Мой косяк. Не знаю почему я это не передал как обычную переменную из функции в функцию. Уже исправил.

    Вынести все обработчики на верхний уровень

    Это можно было бы сделать, если бы всё было в одном файле. Весь основной код у меня в файле start.py, а этот в файле operatorAdd.py. Если я вынесу хандлер из функции - он просто перестанет срабатывать. По этому я его вложил в функцию. Следующие хандлеры тоже вложены в функцию, как заметно в коде - но они почему то повторно срабатывают.

    Отделить логику оператора от логики пользователя

    Если я правильно понимаю, то логика оператора у меня в хандлере
    @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 назначенного оператора

    Ну у меня есть переменные, которым присваивается ид пользователя(user_help_id) и оператора(operator) соответственно.

    Не забывать, что пользователь может успеть оставить несколько сообщений до того, как оператор примет запрос - их все нужно не потерять

    Это как совет приму к сведению. Я знал, что эти сообщения теряются, но не думал над решением. В принципе можно обычным словарём закрыть дырку. Позже допишу.

    ...нужно много чего дорабатывать, включая сценарии завершения работы, переключения на другого оператора итд итп, контроль за тем, чтобы пользователя не взяли два оператора одновременно

    Сценарий завершения работы есть - рассылаются сообщения оператору и пользователю. Переключение на другого оператора - задумывался - в будущем тоже реализую. Пока что не будет надобности. Два оператора одновременно тоже не возьмут юзера - в коде есть условия на этот счёт:
    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)

    Если оператор в диалоге - оператору выводится сообщение что он уже в диалоге. Если юзера уже взяли - оператору выводится сообщение что юзер уже занят. Если с юзером диалог завершён - выводится сообщение оператору что юзер уже получил поддержку.

    P.S. Интеграция срм системы тоже не сложная затея. Они работают с базами данных, в которые можно вносить данные и изменять их при помощи бота в нужные моменты, вплоть до истории переписки. В будущем тоже думаю дописать.

    P.P.S. Ничего из этого не помогло решить проблему с повторным вызовом хандлера
    @bot.callback_query_handler(func=lambda call: call.data == 'join_dialog_btn')
  • Почему хандлер не срабатывает повторно?

    @xx_RuBiCoN_xx Автор вопроса
    Код в спойлере внизу текста.

    Я немогу call: true сделать - у меня много обработчиков на разные call data
  • Почему не срабатывает хандлер после функции?

    @xx_RuBiCoN_xx Автор вопроса
    RimMirK, йооооп. Даааа. Не сразу дошло, но в принципе почти такая же ошибка. Короче проблема оказалась в том, что в коде второй хандлер по счёту был @bot.message_handler(content_types=["text"]). Соответственно после этого все уточняющие хандлеры типа
    @bot.message_handler(func=lambda message: message.text == text11)
    не срабатывали. Изменил, поправил - заработало. Пасыба)
  • Почему не срабатывает хандлер после функции?

    @xx_RuBiCoN_xx Автор вопроса
    RimMirK, да почитал... Про то, что он не будет работать в функции - не видел. Да и на примере своего же кода вижу - что другие декораторы в функциях работают . Ну и плюс к этому - я выносил его за пределы всех функций - он всё равно не реагирует
  • Почему не срабатывает хандлер после функции?

    @xx_RuBiCoN_xx Автор вопроса
    декораторы не так работают.

    А как? Вроде условия есть, условия совпадают. Что им ещё надо?
  • Почему не срабатывает хандлер после функции?

    @xx_RuBiCoN_xx Автор вопроса
    Немного изменил код:
    ...
          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, 'Что-то пошло не так...')


    Теперь есть определения какие именно сообщения кому отправлять. Также попробовал перенести хандлеры в start.py, вставить в функции в operatorAdd.py, вставить после функций, перед функциями - ничего не помогает
  • Почему не срабатывает хандлер после функции?

    @xx_RuBiCoN_xx Автор вопроса
    При таком расскладе вот тут
    bot.register_next_step_handler(message, supportWait, msg, bot)
    msg не определена
  • Почему не исполняется if elif elif?

    @xx_RuBiCoN_xx Автор вопроса
    RimMirK, ляяяяяя, голова! Я же по умолчанию not_in_dialog не дописал.
    if operator_id not in operator_mode:
             operator_mode[operator_id] = "not_in_dialog"

    Порешалось в 2 минуты. Пасиба
  • Почему не исполняется if elif elif?

    @xx_RuBiCoN_xx Автор вопроса
    Попробовал скобки добавить - не помогло. Поменял на match-case:
    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'


    И опять ничего. Просто останавливается перед if
  • Один и тот же код не работает на хостинге, а на VisualStudio работает?

    @xx_RuBiCoN_xx Автор вопроса
    Василий Банников,
    1) Запрещено код в виде скриншотов вроде как, а не текст
    2)На локалке меньше и/или старее. В теории же на более новом должно быть лучше?
    3) Не должна, но факт
    4) Да не думаю, что код, де факто ведь рабочий
    5) Да, на выходных буду вешаться на логах этих( Надеялся дело в библиотеках, да не помогло
  • Почему при исполнении импортированого кода исполняется код из другого импорта?

    @xx_RuBiCoN_xx Автор вопроса
    Переделал кнопки вот так:
    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)


    в коде userAdd.py сделал так:
    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 вызывается")


    На этом этапе всё застряло. Кнопки на нажатия не реагируют. Порыл гугл и хабр - не выдаёт ничего толкового на вопрос "Как добавлять префиксы calldata python". Подскажите, что я не так сделал?
  • Почему при исполнении импортированого кода исполняется код из другого импорта?

    @xx_RuBiCoN_xx Автор вопроса
    Обновил код с установкой clear_step_handler перед и после @bot.callback_query_handler(func=lambda call: True). Теперь выглядит вот так:
    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
  • Почему при исполнении импортированого кода исполняется код из другого импорта?

    @xx_RuBiCoN_xx Автор вопроса
    Я думал их название привязывается к функции... Их можно как то сделать отличными, добавить название? Или только clear_step_handler прописывать?