Skip to content

Commit

Permalink
✨ 支持配置额外的适配器 (#24)
Browse files Browse the repository at this point in the history
  • Loading branch information
A-kirami committed Sep 5, 2023
1 parent 7ee27f1 commit 0ebf9aa
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 13 deletions.
36 changes: 24 additions & 12 deletions kirami/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,13 @@

from kirami import patch # isort:skip # noqa: F401

import importlib
from pathlib import Path
from typing import Any, ClassVar

import nonebot
from fastapi import FastAPI
from nonebot.adapters.onebot.v11 import Adapter as OneBotAdapter
from nonebot.adapters.onebot.v11 import Bot
from nonebot.drivers.fastapi import Driver
from nonebot.adapters import Bot
from nonebot.drivers import Driver, ReverseDriver
from nonebot.plugin.manager import PluginManager, _managers
from nonebot.plugin.plugin import Plugin
from nonebot.utils import path_to_module_name
Expand All @@ -57,25 +56,29 @@ def get_driver() -> Driver:
return KiramiBot.driver


def get_app() -> FastAPI:
def get_app() -> Any:
"""获取全局`ReverseDriver`对应的 Server App 对象。
### 异常
AssertionError: 全局 Driver 对象不是 `nonebot.drivers.ReverseDriver` 类型
ValueError: 全局 `nonebot.drivers.Driver` 对象尚未初始化(`kirami.KiramiBot` 尚未实例化)
"""
driver = get_driver()
if not isinstance(driver, ReverseDriver):
raise TypeError("app object is only available for reverse driver")
return driver.server_app


def get_asgi() -> FastAPI:
def get_asgi() -> Any:
"""获取全局`ReverseDriver`对应 [ASGI](https://asgi.readthedocs.io/) 对象。
### 异常
AssertionError: 全局 Driver 对象不是 `nonebot.drivers.ReverseDriver` 类型
ValueError: 全局 `nonebot.drivers.Driver` 对象尚未初始化(`kirami.KiramiBot` 尚未实例化)
"""
driver = get_driver()
if not isinstance(driver, ReverseDriver):
raise TypeError("asgi object is only available for reverse driver")
return driver.asgi


Expand Down Expand Up @@ -130,7 +133,6 @@ def get_bot_ids() -> list[str]:

class KiramiBot:
driver: ClassVar[Driver]
asgi: ClassVar[FastAPI]

def __init__(self) -> None:
self.show_logo()
Expand All @@ -139,11 +141,7 @@ def __init__(self) -> None:
self.print_environment()
console.rule()

nonebot.init(**_mixin_config(bot_config.dict()))

self.__class__.driver = nonebot.get_driver() # type: ignore
self.__class__.driver.register_adapter(OneBotAdapter)
self.__class__.asgi = nonebot.get_asgi()
self.init_nonebot(_mixin_config(bot_config.dict()))

logger.success("🌟 KiramiBot is initializing...")
logger.opt(colors=True).debug(
Expand All @@ -164,6 +162,20 @@ def run(self, *args, **kwargs) -> None:
"""启动 KiramiBot"""
self.driver.run(*args, **kwargs)

def init_nonebot(self, config: dict[str, Any]) -> None:
"""初始化 NoneNot"""
nonebot.init(**config)

self.__class__.driver = nonebot.get_driver()
self.load_adapters(config["adapters"])

def load_adapters(self, adapters: set[str]) -> None:
"""加载适配器"""
adapters = {adapter.replace("~", "nonebot.adapters.") for adapter in adapters}
for adapter in adapters:
module = importlib.import_module(adapter)
self.driver.register_adapter(getattr(module, "Adapter"))

def load_plugins(self) -> None:
"""加载插件"""
plugins = {
Expand Down
5 changes: 4 additions & 1 deletion kirami/config/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,10 @@ class BotConfig(BaseConfig):
"""

driver: str = "nonebot.drivers.fastapi"
"""KiramiBot 运行所使用的 ``Driver``"""
"""KiramiBot 运行所使用的 `Driver`"""

adapters: set[str] = {"~onebot.v11"}
"""KiramiBot 所使用的 `Adapter`"""

host: IPvAnyAddress = IPv4Address("127.0.0.1") # type: ignore
"""KiramiBot 的 HTTP 和 WebSocket 服务端监听的 IP/主机名"""
Expand Down

0 comments on commit 0ebf9aa

Please sign in to comment.