From eae6c5f6e8db2438d3d0feada70b90342e8dd84f Mon Sep 17 00:00:00 2001 From: status102 Date: Mon, 25 Sep 2023 10:29:44 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20=E5=9C=A8Core=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E7=90=86=E6=99=BA=E8=8E=B7=E5=8F=96=E6=95=B0=E6=8D=AE=E5=90=88?= =?UTF-8?q?=E6=B3=95=E6=80=A7=20fix=20#6519?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MaaCore/Assistant.cpp | 8 +++--- .../Task/Fight/SanityBeforeStagePlugin.cpp | 28 +++++++++++++++---- .../Task/Fight/SanityBeforeStagePlugin.h | 2 +- src/MaaWpfGui/Main/AsstProxy.cs | 21 ++++---------- 4 files changed, 32 insertions(+), 27 deletions(-) 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); From de9ffbc6251a6b05bbf37016d2ecfdd4308be4d5 Mon Sep 17 00:00:00 2001 From: zzyyyl Date: Mon, 25 Sep 2023 14:45:41 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=90=86=E6=99=BA?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=9A=84=E4=B8=80=E7=B3=BB=E5=88=97=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MaaCore/Assistant.cpp | 2 +- src/MaaWpfGui/Main/AsstProxy.cs | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/MaaCore/Assistant.cpp b/src/MaaCore/Assistant.cpp index 67286346c8..b6efd4cea5 100644 --- a/src/MaaCore/Assistant.cpp +++ b/src/MaaCore/Assistant.cpp @@ -423,7 +423,7 @@ void Assistant::working_proc() callback_json["finished_tasks"] = json::array(finished_tasks); const auto& sanity_report = status()->get_str(Status::FightSanityReport); - if (sanity_report) { + if (sanity_report && !sanity_report.value().empty()) { // [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/MaaWpfGui/Main/AsstProxy.cs b/src/MaaWpfGui/Main/AsstProxy.cs index cb060b255a..c199d0658b 100644 --- a/src/MaaWpfGui/Main/AsstProxy.cs +++ b/src/MaaWpfGui/Main/AsstProxy.cs @@ -623,6 +623,11 @@ namespace MaaWpfGui.Main break; } + if (!sanity_report.Select(i => i.Type).SequenceEqual(new[] { JTokenType.Integer, JTokenType.Integer, JTokenType.String })) + { + break; + } + int[] sanity = sanity_report.Take(2).Select(i => (int)i).ToArray(); if (sanity[0] < 0 || sanity[1] <= 1) { From cde0946d2cfcb75ff74b22afc852a7ba734de5ed Mon Sep 17 00:00:00 2001 From: zzyyyl Date: Mon, 25 Sep 2023 15:17:17 +0800 Subject: [PATCH 3/4] perf: use `from_chars` instead of `stoi` to avoid exception --- .../Task/Fight/SanityBeforeStagePlugin.cpp | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp b/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp index 49d49de9c1..babba680af 100644 --- a/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp +++ b/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp @@ -75,24 +75,25 @@ void asst::SanityBeforeStagePlugin::get_sanity_before_stage() sanity_info["details"]["sanity"] = text; callback(AsstMsg::SubTaskExtraInfo, sanity_info); - 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); + std::string sanity_report_str = std::string(); + do { + auto slash_pos = text.find('/'); + if (slash_pos == std::string::npos) { + break; + } + if (ranges::any_of(text, [](const char& c) { return c != '/' && !isdigit(c); })) { + break; + } - 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()); + int sanity_cur = 0, sanity_max = 0; + if (std::from_chars(text.data(), text.data() + slash_pos, sanity_cur).ec != std::errc()) { + break; } - else { - status()->set_str(Status::FightSanityReport, std::string()); + if (std::from_chars(text.data() + slash_pos + 1, text.data() + text.length(), sanity_max).ec != std::errc()) { + break; } - } - else { - status()->set_str(Status::FightSanityReport, std::string()); - } + // [100, 135, "2023-09-01 09:31:53.527"] + sanity_report_str = json::array { sanity_cur, sanity_max, utils::get_format_time() }.dumps(); + } while (false); + status()->set_str(Status::FightSanityReport, sanity_report_str); } From 39168ee6c0012d9ed85868cdd5994742d0264c90 Mon Sep 17 00:00:00 2001 From: zzyyyl Date: Mon, 25 Sep 2023 19:18:51 +0800 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20=E5=B0=86=E7=90=86=E6=99=BA?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=94=A8=20object=20=E8=80=8C=E4=B8=8D?= =?UTF-8?q?=E6=98=AF=20array=20=E5=AD=98=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MaaCore/Assistant.cpp | 11 ++++--- .../Task/Fight/SanityBeforeStagePlugin.cpp | 6 ++-- src/MaaWpfGui/Main/AsstProxy.cs | 33 ++++++++----------- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/MaaCore/Assistant.cpp b/src/MaaCore/Assistant.cpp index b6efd4cea5..a8e844a1bc 100644 --- a/src/MaaCore/Assistant.cpp +++ b/src/MaaCore/Assistant.cpp @@ -422,11 +422,12 @@ void Assistant::working_proc() if (m_tasks_list.empty()) { callback_json["finished_tasks"] = json::array(finished_tasks); - const auto& sanity_report = status()->get_str(Status::FightSanityReport); - if (sanity_report && !sanity_report.value().empty()) { - // [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; + if (auto sanity_report = status()->get_str(Status::FightSanityReport); + sanity_report && !sanity_report.value().empty()) { + if (auto report_json = json::parse(sanity_report.value()); report_json) { + // { "current_sanity": 100, "max_sanity": 135, "report_time": "2023-09-01 09:31:53.527" } + callback_json["sanity_report"] = report_json.value(); + } } append_callback(AsstMsg::AllTasksCompleted, callback_json); diff --git a/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp b/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp index babba680af..5a1230f20b 100644 --- a/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp +++ b/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp @@ -1,5 +1,6 @@ #include "SanityBeforeStagePlugin.h" +#include #include #include "Config/TaskData.h" @@ -92,8 +93,9 @@ void asst::SanityBeforeStagePlugin::get_sanity_before_stage() if (std::from_chars(text.data() + slash_pos + 1, text.data() + text.length(), sanity_max).ec != std::errc()) { break; } - // [100, 135, "2023-09-01 09:31:53.527"] - sanity_report_str = json::array { sanity_cur, sanity_max, utils::get_format_time() }.dumps(); + sanity_report_str = json::object { + { "current_sanity", sanity_cur }, { "max_sanity", sanity_cur }, { "report_time", utils::get_format_time() } + }.dumps(); } while (false); status()->set_str(Status::FightSanityReport, sanity_report_str); } diff --git a/src/MaaWpfGui/Main/AsstProxy.cs b/src/MaaWpfGui/Main/AsstProxy.cs index c199d0658b..fff7bc2afb 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"] as JArray; + var sanity_report = details["sanity_report"] as JObject; if (finished_tasks?.Count == 1) { var unique_finished_task = (AsstTaskId)finished_tasks[0]; @@ -616,29 +616,22 @@ namespace MaaWpfGui.Main bool isSanityForecastSucc = false; DateTimeOffset reportTime = default; TimeSpan timeDiff = TimeSpan.Zero; - do + try { - if (sanity_report?.Count != 3 || sanity_report.Any(i => i == null)) + int current_sanity = (int)sanity_report["current_sanity"]; + int max_sanity = (int)sanity_report["max_sanity"]; + string report_time = sanity_report["report_time"].ToString(); + if (current_sanity >= 0 && max_sanity > 1) { - break; + timeDiff = new TimeSpan(0, current_sanity < max_sanity ? (max_sanity - current_sanity) * 6 : 0, 0); + reportTime = DateTimeOffset.Parse(report_time).AddMinutes(timeDiff.TotalMinutes); + isSanityForecastSucc = true; } - - if (!sanity_report.Select(i => i.Type).SequenceEqual(new[] { JTokenType.Integer, JTokenType.Integer, JTokenType.String })) - { - break; - } - - 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((string)sanity_report[2]).AddMinutes(timeDiff.TotalMinutes); - isSanityForecastSucc = true; } - while (false); + catch + { + _logger.Information($"Failed to parse sanity report {sanity_report}"); + } var allTaskCompleteTitle = LocalizationHelper.GetString("AllTasksComplete"); var allTaskCompleteMessage = LocalizationHelper.GetString("AllTaskCompleteContent");