feat: remove like event (unreliable via INTERACT_WORD_V2); restore portable build dir

- Drop 'like' event from rules, handler and web UI (Bilibili like messages
  are not reliably delivered as INTERACT_WORD_V2 msg_type=6)
- Keep enter_room / follow / interact_other
- event_rules.json rewritten without like key
- build.py keeps BUILD_DIR = dist/portable
This commit is contained in:
2026-08-08 17:11:15 +08:00
parent 6ae7249583
commit 22ee613352
6 changed files with 9 additions and 15 deletions
-1
View File
@@ -100,7 +100,6 @@ python main.py --room-id ROOM_ID [--voice VOICE] [--speed SPEED]
| `blind_box` 盲盒礼物 | `{viewer_name}` `{gift_name}` `{gift_num}` `{blind_box_gift}` | | `blind_box` 盲盒礼物 | `{viewer_name}` `{gift_name}` `{gift_num}` `{blind_box_gift}` |
| `enter_room` 进房 | `{viewer_name}` `{user_uid}` | | `enter_room` 进房 | `{viewer_name}` `{user_uid}` |
| `follow` 关注 | `{viewer_name}` `{user_uid}` | | `follow` 关注 | `{viewer_name}` `{user_uid}` |
| `like` 点赞 | `{viewer_name}` `{user_uid}` |
| `interact_other` 其他互动 | `{viewer_name}` `{user_uid}` `{interact_type}`(分享/特别关注/互粉) | | `interact_other` 其他互动 | `{viewer_name}` `{user_uid}` `{interact_type}`(分享/特别关注/互粉) |
| `buy_guard` 上舰 | `{ships_viewer_name}` `{ships_level}`(舰长/提督/总督) `{ships_num}` `{ships_price}` | | `buy_guard` 上舰 | `{ships_viewer_name}` `{ships_level}`(舰长/提督/总督) `{ships_num}` `{ships_price}` |
| `guard_toast` 上舰提示 | `{ships_viewer_name}` `{ships_level}` `{guard_days}` `{toast_msg}` | | `guard_toast` 上舰提示 | `{ships_viewer_name}` `{ships_level}` `{guard_days}` `{toast_msg}` |
+5 -2
View File
@@ -106,13 +106,16 @@ def main() -> int:
"--hidden-import", "danmaku_handler", "--hidden-import", "danmaku_handler",
"--hidden-import", "tts", "--hidden-import", "tts",
"--hidden-import", "bili_login", "--hidden-import", "bili_login",
"--noconfirm",
"--distpath", str(BUILD_DIR / "app"), "--distpath", str(BUILD_DIR / "app"),
str(ROOT / "server.py"), str(ROOT / "server.py"),
], ],
) )
exe = BUILD_DIR / "app" / "bililive-tts" / "bililive-tts.exe" exe = BUILD_DIR / "app" / "bililive-tts" / "bililive-tts.exe"
if not exe.exists(): internal = BUILD_DIR / "app" / "bililive-tts" / "_internal"
print(f"ERROR: PyInstaller failed, {exe} not found") base_lib = internal / "base_library.zip"
if not exe.exists() or not base_lib.exists():
print(f"ERROR: PyInstaller build incomplete: exe={exe.exists()}, base_library.zip={base_lib.exists()}")
return 1 return 1
print(f" OK: {exe} ({exe.stat().st_size // 1024 // 1024} MB)") print(f" OK: {exe} ({exe.stat().st_size // 1024 // 1024} MB)")
+1 -5
View File
@@ -130,7 +130,7 @@ class DanmakuHandler(blivedm.BaseHandler):
logger.info("Super chat: %s (%d yuan): %s", message.uname, message.price, message.message) logger.info("Super chat: %s (%d yuan): %s", message.uname, message.price, message.message)
self._put(text) self._put(text)
# ── interact (enter room / follow / like / share) ────────────────── # ── interact (enter room / follow / share) ─────────────────────────
def _on_interact_word_v2(self, client: blivedm.BLiveClient, message: InteractWordV2Message) -> None: def _on_interact_word_v2(self, client: blivedm.BLiveClient, message: InteractWordV2Message) -> None:
msg_type = message.msg_type msg_type = message.msg_type
if msg_type == 1: if msg_type == 1:
@@ -141,10 +141,6 @@ class DanmakuHandler(blivedm.BaseHandler):
text = event_text(self._rules, "follow", text = event_text(self._rules, "follow",
viewer_name=message.username, viewer_name=message.username,
user_uid=message.uid) user_uid=message.uid)
elif msg_type == 6:
text = event_text(self._rules, "like",
viewer_name=message.username,
user_uid=message.uid)
else: else:
text = event_text(self._rules, "interact_other", text = event_text(self._rules, "interact_other",
viewer_name=message.username, viewer_name=message.username,
+1 -3
View File
@@ -5,19 +5,17 @@
"blind_box": true, "blind_box": true,
"enter_room": true, "enter_room": true,
"follow": false, "follow": false,
"like": false,
"interact_other": false, "interact_other": false,
"buy_guard": true, "buy_guard": true,
"guard_toast": false, "guard_toast": false,
"super_chat": true "super_chat": true
}, },
"templates": { "templates": {
"danmaku": "{uname}说、 {msg}", "danmaku": "卧槽!、是{uname}!、他说、 {msg}",
"gift": "感谢由{viewer_name}投喂的{gift_name}", "gift": "感谢由{viewer_name}投喂的{gift_name}",
"blind_box": "感谢由{viewer_name}投喂的{gift_name}爆出了{blind_box_gift}", "blind_box": "感谢由{viewer_name}投喂的{gift_name}爆出了{blind_box_gift}",
"enter_room": "欢迎{viewer_name}进入直播间", "enter_room": "欢迎{viewer_name}进入直播间",
"follow": "", "follow": "",
"like": "",
"interact_other": "", "interact_other": "",
"buy_guard": "恭喜{ships_viewer_name}成为尊贵的{ships_level}", "buy_guard": "恭喜{ships_viewer_name}成为尊贵的{ships_level}",
"guard_toast": "", "guard_toast": "",
+1 -3
View File
@@ -20,7 +20,6 @@ DEFAULT_RULES = {
"blind_box": True, "blind_box": True,
"enter_room": True, "enter_room": True,
"follow": False, "follow": False,
"like": False,
"interact_other": False, "interact_other": False,
"buy_guard": True, "buy_guard": True,
"guard_toast": False, "guard_toast": False,
@@ -32,7 +31,6 @@ DEFAULT_RULES = {
"blind_box": "\u611f\u8c22\u7531{viewer_name}\u6295\u5582\u7684{gift_name}\u7206\u51fa\u4e86{blind_box_gift}", "blind_box": "\u611f\u8c22\u7531{viewer_name}\u6295\u5582\u7684{gift_name}\u7206\u51fa\u4e86{blind_box_gift}",
"enter_room": "\u6b22\u8fce{viewer_name}\u8fdb\u5165\u76f4\u64ad\u95f4", "enter_room": "\u6b22\u8fce{viewer_name}\u8fdb\u5165\u76f4\u64ad\u95f4",
"follow": "", "follow": "",
"like": "",
"interact_other": "", "interact_other": "",
"buy_guard": "\u606d\u559c{ships_viewer_name}\u6210\u4e3a\u5c0a\u8d35\u7684{ships_level}", "buy_guard": "\u606d\u559c{ships_viewer_name}\u6210\u4e3a\u5c0a\u8d35\u7684{ships_level}",
"guard_toast": "", "guard_toast": "",
@@ -42,7 +40,7 @@ DEFAULT_RULES = {
} }
ALL_EVENTS = [ ALL_EVENTS = [
"danmaku", "gift", "blind_box", "enter_room", "follow", "like", "danmaku", "gift", "blind_box", "enter_room", "follow",
"interact_other", "buy_guard", "guard_toast", "super_chat", "interact_other", "buy_guard", "guard_toast", "super_chat",
] ]
+1 -1
View File
@@ -571,7 +571,7 @@ async function checkExistingLogin() {
const RULE_LABELS = { const RULE_LABELS = {
danmaku: '弹幕', gift: '礼物', blind_box: '盲盒礼物', danmaku: '弹幕', gift: '礼物', blind_box: '盲盒礼物',
enter_room: '进入房间', follow: '关注', like: '点赞', enter_room: '进入房间', follow: '关注',
interact_other: '其他互动', buy_guard: '上舰', interact_other: '其他互动', buy_guard: '上舰',
guard_toast: '上舰提示', super_chat: '醒目留言', guard_toast: '上舰提示', super_chat: '醒目留言',
}; };