class newxWebQueryCurrent extends xWebQueryCurrent; var xAdminUser CurAdmin; // Currently logged admin (not thread safe) function string ConvertString(string msg) { local int i; local string tmp; local string result; local int code; tmp=msg; for(i=0; i191 && code<400) code+=848; if(i==0) result=Chr(code); else result=result$Chr(code); tmp=Mid(tmp,1); } return result; } function QueryCurrentConsole(WebRequest Request, WebResponse Response) { local String SendStr, OutStr; //Flame. Префикс перед сообщением вебадмина local string prefixAdminString; local int sayPos; CurAdmin = Level.Game.AccessControl.GetLoggedAdmin(Spectator); if(CurAdmin == none) { log("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: CurAdmin == none!!!!"); } prefixAdminString=CurAdmin.UserName; // if (CanPerform("Xc")) { SendStr = Request.GetVariable("SendText", ""); //Flame. Конвертация и префикс админа sayPos=InStr(SendStr,"say"); if(sayPos>=0) { SendStr=ConvertString(SendStr); if(sayPos==0) SendStr="say "$prefixAdminString@Mid(SendStr,4); } // if (SendStr != "" && !(Left(SendStr, 6) ~= "debug " || SendStr ~= "debug")) { if (Left(SendStr, 4) ~= "say ") Level.Game.Broadcast(Spectator, Mid(SendStr, 4), 'Say'); else if (SendStr ~= "pause") { if (Level.Pauser == None) Level.Pauser = Spectator.PlayerReplicationInfo; else Level.Pauser = None; } else if (SendStr ~= "dump") Spectator.Dump(); else if ((Left(SendStr, 4) ~= "get " || Left(SendStr,4) ~= "set ") && (InStr(Caps(SendStr), "XADMINCONFIG") != -1 || !CanPerform("Ms")) ) { if ( InStr(Caps(SendStr), "XADMINCONFIG") != -1 ) { StatusError(Response, ConsoleUserlist); ShowMessage(Response, Error, ""); log("User attempted to modify or enumerate admin account information illegally using the webadmin console. User:"$Request.Username$".",'WebAdmin'); } else if ( !CanPerform("Ms") ) AccessDenied(Response); } else { OutStr = Level.ConsoleCommand(SendStr); if (OutStr != "") { Spectator.AddMessage(None, OutStr, 'Console'); } Spectator.ConsoleCommand("admin " $ SendStr); log(prefixAdminString $ "executed " $ SendStr); } } Response.Subst("LogURI", CurrentConsoleLogPage); Response.Subst("SayURI", CurrentConsoleSendPage); ShowPage(Response, CurrentConsolePage); } else AccessDenied(Response); } function QueryCurrentPlayers(WebRequest Request, WebResponse Response) { local string Sort, PlayerListSubst, TempStr, TempTag, TempData; local string TableHeaders, GameType, Reverse, ColorNames[2], Last; local StringArray PlayerList; local Controller P, NextP; local int i, Cols, mlength; local string IP, ID; local bool bCanKick, bCanBan, bCanKickBots; Response.Subst("Section", CurrentLinks[1]); Response.Subst("PostAction", CurrentPlayersPage); ColorNames[0] = class'TeamInfo'.default.ColorNames[0]; ColorNames[1] = class'TeamInfo'.default.ColorNames[1]; MLength = int(Eval(Len(ColorNames[0]) > Len(ColorNames[1]), string(Len(ColorNames[0])), string(Len(ColorNames[1])))); if (CanPerform("Xp|Kp|Kb|Ko")) { PlayerList = new(None) class'SortedStringArray'; Sort = Request.GetVariable("Sort", "Name"); Last = Request.GetVariable("Last"); Response.Subst("Sort", Sort); Cols = 0; bCanKick = CanPerform("Kp"); bCanBan = CanPerform("Kb"); bCanKickBots = CanPerform("Ko|Mb"); if (Last == Sort && Request.GetVariable("ReverseSort") == "") { PlayerList.ToggleSort(); Reverse = "?ReverseSort=True"; } else Reverse = ""; // Count the number of Columns allowed if (bCanKick || bCanBan || bCanKickBots) { // Use 'do-while' to avoid access-none when destroying Controllers within the loop P = Level.ControllerList; if (P != None) { do { NextP = P.NextController; if( PlayerController(P) != None && P.PlayerReplicationInfo != None && NetConnection(PlayerController(P).Player) != None) { if ( bCanBan && Request.GetVariable("Ban" $ string(P.PlayerReplicationInfo.PlayerID)) != "" ) Level.Game.AccessControl.KickBanPlayer(PlayerController(P)); //if _RO_ else if ( bCanBan && Request.GetVariable("Session" $ string(P.PlayerReplicationInfo.PlayerID)) != "" ) Level.Game.AccessControl.BanPlayer(PlayerController(P), true); //end _RO_ else if ( bCanKick && Request.GetVariable("Kick" $ string(P.PlayerReplicationInfo.PlayerID)) != "" ) Level.Game.AccessControl.KickPlayer(PlayerController(P)); } else if ( PlayerController(P) == None && bCanKickBots && P.PlayerReplicationInfo != None && Request.GetVariable("Kick" $ string(P.PlayerReplicationInfo.PlayerID)) != "") { // Kick Bots P.Destroy(); } P = NextP; } until (P == None); } if (bCanKick || bCanKickBots) Cols += 1; if (bCanBan) Cols += 2; Response.Subst("KickButton", SubmitButton("Kick", KickButtonText[Cols-1])); // Build of valid TableHeaders TableHeaders = ""; if (bCanKick || bCanKickBots) { Response.Subst("HeadTitle", "Kick"); TableHeaders $= WebInclude(PlayerListHeader); } if (bCanBan) { //if _RO_ Response.Subst("HeadTitle", "Session"); TableHeaders $= WebInclude(PlayerListHeader); //end _RO_ Response.Subst("HeadTitle", "Ban"); TableHeaders $= WebInclude(PlayerListHeader); } if (Sort ~= "Name") Response.Subst("ReverseSort", Reverse); else Response.Subst("ReverseSort", ""); Response.Subst("HeadTitle", "Name"); TableHeaders $= WebInclude(PlayerListLinkedHeader); if (Level.Game.GameReplicationInfo.bTeamGame) { if (Sort ~= "Team") Response.Subst("ReverseSort", Reverse); else Response.Subst("ReverseSort", ""); Response.Subst("HeadTitle", "Team"); TableHeaders $= WebInclude(PlayerListLinkedHeader); } if (Sort ~= "Ping") Response.Subst("ReverseSort", Reverse); else Response.Subst("ReverseSort", ""); Response.Subst("HeadTitle", "Ping"); TableHeaders $= WebInclude(PlayerListLinkedHeader); if (Sort ~= "Score") Response.Subst("ReverseSort", Reverse); else Response.Subst("ReverseSort", ""); Response.Subst("HeadTitle", "Score"); TableHeaders $= WebInclude(PlayerListLinkedHeader); //if _RO_ Response.Subst("HeadTitle", "Team Kills"); TableHeaders $= WebInclude(PlayerListHeader); //end _RO_ Response.Subst("HeadTitle", "IP"); TableHeaders $= WebInclude(PlayerListHeader); // evo --- if (Level.Game.AccessControl.bBanbyID) { Response.Subst("HeadTitle", "Global ID"); TableHeaders $= WebInclude(PlayerListHeader); } // --- evo Response.Subst("TableHeaders", TableHeaders); } if (CanPerform("Ms")) { GameType = Level.GetItemName(SetGamePI(GameType)); if (GamePI != None && GamePI.Settings[GamePI.FindIndex(GameType$".MinPlayers")].SecLevel <= CurAdmin.MaxSecLevel()) { if ((Request.GetVariable("SetMinPlayers", "") != "") && UnrealMPGameInfo(Level.Game) != None) { UnrealMPGameInfo(Level.Game).MinPlayers = Min(Max(int(Request.GetVariable("MinPlayers", String(0))), 0), 32); Level.Game.SaveConfig(); } Response.Subst("MinPlayers", string(UnrealMPGameInfo(Level.Game).MinPlayers)); Response.Subst("MinPlayerPart", WebInclude(PlayerListMinPlayers)); } else { Response.Subst("MinPlayers", ""); Response.Subst("MinPlayersPart", ""); } } for (P=Level.ControllerList; P!=None; P=P.NextController) { TempData = ""; if (!P.bDeleteMe && P.bIsPlayer && P.PlayerReplicationInfo != None) { Response.Subst("Content", CheckBox("Kick" $ string(P.PlayerReplicationInfo.PlayerID), False)); if (CanPerform("Kp")) TempData $= WebInclude(CellCenter); if (CanPerform("Kb")) { //if _RO_ if ( PlayerController(P) != None ) { Response.Subst("Content", Checkbox("Session" $ string(P.PlayerReplicationInfo.PlayerID), False)); TempData $= WebInclude(CellCenter); Response.Subst("Content", Checkbox("Ban" $ string(P.PlayerReplicationInfo.PlayerID), False)); TempData $= WebInclude(CellCenter); } else { Response.Subst("Content", ""); TempData $= WebInclude(CellCenter)$WebInclude(CellCenter); } //else //if ( PlayerController(P) != None ) // Response.Subst("Content", Checkbox("Ban" $ string(P.PlayerReplicationInfo.PlayerID), False)); //else Response.Subst("Content", ""); //TempData $= WebInclude(CellCenter); //end _RO_ } TempStr = ""; if (DeathMatch(Level.Game) != None && DeathMatch(Level.Game).bTournament && P.PlayerReplicationInfo.bReadyToPlay) TempStr = " (Ready) "; else if (P.PlayerReplicationInfo.bIsSpectator) TempStr = " (Spectator) "; else if (PlayerController(P) == None) TempStr = " (Bot) "; if( PlayerController(P) != None ) { IP = PlayerController(P).GetPlayerNetworkAddress(); IP = HtmlEncode(" " $ Left(IP, InStr(IP, ":"))); // evo --- ID = HtmlEncode(" " $ Eval(Level.Game.AccessControl.bBanbyID, PlayerController(P).GetPlayerIDHash(), " ")); // --- evo } else { IP = HtmlEncode(" "); ID = HtmlEncode(" "); } Response.Subst("Content", HtmlEncode(ConvertString(P.PlayerReplicationInfo.PlayerName) $ TempStr)); TempData $= WebInclude(NowrapLeft); if (Level.Game.bTeamGame) { if (P.PlayerReplicationInfo.Team != None && P.PlayerReplicationInfo.Team.TeamIndex < 4) Response.Subst("Content", ""$HtmlEncode(" ")$""$HtmlEncode(P.PlayerReplicationInfo.Team.GetHumanReadableName())); else if (P.PlayerReplicationInfo.bIsSpectator) Response.Subst("Content", HtmlEncode(" ")); TempData $= WebInclude(NowrapCenter); } Response.Subst("Content", string(P.PlayerReplicationInfo.Ping*4)); TempData $= WebInclude(CellCenter); Response.Subst("Content", string(int(P.PlayerReplicationInfo.Score))); TempData $= WebInclude(CellCenter); //if _RO_ Response.Subst("Content", string(P.PlayerReplicationInfo.FFKills)); TempData $= WebInclude(CellCenter); //end _RO_ Response.Subst("Content", IP); TempData $= WebInclude(CellCenter); if (Level.Game.AccessControl.bBanbyID) { Response.Subst("Content", ID); TempData $= WebInclude(CellCenter); } switch (Sort) { case "Name": TempTag = ConvertString(P.PlayerReplicationInfo.PlayerName); break; case "Team": // Ordered by Team, then subordered by last selected sort method TempTag = PadRight(class'TeamInfo'.default.ColorNames[P.PlayerReplicationInfo.Team.TeamIndex],MLength,"0"); switch (Last) { case "Name": TempTag $= ConvertString(P.PlayerReplicationInfo.PlayerName); break; case "Ping": TempTag $= PadLeft(string(P.PlayerReplicationInfo.Ping*4), 5, "0"); break; default: TempTag $= PadLeft(string(int(P.PlayerReplicationInfo.Score)), 4, "0"); break; } break; case "Ping": TempTag = PadLeft(string(P.PlayerReplicationInfo.Ping*4), 5, "0"); break; default: TempTag = PadLeft(string(int(P.PlayerReplicationInfo.Score)), 4, "0"); break; } Response.Subst("RowContent", TempData); PlayerList.Add( WebInclude(RowLeft), TempTag); } } PlayerListSubst = ""; if (PlayerList.Count() > 0) { for ( i=0; i GameClass; local string NewGameType, SwitchButtonName, GameState, NewMap; local bool bMakeChanges; local Controller C; local xPlayer XP; local TeamPlayerReplicationInfo PRI; local int MultiKills, Sprees, GameIndex; if (CanPerform("Mt|Mm")) { if (Request.GetVariable("SwitchGameTypeAndMap", "") != "") { if (CanPerform("Mt")) ServerChangeMap(Request, Response, Request.GetVariable("MapSelect"), Request.GetVariable("GameTypeSelect")); else AccessDenied(Response); return; } else if (Request.GetVariable("SwitchMap", "") != "") { if (CanPerform("Mm|Mt")) { NewMap = Request.GetVariable("MapSelect"); Level.ServerTravel(NewMap$"?game="$Level.Game.Class$"?mutator="$UsedMutators(), false); ShowMessage(Response, WaitTitle, Repl(MapChangingTo, "%MapName%", NewMap)); } else AccessDenied(Response); return; } bMakeChanges = (Request.GetVariable("ApplySettings", "") != ""); if (CanPerform("Mt") && (bMakeChanges || Request.GetVariable("SwitchGameType", "") != "")) { NewGameType = Request.GetVariable("GameTypeSelect"); GameClass = class(DynamicLoadObject(NewGameType, class'Class')); } else GameClass = None; if (GameClass == None) { GameClass = Level.Game.Class; NewGameType = String(GameClass); } GameIndex = Level.Game.MaplistHandler.GetGameIndex(NewGameType); ExcludeMaps = ReloadExcludeMaps(NewGameType); IncludeMaps = ReloadIncludeMaps(ExcludeMaps, GameIndex, Level.Game.MaplistHandler.GetActiveList(GameIndex)); GameState = ""; // Show game status if admin has necessary privs if (CanPerform("Ma")) { if (Level.Game.NumPlayers > 0) { for (C = Level.ControllerList; C != None; C = C.NextController) { MultiKills = 0; Sprees = 0; PRI = None; XP = xPlayer(C); if (XP != None && !XP.bDeleteMe) { if (TeamPlayerReplicationInfo(XP.PlayerReplicationInfo) != None) PRI = TeamPlayerReplicationInfo(XP.PlayerReplicationInfo); if (PRI != None) { Response.Subst("PlayerName", HtmlEncode(ConvertString(PRI.PlayerName))); Response.Subst("Kills", string(PRI.Kills)); //if _RO_ Response.Subst("FFKills", string(PRI.FFKills)); //end _RO_ Response.Subst("Deaths", string(PRI.Deaths)); Response.Subst("Suicides",string(PRI.Suicides)); //if _RO_ /* //end _RO_ for (i = 0; i < 7; i++) MultiKills += PRI.MultiKills[i]; Response.Subst("MultiKills", string(MultiKills)); for (i = 0; i < 6; i++) Sprees += PRI.Spree[i]; Response.Subst("Sprees", string(Sprees)); //if _RO_ */ //end _RO_ GameState $= WebInclude(StatTableRow); } } } } else //if _RO_ GameState = ""@NoPlayersConnected@""; //else //GameState = ""@NoPlayersConnected@""; //end _RO_ Response.Subst("StatRows", GameState); Response.Subst("GameState", WebInclude(StatTable)); } if (GameClass == Level.Game.Class) { SwitchButtonName="SwitchMap"; MovedMaps = New(None) Class'SortedStringArray'; MovedMaps.CopyFromId(IncludeMaps, IncludeMaps.FindTagId(Left(string(Level), InStr(string(Level), ".")))); } else SwitchButtonName="SwitchGameTypeAndMap"; if (CanPerform("Mt")) { Response.Subst("Content", Select("GameTypeSelect", GenerateGameTypeOptions(NewGameType))); Response.Subst("GameTypeButton", SubmitButton("SwitchGameType", SwitchText)); } else Response.Subst("Content", Level.Game.Default.GameName); Response.Subst("GameTypeSelect", WebInclude(CellLeft)); Response.Subst("Content", Select("MapSelect", GenerateMapListSelect(IncludeMaps, MovedMaps))); Response.Subst("MapSelect", WebInclude(CellLeft)); Response.Subst("MapButton", SubmitButton(SwitchButtonName, SwitchText)); Response.Subst("PostAction", CurrentGamePage); Response.Subst("Section", CurrentLinks[0]); Response.Subst("PageHelp", NoteGamePage); MapTitle(Response); ShowPage(Response, CurrentGamePage); } else AccessDenied(Response); } defaultproperties { }