LINUX.ORG.RU

История изменений

Исправление theurs, (текущая версия) :

message_id - id сообщения а не группы или темы в группе

потыкал в отладчике и вроде понятнее стало

когда кто то что то пишет в тему в группе у объекта message почему то есть поле message.reply_to_message и message.is_topic_message == True
странно, ведь это сообщение не выглядит как ответ на чье то сообщение

и пара исключений

если пишут в главную тему группы то там этого поля нет (message.reply_to_message) и message.is_topic_message = None(False)

если пишут в ответ на сообщение в теме группы, тогда message.reply_to_message нету но есть message.is_topic_message == True

в итоге функция для идентификации получилась такая, но может это еще не все случаи и исключения Ж(

def get_topic_id(message: telebot.types.Message) -> str:
    """
    Get the topic ID from a Telegram message.

    Parameters:
        message (telebot.types.Message): The Telegram message object.

    Returns:
        str: '[chat.id] [topic.id]'
    """

    chat_id = message.chat.id
    # topic_id = 'not topic'
    topic_id = 0

    if message.reply_to_message and message.reply_to_message.is_topic_message:
    # if message.reply_to_message and message.reply_to_message.content_type == 'forum_topic_created':
        topic_id = message.reply_to_message.message_thread_id
    elif message.is_topic_message:
        topic_id = message.message_thread_id

    # bot.reply_to(message, f'DEBUG: [{chat_id}] [{topic_id}]')

    return f'[{chat_id}] [{topic_id}]'

Исправление theurs, :

message_id - id сообщения а не группы или темы в группе

потыкал в отладчике и вроде понятнее стало

когда кто то что то пишет в тему в группе у объекта message почему то есть поле message.reply_to_message и message.is_topic_message == True
странно, ведь это сообщение не выглядит как ответ на чье то сообщение

и пара исключений

если пишут в главную тему группы то там этого поля нет (message.reply_to_message)

если пишут в ответ на сообщение в теме группы, тогда message.reply_to_message нету но есть message.is_topic_message == True

в итоге функция для идентификации получилась такая, но может это еще не все случаи и исключения Ж(

def get_topic_id(message: telebot.types.Message) -> str:
    """
    Get the topic ID from a Telegram message.

    Parameters:
        message (telebot.types.Message): The Telegram message object.

    Returns:
        str: '[chat.id] [topic.id]'
    """

    chat_id = message.chat.id
    # topic_id = 'not topic'
    topic_id = 0

    if message.reply_to_message and message.reply_to_message.is_topic_message:
    # if message.reply_to_message and message.reply_to_message.content_type == 'forum_topic_created':
        topic_id = message.reply_to_message.message_thread_id
    elif message.is_topic_message:
        topic_id = message.message_thread_id

    # bot.reply_to(message, f'DEBUG: [{chat_id}] [{topic_id}]')

    return f'[{chat_id}] [{topic_id}]'

Исходная версия theurs, :

message_id - id сообщения а не группы или темы в группе

потыкал в отладчике и вроде понятнее стало

когда кто то что то пишет в тему в группе у объекта message почему то есть поле message.reply_to_message и оно message.reply_to_message.content_type == 'forum_topic_created'
странно, ведь это сообщение не выглядит как ответ на чье то сообщение

и пара исключений

если пишут в главную тему группы то там этого поля нет

если пишут в ответ на сообщение в теме группы, тогда message.reply_to_message нету но есть message.is_topic_message == True

в итоге функция для идентификации получилась такая, но может это еще не все случаи и исключения Ж(

def get_topic_id(message: telebot.types.Message) -> str:
    """
    Get the topic ID from a Telegram message.

    Parameters:
        message (telebot.types.Message): The Telegram message object.

    Returns:
        str: '[chat.id] [topic.id]'
    """

    chat_id = message.chat.id
    # topic_id = 'not topic'
    topic_id = 0

    if message.reply_to_message and message.reply_to_message.content_type == 'forum_topic_created':
        topic_id = message.reply_to_message.message_thread_id
    elif message.is_topic_message:
        topic_id = message.message_thread_id

    # bot.reply_to(message, f'DEBUG: [{chat_id}] [{topic_id}]')

    return f'[{chat_id}] [{topic_id}]'