🔀 Merge pull request #39

This commit is contained in:
Ju4tCode 2020-10-30 15:57:31 +08:00 committed by GitHub
commit 2eb330b8a8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
41 changed files with 568 additions and 149 deletions

View File

@ -1,7 +1,7 @@
name: Build API Doc name: Build API Doc
on: on:
pull_request: pull_request_target:
types: [ opened, synchronize, reopened ] types: [ opened, synchronize, reopened ]
jobs: jobs:
@ -12,6 +12,7 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
token: ${{ secrets.GH_TOKEN }}
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v2

View File

@ -0,0 +1,39 @@
<template>
<v-app>
<v-main>
<v-row>
<v-col
cols="12"
sm="6"
md="4"
v-for="(plugin, index) in plugins"
:key="index"
>
<v-card>
<v-card-title>{{ plugin.name }}</v-card-title>
<v-card-text>{{ plugin.desc }}</v-card-text>
</v-card>
</v-col>
</v-row>
</v-main>
</v-app>
</template>
<script>
import plugins from "../public/plugins.json";
export default {
name: "Plugins",
data() {
return {
plugins: plugins
};
}
};
</script>
<style>
.v-application--wrap {
min-height: 0 !important;
}
</style>

View File

@ -13,7 +13,8 @@ module.exports = context => ({
*/ */
head: [ head: [
["link", { rel: "icon", href: "/logo.png" }], ["link", { rel: "icon", href: "/logo.png" }],
["meta", { name: "theme-color", content: "#d32f2f" }], ["link", { rel: "manifest", href: "/manifest.json" }],
["meta", { name: "theme-color", content: "#ea5252" }],
["meta", { name: "application-name", content: "NoneBot" }], ["meta", { name: "application-name", content: "NoneBot" }],
["meta", { name: "apple-mobile-web-app-title", content: "NoneBot" }], ["meta", { name: "apple-mobile-web-app-title", content: "NoneBot" }],
["meta", { name: "apple-mobile-web-app-capable", content: "yes" }], ["meta", { name: "apple-mobile-web-app-capable", content: "yes" }],
@ -21,6 +22,26 @@ module.exports = context => ({
"meta", "meta",
{ name: "apple-mobile-web-app-status-bar-style", content: "black" } { name: "apple-mobile-web-app-status-bar-style", content: "black" }
], ],
[
"link",
{ rel: "apple-touch-icon", href: "/icons/apple-touch-icon-180x180.png" }
],
[
"link",
{
rel: "mask-icon",
href: "/icons/safari-pinned-tab.svg",
color: "#ea5252"
}
],
[
"meta",
{
name: "msapplication-TileImage",
content: "/icons/mstile-150x150.png"
}
],
["meta", { name: "msapplication-TileColor", content: "#ea5252" }],
[ [
"link", "link",
{ {
@ -58,7 +79,8 @@ module.exports = context => ({
nav: [ nav: [
{ text: "主页", link: "/" }, { text: "主页", link: "/" },
{ text: "指南", link: "/guide/" }, { text: "指南", link: "/guide/" },
{ text: "API", link: "/api/" } { text: "API", link: "/api/" },
{ text: "插件广场", link: "/plugin-store" }
], ],
sidebarDepth: 2, sidebarDepth: 2,
sidebar: { sidebar: {
@ -155,6 +177,16 @@ module.exports = context => ({
plugins: [ plugins: [
"@vuepress/plugin-back-to-top", "@vuepress/plugin-back-to-top",
"@vuepress/plugin-medium-zoom", "@vuepress/plugin-medium-zoom",
[
"@vuepress/pwa",
{
serviceWorker: true,
updatePopup: {
message: "发现新内容",
buttonText: "刷新"
}
}
],
[ [
"versioning", "versioning",
{ {

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 626 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1008 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -0,0 +1,29 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="500.000000pt" height="500.000000pt" viewBox="0 0 500.000000 500.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,500.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M2478 4525 c-2 -1 -57 -5 -122 -9 -65 -4 -122 -8 -125 -10 -3 -2 -30
-7 -60 -11 -141 -18 -404 -102 -561 -180 -68 -34 -238 -132 -250 -145 -3 -3
-32 -25 -65 -49 -246 -182 -465 -442 -604 -719 -212 -422 -271 -933 -159
-1377 11 -44 21 -88 23 -97 8 -38 86 -238 120 -308 206 -415 542 -749 952
-945 90 -43 265 -111 309 -119 11 -2 48 -12 84 -21 82 -21 94 -24 155 -31 28
-4 53 -8 56 -10 11 -6 172 -17 264 -17 88 -1 239 9 282 17 11 3 43 8 70 12
280 40 611 181 855 363 118 87 221 181 311 284 173 195 309 424 392 657 14 41
28 82 30 90 2 8 13 51 25 95 25 93 27 103 34 159 3 22 8 52 11 65 9 46 16 166
17 276 1 704 -363 1359 -960 1728 -201 125 -484 234 -677 263 -16 3 -52 9 -79
15 -27 5 -92 12 -145 15 -53 3 -115 7 -138 8 -23 2 -43 2 -45 1z m162 -89
c691 -39 1330 -482 1622 -1121 74 -163 137 -364 152 -490 4 -27 9 -63 11 -80
17 -106 21 -305 10 -430 -8 -84 -49 -307 -60 -325 -2 -4 -6 -20 -9 -36 -3 -17
-23 -77 -44 -135 -194 -521 -605 -937 -1124 -1135 -562 -214 -1202 -155 -1713
160 -317 195 -564 466 -735 806 -60 120 -141 358 -156 465 -3 17 -9 55 -15 85
-11 61 -23 217 -22 295 3 525 201 1002 571 1373 340 340 782 542 1247 568 55
3 101 7 102 8 2 1 20 1 40 0 21 -2 76 -5 123 -8z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,20 @@
{
"name": "NoneBot",
"short_name": "NoneBot",
"background-color": "#ffffff",
"theme-color": "#ea5252",
"description": "An asynchronous python bot framework.",
"display": "standalone",
"icons": [
{
"src": "/icons/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/icons/android-chrome-384x384.png",
"sizes": "384x384",
"type": "image/png"
}
]
}

View File

@ -0,0 +1,26 @@
[
{
"name": "nonebot-plugin-status",
"desc": "通过戳一戳获取服务器状态",
"author": "nonebot",
"repo": "nonebot/nonebot2"
},
{
"name": "nonebot-plugin-status",
"desc": "通过戳一戳获取服务器状态",
"author": "nonebot",
"repo": "nonebot/nonebot2"
},
{
"name": "nonebot-plugin-status",
"desc": "通过戳一戳获取服务器状态",
"author": "nonebot",
"repo": "nonebot/nonebot2"
},
{
"name": "nonebot-plugin-status",
"desc": "通过戳一戳获取服务器状态",
"author": "nonebot",
"repo": "nonebot/nonebot2"
}
]

View File

@ -394,9 +394,6 @@ sidebarDepth: 0
* `Type[Matcher]` * `Type[Matcher]`
* `MatcherGroup`
## `on_regex(pattern, flags=0, rule=None, **kwargs)` ## `on_regex(pattern, flags=0, rule=None, **kwargs)`
@ -510,9 +507,6 @@ sidebarDepth: 0
* `Type[Matcher]` * `Type[Matcher]`
* `MatcherGroup`
## `load_plugin(module_path)` ## `load_plugin(module_path)`

View File

@ -139,19 +139,21 @@ Rule(async_function, run_sync(sync_function))
## `command(command)` ## `command(*cmds)`
* **说明** * **说明**
命令形式匹配,根据配置里提供的 `command_start`, `command_sep` 判断消息是否为命令。 命令形式匹配,根据配置里提供的 `command_start`, `command_sep` 判断消息是否为命令。
可以通过 `state["_prefix"]["command"]` 获取匹配成功的命令(例:`("test",)`),通过 `state["_prefix"]["raw_command"]` 获取匹配成功的原始命令文本(例:`"/test"`)。
* **参数** * **参数**
* `command: Tuples[str, ...]`: 命令内容 * `*cmds: Union[str, Tuple[str, ...]]`: 命令内容

View File

@ -136,11 +136,11 @@ QQ 协议端举例:
现在,尝试向你的 QQ 机器人账号发送如下内容: 现在,尝试向你的 QQ 机器人账号发送如下内容:
```default ```default
/say 你好,世界 /echo 你好,世界
``` ```
到这里如果一切 OK你应该会收到机器人给你回复了 `你好,世界`。这一历史性的对话标志着你已经成功地运行了一个 NoneBot 的最小实例,开始了编写更强大的 QQ 机器人的创意之旅! 到这里如果一切 OK你应该会收到机器人给你回复了 `你好,世界`。这一历史性的对话标志着你已经成功地运行了一个 NoneBot 的最小实例,开始了编写更强大的 QQ 机器人的创意之旅!
<ClientOnly> <ClientOnly>
<Messenger :messages="[{ position: 'right', msg: '/say 你好,世界' }, { position: 'left', msg: '你好,世界' }]"/> <Messenger :messages="[{ position: 'right', msg: '/echo 你好,世界' }, { position: 'left', msg: '你好,世界' }]"/>
</ClientOnly> </ClientOnly>

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
快捷导入 快捷导入
======== ========

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
协议适配基类 协议适配基类
============ ============

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
CQHTTP (OneBot) v11 协议适配 CQHTTP (OneBot) v11 协议适配
============================ ============================

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
配置 配置
==== ====

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
后端驱动适配基类 后端驱动适配基类
=============== ===============

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
FastAPI 驱动适配 FastAPI 驱动适配
================ ================
@ -32,7 +30,7 @@ def get_auth_bearer(access_token: Optional[str] = Header(
if not access_token: if not access_token:
return None return None
scheme, _, param = access_token.partition(" ") scheme, _, param = access_token.partition(" ")
if scheme.lower() != "bearer": if scheme.lower() not in ["bearer", "token"]:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED,
detail="Not authenticated", detail="Not authenticated",
headers={"WWW-Authenticate": "Bearer"}) headers={"WWW-Authenticate": "Bearer"})

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
异常 异常
==== ====

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
日志 日志
==== ====

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
事件响应器 事件响应器
========== ==========
@ -496,6 +494,7 @@ class MatcherGroup:
return matcher return matcher
def args_parser(self, func: ArgsParser) -> ArgsParser: def args_parser(self, func: ArgsParser) -> ArgsParser:
self._default_parser = func
for matcher in self.matchers: for matcher in self.matchers:
matcher.args_parser(func) matcher.args_parser(func)
return func return func
@ -571,37 +570,38 @@ class MatcherGroup:
return _decorator return _decorator
async def send(self, message: Union[str, Message, MessageSegment]): async def send(self, message: Union[str, Message, MessageSegment],
**kwargs):
bot = current_bot.get() bot = current_bot.get()
event = current_event.get() event = current_event.get()
await bot.send(event=event, message=message) await bot.send(event=event, message=message, **kwargs)
async def finish( async def finish(self,
self, message: Optional[Union[str, Message,
message: Optional[Union[str, Message, MessageSegment]] = None,
MessageSegment]] = None) -> NoReturn: **kwargs) -> NoReturn:
bot = current_bot.get() bot = current_bot.get()
event = current_event.get() event = current_event.get()
if message: if message:
await bot.send(event=event, message=message) await bot.send(event=event, message=message, **kwargs)
raise FinishedException raise FinishedException
async def pause( async def pause(self,
self, prompt: Optional[Union[str, Message,
prompt: Optional[Union[str, Message, MessageSegment]] = None,
MessageSegment]] = None) -> NoReturn: **kwargs) -> NoReturn:
bot = current_bot.get() bot = current_bot.get()
event = current_event.get() event = current_event.get()
if prompt: if prompt:
await bot.send(event=event, message=prompt) await bot.send(event=event, message=prompt, **kwargs)
raise PausedException raise PausedException
async def reject( async def reject(self,
self, prompt: Optional[Union[str, Message,
prompt: Optional[Union[str, Message, MessageSegment]] = None,
MessageSegment]] = None) -> NoReturn: **kwargs) -> NoReturn:
bot = current_bot.get() bot = current_bot.get()
event = current_event.get() event = current_event.get()
if prompt: if prompt:
await bot.send(event=event, message=prompt) await bot.send(event=event, message=prompt, **kwargs)
raise RejectedException raise RejectedException

View File

@ -1,6 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import asyncio import asyncio
from datetime import datetime from datetime import datetime
@ -57,6 +54,7 @@ async def _run_matcher(Matcher: Type[Matcher], bot: Bot, event: Event,
async def handle_event(bot: Bot, event: Event): async def handle_event(bot: Bot, event: Event):
show_log = True
log_msg = f"<m>{bot.type.upper()} </m>| {event.self_id} [{event.name}]: " log_msg = f"<m>{bot.type.upper()} </m>| {event.self_id} [{event.name}]: "
if event.type == "message": if event.type == "message":
log_msg += f"Message {event.id} from " log_msg += f"Message {event.id} from "
@ -74,8 +72,10 @@ async def handle_event(bot: Bot, event: Event):
elif event.type == "request": elif event.type == "request":
log_msg += f"Request {event.raw_event}" log_msg += f"Request {event.raw_event}"
elif event.type == "meta_event": elif event.type == "meta_event":
log_msg += f"MetaEvent {event.detail_type}" # log_msg += f"MetaEvent {event.detail_type}"
logger.opt(colors=True).info(log_msg) show_log = False
if show_log:
logger.opt(colors=True).info(log_msg)
coros = [] coros = []
state = {} state = {}
@ -103,7 +103,8 @@ async def handle_event(bot: Bot, event: Event):
for matcher in matchers[priority] for matcher in matchers[priority]
] ]
logger.debug(f"Checking for matchers in priority {priority}...") if show_log:
logger.debug(f"Checking for matchers in priority {priority}...")
results = await asyncio.gather(*pending_tasks, return_exceptions=True) results = await asyncio.gather(*pending_tasks, return_exceptions=True)
i = 0 i = 0

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
权限 权限
==== ====

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
插件 插件
==== ====
@ -15,9 +13,9 @@ from dataclasses import dataclass
from importlib._bootstrap import _load from importlib._bootstrap import _load
from nonebot.log import logger from nonebot.log import logger
from nonebot.matcher import Matcher
from nonebot.permission import Permission from nonebot.permission import Permission
from nonebot.typing import Handler, RuleChecker from nonebot.typing import Handler, RuleChecker
from nonebot.matcher import Matcher, MatcherGroup
from nonebot.rule import Rule, startswith, endswith, command, regex from nonebot.rule import Rule, startswith, endswith, command, regex
from nonebot.typing import Any, Set, List, Dict, Type, Tuple, Union, Optional, ModuleType from nonebot.typing import Any, Set, List, Dict, Type, Tuple, Union, Optional, ModuleType
@ -263,7 +261,7 @@ def on_endswith(msg: str,
def on_command(cmd: Union[str, Tuple[str, ...]], def on_command(cmd: Union[str, Tuple[str, ...]],
rule: Optional[Union[Rule, RuleChecker]] = None, rule: Optional[Union[Rule, RuleChecker]] = None,
aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = None, aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = None,
**kwargs) -> Union[Type[Matcher], MatcherGroup]: **kwargs) -> Type[Matcher]:
""" """
:说明: :说明:
注册一个消息事件响应器并且当消息以指定命令开头时响应 注册一个消息事件响应器并且当消息以指定命令开头时响应
@ -281,10 +279,7 @@ def on_command(cmd: Union[str, Tuple[str, ...]],
* ``state: Optional[dict]``: 默认的 state * ``state: Optional[dict]``: 默认的 state
:返回: :返回:
- ``Type[Matcher]`` - ``Type[Matcher]``
- ``MatcherGroup``
""" """
if isinstance(cmd, str):
cmd = (cmd,)
async def _strip_cmd(bot, event, state: dict): async def _strip_cmd(bot, event, state: dict):
message = event.message message = event.message
@ -294,19 +289,10 @@ def on_command(cmd: Union[str, Tuple[str, ...]],
handlers = kwargs.pop("handlers", []) handlers = kwargs.pop("handlers", [])
handlers.insert(0, _strip_cmd) handlers.insert(0, _strip_cmd)
if aliases: commands = set([cmd]) | (aliases or set())
aliases = set(map(lambda x: (x,) if isinstance(x, str) else x, aliases)) return on_message(command(*commands) & rule, handlers=handlers, **
group = MatcherGroup("message", kwargs) if rule else on_message(
Rule() & rule, command(*commands), handlers=handlers, **kwargs)
handlers=handlers,
**kwargs)
for cmd_ in [cmd, *aliases]:
_tmp_matchers.add(group.new(rule=command(cmd_)))
return group
else:
return on_message(command(cmd) & rule, handlers=handlers, **
kwargs) if rule else on_message(
command(cmd), handlers=handlers, **kwargs)
def on_regex(pattern: str, def on_regex(pattern: str,
@ -359,7 +345,7 @@ class CommandGroup:
""" """
def command(self, cmd: Union[str, Tuple[str, ...]], def command(self, cmd: Union[str, Tuple[str, ...]],
**kwargs) -> Union[Type[Matcher], MatcherGroup]: **kwargs) -> Type[Matcher]:
""" """
:说明: :说明:
注册一个新的命令 注册一个新的命令
@ -368,7 +354,6 @@ class CommandGroup:
* ``**kwargs``: 其他传递给 ``on_command`` 的参数将会覆盖命令组默认值 * ``**kwargs``: 其他传递给 ``on_command`` 的参数将会覆盖命令组默认值
:返回: :返回:
- ``Type[Matcher]`` - ``Type[Matcher]``
- ``MatcherGroup``
""" """
sub_cmd = (cmd,) if isinstance(cmd, str) else cmd sub_cmd = (cmd,) if isinstance(cmd, str) else cmd
cmd = self.basecmd + sub_cmd cmd = self.basecmd + sub_cmd

View File

@ -1,10 +1,6 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re import re
from typing import overload
from nonebot.typing import Rule, Matcher, Handler, Permission, RuleChecker, MatcherGroup from nonebot.typing import Rule, Matcher, Handler, Permission, RuleChecker
from nonebot.typing import Set, List, Dict, Type, Tuple, Union, Optional, ModuleType from nonebot.typing import Set, List, Dict, Type, Tuple, Union, Optional, ModuleType
plugins: Dict[str, "Plugin"] = ... plugins: Dict[str, "Plugin"] = ...
@ -95,10 +91,9 @@ def on_endswith(msg: str,
... ...
@overload
def on_command(cmd: Union[str, Tuple[str, ...]], def on_command(cmd: Union[str, Tuple[str, ...]],
rule: Optional[Union[Rule, RuleChecker]] = ..., rule: Optional[Union[Rule, RuleChecker]] = ...,
aliases: None = ..., aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = ...,
permission: Optional[Permission] = ..., permission: Optional[Permission] = ...,
*, *,
handlers: Optional[List[Handler]] = ..., handlers: Optional[List[Handler]] = ...,
@ -109,20 +104,6 @@ def on_command(cmd: Union[str, Tuple[str, ...]],
... ...
@overload
def on_command(cmd: Union[str, Tuple[str, ...]],
rule: Optional[Union[Rule, RuleChecker]] = ...,
aliases: Set[Union[str, Tuple[str, ...]]] = ...,
permission: Optional[Permission] = ...,
*,
handlers: Optional[List[Handler]] = ...,
temp: bool = ...,
priority: int = ...,
block: bool = ...,
state: Optional[dict] = ...) -> MatcherGroup:
...
def on_regex(pattern: str, def on_regex(pattern: str,
flags: Union[int, re.RegexFlag] = 0, flags: Union[int, re.RegexFlag] = 0,
rule: Optional[Rule] = ..., rule: Optional[Rule] = ...,
@ -166,16 +147,15 @@ class CommandGroup:
state: Optional[dict] = ...): state: Optional[dict] = ...):
... ...
def command( def command(self,
self, cmd: Union[str, Tuple[str, ...]],
cmd: Union[str, Tuple[str, ...]], rule: Optional[Union[Rule, RuleChecker]] = ...,
rule: Optional[Union[Rule, RuleChecker]] = ..., aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = ...,
aliases: Set[Union[str, Tuple[str, ...]]] = ..., permission: Optional[Permission] = ...,
permission: Optional[Permission] = ..., *,
*, handlers: Optional[List[Handler]] = ...,
handlers: Optional[List[Handler]] = ..., temp: bool = ...,
temp: bool = ..., priority: int = ...,
priority: int = ..., block: bool = ...,
block: bool = ..., state: Optional[dict] = ...) -> Type[Matcher]:
state: Optional[dict] = ...) -> Union[Type[Matcher], MatcherGroup]:
... ...

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
规则 规则
==== ====
@ -198,12 +196,14 @@ def keyword(msg: str) -> Rule:
return Rule(_keyword) return Rule(_keyword)
def command(command: Tuple[str, ...]) -> Rule: def command(*cmds: Union[str, Tuple[str, ...]]) -> Rule:
""" """
:说明: :说明:
命令形式匹配根据配置里提供的 ``command_start``, ``command_sep`` 判断消息是否为命令 命令形式匹配根据配置里提供的 ``command_start``, ``command_sep`` 判断消息是否为命令
可以通过 ``state["_prefix"]["command"]`` 获取匹配成功的命令``("test",)``通过 ``state["_prefix"]["raw_command"]`` 获取匹配成功的原始命令文本``"/test"``
:参数: :参数:
* ``command: Tuples[str, ...]``: 命令内容 * ``*cmds: Union[str, Tuple[str, ...]]``: 命令内容
:示例: :示例:
使用默认 ``command_start``, ``command_sep`` 配置 使用默认 ``command_start``, ``command_sep`` 配置
@ -218,15 +218,20 @@ def command(command: Tuple[str, ...]) -> Rule:
config = get_driver().config config = get_driver().config
command_start = config.command_start command_start = config.command_start
command_sep = config.command_sep command_sep = config.command_sep
if len(command) == 1: commands = list(cmds)
for start in command_start: for index, command in enumerate(commands):
TrieRule.add_prefix(f"{start}{command[0]}", command) if isinstance(command, str):
else: commands[index] = command = (command,)
for start, sep in product(command_start, command_sep):
TrieRule.add_prefix(f"{start}{sep.join(command)}", command) if len(command) == 1:
for start in command_start:
TrieRule.add_prefix(f"{start}{command[0]}", command)
else:
for start, sep in product(command_start, command_sep):
TrieRule.add_prefix(f"{start}{sep.join(command)}", command)
async def _command(bot: Bot, event: Event, state: dict) -> bool: async def _command(bot: Bot, event: Event, state: dict) -> bool:
return command == state["_prefix"]["command"] return state["_prefix"]["command"] in commands
return Rule(_command) return Rule(_command)
@ -234,7 +239,9 @@ def command(command: Tuple[str, ...]) -> Rule:
def regex(regex: str, flags: Union[int, re.RegexFlag] = 0) -> Rule: def regex(regex: str, flags: Union[int, re.RegexFlag] = 0) -> Rule:
""" """
:说明: :说明:
根据正则表达式进行匹配 根据正则表达式进行匹配
可以通过 ``state["_matched"]`` 获取正则表达式匹配成功的文本
:参数: :参数:
* ``regex: str``: 正则表达式 * ``regex: str``: 正则表达式
* ``flags: Union[int, re.RegexFlag]``: 正则标志 * ``flags: Union[int, re.RegexFlag]``: 正则标志
@ -247,8 +254,13 @@ def regex(regex: str, flags: Union[int, re.RegexFlag] = 0) -> Rule:
pattern = re.compile(regex, flags) pattern = re.compile(regex, flags)
async def _regex(bot: Bot, event: Event, state: dict) -> bool: async def _regex(bot: Bot, event: Event, state: dict) -> bool:
return bool(pattern.search(str(event.message))) matched = pattern.search(str(event.message))
if matched:
state["_matched"] = matched.group()
return True
else:
state["_matched"] = None
return False
return Rule(_regex) return Rule(_regex)

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
计划任务 计划任务
======== ========

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
类型 类型
==== ====

View File

@ -1,6 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re import re
import json import json
import asyncio import asyncio

333
package-lock.json generated
View File

@ -1050,6 +1050,45 @@
"to-fast-properties": "^2.0.0" "to-fast-properties": "^2.0.0"
} }
}, },
"@hapi/address": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
"integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==",
"dev": true
},
"@hapi/bourne": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz",
"integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==",
"dev": true
},
"@hapi/hoek": {
"version": "8.5.1",
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz",
"integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==",
"dev": true
},
"@hapi/joi": {
"version": "15.1.1",
"resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz",
"integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==",
"dev": true,
"requires": {
"@hapi/address": "2.x.x",
"@hapi/bourne": "1.x.x",
"@hapi/hoek": "8.x.x",
"@hapi/topo": "3.x.x"
}
},
"@hapi/topo": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz",
"integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==",
"dev": true,
"requires": {
"@hapi/hoek": "^8.3.0"
}
},
"@mrmlnc/readdir-enhanced": { "@mrmlnc/readdir-enhanced": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
@ -1454,6 +1493,17 @@
"nprogress": "^0.2.0" "nprogress": "^0.2.0"
} }
}, },
"@vuepress/plugin-pwa": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/@vuepress/plugin-pwa/-/plugin-pwa-1.7.1.tgz",
"integrity": "sha512-c3oozxPPGpraU+UnY3gp3sWnKYO3mOLcexQWXaYABWnUC3yFbHx4e8wIF8LGqp7Z75bjQuUoI+LcHqpQXyYNag==",
"dev": true,
"requires": {
"@vuepress/shared-utils": "1.7.1",
"register-service-worker": "^1.7.0",
"workbox-build": "^4.3.1"
}
},
"@vuepress/plugin-register-components": { "@vuepress/plugin-register-components": {
"version": "1.7.1", "version": "1.7.1",
"resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.7.1.tgz", "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.7.1.tgz",
@ -2076,6 +2126,15 @@
"integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==",
"dev": true "dev": true
}, },
"babel-extract-comments": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz",
"integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==",
"dev": true,
"requires": {
"babylon": "^6.18.0"
}
},
"babel-loader": { "babel-loader": {
"version": "8.1.0", "version": "8.1.0",
"resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
@ -2098,6 +2157,52 @@
"object.assign": "^4.1.0" "object.assign": "^4.1.0"
} }
}, },
"babel-plugin-syntax-object-rest-spread": {
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
"integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
"dev": true
},
"babel-plugin-transform-object-rest-spread": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
"integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
"dev": true,
"requires": {
"babel-plugin-syntax-object-rest-spread": "^6.8.0",
"babel-runtime": "^6.26.0"
}
},
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"dev": true,
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
},
"dependencies": {
"core-js": {
"version": "2.6.11",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
"dev": true
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
"dev": true
}
}
},
"babylon": {
"version": "6.18.0",
"resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
"integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
"dev": true
},
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@ -3011,6 +3116,12 @@
"integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
"dev": true "dev": true
}, },
"common-tags": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz",
"integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==",
"dev": true
},
"commondir": { "commondir": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
@ -4817,6 +4928,12 @@
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true "dev": true
}, },
"get-own-enumerable-property-symbols": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
"integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
"dev": true
},
"get-stream": { "get-stream": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
@ -5736,6 +5853,12 @@
"has-symbols": "^1.0.1" "has-symbols": "^1.0.1"
} }
}, },
"is-regexp": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
"integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
"dev": true
},
"is-resolvable": { "is-resolvable": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
@ -7765,6 +7888,12 @@
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"pretty-bytes": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.4.1.tgz",
"integrity": "sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA==",
"dev": true
},
"pretty-error": { "pretty-error": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
@ -8124,6 +8253,12 @@
"unicode-match-property-value-ecmascript": "^1.2.0" "unicode-match-property-value-ecmascript": "^1.2.0"
} }
}, },
"register-service-worker": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/register-service-worker/-/register-service-worker-1.7.1.tgz",
"integrity": "sha512-IdTfUZ4u8iJL8o1w8es8l6UMGPmkwHolUdT+UmM1UypC80IB4KbpuIlvwWVj8UDS7eJwkEYRcKRgfRX+oTmJsw==",
"dev": true
},
"registry-auth-token": { "registry-auth-token": {
"version": "4.2.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz",
@ -9209,6 +9344,25 @@
"safe-buffer": "~5.1.0" "safe-buffer": "~5.1.0"
} }
}, },
"stringify-object": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
"integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
"dev": true,
"requires": {
"get-own-enumerable-property-symbols": "^3.0.0",
"is-obj": "^1.0.1",
"is-regexp": "^1.0.0"
},
"dependencies": {
"is-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
"integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
"dev": true
}
}
},
"strip-ansi": { "strip-ansi": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
@ -9224,6 +9378,16 @@
"integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=",
"dev": true "dev": true
}, },
"strip-comments": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz",
"integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==",
"dev": true,
"requires": {
"babel-extract-comments": "^1.0.0",
"babel-plugin-transform-object-rest-spread": "^6.26.0"
}
},
"strip-eof": { "strip-eof": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
@ -10297,7 +10461,7 @@
} }
}, },
"vuepress-theme-nonebot": { "vuepress-theme-nonebot": {
"version": "git+https://github.com/nonebot/vuepress-theme-nonebot.git#0325cd2403c210125907c4f7adcd64fb8754acae", "version": "git+https://github.com/nonebot/vuepress-theme-nonebot.git#16c96d1cd12cbb72d0233875b0a671cada93ca2a",
"from": "git+https://github.com/nonebot/vuepress-theme-nonebot.git", "from": "git+https://github.com/nonebot/vuepress-theme-nonebot.git",
"dev": true, "dev": true,
"requires": { "requires": {
@ -10757,6 +10921,173 @@
} }
} }
}, },
"workbox-background-sync": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz",
"integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==",
"dev": true,
"requires": {
"workbox-core": "^4.3.1"
}
},
"workbox-broadcast-update": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz",
"integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==",
"dev": true,
"requires": {
"workbox-core": "^4.3.1"
}
},
"workbox-build": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz",
"integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==",
"dev": true,
"requires": {
"@babel/runtime": "^7.3.4",
"@hapi/joi": "^15.0.0",
"common-tags": "^1.8.0",
"fs-extra": "^4.0.2",
"glob": "^7.1.3",
"lodash.template": "^4.4.0",
"pretty-bytes": "^5.1.0",
"stringify-object": "^3.3.0",
"strip-comments": "^1.0.2",
"workbox-background-sync": "^4.3.1",
"workbox-broadcast-update": "^4.3.1",
"workbox-cacheable-response": "^4.3.1",
"workbox-core": "^4.3.1",
"workbox-expiration": "^4.3.1",
"workbox-google-analytics": "^4.3.1",
"workbox-navigation-preload": "^4.3.1",
"workbox-precaching": "^4.3.1",
"workbox-range-requests": "^4.3.1",
"workbox-routing": "^4.3.1",
"workbox-strategies": "^4.3.1",
"workbox-streams": "^4.3.1",
"workbox-sw": "^4.3.1",
"workbox-window": "^4.3.1"
},
"dependencies": {
"fs-extra": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
"integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
}
}
},
"workbox-cacheable-response": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz",
"integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==",
"dev": true,
"requires": {
"workbox-core": "^4.3.1"
}
},
"workbox-core": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz",
"integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==",
"dev": true
},
"workbox-expiration": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz",
"integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==",
"dev": true,
"requires": {
"workbox-core": "^4.3.1"
}
},
"workbox-google-analytics": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz",
"integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==",
"dev": true,
"requires": {
"workbox-background-sync": "^4.3.1",
"workbox-core": "^4.3.1",
"workbox-routing": "^4.3.1",
"workbox-strategies": "^4.3.1"
}
},
"workbox-navigation-preload": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz",
"integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==",
"dev": true,
"requires": {
"workbox-core": "^4.3.1"
}
},
"workbox-precaching": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz",
"integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==",
"dev": true,
"requires": {
"workbox-core": "^4.3.1"
}
},
"workbox-range-requests": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz",
"integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==",
"dev": true,
"requires": {
"workbox-core": "^4.3.1"
}
},
"workbox-routing": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz",
"integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==",
"dev": true,
"requires": {
"workbox-core": "^4.3.1"
}
},
"workbox-strategies": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz",
"integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==",
"dev": true,
"requires": {
"workbox-core": "^4.3.1"
}
},
"workbox-streams": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz",
"integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==",
"dev": true,
"requires": {
"workbox-core": "^4.3.1"
}
},
"workbox-sw": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz",
"integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==",
"dev": true
},
"workbox-window": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz",
"integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==",
"dev": true,
"requires": {
"workbox-core": "^4.3.1"
}
},
"worker-farm": { "worker-farm": {
"version": "1.7.0", "version": "1.7.0",
"resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",

View File

@ -22,6 +22,7 @@
"devDependencies": { "devDependencies": {
"@vuepress/plugin-back-to-top": "^1.7.1", "@vuepress/plugin-back-to-top": "^1.7.1",
"@vuepress/plugin-medium-zoom": "^1.7.1", "@vuepress/plugin-medium-zoom": "^1.7.1",
"@vuepress/plugin-pwa": "^1.7.1",
"vuepress": "^1.7.1", "vuepress": "^1.7.1",
"vuepress-plugin-versioning": "git+https://github.com/nonebot/vuepress-plugin-versioning.git", "vuepress-plugin-versioning": "git+https://github.com/nonebot/vuepress-plugin-versioning.git",
"vuepress-theme-nonebot": "git+https://github.com/nonebot/vuepress-theme-nonebot.git" "vuepress-theme-nonebot": "git+https://github.com/nonebot/vuepress-theme-nonebot.git"

6
pages/plugin-store.md Normal file
View File

@ -0,0 +1,6 @@
---
---
# 插件广场
<Plugins></Plugins>

View File

@ -1,6 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os import os
import sys import sys

View File

@ -1,6 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from nonebot.typing import Bot, Event from nonebot.typing import Bot, Event
from nonebot.plugin import on_metaevent from nonebot.plugin import on_metaevent

View File

@ -1,4 +1 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from . import test_command from . import test_command

View File

@ -1,6 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from nonebot.rule import to_me from nonebot.rule import to_me
from nonebot.typing import Event from nonebot.typing import Event
from nonebot.plugin import on_command from nonebot.plugin import on_command

View File

@ -1,6 +1,3 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from nonebot.rule import to_me from nonebot.rule import to_me
from nonebot.typing import Event from nonebot.typing import Event
from nonebot.plugin import on_startswith from nonebot.plugin import on_startswith