-webfront now displays player info and link to repz account

-fixed time span issue in webfront
-fixed crash when RCON stops responding and removing a player
-version on footer
This commit is contained in:
RaidMax 2015-04-12 23:25:34 -05:00
parent 8e31cbe138
commit 65b65716d2
18 changed files with 339 additions and 81 deletions

View File

@ -361,7 +361,7 @@ namespace IW4MAdmin
{ {
foreach (Player P in E.Owner.getPlayers()) foreach (Player P in E.Owner.getPlayers())
{ {
if (P != null && P.getLevel() > Player.Permission.User && !P.Masked) if (P != null && P.getLevel() > Player.Permission.Flagged && !P.Masked)
{ {
E.Origin.Tell(String.Format("[^3{0}^7] {1}", Utilities.levelToColor(P.getLevel()), P.getName())); E.Origin.Tell(String.Format("[^3{0}^7] {1}", Utilities.levelToColor(P.getLevel()), P.getName()));
} }
@ -430,6 +430,53 @@ namespace IW4MAdmin
} }
} }
class FindAll : Command
{
public FindAll(String N, String D, String U, Player.Permission P, int args, bool nT) : base(N, D, U, P, args, nT) { }
public override void Execute(Event E)
{
E.Data = E.Data.Trim();
if (E.Data.Length < 4)
{
E.Origin.Tell("You must enter at least 4 letters");
return;
}
//var db_players = E.Owner.clientDB.findPlayers(E.Data.Trim());
var db_aliases = E.Owner.aliasDB.findPlayers(E.Data);
if (db_aliases == null)
{
E.Origin.Tell("No players found");
return;
}
foreach (Aliases P in db_aliases)
{
if (P == null)
continue;
String lookingFor = String.Empty;
foreach(String S in P.getNames())
{
if (S.Contains(E.Data))
lookingFor = S;
}
Player Current = E.Owner.clientDB.getPlayer(P.getNumber());
if (Current != null)
{
String mesg = String.Format("^1{0} ^7now goes by ^5{1}^7 [^3{2}^7]", lookingFor, Current.getName(), Current.getDBID());
E.Origin.Tell(mesg);
}
}
}
}
class Rules : Command class Rules : Command
{ {
public Rules(String N, String D, String U, Player.Permission P, int args, bool nT) : base(N, D, U, P, args, nT) { } public Rules(String N, String D, String U, Player.Permission P, int args, bool nT) : base(N, D, U, P, args, nT) { }

View File

@ -334,6 +334,12 @@ namespace IW4MAdmin
String Query = String.Format("DELETE FROM BANS WHERE npID = '{0}'", GUID); String Query = String.Format("DELETE FROM BANS WHERE npID = '{0}'", GUID);
ExecuteNonQuery(Query); ExecuteNonQuery(Query);
} }
public void removeBan(String GUID, String IP)
{
String Query = String.Format("DELETE FROM BANS WHERE npID = '{0}' or IP= '%{1}%'", GUID, IP);
ExecuteNonQuery(Query);
}
} }
@ -522,6 +528,22 @@ namespace IW4MAdmin
return players; return players;
} }
public List<Aliases> findPlayers(String name)
{
String Query = String.Format("SELECT * FROM ALIASES WHERE NAMES LIKE '%{0}%' LIMIT 8", name);
DataTable Result = GetDataTable(Query);
List<Aliases> players = new List<Aliases>();
if (Result != null && Result.Rows.Count > 0)
{
foreach (DataRow p in Result.Rows)
players.Add(new Aliases(Convert.ToInt32(p["Number"]), p["NAMES"].ToString(), p["IPS"].ToString()));
}
return players;
}
public void addPlayer(Aliases Alias) public void addPlayer(Aliases Alias)
{ {
Dictionary<String, object> newPlayer = new Dictionary<String, object>(); Dictionary<String, object> newPlayer = new Dictionary<String, object>();

View File

@ -127,12 +127,18 @@
<Content Include="webfront\bans.html"> <Content Include="webfront\bans.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="webfront\footer.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="webfront\header.html"> <Content Include="webfront\header.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="webfront\main.html"> <Content Include="webfront\main.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="webfront\player.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="webfront\stats.html"> <Content Include="webfront\stats.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
@ -185,8 +191,8 @@
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>
<PostBuildEvent>copy $(TargetDir)$(TargetFileName) $(SolutionDir)OFFICIAL\Release\$(TargetFileName) <PostBuildEvent>
copy $(SolutionDir)Admin\version.txt $(SolutionDir)OFFICIAL\Release\version.txt</PostBuildEvent> </PostBuildEvent>
</PropertyGroup> </PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View File

@ -203,16 +203,7 @@ namespace IW4MAdmin
public String getLastConnection() public String getLastConnection()
{ {
TimeSpan Elapsed = DateTime.Now - LastConnection; return Utilities.timePassed(LastConnection);
if (Elapsed.Minutes < 60)
return Elapsed.Minutes + " minutes";
if (Elapsed.Hours <= 24)
return Elapsed.Hours + " hours";
if (Elapsed.Days <= 365)
return Elapsed.Days + " days";
else
return "a very long time";
} }
public void updateName(String n) public void updateName(String n)

View File

@ -117,7 +117,10 @@ namespace IW4MAdmin
Aliases currentAliases = aliasDB.getPlayer(Origin.getDBID()); Aliases currentAliases = aliasDB.getPlayer(Origin.getDBID());
if (currentAliases == null) if (currentAliases == null)
{
Log.Write("No aliases found for " + Origin.getName(), Log.Level.Debug); Log.Write("No aliases found for " + Origin.getName(), Log.Level.Debug);
return;
}
foreach (String IP in currentAliases.getIPS()) foreach (String IP in currentAliases.getIPS())
{ {
@ -303,6 +306,12 @@ namespace IW4MAdmin
{ {
if (cNum >= 0 && cNum < players.Count) if (cNum >= 0 && cNum < players.Count)
{ {
if (players[cNum] == null)
{
Log.Write("Error - Disconnecting client slot is already empty!", Log.Level.Debug);
return false;
}
Player Leaving = players[cNum]; Player Leaving = players[cNum];
Leaving.Connections++; Leaving.Connections++;
clientDB.updatePlayer(Leaving); clientDB.updatePlayer(Leaving);
@ -319,7 +328,7 @@ namespace IW4MAdmin
else else
{ {
Log.Write("Client disconnecting has an invalid client index!", Log.Level.Debug); Log.Write("Error - Client disconnecting has an invalid client index!", Log.Level.Debug);
clientnum = statusPlayers.Count; clientnum = statusPlayers.Count;
return false; return false;
} }
@ -824,7 +833,9 @@ namespace IW4MAdmin
logPath = Basepath + '\\' + "m2demo" + '\\' + log; logPath = Basepath + '\\' + "m2demo" + '\\' + log;
else else
logPath = Basepath + '\\' + Mod + '\\' + log; logPath = Basepath + '\\' + Mod + '\\' + log;
#if DEBUG
// logPath = "C:\\Users\\Michael\\Desktop\\test.txt";
#endif
if (!File.Exists(logPath)) if (!File.Exists(logPath))
{ {
Log.Write("Gamelog does not exist!", Log.Level.All); Log.Write("Gamelog does not exist!", Log.Level.All);
@ -851,7 +862,7 @@ namespace IW4MAdmin
String ftpLog = new StreamReader(ftpStream).ReadToEnd();*/ String ftpLog = new StreamReader(ftpStream).ReadToEnd();*/
//logPath = "games_old.log"; //logPath = "games_old.log";
#endif #endif
Log.Write("Now monitoring " + this.getName(), Log.Level.Debug); Log.Write("Now monitoring " + this.getName(), Log.Level.All);
return true; return true;
} }
catch (Exception E) catch (Exception E)
@ -1093,9 +1104,9 @@ namespace IW4MAdmin
{ {
if (B.getID() == Target.getID()) if (B.getID() == Target.getID())
{ {
clientDB.removeBan(Target.getID()); clientDB.removeBan(Target.getID(), Target.getIP());
Bans.Remove(B); Bans.Remove(B);
Player P = clientDB.getPlayer(Target.getID(), 0); Player P = clientDB.getPlayer(Target.getID(), -1);
P.setLevel(Player.Permission.User); P.setLevel(Player.Permission.User);
clientDB.updatePlayer(P); clientDB.updatePlayer(P);
return true; return true;
@ -1147,7 +1158,7 @@ namespace IW4MAdmin
if (P == null) if (P == null)
continue; continue;
if (P.getLevel() > Player.Permission.User) if (P.getLevel() > Player.Permission.Flagged)
{ {
P.Alert(); P.Alert();
P.Tell(message); P.Tell(message);
@ -1274,7 +1285,7 @@ namespace IW4MAdmin
commands.Add(new Uptime("uptime", "get current application running time. syntax: !uptime.", "up", Player.Permission.Moderator, 0, false)); commands.Add(new Uptime("uptime", "get current application running time. syntax: !uptime.", "up", Player.Permission.Moderator, 0, false));
commands.Add(new Warn("warn", "warn player for infringing rules syntax: !warn <player> <reason>.", "w", Player.Permission.Moderator, 2, true)); commands.Add(new Warn("warn", "warn player for infringing rules syntax: !warn <player> <reason>.", "w", Player.Permission.Moderator, 2, true));
commands.Add(new WarnClear("warnclear", "remove all warning for a player syntax: !warnclear <player>.", "wc", Player.Permission.Administrator, 1, true)); commands.Add(new WarnClear("warnclear", "remove all warning for a player syntax: !warnclear <player>.", "wc", Player.Permission.Administrator, 1, true));
commands.Add(new Unban("unban", "unban player by guid. syntax: !unban <guid>.", "ub", Player.Permission.SeniorAdmin, 1, true)); commands.Add(new Unban("unban", "unban player by database id. syntax: !unban @<id>.", "ub", Player.Permission.SeniorAdmin, 1, true));
commands.Add(new Admins("admins", "list currently connected admins. syntax: !admins.", "a", Player.Permission.User, 0, false)); commands.Add(new Admins("admins", "list currently connected admins. syntax: !admins.", "a", Player.Permission.User, 0, false));
commands.Add(new Wisdom("wisdom", "get a random wisdom quote. syntax: !wisdom", "w", Player.Permission.Administrator, 0, false)); commands.Add(new Wisdom("wisdom", "get a random wisdom quote. syntax: !wisdom", "w", Player.Permission.Administrator, 0, false));
commands.Add(new MapCMD("map", "change to specified map. syntax: !map", "m", Player.Permission.Administrator, 1, false)); commands.Add(new MapCMD("map", "change to specified map. syntax: !map", "m", Player.Permission.Administrator, 1, false));
@ -1294,6 +1305,7 @@ namespace IW4MAdmin
commands.Add(new BanInfo("baninfo", "get information about a ban for a player. syntax: !baninfo <player>", "bi", Player.Permission.Moderator, 1, true)); commands.Add(new BanInfo("baninfo", "get information about a ban for a player. syntax: !baninfo <player>", "bi", Player.Permission.Moderator, 1, true));
commands.Add(new Alias("alias", "get past aliases and ips of a player. syntax: !alias <player>", "known", Player.Permission.Moderator, 1, true)); commands.Add(new Alias("alias", "get past aliases and ips of a player. syntax: !alias <player>", "known", Player.Permission.Moderator, 1, true));
commands.Add(new _RCON("rcon", "send rcon command to server. syntax: !rcon <command>", "rcon", Player.Permission.Owner, 1, false)); commands.Add(new _RCON("rcon", "send rcon command to server. syntax: !rcon <command>", "rcon", Player.Permission.Owner, 1, false));
commands.Add(new FindAll("findall", "find a player by their aliase(s). syntax: !findall <player>", "fa", Player.Permission.Moderator, 1, false));
} }
//Objects //Objects

View File

@ -149,20 +149,51 @@ namespace IW4MAdmin
switch (P.getLevel()) switch (P.getLevel())
{ {
case Player.Permission.User: case Player.Permission.User:
return "<span style='color:rgb(121, 194, 97)'>" + P.getName() + "</span>"; return "<span style='color:rgb(87, 150, 66)'>" + P.getName() + "</span>";
case Player.Permission.Moderator: case Player.Permission.Moderator:
return "<span style='color:#e7b402'>" + P.getName() + "</span>"; return "<span style='color:#e7b402'>" + P.getName() + "</span>";
case Player.Permission.Administrator: case Player.Permission.Administrator:
return "<span style='color:#ec82de'>" + P.getName() + "</span>"; return "<span style='color:#ec82de'>" + P.getName() + "</span>";
case Player.Permission.SeniorAdmin: case Player.Permission.SeniorAdmin:
return "<span style='color:#2eb6bf'>" + P.getName() + "</span>"; return "<span style='color:#2eb6bf'>" + P.getName() + "</span>";
case Player.Permission.Owner | Player.Permission.Creator: case Player.Permission.Owner:
return "<span style='color:rgb(38,120,230)'>" + P.getName() + "</span>"; return "<span style='color:rgb(38,120,230)'>" + P.getName() + "</span>";
case Player.Permission.Creator:
return "<span style='color:rgb(38,120,230)'>" + P.getName() + "</span>";
case Player.Permission.Banned:
return "<span style='color:rgb(196, 22, 28)'>" + P.getName() + "</span>";
case Player.Permission.Flagged:
return "<span style='color:rgb(251, 124, 98)'>" + P.getName() + "</span>";
default: default:
return "<i>" + P.getName() + "</i>"; return "<i>" + P.getName() + "</i>";
} }
} }
public static String nameHTMLFormatted(Player.Permission Level)
{
switch (Level)
{
case Player.Permission.User:
return "<span style='color:rgb(87, 150, 66)'>" + Level + "</span>";
case Player.Permission.Moderator:
return "<span style='color:#e7b402'>" + Level + "</span>";
case Player.Permission.Administrator:
return "<span style='color:#ec82de'>" + Level + "</span>";
case Player.Permission.SeniorAdmin:
return "<span style='color:#2eb6bf'>" + Level + "</span>";
case Player.Permission.Owner:
return "<span style='color:rgb(38,120,230)'>" + Level + "</span>";
case Player.Permission.Creator:
return "<span style='color:rgb(38,120,230)'>" + Level + "</span>";
case Player.Permission.Banned:
return "<span style='color:rgb(196, 22, 28)'>" + Level + "</span>";
case Player.Permission.Flagged:
return "<span style='color:rgb(251, 124, 98)'>" + Level + "</span>";
default:
return "<i>" + Level + "</i>";
}
}
public static String gametypeLocalized(String input) public static String gametypeLocalized(String input)
{ {
switch (input) switch (input)
@ -264,12 +295,12 @@ namespace IW4MAdmin
{ {
TimeSpan Elapsed = DateTime.Now - start; TimeSpan Elapsed = DateTime.Now - start;
if (Elapsed.Hours < 1 && Elapsed.Minutes < 60) if (Elapsed.TotalMinutes < 120)
return Elapsed.Minutes + " minutes"; return Math.Round(Elapsed.TotalMinutes, 0) + " minutes";
if (Elapsed.Days < 1 && Elapsed.Hours <= 24) if (Elapsed.TotalHours <= 24)
return Elapsed.Hours + " hours"; return Math.Round(Elapsed.TotalHours, 0) + " hours";
if (Elapsed.Days <= 365) if (Elapsed.TotalDays <= 365)
return Elapsed.Days + " days"; return Math.Round(Elapsed.TotalDays, 0) + " days";
else else
return "a very long time"; return "a very long time";
} }

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Globalization;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@ -15,7 +16,8 @@ namespace IW4MAdmin_Web
{ {
main, main,
stats, stats,
bans bans,
player
} }
public WebFront() public WebFront()
@ -66,20 +68,46 @@ namespace IW4MAdmin_Web
{ {
case "SERVERS": case "SERVERS":
var Servers = IW4MAdmin.Program.Servers; var Servers = IW4MAdmin.Program.Servers;
int cycleFix = 0;
for (int i = 0; i < Servers.Count; i++) for (int i = 0; i < Servers.Count; i++)
{ {
StringBuilder players = new StringBuilder(); StringBuilder players = new StringBuilder();
if (Servers[i].getClientNum() < 1) if (Servers[i].getClientNum() < 1)
players.Append("<th>No Players</th>"); players.Append("<h2>No Players</h2>");
else else
{ {
int count = 0; int count = 0;
foreach (IW4MAdmin.Player P in Servers[i].statusPlayers.Values) double currentPlayers = Servers[i].statusPlayers.Count;
foreach (IW4MAdmin.Player P in Servers[i].getPlayers())
{ {
if (count > 0 && count % 6 == 0) if (P == null)
players.Append("</tr><tr>"); continue;
players.AppendFormat("<td>{0}</td>", P.getName());
if (count % 2 == 0)
{
switch (cycleFix)
{
case 0:
players.Append("<tr class='row-grey'>");
cycleFix = 1;
break;
case 1:
players.Append("<tr class='row-white'>");
cycleFix = 0;
break;
}
}
players.AppendFormat("<td><a href='/{0}/{1}/?player'>{2}</a></td>", i, P.getDBID(), IW4MAdmin.Utilities.nameHTMLFormatted(P));
if (count % 2 != 0)
{
players.Append("</tr>");
}
count++; count++;
} }
} }
buffer.AppendFormat(@"<table cellpadding=0 cellspacing=0 class=server> buffer.AppendFormat(@"<table cellpadding=0 cellspacing=0 class=server>
@ -91,12 +119,10 @@ namespace IW4MAdmin_Web
<th><a href=/{4}/0/?stats>Stats</a></th> <th><a href=/{4}/0/?stats>Stats</a></th>
<th><a href=/{4}/0/?bans>Bans</a></th> <th><a href=/{4}/0/?bans>Bans</a></th>
</tr> </tr>
</table>
<table class=players>
<tr>
{5}
</tr>
</table> </table>
<table cellpadding='0' cellspacing='0' class='players'>
{5}
</table>
<hr/>", <hr/>",
Servers[i].getName(), Servers[i].getMap(), Servers[i].getClientNum() + "/" + Servers[i].getMaxClients(), IW4MAdmin.Utilities.gametypeLocalized(Servers[i].getGametype()), i, players.ToString()); Servers[i].getName(), Servers[i].getMap(), Servers[i].getClientNum() + "/" + Servers[i].getMaxClients(), IW4MAdmin.Utilities.gametypeLocalized(Servers[i].getGametype()), i, players.ToString());
} }
@ -108,7 +134,7 @@ namespace IW4MAdmin_Web
int totalBans = IW4MAdmin.Program.Servers[0].Bans.Count; int totalBans = IW4MAdmin.Program.Servers[0].Bans.Count;
int range; int range;
int start = Pagination*30 + 1; int start = Pagination*30 + 1;
int cycleFix = 0; cycleFix = 0;
if (totalBans <= 30) if (totalBans <= 30)
range = totalBans - 1; range = totalBans - 1;
@ -156,7 +182,8 @@ namespace IW4MAdmin_Web
Prefix = "class=row-grey"; Prefix = "class=row-grey";
else else
Prefix = "class=row-white"; Prefix = "class=row-white";
buffer.AppendFormat("<tr {4}><td>{0}</th><td style='border-left: 3px solid #bbb; text-align:left;'>{1}</td><td style='border-left: 3px solid #bbb;text-align:left;'>{2}</td><td style='width: 175px; text-align:right;'>{3}</td></tr></div>", P.getName(), P.getLastO(), IW4MAdmin.Utilities.nameHTMLFormatted(B), Bans[i].getWhen(), Prefix); String Link = "/" + server + "/" + P.getDBID() + "/?player";
buffer.AppendFormat("<tr {4}><td><a href='{5}'>{0}</a></th><td style='border-left: 3px solid #bbb; text-align:left;'>{1}</td><td style='border-left: 3px solid #bbb;text-align:left;'>{2}</td><td style='width: 175px; text-align:right;'>{3}</td></tr></div>", P.getName(), P.getLastO(), IW4MAdmin.Utilities.nameHTMLFormatted(B), Bans[i].getWhen(), Prefix, Link);
cycleFix++; cycleFix++;
} }
} }
@ -203,13 +230,56 @@ namespace IW4MAdmin_Web
Prefix = "class=row-grey"; Prefix = "class=row-grey";
else else
Prefix = "class=row-white"; Prefix = "class=row-white";
buffer.AppendFormat("<tr {5}><td>{0}</th><td style='border-left: 3px solid #bbb; text-align:left;'>{1}</td><td style='border-left: 3px solid #bbb;text-align:left;'>{2}</td><td style='border-left: 3px solid #bbb;text-align:left;'>{3}</td><td style='width: 175px; text-align:right;'>{4}</td></tr></div>", P.getName(), P.stats.Kills, P.stats.Deaths, P.stats.KDR, P.stats.Skill, Prefix);
String Link = "/" + server + "/" + P.getDBID() + "/?player";
buffer.AppendFormat("<tr {5}><td><a href='{6}'>{0}</a></td><td style='border-left: 3px solid #bbb; text-align:left;'>{1}</td><td style='border-left: 3px solid #bbb;text-align:left;'>{2}</td><td style='border-left: 3px solid #bbb;text-align:left;'>{3}</td><td style='width: 175px; text-align:right;'>{4}</td></tr></div>", P.getName(), P.stats.Kills, P.stats.Deaths, P.stats.KDR, P.stats.Skill, Prefix, Link);
cycleFix++; cycleFix++;
} }
} }
buffer.Append("</table><hr/>"); buffer.Append("</table><hr/>");
buffer.Append(parsePagination(server, totalStats, 30, Pagination, "stats")); buffer.Append(parsePagination(server, totalStats, 30, Pagination, "stats"));
return buffer.ToString().Replace("{{TOP}}", (start + 1).ToString()); return buffer.ToString().Replace("{{TOP}}", (start + 1).ToString());
case "PLAYER":
buffer.Append("<table class='player_info'><tr><th>Name</th><th>Aliases</th><th>IP</th><th>Rating</th><th>Level</th><th>Connections</th><th>Last Seen</th><th>Profile</th>");
IW4MAdmin.Player Player = IW4MAdmin.Program.Servers[server].clientDB.getPlayer(Pagination);
if (Player == null)
buffer.Append("</table>");
else
{
buffer.Append("<tr>");
StringBuilder str = new StringBuilder();
List<IW4MAdmin.Player> aliases = new List<IW4MAdmin.Player>();
IW4MAdmin.Program.Servers[server].getAliases(aliases, Player);
foreach (IW4MAdmin.Player a in aliases)
str.AppendFormat("<span>{0}</span><br/>", a.getName());
Player.stats = IW4MAdmin.Program.Servers[server].statDB.getStats(Player.getDBID());
String Rating = String.Empty;
if (Player.stats == null)
Rating = "Not Available";
else
Rating = Player.stats.Skill.ToString();
bool logged = false;
String IP;
if (logged)
IP = Player.getIP();
else
IP = "XXX.XXX.XXX.XXX";
Int64 forumID = Int64.Parse(Player.getID(), NumberStyles.AllowHexSpecifier);
forumID = forumID - 76561197960265728;
buffer.AppendFormat("<td>{0}</td><td>{1}</td><td>{2}</td><td>{3}</td><td>{4}</td><td>{5}</td><td>{6} ago</td><td><a href='https://repziw4.de/memberlist.php?mode=viewprofile&u={7}'>{8}</a></td>", Player.getName(), str, IP, Rating, IW4MAdmin.Utilities.nameHTMLFormatted(Player.getLevel()), Player.getConnections(), Player.getLastConnection(), forumID, Player.getName());
buffer.Append("</tr></table>");
}
return buffer.ToString();
default: default:
return input; return input;
} }
@ -230,6 +300,9 @@ namespace IW4MAdmin_Web
case WebFront.Page.stats: case WebFront.Page.stats:
output = output.Replace("{{STATS}}", parseMacros("STATS", page, pageNumber, server)); output = output.Replace("{{STATS}}", parseMacros("STATS", page, pageNumber, server));
break; break;
case WebFront.Page.player:
output = output.Replace("{{PLAYER}}", parseMacros("PLAYER", page, pageNumber, server));
break;
} }
//output = output.Replace("{{PAGE}}", parseMacros("PAGE", page, pageNumber, server)); //output = output.Replace("{{PAGE}}", parseMacros("PAGE", page, pageNumber, server));
@ -237,6 +310,7 @@ namespace IW4MAdmin_Web
//output = output.Replace("{{SERVERS}}", parseMacros("SERVERS", 0)); //output = output.Replace("{{SERVERS}}", parseMacros("SERVERS", 0));
//output = output.Replace("{{BANS}}", parseMacros("BANS", page)); //output = output.Replace("{{BANS}}", parseMacros("BANS", page));
output = output.Replace("{{TITLE}}", "IW4M Administration"); output = output.Replace("{{TITLE}}", "IW4M Administration");
output = output.Replace("{{VERSION}}", IW4MAdmin.Program.Version.ToString());
//output = output.Replace("{{PAGE}}", parseMacros("PAGE", page)); //output = output.Replace("{{PAGE}}", parseMacros("PAGE", page));
//output = output.Replace("{{STATS}}", parseMacros("STATS", page)); //output = output.Replace("{{STATS}}", parseMacros("STATS", page));
@ -265,7 +339,7 @@ namespace IW4MAdmin_Web
{ {
if (request.Uri.StartsWith("/")) if (request.Uri.StartsWith("/"))
{ {
Console.WriteLine("[WEBFRONT] Processing Request for " + request.Uri); //Console.WriteLine("[WEBFRONT] Processing Request for " + request.Uri);
var body = String.Empty; var body = String.Empty;
if (request.Uri.StartsWith("/")) if (request.Uri.StartsWith("/"))
@ -274,6 +348,10 @@ namespace IW4MAdmin_Web
var header = Header.getLines(); var header = Header.getLines();
Header.Close(); Header.Close();
IW4MAdmin.file Footer = new IW4MAdmin.file("webfront\\footer.html");
var footer = Footer.getLines();
Footer.Close();
String[] req = request.Path.Split(new char[] {'/'}, StringSplitOptions.RemoveEmptyEntries); String[] req = request.Path.Split(new char[] {'/'}, StringSplitOptions.RemoveEmptyEntries);
@ -291,7 +369,7 @@ namespace IW4MAdmin_Web
IW4MAdmin.file Bans = new IW4MAdmin.file("webfront\\bans.html"); IW4MAdmin.file Bans = new IW4MAdmin.file("webfront\\bans.html");
var bans = Bans.getLines(); var bans = Bans.getLines();
Bans.Close(); Bans.Close();
body = Macro.findMacros((header + bans), page, server, WebFront.Page.bans); body = Macro.findMacros((header + bans + footer), page, server, WebFront.Page.bans);
} }
else if (request.QueryString == "stats") else if (request.QueryString == "stats")
@ -299,7 +377,15 @@ namespace IW4MAdmin_Web
IW4MAdmin.file Stats = new IW4MAdmin.file("webfront\\stats.html"); IW4MAdmin.file Stats = new IW4MAdmin.file("webfront\\stats.html");
var stats = Stats.getLines(); var stats = Stats.getLines();
Stats.Close(); Stats.Close();
body = Macro.findMacros(header + stats, page, server, WebFront.Page.stats); body = Macro.findMacros(header + stats + footer, page, server, WebFront.Page.stats);
}
else if (request.QueryString == "player")
{
IW4MAdmin.file Player = new IW4MAdmin.file("webfront\\player.html");
var player = Player.getLines();
Player.Close();
body = Macro.findMacros(header + player + footer, page, server, WebFront.Page.player);
} }
else else
@ -307,16 +393,11 @@ namespace IW4MAdmin_Web
IW4MAdmin.file Main = new IW4MAdmin.file("webfront\\main.html"); IW4MAdmin.file Main = new IW4MAdmin.file("webfront\\main.html");
var main = Main.getLines(); var main = Main.getLines();
Main.Close(); Main.Close();
body = Macro.findMacros(header + main, 0, server, WebFront.Page.main); body = Macro.findMacros(header + main + footer, 0, server, WebFront.Page.main);
} }
}
/*var body = string.Format( IW4MAdmin.Program.Servers[server].Log.Write("Webfront processed request for " + request.Uri, IW4MAdmin.Log.Level.Debug);
"Uri: {0}\r\nPath: {1}\r\nQuery:{2}\r\nFragment: {3}\r\n", }
request.Uri,
request.Path,
request.QueryString,
request.Fragment);*/
var headers = new HttpResponseHead() var headers = new HttpResponseHead()
{ {

View File

@ -1,5 +1,7 @@
60 60
This server uses ^5IW4M Admin v0.8 ^7get it at ^5raidmax.org This server uses ^5IW4M Admin v0.8 ^7get it at ^5raidmax.org
^5IW4M Admin ^7sees ^5YOU! ^5IW4M Admin ^7sees ^5YOU!
This server has harvested the information of ^5{{TOTALPLAYERS}} ^7players!
Cheaters are ^1unwelcome ^7 on this server Cheaters are ^1unwelcome ^7 on this server
Did you know 8/10 people agree with unverified statistics? Did you know 8/10 people agree with unverified statistics?
^5{{TOTALKILLS}} ^7innocent people having been murdered in this server!

View File

@ -26,10 +26,10 @@ GoTo(target)
} }
Alert(sound) Alert(sound, message)
{ {
self playLocalSound(sound); self playLocalSound(sound);
self iPrintLnBold("New Report!"); self iPrintLnBold(message);
} }
Tell(message, source) Tell(message, source)

