X-Git-Url: https://git.cworth.org/git?p=ttt;a=blobdiff_plain;f=src%2Fttt-client.c;h=c92c4ebe1cd8e174e772d29c1aa40ed23a52eabf;hp=1dd755f83651e3d7c6f80f176e0befa05f8af8dc;hb=47ff725ff3b109b94a23ea7c8c07c8b1417e31ef;hpb=f2187ebd49f78b84bd2dca6172abc81e54dda199 diff --git a/src/ttt-client.c b/src/ttt-client.c index 1dd755f..c92c4eb 100644 --- a/src/ttt-client.c +++ b/src/ttt-client.c @@ -40,7 +40,7 @@ struct _ttt_client { char **request_strings; int num_request_strings; - char *name; + char *username; ttt_bool_t registered; int num_wins; }; @@ -59,6 +59,11 @@ _ttt_client_execute_who (ttt_client_t *client, char **args, int num_args); +static ttt_error_t +_ttt_client_execute_statistics (ttt_client_t *client, + char **args, + int num_args); + static ttt_error_t _ttt_client_execute_message (ttt_client_t *client, char **args, @@ -98,6 +103,9 @@ ttt_command_description_t command_descriptions[] = { {"MESSAGE", 1, 1, _ttt_client_execute_message, "MESSAGE ", "Send a message to everyone."}, + {"STATISTICS", 1, 1, _ttt_client_execute_statistics, + "STATISTICS ", "Lists the statistics for the specified user."}, + {"QUIT", 0, 0, _ttt_client_execute_quit, "QUIT ", "Quit session."}, @@ -121,7 +129,7 @@ _ttt_client_execute_helo (ttt_client_t *client, assert (num_args == 1); - ttt_client_set_name (client, args[0]); + ttt_client_set_username (client, args[0]); error = ttt_server_register_client (client->server, client); if (error) @@ -129,13 +137,13 @@ _ttt_client_execute_helo (ttt_client_t *client, client->registered = TRUE; xasprintf (&response, "HELO %s %s %s\r\n", - client->name, + client->username, 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->name); + client->username); ttt_server_broadcast (client->server, notice); free (notice); @@ -164,6 +172,33 @@ _ttt_client_execute_who (ttt_client_t *client, return TTT_ERROR_NONE; } +static ttt_error_t +_ttt_client_execute_statistics (ttt_client_t *client, + char **args, + int num_args) +{ + char *response; + char *username; + ttt_error_t error; + + assert (num_args == 1); + + username = args[0]; + + if (!client->registered) + return TTT_ERROR_NO_NAME_SET; + + error = ttt_server_statistics (client->server, username, &response); + if (error) + return error; + + ttt_client_send (client, response); + + free (response); + + return TTT_ERROR_NONE; +} + static ttt_error_t _ttt_client_execute_message (ttt_client_t *client, char **args, @@ -181,7 +216,7 @@ _ttt_client_execute_message (ttt_client_t *client, ttt_client_send (client, response); xasprintf (¬ice, "NOTICE MESSAGE %s \"%s\"\r\n", - client->name, + client->username, args[0]); ttt_server_broadcast (client->server, notice); @@ -250,13 +285,28 @@ _ttt_client_execute_version (ttt_client_t *client, int num_args) { char *response; + char *clientversion; + int version; + int i; assert (num_args == 1); - /* XXX: Argument is being ignored. - This is not completely implemented. */ + clientversion = args[0]; + + /* Verify that provided version arg is a positive integer */ + for (i = 0; i < strlen(clientversion); i++) + if (!isdigit (clientversion[i])) + return TTT_ERROR_SYNTAX; + + version = atoi (clientversion); + + if (version < 1) + return TTT_ERROR_SYNTAX; + + if (version > TTT_SERVER_PROTOCOL_VERSION) + version = TTT_SERVER_PROTOCOL_VERSION; - xasprintf (&response, "VERSION 1\r\n"); + xasprintf (&response, "VERSION %d\r\n", version); ttt_client_send (client, response); free (response); @@ -276,7 +326,7 @@ _ttt_client_execute_quit (ttt_client_t *client, return TTT_ERROR_QUIT_REQUESTED; xasprintf (¬ice, "NOTICE QUIT %s\r\n", - client->name); + client->username); ttt_server_broadcast (client->server, notice); free (notice); @@ -306,7 +356,7 @@ _ttt_client_init (ttt_client_t *client, client->request_strings = NULL; client->num_request_strings = 0; - client->name = NULL; + client->username = NULL; client->registered = FALSE; client->num_wins = 0; } @@ -319,8 +369,8 @@ _ttt_client_fini (ttt_client_t *client) if (client->registered) ttt_server_unregister_client (client->server, client); - free (client->name); - client->name = NULL; + free (client->username); + client->username = NULL; yylex_destroy (client->scanner); shutdown (client->socket, SHUT_RDWR); @@ -476,17 +526,17 @@ ttt_client_send (ttt_client_t *client, const char *message) /* Exported: See ttt-client.h for documentation. */ const char* -ttt_client_get_name (ttt_client_t *client) +ttt_client_get_username (ttt_client_t *client) { - return client->name; + return client->username; } /* Exported: See ttt-client.h for documentation. */ void -ttt_client_set_name (ttt_client_t *client, const char *name) +ttt_client_set_username (ttt_client_t *client, const char *username) { - free (client->name); - client->name = xstrdup (name); + free (client->username); + client->username = xstrdup (username); } /* Exported: See ttt-client.h for documentation. */