diff --git a/src/MaaCore/Config/Miscellaneous/CopilotConfig.cpp b/src/MaaCore/Config/Miscellaneous/CopilotConfig.cpp
index 54e1d14001..7479d49cad 100644
--- a/src/MaaCore/Config/Miscellaneous/CopilotConfig.cpp
+++ b/src/MaaCore/Config/Miscellaneous/CopilotConfig.cpp
@@ -4,10 +4,42 @@
#include "TilePack.h"
#include "Utils/Logger.hpp"
+#include "Utils/NoWarningCPR.h"
using namespace asst::battle;
using namespace asst::battle::copilot;
+bool asst::CopilotConfig::parse_magic_code(const std::string& copilot_magic_code)
+{
+ if (copilot_magic_code.empty()) {
+ Log.error("copilot_magic_code is empty");
+ return false;
+ }
+
+ cpr::Response response =
+ cpr::Get(cpr::Url("https://prts.maa.plus/copilot/get/" + copilot_magic_code), cpr::Timeout { 10000 });
+
+ if (response.status_code != 200) {
+ Log.error("copilot_magic_code request failed");
+ return false;
+ }
+
+ auto json = json::parse(response.text);
+
+ if (json && json->contains("status_code") && json->at("status_code").as_integer() == 200) {
+ if (json->contains("data") && json->at("data").contains("content")) {
+ auto content_str = json->at("data").at("content").as_string();
+ auto content = json::parse(content_str);
+ if (content) {
+ return parse(*content);
+ }
+ }
+ }
+
+ Log.error("using copilot_code failed, response:", response.text);
+ return false;
+}
+
void asst::CopilotConfig::clear()
{
m_data = decltype(m_data)();
diff --git a/src/MaaCore/Config/Miscellaneous/CopilotConfig.h b/src/MaaCore/Config/Miscellaneous/CopilotConfig.h
index 8f9f03986c..2ea9d92971 100644
--- a/src/MaaCore/Config/Miscellaneous/CopilotConfig.h
+++ b/src/MaaCore/Config/Miscellaneous/CopilotConfig.h
@@ -18,6 +18,7 @@ namespace asst
const battle::copilot::CombatData& get_data() const noexcept { return m_data; }
const std::string& get_stage_name() const noexcept { return m_data.info.stage_name; }
+ bool parse_magic_code(const std::string& copilot_magic_code);
void clear();
protected:
diff --git a/src/MaaCore/MaaCore.vcxproj b/src/MaaCore/MaaCore.vcxproj
index 7d7e5362ab..18a6afe5cc 100644
--- a/src/MaaCore/MaaCore.vcxproj
+++ b/src/MaaCore/MaaCore.vcxproj
@@ -179,6 +179,7 @@
+
diff --git a/src/MaaCore/MaaCore.vcxproj.filters b/src/MaaCore/MaaCore.vcxproj.filters
index a2708925fc..3374a633b7 100644
--- a/src/MaaCore/MaaCore.vcxproj.filters
+++ b/src/MaaCore/MaaCore.vcxproj.filters
@@ -324,6 +324,9 @@
源文件\Utils
+
+ 源文件\Utils
+
源文件\Utils
diff --git a/src/MaaCore/Task/Interface/CopilotTask.cpp b/src/MaaCore/Task/Interface/CopilotTask.cpp
index f0b3f9d82b..d4fc44254c 100644
--- a/src/MaaCore/Task/Interface/CopilotTask.cpp
+++ b/src/MaaCore/Task/Interface/CopilotTask.cpp
@@ -1,5 +1,7 @@
#include "CopilotTask.h"
+#include
+
#include "Config/Miscellaneous/CopilotConfig.h"
#include "Task/Miscellaneous/BattleFormationTask.h"
#include "Task/Miscellaneous/BattleProcessTask.h"
@@ -42,7 +44,16 @@ bool asst::CopilotTask::set_params(const json::value& params)
return false;
}
- if (!Copilot.load(utils::path(*filename_opt))) {
+ static const std::regex maa_regex(R"(^maa://(\d+)$)");
+ std::smatch match;
+
+ if (std::regex_match(*filename_opt, match, maa_regex)) {
+ if (!Copilot.parse_magic_code(match[1].str())) {
+ Log.error("CopilotConfig parse failed");
+ return false;
+ }
+ }
+ else if (!Copilot.load(utils::path(*filename_opt))) {
Log.error("CopilotConfig parse failed");
return false;
}
diff --git a/src/MaaCore/Task/ReportDataTask.h b/src/MaaCore/Task/ReportDataTask.h
index 655191a98f..6d49e55887 100644
--- a/src/MaaCore/Task/ReportDataTask.h
+++ b/src/MaaCore/Task/ReportDataTask.h
@@ -2,19 +2,12 @@
#include "AbstractTask.h"
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable : 4244)
-#endif
-#include
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
-
#include
#include
#include
+#include "Utils/NoWarningCPR.h"
+
namespace asst
{
enum class ReportType
diff --git a/src/MaaCore/Utils/NoWarningCPR.h b/src/MaaCore/Utils/NoWarningCPR.h
new file mode 100644
index 0000000000..a79ce7ab45
--- /dev/null
+++ b/src/MaaCore/Utils/NoWarningCPR.h
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "Common/AsstConf.h"
+
+ASST_SUPPRESS_CV_WARNINGS_START
+#include
+ASST_SUPPRESS_CV_WARNINGS_END