Отправка сообщений пользователям в боте
Всем привет, всю голову сломал как реализовать идею. Суть в том, что мне независимо от действий пользователя нужно отправлять ему сообщение во время из планировщика, причем пользователь может сам задать это время, после чего оно будет записано в бд
Я решил реализовать это через команду /start, тк она всегда является отправной точкой, но ничего не вышло
async def send_motivational_message(message: Message, bot: Bot):
db = DataBase()
random_phrase = await db.get_random_motivation()
if random_phrase:
await bot.send_message(message.from_user.id,
f"{random_phrase.text} - {random_phrase.author}")
else:
print("Не удалось получить мотивационную фразу.")
@rCom.message(Command('text'))
async def command_text(message: Message, bot: Bot):
await send_motivational_message(message, bot)
@rCom.message(CommandStart())
async def command_start(message: Message, bot: Bot):
try:
db = DataBase()
user_id = str(message.from_user.id) # Преобразуйте user_id в строку
user = await db.get_user(user_id)
if user and user.uvedomlen is not None:
await bot.send_message(
message.from_user.id,
'<b>Главное меню</b>'
'\n\nВыберите интересующий вас раздел',
reply_markup=main_menu
)
else:
await bot.send_message(
message.from_user.id,
f'<b>?Добро пожаловать, {message.from_user.first_name}!</b> ',
reply_markup=Keyboards_Start_Menu.main
)
if user.uvedomlen == True:
scheduler = AsyncIOScheduler()
uvedomlen_time = [time.strip() for time in user.uvedomlen_time.split(',')]
for time_str in uvedomlen_time:
hour, minute = map(int, time_str.split(':'))
scheduler.add_job(send_motivational_message,
CronTrigger(hour=hour, minute=minute, timezone=pytz.timezone('Europe/Moscow')),
args=[bot, message.from_user.id])
scheduler.start()
except Exception as e:
print(f"Error in command_start: {e}")
Проблема в том, что в данном случае идет отправка уведомлений путем привязки к команде start, но можно ли как то сделать это в контексте машины состояний, когда пользователю задается вопрос, хочет ли он, чтобы ему отправлялись уведомления, при этом все должно работать и после перзагрузки бота, асинхронно, отправляя уведомления для конкретного пользователя