summaryrefslogtreecommitdiff
path: root/ATRI/plugins/console/driver
diff options
context:
space:
mode:
authorKyomotoi <[email protected]>2023-03-10 01:12:02 +0800
committerKyomotoi <[email protected]>2023-03-10 01:12:02 +0800
commit7c79376f40e1a23b2bc82b8b89957b6f42a73b14 (patch)
tree0077f2f1e079573ed7d66c2bcadf873d3460a182 /ATRI/plugins/console/driver
parent33178079549121d60a9703ad6bf584aa71f5481b (diff)
downloadATRI-7c79376f40e1a23b2bc82b8b89957b6f42a73b14.tar.gz
ATRI-7c79376f40e1a23b2bc82b8b89957b6f42a73b14.tar.bz2
ATRI-7c79376f40e1a23b2bc82b8b89957b6f42a73b14.zip
♻️ 重构 console, 使之代码可读性提高
Diffstat (limited to 'ATRI/plugins/console/driver')
-rw-r--r--ATRI/plugins/console/driver/__init__.py53
-rw-r--r--ATRI/plugins/console/driver/api.py92
-rw-r--r--ATRI/plugins/console/driver/data_source.py167
-rw-r--r--ATRI/plugins/console/driver/depends.py38
-rw-r--r--ATRI/plugins/console/driver/models.py38
-rw-r--r--ATRI/plugins/console/driver/path.py14
6 files changed, 0 insertions, 402 deletions
diff --git a/ATRI/plugins/console/driver/__init__.py b/ATRI/plugins/console/driver/__init__.py
deleted file mode 100644
index b6b9f89..0000000
--- a/ATRI/plugins/console/driver/__init__.py
+++ /dev/null
@@ -1,53 +0,0 @@
-from nonebot.drivers.fastapi import Driver
-
-from fastapi.staticfiles import StaticFiles
-from fastapi.middleware.cors import CORSMiddleware
-
-from ATRI import conf
-from ATRI.log import log
-
-from .path import *
-from .api import *
-
-from ..data_source import FRONTEND_DIR
-
-
-def register_driver(driver: Driver):
- app = driver.server_app
-
- origins = ["*"]
- app.add_middleware(
- CORSMiddleware,
- allow_origins=origins,
- allow_credentials=True,
- allow_methods=["GET", "POST"],
- allow_headers=["Content-Type"],
- )
-
- app.get(CONSOLE_BASE_URL)(base_url)
-
- app.get(CONSOLE_AUTH_URL)(auth_info)
-
- app.websocket(CONSOLE_RUNTIME_INFO_URL)(runtime_info)
- app.websocket(CONSOLE_MESSAGE_INFO_URL)(message_info)
-
- app.get(CONSOLE_SERVICE_LIST_URL)(service_list)
- app.get(CONSOLE_SERVICE_EDIT_URL)(edit_service)
-
- app.get(CONSOLE_BLOCK_LIST_URL)(block_list_info)
- app.get(CONSOLE_BLOCK_EDIT_URL)(edit_block_list)
-
- static_path = str(FRONTEND_DIR)
- app.mount(
- "/",
- StaticFiles(directory=static_path, html=True),
- name="atri-console",
- )
-
-
-def init_driver():
- from ATRI import driver
-
- register_driver(driver()) # type: ignore
- c_url = f"{conf.BotConfig.host}:{conf.BotConfig.port}"
- log.success(f"控制台将运行于: http://{c_url} 对应API节点为: /capi")
diff --git a/ATRI/plugins/console/driver/api.py b/ATRI/plugins/console/driver/api.py
deleted file mode 100644
index 668a308..0000000
--- a/ATRI/plugins/console/driver/api.py
+++ /dev/null
@@ -1,92 +0,0 @@
-import asyncio
-
-from fastapi import Depends, status
-from starlette.websockets import WebSocket, WebSocketState
-from websockets.exceptions import ConnectionClosedOK, ConnectionClosedError
-
-from .depends import *
-from .data_source import (
- get_process_info,
- get_service_list,
- edit_service as _edit_service,
- get_block_list,
- edit_block_list as _edit_block_list,
-)
-from ..listener import get_message_info
-
-
-def base_url(_=Depends(http_author)):
- return {"status": status.HTTP_204_NO_CONTENT, "msg": "该路径仅供控制台加载"}
-
-
-def auth_info(_=Depends(http_author)):
- return {"status": status.HTTP_200_OK, "detail": "OK"}
-
-
-async def runtime_info(websocket: WebSocket, _pass=Depends(websocket_author)):
- if not _pass:
- return
- await websocket.accept()
-
- try:
- while websocket.client_state == WebSocketState.CONNECTED:
- await websocket.send_json(get_process_info())
- await asyncio.sleep(1)
- except ConnectionClosedOK:
- pass
- except ConnectionClosedError:
- pass
- finally:
- await websocket.close()
- return
-
-
-async def message_info(websocket: WebSocket, _pass=Depends(websocket_author)):
- if not _pass:
- return
- await websocket.accept()
-
- try:
- while websocket.client_state == WebSocketState.CONNECTED:
- await websocket.send_json(get_message_info())
- await asyncio.sleep(1)
- except ConnectionClosedOK:
- pass
- except ConnectionClosedError:
- pass
- finally:
- await websocket.close()
- return
-
-
-def service_list(_=Depends(http_author)):
- return {"status": status.HTTP_200_OK, "data": get_service_list()}
-
-
-def edit_service(
- service: str,
- global_enabled: str = "2",
- enabled: str = "2",
- user: str = str(),
- group: str = str(),
- _=Depends(http_author),
-):
- return {
- "status": status.HTTP_200_OK,
- "data": _edit_service(
- service, int(global_enabled), bool(int(enabled)), user, group
- ),
- }
-
-
-def block_list_info(_=Depends(http_author)):
- return {"status": status.HTTP_200_OK, "data": get_block_list()}
-
-
-async def edit_block_list(
- enabled: str, user_id: str = str(), group_id: str = str(), _=Depends(http_author)
-):
- return {
- "status": status.HTTP_200_OK,
- "data": await _edit_block_list(bool(int(enabled)), user_id, group_id),
- }
diff --git a/ATRI/plugins/console/driver/data_source.py b/ATRI/plugins/console/driver/data_source.py
deleted file mode 100644
index 45b07e6..0000000
--- a/ATRI/plugins/console/driver/data_source.py
+++ /dev/null
@@ -1,167 +0,0 @@
-import os
-import json
-import psutil
-from pathlib import Path
-from datetime import datetime
-
-from ATRI.exceptions import GetStatusError
-
-from ATRI.utils import FileDealer
-from ATRI.service import ServiceTools, SERVICES_DIR
-
-from . import models
-
-
-def get_process_info() -> dict:
- try:
- platform_cpu = psutil.cpu_percent(interval=1)
- platform_mem = psutil.virtual_memory().percent
- platform_disk = psutil.disk_usage("/").percent
- platform_net_sent = str(psutil.net_io_counters().bytes_sent / 1000000)
- platform_net_recv = str(psutil.net_io_counters().bytes_recv / 1000000)
-
- process = psutil.Process(os.getpid())
- bot_cpu = str(process.cpu_percent(interval=1))
- bot_mem = str(process.memory_percent(memtype="rss"))
-
- now_time = datetime.now().timestamp()
- _boot_time = psutil.boot_time()
- _bot_run_time = process.create_time()
- boot_time = str(
- datetime.utcfromtimestamp(now_time).replace(microsecond=0)
- - datetime.utcfromtimestamp(_boot_time).replace(microsecond=0)
- )
- bot_run_time = str(
- datetime.utcfromtimestamp(now_time).replace(microsecond=0)
- - datetime.utcfromtimestamp(_bot_run_time).replace(microsecond=0)
- )
- except Exception:
- raise GetStatusError("获取实例运行信息失败")
-
- stat_msg = "アトリは、高性能ですから!"
- if platform_cpu > 90:
- stat_msg = "咱感觉有些头晕..."
- if platform_mem > 90:
- stat_msg = "咱感觉有点头晕并且有点累..."
- elif platform_mem > 90:
- stat_msg = "咱感觉有点累..."
- elif platform_disk > 90:
- stat_msg = "咱感觉身体要被塞满了..."
-
- platform_cpu = str(platform_cpu)
- platform_mem = str(platform_mem)
- platform_disk = str(platform_disk)
-
- return models.RuntimeInfo(
- status_message=stat_msg,
- platform_info=models.PlatformRuntimeInfo(
- cpu_percent=platform_cpu,
- mem_percent=platform_mem,
- disk_percent=platform_disk,
- net_sent=platform_net_sent,
- net_recv=platform_net_recv,
- boot_time=boot_time,
- ),
- bot_info=models.BotRuntimeInfo(
- cpu_percent=bot_cpu, mem_percent=bot_mem, run_time=bot_run_time
- ),
- ).dict()
-
-
-def get_service_list() -> dict:
- result = dict()
-
- files = os.listdir(SERVICES_DIR)
- for file in files:
- # Thank you, MacOS
- if file == ".DS_Store":
- continue
-
- service_path = SERVICES_DIR / file
- data = models.ServiceInfo.parse_file(service_path)
- result[data.service] = data.dict()
-
- return result
-
-
-def edit_service(
- service: str, global_enabled: int, enabled: bool, user_id: str, group_id: str
-):
- data = ServiceTools(service).load_service()
-
- if global_enabled != 2 and global_enabled:
- data.enabled = bool(global_enabled)
- else:
- data.enabled = False
- if user_id or group_id:
- if enabled:
- if user_id not in data.disable_user:
- return {"detail": "用户不存在于禁用名单"}
- else:
- data.disable_user.remove(user_id)
-
- if group_id not in data.disable_group:
- return {"detail": "群不存在于禁用名单"}
- else:
- data.disable_group.remove(group_id)
- else:
- if user_id not in data.disable_user:
- data.disable_user.append(user_id)
- else:
- return {"detail": "用户已存在于禁用名单"}
-
- if group_id not in data.disable_group:
- data.disable_group.append(group_id)
- else:
- return {"detail": "群已存在于禁用名单"}
-
- ServiceTools(service).save_service(data.dict())
-
- return {"detail": "操作完成~"}
-
-
-def get_block_list() -> models.BlockInfo:
- file_dir = Path(".") / "data" / "plugins" / "manege"
- path = file_dir / "block_user.json"
- user_data = json.loads(path.read_bytes())
-
- path = file_dir / "block_group.json"
- group_data = json.loads(path.read_bytes())
-
- return models.BlockInfo(user=user_data, group=group_data)
-
-
-async def edit_block_list(enabled: bool, user_id: str, group_id: str):
- data = get_block_list()
- now_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
- if enabled:
- if user_id:
- if user_id in data.user:
- return {"detail": "用户已存在于黑名单"}
- else:
- data.user[user_id] = now_time
- if group_id:
- if group_id in data.group:
- return {"detail": "群已存在于黑名单"}
- else:
- data.group[group_id] = now_time
- else:
- if user_id:
- if user_id in data.user:
- del data.user[user_id]
- else:
- return {"detail": "用户不存在于黑名单"}
- if group_id:
- if group_id in data.group:
- del data.group[group_id]
- else:
- return {"detail": "群不存在于黑名单"}
-
- file_dir = Path(".") / "data" / "plugins" / "manege"
- path = file_dir / "block_user.json"
- await FileDealer(path).write(json.dumps(data.user))
-
- path = file_dir / "block_group.json"
- await FileDealer(path).write(json.dumps(data.group))
-
- return {"detail": "操作完成~"}
diff --git a/ATRI/plugins/console/driver/depends.py b/ATRI/plugins/console/driver/depends.py
deleted file mode 100644
index 8205f44..0000000
--- a/ATRI/plugins/console/driver/depends.py
+++ /dev/null
@@ -1,38 +0,0 @@
-from typing import Union
-from datetime import datetime
-
-from fastapi import Query, HTTPException, status
-from starlette.websockets import WebSocket
-
-from ..data_source import AuthDealer
-
-
-def http_author(token: Union[str, None] = Query(default=None)):
- data = AuthDealer.get()
- if data is None:
- raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="验证信息不存在")
-
- now_time = datetime.now().timestamp()
- if token != data.token:
- raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="密钥不匹配, 请检查")
- elif now_time > data.dead_time:
- raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="密钥已过期")
- else:
- return token
-
-
-async def websocket_author(
- websocket: WebSocket, token: Union[str, None] = Query(default=None)
-):
- data = AuthDealer.get()
- if not data:
- await websocket.close(code=status.WS_1008_POLICY_VIOLATION)
- return
-
- now_time = datetime.now().timestamp()
- if token != data.token:
- await websocket.close(code=status.WS_1008_POLICY_VIOLATION)
- elif now_time > data.dead_time:
- await websocket.close(code=status.WS_1008_POLICY_VIOLATION)
- else:
- return token
diff --git a/ATRI/plugins/console/driver/models.py b/ATRI/plugins/console/driver/models.py
deleted file mode 100644
index cbc110d..0000000
--- a/ATRI/plugins/console/driver/models.py
+++ /dev/null
@@ -1,38 +0,0 @@
-from pydantic import BaseModel
-
-
-class PlatformRuntimeInfo(BaseModel):
- cpu_percent: str
- mem_percent: str
- disk_percent: str
- net_sent: str
- net_recv: str
- boot_time: str
-
-
-class BotRuntimeInfo(BaseModel):
- cpu_percent: str
- mem_percent: str
- run_time: str
-
-
-class RuntimeInfo(BaseModel):
- status_message: str
- platform_info: PlatformRuntimeInfo
- bot_info: BotRuntimeInfo
-
-
-class ServiceInfo(BaseModel):
- service: str
- docs: str
- permission: list
- cmd_list: dict
- enabled: bool
- only_admin: bool
- disable_user: list
- disable_group: list
-
-
-class BlockInfo(BaseModel):
- user: dict
- group: dict
diff --git a/ATRI/plugins/console/driver/path.py b/ATRI/plugins/console/driver/path.py
deleted file mode 100644
index 7009eb7..0000000
--- a/ATRI/plugins/console/driver/path.py
+++ /dev/null
@@ -1,14 +0,0 @@
-CONSOLE_BASE_URL = "/capi"
-
-CONSOLE_AUTH_URL = CONSOLE_BASE_URL + "/auth"
-
-CONSOLE_RUNTIME_INFO_URL = CONSOLE_BASE_URL + "/runtime"
-CONSOLE_MESSAGE_INFO_URL = CONSOLE_BASE_URL + "/message"
-
-CONSOLE_SERVICE_BASE_URL = CONSOLE_BASE_URL + "/service"
-CONSOLE_SERVICE_LIST_URL = CONSOLE_SERVICE_BASE_URL + "/list"
-CONSOLE_SERVICE_EDIT_URL = CONSOLE_SERVICE_BASE_URL + "/edit"
-
-CONSOLE_BLOCK_BASE_URL = CONSOLE_BASE_URL + "/block"
-CONSOLE_BLOCK_LIST_URL = CONSOLE_BLOCK_BASE_URL + "/list"
-CONSOLE_BLOCK_EDIT_URL = CONSOLE_BLOCK_BASE_URL + "/edit"