mirror of
https://github.com/Genshin-bots/gsuid_core.git
synced 2025-05-12 06:55:49 +08:00
✨ 完善内置插件
This commit is contained in:
parent
cd85963e04
commit
a139a180d3
@ -20,7 +20,7 @@ class _Bot:
|
||||
|
||||
async def target_send(
|
||||
self,
|
||||
message: Union[Message, List[Message], str, bytes],
|
||||
message: Union[Message, List[Message], List[str], str, bytes],
|
||||
target_type: Literal['group', 'direct', 'channel', 'sub_channel'],
|
||||
target_id: Optional[str],
|
||||
bot_id: str,
|
||||
@ -38,6 +38,8 @@ class _Bot:
|
||||
message = [MessageSegment.text(message)]
|
||||
elif isinstance(message, bytes):
|
||||
message = [MessageSegment.image(message)]
|
||||
elif isinstance(message, List):
|
||||
message = [MessageSegment.node(message)]
|
||||
|
||||
if at_sender and sender_id:
|
||||
message.append(MessageSegment.at(sender_id))
|
||||
@ -70,7 +72,7 @@ class Bot:
|
||||
|
||||
async def send(
|
||||
self,
|
||||
message: Union[Message, List[Message], str, bytes],
|
||||
message: Union[Message, List[Message], str, bytes, List[str]],
|
||||
at_sender: bool = False,
|
||||
):
|
||||
return await self.bot.target_send(
|
||||
@ -86,7 +88,7 @@ class Bot:
|
||||
|
||||
async def target_send(
|
||||
self,
|
||||
message: Union[Message, List[Message], str, bytes],
|
||||
message: Union[Message, List[Message], str, bytes, List[str]],
|
||||
target_type: Literal['group', 'direct', 'channel', 'sub_channel'],
|
||||
target_id: Optional[str],
|
||||
at_sender: bool = False,
|
||||
|
@ -2,19 +2,24 @@ from gsuid_core.sv import SV
|
||||
from gsuid_core.bot import Bot
|
||||
from gsuid_core.models import Event
|
||||
|
||||
from ._plugins import refresh_list, get_plugins_url, install_plugins
|
||||
from ._plugins import (
|
||||
refresh_list,
|
||||
update_plugins,
|
||||
get_plugins_url,
|
||||
install_plugins,
|
||||
)
|
||||
|
||||
sv_core_install_plugins = SV('core管理插件', pm=1)
|
||||
|
||||
|
||||
@sv_core_install_plugins.on_prefix(('core安装插件'))
|
||||
async def send_plugins_install(bot: Bot, ev: Event):
|
||||
plugins_url = await get_plugins_url(ev.text.strip().lower())
|
||||
if not plugins_url:
|
||||
plugins = await get_plugins_url(ev.text.strip().lower())
|
||||
if not plugins:
|
||||
return await bot.send('不存在该插件...可以使用[core刷新插件列表]获取最新列表!')
|
||||
|
||||
await bot.send('开始安装...请稍等一段时间...')
|
||||
im = install_plugins(plugins_url)
|
||||
im = install_plugins(plugins)
|
||||
await bot.send(im)
|
||||
|
||||
|
||||
@ -26,3 +31,10 @@ async def refresh_plugins_list(bot: Bot, ev: Event):
|
||||
else:
|
||||
im = f'刷新成功! 已刷新{len(_list)}个插件!'
|
||||
await bot.send(im)
|
||||
|
||||
|
||||
@sv_core_install_plugins.on_prefix(('core更新插件'))
|
||||
async def send_update_msg(bot: Bot, ev: Event):
|
||||
await bot.send('开始更新...请稍等一段时间...')
|
||||
_list = update_plugins(ev.text)
|
||||
await bot.send(_list)
|
||||
|
@ -1,14 +1,14 @@
|
||||
import re
|
||||
from typing import Dict, List, Tuple, Optional
|
||||
from typing import Dict, List, Union, Optional
|
||||
|
||||
import aiohttp
|
||||
from git.repo import Repo
|
||||
from git.exc import GitCommandError
|
||||
|
||||
from gsuid_core.logger import logger
|
||||
|
||||
from .api import PLUGINS_PATH, proxy_url, plugins_lib
|
||||
|
||||
plugins_list: Dict[str, str] = {}
|
||||
plugins_list: Dict[str, Dict[str, str]] = {}
|
||||
|
||||
|
||||
async def refresh_list() -> List[str]:
|
||||
@ -16,19 +16,18 @@ async def refresh_list() -> List[str]:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
logger.info(f'稍等...开始刷新插件列表, 地址: {plugins_lib}')
|
||||
async with session.get(plugins_lib) as resp:
|
||||
content = await resp.text()
|
||||
_plugins_list: List[Tuple[str, str]] = re.findall(
|
||||
r'\[([^]]+)\]\(([^)]+)\)', content
|
||||
)
|
||||
for i in _plugins_list:
|
||||
if i[0].lower() not in plugins_list:
|
||||
refresh_list.append(i[0])
|
||||
logger.info(f'[刷新插件列表] 列表新增插件 {i[0]}')
|
||||
plugins_list[i[0].lower()] = i[1]
|
||||
_plugins_list: Dict[
|
||||
str, Dict[str, Dict[str, str]]
|
||||
] = await resp.json()
|
||||
for i in _plugins_list['plugins']:
|
||||
if i.lower() not in plugins_list:
|
||||
refresh_list.append(i)
|
||||
logger.info(f'[刷新插件列表] 列表新增插件 {i}')
|
||||
plugins_list[i.lower()] = _plugins_list['plugins'][i]
|
||||
return refresh_list
|
||||
|
||||
|
||||
async def get_plugins_url(name: str) -> Optional[str]:
|
||||
async def get_plugins_url(name: str) -> Optional[Dict[str, str]]:
|
||||
if not plugins_list:
|
||||
await refresh_list()
|
||||
|
||||
@ -43,12 +42,63 @@ async def get_plugins_url(name: str) -> Optional[str]:
|
||||
return None
|
||||
|
||||
|
||||
def install_plugins(url: str) -> str:
|
||||
plugin_name = url.split('/')[-1]
|
||||
git_path = f'{proxy_url}{url}.git'
|
||||
def install_plugins(plugins: Dict[str, str]) -> str:
|
||||
plugin_name = plugins['link'].split('/')[-1]
|
||||
git_path = f'{proxy_url}{plugins["link"]}.git'
|
||||
logger.info(f'稍等...开始安装插件, 地址: {git_path}')
|
||||
path = PLUGINS_PATH / plugin_name
|
||||
if path.exists():
|
||||
return '该插件已经安装过了!'
|
||||
Repo.clone_from(git_path, path, single_branch=True, depth=1)
|
||||
return f'插件{plugin_name}安装成功!发送[gs重启]以应用!'
|
||||
|
||||
|
||||
def update_plugins(
|
||||
plugin_name: str,
|
||||
level: int = 0,
|
||||
log_key: List[str] = [],
|
||||
log_limit: int = 10,
|
||||
) -> Union[str, List]:
|
||||
for _n in PLUGINS_PATH.iterdir():
|
||||
_name = _n.name
|
||||
sim = len(set(_name.lower()) & set(plugin_name.lower()))
|
||||
if sim >= 0.5 * len(_name):
|
||||
plugin_name = _name
|
||||
break
|
||||
|
||||
path = PLUGINS_PATH / plugin_name
|
||||
if not path.exists():
|
||||
return '更新失败, 不存在该插件!'
|
||||
repo = Repo(path) # type: ignore
|
||||
o = repo.remotes.origin
|
||||
|
||||
if level >= 2:
|
||||
logger.warning(f'[更新][{plugin_name}] 正在执行 git clean --xdf')
|
||||
repo.git.clean('-xdf')
|
||||
# 还原上次更改
|
||||
if level >= 1:
|
||||
logger.warning(f'[更新][{plugin_name}] 正在执行 git reset --hard')
|
||||
repo.git.reset('--hard')
|
||||
|
||||
try:
|
||||
pull_log = o.pull()
|
||||
logger.info(f'[更新][{plugin_name}] {pull_log}')
|
||||
except GitCommandError as e:
|
||||
logger.warning(e)
|
||||
return '更新失败, 请检查控制台...'
|
||||
|
||||
commits = list(repo.iter_commits(max_count=40))
|
||||
log_list = []
|
||||
for commit in commits:
|
||||
if isinstance(commit.message, str):
|
||||
if log_key:
|
||||
for key in log_key:
|
||||
if key in commit.message:
|
||||
log_list.append(commit.message.replace('\n', ''))
|
||||
if len(log_list) >= log_limit:
|
||||
break
|
||||
else:
|
||||
log_list.append(commit.message.replace('\n', ''))
|
||||
if len(log_list) >= log_limit:
|
||||
break
|
||||
return log_list
|
||||
|
@ -3,8 +3,8 @@ from pathlib import Path
|
||||
# raw_url = 'https://raw.githubusercontent.com'
|
||||
# repo_title = 'Genshin-bots/GenshinUID-docs/master/docs'
|
||||
# plugins_lib = f'{raw_url}/{repo_title}/PluginsList.md'
|
||||
plugins_lib = 'https://docs.gsuid.gbots.work/PluginsList.md'
|
||||
plugins_lib = 'https://docs.gsuid.gbots.work/plugin_list.json'
|
||||
|
||||
proxy_url = 'https://ghproxy.com/'
|
||||
|
||||
PLUGINS_PATH = Path(__file__).parents[1]
|
||||
PLUGINS_PATH = Path(__file__).parents[2]
|
||||
|
BIN
gsuid_core/utils/cookie_manager/pic/all_ok.png
Normal file
BIN
gsuid_core/utils/cookie_manager/pic/all_ok.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 205 KiB |
BIN
gsuid_core/utils/cookie_manager/pic/ck_no.png
Normal file
BIN
gsuid_core/utils/cookie_manager/pic/ck_no.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 164 KiB |
BIN
gsuid_core/utils/cookie_manager/pic/ck_ok.png
Normal file
BIN
gsuid_core/utils/cookie_manager/pic/ck_ok.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 165 KiB |
Loading…
x
Reference in New Issue
Block a user