View File

@ -66,7 +66,7 @@ processEvent(event)
Player GoTo(Target); Player GoTo(Target);
break; break;
case "alert": case "alert":
Player Alert(Data); Player Alert(Data, "New Notification!");
break; break;
case "tell": case "tell":
Target Tell(Data, Player); Target Tell(Data, Player);

View File

@ -1,3 +1,10 @@
VERSION: 0.9
CHANGELOG:
-webfront now displays player info and link to repz account
-fixed time span issue in webfront
-fixed crash when RCON stops responding and removing a player
-version on footer
VERSION: 0.8.1 VERSION: 0.8.1
CHANGELOG: CHANGELOG:
-no longer have `world` client handle broken events -no longer have `world` client handle broken events
@ -5,4 +12,49 @@ CHANGELOG:
-fixed ban order in webfront -fixed ban order in webfront
-fixed alias output duplicating -fixed alias output duplicating
-fixed missing evade reason -fixed missing evade reason
-cleaned up project files -cleaned up project files
VERSION: 0.8
CHANGELOG:
-added mask command
-added baninfo command
-added alias command and removed redundant output from `find`
-added rcon command
-added webfront (http://127.0.0.1:1624)
-true skill is officially implemented
-find now shows last connect time
-noise on pm (if gsc_enabled)
-force 8 line chat height (if gsc_enabled)
-tell admins the number of reports on join
-enhanced ban tracking
-ip wait timeout added
-remove report on ban
-can't report yourself
-remove reported players when banned
-fixed rare crash with toadmins backend
-fixed crash when finding player stats that don't exist
-fixed a bug that caused owner command to reactivate only `creator` rank player existed
-fixed a bug that caused certain notifications to be sent to all players
-various small fixes
VERSION: 0.7
CHANGELOG:
-rcon tweaks
-so much stuff cant remember
VERSION: 0.6
CHANGELOG:
-stability fixes
-welcome has post-fixed connection indicator
VERSION: 0.5
CHANGELOG:
-close config files after reading oops
-added reload command
-added macros! (Denoted by {{MACRO}} in server config right now only {{WISDOM}} and {{TOTALPLAYERS}})
-added IP's (tracks and rebans new accounts on same banned ip)!
-aliases
-reworked database classes
-heartbeat gives running version
-player banned in find gives last ban reason
-reworked rcon yet again

View File

@ -1,11 +1,6 @@
<body> <body>
<div id="container"> <div id="container">
<div class="h0" style="margin-top: 0; line-height:normal;">BANS<br/><a style="padding: 0; margin: 0; font-size: 24px; float: right;" href="/">Back</a></div> <div class="h0" style="margin-top: 0; line-height:normal;">BANS<br/><a style="padding: 0; margin: 0; font-size: 24px; float: right;" href="/">Back</a></div>
<div id="logo_shit"></div> <div id="logo_shit"></div>
{{BANS}} {{BANS}}
</div> </div>
<div id="footer">IW4M Admin &mdash; <a href="http://raidmax.org/IW4MAdmin">RaidMax.org</a></div>
</body>
</html>

View File

@ -0,0 +1,3 @@
<div id="footer">IW4M Admin v{{VERSION}} &mdash; <a href="http://raidmax.org/IW4MAdmin">RaidMax.org</a></div>
</body>
</html>

View File

@ -97,7 +97,7 @@
} }
tr.row-grey { tr.row-grey {
background-color: #eee; background-color: #ddd;
} }
th th
@ -211,9 +211,9 @@
} }
.server_title { .server_title {
font-size: 24pt; font-size: 20pt;
margin-bottom: 20px; margin-bottom: 20px;
min-width: 550px; min-width: 530px;
} }
.server_info { .server_info {
@ -233,8 +233,10 @@
} }
.players { .players {
width: 60%; width: 40%;
text-align: left; text-align: left;
padding-top: 10px;
padding-bottom 10p;x
} }
.bans { .bans {
@ -271,7 +273,20 @@
.players tbody tr td .players tbody tr td
{ {
padding: 1px; padding: 3px;
}
.player_info{
width: 100%;
vertical-align: top;
text-align: left;
}
.player_info td
{
text-align: left;
vertical-align: top;
padding: 0;
} }
</style> </style>
</head> </head>

View File

@ -6,7 +6,4 @@
<h1 style="margin-top: 0;">Currently Monitoring</h1> <h1 style="margin-top: 0;">Currently Monitoring</h1>
<hr /> <hr />
{{SERVERS}} {{SERVERS}}
</div> </div>
<div id="footer">IW4M Admin &mdash; <a href="http://raidmax.org/IW4MAdmin">RaidMax.org</a></div>
</body>
</html>

View File

@ -0,0 +1,8 @@
<body>
<div id="container">
<div class="h0" style="margin-top: 0; line-height:normal;">PLAYER<br /><a style="padding: 0; margin: 0; font-size: 24px; float: right;" href="/">Back</a></div>
<div id="logo_shit"></div>
<div style="clear:both"></div>
<hr/>
{{PLAYER}}
</div>

View File

@ -3,8 +3,4 @@
<div class="h0" style="margin-top: 0; line-height:normal;">STATS<br /><a style="padding: 0; margin: 0; font-size: 24px; float: right;" href="/">Back</a></div> <div class="h0" style="margin-top: 0; line-height:normal;">STATS<br /><a style="padding: 0; margin: 0; font-size: 24px; float: right;" href="/">Back</a></div>
<div id="logo_shit"></div> <div id="logo_shit"></div>
{{STATS}} {{STATS}}
</div> </div>
<div id="footer">IW4M Admin &mdash; <a href="http://raidmax.org/IW4MAdmin">RaidMax.org</a></div>
</body>
</html>

View File

@ -13,8 +13,8 @@ Global
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{DD5DCDA2-51DB-4B1A-922F-5705546E6115}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DD5DCDA2-51DB-4B1A-922F-5705546E6115}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DD5DCDA2-51DB-4B1A-922F-5705546E6115}.Debug|Any CPU.Build.0 = Debug|Any CPU {DD5DCDA2-51DB-4B1A-922F-5705546E6115}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DD5DCDA2-51DB-4B1A-922F-5705546E6115}.Release|Any CPU.ActiveCfg = Release|Any CPU {DD5DCDA2-51DB-4B1A-922F-5705546E6115}.Release|Any CPU.ActiveCfg = Debug|Any CPU
{DD5DCDA2-51DB-4B1A-922F-5705546E6115}.Release|Any CPU.Build.0 = Release|Any CPU {DD5DCDA2-51DB-4B1A-922F-5705546E6115}.Release|Any CPU.Build.0 = Debug|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE