From 70e7d230644988eddea2813732bc4c93691a4c94 Mon Sep 17 00:00:00 2001 From: q Date: Fri, 24 Apr 2026 13:08:30 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B1=D0=BE=D1=82=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=80=D1=82=D0=BE=D0=B2=D0=B0=D0=BB=20+=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=20get=5Fuse?= =?UTF-8?q?r=5Fstats=20+=20handle=5Fcentral=5Fbank=5Fcmd=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=BE=D1=82=D0=B2=D0=B5=D1=87=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- games/economy.py | 15 ++++++------- main.py | 55 +++++++++++++++++++++--------------------------- 2 files changed, 31 insertions(+), 39 deletions(-) diff --git a/games/economy.py b/games/economy.py index 9b3b7e3..4eca0e5 100644 --- a/games/economy.py +++ b/games/economy.py @@ -546,28 +546,27 @@ class EconomyManager: # Баланс 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,)) deposits = cursor.fetchone() - + # Активные кредиты cursor.execute('SELECT COUNT(*), SUM(amount) FROM loans WHERE user_id = ? AND is_repaid = 0', (user_id,)) loans = cursor.fetchone() - - conn.close() - + # Получаем статистику сообщений за сегодня today = datetime.now().strftime('%Y-%m-%d') cursor.execute('SELECT message_count FROM daily_activity WHERE user_id = ? AND activity_date = ?', (user_id, today)) today_messages = cursor.fetchone() - + # Получаем статистику сообщений за вчера yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d') cursor.execute('SELECT message_count FROM daily_activity WHERE user_id = ? AND activity_date = ?', (user_id, yesterday)) yesterday_messages = cursor.fetchone() - + conn.close() return { diff --git a/main.py b/main.py index 9af8ad7..667e3b3 100644 --- a/main.py +++ b/main.py @@ -1446,6 +1446,7 @@ async def handle_central_bank_cmd(message: Message): /cb_stats - краткая статистика /cb_rules - правила работы ЦБ """ + await message.answer(text, parse_mode=None) async def handle_cb_stats_cmd(message: Message): """Статистика ЦБ для всех пользователей""" @@ -1782,37 +1783,6 @@ def main(): # Запуск фоновых задач экономики 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) async def start_settle(bot: Bot): @@ -1822,5 +1792,28 @@ async def economy_background_tasks(): logger.info("Бот запущен...") 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__": main()