Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ 支持配置额外的适配器 #24

Merged
merged 1 commit into from
Sep 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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