 sansenhoshiandClaude Code
|
614e1d7e00
|
chore(bf-bot): 更新 BF 系列通知图
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-23 18:47:17 +08:00 |
|
 sansenhoshiandClaude Code
|
fc2e542418
|
chore(deps): 加载 nonebot_plugin_doroending
插件已装进 venv,补进 pyproject 的 plugins 列表才会被 nonebot 加载。
已用 bot.py 同款初始化流程(不含 nonebot.run)验证:全部插件加载成功,
doroending 注册 4 个 matcher。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-23 18:47:17 +08:00 |
|
 sansenhoshiandClaude Code
|
023dc1cb5d
|
feat(web): 停止/重启 bot 的等待相位全局化 / 覆盖层收进 BotActionProvider
重启入口有两个 —— 顶栏账号菜单(任何页面可点)和设置页「进程控制」。以前两边
各写一套:设置页只有本页的 fixed 覆盖层,顶栏只弹个 toast。于是从插件页/日志页
点「重启 bot」时界面照常可点,请求全打在已经退出的旧进程上。
- 新增 src/botAction.tsx:Provider 持 phase(null / stop / restart)与 readyCount,
覆盖层由 AppLayout 在 <Outlet/> 之外统一渲染,任何页面触发都盖得住;
纯等待逻辑仍在 lib/botAction.ts,两边共用一份
- 设置页删掉本地的 restarting 态与两份覆盖层,只负责发起 + 用 phase 禁用按钮;
改为消费 readyCount 在回连后重新拉数据(停机期间配置是旧的)
- 未挂载 Provider 时 run() 直接抛错,避免静默无覆盖层
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-23 18:47:15 +08:00 |
|
 sansenhoshiandClaude Code
|
574216645c
|
feat(video-analysis): 本地直发成功且群策略要下载链接时补传 S3
本地直发经 hexi/core/outbound_media 钩子改写后已真正可用,此前它因协议端不在本机
恒失败,public_url 因此总有值(每次实际都落到第 2 级 S3)。本地通道通了以后若不补,
public_url 会恒为 None,entry.py 的 `if pub and policy.sends_link` 会让「发送下载
链接」静默失效。
- _local_sent / _public_link_for 把「取链接」与「发送」解耦:只有策略真要链接
(policy.sends_link)时才补一次 S3 上传,其余情况一概不碰 S3 —— 媒体不再进
S3 归档是有意的,temp 保留交给 cleanup
- 补传失败只记日志返回 None:发送本身已经成功,不能反过来判失败
- tests/test_video_sender_link.py:覆盖 sends_link 开/关、多文件逐个补传、
拿不到 public_url、上传抛异常、policy 为 None 五条路径
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-23 18:47:12 +08:00 |
|
 sansenhoshiandClaude Code
|
ed75a66982
|
feat(core): 出站媒体内联化全局钩子 / 本地文件改写为协议端可达 URL
协议端不在本机,而 NoneBot 的 f2s() 会把 Path 转成 file:///D:/...(file:// 的
语义是「协议端那台机器上的路径」),必然 ENOENT。受影响的不止本仓调用点,还有
装不了改不动的 pip 社区插件(本次报错来自 nonebot_plugin_doroending),只能全局拦截。
- 新增 hexi/core/outbound_media.py:挂 Bot.on_calling_api(公开钩子、适配器不覆盖),
在真正调用适配器前原地改写发送类 API 的 data:默认改写成
http://<本机可达IP>:<端口>/media/<token> 由协议端主动回拉(地址与 /hub 首页
「协议端配对」同源,零新配置),拿不到可达地址时回退 base64://
- 文件上传类(upload_group_file / upload_private_file)单独处理:file 在顶层且
只做 URL 不做 base64(几十上百 MB 不适合内联),覆盖 video_analysis 群文件
「本地直传」兜底与 alconna 的 $onebot11:file
- 媒体路由 get_app().mount("/media", sub) 复用现有端口不新开服务;免鉴权是必须的
(协议端登录不了 hub),安全模型改为「路径由 bot 改写那一刻自己登记、请求方只能
出示不可猜 token」,配短 TTL;_mounted 为 False 时绝不发 URL
- 钩子内每个段独立 try/except,任何异常只告警不抛,绝不反过来把发送搞挂
- message_utils.common_proc_reply 占位图不再自己转 base64,改传 path= 交给钩子,
避免两处各有一套策略
- tests/test_outbound_media.py:用 tmp_path 造真实文件而非 mock 文件系统,重点覆盖
file:// 解析(空格/中文编码、手工未转义的字面 %XX)与 walker 各消息形态
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-23 18:47:09 +08:00 |
|
 sansenhoshiandClaude Code
