]> git.cworth.org Git - ttt/blobdiff - src/ttt-client.c
2005-12-06 Richard D. Worth <richard@theworths.org>
[ttt] / src / ttt-client.c
index 9d88380640bd096bc950c0965a2f78f467753086..7797090a49b17d94d8467c9c0718c3b49bd78fcc 100644 (file)
@@ -46,8 +46,8 @@ struct _ttt_client {
 };
 
 typedef ttt_error_t (*ttt_command_func_t) (ttt_client_t *client,
-                                          char **args,
-                                          int num_args);
+                                          char         **args,
+                                          int          num_args);
 
 static ttt_error_t
 _ttt_client_execute_helo (ttt_client_t *client,
@@ -71,13 +71,13 @@ _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);
 
 static ttt_error_t
 _ttt_client_execute_version (ttt_client_t  *client,
-                            char          **args,
-                            int           num_args);
+                            char          **args,
+                            int           num_args);
 
 static ttt_error_t
 _ttt_client_execute_quit (ttt_client_t *client,
@@ -86,13 +86,23 @@ _ttt_client_execute_quit (ttt_client_t *client,
 
 static ttt_error_t
 _ttt_client_execute_invite (ttt_client_t *client,
-                           char         **args,
-                           int          num_args);
+                           char         **args,
+                           int          num_args);
 
 static ttt_error_t
 _ttt_client_execute_accept (ttt_client_t *client,
-                           char         **args,
-                           int          num_args);
+                           char         **args,
+                           int          num_args);
+
+static ttt_error_t
+_ttt_client_execute_retract (ttt_client_t *client,
+                            char         **args,
+                            int          num_args);
+
+static ttt_error_t
+_ttt_client_execute_decline (ttt_client_t *client,
+                            char         **args,
+                            int          num_args);
 
 typedef struct _ttt_command_description {
     const char         *command;
@@ -116,6 +126,12 @@ ttt_command_description_t command_descriptions[] = {
     {"ACCEPT",  1, 1, _ttt_client_execute_accept,
      "ACCEPT <username>       ", "Accept a game invitation."},
 
+    {"RETRACT", 1, 1, _ttt_client_execute_retract,
+     "RETRACT <username>       ", "Retract a game invitation."},
+
+    {"DECLINE", 1, 1, _ttt_client_execute_decline,
+     "DECLINE <username>       ", "Decline a game invitation."},
+
     {"MESSAGE", 1, 1, _ttt_client_execute_message,
      "MESSAGE <message>       ", "Send a message to everyone."},
 
@@ -217,8 +233,8 @@ _ttt_client_execute_statistics (ttt_client_t *client,
 
 static ttt_error_t
 _ttt_client_execute_message (ttt_client_t  *client,
-                            char          **args,
-                            int           num_args)
+                            char          **args,
+                            int           num_args)
 {
     char *response;
     char *notice;
@@ -244,8 +260,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;
@@ -297,8 +313,8 @@ _ttt_client_execute_help (ttt_client_t  *client,
 
 static ttt_error_t
 _ttt_client_execute_version (ttt_client_t  *client,
-                            char          **args,
-                            int           num_args)
+                            char          **args,
+                            int           num_args)
 {
     char *response;
     char *clientversion;
@@ -352,8 +368,8 @@ _ttt_client_execute_quit (ttt_client_t *client,
 
 static ttt_error_t
 _ttt_client_execute_invite (ttt_client_t *client,
-                           char         **args,
-                           int          num_args)
+                           char         **args,
+                           int          num_args)
 {
     const char *username;
     char *response;
@@ -379,6 +395,8 @@ _ttt_client_execute_invite (ttt_client_t *client,
               username);
     ttt_server_broadcast (client->server, notice);
 
+    /* XXX: Store invitation in state */
+
     free (notice);
     free (response);
 
@@ -387,8 +405,8 @@ _ttt_client_execute_invite (ttt_client_t *client,
 
 static ttt_error_t
 _ttt_client_execute_accept (ttt_client_t *client,
-                           char         **args,
-                           int          num_args)
+                           char         **args,
+                           int          num_args)
 {
     const char *username;
     char *response;
@@ -406,6 +424,8 @@ _ttt_client_execute_accept (ttt_client_t *client,
     if (error)
        return error;
 
+    /* XXX: Verify invitation, else return ERROR NO_INVITE */
+
     xasprintf (&response, "ACCEPT\r\n");
     ttt_client_send (client, response);
 
@@ -422,6 +442,84 @@ _ttt_client_execute_accept (ttt_client_t *client,
     return TTT_ERROR_NONE;
 }
 
+static ttt_error_t
+_ttt_client_execute_retract (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;
+
+    /* XXX: Verify invitation, else return ERROR NO_INVITE */
+
+    xasprintf (&response, "RETRACT\r\n");
+    ttt_client_send (client, response);
+
+    xasprintf (&notice, "NOTICE RETRACT %s %s\r\n",
+              client->username,
+              username);
+    ttt_server_broadcast (client->server, notice);
+
+    /* XXX: Remove invitiation from state */
+
+    free (notice);
+    free (response);
+
+    return TTT_ERROR_NONE;
+}
+
+static ttt_error_t
+_ttt_client_execute_decline (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;
+
+    /* XXX: Verify invitation, else return ERROR NO_INVITE */
+
+    xasprintf (&response, "DECLINE\r\n");
+    ttt_client_send (client, response);
+
+    xasprintf (&notice, "NOTICE DECLINE %s %s\r\n",
+              client->username,
+              username);
+    ttt_server_broadcast (client->server, notice);
+
+    /* XXX: Remove invitation from state */
+
+    free (notice);
+    free (response);
+
+    return TTT_ERROR_NONE;
+}
+
 static void
 _free_request (ttt_client_t *client);