feat: user-customizable event voice rules (gift/blind box/enter/follow/like/guard/super chat)

- New event_rules.py: load/save event_rules.json, robust template renderer
  (missing vars -> empty, empty template -> muted), guard level mapping
- danmaku_handler.py: custom SEND_GIFT callback to extract blind_gift_name;
  implements all event callbacks feeding the TTS queue per user rules
- server.py: GET/POST /api/rules, load rules at startup, pass to client
- Web UI: 'Event Voice Rules' panel (per-event toggle + template + save)
- main.py CLI loads rules; build.py bundles event_rules.json
- skip_free_gift option to mute silver free gifts
- Rebuild portable zip (83.8 MB)
This commit is contained in:
2026-08-08 16:17:28 +08:00
parent f4c99b1692
commit f3a71e908e
8 changed files with 468 additions and 16 deletions
+3
View File
@@ -13,6 +13,7 @@ import sys
from danmaku_handler import DanmakuClient
from chinese2kana import chinese_to_kana, filter_kana
from event_rules import load_rules
from tts import TTSBridge
from audio_player import play_wav_async, get_output_devices
@@ -71,9 +72,11 @@ async def main_async(args: argparse.Namespace) -> int:
queue: asyncio.Queue = asyncio.Queue(maxsize=256)
shutdown_event = asyncio.Event()
bridge = TTSBridge(voice=args.voice, speed=args.speed)
rules = load_rules()
danmaku_client = DanmakuClient(
room_id=args.room_id, queue=queue,
cookies={"SESSDATA": args.sessdata} if args.sessdata else None,
rules=rules,
message_format=args.format,
)