Проблема изменения флага в функции telegram бота на python
Помогите пожалуйста решить проблему с изменением флага для смены режима ответа пользователю в телеграм боте. В коде оставлены комментарии в месте проблемы. Спасибо гигантское за ваше внимание!
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)
Источник: Stack Overflow на русском