как сделать чтобы функции пошли дальше?

делаю телеграм бота и не могу понять почему он тормозит на функции name_news()

введите сюда описание изображения

а дальше не идет

@bot.message_handler(commands=['new_news'])
def new_news(message):
    name_text_photos = []
    bot.send_message(message.from_user.id, 'Напишите название новости:')
    @bot.message_handler(content_types=['text'])
    def news_name(message):
        print(message.text)
        name_text_photos.append(message.text)
        names_all_news.append(message.text)
    

    @bot.message_handler(content_types=['text'])
    def news_text(message):
        bot.send_message(message.from_user.id, 'Напишите текст новости:')
        print(message.text)
        name_text_photos.append(message.text)

и еще вопрос: как можно сохранять фотографии которые скинет человек для последующей работы с ними?


Ответы (1 шт):

Автор решения: oleksandrigo

Вообще в телеботе есть свои стейты, но мне было лень вспоминать как их юзать, потому сделал так.

# делаем словарь с юзерами
users = {}


# делаем парочку функций для удобной работы с стейтами 
def reset_state(user_id: int, with_data=True):
    if with_data:
        users[user_id] = {"state": None}
    else:
        users[user_id]["state"] = None


def set_state(user_id: int, new_state: str):
    users.setdefault(user_id, {"state": None})
    users[user_id]["state"] = new_state


def get_state(user_id: int):
    users.setdefault(user_id, {"state": None})
    return users[user_id].get("state")


# при старте делаете запись юзера в словарь, и с ключом state
@bot.message_handler(commands=['start'])
def start(message: types.Message):
    users.setdefault(message.from_user.id, {"state": None})
    ...


@bot.message_handler(commands=['new_news'])
def new_news(message: types.Message):
    bot.send_message(message.from_user.id, 'Напишите название новости')
    # делаете запуск стейта с именем name_news
    set_state(message.from_user.id, "name_news")


# делаем хендлер который срабатывает только при стейте name_news
@bot.message_handler(func=lambda msg: get_state(msg.from_user.id) == "name_news")
def news_name(message: types.Message):
    # записываем в словарь с юзером введенные данные от юзера
    users[message.from_user.id]["news_name"] = message.text
    bot.send_message(message.from_user.id, 'Напишите текст новости')
    # запсускаем следующий стейт
    set_state(message.from_user.id, "text_news")


# аналогично
@bot.message_handler(func=lambda msg: get_state(msg.from_user.id) == "text_news")
def news_text(message: types.Message):
    users[message.from_user.id]["text_news"] = message.text
    # выводим данные
    bot.send_message(
        message.from_user.id,
        f'Заголовок: {users[message.from_user.id]["news_name"]}\n'
        f'Текст: {users[message.from_user.id]["text_news"]}')
    # reset_state сбрасывает стейт, если нужно
    reset_state(message.from_user.id)

UPD.1
О, я забыл про register_next_step_handler в телеботе. Можете весь код выше заменить на вот такое

@bot.message_handler(commands=['new_news'])
def new_news(message: types.Message):
    bot.send_message(message.from_user.id, 'Напишите название новости')
    # делаете запуск стейта с именем name_news
    bot.register_next_step_handler(message, news_name)


def news_name(message: types.Message):
    bot.send_message(message.from_user.id, 'Напишите текст новости')
    bot.register_next_step_handler(message, news_text, message.text)


def news_text(message: types.Message, name: str):
    bot.send_message(message.from_user.id, f'Заголовок: {name}\nТекст: {message.text}')
→ Ссылка