2020-10-08 21:36:57 +08:00
|
|
|
|
"""
|
|
|
|
|
快捷导入
|
|
|
|
|
========
|
|
|
|
|
|
2022-01-12 18:19:21 +08:00
|
|
|
|
为方便使用,`nonebot` 模块从子模块导入了部分内容
|
|
|
|
|
|
|
|
|
|
- `on_message` => `nonebot.plugin.on_message`
|
|
|
|
|
- `on_notice` => `nonebot.plugin.on_notice`
|
|
|
|
|
- `on_request` => `nonebot.plugin.on_request`
|
|
|
|
|
- `on_metaevent` => `nonebot.plugin.on_metaevent`
|
|
|
|
|
- `on_startswith` => `nonebot.plugin.on_startswith`
|
|
|
|
|
- `on_endswith` => `nonebot.plugin.on_endswith`
|
|
|
|
|
- `on_keyword` => `nonebot.plugin.on_keyword`
|
|
|
|
|
- `on_command` => `nonebot.plugin.on_command`
|
|
|
|
|
- `on_shell_command` => `nonebot.plugin.on_shell_command`
|
|
|
|
|
- `on_regex` => `nonebot.plugin.on_regex`
|
|
|
|
|
- `CommandGroup` => `nonebot.plugin.CommandGroup`
|
|
|
|
|
- `Matchergroup` => `nonebot.plugin.MatcherGroup`
|
|
|
|
|
- `load_plugin` => `nonebot.plugin.load_plugin`
|
|
|
|
|
- `load_plugins` => `nonebot.plugin.load_plugins`
|
|
|
|
|
- `load_all_plugins` => `nonebot.plugin.load_all_plugins`
|
|
|
|
|
- `load_from_json` => `nonebot.plugin.load_from_json`
|
|
|
|
|
- `load_from_toml` => `nonebot.plugin.load_from_toml`
|
|
|
|
|
- `load_builtin_plugin` => `nonebot.plugin.load_builtin_plugin`
|
|
|
|
|
- `load_builtin_plugins` => `nonebot.plugin.load_builtin_plugins`
|
|
|
|
|
- `get_plugin` => `nonebot.plugin.get_plugin`
|
|
|
|
|
- `get_loaded_plugins` => `nonebot.plugin.get_loaded_plugins`
|
|
|
|
|
- `export` => `nonebot.plugin.export`
|
|
|
|
|
- `require` => `nonebot.plugin.require`
|
2020-10-08 21:36:57 +08:00
|
|
|
|
"""
|
2020-06-30 10:13:58 +08:00
|
|
|
|
|
2020-07-04 22:51:10 +08:00
|
|
|
|
import importlib
|
2021-06-15 01:23:12 +08:00
|
|
|
|
from typing import Any, Dict, Type, Optional
|
2020-12-06 02:30:19 +08:00
|
|
|
|
|
2021-09-18 16:11:03 +08:00
|
|
|
|
import pkg_resources
|
|
|
|
|
|
2020-12-07 00:06:09 +08:00
|
|
|
|
from nonebot.adapters import Bot
|
2020-12-06 02:30:19 +08:00
|
|
|
|
from nonebot.utils import escape_tag
|
|
|
|
|
from nonebot.config import Env, Config
|
|
|
|
|
from nonebot.log import logger, default_filter
|
2021-12-23 17:20:26 +08:00
|
|
|
|
from nonebot.drivers import Driver, ReverseDriver, combine_driver
|
2020-07-04 22:51:10 +08:00
|
|
|
|
|
2021-02-22 10:44:42 +08:00
|
|
|
|
try:
|
2021-11-22 23:21:26 +08:00
|
|
|
|
_dist: pkg_resources.Distribution = pkg_resources.get_distribution("nonebot2")
|
2021-02-22 10:44:42 +08:00
|
|
|
|
__version__ = _dist.version
|
|
|
|
|
VERSION = _dist.parsed_version
|
2021-12-16 17:28:57 +08:00
|
|
|
|
except pkg_resources.DistributionNotFound: # pragma: no cover
|
2021-02-22 10:44:42 +08:00
|
|
|
|
__version__ = None
|
|
|
|
|
VERSION = None
|
2020-11-15 16:18:23 +08:00
|
|
|
|
|
2020-08-14 17:41:24 +08:00
|
|
|
|
_driver: Optional[Driver] = None
|
2020-07-04 22:51:10 +08:00
|
|
|
|
|
|
|
|
|
|
2020-12-05 17:19:23 +08:00
|
|
|
|
def get_driver() -> Driver:
|
2020-08-18 17:24:49 +08:00
|
|
|
|
"""
|
2022-01-12 18:16:05 +08:00
|
|
|
|
获取全局 Driver 对象。可用于在计划任务的回调中获取当前 Driver 对象。
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2022-01-12 18:43:07 +08:00
|
|
|
|
返回:
|
2022-01-12 18:25:25 +08:00
|
|
|
|
Driver: 全局 Driver 对象
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2022-01-12 18:45:35 +08:00
|
|
|
|
异常:
|
2022-01-12 18:25:25 +08:00
|
|
|
|
ValueError: 全局 Driver 对象尚未初始化 (nonebot.init 尚未调用)
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2020-08-19 20:29:37 +08:00
|
|
|
|
:用法:
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
driver = nonebot.get_driver()
|
|
|
|
|
|
|
|
|
|
"""
|
2020-07-04 22:51:10 +08:00
|
|
|
|
if _driver is None:
|
|
|
|
|
raise ValueError("NoneBot has not been initialized.")
|
|
|
|
|
return _driver
|
|
|
|
|
|
|
|
|
|
|
2021-06-15 01:23:12 +08:00
|
|
|
|
def get_app() -> Any:
|
2020-08-18 17:24:49 +08:00
|
|
|
|
"""
|
2022-01-12 18:16:05 +08:00
|
|
|
|
获取全局 Driver 对应 Server App 对象。
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2022-01-12 18:43:07 +08:00
|
|
|
|
返回:
|
2022-01-12 18:25:25 +08:00
|
|
|
|
Any: Server App 对象
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2022-01-12 18:45:35 +08:00
|
|
|
|
异常:
|
2022-01-12 18:25:25 +08:00
|
|
|
|
ValueError: 全局 Driver 对象尚未初始化 (nonebot.init 尚未调用)
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2020-08-19 20:29:37 +08:00
|
|
|
|
:用法:
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
app = nonebot.get_app()
|
|
|
|
|
|
|
|
|
|
"""
|
2020-07-04 22:51:10 +08:00
|
|
|
|
driver = get_driver()
|
2021-06-15 01:23:12 +08:00
|
|
|
|
assert isinstance(
|
2021-11-22 23:21:26 +08:00
|
|
|
|
driver, ReverseDriver
|
|
|
|
|
), "app object is only available for reverse driver"
|
2020-07-04 22:51:10 +08:00
|
|
|
|
return driver.server_app
|
|
|
|
|
|
|
|
|
|
|
2021-06-15 01:23:12 +08:00
|
|
|
|
def get_asgi() -> Any:
|
2020-08-18 17:24:49 +08:00
|
|
|
|
"""
|
2022-01-12 18:16:05 +08:00
|
|
|
|
获取全局 Driver 对应 Asgi 对象。
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2022-01-12 18:43:07 +08:00
|
|
|
|
返回:
|
2022-01-12 18:25:25 +08:00
|
|
|
|
Any: Asgi 对象
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2022-01-12 18:45:35 +08:00
|
|
|
|
异常:
|
2022-01-12 18:25:25 +08:00
|
|
|
|
ValueError: 全局 Driver 对象尚未初始化 (nonebot.init 尚未调用)
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2020-08-19 20:29:37 +08:00
|
|
|
|
:用法:
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
asgi = nonebot.get_asgi()
|
|
|
|
|
|
|
|
|
|
"""
|
2020-07-04 22:51:10 +08:00
|
|
|
|
driver = get_driver()
|
2021-06-15 01:23:12 +08:00
|
|
|
|
assert isinstance(
|
2021-11-22 23:21:26 +08:00
|
|
|
|
driver, ReverseDriver
|
|
|
|
|
), "asgi object is only available for reverse driver"
|
2020-07-04 22:51:10 +08:00
|
|
|
|
return driver.asgi
|
|
|
|
|
|
|
|
|
|
|
2021-06-27 14:03:54 +08:00
|
|
|
|
def get_bot(self_id: Optional[str] = None) -> Bot:
|
|
|
|
|
"""
|
2022-01-12 18:16:05 +08:00
|
|
|
|
当提供 self_id 时,此函数是 get_bots()[self_id] 的简写;当不提供时,返回一个 Bot。
|
2021-06-27 14:03:54 +08:00
|
|
|
|
|
2022-01-12 18:31:12 +08:00
|
|
|
|
参数:
|
2022-01-12 18:25:25 +08:00
|
|
|
|
self_id: 用来识别 Bot 的 ID
|
2021-06-27 14:03:54 +08:00
|
|
|
|
|
2022-01-12 18:43:07 +08:00
|
|
|
|
返回:
|
2022-01-12 18:25:25 +08:00
|
|
|
|
Bot: Bot 对象
|
2021-06-27 14:03:54 +08:00
|
|
|
|
|
2022-01-12 18:45:35 +08:00
|
|
|
|
异常:
|
2022-01-12 18:25:25 +08:00
|
|
|
|
KeyError: 对应 ID 的 Bot 不存在
|
|
|
|
|
ValueError: 全局 Driver 对象尚未初始化 (nonebot.init 尚未调用)
|
|
|
|
|
ValueError: 没有传入 ID 且没有 Bot 可用
|
2021-06-27 14:03:54 +08:00
|
|
|
|
|
|
|
|
|
:用法:
|
|
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
assert nonebot.get_bot('12345') == nonebot.get_bots()['12345']
|
|
|
|
|
|
|
|
|
|
another_unspecified_bot = nonebot.get_bot()
|
|
|
|
|
"""
|
|
|
|
|
bots = get_bots()
|
|
|
|
|
if self_id is not None:
|
|
|
|
|
return bots[self_id]
|
|
|
|
|
|
|
|
|
|
for bot in bots.values():
|
|
|
|
|
return bot
|
|
|
|
|
|
|
|
|
|
raise ValueError("There are no bots to get.")
|
|
|
|
|
|
|
|
|
|
|
2020-12-05 17:19:23 +08:00
|
|
|
|
def get_bots() -> Dict[str, Bot]:
|
2020-08-18 17:24:49 +08:00
|
|
|
|
"""
|
2022-01-12 18:16:05 +08:00
|
|
|
|
获取所有通过 ws 连接 NoneBot 的 Bot 对象。
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2022-01-12 18:43:07 +08:00
|
|
|
|
返回:
|
2022-01-12 18:25:25 +08:00
|
|
|
|
Dict[str, Bot]: 一个以字符串 ID 为键,Bot 对象为值的字典
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2022-01-12 18:45:35 +08:00
|
|
|
|
异常:
|
2022-01-12 18:25:25 +08:00
|
|
|
|
ValueError: 全局 Driver 对象尚未初始化 (nonebot.init 尚未调用)
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2020-08-19 20:29:37 +08:00
|
|
|
|
:用法:
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
bots = nonebot.get_bots()
|
|
|
|
|
|
|
|
|
|
"""
|
2020-08-15 17:47:50 +08:00
|
|
|
|
driver = get_driver()
|
|
|
|
|
return driver.bots
|
|
|
|
|
|
|
|
|
|
|
2021-12-23 17:20:26 +08:00
|
|
|
|
def _resolve_dot_notation(
|
|
|
|
|
obj_str: str, default_attr: str, default_prefix: Optional[str] = None
|
|
|
|
|
) -> Any:
|
|
|
|
|
modulename, _, cls = obj_str.partition(":")
|
|
|
|
|
if default_prefix is not None and modulename.startswith("~"):
|
|
|
|
|
modulename = default_prefix + modulename[1:]
|
|
|
|
|
module = importlib.import_module(modulename)
|
|
|
|
|
if not cls:
|
|
|
|
|
return getattr(module, default_attr)
|
|
|
|
|
instance = module
|
|
|
|
|
for attr_str in cls.split("."):
|
|
|
|
|
instance = getattr(instance, attr_str)
|
|
|
|
|
return instance
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _resolve_combine_expr(obj_str: str) -> Type[Driver]:
|
|
|
|
|
drivers = obj_str.split("+")
|
|
|
|
|
DriverClass = _resolve_dot_notation(
|
|
|
|
|
drivers[0], "Driver", default_prefix="nonebot.drivers."
|
|
|
|
|
)
|
|
|
|
|
if len(drivers) == 1:
|
2021-12-24 15:04:18 +08:00
|
|
|
|
logger.trace(f"Detected driver {DriverClass} with no mixins.")
|
2021-12-23 17:20:26 +08:00
|
|
|
|
return DriverClass
|
|
|
|
|
mixins = [
|
|
|
|
|
_resolve_dot_notation(mixin, "Mixin", default_prefix="nonebot.drivers.")
|
|
|
|
|
for mixin in drivers[1:]
|
|
|
|
|
]
|
2021-12-24 15:04:18 +08:00
|
|
|
|
logger.trace(f"Detected driver {DriverClass} with mixins {mixins}.")
|
2021-12-23 17:20:26 +08:00
|
|
|
|
return combine_driver(DriverClass, *mixins)
|
|
|
|
|
|
|
|
|
|
|
2020-08-07 11:18:02 +08:00
|
|
|
|
def init(*, _env_file: Optional[str] = None, **kwargs):
|
2020-08-18 17:24:49 +08:00
|
|
|
|
"""
|
2022-01-12 18:16:05 +08:00
|
|
|
|
初始化 NoneBot 以及 全局 Driver 对象。
|
2020-08-19 20:29:37 +08:00
|
|
|
|
|
2022-01-12 18:16:05 +08:00
|
|
|
|
NoneBot 将会从 .env 文件中读取环境信息,并使用相应的 env 文件配置。
|
2020-08-19 20:29:37 +08:00
|
|
|
|
|
2022-01-12 18:16:05 +08:00
|
|
|
|
你也可以传入自定义的 _env_file 来指定 NoneBot 从该文件读取配置。
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2022-01-12 18:31:12 +08:00
|
|
|
|
参数:
|
2022-01-12 18:25:25 +08:00
|
|
|
|
_env_file: 配置文件名,默认从 .env.{env_name} 中读取配置
|
|
|
|
|
**kwargs: 任意变量,将会存储到 Config 对象里
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2020-08-19 20:29:37 +08:00
|
|
|
|
:用法:
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
nonebot.init(database=Database(...))
|
|
|
|
|
|
|
|
|
|
"""
|
2020-07-04 22:51:10 +08:00
|
|
|
|
global _driver
|
2020-08-27 16:43:58 +08:00
|
|
|
|
if not _driver:
|
2021-04-19 21:15:10 +08:00
|
|
|
|
logger.success("NoneBot is initializing...")
|
2020-08-27 16:43:58 +08:00
|
|
|
|
env = Env()
|
2021-11-22 23:21:26 +08:00
|
|
|
|
config = Config(
|
|
|
|
|
**kwargs,
|
|
|
|
|
_common_config=env.dict(),
|
|
|
|
|
_env_file=_env_file or f".env.{env.environment}",
|
|
|
|
|
)
|
2020-07-04 22:51:10 +08:00
|
|
|
|
|
2021-12-28 15:19:53 +08:00
|
|
|
|
default_filter.level = config.log_level
|
2021-08-12 16:45:22 +08:00
|
|
|
|
logger.opt(colors=True).info(
|
2021-11-22 23:21:26 +08:00
|
|
|
|
f"Current <y><b>Env: {escape_tag(env.environment)}</b></y>"
|
|
|
|
|
)
|
2020-09-30 18:01:31 +08:00
|
|
|
|
logger.opt(colors=True).debug(
|
2021-11-22 23:21:26 +08:00
|
|
|
|
f"Loaded <y><b>Config</b></y>: {escape_tag(str(config.dict()))}"
|
|
|
|
|
)
|
2020-07-04 22:51:10 +08:00
|
|
|
|
|
2021-12-23 17:20:26 +08:00
|
|
|
|
DriverClass: Type[Driver] = _resolve_combine_expr(config.driver)
|
2020-08-27 16:43:58 +08:00
|
|
|
|
_driver = DriverClass(env, config)
|
2020-07-04 22:51:10 +08:00
|
|
|
|
|
|
|
|
|
|
2021-12-16 17:28:57 +08:00
|
|
|
|
def run(*args: Any, **kwargs: Any) -> None:
|
2020-08-18 17:24:49 +08:00
|
|
|
|
"""
|
2022-01-12 18:16:05 +08:00
|
|
|
|
启动 NoneBot,即运行全局 Driver 对象。
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2022-01-12 18:31:12 +08:00
|
|
|
|
参数:
|
2022-01-12 18:25:25 +08:00
|
|
|
|
*args: 传入 Driver.run 的位置参数
|
|
|
|
|
**kwargs: 传入 Driver.run 的命名参数
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
2020-08-19 20:29:37 +08:00
|
|
|
|
:用法:
|
2020-08-18 17:24:49 +08:00
|
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
nonebot.run(host="127.0.0.1", port=8080)
|
|
|
|
|
|
|
|
|
|
"""
|
2021-04-19 21:15:10 +08:00
|
|
|
|
logger.success("Running NoneBot...")
|
2021-12-16 17:28:57 +08:00
|
|
|
|
get_driver().run(*args, **kwargs)
|
2020-06-30 10:13:58 +08:00
|
|
|
|
|
|
|
|
|
|
2021-11-16 18:30:16 +08:00
|
|
|
|
import nonebot.params as params
|
2021-09-18 16:11:03 +08:00
|
|
|
|
from nonebot.plugin import export as export
|
|
|
|
|
from nonebot.plugin import require as require
|
|
|
|
|
from nonebot.plugin import on_regex as on_regex
|
|
|
|
|
from nonebot.plugin import on_notice as on_notice
|
|
|
|
|
from nonebot.plugin import get_plugin as get_plugin
|
|
|
|
|
from nonebot.plugin import on_command as on_command
|
|
|
|
|
from nonebot.plugin import on_keyword as on_keyword
|
|
|
|
|
from nonebot.plugin import on_message as on_message
|
|
|
|
|
from nonebot.plugin import on_request as on_request
|
|
|
|
|
from nonebot.plugin import load_plugin as load_plugin
|
|
|
|
|
from nonebot.plugin import on_endswith as on_endswith
|
|
|
|
|
from nonebot.plugin import CommandGroup as CommandGroup
|
|
|
|
|
from nonebot.plugin import MatcherGroup as MatcherGroup
|
|
|
|
|
from nonebot.plugin import load_plugins as load_plugins
|
|
|
|
|
from nonebot.plugin import on_metaevent as on_metaevent
|
|
|
|
|
from nonebot.plugin import on_startswith as on_startswith
|
|
|
|
|
from nonebot.plugin import load_from_json as load_from_json
|
|
|
|
|
from nonebot.plugin import load_from_toml as load_from_toml
|
|
|
|
|
from nonebot.plugin import load_all_plugins as load_all_plugins
|
|
|
|
|
from nonebot.plugin import on_shell_command as on_shell_command
|
|
|
|
|
from nonebot.plugin import get_loaded_plugins as get_loaded_plugins
|
2022-01-10 22:52:10 +08:00
|
|
|
|
from nonebot.plugin import load_builtin_plugin as load_builtin_plugin
|
2021-09-18 16:11:03 +08:00
|
|
|
|
from nonebot.plugin import load_builtin_plugins as load_builtin_plugins
|