X-Git-Url: https://git.cworth.org/git?p=ttt;a=blobdiff_plain;f=src%2Fttt-client.c;h=c198d3a15cfdb6779bbeea9f40b2ea7ddcfe3dae;hp=e68f70ca5cbde835021b053814eec7098ec22ff4;hb=df6ad6c8658a9f3a537a070a89a067c5ae598fcc;hpb=da40516db47b4c719aaad66a05302f13d1b6358e diff --git a/src/ttt-client.c b/src/ttt-client.c index e68f70c..c198d3a 100644 --- a/src/ttt-client.c +++ b/src/ttt-client.c @@ -127,10 +127,10 @@ ttt_command_description_t command_descriptions[] = { "ACCEPT ", "Accept a game invitation."}, {"RETRACT", 1, 1, _ttt_client_execute_retract, - "RETRACT ", "Retract a game invitation."}, + "RETRACT ", "Retract a game invitation."}, {"DECLINE", 1, 1, _ttt_client_execute_decline, - "DECLINE ", "Decline a game invitation."}, + "DECLINE ", "Decline a game invitation."}, {"MESSAGE", 1, 1, _ttt_client_execute_message, "MESSAGE ", "Send a message to everyone."}, @@ -155,30 +155,34 @@ _ttt_client_execute_helo (ttt_client_t *client, char **args, int num_args) { + char *response; + char *notice; ttt_error_t error; - char *response; - char *notice; assert (num_args == 1); - ttt_client_set_username (client, args[0]); + if (!(client->registered)) + { + ttt_client_set_username (client, args[0]); - error = ttt_server_register_client (client->server, client); - if (error) - return error; - client->registered = TRUE; + error = ttt_server_register_client (client->server, client); + if (error) + return error; + client->registered = TRUE; + + xasprintf (¬ice, "NOTICE USER %s\r\n", + ttt_client_get_username (client)); + ttt_server_broadcast (client->server, notice); + + free (notice); + } xasprintf (&response, "HELO %s %s %s\r\n", - client->username, + ttt_client_get_username (client), ttt_server_get_host (client->server), ttt_server_get_port (client->server)); ttt_client_send (client, response); - xasprintf (¬ice, "NOTICE USER %s\r\n", - client->username); - ttt_server_broadcast (client->server, notice); - - free (notice); free (response); return TTT_ERROR_NONE; @@ -209,21 +213,30 @@ _ttt_client_execute_statistics (ttt_client_t *client, char **args, int num_args) { - char *response; - char *username; - ttt_error_t error; + const char *argusername; + ttt_client_t *argclient; + char *response; + ttt_error_t error; assert (num_args == 1); - username = args[0]; + argusername = args[0]; if (!client->registered) return TTT_ERROR_NO_NAME_SET; - error = ttt_server_statistics (client->server, username, &response); + error = ttt_server_get_client_from_username (client->server, + argusername, + &argclient); if (error) return error; + xasprintf (&response, "STATISTICS %s \"\r\n" + "TICTACTOE WINS %d\r\n" + "\"\r\n", + ttt_client_get_username(argclient), + ttt_client_get_num_wins(argclient)); + ttt_client_send (client, response); free (response); @@ -236,11 +249,14 @@ _ttt_client_execute_message (ttt_client_t *client, char **args, int num_args) { - char *response; - char *notice; + const char *argmessage; + char *response; + char *notice; assert (num_args == 1); + argmessage = args[0]; + if (!client->registered) return TTT_ERROR_NO_NAME_SET; @@ -248,8 +264,8 @@ _ttt_client_execute_message (ttt_client_t *client, ttt_client_send (client, response); xasprintf (¬ice, "NOTICE MESSAGE %s \"%s\"\r\n", - client->username, - args[0]); + ttt_client_get_username(client), + argmessage); ttt_server_broadcast (client->server, notice); free (notice); @@ -263,11 +279,11 @@ _ttt_client_execute_help (ttt_client_t *client, char **args, int num_args) { - char *response; - char *command; + char *response; + char *argcommand; ttt_command_description_t *desc; + ttt_bool_t is_command = FALSE; int i; - ttt_bool_t is_command = FALSE; if (num_args == 0) { xasprintf (&response, "HELP \"\r\n" @@ -281,12 +297,10 @@ _ttt_client_execute_help (ttt_client_t *client, } xasprintf (&response, "%s\"\r\n", response); } else { - command = args[0]; - for (i = 0; i < strlen (command); i++) - command[i] = toupper (command[i]); + argcommand = args[0]; for (i = 0; i < ARRAY_SIZE(command_descriptions); i++) { desc = &command_descriptions[i]; - if (strcmp (desc->command, command) == 0) { + if (strcasecmp (desc->command, argcommand) == 0) { is_command = TRUE; xasprintf (&response, "HELP %s \"\r\n" "%s\r\n" @@ -317,20 +331,20 @@ _ttt_client_execute_version (ttt_client_t *client, int num_args) { char *response; - char *clientversion; - int version; + char *argversion; + int version; int i; assert (num_args == 1); - clientversion = args[0]; + argversion = args[0]; /* Verify that provided version arg is a positive integer */ - for (i = 0; i < strlen(clientversion); i++) - if (!isdigit (clientversion[i])) + for (i = 0; i < strlen(argversion); i++) + if (!isdigit (argversion[i])) return TTT_ERROR_SYNTAX; - version = atoi (clientversion); + version = atoi (argversion); if (version < 1) return TTT_ERROR_SYNTAX; @@ -338,7 +352,8 @@ _ttt_client_execute_version (ttt_client_t *client, if (version > TTT_SERVER_PROTOCOL_VERSION) version = TTT_SERVER_PROTOCOL_VERSION; - xasprintf (&response, "VERSION %d\r\n", version); + xasprintf (&response, "VERSION %d\r\n", + version); ttt_client_send (client, response); free (response); @@ -358,7 +373,7 @@ _ttt_client_execute_quit (ttt_client_t *client, return TTT_ERROR_QUIT_REQUESTED; xasprintf (¬ice, "NOTICE QUIT %s\r\n", - client->username); + ttt_client_get_username(client)); ttt_server_broadcast (client->server, notice); free (notice); @@ -371,32 +386,37 @@ _ttt_client_execute_invite (ttt_client_t *client, char **args, int num_args) { - const char *username; - char *response; - char *notice; - ttt_error_t error; + const char *invitee_username; + ttt_client_t *invitee; + char *response; + char *notice; + ttt_error_t error; assert (num_args == 1); - username = args[0]; + invitee_username = args[0]; if (!client->registered) return TTT_ERROR_NO_NAME_SET; - error = ttt_server_verify_username (client->server, username); + error = ttt_server_get_client_from_username (client->server, + invitee_username, + &invitee); if (error) return error; + ttt_server_add_invite (client->server, + client, + invitee); + xasprintf (&response, "INVITE\r\n"); ttt_client_send (client, response); xasprintf (¬ice, "NOTICE INVITE %s %s\r\n", - client->username, - username); + ttt_client_get_username(client), + ttt_client_get_username(invitee)); ttt_server_broadcast (client->server, notice); - /* XXX: Store invitation in state */ - free (notice); free (response); @@ -408,30 +428,37 @@ _ttt_client_execute_accept (ttt_client_t *client, char **args, int num_args) { - const char *username; - char *response; - char *notice; - ttt_error_t error; + const char *actor_username; + ttt_client_t *actor; + char *response; + char *notice; + ttt_error_t error; assert (num_args == 1); - username = args[0]; + actor_username = args[0]; if (!client->registered) return TTT_ERROR_NO_NAME_SET; - error = ttt_server_verify_username (client->server, username); + error = ttt_server_get_client_from_username (client->server, + actor_username, + &actor); if (error) return error; - /* XXX: Verify invitation, else return ERROR NO_INVITE */ + error = ttt_server_remove_invite (client->server, + actor, + client); + if (error) + return error; xasprintf (&response, "ACCEPT\r\n"); ttt_client_send (client, response); xasprintf (¬ice, "NOTICE ACCEPT %s %s\r\n", - client->username, - username); + ttt_client_get_username(client), + ttt_client_get_username(actor)); ttt_server_broadcast (client->server, notice); /* XXX: Start a new game */ @@ -447,34 +474,39 @@ _ttt_client_execute_retract (ttt_client_t *client, char **args, int num_args) { - const char *username; - char *response; - char *notice; - ttt_error_t error; + const char *invitee_username; + ttt_client_t *invitee; + char *response; + char *notice; + ttt_error_t error; assert (num_args == 1); - username = args[0]; + invitee_username = args[0]; if (!client->registered) return TTT_ERROR_NO_NAME_SET; - error = ttt_server_verify_username (client->server, username); + error = ttt_server_get_client_from_username (client->server, + invitee_username, + &invitee); if (error) return error; - /* XXX: Verify invitation, else return ERROR NO_INVITE */ - + error = ttt_server_remove_invite (client->server, + client, + invitee); + if (error) + return error; + xasprintf (&response, "RETRACT\r\n"); ttt_client_send (client, response); xasprintf (¬ice, "NOTICE RETRACT %s %s\r\n", - client->username, - username); + ttt_client_get_username(client), + ttt_client_get_username(invitee)); ttt_server_broadcast (client->server, notice); - /* XXX: Remove invitiation from state */ - free (notice); free (response); @@ -486,34 +518,39 @@ _ttt_client_execute_decline (ttt_client_t *client, char **args, int num_args) { - const char *username; - char *response; - char *notice; - ttt_error_t error; + const char *actor_username; + ttt_client_t *actor; + char *response; + char *notice; + ttt_error_t error; assert (num_args == 1); - username = args[0]; + actor_username = args[0]; if (!client->registered) return TTT_ERROR_NO_NAME_SET; - error = ttt_server_verify_username (client->server, username); + error = ttt_server_get_client_from_username (client->server, + actor_username, + &actor); if (error) return error; - /* XXX: Verify invitation, else return ERROR NO_INVITE */ + error = ttt_server_remove_invite (client->server, + actor, + client); + if (error) + return error; xasprintf (&response, "DECLINE\r\n"); ttt_client_send (client, response); xasprintf (¬ice, "NOTICE DECLINE %s %s\r\n", - client->username, - username); + ttt_client_get_username(client), + ttt_client_get_username(actor)); ttt_server_broadcast (client->server, notice); - /* XXX: Remove invitation from state */ - free (notice); free (response); @@ -598,7 +635,7 @@ _free_request (ttt_client_t *client) static ttt_status_t _read_request (ttt_client_t *client) { - ttt_token_t token; + ttt_token_t token; ttt_token_type_t token_type; _free_request (client); @@ -627,11 +664,10 @@ _read_request (ttt_client_t *client) static ttt_error_t _execute_request (ttt_client_t *client) { - int i; - - char *command = client->request_strings[0]; - int num_args = client->num_request_strings-1; + char *command = client->request_strings[0]; + int num_args = client->num_request_strings - 1; ttt_command_description_t *desc; + int i; for (i = 0; i < strlen (command); i++) command[i] = toupper (command[i]); @@ -654,11 +690,10 @@ static void * _handle_requests_thread (void *closure) { ttt_status_t status; - ttt_error_t error; ttt_client_t *client = closure; + ttt_error_t error; while (1) { - status = _read_request (client); if (status == TTT_STATUS_EOF) break;