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:
parent
78b42691b7
commit
70e7d23064
2 changed files with 31 additions and 39 deletions
|
|
@ -546,28 +546,27 @@ 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,))
|
||||||
deposits = cursor.fetchone()
|
deposits = cursor.fetchone()
|
||||||
|
|
||||||
# Активные кредиты
|
# Активные кредиты
|
||||||
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))
|
||||||
today_messages = cursor.fetchone()
|
today_messages = cursor.fetchone()
|
||||||
|
|
||||||
# Получаем статистику сообщений за вчера
|
# Получаем статистику сообщений за вчера
|
||||||
yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')
|
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))
|
cursor.execute('SELECT message_count FROM daily_activity WHERE user_id = ? AND activity_date = ?', (user_id, yesterday))
|
||||||
yesterday_messages = cursor.fetchone()
|
yesterday_messages = cursor.fetchone()
|
||||||
|
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
55
main.py
55
main.py
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue