Add HeXi bot codebase: custom plugins, web frontends, tests
- hexi core: message handling, rate limiting, cooldown, plugin manager - Custom plugins: BF stats, daily check-in, quotes, persona cards, etc. - Community plugins vendored under hexi/plugins with local fixes - Web admin frontends (learning-chat, persona-admin), unified hexi/web - Tests for rate_limit/cooldown/memes/persona; poetry.lock Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
import re
|
||||
from functools import partial
|
||||
from pathlib import Path
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from cookit import DebugFileWriter, auto_convert_unit, format_timedelta
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .collectors.cpu import CpuFreq
|
||||
|
||||
format_time_delta_ps = partial(format_timedelta, day_divider=" ", day_suffix="天")
|
||||
|
||||
|
||||
def match_list_regexp(reg_list: list[str], txt: str) -> re.Match | None:
|
||||
return next((match for r in reg_list if (match := re.search(r, txt))), None)
|
||||
|
||||
|
||||
def format_freq(value: float) -> str:
|
||||
"""将 MHz 频率格式化为 MHz/GHz(十进制 1000 换算)"""
|
||||
return auto_convert_unit(
|
||||
units=("MHz", "GHz", "THz"),
|
||||
multiplier=1000,
|
||||
unit_threshold=1000,
|
||||
value=value,
|
||||
with_space=False,
|
||||
)
|
||||
|
||||
|
||||
def format_cpu_freq(freq: "CpuFreq") -> str:
|
||||
if not freq.current and not freq.max:
|
||||
return "主频未知"
|
||||
current = freq.current or freq.max or 0.0
|
||||
max_freq = freq.max or 0.0
|
||||
if not max_freq or max_freq == current:
|
||||
return format_freq(current)
|
||||
return f"{format_freq(current)} / {format_freq(max_freq)}"
|
||||
|
||||
|
||||
debug = DebugFileWriter(Path(__file__).resolve().parents[2] / "logs", "picstatus")
|
||||
Reference in New Issue
Block a user