// readline.h doesn't include stdio.h // This bug is older than me))) #include "client.h" #include #include #include #include "term.h" static const str greeting_art = STR( " ^,,^ ╱|\n" " ( •·•) Meum! (o.o`7\n" " / ` | Meum... |`˜ \\\n" "\\(_,J J L l`,)/\n" ); static const str farewell_art = STR( " ^,,^ ╱|\n" " ( -.-) (>,<`7\n" " / ` | Goodbye! |`˜ \\\n" "\\(_,J J L l`,)/\n" ); static ClientCredential* _client_credential = NULL; static ServerConnection* _server_connection = NULL; static Result(void) commandExec(str command, bool* stop); static Result(void) askUserNameAndPassword(ClientCredential** cred){ Deferral(8); printf("username: "); char username[1024]; fgets(username, sizeof(username), stdin); printf("password: "); char password[1024]; // TODO: hide password fgets(password, sizeof(password), stdin); try(*cred, p, ClientCredential_create(str_from_cstr(username), str_from_cstr(password))); Return RESULT_VOID; } Result(void) client_run() { Deferral(32); if(!term_init()){ Return RESULT_ERROR("can't init terminal", false); } using_history(); fputs(greeting_art.data, stdout); try_void(askUserNameAndPassword(&_client_credential)); char* command_input_prev = NULL; char* command_input_raw = NULL; Defer(rl_free(command_input_prev)); str command_input = str_null; bool stop = false; while((command_input_raw = readline("> ")) && !stop){ rl_free(command_input_prev); command_input_prev = command_input_raw; command_input = str_from_cstr(command_input_raw); str_trim(&command_input, true); if(command_input.size == 0) continue; add_history(command_input.data); Result(void) com_result = commandExec(command_input, &stop); if(com_result.error){ str e_str = Error_toStr(com_result.error); printfe("%s\n", e_str.data); free(e_str.data); Error_free(com_result.error); } } ClientCredential_free(_client_credential); ServerConnection_close(_server_connection); Return RESULT_VOID; } #define is_alias(LITERAL) str_equals(command, STR(LITERAL)) static Result(void) commandExec(str command, bool* stop){ Deferral(64); char answer_buf[512]; const u32 answer_buf_size = sizeof(answer_buf); if(is_alias("q") || is_alias("quit") || is_alias("exit")){ fputs(farewell_art.data, stdout); *stop = true; } else if(is_alias("clear")){ term_clear(); } else if(is_alias("h") || is_alias("help")){ puts( "COMMANDS:\n" "q, quit, exit Close the program.\n" "clear Clear the screen.\n" "j, join Join a server.\n" "c, connect Connect to a server you joined.\n" ); } else if (is_alias("j") || is_alias("join")){ ServerConnection_close(_server_connection); puts("Enter server address (ip:port): "); fgets(answer_buf, answer_buf_size, stdin); str new_server_link = str_from_cstr(answer_buf); str_trim(&new_server_link, true); printf("connecting to server %s\n", new_server_link.data); try(_server_connection, p, ServerConnection_open(_client_credential, new_server_link.data)); // TODO: request server info // show server info // save server info to user's db // request log in // if not registered, request registration and then log in } else if(is_alias("c") || is_alias("connect")){ // TODO: read saved servers from database } else { Return RESULT_ERROR_FMT("unknown kommand: '%s'\n" "Use 'h' to see list of avaliable commands\n", command.data); } Return RESULT_VOID; }