]> git.cworth.org Git - ttt/blobdiff - src/ttt-client.c
2005-12-10 Richard D. Worth <richard@theworths.org>
[ttt] / src / ttt-client.c
index e68f70ca5cbde835021b053814eec7098ec22ff4..c198d3a15cfdb6779bbeea9f40b2ea7ddcfe3dae 100644 (file)
@@ -127,10 +127,10 @@ ttt_command_description_t command_descriptions[] = {
      "ACCEPT <username>       ", "Accept a game invitation."},
 
     {"RETRACT", 1, 1, _ttt_client_execute_retract,
-     "RETRACT <username>       ", "Retract a game invitation."},
+     "RETRACT <username>      ", "Retract a game invitation."},
 
     {"DECLINE", 1, 1, _ttt_client_execute_decline,
-     "DECLINE <username>       ", "Decline a game invitation."},
+     "DECLINE <username>      ", "Decline a game invitation."},
 
     {"MESSAGE", 1, 1, _ttt_client_execute_message,
      "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 (&notice, "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 (&notice, "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 (&notice, "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 (&notice, "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 (&notice, "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 (&notice, "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 (&notice, "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 (&notice, "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;