diff -ru -X /home/jjm/cvs/no.freeciv FreecivCVS/server/civserver.c freeciv/server/civserver.c --- FreecivCVS/server/civserver.c Sun Jul 9 21:49:11 2000 +++ freeciv/server/civserver.c Wed Jul 12 14:00:06 2000 @@ -1516,6 +1516,7 @@ sz_strlcpy(pplayer->username, name); pplayer->conn = pconn; pplayer->is_connected = (pconn!=NULL); + if (pconn) { sz_strlcpy(pplayer->addr, pconn->addr); join_game_accept(pplayer, 0); diff -ru -X /home/jjm/cvs/no.freeciv FreecivCVS/server/sernet.c freeciv/server/sernet.c --- FreecivCVS/server/sernet.c Sun Jul 9 16:52:33 2000 +++ freeciv/server/sernet.c Wed Jul 12 14:00:06 2000 @@ -305,7 +305,7 @@ connections[i].buffer.ndata=0; connections[i].first_packet=1; connections[i].byte_swap=0; - connections[i].access_level=default_access_level; + connections[i].access_level=(i?default_access_level:first_access_level); if (from) sz_strlcpy(connections[i].addr, from->h_name); diff -ru -X /home/jjm/cvs/no.freeciv FreecivCVS/server/stdinhand.c freeciv/server/stdinhand.c --- FreecivCVS/server/stdinhand.c Sun Jul 9 21:49:12 2000 +++ freeciv/server/stdinhand.c Wed Jul 12 14:31:30 2000 @@ -57,6 +57,7 @@ extern int metaserver_port; enum cmdlevel_id default_access_level = ALLOW_INFO; +enum cmdlevel_id first_access_level = ALLOW_INFO; static void cut_player_connection(struct player *caller, char *playername); static void quit_game(struct player *caller); @@ -907,6 +908,7 @@ N_("cmdlevel\n" "cmdlevel \n" "cmdlevel new\n" + "cmdlevel first\n" "cmdlevel "), N_("Query or set command-level access."), N_("The command-level controls which server commands are available to " @@ -918,10 +920,13 @@ "With no arguments, the current command-levels are reported.\n" "With a single argument, the level is set for all existing " "connections, and the default is set for future connections.\n" - "If 'new' is specified, the default level is set for future connections.\n" + "If 'new' is specified, the level is set for newly connecting players.\n" + "If 'first' is specified, the level is set for the first player connected.\n" "If a player name is specified, the level is set for that player only.\n" "Command-levels do not persist if a player disconnects, " - "because some untrusted person could reconnect as that player.") + "because some untrusted person could reconnect as that player.\n" + "If the first player to connect disconnects, then the next player " + "to connect receives 'first' status.") }, {"remove", ALLOW_CTRL, /* translate <> only */ @@ -1586,9 +1591,12 @@ /* first, some state info from commands (we can't save everything) */ - fprintf(script_file, "cmdlevel %s\n", + fprintf(script_file, "cmdlevel %s new\n", cmdlevel_name(default_access_level)); + fprintf(script_file, "cmdlevel %s first\n", + cmdlevel_name(first_access_level)); + fprintf(script_file, "%s\n", (game.skill_level <= 3) ? "easy" : (game.skill_level >= 6) ? "hard" : @@ -1775,8 +1783,11 @@ } } cmd_reply(CMD_CMDLEVEL, caller, C_COMMENT, - _("Default command level for new connections: %s"), + _("Command level for new connections: %s"), cmdlevel_name(default_access_level)); + cmd_reply(CMD_CMDLEVEL, caller, C_COMMENT, + _("Command level for first connections: %s"), + cmdlevel_name(first_access_level)); return; } @@ -1829,10 +1840,16 @@ } default_access_level = level; cmd_reply(CMD_CMDLEVEL, caller, C_OK, - _("Default command access level set to '%s'."), + _("default command access level set to '%s'"), cmdlevel_name(level)); notify_player(0, _("Game: All players now have access level '%s'."), cmdlevel_name(level)); + if (level > first_access_level) { + first_access_level = level; + cmd_reply(CMD_CMDLEVEL, caller, C_OK, + _("first connection command access level also raised to '%s'"), + cmdlevel_name(level)); + } } else if (strcmp(arg_name,"new") == 0) { default_access_level = level; @@ -1841,6 +1858,26 @@ cmdlevel_name(level)); notify_player(0, _("Game: New connections will have access level '%s'."), cmdlevel_name(level)); + if (level > first_access_level) { + first_access_level = level; + cmd_reply(CMD_CMDLEVEL, caller, C_OK, + _("first connection command access level also raised to '%s'"), + cmdlevel_name(level)); + } + } + else if (strcmp(arg_name,"first") == 0) { + first_access_level = level; + cmd_reply(CMD_CMDLEVEL, caller, C_OK, + _("first connection command access level set to '%s'"), + cmdlevel_name(level)); + notify_player(0, _("Game: First connections will have access level '%s'."), + cmdlevel_name(level)); + if (level < default_access_level) { + default_access_level = level; + cmd_reply(CMD_CMDLEVEL, caller, C_OK, + _("default command access level also lowered to '%s'"), + cmdlevel_name(level)); + } } else if ((pplayer=find_player_by_name_prefix(arg_name,&match_result))) { if (!pplayer->conn) { @@ -2811,13 +2848,13 @@ else if (game.players[i].ai.control) { if (game.players[i].conn) { cmd_reply(CMD_LIST, caller, C_COMMENT, - _("%s (AI, %s) is being observed from %s"), + _("%s (AI, difficulty level %s) is being observed from %s"), game.players[i].name, name_of_skill_level(game.players[i].ai.skill_level), game.players[i].addr); } else { cmd_reply(CMD_LIST, caller, C_COMMENT, - _("%s (AI, %s) is not being observed"), + _("%s (AI, difficulty level %s) is not being observed"), game.players[i].name, name_of_skill_level(game.players[i].ai.skill_level)); } @@ -2825,9 +2862,10 @@ else { if (game.players[i].conn) { cmd_reply(CMD_LIST, caller, C_COMMENT, - _("%s (human, %s) is connected from %s"), + _("%s (human %s, command level %s) is connected from %s"), game.players[i].name, - game.players[i].username, + game.players[i].username, + cmdlevel_name(access_level(&game.players[i])), game.players[i].addr); } else { cmd_reply(CMD_LIST, caller, C_COMMENT, diff -ru -X /home/jjm/cvs/no.freeciv FreecivCVS/server/stdinhand.h freeciv/server/stdinhand.h --- FreecivCVS/server/stdinhand.h Fri Mar 31 02:06:20 2000 +++ freeciv/server/stdinhand.h Wed Jul 12 14:00:06 2000 @@ -26,6 +26,7 @@ void toggle_ai_player_direct(struct player *caller, struct player *subject); -extern enum cmdlevel_id default_access_level; +extern enum cmdlevel_id default_access_level; /* for sernet.c in */ +extern enum cmdlevel_id first_access_level; /* initing a new connection */ #endif /* FC__STDINHAND_H */