fix: danmaku template now uses event rules; rules apply instantly on save

- _on_danmaku renders via event_text(rules, 'danmaku', ...) like all other
  events; hardcoded {uname}说、 {msg} format removed
- Drop message_format param from DanmakuHandler/DanmakuClient/server/main
- api_rules_post mutates the shared rules dict in place (clear+update)
  instead of rebinding, so running handlers pick up new templates
  immediately without restarting TTS
- UI save toast: '规则已保存并即时生效'
- Verified: custom template 卧槽!、是{uname}!、他说、 {msg} works;
  save-then-next-danmaku uses new template without restart
This commit is contained in:
2026-08-08 16:37:05 +08:00
parent 488abb9730
commit b7d0c26ad1
4 changed files with 14 additions and 22 deletions
+8 -13
View File
@@ -20,8 +20,6 @@ from event_rules import (
logger = logging.getLogger(__name__)
DANMAKU_FORMAT = "{uname}\u8bf4\u3001 {msg}"
INTERACT_TYPE_NAMES = {
3: "\u5206\u4eab", 4: "\u7279\u522b\u5173\u6ce8", 5: "\u4e92\u7c89",
}
@@ -32,12 +30,10 @@ class DanmakuHandler(blivedm.BaseHandler):
_CMD_CALLBACK_DICT = blivedm.BaseHandler._CMD_CALLBACK_DICT.copy()
def __init__(self, queue: asyncio.Queue, rules: dict | None = None,
message_format: str = DANMAKU_FORMAT):
def __init__(self, queue: asyncio.Queue, rules: dict | None = None):
super().__init__()
self._queue = queue
self._rules = rules or dict(DEFAULT_RULES)
self._message_format = message_format
self._count = 0
# ── custom SEND_GIFT callback to capture blind-gift info ──────────
@@ -62,11 +58,12 @@ class DanmakuHandler(blivedm.BaseHandler):
def _on_danmaku(self, client: blivedm.BLiveClient, message: DanmakuMessage) -> None:
if not message.msg.strip():
return
text = self._message_format.format(
uname=message.uname,
msg=message.msg,
uid=message.uid,
)
text = event_text(self._rules, "danmaku",
uname=message.uname,
msg=message.msg,
uid=message.uid)
if not text:
return
self._count += 1
if self._count % 20 == 1:
logger.info("Danmaku #%d: %s", self._count, text)
@@ -173,13 +170,11 @@ class DanmakuClient:
queue: asyncio.Queue,
cookies: Optional[dict[str, str]] = None,
rules: dict | None = None,
message_format: str = DANMAKU_FORMAT,
):
self._room_id = room_id
self._queue = queue
self._cookies = cookies
self._rules = rules or dict(DEFAULT_RULES)
self._message_format = message_format
self._client: Optional[blivedm.BLiveClient] = None
self._session: Optional["aiohttp.ClientSession"] = None
@@ -187,7 +182,7 @@ class DanmakuClient:
import aiohttp
self._session = await build_danmaku_session(self._cookies)
self._client = blivedm.BLiveClient(self._room_id, session=self._session)
handler = DanmakuHandler(self._queue, self._rules, self._message_format)
handler = DanmakuHandler(self._queue, self._rules)
self._client.set_handler(handler)
self._client.start()
logger.info("Connected to room %d", self._room_id)