#include "stdafx.h" #include "ClashApi.h" ClashApi::ClashApi():m_port(0) { } ClashApi::~ClashApi() { } void ClashApi::SetProt(int port) { std::string t; t.append("http://172.0.0.1:"); t.append(std::to_string(port)); m_api_base_url = t; } std::string ClashApi::GetVersion() { auto url = m_api_base_url + "/version"; m_cpr_session.SetUrl(cpr::Url{ url }); auto res = m_cpr_session.Get(); THROW_HR_IF(HTTP_E_STATUS_UNEXPECTED, res.status_code != 200); return nlohmann::json::parse(res.text).at("version").get(); } ClashConfig ClashApi::GetConfig() { auto url = m_api_base_url + "/configs"; m_cpr_session.SetUrl(cpr::Url{ url }); auto res = m_cpr_session.Get(); THROW_HR_IF(HTTP_E_STATUS_UNEXPECTED, res.status_code != 200); return nlohmann::json::parse(res.text).get(); } std::optional ClashApi::RequestConfigUpdate(std::filesystem::path configPath) { nlohmann::json j = { {"path",configPath.u8string()} }; // cpr::Put(cpr::Url{ url }, cpr::Body{ j.dump() }); auto url = m_api_base_url + "/configs"; m_cpr_session.SetUrl(cpr::Url{ url }); m_cpr_session.SetBody(cpr::Body{j.dump()}); auto res = m_cpr_session.Put(); if (res.status_code != 204) { std::wstring errorDesp = L"Error occoured, Please try to fix it by restarting ."; try { errorDesp = Utf8ToUtf16(nlohmann::json::parse(res.text).at("message").get()); } CATCH_LOG(); return errorDesp; } return std::nullopt; } bool ClashApi::UpdateProxyMode(ClashProxyMode mode) { nlohmann::json j = { {"mode",mode} }; auto url = m_api_base_url + "/configs"; m_cpr_session.SetUrl(cpr::Url{ url }); m_cpr_session.SetBody(cpr::Body{ j.dump() }); auto res = m_cpr_session.Patch(); return res.status_code == 204; } bool ClashApi::UpdateLogLevel(ClashLogLevel level) { nlohmann::json j = { {"log-level",level} }; auto url = m_api_base_url + "/configs"; m_cpr_session.SetUrl(cpr::Url{ url }); m_cpr_session.SetBody(cpr::Body{ j.dump() }); auto res = m_cpr_session.Patch(); return res.status_code == 204; } bool ClashApi::UpdateAllowLan(bool allow) { nlohmann::json j = { {"allow-lan",allow} }; auto url = m_api_base_url + "/configs"; m_cpr_session.SetUrl(cpr::Url{ url }); m_cpr_session.SetBody(cpr::Body{ j.dump() }); auto res = m_cpr_session.Patch(); return res.status_code == 204; } u16milliseconds ClashApi::GetProxyDelay(std::string_view proxyName) { std::string path = m_api_base_url + "/proxies/"; path.append(Utf16ToUtf8(Utf8ToUtf16(proxyName))); path.append("/delay"); // "/proxies/\(proxyName.encoded)/delay" path.append("?timeout=5000&url="); path.append("http://cp.cloudflare.com/generate_204"); m_cpr_session.SetUrl(cpr::Url{ path }); auto res = m_cpr_session.Get(); THROW_HR_IF(HTTP_E_STATUS_UNEXPECTED, res.status_code != 200); return u16milliseconds(nlohmann::json::parse(res.text).at("delay").get()); } ClashProxies ClashApi::GetProxies() { auto url = m_api_base_url + "/proxies"; m_cpr_session.SetUrl(cpr::Url{ url }); auto res = m_cpr_session.Get(); THROW_HR_IF(HTTP_E_STATUS_UNEXPECTED, res.status_code != 200); return nlohmann::json::parse(res.text).get(); } bool ClashApi::UpdateProxyGroup(std::string_view group, std::string_view selectProxy) { nlohmann::json j = { {"allow-lan",selectProxy} }; std::string path = "/proxies/"; path.append(Utf16ToUtf8(Utf8ToUtf16(group))); m_cpr_session.SetUrl(cpr::Url{ path }); m_cpr_session.SetBody(cpr::Body{ j.dump() }); auto res = m_cpr_session.Put(); return res.status_code == 204; // HTTP 204 No Content }