Roland Clobus said: > The patch contains the 'admin send-message', so your first part of the > feature request is fulfilled.
Thanks, the combination of debug messages and your patch are working. I needed to make a couple of small changes to your patch to work with the debian version -- possibly because you've made quite a few more changes since 10.2-3. * removed 'PB_SILENT, FIRST_VERSION,' from player_broadcast arguments * set need_gameparam to false for send-message command I've attached the modified patch (I just altered your patch, rather than creating a new one), as well as my script files, modified to accomodate the different debug/error messages. David
Index: server/server.c =================================================================== --- server/server.c (revision 1293) +++ server/server.c (working copy) @@ -436,6 +436,13 @@ no_player_timeout = to; } +void admin_broadcast(const gchar * message) +{ + /* The message that is sent must not be translated */ + player_broadcast(player_none(curr_game), PB_SILENT, + "NOTE1 %s|%s\n", message, "%s"); +} + gboolean start_server(const GameParams * params, const gchar * hostname, const gchar * port, gboolean register_server, const gchar * meta_server_name, Index: server/server.h =================================================================== --- server/server.h (revision 1297) +++ server/server.h (working copy) @@ -252,6 +252,7 @@ void cfg_set_tournament_time(GameParams * params, gint tournament_time); void cfg_set_quit(GameParams * params, gboolean quitdone); void cfg_set_timeout(gint to); +void admin_broadcast(const gchar * message); /* callbacks related to server starting / stopping */ gboolean start_server(const GameParams * params, const gchar * hostname, Index: server/admin.c =================================================================== --- server/admin.c (revision 1293) +++ server/admin.c (working copy) @@ -3,7 +3,8 @@ * * Copyright (C) 1999 Dave Cole * Copyright (C) 2003, 2006 Bas Wijnen <[EMAIL PROTECTED]> - * + * Copyright (C) 2007 Roland Clobus <[EMAIL PROTECTED]> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -19,131 +20,255 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -/* Pioneers Console Server +/* Pioneers Console Server Adminstrator interface + * + * The strings in the admin interface are intentionally not translated. + * They would otherwise reflect the language of the server that is + * running the server, instead of the language of the connecting user. */ #include "config.h" -#include <stdio.h> #include <stdlib.h> #include <string.h> -#include <unistd.h> -#include <glib.h> -#include <signal.h> -#include "driver.h" +#include "admin.h" #include "game.h" -#include "cards.h" -#include "map.h" -#include "network.h" -#include "log.h" -#include "buildrec.h" #include "server.h" -#include "glib-driver.h" -#include "admin.h" - - /* network administration functions */ comm_info *_accept_info = NULL; +typedef enum { + BADCOMMAND, + SETPORT, + STARTSERVER, + STOPSERVER, + REGISTERSERVER, + NUMPLAYERS, + SEVENSRULE, + VICTORYPOINTS, + RANDOMTERRAIN, + SETGAME, + QUIT, + MESSAGE, + HELP, + INFO +} AdminCommandType; + +typedef struct { + AdminCommandType type; + const gchar *command; + gboolean need_argument; + gboolean stop_server; + gboolean need_gameparam; +} AdminCommand; + +/* *INDENT-OFF* */ +static AdminCommand admin_commands[] = { + { BADCOMMAND, "", FALSE, FALSE, FALSE }, + { SETPORT, "set-port", TRUE, TRUE, TRUE }, + { STARTSERVER, "start-server", FALSE, TRUE, TRUE }, + { STOPSERVER, "stop-server", FALSE, TRUE, FALSE }, + { REGISTERSERVER, "set-register-server", TRUE, TRUE, FALSE }, + { NUMPLAYERS, "set-num-players", TRUE, TRUE, TRUE }, + { SEVENSRULE, "set-sevens-rule", TRUE, TRUE, TRUE }, + { VICTORYPOINTS, "set-victory-points", TRUE, TRUE, TRUE }, + { RANDOMTERRAIN, "set-random-terrain", TRUE, TRUE, TRUE }, + { SETGAME, "set-game", TRUE, TRUE, FALSE }, + { QUIT, "quit", FALSE, FALSE, FALSE }, + { MESSAGE, "send-message", TRUE, FALSE, FALSE }, + { HELP, "help", FALSE, FALSE, FALSE }, + { INFO, "info", FALSE, FALSE, FALSE } +}; +/* *INDENT-ON* */ + /* parse 'line' and run the command requested */ void admin_run_command(Session * admin_session, const gchar * line) { - gchar command[100]; - gchar value_str[100]; - gint value_int; + const gchar *command_start; + gchar *command; + gchar *argument; + gint command_number; + static gchar *server_port = NULL; static gboolean register_server = TRUE; static GameParams *params = NULL; - /* parse the line down into command and value */ - sscanf(line, "admin %99s %99s", command, value_str); - value_int = atoi(value_str); + if (!g_str_has_prefix(line, "admin")) { + net_printf(admin_session, + "no admin prefix in command: '%s'\n", line); + return; + } - /* set the GAME port */ - if (!strcmp(command, "set-port")) { - if (value_int) { - if (server_is_running()) - server_stop(); - if (server_port) - g_free(server_port); - server_port = g_strdup(value_str); - } + line += 5; /* length of "admin" */ + while (*line && g_ascii_isspace(*line)) + ++line; + if (!*line) { + net_printf(admin_session, "no command found: '%s'\n", + line); + return; + } - /* start the server */ - } else if (!strcmp(command, "start-server")) { - gchar *meta_server_name = get_meta_server_name(TRUE); - if (server_is_running()) - server_stop(); - if (!server_port) - server_port = g_strdup(PIONEERS_DEFAULT_GAME_PORT); - start_server(params, get_server_name(), server_port, - register_server, meta_server_name, TRUE); - g_free(meta_server_name); + /* parse the line down into command and argument */ + command_start = line; + while (*line && !g_ascii_isspace(*line)) + ++line; + command = g_strndup(command_start, line - command_start); - } else if (!strcmp(command, "stop-server")) { - server_stop(); + if (*line) { + while (*line && g_ascii_isspace(*line)) + ++line; + argument = g_strdup(line); + } else { + argument = NULL; + } - /* set whether or not to register the server with a meta server */ - } else if (!strcmp(command, "set-register-server")) { - if (value_int) { - if (server_is_running()) - server_stop(); - register_server = value_int; + /* command[0] is the fall-back */ + for (command_number = 1; + command_number < G_N_ELEMENTS(admin_commands); + ++command_number) { + if (!strcmp + (command, admin_commands[command_number].command)) { + break; } - - /* set the number of players */ - } else if (!strcmp(command, "set-num-players")) { - if (value_int) { - if (server_is_running()) - server_stop(); - cfg_set_num_players(params, value_int); + } + if (command_number == G_N_ELEMENTS(admin_commands)) { + command_number = 0; + } + if (admin_commands[command_number].need_argument + && NULL == argument) { + net_printf(admin_session, + "ERROR command '%s' needs an argument\n", + command); + } else if (admin_commands[command_number].need_gameparam + && NULL == params) { + net_printf(admin_session, + "ERROR command '%s' needs a valid game\n", + command); + } else { + if (admin_commands[command_number].stop_server + && server_is_running()) { + server_stop(); + net_write(admin_session, "INFO server stopped\n"); } - - /* set the sevens rule */ - } else if (!strcmp(command, "set-sevens-rule")) { - if (value_int) { - if (server_is_running()) - server_stop(); - cfg_set_sevens_rule(params, value_int); - } - - /* set the victory points */ - } else if (!strcmp(command, "set-victory-points")) { - if (value_int) { - if (server_is_running()) - server_stop(); - cfg_set_victory_points(params, value_int); - } - - /* set whether to use random terrain */ - } else if (!strcmp(command, "set-random-terrain")) { - if (value_int) { - if (server_is_running()) - server_stop(); - cfg_set_terrain_type(params, value_int); - } - - /* set the game type (by name) */ - } else if (!strcmp(command, "set-game")) { - if (value_str) { - if (server_is_running()) - server_stop(); + switch (admin_commands[command_number].type) { + case BADCOMMAND: + net_printf(admin_session, + "ERROR unrecognized command: '%s'\n", + command); + break; + case SETPORT: + if (server_port) + g_free(server_port); + server_port = g_strdup(argument); + break; + case STARTSERVER: + { + gchar *meta_server_name = + get_meta_server_name(TRUE); + if (!server_port) + server_port = + g_strdup + (PIONEERS_DEFAULT_GAME_PORT); + start_server(params, get_server_name(), + server_port, register_server, + meta_server_name, TRUE); + g_free(meta_server_name); + } + break; + case STOPSERVER: + server_stop(); + break; + case REGISTERSERVER: + register_server = atoi(argument); + break; + case NUMPLAYERS: + cfg_set_num_players(params, atoi(argument)); + break; + case SEVENSRULE: + cfg_set_sevens_rule(params, atoi(argument)); + break; + case VICTORYPOINTS: + cfg_set_victory_points(params, atoi(argument)); + break; + case RANDOMTERRAIN: + cfg_set_terrain_type(params, atoi(argument)); + break; + case SETGAME: if (params) params_free(params); - params = cfg_set_game(value_str); + params = cfg_set_game(argument); + if (!params) { + net_printf(admin_session, + "ERROR game '%s' not set\n", + argument); + } + break; + case QUIT: + net_close(admin_session); + /* Quit the server if the admin leaves */ + if (!server_is_running()) + exit(0); + break; + case MESSAGE: + g_strdelimit(argument, "|", '_'); + if (server_is_running()) + admin_broadcast(argument); + break; + case HELP: + for (command_number = 1; + command_number < G_N_ELEMENTS(admin_commands); + ++command_number) { + if (admin_commands[command_number]. + need_argument) { + net_printf(admin_session, + "INFO %s argument\n", + admin_commands + [command_number]. + command); + } else { + net_printf(admin_session, + "INFO %s\n", + admin_commands + [command_number]. + command); + } + } + break; + case INFO: + net_printf(admin_session, "INFO server-port %s\n", + server_port ? server_port : + PIONEERS_DEFAULT_GAME_PORT); + net_printf(admin_session, + "INFO register-server %d\n", + register_server); + net_printf(admin_session, + "INFO server running %d\n", + server_is_running()); + if (params) { + net_printf(admin_session, "INFO game %s\n", + params->title); + net_printf(admin_session, + "INFO players %d\n", + params->num_players); + net_printf(admin_session, + "INFO victory-points %d\n", + params->victory_points); + net_printf(admin_session, + "INFO random-terrain %d\n", + params->random_terrain); + net_printf(admin_session, + "INFO sevens-rule %d\n", + params->sevens_rule); + } else { + net_printf(admin_session, + "INFO no game set\n"); + } + break; } - - /* request to close the connection */ - } else if (!strcmp(command, "quit")) { - net_close(admin_session); - /* Quit the server if the admin leaves */ - if (!server_is_running()) - exit(0); - - /* fallthrough -- unknown command */ - } else { - g_warning("unrecognized admin request: '%s'\n", line); } + g_free(command); + if (argument) + g_free(argument); } /* network event handler, just like the one in meta.c, state.c, etc. */ @@ -165,7 +290,6 @@ #endif admin_run_command(admin_session, line); break; - case NET_CLOSE: /* connection has been closed */ @@ -174,7 +298,6 @@ #endif net_free(&admin_session); break; - case NET_CONNECT: /* connect() succeeded -- shouldn't get here */ @@ -182,7 +305,6 @@ g_print("admin_event: NET_CONNECT\n"); #endif break; - case NET_CONNECT_FAIL: /* connect() failed -- shouldn't get here */ @@ -190,7 +312,6 @@ g_print("admin_event: NET_CONNECT_FAIL\n"); #endif break; - default: /* To kill a warning... */ break; @@ -243,8 +364,8 @@ #endif /* set up the callback to handle connections */ - _accept_info->read_tag = driver->input_add_read(_accept_info->fd, - (InputFunc) - admin_connect, - _accept_info); + _accept_info->read_tag = + driver->input_add_read(_accept_info->fd, + (InputFunc) admin_connect, + _accept_info); } Index: server/admin.h =================================================================== --- server/admin.h (revision 1293) +++ server/admin.h (working copy) @@ -22,6 +22,8 @@ #ifndef __admin_h #define __admin_h +#include "network.h" + typedef struct _comm_info { gint fd; guint read_tag;
pioneers_scripts.tar.gz
Description: GNU Zip compressed data