fix: бот не стартовал + падение в get_user_stats + handle_central_bank_cmd не отвечал

- economy_background_tasks() была вставлена в середину main(), из-за чего
  dp.startup.register и asyncio.run(dp.start_polling) оказались мёртвым кодом
  внутри while True — бот никогда не поднимался
- двойной fetchone() в get_user_stats (тот же баг что в PR #34, но в другом месте)
- conn.close() вызывался до запросов за активностью, потом ещё раз — ProgrammingError
- handle_central_bank_cmd строил текст но не делал await message.answer()

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
q 2026-04-24 13:08:30 +03:00
parent 78b42691b7
commit 70e7d23064
2 changed files with 31 additions and 39 deletions

View file

@ -546,7 +546,8 @@ class EconomyManager:
# Баланс # Баланс
cursor.execute('SELECT balance FROM user_balances WHERE user_id = ?', (user_id,)) cursor.execute('SELECT balance FROM user_balances WHERE user_id = ?', (user_id,))
balance = cursor.fetchone()[0] if cursor.fetchone() else 0.0 row = cursor.fetchone()
balance = row[0] if row else 0.0
# Активные вклады # Активные вклады
cursor.execute('SELECT COUNT(*), SUM(amount) FROM deposits WHERE user_id = ? AND is_active = 1', (user_id,)) cursor.execute('SELECT COUNT(*), SUM(amount) FROM deposits WHERE user_id = ? AND is_active = 1', (user_id,))
@ -556,8 +557,6 @@ class EconomyManager:
cursor.execute('SELECT COUNT(*), SUM(amount) FROM loans WHERE user_id = ? AND is_repaid = 0', (user_id,)) cursor.execute('SELECT COUNT(*), SUM(amount) FROM loans WHERE user_id = ? AND is_repaid = 0', (user_id,))
loans = cursor.fetchone() loans = cursor.fetchone()
conn.close()
# Получаем статистику сообщений за сегодня # Получаем статистику сообщений за сегодня
today = datetime.now().strftime('%Y-%m-%d') today = datetime.now().strftime('%Y-%m-%d')
cursor.execute('SELECT message_count FROM daily_activity WHERE user_id = ? AND activity_date = ?', (user_id, today)) cursor.execute('SELECT message_count FROM daily_activity WHERE user_id = ? AND activity_date = ?', (user_id, today))

55
main.py
View file

@ -1446,6 +1446,7 @@ async def handle_central_bank_cmd(message: Message):
/cb_stats - краткая статистика /cb_stats - краткая статистика
/cb_rules - правила работы ЦБ /cb_rules - правила работы ЦБ
""" """
await message.answer(text, parse_mode=None)
async def handle_cb_stats_cmd(message: Message): async def handle_cb_stats_cmd(message: Message):
"""Статистика ЦБ для всех пользователей""" """Статистика ЦБ для всех пользователей"""
@ -1782,37 +1783,6 @@ def main():
# Запуск фоновых задач экономики # Запуск фоновых задач экономики
asyncio.create_task(economy_background_tasks()) asyncio.create_task(economy_background_tasks())
async def economy_background_tasks():
"""Фоновые задачи для экономики"""
while True:
try:
# Проверяем текущее время по МСК
from datetime import datetime
from zoneinfo import ZoneInfo
moscow_time = datetime.now(ZoneInfo("Europe/Moscow"))
current_hour = moscow_time.hour
current_minute = moscow_time.minute
# Ежедневный сбор налогов (каждый час проверяем)
await asyncio.to_thread(economy.collect_daily_taxes)
# Регулирование инфляции (раз в день)
await asyncio.to_thread(economy.regulate_inflation)
# Выплаты за активность в 00:00 по МСК
if current_hour == 0 and current_minute == 0:
users_paid = await asyncio.to_thread(economy.pay_daily_activity_rewards)
if users_paid > 0:
logger.info(f"Activity rewards paid to {users_paid} users at 00:00 MSK")
logger.info(f"Economy background tasks completed at {moscow_time.strftime('%H:%M:%S MSK')}")
except Exception as e:
logger.exception(f"Economy background task failed: {e}")
# Ждём 1 минуту до следующей проверки (для точности в 00:00)
await asyncio.sleep(60)
dp.startup.register(on_startup) dp.startup.register(on_startup)
async def start_settle(bot: Bot): async def start_settle(bot: Bot):
@ -1822,5 +1792,28 @@ async def economy_background_tasks():
logger.info("Бот запущен...") logger.info("Бот запущен...")
asyncio.run(dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types())) asyncio.run(dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types()))
async def economy_background_tasks():
"""Фоновые задачи для экономики"""
while True:
try:
moscow_time = datetime.now(ZoneInfo("Europe/Moscow"))
current_hour = moscow_time.hour
current_minute = moscow_time.minute
await asyncio.to_thread(economy.collect_daily_taxes)
await asyncio.to_thread(economy.regulate_inflation)
if current_hour == 0 and current_minute == 0:
users_paid = await asyncio.to_thread(economy.pay_daily_activity_rewards)
if users_paid > 0:
logger.info(f"Activity rewards paid to {users_paid} users at 00:00 MSK")
logger.info(f"Economy background tasks completed at {moscow_time.strftime('%H:%M:%S MSK')}")
except Exception as e:
logger.exception(f"Economy background task failed: {e}")
await asyncio.sleep(60)
if __name__ == "__main__": if __name__ == "__main__":
main() main()