|
4b5e8b8b2e
|
feat(web): 顶栏账号菜单接入 bot 启停 / 插件页分区 / 首页协议端配对信息
- 重启/关闭 bot 从设置页提到顶栏账号下拉(破坏性操作弹确认框),等待回连逻辑抽成
lib/botAction.ts 供两处共用:先等旧进程让出端口,再以 dashboard SSE 真收到一帧为准,
只看 HTTP 200 会在"端口起来但插件未挂接"时误判就绪
- 插件管理页按 带 Web 页面 / 带配置项 / 都没有 分区,卡片加类型与 Web/配置 徽章
- 首页「BOT 协议端信息」分两半:左半登录账号,右半 NoneBot 接入信息
(IP / 运行端口 / WS 路径 / 访问令牌,均可一键复制,另给整条反向 WS 地址),
监听地址非 0.0.0.0 时提示仅本机可连;「BOT 后端信息」移到自己一行
- dashboard.py 新增 endpoint 段:读 driver.config 的 host/port、驱动实际注册的
反向 WS 路由(自动跳过根路径与尾斜杠别名)、适配器令牌与本机网卡 IP
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-22 14:23:52 +08:00 |
|
 sansenhoshiandClaude Code
|
814c1994b6
|
feat(mc-server-status): 服务器列表 Web 管理页 / 数据层抽离 / mcstatus 13 适配
- services/servers.py:校验 + 读写 + 增删改收敛成一份数据层(顶层不 import nonebot,
可脱离运行时单测),群命令与 Web API 都只经它改数据,校验不再各写一套
- web_hub.py + /hub/mc_server_status 页面:按群列出服务器,抽屉新增/编辑(改名)/
测试连接,行内删除(删空一台连带删群);每条路由自带 require_admin
- handlers/server.py 改为薄封装,只在需要命令特有提示时自己判断
- services/mc.py 的图标属性名兼容 mcstatus ≥13 的 icon(旧版叫 favicon,
读错会把整条查询打成"查询失败")
- tests/test_mc_servers.py:数据层归一/改名/删群/坏文件兜底 + 图标解码两版属性名
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-22 14:23:46 +08:00 |
|
 sansenhoshiandClaude Code
|
4badcfcf32
|
feat(video-analysis): 群策略 v3 / 群文件投递通道 / Web 管理页
- policy.py:per-group 正交策略(自动解析 / 自动策略 / 禁用策略 / 存储 A·B·C /
公网 / 链接 / 群文件 + 平台限定),list.json v1/v2 → v3 自动迁移,
写入统一走 PolicyStore(加锁 + .tmp 原子替换 + 字段归一)
- 群文件并行通道 group_file.py:打包 zip(可选 pyzipper AES-256)后优先走 S3 预签名、
本地直传兜底;设了密码但 pyzipper 不可用就放弃上传,不退化成明文
- list_proc.py 收敛到「视频策略」统一入口,权限判定改走 policy
- Web 管理页 /hub/video_analysis(群策略 + 链接解析面板)与 services/web_jobs.py
(只复用纯函数层,Web 上下文不发消息;内存任务表 + 并发闸门 + 超时)
- 媒体命名统一到 utils.py({作者}_{作者id}/{作品名}[_短码]),cleanup 回收空目录
- 测试:policy / 命名 / 群文件 / web_jobs 四组
顺带 pyproject 的 pytest 加 testpaths=tests(避免收进 debug/ 下的调试脚本)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-22 14:23:32 +08:00 |
|
 sansenhoshiandClaude Code
|
51b08ccb68
|
feat: 群分析本地消息库 / 处理中占位图 / Web 日志窗口重构
- 群分析: 新增 history_store 只读本地消息源(读 learning_chat 落库,含 uninfo
昵称补齐/去重/截断判定),适配器优先读本地库、失败回退 OneBot 分页;分页
锚点字段回退链修复 NapCat 传 message_seq 翻页断裂;新增「本地记录」开关
- core/message_utils: 新增 common_proc_reply 占位图通用回复(引用消息 + 处理中
动图,支持后台任务显式指定 target),群分析/战况/倒放改用
- web_hub + web: 日志页改固定窗口滚动 + 翻页锚定 + 自动换行,SSE 日志轮转发
reset 帧,入口 HTML no-cache,行数统计增量缓存,CPU 改非阻塞采样,登录信息缓存
- 插件内 CLAUDE.md / DESIGN.md 不入库(.gitignore),galgame_card 两份文档取消
跟踪(文件保留在磁盘)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-14 18:59:01 +08:00 |
|
 sansenhoshiandClaude Code
