This commit is contained in:
felinae98 2021-12-09 22:35:07 +08:00
parent 80e5e721b3
commit af17b5042b
No known key found for this signature in database
GPG Key ID: 00C8B010587FF610
9 changed files with 67 additions and 27 deletions

View File

@ -30,3 +30,11 @@
## [0.4.1] - 2021-11-31 ## [0.4.1] - 2021-11-31
- 加入了管理后台 - 加入了管理后台
## [0.4.2]
并没有做什么只是为了修复前端文件没有正确打包的问题开了个新的版本号
推上pypi
## [0.4.3]
- 使用playwright替换pypeteer大概能修复渲染失败图片之后CPU跑满的问题
- 增加了help插件`nonebot-plugin-help`

1
bot.py
View File

@ -8,6 +8,7 @@ driver = nonebot.get_driver()
driver.register_adapter('cqhttp', CQHTTPBot) driver.register_adapter('cqhttp', CQHTTPBot)
nonebot.load_builtin_plugins() nonebot.load_builtin_plugins()
nonebot.load_plugin('nonebot_plugin_help')
nonebot.load_plugins('src/plugins') nonebot.load_plugins('src/plugins')
if __name__ == "__main__": if __name__ == "__main__":

18
poetry.lock generated
View File

@ -439,6 +439,18 @@ python-versions = ">=3.7.3,<4.0.0"
httpx = ">=0.18.0,<1.0.0" httpx = ">=0.18.0,<1.0.0"
nonebot2 = ">=2.0.0-alpha.14,<3.0.0" nonebot2 = ">=2.0.0-alpha.14,<3.0.0"
[[package]]
name = "nonebot-plugin-help"
version = "0.1.5"
description = "A general help lister for nonebot2 plugins"
category = "main"
optional = false
python-versions = ">=3.7.3,<4.0.0"
[package.dependencies]
nonebot-adapter-cqhttp = ">=2.0.0a16,<3.0.0"
nonebot2 = ">=2.0.0.a16,<3.0.0"
[[package]] [[package]]
name = "nonebot2" name = "nonebot2"
version = "2.0.0a16" version = "2.0.0a16"
@ -939,7 +951,7 @@ dev = ["pytest (>=4.6.2)", "black (>=19.3b0)"]
[metadata] [metadata]
lock-version = "1.1" lock-version = "1.1"
python-versions = "^3.9" python-versions = "^3.9"
content-hash = "a12ba453cb761ccbc97a694a0de4d3acf4e9c88bb4650203acbeaaf0d762b3c1" content-hash = "6258435dbcdc3a69af258a1dc3dee54e55cc14dba81521aa33eb54236570d882"
[metadata.files] [metadata.files]
aiofiles = [ aiofiles = [
@ -1194,6 +1206,10 @@ nonebot-adapter-cqhttp = [
{file = "nonebot-adapter-cqhttp-2.0.0a16.tar.gz", hash = "sha256:9de270291b98c41a45e5b629c02f16e3b25cafb3867b8161851f49c84145d8aa"}, {file = "nonebot-adapter-cqhttp-2.0.0a16.tar.gz", hash = "sha256:9de270291b98c41a45e5b629c02f16e3b25cafb3867b8161851f49c84145d8aa"},
{file = "nonebot_adapter_cqhttp-2.0.0a16-py3-none-any.whl", hash = "sha256:831747c55c9c1a660215225f84784a4ca275a84bffa8d1312524367066b68bbe"}, {file = "nonebot_adapter_cqhttp-2.0.0a16-py3-none-any.whl", hash = "sha256:831747c55c9c1a660215225f84784a4ca275a84bffa8d1312524367066b68bbe"},
] ]
nonebot-plugin-help = [
{file = "nonebot-plugin-help-0.1.5.tar.gz", hash = "sha256:2ef8c0f8b578c7941e364396532749cabb4d52872ddc4a0419db3cd103223e60"},
{file = "nonebot_plugin_help-0.1.5-py3-none-any.whl", hash = "sha256:1c4bb626feb202515f47311e3ca9872ab6c0db5e935bc9561325fcc1a2591511"},
]
nonebot2 = [ nonebot2 = [
{file = "nonebot2-2.0.0a16-py3-none-any.whl", hash = "sha256:88596c154143fc2203a50d224bacf4e2e5be1b4142fd92e645c40258e5819924"}, {file = "nonebot2-2.0.0a16-py3-none-any.whl", hash = "sha256:88596c154143fc2203a50d224bacf4e2e5be1b4142fd92e645c40258e5819924"},
{file = "nonebot2-2.0.0a16.tar.gz", hash = "sha256:f70475e0a9525ed22cc082e35b06145b005412f919880a862e72059a84b0d2d0"}, {file = "nonebot2-2.0.0a16.tar.gz", hash = "sha256:f70475e0a9525ed22cc082e35b06145b005412f919880a862e72059a84b0d2d0"},

View File

@ -37,6 +37,7 @@ pyjwt = "^2.1.0"
aiofiles = "^0.7.0" aiofiles = "^0.7.0"
python-socketio = "^5.4.0" python-socketio = "^5.4.0"
playwright = "^1.17.2" playwright = "^1.17.2"
nonebot-plugin-help = "^0.1.5"
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
ipdb = "^0.13.4" ipdb = "^0.13.4"

View File

@ -9,3 +9,8 @@ from . import platform
from . import types from . import types
from . import utils from . import utils
from . import admin_page from . import admin_page
__help__version__ = '0.4.3'
__help__plugin__name__ = 'nonebot_bison'
__usage__ = ('本bot可以提供b站、微博等社交媒体的消息订阅详情'
'请查看本bot文档或者at本bot发送“添加订阅”订阅第一个帐号')

View File

@ -1,12 +1,10 @@
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path
import os import os
from pathlib import Path
from typing import Union from typing import Union
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from nonebot import get_driver, on_command from nonebot import get_driver, on_command
import nonebot
from nonebot.adapters.cqhttp.bot import Bot from nonebot.adapters.cqhttp.bot import Bot
from nonebot.adapters.cqhttp.event import GroupMessageEvent, PrivateMessageEvent from nonebot.adapters.cqhttp.event import GroupMessageEvent, PrivateMessageEvent
from nonebot.drivers.fastapi import Driver from nonebot.drivers.fastapi import Driver
@ -14,14 +12,20 @@ from nonebot.log import logger
from nonebot.rule import to_me from nonebot.rule import to_me
from nonebot.typing import T_State from nonebot.typing import T_State
import socketio import socketio
import functools
from starlette.requests import Request
from .api import del_group_sub, test, get_global_conf, auth, get_subs_info, get_target_name, add_group_sub, update_group_sub
from .token_manager import token_manager as tm
from .jwt import load_jwt
from ..plugin_config import plugin_config from ..plugin_config import plugin_config
from .api import (
add_group_sub,
auth,
del_group_sub,
get_global_conf,
get_subs_info,
get_target_name,
test,
update_group_sub,
)
from .jwt import load_jwt
from .token_manager import token_manager as tm
URL_BASE = '/bison/' URL_BASE = '/bison/'
GLOBAL_CONF_URL = f'{URL_BASE}api/global_conf' GLOBAL_CONF_URL = f'{URL_BASE}api/global_conf'
@ -122,9 +126,11 @@ if (STATIC_PATH / 'index.html').exists():
get_token = on_command('后台管理', rule=to_me(), priority=5) get_token = on_command('后台管理', rule=to_me(), priority=5)
@get_token.handle() @get_token.handle()
async def send_token(bot: "Bot", event: PrivateMessageEvent, state: T_State): async def send_token(_: "Bot", event: PrivateMessageEvent, state: T_State):
driver = nonebot.get_driver()
token = tm.get_user_token((event.get_user_id(), event.sender.nickname)) token = tm.get_user_token((event.get_user_id(), event.sender.nickname))
await get_token.finish(f'请访问: {plugin_config.bison_outer_url}auth/{token}') await get_token.finish(f'请访问: {plugin_config.bison_outer_url}auth/{token}')
get_token.__help__name__ = '获取后台管理地址'
get_token.__help__info__ = ('获取管理bot后台的地址该地址会'
'在一段时间过后过期,请不要泄漏该地址')
else: else:
logger.warning("Frontend file not found, please compile it or use docker or pypi version") logger.warning("Frontend file not found, please compile it or use docker or pypi version")

View File

@ -1,10 +1,11 @@
from ..platform import platform_manager, check_sub_target
from .token_manager import token_manager
from .jwt import pack_jwt
from ..config import Config, NoSuchSubscribeException, NoSuchUserException
import nonebot import nonebot
from nonebot.adapters.cqhttp.bot import Bot from nonebot.adapters.cqhttp.bot import Bot
from ..config import Config, NoSuchSubscribeException, NoSuchUserException
from ..platform import check_sub_target, platform_manager
from .jwt import pack_jwt
from .token_manager import token_manager
async def test(): async def test():
return {"status": 200, "text": "test"} return {"status": 200, "text": "test"}
@ -88,7 +89,7 @@ async def get_target_name(platform_name: str, target: str, jwt_obj: dict):
return {'targetName': await check_sub_target(platform_name, target)} return {'targetName': await check_sub_target(platform_name, target)}
async def add_group_sub(group_number: str, platform_name: str, target: str, async def add_group_sub(group_number: str, platform_name: str, target: str,
target_name: str, cats: list[str], tags: list[str]): target_name: str, cats: list[int], tags: list[str]):
config = Config() config = Config()
config.add_subscribe(int(group_number), 'group', target, target_name, platform_name, cats, tags) config.add_subscribe(int(group_number), 'group', target, target_name, platform_name, cats, tags)
return { 'status': 200, 'msg': '' } return { 'status': 200, 'msg': '' }
@ -103,7 +104,7 @@ async def del_group_sub(group_number: str, platform_name: str, target: str):
async def update_group_sub(group_number: str, platform_name: str, target: str, async def update_group_sub(group_number: str, platform_name: str, target: str,
target_name: str, cats: list[str], tags: list[str]): target_name: str, cats: list[int], tags: list[str]):
config = Config() config = Config()
try: try:
config.update_subscribe(int(group_number), 'group', config.update_subscribe(int(group_number), 'group',

View File

@ -1,17 +1,20 @@
from typing import Type from typing import Type
from nonebot import logger, on_command from nonebot import logger, on_command
from nonebot.adapters._bot import Bot as AbstractBot
from nonebot.adapters._event import Event as AbstractEvent
from nonebot.adapters.cqhttp import Bot, Event, GroupMessageEvent from nonebot.adapters.cqhttp import Bot, Event, GroupMessageEvent
from nonebot.adapters.cqhttp.message import Message from nonebot.adapters.cqhttp.message import Message
from nonebot.adapters.cqhttp.permission import GROUP_ADMIN, GROUP_MEMBER, GROUP_OWNER from nonebot.adapters.cqhttp.permission import GROUP_ADMIN, GROUP_MEMBER, GROUP_OWNER
from nonebot.matcher import Matcher
from nonebot.permission import Permission, SUPERUSER from nonebot.permission import Permission, SUPERUSER
from nonebot.rule import to_me from nonebot.rule import to_me
from nonebot.typing import T_State from nonebot.typing import T_State
from nonebot.matcher import Matcher
from .config import Config, NoSuchSubscribeException from .config import Config, NoSuchSubscribeException
from .platform import platform_manager, check_sub_target from .platform import check_sub_target, platform_manager
from .utils import parse_text
from .types import Target from .types import Target
from .utils import parse_text
def _gen_prompt_template(prompt: str): def _gen_prompt_template(prompt: str):
if hasattr(Message, 'template'): if hasattr(Message, 'template'):
@ -38,7 +41,7 @@ def do_add_sub(add_sub: Type[Matcher]):
for platform_name in common_platform]) + \ for platform_name in common_platform]) + \
'要查看全部平台请输入:“全部”' '要查看全部平台请输入:“全部”'
async def parse_platform(bot: Bot, event: Event, state: T_State) -> None: async def parse_platform(bot: AbstractBot, event: AbstractEvent, state: T_State) -> None:
platform = str(event.get_message()).strip() platform = str(event.get_message()).strip()
if platform == '全部': if platform == '全部':
message = '全部平台\n' + \ message = '全部平台\n' + \
@ -59,7 +62,7 @@ def do_add_sub(add_sub: Type[Matcher]):
state['id'] = 'default' state['id'] = 'default'
state['name'] = await platform_manager[state['platform']].get_target_name(Target('')) state['name'] = await platform_manager[state['platform']].get_target_name(Target(''))
async def parse_id(bot: Bot, event: Event, state: T_State): async def parse_id(bot: AbstractBot, event: AbstractEvent, state: T_State):
target = str(event.get_message()).strip() target = str(event.get_message()).strip()
name = await check_sub_target(state['platform'], target) name = await check_sub_target(state['platform'], target)
if not name: if not name:
@ -76,7 +79,7 @@ def do_add_sub(add_sub: Type[Matcher]):
state['_prompt'] = '请输入要订阅的类别,以空格分隔,支持的类别有:{}'.format( state['_prompt'] = '请输入要订阅的类别,以空格分隔,支持的类别有:{}'.format(
' '.join(list(platform_manager[state['platform']].categories.values()))) ' '.join(list(platform_manager[state['platform']].categories.values())))
async def parser_cats(bot: Bot, event: Event, state: T_State): async def parser_cats(bot: AbstractBot, event: AbstractEvent, state: T_State):
res = [] res = []
for cat in str(event.get_message()).strip().split(): for cat in str(event.get_message()).strip().split():
if cat not in platform_manager[state['platform']].reverse_category: if cat not in platform_manager[state['platform']].reverse_category:
@ -92,7 +95,7 @@ def do_add_sub(add_sub: Type[Matcher]):
return return
state['_prompt'] = '请输入要订阅的tag订阅所有tag输入"全部标签"' state['_prompt'] = '请输入要订阅的tag订阅所有tag输入"全部标签"'
async def parser_tags(bot: Bot, event: Event, state: T_State): async def parser_tags(bot: AbstractBot, event: AbstractEvent, state: T_State):
if str(event.get_message()).strip() == '全部标签': if str(event.get_message()).strip() == '全部标签':
state['tags'] = [] state['tags'] = []
else: else:
@ -155,7 +158,7 @@ def do_del_sub(del_sub: Type[Matcher]):
else: else:
await del_sub.finish('删除成功') await del_sub.finish('删除成功')
async def parse_group_number(bot: Bot, event: Event, state: T_State): async def parse_group_number(bot: AbstractBot, event: AbstractEvent, state: T_State):
state[state["_current_key"]] = int(str(event.get_message())) state[state["_current_key"]] = int(str(event.get_message()))

View File

@ -1,7 +1,6 @@
from abc import abstractmethod, ABC from abc import abstractmethod, ABC
from collections import defaultdict from collections import defaultdict
from dataclasses import dataclass from dataclasses import dataclass
from functools import reduce
import time import time
from typing import Any, Collection, Optional, Literal from typing import Any, Collection, Optional, Literal