mirror of
https://github.com/LiteyukiStudio/LiteyukiBot.git
synced 2025-09-06 09:26:24 +00:00
feat: 添加了网页监控面板
This commit is contained in:
@ -1,5 +1,8 @@
|
||||
import nonebot
|
||||
from nonebot.plugin import PluginMetadata
|
||||
from src.utils.language import get_system_lang
|
||||
from .loader import *
|
||||
from .webdash import *
|
||||
|
||||
__author__ = "snowykami"
|
||||
__plugin_meta__ = PluginMetadata(
|
||||
@ -9,11 +12,8 @@ __plugin_meta__ = PluginMetadata(
|
||||
homepage="https://github.com/snowykami/LiteyukiBot",
|
||||
)
|
||||
|
||||
fastapi_app = nonebot.get_app()
|
||||
from src.utils.config import config
|
||||
|
||||
|
||||
@fastapi_app.get("/")
|
||||
async def root():
|
||||
return {
|
||||
"message": "Hello LiteyukiBot!",
|
||||
}
|
||||
sys_lang = get_system_lang()
|
||||
nonebot.logger.info(sys_lang.get("main.current_language", LANG=sys_lang.get("language.name")))
|
||||
nonebot.logger.info(sys_lang.get("main.enable_webdash", URL=f"http://{config['nonebot']['host']}:{config['nonebot']['port']}"))
|
||||
|
14
src/plugins/liteyuki_plugin_main/loader.py
Normal file
14
src/plugins/liteyuki_plugin_main/loader.py
Normal file
@ -0,0 +1,14 @@
|
||||
import os
|
||||
|
||||
import nonebot.plugin
|
||||
|
||||
from src.utils.language import load_from_dir
|
||||
from src.utils.resource import load_resource_from_dir
|
||||
|
||||
PLUGIN_NAME = os.path.basename(os.path.dirname(__file__))
|
||||
RESOURCE_PATH = "src/resources"
|
||||
load_resource_from_dir(RESOURCE_PATH)
|
||||
|
||||
for plugin_dir in os.listdir("src/plugins"):
|
||||
if plugin_dir != PLUGIN_NAME:
|
||||
nonebot.plugin.load_plugin(f"src.plugins.{plugin_dir}")
|
80
src/plugins/liteyuki_plugin_main/webdash.py
Normal file
80
src/plugins/liteyuki_plugin_main/webdash.py
Normal file
@ -0,0 +1,80 @@
|
||||
import nonebot
|
||||
import psutil
|
||||
from dash import Dash, Input, Output, dcc, html
|
||||
from starlette.middleware.wsgi import WSGIMiddleware
|
||||
|
||||
from src.utils.language import Language
|
||||
|
||||
app = nonebot.get_app()
|
||||
|
||||
|
||||
def get_system_info():
|
||||
cpu_percent = psutil.cpu_percent()
|
||||
memory_info = psutil.virtual_memory()
|
||||
memory_percent = memory_info.percent
|
||||
return {
|
||||
"cpu_percent" : cpu_percent,
|
||||
"memory_percent": memory_percent
|
||||
}
|
||||
|
||||
|
||||
@app.get("/system_info")
|
||||
async def system_info():
|
||||
return get_system_info()
|
||||
|
||||
lang = Language()
|
||||
dash_app = Dash(__name__)
|
||||
dash_app.layout = dash_app.layout = html.Div(children=[
|
||||
html.H1(children=lang.get("main.monitor.title"), style={
|
||||
'textAlign': 'center'
|
||||
}),
|
||||
|
||||
dcc.Graph(id='live-update-graph'),
|
||||
dcc.Interval(
|
||||
id='interval-component',
|
||||
interval=1 * 1000, # in milliseconds
|
||||
n_intervals=0
|
||||
)
|
||||
])
|
||||
|
||||
|
||||
@dash_app.callback(Output('live-update-graph', 'figure'),
|
||||
[Input('interval-component', 'n_intervals')])
|
||||
def update_graph_live(n):
|
||||
lang = Language()
|
||||
system_inf = get_system_info()
|
||||
dash_app.layout = html.Div(children=[
|
||||
html.H1(children=lang.get("main.monitor.title"), style={
|
||||
'textAlign': 'center'
|
||||
}),
|
||||
|
||||
dcc.Graph(id='live-update-graph'),
|
||||
dcc.Interval(
|
||||
id='interval-component',
|
||||
interval=1 * 1000, # in milliseconds
|
||||
n_intervals=0
|
||||
)
|
||||
])
|
||||
figure = {
|
||||
'data' : [
|
||||
{
|
||||
'x' : [lang.get('main.monitor.cpu')],
|
||||
'y' : [system_inf['cpu_percent']],
|
||||
'type': 'bar',
|
||||
'name': f"{lang.get('main.monitor.cpu')} {lang.get('main.monitor.usage')}"
|
||||
},
|
||||
{
|
||||
'x' : [lang.get('main.monitor.memory')],
|
||||
'y' : [system_inf['memory_percent']],
|
||||
'type': 'bar',
|
||||
'name': f"{lang.get('main.monitor.memory')} {lang.get('main.monitor.usage')}"
|
||||
},
|
||||
],
|
||||
'layout': {
|
||||
'title': lang.get('main.monitor.description'),
|
||||
}
|
||||
}
|
||||
return figure
|
||||
|
||||
|
||||
app.mount("/", WSGIMiddleware(dash_app.server))
|
@ -1,5 +1,7 @@
|
||||
import nonebot.plugin
|
||||
from nonebot import on_command
|
||||
from nonebot.permission import SUPERUSER
|
||||
|
||||
from src.utils.adapter import MessageEvent
|
||||
from src.utils.language import get_user_lang
|
||||
|
||||
@ -9,8 +11,12 @@ toggle_plugin = on_command("enable-plugin", aliases={"启用插件", "禁用插
|
||||
|
||||
@list_plugins.handle()
|
||||
async def _(event: MessageEvent):
|
||||
lang = get_user_lang(event.user_id)
|
||||
reply = lang.get("npm.current_plugins")
|
||||
lang = get_user_lang(str(event.user_id))
|
||||
reply = lang.get("npm.loaded_plugins")
|
||||
for plugin in nonebot.get_loaded_plugins():
|
||||
reply += f"\n- {plugin.name}"
|
||||
# 检查是否有 metadata 属性
|
||||
if plugin.metadata:
|
||||
reply += f"\n- {plugin.metadata.name}"
|
||||
else:
|
||||
reply += f"\n- {plugin.name}"
|
||||
await list_plugins.finish(reply)
|
||||
|
1
src/plugins/liteyuki_plugin_user/__init__.py
Normal file
1
src/plugins/liteyuki_plugin_user/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from .profile_manager import *
|
39
src/plugins/liteyuki_plugin_user/profile_manager.py
Normal file
39
src/plugins/liteyuki_plugin_user/profile_manager.py
Normal file
@ -0,0 +1,39 @@
|
||||
from nonebot import on_command
|
||||
from nonebot.params import CommandArg
|
||||
|
||||
from src.utils.adapter import Bot, Message, MessageEvent
|
||||
from src.utils.data_manager import User, user_db
|
||||
from src.utils.language import get_user_lang
|
||||
|
||||
|
||||
|
||||
attr_map = {
|
||||
"lang" : ["lang", "language", "语言"],
|
||||
"username": ["username", "昵称", "用户名"] # Bot称呼用户的昵称
|
||||
}
|
||||
|
||||
attr_cmd = on_command("profile", aliases={"个人设置"}, priority=0)
|
||||
|
||||
|
||||
@attr_cmd.handle()
|
||||
async def _(bot: Bot, event: MessageEvent, args: Message = CommandArg()):
|
||||
user = user_db.first(User, "user_id = ?", str(event.user_id), default=User(user_id=str(event.user_id)))
|
||||
ulang = get_user_lang(str(event.user_id))
|
||||
|
||||
args = str(args).split(" ", 1)
|
||||
input_key = args[0]
|
||||
attr_key = "username"
|
||||
for attr_key, attr_values in attr_map.items():
|
||||
if input_key in attr_values:
|
||||
break
|
||||
|
||||
if len(args) == 1:
|
||||
# 查询
|
||||
value = user.__dict__[attr_key]
|
||||
await attr_cmd.finish(f"{ulang.get('user.profile_manager.query', ATTR=attr_key, VALUE=value)}")
|
||||
else:
|
||||
# 设置
|
||||
value = args[1]
|
||||
user.__dict__[attr_key] = value
|
||||
user_db.save(user)
|
||||
await attr_cmd.finish(f"{ulang.get('user.profile_manager.set', ATTR=attr_key, VALUE=value)}")
|
Reference in New Issue
Block a user