Проблема изменения флага в функции telegram бота на python

Рейтинг: 0Ответов: 0Опубликовано: 01.04.2023

Помогите пожалуйста решить проблему с изменением флага для смены режима ответа пользователю в телеграм боте. В коде оставлены комментарии в месте проблемы. Спасибо гигантское за ваше внимание!

import logging
import time
import openai
from aiogram import Bot, Dispatcher, executor, types

bot_token = 'telegram_token'
api_key = 'openAI_token'

logging.basicConfig(level=logging.INFO)

bot = Bot(token=bot_token)
dp = Dispatcher(bot)

openai.api_key = api_key

messages = {}

# ТОТ САМЫЙ ФЛАГ
flag = True


@dp.message_handler(commands=['start'])
async def start_cmd(message: types.Message):
    try:
        username = message.from_user.username
        messages[username] = []
        await message.answer("* * *Задай вопрос! 😃\nЧто тебя интересует?\n\n⚒ Список команд по команде /help* * *", parse_mode='Markdown')
        await message.delete()
    except Exception as e:
        logging.error(f'⚒ Error in start_cmd: {e}\n\nRestart Bot! ')




@dp.message_handler(commands=['help'])
async def start_cmd(message: types.Message):
    try:
        await message.answer("* * *⚒ Список команд:* * *\n\n1) /start - запуск бота\n\n2) /new - создание новой темы, диалога\n\n3) /all - режим моментального вывода ответа \n\n4) /step - режим вывода ответа по словам", parse_mode='Markdown')
        await message.delete()
    except Exception as e:
        logging.error(f'⚒ Error in start_cmd: {e}\n\nRestart Bot! ')




@dp.message_handler(commands=['all'])
async def all_f(message: types.Message):
    try:
        # ПОЧЕМУ-ТО НЕ СРАБАТЫВАЕТ КОГДА ФРАЗА ЧУТЬ НИЖЕ ВЫВОДИТСЯ
        global flag
        flag = False
        await message.reply('* * *📩 Режим моментального вывода ответа активирован! * * *', parse_mode='Markdown')
    except Exception as e:
        logging.error(f'⚒ Error in all_cmd: {e}\n\nRestart Bot! ')


@dp.message_handler(commands=['step'])
async def step(message: types.Message):
    try:
        # ТО ЖЕ САМОЕ
        global flag
        flag = True
        print(flag)
        await message.reply('* * *📩 Режим вывода ответа по словам активирован! * * *', parse_mode='Markdown')
    except Exception as e:
        logging.error(f'⚒ Error in step_cmd: {e}\n\nRestart Bot! ')


@dp.message_handler(commands=['new'])
async def new_topic_cmd(message: types.Message):
    try:
        username = message.from_user.username
        messages[username] = []
        await message.reply('* * * \n\n🚧 Начинаем новую тему!\n\n👀 Вот-вот отвечу! * * *', parse_mode='Markdown')
    except Exception as e:
        logging.error(f'⚒ Error in new_topic_cmd: {e}\n\nRestart Bot! ')



if flag:
    @dp.message_handler()
    async def step(message: types.Message):
        try:
            user_message = message.text
            username = message.from_user.username

            if username not in messages:
                messages[username] = []
            messages[username].append({"role": "user", "content": user_message})
            messages[username].append({"role": "user", "content": f"chat: {message.chat} Сейчас {time.strftime('%d/%m/%Y %H:%M:%S')} user: {message.from_user.first_name} message: {message.text}"})
            logging.info(f'{username}: {user_message}')

            should_respond = not message.reply_to_message or message.reply_to_message.from_user.id == bot.id
            if should_respond:
                processing_message = await message.reply(
                    '⏱* * * Формирую ответ, пожалуйста подождите * * *',
                    parse_mode='Markdown')
                await bot.send_chat_action(chat_id=message.chat.id, action="typing")
                report = []
                for resp in openai.ChatCompletion.create(
                    model="gpt-3.5-turbo",
                    messages=messages[username],
                    max_tokens=2500,
                    temperature=0.7,
                    frequency_penalty=0,
                    presence_penalty=0,
                    user=username,
                    stream=True
                ):
                    #print(resp)
                    content_value = resp.get("choices")[0].get("delta").get("content")
                    if content_value is not None:
                        report.append(resp["choices"][0]["delta"]["content"])
                    else: continue

                    try:
                        await bot.edit_message_text(
                            text="".join(report),
                            chat_id=message.chat.id,
                            message_id=message.message_id + 1
                        )
                    except: continue
                await bot.edit_message_text(
                        text='· ' + "".join(report),
                        chat_id=message.chat.id,
                        message_id=message.message_id + 1,
                        parse_mode='Markdown')

                logging.info(f'Response: {"".join(report)}')

        except Exception as ex:
            await message.reply(
                    f'* * * \n\n⚠ У бота присутсвует ограничение символов для защиты от сетевых атак, пересоздаю диалог... * * *\n\n🤓 Расшифровка ошибки:\n{ex}',
                    parse_mode='Markdown')
            await new_topic_cmd(message)
            await step(message)



if flag == False:
    @dp.message_handler()
    async def allfunc(message: types.Message):
        try:
            user_message = message.text
            username = message.from_user.username

            if username not in messages:
                messages[username] = []
            messages[username].append({"role": "user", "content": user_message})
            messages[username].append({"role": "user", "content": f"chat: {message.chat} Сейчас {time.strftime('%d/%m/%Y %H:%M:%S')} user: {message.from_user.first_name} message: {message.text}"})
            logging.info(f'{username}: {user_message}')

            should_respond = not message.reply_to_message or message.reply_to_message.from_user.id == bot.id

            if should_respond:
                processing_message = await message.reply(
                    '⏱* * * Ваш запрос обрабатывается, пожалуйста подождите * * *',
                    parse_mode='Markdown')
                await bot.send_chat_action(chat_id=message.chat.id, action="typing")
                completion = openai.ChatCompletion.create(
                    model="gpt-3.5-turbo",
                    messages=messages[username],
                    max_tokens=2500,
                    temperature=0.7,
                    frequency_penalty=0,
                    presence_penalty=0,
                    user=username
                )
                chatgpt_response = completion.choices[0]['message']
                messages[username].append({"role": "assistant", "content": chatgpt_response['content']})
                logging.info(f'Response: {chatgpt_response["content"]}')
                await message.reply(chatgpt_response['content'], parse_mode='Markdown')
                await bot.delete_message(chat_id=processing_message.chat.id, message_id=processing_message.message_id)


        except Exception as ex:
            await message.reply(
                    f'* * * \n\n⚠ У бота присутсвует ограничение символов для защиты от сетевых атак, пересоздаю диалог... * * *\n\n🤓 Расшифровка ошибки:\n{ex}',
                    parse_mode='Markdown')
            await new_topic_cmd(message)
            await allfunc(message)


if __name__ == '__main__':
    executor.start_polling(dp)

Ответы

Ответов пока нет.