|
662c28cb2f
|
chore(deps): 补齐运行时依赖声明
代码里直接 import、但 requirements.txt / pyproject.toml 都没声明的包补齐:
beautifulsoup4、opencv-contrib-python、curl_cffi、yt-dlp、boto3、cloudscraper、
cjk-textwrap、lxml、jieba、ruamel.yaml、pytz、psutil、py-cpuinfo、numpy、
nonebot-plugin-htmlrender、taskgroup(仅 py<3.11)。
其中多数此前只是靠别的包传递依赖带上来的(如 curl_cffi 来自 yt-dlp 的 extra),
换环境或升级就会缺。
同时清理无任何引用的 chardet、gradio_client、aiohttp-retry、qrcode,
并把 playwright 下限与 pyproject 对齐(1.44 → 1.50)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-14 18:58:52 +08:00 |
|
sansenhoshi
|
131b92b319
|
结构调整
视频解析多图/多媒体结构 消息体适配
|
2026-09-08 14:25:32 +08:00 |
|
 sansenhoshiandClaude Code
|
30899688a7
|
feat(video-analysis): 多文件媒体改走合并转发
抖音 note/小红书等多图、图+视频混合、多视频(动图)作品,下载产物
超过一个文件时直接拼成一条消息发送会失败(视频段不能与其他段混合),
统一改为合并转发: 一个图/视频一个节点,本地文件优先、S3 预签名链接
兜底; 单文件作品保持原有直发链路,多级发送链(本地→S3→回退)不变。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-08 14:21:57 +08:00 |
|
sansenhoshi
|
8c1a106230
|
新战备
|
2026-09-03 15:45:14 +08:00 |
|
sansenhoshi
|
2849a6250c
|
项目改造
|
2026-09-03 15:44:57 +08:00 |
|
 sansenhoshiandClaude Code
|
24d7c64e17
|
docs: fix relative paths in plugin standard docs after dev/ restructure
- dev/docs 插件标准文档中的相对路径适配到 dev/ 层级
- gitignore dev/docs/HD2/ 图标转换脚本与生成产物(cairosvg 输出等)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-03 15:40:43 +08:00 |
|
 sansenhoshiandClaude Code
|
c53b210413
|
feat: revamp web hub — global connection status, array config editor, log streaming
- Global connection badge in app header (persistent dashboard SSE via ConnectionProvider)
- LogProvider keeps log data and SSE stream alive across page switches (no reload spinner)
- Config drawer: password reveal toggle, array-type row editor for list fields
- Plugin management: optimistic updates, race-free loading, reset all group overrides
- Logs: load-earlier pagination; backend tail-read optimization (before/end offsets)
- web_auth: Web password changes persist (sync_admin seeding only when .env has explicit key)
- Dashboard: collect in thread pool + 1s result cache
- ErrorBoundary + local Suspense: plugin chunk loading stays inside content area
- UI polish: table row hover, mobile header/breadcrumb fixes, wider config drawer
- config_standard: array type inference for list fields; array env skip
- random_jm_code / steam_info: array schema migration; README web frontend note
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-03 15:39:10 +08:00 |
|
 sansenhoshiandClaude
|
9371a28e35
|
refactor: restructure plugins per MTSS standard, consolidate assets to res/
Per docs/plugin-audit-report.md (plugins normalized to
Trigger(handlers) → Service(services) → Model(repository/models) + utils):
- Split monolithic __init__.py into handlers/services/utils across
dailywife, deer_pipe, dice, galgame_card, helldivers_tools,
huoziyinshua, learning_chat, makeaquote, mc_server_status,
ncm_saying, picfinder_take, picstatus, random_jm_code, regif,
steam_info, video_analysis, group_tools
- Move static assets under res/: deer_pipe font/img, makeaquote font,
helldivers img/templates, huoziyinshua HuoZiYinShua
- Add config.py + register_config_items to ncm_saying, random_jm_code,
group_tools; learning_chat unified config bridge
- Remove deprecated: voice_trans plugin, bf_bot/test.py, dead code in
dailywife/deer_pipe, empty dirs, debug scripts under helldivers temp
- Disable brash_general_supercredits_tools (stub comment only)
- bot.py: optional stdout/stderr redirect to log file for Web log viewer,
force ANSI colorize on non-TTY sinks
- Move runtime data (jm_code.json) out of plugin dir into hexi/data
- Docs: plugin-audit-report.md; README reflects removed plugins
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-09-03 00:44:38 +08:00 |
|
 sansenhoshiandClaude
|
25bc30611f
|
docs: remove emoji from README headings
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-09-01 13:26:59 +08:00 |
|
 sansenhoshiandClaude
|
0157399443
|
docs: expand README with features, quick start, config, structure
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-09-01 13:25:16 +08:00 |
|
 sansenhoshiandClaude
|
b61d09f09f
|
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>
|
2026-09-01 13:13:40 +08:00 |
|
sansenhoshi
|
1783c60afa
|
Initial commit
|
2026-09-01 11:57:58 +08:00 |
|