]> git.cworth.org Git - ttt/blobdiff - src/ttt-client.c
2005-12-05 Richard D. Worth <richard@theworths.org>
[ttt] / src / ttt-client.c
index 1dd755f83651e3d7c6f80f176e0befa05f8af8dc..9d88380640bd096bc950c0965a2f78f467753086 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,
@@ -79,6 +84,16 @@ _ttt_client_execute_quit (ttt_client_t *client,
                          char         **args,
                          int          num_args);
 
+static ttt_error_t
+_ttt_client_execute_invite (ttt_client_t *client,
+                           char         **args,
+                           int          num_args);
+
+static ttt_error_t
+_ttt_client_execute_accept (ttt_client_t *client,
+                           char         **args,
+                           int          num_args);
+
 typedef struct _ttt_command_description {
     const char         *command;
     int                args_min;
@@ -95,9 +110,18 @@ ttt_command_description_t command_descriptions[] = {
     {"HELP",    0, 1, _ttt_client_execute_help,
      "HELP <command>          ", "Display help for a command."},
 
+    {"INVITE",  1, 1, _ttt_client_execute_invite,
+     "INVITE <username>       ", "Invite a player to play a game."},
+
+    {"ACCEPT",  1, 1, _ttt_client_execute_accept,
+     "ACCEPT <username>       ", "Accept a game invitation."},
+
     {"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 +145,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 +153,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 +188,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 +232,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);
 
@@ -193,8 +244,8 @@ _ttt_client_execute_message (ttt_client_t  *client,
 
 static ttt_error_t
 _ttt_client_execute_help (ttt_client_t  *client,
-                         char     **args,
-                         int      num_args)
+                         char          **args,
+                         int           num_args)
 {
     char *response;
     char *command;
@@ -250,13 +301,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;
 
-    xasprintf (&response, "VERSION 1\r\n");
+    version = atoi (clientversion);
+
+    if (version < 1)
+       return TTT_ERROR_SYNTAX;
+
+    if (version > TTT_SERVER_PROTOCOL_VERSION)
+       version = TTT_SERVER_PROTOCOL_VERSION;
+
+    xasprintf (&response, "VERSION %d\r\n", version);
     ttt_client_send (client, response);
 
     free (response);
@@ -276,7 +342,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);
@@ -284,6 +350,78 @@ _ttt_client_execute_quit (ttt_client_t *client,
     return TTT_ERROR_QUIT_REQUESTED;
 }
 
+static ttt_error_t
+_ttt_client_execute_invite (ttt_client_t *client,
+                           char         **args,
+                           int          num_args)
+{
+    const char *username;
+    char *response;
+    char *notice;
+    ttt_error_t error;
+
+    assert (num_args == 1);
+
+    username = args[0];
+
+    if (!client->registered)
+        return TTT_ERROR_NO_NAME_SET;
+
+    error = ttt_server_verify_username (client->server,        username);
+    if (error)
+       return error;
+
+    xasprintf (&response, "INVITE\r\n");
+    ttt_client_send (client, response);
+
+    xasprintf (&notice, "NOTICE INVITE %s %s\r\n",
+              client->username,
+              username);
+    ttt_server_broadcast (client->server, notice);
+
+    free (notice);
+    free (response);
+
+    return TTT_ERROR_NONE;
+}
+
+static ttt_error_t
+_ttt_client_execute_accept (ttt_client_t *client,
+                           char         **args,
+                           int          num_args)
+{
+    const char *username;
+    char *response;
+    char *notice;
+    ttt_error_t error;
+
+    assert (num_args == 1);
+
+    username = args[0];
+
+    if (!client->registered)
+        return TTT_ERROR_NO_NAME_SET;
+
+    error = ttt_server_verify_username (client->server,        username);
+    if (error)
+       return error;
+
+    xasprintf (&response, "ACCEPT\r\n");
+    ttt_client_send (client, response);
+
+    xasprintf (&notice, "NOTICE ACCEPT %s %s\r\n",
+              client->username,
+              username);
+    ttt_server_broadcast (client->server, notice);
+
+    /* XXX: Start a new game */
+
+    free (notice);
+    free (response);
+
+    return TTT_ERROR_NONE;
+}
+
 static void
 _free_request (ttt_client_t *client);
 
@@ -306,7 +444,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 +457,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 +614,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. */