Enhance bot functionality and refactor database interactions
- Added `ca-certificates` installation to Dockerfile for improved network security. - Updated health check command in Dockerfile to include better timeout handling. - Refactored `run_helper.py` to implement proper signal handling and logging during shutdown. - Transitioned database operations to an asynchronous model in `async_db.py`, improving performance and responsiveness. - Updated database schema to support new foreign key relationships and optimized indexing for better query performance. - Enhanced various bot handlers to utilize async database methods, improving overall efficiency and user experience. - Removed obsolete database and fix scripts to streamline the project structure.
This commit is contained in:
@@ -11,6 +11,7 @@ if CURRENT_DIR not in sys.path:
|
||||
from helper_bot.main import start_bot
|
||||
from helper_bot.utils.base_dependency_factory import get_global_instance
|
||||
from helper_bot.utils.auto_unban_scheduler import get_auto_unban_scheduler
|
||||
from logs.custom_logger import logger
|
||||
|
||||
|
||||
async def main():
|
||||
@@ -42,7 +43,7 @@ async def main():
|
||||
|
||||
def signal_handler(signum, frame):
|
||||
"""Обработчик сигналов для корректного завершения"""
|
||||
print(f"\nПолучен сигнал {signum}, завершаем работу...")
|
||||
logger.info(f"Получен сигнал {signum}, завершаем работу...")
|
||||
shutdown_event.set()
|
||||
|
||||
# Регистрируем обработчики сигналов
|
||||
@@ -53,34 +54,59 @@ async def main():
|
||||
bot_task = asyncio.create_task(start_bot(bdf))
|
||||
metrics_task = asyncio.create_task(metrics_manager.start())
|
||||
|
||||
main_bot = None
|
||||
|
||||
try:
|
||||
# Ждем сигнала завершения
|
||||
await shutdown_event.wait()
|
||||
print("Начинаем корректное завершение...")
|
||||
logger.info("Начинаем корректное завершение...")
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print("Получен сигнал завершения...")
|
||||
logger.info("Получен сигнал завершения...")
|
||||
finally:
|
||||
print("Останавливаем планировщик автоматического разбана...")
|
||||
logger.info("Останавливаем планировщик автоматического разбана...")
|
||||
auto_unban_scheduler.stop_scheduler()
|
||||
|
||||
print("Останавливаем метрики...")
|
||||
await metrics_manager.stop()
|
||||
logger.info("Останавливаем метрики...")
|
||||
try:
|
||||
await metrics_manager.stop()
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка при остановке метрик: {e}")
|
||||
|
||||
print("Останавливаем задачи...")
|
||||
logger.info("Останавливаем задачи...")
|
||||
# Отменяем задачи
|
||||
bot_task.cancel()
|
||||
metrics_task.cancel()
|
||||
|
||||
# Ждем завершения задач
|
||||
# Ждем завершения задач и получаем результат main bot
|
||||
try:
|
||||
await asyncio.gather(bot_task, metrics_task, return_exceptions=True)
|
||||
results = await asyncio.gather(bot_task, metrics_task, return_exceptions=True)
|
||||
# Первый результат - это main bot
|
||||
if results[0] and not isinstance(results[0], Exception):
|
||||
main_bot = results[0]
|
||||
except Exception as e:
|
||||
print(f"Ошибка при остановке задач: {e}")
|
||||
logger.error(f"Ошибка при остановке задач: {e}")
|
||||
|
||||
# Закрываем сессию бота
|
||||
await auto_unban_bot.session.close()
|
||||
print("Бот корректно остановлен")
|
||||
# Закрываем сессию основного бота (если она еще не закрыта)
|
||||
if main_bot and hasattr(main_bot, 'session') and not main_bot.session.closed:
|
||||
try:
|
||||
await main_bot.session.close()
|
||||
logger.info("Сессия основного бота корректно закрыта")
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка при закрытии сессии основного бота: {e}")
|
||||
|
||||
# Закрываем сессию бота для автоматического разбана
|
||||
if not auto_unban_bot.session.closed:
|
||||
try:
|
||||
await auto_unban_bot.session.close()
|
||||
logger.info("Сессия бота автоматического разбана корректно закрыта")
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка при закрытии сессии бота автоматического разбана: {e}")
|
||||
|
||||
# Даем время на завершение всех aiohttp соединений
|
||||
await asyncio.sleep(0.2)
|
||||
|
||||
logger.info("Бот корректно остановлен")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
@@ -92,4 +118,13 @@ if __name__ == '__main__':
|
||||
try:
|
||||
loop.run_until_complete(main())
|
||||
finally:
|
||||
# Закрываем все pending tasks
|
||||
pending = asyncio.all_tasks(loop)
|
||||
for task in pending:
|
||||
task.cancel()
|
||||
|
||||
# Ждем завершения всех задач
|
||||
if pending:
|
||||
loop.run_until_complete(asyncio.gather(*pending, return_exceptions=True))
|
||||
|
||||
loop.close()
|
||||
|
||||
Reference in New Issue
Block a user