diff --git a/src/DosAtk.cpp b/src/DosAtk.cpp index ecb3177..6ecbd2f 100644 --- a/src/DosAtk.cpp +++ b/src/DosAtk.cpp @@ -169,6 +169,101 @@ void my_msg() printf("end my_msg"); } +// Функция для экранирования спецсимволов в JSON +std::string escape_json(const std::string& s) { + std::string result; + for (char c : s) { + switch (c) { + case '"': result += "\\\""; break; + case '\\': result += "\\\\"; break; + case '\b': result += "\\b"; break; + case '\f': result += "\\f"; break; + case '\n': result += "\\n"; break; + case '\r': result += "\\r"; break; + case '\t': result += "\\t"; break; + default: result += c; break; + } + } + return result; +} + +// Проверка, является ли строка числом (включая отрицательные) +bool is_numeric(const std::string& s) { + if (s.empty()) return false; + + size_t start = 0; + if (s[0] == '-') { + if (s.size() == 1) return false; + start = 1; + } + + for (size_t i = start; i < s.size(); ++i) { + if (!isdigit(s[i])) return false; + } + return true; +} + +int my_msg(const std::string& msg) { + std::cout << msg << std::endl; + + if (telegram_token.empty() || telegram_id.empty()) { + return 0; // Интеграция не настроена + } + + CURL* curl = curl_easy_init(); + if (!curl) return 6; // Ошибка инициализации CURL + + // Экранируем сообщение + std::string escaped_msg; + escaped_msg = escape_json(msg); + + // Формируем поле chat_id + std::string chat_id_field; + if (is_numeric(telegram_id)) { + chat_id_field = "\"chat_id\": " + telegram_id; + } else { + chat_id_field = "\"chat_id\": \"" + telegram_id + "\""; + } + + // Формируем JSON + std::string json_data = "{" + chat_id_field + ", \"text\": \"" + escaped_msg + "\"}"; + // Настраиваем заголовоки + struct curl_slist* headers = nullptr; + headers = curl_slist_append(headers, "Content-Type: application/json"); + + // Настраиваем параметры CURL + curl_easy_setopt(curl, CURLOPT_URL, ("https://api.telegram.org/bot" + telegram_token + "/sendMessage").c_str()); + curl_easy_setopt(curl, CURLOPT_POST, 1L); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_data.c_str()); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl/7.68.0"); + + // Игнорируем вывод ответа + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, [](void*, size_t size, size_t nmemb, void*) -> size_t { + return size * nmemb; + }); + + // Выполняем запрос + CURLcode res = curl_easy_perform(curl); + long http_code = 0; + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); + + // Освобождаем ресурсы + curl_slist_free_all(headers); + curl_easy_cleanup(curl); + + if (res != CURLE_OK) return 5; + + switch (http_code) { + case 200: return 0; + case 401: return 1; + case 400: return 2; + case 404: return 3; + default: + if (http_code >= 500) return 4; + return 4; + } +} // Данная функция записывает в файл лога сообщение int my_log() { diff --git a/src/a.out b/src/a.out new file mode 100755 index 0000000..4f5b579 Binary files /dev/null and b/src/a.out differ