🔀 Merge pull request #39
3
.github/workflows/api_docs.yml
vendored
@ -1,7 +1,7 @@
|
||||
name: Build API Doc
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
pull_request_target:
|
||||
types: [ opened, synchronize, reopened ]
|
||||
|
||||
jobs:
|
||||
@ -12,6 +12,7 @@ jobs:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
token: ${{ secrets.GH_TOKEN }}
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v2
|
||||
|
39
docs/.vuepress/components/Plugins.vue
Normal 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>
|
@ -13,7 +13,8 @@ module.exports = context => ({
|
||||
*/
|
||||
head: [
|
||||
["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: "apple-mobile-web-app-title", content: "NoneBot" }],
|
||||
["meta", { name: "apple-mobile-web-app-capable", content: "yes" }],
|
||||
@ -21,6 +22,26 @@ module.exports = context => ({
|
||||
"meta",
|
||||
{ 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",
|
||||
{
|
||||
@ -58,7 +79,8 @@ module.exports = context => ({
|
||||
nav: [
|
||||
{ text: "主页", link: "/" },
|
||||
{ text: "指南", link: "/guide/" },
|
||||
{ text: "API", link: "/api/" }
|
||||
{ text: "API", link: "/api/" },
|
||||
{ text: "插件广场", link: "/plugin-store" }
|
||||
],
|
||||
sidebarDepth: 2,
|
||||
sidebar: {
|
||||
@ -155,6 +177,16 @@ module.exports = context => ({
|
||||
plugins: [
|
||||
"@vuepress/plugin-back-to-top",
|
||||
"@vuepress/plugin-medium-zoom",
|
||||
[
|
||||
"@vuepress/pwa",
|
||||
{
|
||||
serviceWorker: true,
|
||||
updatePopup: {
|
||||
message: "发现新内容",
|
||||
buttonText: "刷新"
|
||||
}
|
||||
}
|
||||
],
|
||||
[
|
||||
"versioning",
|
||||
{
|
||||
|
BIN
docs/.vuepress/public/icons/android-chrome-192x192.png
Normal file
After Width: | Height: | Size: 7.9 KiB |
BIN
docs/.vuepress/public/icons/android-chrome-384x384.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
docs/.vuepress/public/icons/apple-touch-icon-180x180.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
docs/.vuepress/public/icons/favicon-16x16.png
Normal file
After Width: | Height: | Size: 626 B |
BIN
docs/.vuepress/public/icons/favicon-32x32.png
Normal file
After Width: | Height: | Size: 1008 B |
BIN
docs/.vuepress/public/icons/favicon.ico
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
docs/.vuepress/public/icons/mstile-150x150.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
29
docs/.vuepress/public/icons/safari-pinned-tab.svg
Normal 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 |
20
docs/.vuepress/public/manifest.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
26
docs/.vuepress/public/plugins.json
Normal 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"
|
||||
}
|
||||
]
|
@ -394,9 +394,6 @@ sidebarDepth: 0
|
||||
* `Type[Matcher]`
|
||||
|
||||
|
||||
* `MatcherGroup`
|
||||
|
||||
|
||||
|
||||
## `on_regex(pattern, flags=0, rule=None, **kwargs)`
|
||||
|
||||
@ -510,9 +507,6 @@ sidebarDepth: 0
|
||||
* `Type[Matcher]`
|
||||
|
||||
|
||||
* `MatcherGroup`
|
||||
|
||||
|
||||
|
||||
## `load_plugin(module_path)`
|
||||
|
||||
|
@ -139,19 +139,21 @@ Rule(async_function, run_sync(sync_function))
|
||||
|
||||
|
||||
|
||||
## `command(command)`
|
||||
## `command(*cmds)`
|
||||
|
||||
|
||||
* **说明**
|
||||
|
||||
命令形式匹配,根据配置里提供的 `command_start`, `command_sep` 判断消息是否为命令。
|
||||
|
||||
可以通过 `state["_prefix"]["command"]` 获取匹配成功的命令(例:`("test",)`),通过 `state["_prefix"]["raw_command"]` 获取匹配成功的原始命令文本(例:`"/test"`)。
|
||||
|
||||
|
||||
|
||||
* **参数**
|
||||
|
||||
|
||||
* `command: Tuples[str, ...]`: 命令内容
|
||||
* `*cmds: Union[str, Tuple[str, ...]]`: 命令内容
|
||||
|
||||
|
||||
|
||||
|
@ -136,11 +136,11 @@ QQ 协议端举例:
|
||||
现在,尝试向你的 QQ 机器人账号发送如下内容:
|
||||
|
||||
```default
|
||||
/say 你好,世界
|
||||
/echo 你好,世界
|
||||
```
|
||||
|
||||
到这里如果一切 OK,你应该会收到机器人给你回复了 `你好,世界`。这一历史性的对话标志着你已经成功地运行了一个 NoneBot 的最小实例,开始了编写更强大的 QQ 机器人的创意之旅!
|
||||
|
||||
<ClientOnly>
|
||||
<Messenger :messages="[{ position: 'right', msg: '/say 你好,世界' }, { position: 'left', msg: '你好,世界' }]"/>
|
||||
<Messenger :messages="[{ position: 'right', msg: '/echo 你好,世界' }, { position: 'left', msg: '你好,世界' }]"/>
|
||||
</ClientOnly>
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
快捷导入
|
||||
========
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
协议适配基类
|
||||
============
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
CQHTTP (OneBot) v11 协议适配
|
||||
============================
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
配置
|
||||
====
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
后端驱动适配基类
|
||||
===============
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
FastAPI 驱动适配
|
||||
================
|
||||
@ -32,7 +30,7 @@ def get_auth_bearer(access_token: Optional[str] = Header(
|
||||
if not access_token:
|
||||
return None
|
||||
scheme, _, param = access_token.partition(" ")
|
||||
if scheme.lower() != "bearer":
|
||||
if scheme.lower() not in ["bearer", "token"]:
|
||||
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="Not authenticated",
|
||||
headers={"WWW-Authenticate": "Bearer"})
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
异常
|
||||
====
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
日志
|
||||
====
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
事件响应器
|
||||
==========
|
||||
@ -496,6 +494,7 @@ class MatcherGroup:
|
||||
return matcher
|
||||
|
||||
def args_parser(self, func: ArgsParser) -> ArgsParser:
|
||||
self._default_parser = func
|
||||
for matcher in self.matchers:
|
||||
matcher.args_parser(func)
|
||||
return func
|
||||
@ -571,37 +570,38 @@ class MatcherGroup:
|
||||
|
||||
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()
|
||||
event = current_event.get()
|
||||
await bot.send(event=event, message=message)
|
||||
await bot.send(event=event, message=message, **kwargs)
|
||||
|
||||
async def finish(
|
||||
self,
|
||||
async def finish(self,
|
||||
message: Optional[Union[str, Message,
|
||||
MessageSegment]] = None) -> NoReturn:
|
||||
MessageSegment]] = None,
|
||||
**kwargs) -> NoReturn:
|
||||
bot = current_bot.get()
|
||||
event = current_event.get()
|
||||
if message:
|
||||
await bot.send(event=event, message=message)
|
||||
await bot.send(event=event, message=message, **kwargs)
|
||||
raise FinishedException
|
||||
|
||||
async def pause(
|
||||
self,
|
||||
async def pause(self,
|
||||
prompt: Optional[Union[str, Message,
|
||||
MessageSegment]] = None) -> NoReturn:
|
||||
MessageSegment]] = None,
|
||||
**kwargs) -> NoReturn:
|
||||
bot = current_bot.get()
|
||||
event = current_event.get()
|
||||
if prompt:
|
||||
await bot.send(event=event, message=prompt)
|
||||
await bot.send(event=event, message=prompt, **kwargs)
|
||||
raise PausedException
|
||||
|
||||
async def reject(
|
||||
self,
|
||||
async def reject(self,
|
||||
prompt: Optional[Union[str, Message,
|
||||
MessageSegment]] = None) -> NoReturn:
|
||||
MessageSegment]] = None,
|
||||
**kwargs) -> NoReturn:
|
||||
bot = current_bot.get()
|
||||
event = current_event.get()
|
||||
if prompt:
|
||||
await bot.send(event=event, message=prompt)
|
||||
await bot.send(event=event, message=prompt, **kwargs)
|
||||
raise RejectedException
|
||||
|
@ -1,6 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import asyncio
|
||||
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):
|
||||
show_log = True
|
||||
log_msg = f"<m>{bot.type.upper()} </m>| {event.self_id} [{event.name}]: "
|
||||
if event.type == "message":
|
||||
log_msg += f"Message {event.id} from "
|
||||
@ -74,7 +72,9 @@ async def handle_event(bot: Bot, event: Event):
|
||||
elif event.type == "request":
|
||||
log_msg += f"Request {event.raw_event}"
|
||||
elif event.type == "meta_event":
|
||||
log_msg += f"MetaEvent {event.detail_type}"
|
||||
# log_msg += f"MetaEvent {event.detail_type}"
|
||||
show_log = False
|
||||
if show_log:
|
||||
logger.opt(colors=True).info(log_msg)
|
||||
|
||||
coros = []
|
||||
@ -103,6 +103,7 @@ async def handle_event(bot: Bot, event: Event):
|
||||
for matcher in matchers[priority]
|
||||
]
|
||||
|
||||
if show_log:
|
||||
logger.debug(f"Checking for matchers in priority {priority}...")
|
||||
results = await asyncio.gather(*pending_tasks, return_exceptions=True)
|
||||
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
权限
|
||||
====
|
||||
|
@ -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 nonebot.log import logger
|
||||
from nonebot.matcher import Matcher
|
||||
from nonebot.permission import Permission
|
||||
from nonebot.typing import Handler, RuleChecker
|
||||
from nonebot.matcher import Matcher, MatcherGroup
|
||||
from nonebot.rule import Rule, startswith, endswith, command, regex
|
||||
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, ...]],
|
||||
rule: Optional[Union[Rule, RuleChecker]] = 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
|
||||
:返回:
|
||||
- ``Type[Matcher]``
|
||||
- ``MatcherGroup``
|
||||
"""
|
||||
if isinstance(cmd, str):
|
||||
cmd = (cmd,)
|
||||
|
||||
async def _strip_cmd(bot, event, state: dict):
|
||||
message = event.message
|
||||
@ -294,19 +289,10 @@ def on_command(cmd: Union[str, Tuple[str, ...]],
|
||||
handlers = kwargs.pop("handlers", [])
|
||||
handlers.insert(0, _strip_cmd)
|
||||
|
||||
if aliases:
|
||||
aliases = set(map(lambda x: (x,) if isinstance(x, str) else x, aliases))
|
||||
group = MatcherGroup("message",
|
||||
Rule() & rule,
|
||||
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, **
|
||||
commands = set([cmd]) | (aliases or set())
|
||||
return on_message(command(*commands) & rule, handlers=handlers, **
|
||||
kwargs) if rule else on_message(
|
||||
command(cmd), handlers=handlers, **kwargs)
|
||||
command(*commands), handlers=handlers, **kwargs)
|
||||
|
||||
|
||||
def on_regex(pattern: str,
|
||||
@ -359,7 +345,7 @@ class CommandGroup:
|
||||
"""
|
||||
|
||||
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`` 的参数,将会覆盖命令组默认值
|
||||
:返回:
|
||||
- ``Type[Matcher]``
|
||||
- ``MatcherGroup``
|
||||
"""
|
||||
sub_cmd = (cmd,) if isinstance(cmd, str) else cmd
|
||||
cmd = self.basecmd + sub_cmd
|
||||
|
@ -1,10 +1,6 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
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
|
||||
|
||||
plugins: Dict[str, "Plugin"] = ...
|
||||
@ -95,10 +91,9 @@ def on_endswith(msg: str,
|
||||
...
|
||||
|
||||
|
||||
@overload
|
||||
def on_command(cmd: Union[str, Tuple[str, ...]],
|
||||
rule: Optional[Union[Rule, RuleChecker]] = ...,
|
||||
aliases: None = ...,
|
||||
aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = ...,
|
||||
permission: Optional[Permission] = ...,
|
||||
*,
|
||||
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,
|
||||
flags: Union[int, re.RegexFlag] = 0,
|
||||
rule: Optional[Rule] = ...,
|
||||
@ -166,16 +147,15 @@ class CommandGroup:
|
||||
state: Optional[dict] = ...):
|
||||
...
|
||||
|
||||
def command(
|
||||
self,
|
||||
def command(self,
|
||||
cmd: Union[str, Tuple[str, ...]],
|
||||
rule: Optional[Union[Rule, RuleChecker]] = ...,
|
||||
aliases: Set[Union[str, Tuple[str, ...]]] = ...,
|
||||
aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = ...,
|
||||
permission: Optional[Permission] = ...,
|
||||
*,
|
||||
handlers: Optional[List[Handler]] = ...,
|
||||
temp: bool = ...,
|
||||
priority: int = ...,
|
||||
block: bool = ...,
|
||||
state: Optional[dict] = ...) -> Union[Type[Matcher], MatcherGroup]:
|
||||
state: Optional[dict] = ...) -> Type[Matcher]:
|
||||
...
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
规则
|
||||
====
|
||||
@ -198,12 +196,14 @@ def keyword(msg: str) -> Rule:
|
||||
return Rule(_keyword)
|
||||
|
||||
|
||||
def command(command: Tuple[str, ...]) -> Rule:
|
||||
def command(*cmds: Union[str, Tuple[str, ...]]) -> Rule:
|
||||
"""
|
||||
:说明:
|
||||
命令形式匹配,根据配置里提供的 ``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`` 配置
|
||||
|
||||
@ -218,6 +218,11 @@ def command(command: Tuple[str, ...]) -> Rule:
|
||||
config = get_driver().config
|
||||
command_start = config.command_start
|
||||
command_sep = config.command_sep
|
||||
commands = list(cmds)
|
||||
for index, command in enumerate(commands):
|
||||
if isinstance(command, str):
|
||||
commands[index] = command = (command,)
|
||||
|
||||
if len(command) == 1:
|
||||
for start in command_start:
|
||||
TrieRule.add_prefix(f"{start}{command[0]}", command)
|
||||
@ -226,7 +231,7 @@ def command(command: Tuple[str, ...]) -> Rule:
|
||||
TrieRule.add_prefix(f"{start}{sep.join(command)}", command)
|
||||
|
||||
async def _command(bot: Bot, event: Event, state: dict) -> bool:
|
||||
return command == state["_prefix"]["command"]
|
||||
return state["_prefix"]["command"] in commands
|
||||
|
||||
return Rule(_command)
|
||||
|
||||
@ -234,7 +239,9 @@ def command(command: Tuple[str, ...]) -> Rule:
|
||||
def regex(regex: str, flags: Union[int, re.RegexFlag] = 0) -> Rule:
|
||||
"""
|
||||
:说明:
|
||||
根据正则表达式进行匹配
|
||||
根据正则表达式进行匹配。
|
||||
|
||||
可以通过 ``state["_matched"]`` 获取正则表达式匹配成功的文本。
|
||||
:参数:
|
||||
* ``regex: str``: 正则表达式
|
||||
* ``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)
|
||||
|
||||
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)
|
||||
|
||||
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
计划任务
|
||||
========
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
类型
|
||||
====
|
||||
|
@ -1,6 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import re
|
||||
import json
|
||||
import asyncio
|
||||
|
333
package-lock.json
generated
@ -1050,6 +1050,45 @@
|
||||
"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": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
|
||||
@ -1454,6 +1493,17 @@
|
||||
"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": {
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.7.1.tgz",
|
||||
@ -2076,6 +2126,15 @@
|
||||
"integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==",
|
||||
"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": {
|
||||
"version": "8.1.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
|
||||
@ -2098,6 +2157,52 @@
|
||||
"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": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||
@ -3011,6 +3116,12 @@
|
||||
"integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
|
||||
"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": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
|
||||
@ -4817,6 +4928,12 @@
|
||||
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
|
||||
"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": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
|
||||
@ -5736,6 +5853,12 @@
|
||||
"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": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
|
||||
@ -7765,6 +7888,12 @@
|
||||
"dev": 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": {
|
||||
"version": "2.1.1",
|
||||
"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"
|
||||
}
|
||||
},
|
||||
"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": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz",
|
||||
@ -9209,6 +9344,25 @@
|
||||
"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": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||
@ -9224,6 +9378,16 @@
|
||||
"integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=",
|
||||
"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": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
|
||||
@ -10297,7 +10461,7 @@
|
||||
}
|
||||
},
|
||||
"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",
|
||||
"dev": true,
|
||||
"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": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
|
||||
|
@ -22,6 +22,7 @@
|
||||
"devDependencies": {
|
||||
"@vuepress/plugin-back-to-top": "^1.7.1",
|
||||
"@vuepress/plugin-medium-zoom": "^1.7.1",
|
||||
"@vuepress/plugin-pwa": "^1.7.1",
|
||||
"vuepress": "^1.7.1",
|
||||
"vuepress-plugin-versioning": "git+https://github.com/nonebot/vuepress-plugin-versioning.git",
|
||||
"vuepress-theme-nonebot": "git+https://github.com/nonebot/vuepress-theme-nonebot.git"
|
||||
|
6
pages/plugin-store.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
---
|
||||
|
||||
# 插件广场
|
||||
|
||||
<Plugins></Plugins>
|
@ -1,6 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
@ -1,6 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from nonebot.typing import Bot, Event
|
||||
from nonebot.plugin import on_metaevent
|
||||
|
||||
|
@ -1,4 +1 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import test_command
|
||||
|
@ -1,6 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from nonebot.rule import to_me
|
||||
from nonebot.typing import Event
|
||||
from nonebot.plugin import on_command
|
||||
|
@ -1,6 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from nonebot.rule import to_me
|
||||
from nonebot.typing import Event
|
||||
from nonebot.plugin import on_startswith
|
||||
|