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:
2026-09-01 13:13:40 +08:00
co-authored by Claude
parent 1783c60afa
commit b61d09f09f
3201 changed files with 160436 additions and 171 deletions
@@ -0,0 +1,33 @@
from typing import Optional, Union, List
from pydantic import BaseModel, validator
class Config(BaseModel):
steam_api_key: Union[str, List[str]]
proxy: Optional[str] = None
steam_request_interval: int = 300 # seconds
steam_broadcast_type: str = "part" # all, part, none
steam_disable_broadcast_on_startup: bool = False
steam_font_regular_path: Optional[str] = "hexi/resource/fonts/MiSans-Regular.ttf"
steam_font_light_path: Optional[str] = "hexi/resource/fonts/MiSans-Light.ttf"
steam_font_bold_path: Optional[str] = "hexi/resource/fonts/MiSans-Bold.ttf"
# 仅用于迁移旧 JSON 状态文件(运行时 API key 状态已持久化到 SQLite)
steam_api_key_state_path: Optional[str] = "hexi/data/api_keys_state.json"
# 游玩时长表图片主题: light / dark,默认亮色
steam_playtime_theme: str = "light"
@validator("steam_playtime_theme")
def check_theme(cls, v):
v = (v or "light").strip().lower()
if v not in ("light", "dark"):
raise ValueError("steam_playtime_theme 只能是 light 或 dark")
return v
@validator("steam_api_key", pre=True)
def ensure_list(cls, v):
if isinstance(v, str):
return [v]
return v