]> git.cworth.org Git - ttt/blobdiff - src/ttt-client.c
2005-12-08 Carl Worth <cworth@cworth.org>
[ttt] / src / ttt-client.c
index c92c4ebe1cd8e174e772d29c1aa40ed23a52eabf..e68f70ca5cbde835021b053814eec7098ec22ff4 100644 (file)
  */
 
 #include "ttt-client.h"
-
-#define YY_DECL int yylex (yyscan_t yyscanner, ttt_token_t *token)
-
 #include "ttt-error.h"
-#include "ttt-lex.h"
 #include "ttt-server.h"
 #include "ttt-socket.h"
 #include "ttt-token.h"
 
+#define YY_DECL int yylex (yyscan_t yyscanner, ttt_token_t *token)
+#include "ttt-lex.h"
+YY_DECL;
+
 struct _ttt_client {
     pthread_mutex_t mutex;
     pthread_t       thread;
@@ -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,19 +71,39 @@ _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,
                          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);
+
+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;
     int                args_min;
@@ -100,6 +120,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."},
+
+    {"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."},
 
@@ -201,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;
@@ -228,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;
@@ -281,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;
@@ -334,6 +366,160 @@ _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);
+
+    /* XXX: Store invitation in state */
+
+    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;
+
+    /* XXX: Verify invitation, else return ERROR NO_INVITE */
+
+    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 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);
 
@@ -545,3 +731,9 @@ ttt_client_get_num_wins (ttt_client_t *client)
 {
     return client->num_wins;
 }
+
+/* This is just to keep the compiler quiet about a function declared
+ * static but never defined. Just an annoying bug in flex's output. */
+static int yy_init_globals (yyscan_t yyscanner) {return 0;}
+void use_yy_init_globals (void);
+void use_yy_init_globals (void) {yyscan_t scan; yy_init_globals(scan);}