-
-

-
-
-

-
-
-

-
-
-

-
+#### 登录界面
-
-

-
-
-

-
+
+
+#### API 设置
+
+
+
+#### 仪表盘
+
+
+
+#### 仪表盘(展开)
+
+
+
+#### 控制台
+
+
+
+#### 插件列表
+
+
+
+#### 插件列表(配置项)
+
+
+
+#### 插件商店
+
+
+
+#### 好友/群组管理
+
+
+
+#### 请求管理
+
+
+
+#### 数据库管理
+
+
+
+### 文件管理
+
+
+
+### 文件管理(文本查看)
+
+
+
+### 文件管理(图片查看)
+
+
+
+### 关于
+
+
-
-

-
-
-

-
diff --git a/bot.py b/bot.py
index 52cd29fc..aa047a71 100644
--- a/bot.py
+++ b/bot.py
@@ -14,9 +14,9 @@ driver.register_adapter(OneBotV11Adapter)
# driver.register_adapter(DoDoAdapter)
# driver.register_adapter(DiscordAdapter)
-from zhenxun.services.db_context import disconnect, init
+from zhenxun.services.db_context import disconnect
-driver.on_startup(init)
+# driver.on_startup(init)
driver.on_shutdown(disconnect)
# nonebot.load_builtin_plugins("echo")
diff --git a/docs_image/pc-about.jpg b/docs_image/pc-about.jpg
new file mode 100644
index 00000000..0bef7a9e
Binary files /dev/null and b/docs_image/pc-about.jpg differ
diff --git a/docs_image/pc-api.jpg b/docs_image/pc-api.jpg
new file mode 100644
index 00000000..59cee887
Binary files /dev/null and b/docs_image/pc-api.jpg differ
diff --git a/docs_image/pc-command.jpg b/docs_image/pc-command.jpg
new file mode 100644
index 00000000..0e310e29
Binary files /dev/null and b/docs_image/pc-command.jpg differ
diff --git a/docs_image/pc-dashboard.jpg b/docs_image/pc-dashboard.jpg
new file mode 100644
index 00000000..0478a850
Binary files /dev/null and b/docs_image/pc-dashboard.jpg differ
diff --git a/docs_image/pc-dashboard1.jpg b/docs_image/pc-dashboard1.jpg
new file mode 100644
index 00000000..3a0bc958
Binary files /dev/null and b/docs_image/pc-dashboard1.jpg differ
diff --git a/docs_image/pc-database.jpg b/docs_image/pc-database.jpg
new file mode 100644
index 00000000..68c60aa3
Binary files /dev/null and b/docs_image/pc-database.jpg differ
diff --git a/docs_image/pc-login.jpg b/docs_image/pc-login.jpg
new file mode 100644
index 00000000..65fe8b46
Binary files /dev/null and b/docs_image/pc-login.jpg differ
diff --git a/docs_image/pc-manage.jpg b/docs_image/pc-manage.jpg
new file mode 100644
index 00000000..e5f8902a
Binary files /dev/null and b/docs_image/pc-manage.jpg differ
diff --git a/docs_image/pc-manage1.jpg b/docs_image/pc-manage1.jpg
new file mode 100644
index 00000000..4756c629
Binary files /dev/null and b/docs_image/pc-manage1.jpg differ
diff --git a/docs_image/pc-plugin.jpg b/docs_image/pc-plugin.jpg
new file mode 100644
index 00000000..147e26eb
Binary files /dev/null and b/docs_image/pc-plugin.jpg differ
diff --git a/docs_image/pc-plugin1.jpg b/docs_image/pc-plugin1.jpg
new file mode 100644
index 00000000..58694e6d
Binary files /dev/null and b/docs_image/pc-plugin1.jpg differ
diff --git a/docs_image/pc-store.jpg b/docs_image/pc-store.jpg
new file mode 100644
index 00000000..4c9b68e4
Binary files /dev/null and b/docs_image/pc-store.jpg differ
diff --git a/docs_image/pc-system.jpg b/docs_image/pc-system.jpg
new file mode 100644
index 00000000..9908a2bd
Binary files /dev/null and b/docs_image/pc-system.jpg differ
diff --git a/docs_image/pc-system1.jpg b/docs_image/pc-system1.jpg
new file mode 100644
index 00000000..3333a1b5
Binary files /dev/null and b/docs_image/pc-system1.jpg differ
diff --git a/docs_image/pc-system2.jpg b/docs_image/pc-system2.jpg
new file mode 100644
index 00000000..649a5bc9
Binary files /dev/null and b/docs_image/pc-system2.jpg differ
diff --git a/docs_image/webui00.png b/docs_image/webui00.png
deleted file mode 100644
index 71f7d368..00000000
Binary files a/docs_image/webui00.png and /dev/null differ
diff --git a/docs_image/webui01.png b/docs_image/webui01.png
deleted file mode 100644
index cd415685..00000000
Binary files a/docs_image/webui01.png and /dev/null differ
diff --git a/docs_image/webui02.png b/docs_image/webui02.png
deleted file mode 100644
index 0fcc4f05..00000000
Binary files a/docs_image/webui02.png and /dev/null differ
diff --git a/docs_image/webui03.png b/docs_image/webui03.png
deleted file mode 100644
index 2e7426e3..00000000
Binary files a/docs_image/webui03.png and /dev/null differ
diff --git a/docs_image/webui04.png b/docs_image/webui04.png
deleted file mode 100644
index 5810f71b..00000000
Binary files a/docs_image/webui04.png and /dev/null differ
diff --git a/docs_image/webui05.png b/docs_image/webui05.png
deleted file mode 100644
index d5f5e304..00000000
Binary files a/docs_image/webui05.png and /dev/null differ
diff --git a/docs_image/webui06.png b/docs_image/webui06.png
deleted file mode 100644
index 7541f679..00000000
Binary files a/docs_image/webui06.png and /dev/null differ
diff --git a/docs_image/webui07.png b/docs_image/webui07.png
deleted file mode 100644
index 1628ade7..00000000
Binary files a/docs_image/webui07.png and /dev/null differ
diff --git a/zhenxun/builtin_plugins/__init__.py b/zhenxun/builtin_plugins/__init__.py
index fbaeb280..f2688905 100644
--- a/zhenxun/builtin_plugins/__init__.py
+++ b/zhenxun/builtin_plugins/__init__.py
@@ -16,6 +16,7 @@ from zhenxun.models.sign_user import SignUser
from zhenxun.models.user_console import UserConsole
from zhenxun.services.log import logger
from zhenxun.utils.decorator.shop import shop_register
+from zhenxun.utils.manager.priority_manager import PriorityLifecycle
from zhenxun.utils.manager.resource_manager import ResourceManager
from zhenxun.utils.platform import PlatformUtils
@@ -70,7 +71,7 @@ from public.bag_users t1
"""
-@driver.on_startup
+@PriorityLifecycle.on_startup(priority=5)
async def _():
await ResourceManager.init_resources()
"""签到与用户的数据迁移"""
diff --git a/zhenxun/builtin_plugins/admin/welcome_message/data_source.py b/zhenxun/builtin_plugins/admin/welcome_message/data_source.py
index 2ccb33ee..c8e486ed 100644
--- a/zhenxun/builtin_plugins/admin/welcome_message/data_source.py
+++ b/zhenxun/builtin_plugins/admin/welcome_message/data_source.py
@@ -14,6 +14,7 @@ from zhenxun.services.log import logger
from zhenxun.utils._build_image import BuildImage
from zhenxun.utils._image_template import ImageTemplate
from zhenxun.utils.http_utils import AsyncHttpx
+from zhenxun.utils.manager.priority_manager import PriorityLifecycle
from zhenxun.utils.platform import PlatformUtils
BASE_PATH = DATA_PATH / "welcome_message"
@@ -91,7 +92,7 @@ def migrate(path: Path):
json.dump(new_data, f, ensure_ascii=False, indent=4)
-@driver.on_startup
+@PriorityLifecycle.on_startup(priority=5)
def _():
"""数据迁移
diff --git a/zhenxun/builtin_plugins/help/__init__.py b/zhenxun/builtin_plugins/help/__init__.py
index 726d4d1e..17002f0c 100644
--- a/zhenxun/builtin_plugins/help/__init__.py
+++ b/zhenxun/builtin_plugins/help/__init__.py
@@ -37,8 +37,8 @@ __plugin_meta__ = PluginMetadata(
configs=[
RegisterConfig(
key="type",
- value="normal",
- help="帮助图片样式 ['normal', 'HTML', 'zhenxun']",
+ value="zhenxun",
+ help="帮助图片样式 [normal, HTML, zhenxun]",
default_value="zhenxun",
)
],
diff --git a/zhenxun/builtin_plugins/hooks/__init__.py b/zhenxun/builtin_plugins/hooks/__init__.py
index 3ad29d71..2f8c79de 100644
--- a/zhenxun/builtin_plugins/hooks/__init__.py
+++ b/zhenxun/builtin_plugins/hooks/__init__.py
@@ -49,4 +49,14 @@ Config.add_plugin_config(
type=bool,
)
+Config.add_plugin_config(
+ "hook",
+ "RECORD_BOT_SENT_MESSAGES",
+ True,
+ help="记录bot消息发送",
+ default_value=True,
+ type=bool,
+)
+
+
nonebot.load_plugins(str(Path(__file__).parent.resolve()))
diff --git a/zhenxun/builtin_plugins/hooks/call_hook.py b/zhenxun/builtin_plugins/hooks/call_hook.py
index 2ff4d39c..1893754d 100644
--- a/zhenxun/builtin_plugins/hooks/call_hook.py
+++ b/zhenxun/builtin_plugins/hooks/call_hook.py
@@ -1,23 +1,85 @@
from typing import Any
-from nonebot.adapters import Bot
+from nonebot.adapters import Bot, Message
+from zhenxun.configs.config import Config
+from zhenxun.models.bot_message_store import BotMessageStore
from zhenxun.services.log import logger
+from zhenxun.utils.enum import BotSentType
from zhenxun.utils.manager.message_manager import MessageManager
+from zhenxun.utils.platform import PlatformUtils
+
+
+def replace_message(message: Message) -> str:
+ """将消息中的at、image、record、face替换为字符串
+
+ 参数:
+ message: Message
+
+ 返回:
+ str: 文本消息
+ """
+ result = ""
+ for msg in message:
+ if isinstance(msg, str):
+ result += msg
+ elif msg.type == "at":
+ result += f"@{msg.data['qq']}"
+ elif msg.type == "image":
+ result += "[image]"
+ elif msg.type == "record":
+ result += "[record]"
+ elif msg.type == "face":
+ result += f"[face:{msg.data['id']}]"
+ elif msg.type == "reply":
+ result += ""
+ else:
+ result += str(msg)
+ return result
@Bot.on_called_api
async def handle_api_result(
bot: Bot, exception: Exception | None, api: str, data: dict[str, Any], result: Any
):
- if not exception and api == "send_msg":
- try:
- if (uid := data.get("user_id")) and (msg_id := result.get("message_id")):
- MessageManager.add(str(uid), str(msg_id))
- logger.debug(
- f"收集消息id,user_id: {uid}, msg_id: {msg_id}", "msg_hook"
- )
- except Exception as e:
- logger.warning(
- f"收集消息id发生错误...data: {data}, result: {result}", "msg_hook", e=e
+ if exception or api != "send_msg":
+ return
+ user_id = data.get("user_id")
+ group_id = data.get("group_id")
+ message_id = result.get("message_id")
+ message: Message = data.get("message", "")
+ message_type = data.get("message_type")
+ try:
+ # 记录消息id
+ if user_id and message_id:
+ MessageManager.add(str(user_id), str(message_id))
+ logger.debug(
+ f"收集消息id,user_id: {user_id}, msg_id: {message_id}", "msg_hook"
)
+ except Exception as e:
+ logger.warning(
+ f"收集消息id发生错误...data: {data}, result: {result}", "msg_hook", e=e
+ )
+ if not Config.get_config("hook", "RECORD_BOT_SENT_MESSAGES"):
+ return
+ try:
+ await BotMessageStore.create(
+ bot_id=bot.self_id,
+ user_id=user_id,
+ group_id=group_id,
+ sent_type=BotSentType.GROUP
+ if message_type == "group"
+ else BotSentType.PRIVATE,
+ text=replace_message(message),
+ plain_text=message.extract_plain_text()
+ if isinstance(message, Message)
+ else replace_message(message),
+ platform=PlatformUtils.get_platform(bot),
+ )
+ logger.debug(f"消息发送记录,message: {message}")
+ except Exception as e:
+ logger.warning(
+ f"消息发送记录发生错误...data: {data}, result: {result}",
+ "msg_hook",
+ e=e,
+ )
diff --git a/zhenxun/builtin_plugins/init/init_config.py b/zhenxun/builtin_plugins/init/init_config.py
index 112d29de..eef63635 100644
--- a/zhenxun/builtin_plugins/init/init_config.py
+++ b/zhenxun/builtin_plugins/init/init_config.py
@@ -11,6 +11,7 @@ from zhenxun.configs.config import Config
from zhenxun.configs.path_config import DATA_PATH
from zhenxun.configs.utils import RegisterConfig
from zhenxun.services.log import logger
+from zhenxun.utils.manager.priority_manager import PriorityLifecycle
_yaml = YAML(pure=True)
_yaml.allow_unicode = True
@@ -102,7 +103,7 @@ def _generate_simple_config(exists_module: list[str]):
temp_file.unlink()
-@driver.on_startup
+@PriorityLifecycle.on_startup(priority=0)
def _():
"""
初始化插件数据配置
@@ -125,3 +126,4 @@ def _():
with plugins2config_file.open("w", encoding="utf8") as wf:
_yaml.dump(_data, wf)
_generate_simple_config(exists_module)
+ Config.reload()
diff --git a/zhenxun/builtin_plugins/init/init_plugin.py b/zhenxun/builtin_plugins/init/init_plugin.py
index dbeddb54..5bf50409 100644
--- a/zhenxun/builtin_plugins/init/init_plugin.py
+++ b/zhenxun/builtin_plugins/init/init_plugin.py
@@ -20,6 +20,7 @@ from zhenxun.utils.enum import (
PluginLimitType,
PluginType,
)
+from zhenxun.utils.manager.priority_manager import PriorityLifecycle
from .manager import manager
@@ -95,7 +96,7 @@ async def _handle_setting(
)
-@driver.on_startup
+@PriorityLifecycle.on_startup(priority=5)
async def _():
"""
初始化插件数据配置
diff --git a/zhenxun/builtin_plugins/init/init_task.py b/zhenxun/builtin_plugins/init/init_task.py
index cead7d72..b9bab56d 100644
--- a/zhenxun/builtin_plugins/init/init_task.py
+++ b/zhenxun/builtin_plugins/init/init_task.py
@@ -10,6 +10,7 @@ from zhenxun.models.group_console import GroupConsole
from zhenxun.models.task_info import TaskInfo
from zhenxun.services.log import logger
from zhenxun.utils.common_utils import CommonUtils
+from zhenxun.utils.manager.priority_manager import PriorityLifecycle
driver: Driver = nonebot.get_driver()
@@ -132,7 +133,7 @@ async def create_schedule(task: Task):
logger.error(f"动态创建定时任务 {task.name}({task.module}) 失败", e=e)
-@driver.on_startup
+@PriorityLifecycle.on_startup(priority=5)
async def _():
"""
初始化插件数据配置
diff --git a/zhenxun/builtin_plugins/plugin_store/data_source.py b/zhenxun/builtin_plugins/plugin_store/data_source.py
index 54b087a6..41977689 100644
--- a/zhenxun/builtin_plugins/plugin_store/data_source.py
+++ b/zhenxun/builtin_plugins/plugin_store/data_source.py
@@ -23,6 +23,12 @@ from .config import (
LOG_COMMAND,
)
+BAT_FILE = Path() / "win启动.bat"
+
+WIN_COMMAND = ["./Python310/python.exe", "-m", "pip", "install", "-r"]
+
+DEFAULT_COMMAND = ["poetry", "run", "pip", "install", "-r"]
+
def row_style(column: str, text: str) -> RowStyle:
"""被动技能文本风格
@@ -50,6 +56,33 @@ def install_requirement(plugin_path: Path):
VirtualEnvPackageManager.install_requirement(existing_requirements)
+ if not existing_requirements:
+ logger.debug(
+ f"No requirement.txt found for plugin: {plugin_path.name}", "插件管理"
+ )
+ return
+
+ try:
+ command = WIN_COMMAND if BAT_FILE.exists() else DEFAULT_COMMAND
+ command.append(str(existing_requirements))
+ result = subprocess.run(
+ command,
+ check=True,
+ capture_output=True,
+ text=True,
+ )
+ logger.debug(
+ "Successfully installed dependencies for"
+ f" plugin: {plugin_path.name}. Output:\n{result.stdout}",
+ "插件管理",
+ )
+ except subprocess.CalledProcessError:
+ logger.error(
+ f"Failed to install dependencies for plugin: {plugin_path.name}. "
+ " Error:\n{e.stderr}"
+ )
+
+
class StoreManager:
@classmethod
async def get_github_plugins(cls) -> list[StorePluginInfo]:
diff --git a/zhenxun/builtin_plugins/scripts.py b/zhenxun/builtin_plugins/scripts.py
index 0be7527c..b5fca300 100644
--- a/zhenxun/builtin_plugins/scripts.py
+++ b/zhenxun/builtin_plugins/scripts.py
@@ -1,12 +1,8 @@
-import nonebot
-from nonebot.drivers import Driver
-
from zhenxun.models.group_console import GroupConsole
-
-driver: Driver = nonebot.get_driver()
+from zhenxun.utils.manager.priority_manager import PriorityLifecycle
-@driver.on_startup
+@PriorityLifecycle.on_startup(priority=5)
async def _():
"""开启/禁用插件格式修改"""
_, is_create = await GroupConsole.get_or_create(group_id=133133133)
diff --git a/zhenxun/builtin_plugins/shop/__init__.py b/zhenxun/builtin_plugins/shop/__init__.py
index 432b9b92..120d2198 100644
--- a/zhenxun/builtin_plugins/shop/__init__.py
+++ b/zhenxun/builtin_plugins/shop/__init__.py
@@ -5,7 +5,9 @@ from nonebot_plugin_alconna import (
AlconnaQuery,
Args,
Arparma,
+ At,
Match,
+ MultiVar,
Option,
Query,
Subcommand,
@@ -47,6 +49,7 @@ __plugin_meta__ = PluginMetadata(
plugin_type=PluginType.NORMAL,
menu_type="商店",
commands=[
+ Command(command="商店"),
Command(command="我的金币"),
Command(command="我的道具"),
Command(command="购买道具"),
@@ -75,13 +78,21 @@ _matcher = on_alconna(
Subcommand("my-cost", help_text="我的金币"),
Subcommand("my-props", help_text="我的道具"),
Subcommand("buy", Args["name?", str]["num?", int], help_text="购买道具"),
- Subcommand("use", Args["name?", str]["num?", int], help_text="使用道具"),
Subcommand("gold-list", Args["num?", int], help_text="金币排行"),
),
priority=5,
block=True,
)
+_use_matcher = on_alconna(
+ Alconna(
+ "使用道具",
+ Args["name?", str]["num?", int]["at_users?", MultiVar(At)],
+ ),
+ priority=5,
+ block=True,
+)
+
_matcher.shortcut(
"我的金币",
command="商店",
@@ -103,13 +114,6 @@ _matcher.shortcut(
prefix=True,
)
-_matcher.shortcut(
- "使用道具(?P