X-Git-Url: https://git.cworth.org/git?p=ttt;a=blobdiff_plain;f=src%2Fttt-client.c;h=7797090a49b17d94d8467c9c0718c3b49bd78fcc;hp=c92c4ebe1cd8e174e772d29c1aa40ed23a52eabf;hb=fb7c828d7963a599cb43593ecd70a317e7cdb962;hpb=47ff725ff3b109b94a23ea7c8c07c8b1417e31ef diff --git a/src/ttt-client.c b/src/ttt-client.c index c92c4eb..7797090 100644 --- a/src/ttt-client.c +++ b/src/ttt-client.c @@ -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 ", "Display help for a command."}, + {"INVITE", 1, 1, _ttt_client_execute_invite, + "INVITE ", "Invite a player to play a game."}, + + {"ACCEPT", 1, 1, _ttt_client_execute_accept, + "ACCEPT ", "Accept a game invitation."}, + + {"RETRACT", 1, 1, _ttt_client_execute_retract, + "RETRACT ", "Retract a game invitation."}, + + {"DECLINE", 1, 1, _ttt_client_execute_decline, + "DECLINE ", "Decline a game invitation."}, + {"MESSAGE", 1, 1, _ttt_client_execute_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 (¬ice, "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 (¬ice, "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 (¬ice, "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 (¬ice, "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);