diff --git a/src/MaaCore/Assistant.cpp b/src/MaaCore/Assistant.cpp index 0b7c80cb27..67286346c8 100644 --- a/src/MaaCore/Assistant.cpp +++ b/src/MaaCore/Assistant.cpp @@ -422,10 +422,10 @@ void Assistant::working_proc() if (m_tasks_list.empty()) { callback_json["finished_tasks"] = json::array(finished_tasks); - const auto& sanity_str = status()->get_str(Status::FightSanityReport); - if (sanity_str) { - auto sanity_array = json::array(json::parse(*sanity_str).value_or(json::value(json::array()))); - // ["100/135", "2023-09-01 09:31:53.527"] + const auto& sanity_report = status()->get_str(Status::FightSanityReport); + if (sanity_report) { + // [100, 135, "2023-09-01 09:31:53.527"] + auto sanity_array = json::array(json::parse(*sanity_report).value_or(json::value(json::array()))); callback_json["sanity"] = sanity_array; } diff --git a/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp b/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp index f721540a21..49d49de9c1 100644 --- a/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp +++ b/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp @@ -33,7 +33,7 @@ bool asst::SanityBeforeStagePlugin::_run() { LogTraceFunction; - get_sanity(); + get_sanity_before_stage(); return true; } @@ -41,7 +41,7 @@ bool asst::SanityBeforeStagePlugin::_run() /// /// 获取 当前理智/最大理智 /// -void asst::SanityBeforeStagePlugin::get_sanity() +void asst::SanityBeforeStagePlugin::get_sanity_before_stage() { LogTraceFunction; @@ -75,8 +75,24 @@ void asst::SanityBeforeStagePlugin::get_sanity() sanity_info["details"]["sanity"] = text; callback(AsstMsg::SubTaskExtraInfo, sanity_info); - json::array value; - value.emplace_back(std::move(text)); - value.emplace_back(utils::get_format_time()); - status()->set_str(Status::FightSanityReport, value.dumps()); + if (text.find('/') && + ranges::all_of(text.cbegin(), text.cend(), [](const char& c) { return c == '/' || (c >= '0' && c <= '9'); })) { + std::string sanity_cur = text.substr(0, text.find('/')); + std::string sanity_max = text.substr(text.find('/') + 1); + + if (!sanity_cur.empty() && !sanity_max.empty()) { + // [100, 135, "2023-09-01 09:31:53.527"] + auto value = json::array(); + value.emplace_back(std::stoi(sanity_cur)); + value.emplace_back(std::stoi(sanity_max)); + value.emplace_back(utils::get_format_time()); + status()->set_str(Status::FightSanityReport, value.dumps()); + } + else { + status()->set_str(Status::FightSanityReport, std::string()); + } + } + else { + status()->set_str(Status::FightSanityReport, std::string()); + } } diff --git a/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.h b/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.h index ea5c223fd6..03e75d9953 100644 --- a/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.h +++ b/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.h @@ -15,6 +15,6 @@ namespace asst private: virtual bool _run() override; - void get_sanity(); + void get_sanity_before_stage(); }; } diff --git a/src/MaaWpfGui/Main/AsstProxy.cs b/src/MaaWpfGui/Main/AsstProxy.cs index 49c3eafe23..cb060b255a 100644 --- a/src/MaaWpfGui/Main/AsstProxy.cs +++ b/src/MaaWpfGui/Main/AsstProxy.cs @@ -589,7 +589,7 @@ namespace MaaWpfGui.Main case AsstMsg.AllTasksCompleted: bool isMainTaskQueueAllCompleted = true; var finished_tasks = details["finished_tasks"] as JArray; - var sanity_report = details["sanity"]?.ToObject(); + var sanity_report = details["sanity"] as JArray; if (finished_tasks?.Count == 1) { var unique_finished_task = (AsstTaskId)finished_tasks[0]; @@ -618,30 +618,19 @@ namespace MaaWpfGui.Main TimeSpan timeDiff = TimeSpan.Zero; do { - if (sanity_report?.Length != 2 || !sanity_report[0].Contains("/")) + if (sanity_report?.Count != 3 || sanity_report.Any(i => i == null)) { break; } - // 被污染了直接抛弃 - int[] sanity = sanity_report[0].Split('/').Select(i => - { - try - { - return Convert.ToInt32(i); - } - catch (FormatException) - { - return -1; - } - }).ToArray(); - if (sanity.Length != 2 || sanity[0] < 0 || sanity[1] <= 1) + int[] sanity = sanity_report.Take(2).Select(i => (int)i).ToArray(); + if (sanity[0] < 0 || sanity[1] <= 1) { break; } timeDiff = new TimeSpan(0, sanity[0] < sanity[1] ? (sanity[1] - sanity[0]) * 6 : 0, 0); - reportTime = DateTimeOffset.Parse(sanity_report[1]).AddMinutes(timeDiff.TotalMinutes); + reportTime = DateTimeOffset.Parse((string)sanity_report[2]).AddMinutes(timeDiff.TotalMinutes); isSanityForecastSucc = true; } while (false);