From ade686da5c662ec8c8e06b47810dbd7202b49286 Mon Sep 17 00:00:00 2001 From: SyntaxError Date: Sat, 15 Nov 2025 19:53:10 -0300 Subject: [PATCH] incomplete --- LICENSE.txt | 0 Makefile | 0 README.md | 0 neocities | Bin 0 -> 16856 bytes src/0 | 0 src/info.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++ src/info.h | 6 ++++ src/login.sh | 0 src/main.c | 88 ++------------------------------------------------- src/main.h | 7 ++++ 10 files changed, 100 insertions(+), 85 deletions(-) mode change 100644 => 100755 LICENSE.txt mode change 100644 => 100755 Makefile mode change 100644 => 100755 README.md create mode 100755 neocities create mode 100755 src/0 create mode 100644 src/info.c create mode 100644 src/info.h create mode 100644 src/login.sh mode change 100644 => 100755 src/main.c create mode 100644 src/main.h diff --git a/LICENSE.txt b/LICENSE.txt old mode 100644 new mode 100755 diff --git a/Makefile b/Makefile old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/neocities b/neocities new file mode 100755 index 0000000000000000000000000000000000000000..2a1b3887c3de5a5facda74de09e3ac1bb2990df0 GIT binary patch literal 16856 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 B`DFkA literal 0 HcmV?d00001 diff --git a/src/0 b/src/0 new file mode 100755 index 0000000..e69de29 diff --git a/src/info.c b/src/info.c new file mode 100644 index 0000000..0b7ac12 --- /dev/null +++ b/src/info.c @@ -0,0 +1,84 @@ +int fetch_neocities_info() { + const char *user = getenv("NEOCITIES_USER"); + const char *pass = getenv("NEOCITIES_PASS"); + if (!user || !pass) { + fprintf(stderr, "Variáveis NEOCITIES_USER ou NEOCITIES_PASS não definidas!\n"); + return 1; + } + + char auth[256]; + snprintf(auth, sizeof(auth), "%s:%s", user, pass); + + CURL *curl = curl_easy_init(); + if (!curl) { + fprintf(stderr, "Erro ao inicializar cURL\n"); + return 1; + } + + char infourl[256]; + snprintf(infourl, sizeof(infourl), "https://neocities.org/api/info?sitename=%s", user); + + curl_easy_setopt(curl, CURLOPT_URL, infourl); + curl_easy_setopt(curl, CURLOPT_USERPWD, auth); + + struct response resp = { .data = malloc(1), .len = 0 }; + resp.data[0] = '\0'; + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resp); + + CURLcode res = curl_easy_perform(curl); + if (res != CURLE_OK) { + fprintf(stderr, "Erro na requisição: %s\n", curl_easy_strerror(res)); + curl_easy_cleanup(curl); + free(resp.data); + return 1; + } + curl_easy_cleanup(curl); + + json_error_t error; + json_t *obj = json_loads(resp.data, 0, &error); + free(resp.data); + + if (!obj) { + fprintf(stderr, "Erro ao parsear JSON: %s\n", error.text); + return 1; + } + + json_t *result_obj = json_object_get(obj, "result"); + const char *result_str = json_string_value(result_obj); + + if (strcmp(result_str, "error") == 0) { + const char *err_type = json_string_value(json_object_get(obj, "error_type")); + const char *err_msg = json_string_value(json_object_get(obj, "message")); + + if (strcmp(err_type, "invalid_auth") == 0) { + printf("Usuário ou senha incorretos!\n"); + } else { + printf("Erro! %s\n", err_msg); + } + json_decref(obj); + return 1; + } + + if (strcmp(result_str, "success") == 0) { + json_t *info_obj = json_object_get(obj, "info"); + printf("\nSitename: %s\n", json_string_value(json_object_get(info_obj, "sitename"))); + printf("Hits: %d\n", (int)json_integer_value(json_object_get(info_obj, "hits"))); + printf("Created at: %s\n", json_string_value(json_object_get(info_obj, "created_at"))); + printf("Last updated: %s\n", json_string_value(json_object_get(info_obj, "last_updated"))); + printf("Domain: %s\n", json_string_value(json_object_get(info_obj, "domain"))); + + json_t *tags = json_object_get(info_obj, "tags"); + printf("Tags: "); + size_t index; + json_t *tag; + json_array_foreach(tags, index, tag) { + printf("#%s%s", json_string_value(tag), (index < json_array_size(tags) - 1) ? ", " : "."); + } + printf("\n\n"); + } + + json_decref(obj); + return 0; +} \ No newline at end of file diff --git a/src/info.h b/src/info.h new file mode 100644 index 0000000..4096c3f --- /dev/null +++ b/src/info.h @@ -0,0 +1,6 @@ +#ifndef INFO +#define INFO + +int fetch_neocities_info(void); + +#endif \ No newline at end of file diff --git a/src/login.sh b/src/login.sh new file mode 100644 index 0000000..e69de29 diff --git a/src/main.c b/src/main.c old mode 100644 new mode 100755 index 93f28c8..685086a --- a/src/main.c +++ b/src/main.c @@ -4,6 +4,9 @@ #include #include +#include "main.h" +#include "info.h" + struct response { char *data; size_t len; @@ -25,91 +28,6 @@ size_t write_callback(void *data, size_t size, size_t nmemb, void *userdata) { return chunk_size; } -int fetch_neocities_info() { - const char *user = getenv("NEOCITIES_USER"); - const char *pass = getenv("NEOCITIES_PASS"); - if (!user || !pass) { - fprintf(stderr, "Variáveis NEOCITIES_USER ou NEOCITIES_PASS não definidas!\n"); - return 1; - } - - char auth[256]; - snprintf(auth, sizeof(auth), "%s:%s", user, pass); - - CURL *curl = curl_easy_init(); - if (!curl) { - fprintf(stderr, "Erro ao inicializar cURL\n"); - return 1; - } - - char infourl[256]; - snprintf(infourl, sizeof(infourl), "https://neocities.org/api/info?sitename=%s", user); - - curl_easy_setopt(curl, CURLOPT_URL, infourl); - curl_easy_setopt(curl, CURLOPT_USERPWD, auth); - - struct response resp = { .data = malloc(1), .len = 0 }; - resp.data[0] = '\0'; - - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resp); - - CURLcode res = curl_easy_perform(curl); - if (res != CURLE_OK) { - fprintf(stderr, "Erro na requisição: %s\n", curl_easy_strerror(res)); - curl_easy_cleanup(curl); - free(resp.data); - return 1; - } - curl_easy_cleanup(curl); - - json_error_t error; - json_t *obj = json_loads(resp.data, 0, &error); - free(resp.data); - - if (!obj) { - fprintf(stderr, "Erro ao parsear JSON: %s\n", error.text); - return 1; - } - - json_t *result_obj = json_object_get(obj, "result"); - const char *result_str = json_string_value(result_obj); - - if (strcmp(result_str, "error") == 0) { - const char *err_type = json_string_value(json_object_get(obj, "error_type")); - const char *err_msg = json_string_value(json_object_get(obj, "message")); - - if (strcmp(err_type, "invalid_auth") == 0) { - printf("Usuário ou senha incorretos!\n"); - } else { - printf("Erro! %s\n", err_msg); - } - json_decref(obj); - return 1; - } - - if (strcmp(result_str, "success") == 0) { - json_t *info_obj = json_object_get(obj, "info"); - printf("\nSitename: %s\n", json_string_value(json_object_get(info_obj, "sitename"))); - printf("Hits: %d\n", (int)json_integer_value(json_object_get(info_obj, "hits"))); - printf("Created at: %s\n", json_string_value(json_object_get(info_obj, "created_at"))); - printf("Last updated: %s\n", json_string_value(json_object_get(info_obj, "last_updated"))); - printf("Domain: %s\n", json_string_value(json_object_get(info_obj, "domain"))); - - json_t *tags = json_object_get(info_obj, "tags"); - printf("Tags: "); - size_t index; - json_t *tag; - json_array_foreach(tags, index, tag) { - printf("#%s%s", json_string_value(tag), (index < json_array_size(tags) - 1) ? ", " : "."); - } - printf("\n\n"); - } - - json_decref(obj); - return 0; -} - int main(int argc, char *argv[]) { printf("\nNeocities C CLI\n"); diff --git a/src/main.h b/src/main.h new file mode 100644 index 0000000..1f34f56 --- /dev/null +++ b/src/main.h @@ -0,0 +1,7 @@ +#ifndef MAIN_H +#define MAIN_H + +extern const char *user; +extern const char *pass; + +#endif