]> git.cworth.org Git - ttt/blobdiff - src/ttt-client.c
2005-12-03 Richard D. Worth <richard@theworths.org>
[ttt] / src / ttt-client.c
index 1dd755f83651e3d7c6f80f176e0befa05f8af8dc..c92c4ebe1cd8e174e772d29c1aa40ed23a52eabf 100644 (file)
@@ -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 <message>       ", "Send a message to everyone."},
 
+    {"STATISTICS", 1, 1, _ttt_client_execute_statistics,
+     "STATISTICS <username>   ", "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 (&notice, "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 (&notice, "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 (&notice, "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. */