fixes bugs

This commit is contained in:
itqop 2025-12-19 14:14:51 +03:00
parent e675a245e6
commit 59966a2f17
14 changed files with 30 additions and 12 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -49,12 +49,19 @@ async def check_and_send_reminders(bot: Bot) -> None:
Args:
bot: Bot instance
"""
from bot.db.base import async_session_maker
from bot.db.operations import update_reminder
if not async_session_maker:
logger.error("Session maker not initialized")
return
try:
time_service = get_time_service()
current_time = time_service.get_now()
# Get due reminders from database
async for session in get_session():
# Get due reminders from database using proper async session
async with async_session_maker() as session:
due_reminders = await get_due_reminders(session, current_time)
if not due_reminders:
@ -74,16 +81,15 @@ async def check_and_send_reminders(bot: Bot) -> None:
# Update next_run_at to prevent sending again
# (it will be properly updated when user clicks "Done" or by periodic update)
from bot.db.operations import update_reminder
from datetime import timedelta
# Temporarily set next_run_at to current + interval to avoid duplicate sends
temp_next_run = time_service.calculate_next_occurrence(
current_run=reminder.next_run_at,
days_interval=reminder.days_interval,
)
await update_reminder(session, reminder.id, next_run_at=temp_next_run)
# Commit all updates
await session.commit()
# Small delay to avoid rate limits
await asyncio.sleep(0.5)

View File

@ -176,8 +176,11 @@ async def get_due_reminders(session: AsyncSession, current_time: datetime) -> Li
Returns:
List of due Reminder instances
"""
from sqlalchemy.orm import selectinload
result = await session.execute(
select(Reminder)
.options(selectinload(Reminder.user)) # Eager load user relationship
.where(Reminder.is_active == True)
.where(Reminder.next_run_at <= current_time)
.order_by(Reminder.next_run_at)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -38,14 +38,23 @@ async def on_shutdown() -> None:
logger.info("Shutting down reminder bot...")
# Stop scheduler
stop_scheduler()
try:
stop_scheduler()
except Exception as e:
logger.error(f"Error stopping scheduler: {e}")
# Close database
await close_db()
try:
await close_db()
except Exception as e:
logger.error(f"Error closing database: {e}")
# Close bot session
if bot:
await bot.session.close()
if bot and hasattr(bot, 'session'):
try:
await bot.session.close()
except Exception as e:
logger.error(f"Error closing bot session: {e}")
logger.info("Bot shutdown completed")

View File

@ -45,11 +45,11 @@ def validate_days_interval(days_str: str) -> Optional[int]:
days_str: Days interval string to validate
Returns:
Integer days if valid (>0), None otherwise
Integer days if valid (>0 and <=365), None otherwise
"""
try:
days = int(days_str.strip())
if days > 0:
if 0 < days <= 365: # Max 1 year
return days
except (ValueError, AttributeError):
pass