Index: src/game/g_admin.c =================================================================== --- src/game/g_admin.c (revision 948) +++ src/game/g_admin.c (working copy) @@ -38,6 +38,13 @@ // note: list ordered alphabetically g_admin_cmd_t g_admin_cmds[ ] = { + {"adjustban", G_admin_adjustban, "j", + "change the length or reason of a ban. time is specified as numbers " + "followed by units 'w' (weeks), 'd' (days), 'h' (hours) or 'm' (minutes)," + " or seconds if no units are specified", + "[^5ban #^7] (^3length|reason^7)" + }, + {"admintest", G_admin_admintest, "a", "display your current admin level", "" @@ -55,8 +62,9 @@ {"ban", G_admin_ban, "b", "ban a player by IP and GUID with an optional expiration time and reason." - " time is seconds or suffix with 'w' - weeks, 'd' - days, 'h' - hours, " - "or 'm' - minutes", + " time is specified as numbers followed by units 'w' (weeks), 'd' " + "(days), 'h' (hours) or 'm' (minutes), or seconds if no units are " + "specified", "[^3name|slot#|IP^7] (^5time^7) (^5reason^7)" }, @@ -165,7 +173,7 @@ {"unban", G_admin_unban, "b", "unbans a player specified by the slot as seen in showbans", - "[^3ban slot#^7]" + "[^3ban #^7]" }, {"unlock", G_admin_unlock, "K", @@ -1650,6 +1658,35 @@ return qtrue; } +int G_admin_parse_time( const char *time ) +{ + int seconds = 0, num = 0; + int i; + + for( i = 0; time[ i ]; i++ ) + { + if( time[ i ] >= '0' && time[ i ] <= '9' ) + { + num = num * 10 + time[ i ] - '0'; + continue; + } + switch( time[ i ] ) + { + case 'w': num *= 7; + case 'd': num *= 24; + case 'h': num *= 60; + case 'm': num *= 60; + case 's': break; + default: return -1; + } + seconds += num; + num = 0; + } + if (num) + seconds += num; + return seconds; +} + qboolean G_admin_ban( gentity_t *ent, int skiparg ) { int seconds; @@ -1689,25 +1726,7 @@ G_SanitiseName( search, s2 ); G_SayArgv( 2 + skiparg, secs, sizeof( secs ) ); - // support "w" (weeks), "d" (days), "h" (hours), and "m" (minutes) modifiers - if( secs[ 0 ] ) - { - int lastchar = strlen( secs ) - 1; - if( secs[ lastchar ] == 'w' ) - modifier = 60 * 60 * 24 * 7; - else if( secs[ lastchar ] == 'd' ) - modifier = 60 * 60 * 24; - else if( secs[ lastchar ] == 'h' ) - modifier = 60 * 60; - else if( secs[ lastchar ] == 'm' ) - modifier = 60; - else if( secs[ lastchar ] < '0' || secs[ lastchar ] > '9' ) - secs[ lastchar ] = '\0'; - } - seconds = atoi( secs ); - if( seconds > 0 ) - seconds *= modifier; - + seconds = G_admin_parse_time( secs ); if( seconds <= 0 ) { if( G_admin_permission( ent, ADMF_CAN_PERM_BAN ) ) @@ -1860,10 +1879,70 @@ return qtrue; } +qboolean G_admin_adjustban( gentity_t *ent, int skiparg ) +{ + int bnum; + int duration; + char *arg; + char bs[ 5 ]; + + if( G_SayArgc() < 2 + skiparg ) + { + ADMP( "^3!adjustban: ^7usage: !adjustban [ban #] [length|reason]\n" ); + return qfalse; + } + G_SayArgv( 1 + skiparg, bs, sizeof( bs ) ); + bnum = atoi( bs ); + if( bnum < 1 || !g_admin_bans[ bnum - 1] ) + { + ADMP( "^3!adjustban: ^7invalid ban #\n" ); + return qfalse; + } + + arg = G_SayConcatArgs( 2 + skiparg ); + duration = G_admin_parse_time( arg ); + if( G_SayArgc() > 3 + skiparg || duration < 0) // reason + { + Q_strncpyz( g_admin_bans[ bnum - 1 ]->reason, reason, + sizeof( g_admin_bans[ bnum - 1 ]->reason ) ) + AP( va( "print \"^3!adjustban: ^7ban #%d reason changed to %s\n\"", bnum, + reason ) ); + } + else // time + { + int expires; + char duration[ 32 ]; + if( duration ) + { + qtime_t qt; + expires = trap_RealTime( &qt ) + duration; + } + else + expires = 0; + + if( g_admin_bans[ bnum - 1 ]->expires == expires ) + { + ADMP( "^3!adjustban: ^7no change\n" ); + return qfalse; + } + g_admin_bans[ bnum - 1 ]->expires = expires; + G_admin_duration( expires, duration, sizeof( duration ) ); + + AP( va( "print \"^3!adjustban: ^7ban #%d length adjusted to %s\n\"", bnum, + duration ) ); + } + + if( !g_admin.string[ 0 ] ) + ADMP( "^3!adjustban: ^7WARNING g_admin not set, not saving ban to a file\n" ); + else + admin_writeconfig(); + return qtrue; +} + qboolean G_admin_unban( gentity_t *ent, int skiparg ) { int bnum; - char bs[ 4 ]; + char bs[ 5 ]; qtime_t qt; int t; @@ -1875,16 +1954,11 @@ } G_SayArgv( 1 + skiparg, bs, sizeof( bs ) ); bnum = atoi( bs ); - if( bnum < 1 ) + if( bnum < 1 || !g_admin_bans[ bnum - 1 ] ) { ADMP( "^3!unban: ^7invalid ban #\n" ); return qfalse; } - if( !g_admin_bans[ bnum - 1 ] ) - { - ADMP( "^3!unban: ^7invalid ban #\n" ); - return qfalse; - } g_admin_bans[ bnum -1 ]->expires = t; AP( va( "print \"^3!unban: ^7ban #%d for %s^7 has been removed by %s\n\"", bnum, Index: src/game/g_admin.h =================================================================== --- src/game/g_admin.h (revision 947) +++ src/game/g_admin.h (working copy) @@ -145,6 +145,7 @@ qboolean G_admin_time( gentity_t *ent, int skiparg ); qboolean G_admin_setlevel( gentity_t *ent, int skiparg ); qboolean G_admin_kick( gentity_t *ent, int skiparg ); +qboolean G_admin_adjustban( gentity_t *ent, int skiparg ); qboolean G_admin_ban( gentity_t *ent, int skiparg ); qboolean G_admin_unban( gentity_t *ent, int skiparg ); qboolean G_admin_putteam( gentity_t *ent, int skiparg );