ClashApi.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #include "stdafx.h"
  2. #include "ClashApi.h"
  3. ClashApi::ClashApi():m_port(0)
  4. {
  5. }
  6. ClashApi::~ClashApi()
  7. {
  8. }
  9. void ClashApi::SetProt(int port)
  10. {
  11. std::string t;
  12. t.append("http://172.0.0.1:");
  13. t.append(std::to_string(port));
  14. m_api_base_url = t;
  15. }
  16. std::string ClashApi::GetVersion()
  17. {
  18. auto url = m_api_base_url + "/version";
  19. m_cpr_session.SetUrl(cpr::Url{ url });
  20. auto res = m_cpr_session.Get();
  21. THROW_HR_IF(HTTP_E_STATUS_UNEXPECTED, res.status_code != 200);
  22. return nlohmann::json::parse(res.text).at("version").get<std::string>();
  23. }
  24. ClashConfig ClashApi::GetConfig()
  25. {
  26. auto url = m_api_base_url + "/configs";
  27. m_cpr_session.SetUrl(cpr::Url{ url });
  28. auto res = m_cpr_session.Get();
  29. THROW_HR_IF(HTTP_E_STATUS_UNEXPECTED, res.status_code != 200);
  30. return nlohmann::json::parse(res.text).get<ClashConfig>();
  31. }
  32. std::optional<std::wstring> ClashApi::RequestConfigUpdate(std::filesystem::path configPath)
  33. {
  34. nlohmann::json j = {
  35. {"path",configPath.u8string()}
  36. };
  37. // cpr::Put(cpr::Url{ url }, cpr::Body{ j.dump() });
  38. auto url = m_api_base_url + "/configs";
  39. m_cpr_session.SetUrl(cpr::Url{ url });
  40. m_cpr_session.SetBody(cpr::Body{j.dump()});
  41. auto res = m_cpr_session.Put();
  42. if (res.status_code != 204)
  43. {
  44. std::wstring errorDesp = L"Error occoured, Please try to fix it by restarting .";
  45. try
  46. {
  47. errorDesp = Utf8ToUtf16(nlohmann::json::parse(res.text).at("message").get<std::string_view>());
  48. }
  49. CATCH_LOG();
  50. return errorDesp;
  51. }
  52. return std::nullopt;
  53. }
  54. bool ClashApi::UpdateProxyMode(ClashProxyMode mode)
  55. {
  56. nlohmann::json j = {
  57. {"mode",mode}
  58. };
  59. auto url = m_api_base_url + "/configs";
  60. m_cpr_session.SetUrl(cpr::Url{ url });
  61. m_cpr_session.SetBody(cpr::Body{ j.dump() });
  62. auto res = m_cpr_session.Patch();
  63. return res.status_code == 204;
  64. }
  65. bool ClashApi::UpdateLogLevel(ClashLogLevel level)
  66. {
  67. nlohmann::json j = {
  68. {"log-level",level}
  69. };
  70. auto url = m_api_base_url + "/configs";
  71. m_cpr_session.SetUrl(cpr::Url{ url });
  72. m_cpr_session.SetBody(cpr::Body{ j.dump() });
  73. auto res = m_cpr_session.Patch();
  74. return res.status_code == 204;
  75. }
  76. bool ClashApi::UpdateAllowLan(bool allow)
  77. {
  78. nlohmann::json j = {
  79. {"allow-lan",allow}
  80. };
  81. auto url = m_api_base_url + "/configs";
  82. m_cpr_session.SetUrl(cpr::Url{ url });
  83. m_cpr_session.SetBody(cpr::Body{ j.dump() });
  84. auto res = m_cpr_session.Patch();
  85. return res.status_code == 204;
  86. }
  87. u16milliseconds ClashApi::GetProxyDelay(std::string_view proxyName)
  88. {
  89. std::string path = m_api_base_url + "/proxies/";
  90. path.append(Utf16ToUtf8(Utf8ToUtf16(proxyName)));
  91. path.append("/delay"); // "/proxies/\(proxyName.encoded)/delay"
  92. path.append("?timeout=5000&url=");
  93. path.append("http://cp.cloudflare.com/generate_204");
  94. m_cpr_session.SetUrl(cpr::Url{ path });
  95. auto res = m_cpr_session.Get();
  96. THROW_HR_IF(HTTP_E_STATUS_UNEXPECTED, res.status_code != 200);
  97. return u16milliseconds(nlohmann::json::parse(res.text).at("delay").get<uint16_t>());
  98. }
  99. ClashProxies ClashApi::GetProxies()
  100. {
  101. auto url = m_api_base_url + "/proxies";
  102. m_cpr_session.SetUrl(cpr::Url{ url });
  103. auto res = m_cpr_session.Get();
  104. THROW_HR_IF(HTTP_E_STATUS_UNEXPECTED, res.status_code != 200);
  105. return nlohmann::json::parse(res.text).get<ClashProxies>();
  106. }
  107. bool ClashApi::UpdateProxyGroup(std::string_view group, std::string_view selectProxy)
  108. {
  109. nlohmann::json j = {
  110. {"allow-lan",selectProxy}
  111. };
  112. std::string path = "/proxies/";
  113. path.append(Utf16ToUtf8(Utf8ToUtf16(group)));
  114. m_cpr_session.SetUrl(cpr::Url{ path });
  115. m_cpr_session.SetBody(cpr::Body{ j.dump() });
  116. auto res = m_cpr_session.Put();
  117. return res.status_code == 204; // HTTP 204 No Content
  118. }