fix: 修改理智数据格式 (#6525)

This commit is contained in:
MistEO
2023-09-25 21:58:19 +08:00
committed by GitHub
4 changed files with 45 additions and 38 deletions

View File

@@ -422,11 +422,12 @@ 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"]
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);

View File

@@ -1,5 +1,6 @@
#include "SanityBeforeStagePlugin.h"
#include <charconv>
#include <regex>
#include "Config/TaskData.h"
@@ -33,7 +34,7 @@ bool asst::SanityBeforeStagePlugin::_run()
{
LogTraceFunction;
get_sanity();
get_sanity_before_stage();
return true;
}
@@ -41,7 +42,7 @@ bool asst::SanityBeforeStagePlugin::_run()
/// <summary>
/// 获取 当前理智/最大理智
/// </summary>
void asst::SanityBeforeStagePlugin::get_sanity()
void asst::SanityBeforeStagePlugin::get_sanity_before_stage()
{
LogTraceFunction;
@@ -75,8 +76,26 @@ 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());
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;
}
int sanity_cur = 0, sanity_max = 0;
if (std::from_chars(text.data(), text.data() + slash_pos, sanity_cur).ec != std::errc()) {
break;
}
if (std::from_chars(text.data() + slash_pos + 1, text.data() + text.length(), sanity_max).ec != std::errc()) {
break;
}
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);
}

View File

@@ -15,6 +15,6 @@ namespace asst
private:
virtual bool _run() override;
void get_sanity();
void get_sanity_before_stage();
};
}

View File

@@ -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<string[]>();
var sanity_report = details["sanity_report"] as JObject;
if (finished_tasks?.Count == 1)
{
var unique_finished_task = (AsstTaskId)finished_tasks[0];
@@ -616,35 +616,22 @@ namespace MaaWpfGui.Main
bool isSanityForecastSucc = false;
DateTimeOffset reportTime = default;
TimeSpan timeDiff = TimeSpan.Zero;
do
try
{
if (sanity_report?.Length != 2 || !sanity_report[0].Contains("/"))
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;
}
// 被污染了直接抛弃
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)
{
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);
isSanityForecastSucc = true;
}
while (false);
catch
{
_logger.Information($"Failed to parse sanity report {sanity_report}");
}
var allTaskCompleteTitle = LocalizationHelper.GetString("AllTasksComplete");
var allTaskCompleteMessage = LocalizationHelper.GetString("AllTaskCompleteContent");