summaryrefslogtreecommitdiff
path: root/ATRI/plugins/status
diff options
context:
space:
mode:
🔖♻️🐛🔧🔥📝 更新版本:YHN-001-A03
🔖 更新版本至:YHN-001-A03 ✨ 新增插件: - 涩图 - 闲聊(文爱 ♻️ 重构: - Service - 所有插件 🐛 修复部分小bug 🔧 暂时移除部分设置 🔥 删除: - 插件:nsfw、wife。日后加回 - 插件 essential 中部分内容 📝 更新README
Diffstat (limited to 'ATRI/plugins/status')
2 files changed, 97 insertions, 0 deletions
diff --git a/ATRI/plugins/status/__init__.py b/ATRI/plugins/status/__init__.py
new file mode 100644
index 0000000..8955cb1
--- /dev/null
+++ b/ATRI/plugins/status/__init__.py
@@ -0,0 +1,26 @@
+from nonebot.adapters.cqhttp import Bot, MessageEvent
+
+from ATRI.utils.apscheduler import scheduler
+from .data_source import IsSurvive
+
+
+ping = IsSurvive().on_command("/ping", "检测bot简单信息处理速度")
+
+@ping.handle()
+async def _ping(bot: Bot, event: MessageEvent):
+ await ping.finish(IsSurvive.ping())
+
+
+status = IsSurvive().on_command("/status", "查看运行资源占用")
+
+@status.handle()
+async def _status(bot: Bot, event: MessageEvent):
+ msg, _ = IsSurvive.get_status()
+ await status.finish(msg)
+
+
+@scheduler.scheduled_job("interval", minutes=10, misfire_grace_time=15)
+async def _status_checking():
+ msg, stat = IsSurvive().get_status()
+ if not stat:
+ await status.finish(msg)
diff --git a/ATRI/plugins/status/data_source.py b/ATRI/plugins/status/data_source.py
new file mode 100644
index 0000000..c353313
--- /dev/null
+++ b/ATRI/plugins/status/data_source.py
@@ -0,0 +1,71 @@
+import time
+import psutil
+from datetime import datetime
+
+from ATRI.service import Service
+from ATRI.log import logger as log
+from ATRI.rule import is_in_service
+from ATRI.exceptions import GetStatusError
+
+
+__doc__ = """
+检查咱自身状态
+"""
+
+
+class IsSurvive(Service):
+
+ def __init__(self):
+ Service.__init__(self, "状态", __doc__, rule=is_in_service("状态"))
+
+ @staticmethod
+ def ping() -> str:
+ return "I'm fine."
+
+ @staticmethod
+ def get_status():
+ log.info("开始检查资源消耗...")
+ try:
+ cpu = psutil.cpu_percent(interval=1)
+ mem = psutil.virtual_memory().percent
+ disk = psutil.disk_usage("/").percent
+ inteSENT = psutil.net_io_counters().bytes_sent / 1000000 # type: ignore
+ inteRECV = psutil.net_io_counters().bytes_recv / 1000000 # type: ignore
+
+ now = time.time()
+ boot = psutil.boot_time()
+ up_time = str(
+ datetime.utcfromtimestamp(now).replace(microsecond=0)
+ - datetime.utcfromtimestamp(boot).replace(microsecond=0)
+ )
+ except GetStatusError:
+ raise GetStatusError("Failed to get status.")
+
+ msg = "アトリは、高性能ですから!"
+ if cpu > 90: # type: ignore
+ msg = "咱感觉有些头晕..."
+ is_ok = False
+ if mem > 90:
+ msg = "咱感觉有点头晕并且有点累..."
+ is_ok = False
+ elif mem > 90:
+ msg = "咱感觉有点累..."
+ is_ok = False
+ elif disk > 90:
+ msg = "咱感觉身体要被塞满了..."
+ is_ok = False
+ else:
+ log.info("资源占用正常")
+ is_ok = True
+
+ msg0 = (
+ "Self status:\n"
+ f"* CPU: {cpu}%\n"
+ f"* MEM: {mem}%\n"
+ f"* DISK: {disk}%\n"
+ f"* netSENT: {inteSENT}MB\n"
+ f"* netRECV: {inteRECV}MB\n"
+ f"* Runtime: {up_time}\n"
+ ) + msg
+
+ return msg0, is_ok