优化自动每日指令与扫码退出秘境

This commit is contained in:
2026-08-30 00:40:18 +08:00
parent da8a82bfd5
commit 2d81615f78
10 changed files with 447 additions and 38 deletions
+89 -3
View File
@@ -1,4 +1,5 @@
import asyncio
import json
import logging
import tempfile
import unittest
@@ -21,6 +22,8 @@ from app.danmu_queue import (
COMMAND_ALLOWED_ROLE_DEFAULTS,
BetterGIRunner,
CommandHandler,
Config,
build_public_command_hints,
)
@@ -32,14 +35,17 @@ class DailyCommandIntegrationTests(unittest.IsolatedAsyncioTestCase):
data={
"commands": {
"run": {"enabled": True, "aliases": ["执行", ""]},
"daily": {"enabled": True, "aliases": ["自动每日"]},
"daily": {
"enabled": True,
"aliases": ["自动每日", "每日", "日常", "做每日", "做日常"],
},
"switch_party": {
"enabled": True,
"aliases": ["切换队伍", "更换队伍"],
"aliases": ["切换队伍", "更换队伍", "换队伍", "换队"],
},
"edit_party": {
"enabled": True,
"aliases": ["修改队员", "更换队员"],
"aliases": ["修改队员", "更换队员", "换队员", "换角色"],
},
}
},
@@ -315,6 +321,86 @@ class DailyCommandIntegrationTests(unittest.IsolatedAsyncioTestCase):
self.handler._split_command_text("修改队员芙宁娜纳西妲钟离雷电将军"),
("修改队员", "芙宁娜纳西妲钟离雷电将军"),
)
self.assertEqual(
self.handler._split_command_text("日常秘境 风本"),
("日常", "秘境 风本"),
)
self.assertEqual(
self.handler._split_command_text("换队永冻队"),
("换队", "永冻队"),
)
self.assertEqual(
self.handler._split_command_text("换角色芙宁娜纳西妲钟离雷电将军"),
("换角色", "芙宁娜纳西妲钟离雷电将军"),
)
def test_longest_new_alias_wins_for_contiguous_arguments(self):
self.assertEqual(
self.handler._split_command_text("换队员芙宁娜纳西妲钟离雷电将军"),
("换队员", "芙宁娜纳西妲钟离雷电将军"),
)
async def test_confirmed_login_announces_daily_and_party_usage(self):
self.queue_mgr.state["login_status"] = "confirming"
await self.handler._cmd_confirm_login(123, "测试用户", "")
self.assertEqual(self.broadcaster.broadcast.await_count, 2)
first, second = self.broadcaster.broadcast.await_args_list
self.assertIn("发送“每日”完成基础每日", first.args[0])
self.assertTrue(first.kwargs["tts"])
self.assertIn("每日 秘境 风本", second.args[0])
self.assertIn("换队 永冻队", second.args[0])
self.assertIn("换角色 四名角色", second.args[0])
self.assertIn("执行 组名", second.args[0])
self.assertFalse(second.kwargs["tts"])
self.assertTrue(second.kwargs["danmu"])
def test_public_command_hints_are_sanitized_and_use_shortest_alias(self):
config_data = {
"commands": self.config.data["commands"],
"bilibili": {"cookie": "secret"},
}
hints = build_public_command_hints(config_data)
self.assertEqual(set(hints), {"daily", "switch_party", "edit_party"})
self.assertEqual(hints["daily"]["preferred_alias"], "每日")
self.assertEqual(hints["switch_party"]["preferred_alias"], "换队")
self.assertEqual(hints["edit_party"]["preferred_alias"], "换角色")
self.assertNotIn("bilibili", hints)
def test_new_command_alias_defaults_are_complete(self):
config_path = self.root / "config.json"
config_path.write_text(json.dumps({}), encoding="utf-8")
config = Config(str(config_path))
self.assertEqual(
config.data["commands"]["daily"]["aliases"],
["自动每日", "每日", "日常", "做每日", "做日常"],
)
self.assertEqual(
config.data["commands"]["switch_party"]["aliases"],
["切换队伍", "更换队伍", "换队伍", "换队"],
)
self.assertEqual(
config.data["commands"]["edit_party"]["aliases"],
["修改队员", "更换队员", "换队员", "换角色"],
)
def test_disabled_command_hint_has_no_public_alias(self):
config_data = {
"commands": {
"daily": {"enabled": False, "aliases": ["每日"]},
}
}
hints = build_public_command_hints(config_data)
self.assertFalse(hints["daily"]["enabled"])
self.assertEqual(hints["daily"]["aliases"], [])
self.assertEqual(hints["daily"]["preferred_alias"], "")
def test_new_command_permissions_match_run(self):
for key in ("daily", "switch_party", "edit_party"):
+33
View File
@@ -0,0 +1,33 @@
import json
import unittest
from pathlib import Path
class LoginScriptDomainExitTests(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.script_dir = Path(__file__).resolve().parents[1] / "integrations" / "扫码上号"
cls.source = (cls.script_dir / "main.js").read_text(encoding="utf-8")
cls.settings = json.loads((cls.script_dir / "settings.json").read_text(encoding="utf-8"))
cls.manifest = json.loads((cls.script_dir / "manifest.json").read_text(encoding="utf-8"))
def test_domain_exit_requires_specific_ocr_text_before_click(self):
self.assertIn('combinedText.includes("退出秘境")', self.source)
self.assertIn('result.text.includes("确认") && result.x >= 900', self.source)
def test_legacy_and_default_confirm_coordinates_are_corrected(self):
defaults = {
item.get("name"): item.get("default")
for item in self.settings
if isinstance(item, dict) and item.get("name")
}
self.assertEqual(defaults["confirmExitX"], "1164")
self.assertEqual(defaults["confirmExitY"], "757")
self.assertIn("confirmExitX === 830 && confirmExitY === 600", self.source)
def test_private_login_script_version_is_updated(self):
self.assertEqual(self.manifest["version"], "1.1")
if __name__ == "__main__":
unittest.main()