From e5709bb34052b422f315ece9dc17ef1f7c3624ee Mon Sep 17 00:00:00 2001 From: synt-xerror <169557594+synt-xerror@users.noreply.github.com> Date: Fri, 20 Feb 2026 21:31:39 -0300 Subject: [PATCH] Making structure and testing possibilities --- neogities | Bin 0 -> 29088 bytes neogities.c | 287 +++++++++++++++++++++++++++++++++++----------------- 2 files changed, 192 insertions(+), 95 deletions(-) create mode 100755 neogities diff --git a/neogities b/neogities new file mode 100755 index 0000000000000000000000000000000000000000..0cc72d539efebd041170adfac2177f24e81e71cd GIT binary patch literal 29088 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 Ss_cp*oZuJING*aUvi}8F9-IIG literal 0 HcmV?d00001 diff --git a/neogities.c b/neogities.c index a26a87b..4e16f7d 100644 --- a/neogities.c +++ b/neogities.c @@ -7,8 +7,18 @@ #include #include +#include +#include +#include +#include + +#include + +#include +#include + // ------------------------- -// HTTP responde buffer +// HTTP response buffer // ------------------------- struct response { char *data; @@ -103,36 +113,12 @@ static int perform_request( return 0; } -// ------------------------- -// JSON parsers -// ------------------------- -void neocities_free_info( - neocities_info_t *info -) -{ - if (!info) return; - free(info->sitename); - free(info->created_at); - free(info->last_updated); - free(info->domain); - for (size_t i=0; itag_count; i++) free(info->tags[i]); - free(info->tags); -} - -void neocities_free_filelist( - neocities_filelist_t *list -) -{ - if (!list) return; - for (size_t i=0; icount; i++) free(list->paths[i]); - free(list->paths); -} - // ------------------------- // info — GET /api/info // ------------------------- int neocities_info( - const char *sitename, neocities_info_t *out + const char *sitename, + char** out ) { char url[512]; @@ -145,49 +131,9 @@ int neocities_info( int ret = perform_request(url, NULL, NULL, &resp, NULL); if (ret) return ret; - json_error_t error; - json_t *root = json_loads(resp.data, 0, &error); - free(resp.data); - if (!root) return 3; - - const char *result = json_string_value(json_object_get(root,"result")); - if (!result || strcmp(result,"success")!=0) { json_decref(root); return 4; } - - json_t *info = json_object_get(root,"info"); - if (!json_is_object(info)) { - json_decref(root); - return 4; - } - - json_t *j_sitename = json_object_get(info,"sitename"); - json_t *j_created = json_object_get(info,"created_at"); - json_t *j_updated = json_object_get(info,"last_updated"); - json_t *j_domain = json_object_get(info,"domain"); - json_t *j_hits = json_object_get(info,"hits"); - - out->sitename = json_is_string(j_sitename) ? strdup(json_string_value(j_sitename)) : NULL; - out->created_at = json_is_string(j_created) ? strdup(json_string_value(j_created)) : NULL; - out->last_updated = json_is_string(j_updated) ? strdup(json_string_value(j_updated)) : NULL; - out->domain = json_is_string(j_domain) ? strdup(json_string_value(j_domain)) : NULL; - out->hits = json_is_integer(j_hits) ? json_integer_value(j_hits) : 0; - - json_t *tags = json_object_get(info,"tags"); - if (!json_is_array(tags)) { - out->tags = NULL; - out->tag_count = 0; - } else { - size_t tc = json_array_size(tags); - out->tags = malloc(sizeof(char*) * tc); - out->tag_count = tc; - - for (size_t i=0; itags[i] = json_is_string(tag) ? strdup(json_string_value(tag)) : NULL; - } - } - - json_decref(root); - return 0; + *out = resp.data; + + return 0; } // ------------------------- @@ -195,7 +141,8 @@ int neocities_info( // ------------------------- int neocities_list( const char *api_key, - const char *path, neocities_filelist_t *out + const char *path, + char **out ) { char url[512]; @@ -206,23 +153,8 @@ int neocities_list( int ret = perform_request(url, api_key, NULL, &resp, NULL); if (ret) return ret; - json_error_t error; - json_t *root = json_loads(resp.data, 0, &error); - free(resp.data); - if (!root) return 3; - - json_t *arr = json_object_get(root, "files"); - if (!arr) { json_decref(root); return 4; } - - size_t count = json_array_size(arr); - out->paths = malloc(sizeof(char*) * count); - out->count = count; - for (size_t i=0; ipaths[i] = strdup(json_string_value(json_object_get(f,"path"))); - } - json_decref(root); - return 0; + *out = resp.data; + return 0; } // ------------------------- @@ -317,19 +249,168 @@ int neocities_upload( return 0; } +char* home() +{ + struct passwd *u; + u = getpwuid(getuid()); + + if (!u) { + perror("invalid return of getpwuid() function.\n"); + return NULL; + } + + return u->pw_dir; +} + +// DIR_NAME deve ser o nome do diretório, não o caminho (ex: task) +// Se HOME = NULL, a função assume que a pasta que quer está fora da pasta /home/usuário + +// Importante: essa função retorna um char*. Para abrir o diretório retornado, você deve usar +// a função opendir() com o valor retornado de get_dir() +char* get_dir(const char* HOME, const char* DIR_NAME) { + if (DIR_NAME[0] == '~') { + perror("get_dir doesn't expand '~'"); + return NULL; + } + if (DIR_NAME[0] == '/') { + perror("DIR_NAME can't begin with '/'"); + return NULL; + } + + const char *prefix = HOME ? HOME : ""; + + int size = strlen(prefix) + 1 + strlen(DIR_NAME) + 1; + char *DIR_FINAL = malloc(size); + if (!DIR_FINAL) { + perror("malloc failed"); + return NULL; + } + + sprintf(DIR_FINAL, "%s/%s", prefix, DIR_NAME); + + DIR *dir = opendir(DIR_FINAL); + if (!dir) { + if (mkdir(DIR_FINAL, 0755) != 0) { + fprintf(stderr, "'%s' cannot be created\n", DIR_FINAL); + free(DIR_FINAL); + return NULL; + } + } else { + closedir(dir); + } + + return DIR_FINAL; +} + +char* get_file(const char* ROOT, const char* FILE_NAME) { + char* FINAL_FILE; + + FINAL_FILE = malloc(strlen(ROOT) + strlen(FILE_NAME) + 1); + sprintf(FINAL_FILE, "%s/%s", ROOT, FILE_NAME); + + return FINAL_FILE; +} + +struct termios orig_termios; + +void disable_raw_mode() { tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios); } +void enable_raw_mode() { + tcgetattr(STDIN_FILENO, &orig_termios); + atexit(disable_raw_mode); + struct termios raw = orig_termios; + raw.c_lflag &= ~(ECHO | ICANON); + raw.c_cc[VMIN] = 0; raw.c_cc[VTIME] = 1; + tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw); +} + +int read_key() { + char c; int n = read(STDIN_FILENO, &c, 1); + if (n == 1) { + if (c == '\033') { + char seq[2]; + if (read(STDIN_FILENO, &seq[0], 1) != 1) return '\033'; + if (read(STDIN_FILENO, &seq[1], 1) != 1) return '\033'; + if (seq[0] == '[') { + switch(seq[1]) { + case 'A': return 1000; // cima + case 'B': return 1001; // baixo + } + } + return 0; + } + return c; + } + return 0; +} + +int menu(char *titles[], int n_titles, char *options[], int n_options, char *footer, int circular) { + int selected = 0; + enable_raw_mode(); + + int total_lines = n_titles + n_options + (footer ? 1 : 0); + + while (1) { + // só imprime normalmente, abaixo do que já está + for (int i = 0; i < n_titles; i++) printf("%s\n", titles[i]); + for (int i = 0; i < n_options; i++) { + if (i == selected) printf("> %s\n", options[i]); + else printf(" %s\n", options[i]); + } + if (footer) printf("%s\n", footer); + + int key = read_key(); + if (key == 1000) { selected--; if (circular && selected < 0) selected = n_options - 1; if (!circular && selected < 0) selected = 0; } + else if (key == 1001) { selected++; if (circular && selected >= n_options) selected = 0; if (!circular && selected >= n_options) selected = n_options - 1; } + else if (key == '\n') break; + else if (key == 27) { selected = -1; break; } + + // depois de desenhar, sobe o cursor e apaga menu antigo + for (int i = 0; i < total_lines; i++) { + printf("\033[1A\033[2K"); // sobe 1 linha e limpa + } + } + + // move cursor pro topo do menu antigo + printf("\033[%dA", total_lines); + + // limpa cada linha + for (int i = 0; i < total_lines; i++) { + printf("\033[2K"); // limpa a linha + if (i != total_lines-1) printf("\033[1B"); // desce linha + } + + // volta cursor pro topo do menu + printf("\033[%dA", total_lines-1); + + disable_raw_mode(); + return selected; +} + +const char* DATA_DIR = ".local/share/neogities"; +const char* CONFIG_DIR = ".config/neogities"; + +const char* CONFIG_FILE = "neogities.conf"; +const char* ACCESS_FILE = "credentials"; + int main() { static const char* version = "v0.1.0"; - + + const char* DEF_DATA_DIR = get_dir(home(), DATA_DIR); + const char* DEF_CONFIG_DIR = get_dir(home(), DATA_DIR); + + const char* DEF_CONFIG_FILE = get_file(DEF_CONFIG_DIR, CONFIG_FILE); + const char* DEF_ACCESS_FILE = get_file(DEF_DATA_DIR, ACCESS_FILE); + srand(time(NULL) ^ getpid()); - int n = rand() % 2; - int y = rand() % 2; + int a = rand() % 2; + int b = rand() % 2; static const char* eyes[] = { "-_o", "o_o" }; static const char* mouths[] = { "-", "~" }; - const char* eye = eyes[n]; - const char* mouth = mouths[y]; + const char* eye = eyes[a]; + const char* mouth = mouths[b]; static const char *logo = "|\\---/|---------------o\n" @@ -337,8 +418,24 @@ int main() { " \\_%s_/ %s / o\n" " o\n"; + printf("Hello! You're not logged in.\n\n"); printf(logo, eye, mouth, version); - return 0; -} + /* char *titles[] = {"Meu Menu"}; + char *options[] = {"Opção 1", "Opção 2", "Opção 3"}; + char *footer = "Use setas ↑↓ e Enter para selecionar. ESC para sair."; + int choice = menu(titles, 1, options, 3, footer, 1); + printf("Selecionou: %d\n", choice); */ + + /* char *input = readline("Nome: "); // mostra prompt e permite editar + if (input != NULL) { + printf("Você digitou: %s\n", input); + } + + free(input); */ + free((char*)DEF_DATA_DIR); + free((char*)DEF_CONFIG_DIR); + free((char*)DEF_CONFIG_FILE); + free((char*)DEF_ACCESS_FILE); +}