Files
AstrBot/astrbot/core/core_lifecycle.py
2024-11-27 15:04:30 +08:00

59 lines
2.4 KiB
Python

import asyncio, time, threading
from .event_bus import EventBus
from asyncio import Queue
from typing import List
from core.config.astrbot_config import AstrBotConfig
from core.message_event_handler import MessageEventHandler
from core.plugin import PluginManager
from core import LogBroker
from core.utils.metrics import MetricUploader
from core.db import BaseDatabase
from core.updator import AstrBotUpdator
from core import logger
from core.config.default import VERSION
class AstrBotCoreLifecycle:
def __init__(self, log_broker: LogBroker, db: BaseDatabase):
self.log_broker = log_broker
self.astrbot_config = AstrBotConfig()
logger.info("AstrBot v"+ VERSION)
logger.setLevel(self.astrbot_config.log_level)
self.event_queue = Queue()
self.event_queue.closed = False
self.plugin_manager = PluginManager(self.astrbot_config, self.event_queue, db)
self.message_event_handler = MessageEventHandler(self.astrbot_config, self.plugin_manager)
self.metrics_uploader = MetricUploader(db)
self.astrbot_updator = AstrBotUpdator(self.astrbot_config.plugin_repo_mirror)
self.event_bus = EventBus(self.event_queue, self.message_event_handler)
self.stop_flag = False
self.start_time = int(time.time())
self.curr_tasks: List[asyncio.Task] = []
def _load(self):
self.plugin_manager.reload()
platform_tasks = self.load_platform()
event_bus_task = asyncio.create_task(self.event_bus.dispatch(), name="event_bus")
metrics_uploader_task = asyncio.create_task(self.metrics_uploader.upload_metrics(), name="metrics")
self.curr_tasks = [event_bus_task, metrics_uploader_task, *platform_tasks]
self.start_time = int(time.time())
async def start(self):
self._load()
await asyncio.gather(*self.curr_tasks, return_exceptions=True)
def stop(self):
self.stop_flag = True
def restart(self):
self.event_queue.closed = True
threading.Thread(target=self.astrbot_updator._reboot, name="restart", daemon=True).start()
def load_platform(self) -> List[asyncio.Task]:
tasks = []
platform_insts = self.plugin_manager.get_platform_insts()
for platform_inst in platform_insts:
tasks.append(asyncio.create_task(platform_inst.run(), name=platform_inst.meta().name))
return tasks