{"record":{"id":"6133bc33704f0e29","repo":"babalae/better-genshin-impact","slug":"realtimetimer-name","errorCode":null,"errorMessage":"添加实时任务失败: {realtimeTimer.Name}","messagePattern":"添加实时任务失败: (.+?)","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"BetterGenshinImpact/Core/Script/Dependence/Dispatcher.cs","lineNumber":97,"sourceCode":"    /// <param name=\"timer\"></param>\n    /// <exception cref=\"ArgumentNullException\"></exception>\n    /// <exception cref=\"ArgumentException\"></exception>\n    public void AddTrigger(RealtimeTimer timer)\n    {\n        var realtimeTimer = timer;\n        if (realtimeTimer == null)\n        {\n            throw new ArgumentNullException(nameof(realtimeTimer), \"实时任务对象不能为空\");\n        }\n\n        if (string.IsNullOrEmpty(realtimeTimer.Name))\n        {\n            throw new ArgumentNullException(nameof(realtimeTimer.Name), \"实时任务名称不能为空\");\n        }\n\n        if (!TaskTriggerDispatcher.Instance().AddTrigger(realtimeTimer.Name, realtimeTimer.Config))\n        {\n            throw new ArgumentException($\"添加实时任务失败: {realtimeTimer.Name}\", nameof(realtimeTimer.Name));\n        }\n    }\n\n    public async Task RunTask(SoloTask soloTask, CancellationTokenSource customCts)\n    {\n        // 创建链接的取消令牌源，任何一个取消都会触发\n        CancellationTokenSource linkedCts = CancellationTokenSource.CreateLinkedTokenSource(\n            customCts.Token,\n            CancellationContext.Instance.Cts.Token);\n        await RunTask(soloTask, linkedCts.Token);\n    }\n\n\n    /// <summary>\n    /// 运行独立任务\n    /// </summary>\n    /// <param name=\"soloTask\">\n    /// 支持的任务名称:","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/babalae/better-genshin-impact/blob/a7cb36712dcb409be610257d877fcea3597e9d6b/BetterGenshinImpact/Core/Script/Dependence/Dispatcher.cs#L79-L115","documentation":"ArgumentException thrown by Dispatcher.AddTrigger at line 97 when TaskTriggerDispatcher.Instance().AddTrigger(name, config) returns false. AddTrigger returns false when the supplied trigger name is not a registered/known trigger type — the dispatcher cannot map the name to a concrete trigger implementation. This is the only guard that fires AFTER the timer object itself is valid, so the failure is purely about an unrecognized name.","triggerScenarios":"AddTrigger(new RealtimeTimer('UnknownTrigger')) where 'UnknownTrigger' is not a registered trigger. A typo in a valid name like 'Autopick' instead of 'AutoPick'. A trigger name that exists only in a newer/older build.","commonSituations":"Typo or wrong casing in the trigger name (the lookup is name/case-sensitive). Feature module that registers the trigger was not loaded. Version skew between the script and the host.","solutions":["Use a known trigger name — currently 'AutoPick' and 'AutoSkip' (see RealtimeTimer constructor branches).","Verify exact spelling and casing against TaskTriggerDispatcher's registered triggers.","Catch ArgumentException in JS/TS wrapper to give the script author a readable error including the rejected name."],"exampleFix":"// before (JS)\ndispatcher.AddTrigger(new RealtimeTimer('Autopick')); // typo, returns false -> throws\n\n// after (JS)\ndispatcher.AddTrigger(new RealtimeTimer('AutoPick')); // exact registered name","handlingStrategy":"validation","validationCode":"// JS side — keep a whitelist of known trigger names\nconst KNOWN_TRIGGERS = ['AutoPick', 'AutoSkip'];\nif (!KNOWN_TRIGGERS.includes(timer.Name)) {\n  throw new Error(`Unknown trigger name: ${timer.Name}. Known: ${KNOWN_TRIGGERS.join(', ')}`);\n}\ndispatcher.AddTrigger(timer);","typeGuard":null,"tryCatchPattern":"try { dispatcher.AddTrigger(timer); }\ncatch (e) { /* ArgumentException: unknown name — log and continue or fall back */ }","preventionTips":["Match the exact casing/spelling of registered trigger names (AutoPick, AutoSkip).","Maintain a constant list of valid trigger names in your script.","Catch ArgumentException around AddTrigger to degrade gracefully on unknown names."],"tags":["script","dispatcher","realtime-timer","unknown-trigger","validation"],"backgroundTag":null,"analyzedSha":"a7cb36712dcb409be610257d877fcea3597e9d6b","analyzedAt":"2026-08-13T16:44:57.548Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}