Removed some files no longer needed, and cleaned up build events to export our nice release build easier.

This commit is contained in:
RaidMax 2015-08-20 12:52:30 -05:00
parent cd85a5c384
commit 73aa001d79
25 changed files with 142 additions and 1124 deletions

View File

@ -1,56 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace IW4MAdmin
{
class Ban
{
public Ban(String Reas, String TargID, String From, DateTime time, String ip)
{
Reason = Reas;
npID = TargID;
bannedByID = From;
When = time;
IP = ip;
}
public String getReason()
{
return Reason;
}
public String getID()
{
return npID;
}
public String getBanner()
{
return bannedByID;
}
public String getIP()
{
return IP;
}
public String getWhen()
{
return When.ToString("MM/dd/yy HH:mm:ss"); ;
}
public DateTime getTime()
{
return When;
}
private String Reason;
private String npID;
private String bannedByID;
private DateTime When;
private String IP;
}
}

View File

@ -33,7 +33,7 @@ namespace IW4MAdmin
E.Origin.Tell("You cannot warn " + E.Target.Name); E.Origin.Tell("You cannot warn " + E.Target.Name);
else else
{ {
E.Target.lastOffense = Utilities.removeWords(E.Data, 1); E.Target.lastOffense = SharedLibrary.Utilities.removeWords(E.Data, 1);
E.Target.Warnings++; E.Target.Warnings++;
String Message = String.Format("^1WARNING ^7[^3{0}^7]: ^3{1}^7, {2}", E.Target.Warnings, E.Target.Name, E.Target.lastOffense); String Message = String.Format("^1WARNING ^7[^3{0}^7]: ^3{1}^7, {2}", E.Target.Warnings, E.Target.Name, E.Target.lastOffense);
E.Owner.Broadcast(Message); E.Owner.Broadcast(Message);
@ -62,7 +62,7 @@ namespace IW4MAdmin
public override void Execute(Event E) public override void Execute(Event E)
{ {
E.Target.lastOffense = Utilities.removeWords(E.Data, 1); E.Target.lastOffense = SharedLibrary.Utilities.removeWords(E.Data, 1);
String Message = "^1Player Kicked: ^5" + E.Target.lastOffense + " ^1Admin: ^5" + E.Origin.Name; String Message = "^1Player Kicked: ^5" + E.Target.lastOffense + " ^1Admin: ^5" + E.Origin.Name;
if (E.Origin.Level > E.Target.Level) if (E.Origin.Level > E.Target.Level)
E.Target.Kick(Message); E.Target.Kick(Message);
@ -87,7 +87,7 @@ namespace IW4MAdmin
public override void Execute(Event E) public override void Execute(Event E)
{ {
E.Target.lastOffense = Utilities.removeWords(E.Data, 1); E.Target.lastOffense = SharedLibrary.Utilities.removeWords(E.Data, 1);
String Message = "^1Player Temporarily Banned: ^5" + E.Target.lastOffense + "^7 (1 hour)"; String Message = "^1Player Temporarily Banned: ^5" + E.Target.lastOffense + "^7 (1 hour)";
if (E.Origin.Level > E.Target.Level) if (E.Origin.Level > E.Target.Level)
E.Target.tempBan(Message); E.Target.tempBan(Message);
@ -102,7 +102,7 @@ namespace IW4MAdmin
public override void Execute(Event E) public override void Execute(Event E)
{ {
E.Target.lastOffense = Utilities.removeWords(E.Data, 1); E.Target.lastOffense = SharedLibrary.Utilities.removeWords(E.Data, 1);
E.Target.lastEvent = E; // needs to be fixed E.Target.lastEvent = E; // needs to be fixed
String Message; String Message;
if (E.Owner.Website == null) if (E.Owner.Website == null)
@ -138,7 +138,7 @@ namespace IW4MAdmin
public override void Execute(Event E) public override void Execute(Event E)
{ {
String You = String.Format("{0} [^3#{1}^7] {2} [^3@{3}^7] [{4}^7] IP: {5}", E.Origin.Name, E.Origin.clientID, E.Origin.npID, E.Origin.databaseID, Utilities.levelToColor(E.Origin.Level), E.Origin.IP); String You = String.Format("{0} [^3#{1}^7] {2} [^3@{3}^7] [{4}^7] IP: {5}", E.Origin.Name, E.Origin.clientID, E.Origin.npID, E.Origin.databaseID, SharedLibrary.Utilities.levelToColor(E.Origin.Level), E.Origin.IP);
E.Origin.Tell(You); E.Origin.Tell(You);
} }
} }
@ -156,7 +156,7 @@ namespace IW4MAdmin
if (P == null) if (P == null)
continue; continue;
E.Origin.Tell(String.Format("[^3{0}^7]{3}[^3{1}^7] {2}", Utilities.levelToColor(P.Level), P.clientID, P.Name, Utilities.getSpaces(Player.Permission.SeniorAdmin.ToString().Length - P.Level.ToString().Length))); E.Origin.Tell(String.Format("[^3{0}^7]{3}[^3{1}^7] {2}", SharedLibrary.Utilities.levelToColor(P.Level), P.clientID, P.Name, SharedLibrary.Utilities.getSpaces(Player.Permission.SeniorAdmin.ToString().Length - P.Level.ToString().Length)));
} }
} }
} }
@ -245,7 +245,7 @@ namespace IW4MAdmin
return; return;
} }
Player.Permission newPerm = Utilities.matchPermission(Utilities.removeWords(E.Data, 1)); Player.Permission newPerm = SharedLibrary.Utilities.matchPermission(SharedLibrary.Utilities.removeWords(E.Data, 1));
if (newPerm > Player.Permission.Banned) if (newPerm > Player.Permission.Banned)
{ {
@ -295,7 +295,7 @@ namespace IW4MAdmin
{ {
if (P != null && P.Level > Player.Permission.Flagged && !P.Masked) if (P != null && P.Level > Player.Permission.Flagged && !P.Masked)
{ {
E.Origin.Tell(String.Format("[^3{0}^7] {1}", Utilities.levelToColor(P.Level), P.Name)); E.Origin.Tell(String.Format("[^3{0}^7] {1}", SharedLibrary.Utilities.levelToColor(P.Level), P.Name));
} }
} }
} }
@ -314,14 +314,14 @@ namespace IW4MAdmin
if (m.Name.ToLower() == newMap || m.Alias.ToLower() == newMap) if (m.Name.ToLower() == newMap || m.Alias.ToLower() == newMap)
{ {
E.Owner.Broadcast("Changing to map ^2" + m.Alias); E.Owner.Broadcast("Changing to map ^2" + m.Alias);
Utilities.Wait(3); SharedLibrary.Utilities.Wait(3);
E.Owner.Map(m.Name); E.Owner.Map(m.Name);
return; return;
} }
} }
E.Owner.Broadcast("Attempting to change to unknown map ^1" + newMap); E.Owner.Broadcast("Attempting to change to unknown map ^1" + newMap);
Utilities.Wait(3); SharedLibrary.Utilities.Wait(3);
E.Owner.Map(newMap); E.Owner.Map(newMap);
} }
} }
@ -342,7 +342,7 @@ namespace IW4MAdmin
foreach (Player P in db_players) foreach (Player P in db_players)
{ {
String mesg = String.Format("[^3{0}^7] [^3@{1}^7] - [{2}^7] - {3} | last seen {4} ago", P.Name, P.databaseID, Utilities.levelToColor(P.Level), P.IP, P.getLastConnection()); String mesg = String.Format("[^3{0}^7] [^3@{1}^7] - [{2}^7] - {3} | last seen {4} ago", P.Name, P.databaseID, SharedLibrary.Utilities.levelToColor(P.Level), P.IP, P.getLastConnection());
E.Origin.Tell(mesg); E.Origin.Tell(mesg);
} }
} }
@ -417,7 +417,7 @@ namespace IW4MAdmin
public override void Execute(Event E) public override void Execute(Event E)
{ {
E.Data = Utilities.removeWords(E.Data, 1); E.Data = SharedLibrary.Utilities.removeWords(E.Data, 1);
E.Target.Alert(); E.Target.Alert();
E.Target.Tell("^1" + E.Origin.Name + " ^3[PM]^7 - " + E.Data); E.Target.Tell("^1" + E.Origin.Name + " ^3[PM]^7 - " + E.Data);
E.Origin.Tell(String.Format("To ^3{0} ^7-> {1}", E.Target.Name, E.Data)); E.Origin.Tell(String.Format("To ^3{0} ^7-> {1}", E.Target.Name, E.Data));
@ -562,7 +562,7 @@ namespace IW4MAdmin
return; return;
} }
E.Data = Utilities.removeWords(E.Data, 1); E.Data = SharedLibrary.Utilities.removeWords(E.Data, 1);
E.Owner.Reports.Add(new Report(E.Target, E.Origin, E.Data)); E.Owner.Reports.Add(new Report(E.Target, E.Origin, E.Data));
E.Origin.Tell("Successfully reported " + E.Target.Name); E.Origin.Tell("Successfully reported " + E.Target.Name);
@ -599,7 +599,7 @@ namespace IW4MAdmin
public override void Execute(Event E) public override void Execute(Event E)
{ {
E.Data = Utilities.removeWords(E.Data, 1); E.Data = SharedLibrary.Utilities.removeWords(E.Data, 1);
E.Origin.currentServer.executeCommand(String.Format("admin_lastevent tell;{0};{1};{2}", E.Origin.npID, E.Target.npID, E.Data)); E.Origin.currentServer.executeCommand(String.Format("admin_lastevent tell;{0};{1};{2}", E.Origin.npID, E.Target.npID, E.Data));
} }
} }

View File

@ -59,6 +59,8 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<GenerateSerializationAssemblies>On</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
<Prefer32Bit>false</Prefer32Bit> <Prefer32Bit>false</Prefer32Bit>
<RunCodeAnalysis>false</RunCodeAnalysis>
<CodeAnalysisIgnoreGeneratedCode>false</CodeAnalysisIgnoreGeneratedCode>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<TargetZone>LocalIntranet</TargetZone> <TargetZone>LocalIntranet</TargetZone>
@ -71,12 +73,11 @@
<ApplicationIcon>IW4MAdmin.ico</ApplicationIcon> <ApplicationIcon>IW4MAdmin.ico</ApplicationIcon>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<StartupObject> <StartupObject>IW4MAdmin.Program</StartupObject>
</StartupObject>
</PropertyGroup> </PropertyGroup>
<PropertyGroup /> <PropertyGroup />
<PropertyGroup> <PropertyGroup>
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent> <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<GenerateManifests>false</GenerateManifests> <GenerateManifests>false</GenerateManifests>
@ -91,11 +92,6 @@
<HintPath>..\packages\Kayak.0.7.2\lib\Kayak.dll</HintPath> <HintPath>..\packages\Kayak.0.7.2\lib\Kayak.dll</HintPath>
<Private>False</Private> <Private>False</Private>
</Reference> </Reference>
<Reference Include="Moserware.Skills, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\Moserware.Skills.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="SharedLibary"> <Reference Include="SharedLibary">
<HintPath>..\SharedLibary\SharedLibary\bin\Debug\SharedLibary.dll</HintPath> <HintPath>..\SharedLibary\SharedLibary\bin\Debug\SharedLibary.dll</HintPath>
<Private>False</Private> <Private>False</Private>
@ -119,13 +115,13 @@
<Compile Include="Main.cs" /> <Compile Include="Main.cs" />
<Compile Include="Manager.cs" /> <Compile Include="Manager.cs" />
<Compile Include="Plugins.cs" /> <Compile Include="Plugins.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Settings.Designer.cs"> <Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen> <AutoGen>True</AutoGen>
<DesignTimeSharedInput>True</DesignTimeSharedInput> <DesignTimeSharedInput>True</DesignTimeSharedInput>
<DependentUpon>Settings.settings</DependentUpon> <DependentUpon>Settings.settings</DependentUpon>
</Compile> </Compile>
<Compile Include="Server.cs" /> <Compile Include="Server.cs" />
<Compile Include="TrueSkill.cs" />
<Compile Include="Utilities.cs" /> <Compile Include="Utilities.cs" />
<Compile Include="WebFront.cs" /> <Compile Include="WebFront.cs" />
<Compile Include="IW4_GameStructs.cs" /> <Compile Include="IW4_GameStructs.cs" />
@ -138,18 +134,15 @@
<None Include="lib\Kayak.dll"> <None Include="lib\Kayak.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
<None Include="lib\Moserware.Skills.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="lib\SQLite.Interop.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="lib\System.Data.SQLite.dll"> <None Include="lib\System.Data.SQLite.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
<Content Include="lib\SharedLibary.dll"> <Content Include="lib\SharedLibary.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="lib\SQLite.Interop.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="plugins\SamplePlugin.dll" /> <Content Include="plugins\SamplePlugin.dll" />
<Content Include="version.txt"> <Content Include="version.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
@ -184,7 +177,9 @@
<Content Include="config\rules.cfg"> <Content Include="config\rules.cfg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<None Include="app.config" /> <None Include="app.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="m2demo\admin\commands.gsc"> <None Include="m2demo\admin\commands.gsc">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
@ -303,13 +298,14 @@
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>
<PostBuildEvent>cd "$(TargetDir)" <PostBuildEvent>cd "$(TargetDir)"
del *.config
del *.application del *.application
del *.pdb del *.pdb
del *.dll del *.dll
del app.config
del *.manifest del *.manifest
del *.rm del *.rm
del *.log</PostBuildEvent> del *.log
xcopy /E /Y "$(ProjectDir)bin\Release" "$(SolutionDir)Release Build"</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

@ -1,60 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace IW4MAdmin
{
class Log
{
public enum Level
{
All,
Debug,
Production,
None,
}
public Log(IFile logf, Level mode, int port)
{
logFile = logf;
logMode = mode;
Port = port;
}
public void Write(String line)
{
Write(line, Level.Debug);
}
public void Write(String line, Level lv)
{
String Line = String.Format("{1} - [{0}]: {2}", Port, getTime(), line);
switch(logMode)
{
case Level.All:
if (lv == Level.All || lv == Level.Debug || lv == Level.Production)
Console.WriteLine(Line);
break;
case Level.Debug:
if (lv == Level.All || lv == Level.Debug)
Console.WriteLine(Line);
break;
case Level.Production:
if (lv == Level.Production)
Console.WriteLine(Line);
break;
}
logFile.Write(Line);
}
private string getTime()
{
return DateTime.Now.ToString("HH:mm:ss");
}
private IFile logFile;
private Level logMode;
private int Port;
}
}

View File

@ -39,11 +39,11 @@ namespace IW4MAdmin
while(!serverManager.isReady()) while(!serverManager.isReady())
{ {
Utilities.Wait(1); SharedLibrary.Utilities.Wait(1);
} }
if (serverManager.getServers() != null) if (serverManager.getServers() != null)
Program.getManager().mainLog.Write("IW4M Now Initialized! Visit http://127.0.0.1:1624 for server overview."); Program.getManager().mainLog.Write("IW4M Now Initialized! Visit http://127.0.0.1:1624 for server overview.", Log.Level.Production);
if (serverManager.getServers().Count > 0) if (serverManager.getServers().Count > 0)
{ {
@ -106,41 +106,5 @@ namespace IW4MAdmin
{ {
return serverManager; return serverManager;
} }
#if DEBUG2
static List<Server> checkConfig()
{
file Config = new file("config\\servers.cfg");
String[] SV_CONF = Config.readAll();
List<Server> Servers = new List<Server>();
Config.Close();
if (SV_CONF == null || SV_CONF.Length < 1 || SV_CONF[0] == String.Empty)
{
setupConfig(); // get our first time server
Config = new file("config\\servers.cfg", true);
Config.Write(IP + ':' + Port + ':' + RCON);
Config.Close();
Servers.Add(new Server(IP, Port, RCON, 0));
}
else
{
foreach (String L in SV_CONF)
{
String[] server_line = L.Split(':');
int newPort;
if (server_line.Length < 3 || !int.TryParse(server_line[1], out newPort))
{
Console.WriteLine("You have an error in your server.cfg");
continue;
}
Servers.Add(new Server(server_line[0], newPort, server_line[2],0));
}
}
return Servers;
}
#endif
} }
} }

View File

@ -22,15 +22,15 @@ namespace IW4MAdmin
{ {
ThreadList = new SortedDictionary<int, Thread>(); ThreadList = new SortedDictionary<int, Thread>();
IFile logFile = new IFile("IW4MAdminManager.log", true); IFile logFile = new IFile("IW4MAdminManager.log", true);
mainLog = new Log(logFile, Log.Level.All, 0); mainLog = new Log(logFile, Log.Level.Production, 0);
} }
public void Init() public void Init()
{ {
while (getCurrentIW4MProcesses().Count == 0) while (getCurrentIW4MProcesses().Count == 0)
{ {
mainLog.Write("No viable IW4M instances detected.", Log.Level.All); mainLog.Write("No viable IW4M instances detected.", Log.Level.Production);
Utilities.Wait(10); SharedLibrary.Utilities.Wait(10);
} }
PluginImporter.Load(); PluginImporter.Load();
@ -69,7 +69,7 @@ namespace IW4MAdmin
Defunct.Join(); Defunct.Join();
ThreadList[S.pID()] = null; ThreadList[S.pID()] = null;
} }
mainLog.Write("Server with PID #" + S.pID() + " no longer appears to be running.", Log.Level.All); mainLog.Write("Server with PID #" + S.pID() + " no longer appears to be running.", Log.Level.Debug);
activePIDs.Remove(S.pID()); activePIDs.Remove(S.pID());
defunctServers.Add(S); defunctServers.Add(S);
} }
@ -81,7 +81,7 @@ namespace IW4MAdmin
defunctServers = null; defunctServers = null;
scanForNewServers(); scanForNewServers();
Utilities.Wait(5); SharedLibrary.Utilities.Wait(5);
} }
mainLog.Write("Manager shutting down..."); mainLog.Write("Manager shutting down...");
@ -130,7 +130,7 @@ namespace IW4MAdmin
Servers.Add(S); Servers.Add(S);
Thread IW4MServerThread = new Thread(S.Monitor); Thread IW4MServerThread = new Thread(S.Monitor);
ThreadList.Add(pID, IW4MServerThread); ThreadList.Add(pID, IW4MServerThread);
mainLog.Write("New server detected on port " + S.getPort(), Log.Level.All); mainLog.Write("New server detected on port " + S.getPort(), Log.Level.Production);
IW4MServerThread.Start(); IW4MServerThread.Start();
} }
} }
@ -209,14 +209,14 @@ namespace IW4MAdmin
{ {
int sv_runningPtr = Utilities.getIntFromPointer(0x1AD7934, (int)Handle) + 0x10; // where the dvar_t struct is stored + the offset for current value int sv_runningPtr = Utilities.getIntFromPointer(0x1AD7934, (int)Handle) + 0x10; // where the dvar_t struct is stored + the offset for current value
sv_running = Utilities.getBoolFromPointer(sv_runningPtr, (int)Handle); sv_running = Utilities.getBoolFromPointer(sv_runningPtr, (int)Handle);
Utilities.Wait(1); SharedLibrary.Utilities.Wait(1);
timeWaiting++; timeWaiting++;
if (timeWaiting > 30) // don't want to get stuck waiting forever if the server is frozen if (timeWaiting > 30) // don't want to get stuck waiting forever if the server is frozen
return null; return null;
} }
Utilities.Wait(5); SharedLibrary.Utilities.Wait(2);
dvar net_ip = Utilities.getDvarOld(0x64A1DF8, (int)Handle); dvar net_ip = Utilities.getDvarOld(0x64A1DF8, (int)Handle);
dvar net_port = Utilities.getDvarOld(0x64A3004, (int)Handle); dvar net_port = Utilities.getDvarOld(0x64A3004, (int)Handle);

View File

@ -1,18 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace IW4MAdmin
{
class Map
{
public Map(String N, String A)
{
Name = N;
Alias = A;
}
public String Name;
public String Alias;
}
}

View File

@ -1,294 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace IW4MAdmin
{
class Stats
{
public Stats(int n, int K, int D, double kdr, double skill, double mean, double dev)
{
statIndex = n;
Kills = K;
Deaths = D;
KDR = Math.Round(kdr,2);
Rating = new Moserware.Skills.Rating(mean, dev);
Skill = Math.Round(Rating.ConservativeRating, 3)*10;
}
public void updateKDR()
{
int tempDeaths = Deaths; // cuz we don't want undefined!
if (Deaths == 0)
tempDeaths = 1;
KDR = Math.Round((double)((double)Kills / (double)tempDeaths), 2);
}
public int Kills;
public int Deaths;
public double KDR;
public double Skill;
public int statIndex;
public Moserware.Skills.Rating Rating;
}
class Aliases
{
public Aliases(int Num, String N, String I)
{
Number = Num;
Names = N;
IPS = I;
}
public List<String> getNames()
{
return new List<String>(Names.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries));
}
public List<String> getIPS()
{
return new List<String>(IPS.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries));
}
public String getIPSDB()
{
return IPS;
}
public String getNamesDB()
{
return Names;
}
public int getNumber()
{
return Number;
}
public void addName(String Name)
{
if (Name.Trim() != String.Empty && Name != null)
Names += ';' + Name;
}
public void addIP(String IP)
{
if (IP.Trim() != String.Empty && IP != null)
IPS += ';' + IP;
}
private String Names;
private String IPS;
private int Number;
}
class Player
{
public enum Permission
{
Banned = -1,
User = 0,
Flagged = 1,
Moderator = 2,
Administrator = 3,
SeniorAdmin = 4,
Owner = 5,
Creator = 6,
}
public Player(string n, string id, int num, int l)
{
Name = n;
npID = id;
Number = num;
Level = (Player.Permission)l;
LastOffense = String.Empty;
Connections = 0;
IP = "";
Warnings = 0;
Alias = new Aliases(0, "", "");
stats = new Stats(0, 0, 0, 0, Moserware.Skills.GameInfo.DefaultGameInfo.DefaultRating.ConservativeRating, Moserware.Skills.GameInfo.DefaultGameInfo.DefaultRating.Mean, Moserware.Skills.GameInfo.DefaultGameInfo.DefaultRating.StandardDeviation);
LastConnection = DateTime.Now;
}
public Player(string n, string id, int num, String I)
{
Name = n;
npID = id;
Number = num;
IP = I;
LastConnection = DateTime.Now;
}
public Player(string n, string id, Player.Permission P, String I)
{
Name = n;
npID = id;
Level = P;
IP = I;
}
public Player(string n, string id, int num, Player.Permission l, int cind, String lo, int con, String IP2)
{
Name = n;
npID = id;
Number = num;
Level = l;
dbID = cind;
if (lo == null)
LastOffense = String.Empty;
else
LastOffense = lo;
Connections = con;
IP = IP2;
Warnings = 0;
Masked = false;
LastConnection = DateTime.Now;
}
public Player(string n, string id, int num, Player.Permission l, int cind, String lo, int con, String IP2, DateTime LC)
{
Name = n;
npID = id;
Number = num;
Level = l;
dbID = cind;
if (lo == null)
LastOffense = String.Empty;
else
LastOffense = lo;
Connections = con;
IP = IP2;
Warnings = 0;
Masked = false;
LastConnection = LC;
}
public String getName()
{
return Name;
}
public String getID()
{
return npID;
}
public int getDBID()
{
return dbID;
}
public int getClientNum()
{
return Number;
}
public Player.Permission getLevel()
{
return Level;
}
public int getConnections()
{
return Connections;
}
public String getLastO()
{
return LastOffense;
}
public String getIP()
{
return IP;
}
public String getLastConnection()
{
return Utilities.timePassed(LastConnection);
}
public void updateName(String n)
{
if (n.Trim() != String.Empty)
Name = n;
}
public void updateIP(String I)
{
IP = I;
}
// BECAUSE IT NEEDS TO BE CHANGED!
public void setLevel(Player.Permission Perm)
{
Level = Perm;
}
public void Tell(String Message)
{
lastEvent.Owner.Tell(Message, this);
}
public void Warn(String Message)
{
lastEvent.Owner.Broadcast(Message);
}
public void Kick(String Message)
{
lastEvent.Owner.Kick(Message, this);
}
public void tempBan(String Message)
{
lastEvent.Owner.tempBan(Message, this);
}
public void Ban(String Message, Player Sender)
{
lastEvent.Owner.Ban(Message, this, Sender);
}
public void Alert()
{
lastEvent.Owner.Alert(this);
}
//should be moved to utils
public Player findPlayer(String Nme)
{
foreach (Player P in lastEvent.Owner.getPlayers())
{
if (P == null)
continue;
if (P.getName().ToLower().Contains(Name.ToLower()))
return P;
}
return null;
}
private string Name;
private string npID;
private int Number;
private Player.Permission Level;
private int dbID;
public int Connections;
private String IP;
private DateTime LastConnection;
public Event lastEvent;
public String LastOffense;
public int Warnings;
public Stats stats;
public Aliases Alias;
public bool Masked;
}
}

View File

@ -21,13 +21,13 @@ namespace IW4MAdmin
else else
{ {
Program.getManager().mainLog.Write("Plugin folder does not exist!", Log.Level.Debug); Program.getManager().mainLog.Write("Plugin folder does not exist!", Log.Level.All);
return false; return false;
} }
if (dllFileNames == null || dllFileNames.Length == 0) if (dllFileNames == null || dllFileNames.Length == 0)
{ {
Program.getManager().mainLog.Write("No plugins to load", Log.Level.Debug); Program.getManager().mainLog.Write("No plugins to load", Log.Level.All);
return true; return true;
} }
@ -51,10 +51,10 @@ namespace IW4MAdmin
Object commandObject = Activator.CreateInstance(assemblyType); Object commandObject = Activator.CreateInstance(assemblyType);
Command newCommand = (Command)commandObject; Command newCommand = (Command)commandObject;
potentialPlugins.Add(newCommand); potentialPlugins.Add(newCommand);
Program.getManager().mainLog.Write("Loaded command plugin \"" + newCommand.Name + "\"", Log.Level.Debug); Program.getManager().mainLog.Write("Loaded command plugin \"" + newCommand.Name + "\"", Log.Level.All);
} }
else else
Program.getManager().mainLog.Write("Ignoring invalid command plugin \"" + assemblyType.Name + "\"", Log.Level.Debug); Program.getManager().mainLog.Write("Ignoring invalid command plugin \"" + assemblyType.Name + "\"", Log.Level.All);
} }
} }
} }

View File

@ -7,11 +7,11 @@ using System.Resources;
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
// associated with an assembly. // associated with an assembly.
[assembly: AssemblyTitle("IW4M Admin")] [assembly: AssemblyTitle("IW4M Admin")]
[assembly: AssemblyDescription("Admin for IW4x projects")] [assembly: AssemblyDescription("Server admin for your IW4M Servers")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("RaidMax LLC")] [assembly: AssemblyCompany("RaidMax LLC")]
[assembly: AssemblyProduct("")] [assembly: AssemblyProduct("")]
[assembly: AssemblyCopyright("© 2015")] [assembly: AssemblyCopyright("2015")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
@ -33,5 +33,5 @@ using System.Resources;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.8.1")] [assembly: AssemblyVersion("0.9.5")]
[assembly: NeutralResourcesLanguageAttribute("en")] [assembly: NeutralResourcesLanguageAttribute("en")]

View File

@ -1,156 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
//DILEMMA -- Seperate intance of RCON for each server or no?
namespace IW4MAdmin
{
class RCON
{
enum Type
{
Query,
Execute,
}
public RCON(Server I)
{
//sv_connection = new UdpClient();
// sv_connection.Client.SendTimeout = 1000;
//sv_connection.Client.ReceiveTimeout = 1000;
Instance = I;
toSend = new Queue<RCON_Request>();
}
//We want to read the reponse
public String[] responseSendRCON(String message)
{
return null;
/* try
{
String STR_REQUEST = String.Empty;
if (message != "getstatus")
STR_REQUEST = String.Format("ÿÿÿÿrcon {0} {1}", Instance.getPassword(), message);
else
STR_REQUEST = String.Format("ÿÿÿÿ getstatus");
Byte[] Request_ = Encoding.Unicode.GetBytes(STR_REQUEST);
Byte[] Request = new Byte[Request_.Length/2];
int count = 0; //This is kinda hacky but Unicode -> ASCII doesn't seem to be working correctly for this.
foreach (Byte b in Request_)
{
if (b != 0)
Request[count/2] = b;
count++;
}
System.Net.IPAddress IP = System.Net.IPAddress.Parse(Instance.getIP());
IPEndPoint endPoint = new IPEndPoint(IP, Instance.getPort());
sv_connection.Connect(endPoint);
sv_connection.Send(Request, Request.Length);
String incoming = String.Empty;
byte[] bufferRecv = new byte[65536];
do
{
// loop on receiving the bytes
bufferRecv = sv_connection.Receive(ref endPoint);
// only decode the bytes received
incoming += (Encoding.ASCII.GetString(bufferRecv, 0, bufferRecv.Length));
} while (sv_connection.Available > 0);
int num = int.Parse("0a", System.Globalization.NumberStyles.AllowHexSpecifier);
String[] response = incoming.Split(new char[] {(char)num} , StringSplitOptions.RemoveEmptyEntries);
if(response[1] == "Invalid password.")
{
Instance.Log.Write("Invalid RCON password specified", Log.Level.Debug);
return null;
}
return response;
}
catch (SocketException)
{
Instance.Log.Write("Unable to reach server for sending RCON", Log.Level.Debug);
return null;
}
catch (System.InvalidOperationException)
{
Instance.Log.Write("RCON Connection terminated by server. Uh-OH", Log.Level.Debug);
sv_connection.Close();
sv_connection = new UdpClient();
return null;
}*/
}
public String[] addRCON(String Message)
{
RCON_Request newReq = new RCON_Request(Message);
toSend.Enqueue(newReq);
return newReq.waitForResponse();
}
public void Reset()
{
sv_connection.Close();
sv_connection = new UdpClient();
}
public void ManageRCONQueue()
{
while (Instance.isRunning)
{
if (toSend.Count > 0)
{
RCON_Request Current = toSend.Peek();
//Current.Response = responseSendRCON(Current.Request);
Utilities.executeCommand(Instance.pID(), Current.Request, Instance.lastCommandPointer);
toSend.Dequeue();
//Utilities.Wait(0.567);
Utilities.Wait(.3);
}
else
Utilities.Wait(0.01);
}
}
private UdpClient sv_connection;
private Server Instance;
private Queue<RCON_Request> toSend;
}
class RCON_Request
{
public RCON_Request(String IN)
{
Request = IN;
Response = null;
}
public String[] waitForResponse()
{
DateTime Start = DateTime.Now;
DateTime Current = DateTime.Now;
while (Response == null && (Current-Start).TotalMilliseconds < 1000)
{
Thread.Sleep(1);
Current = DateTime.Now;
}
return Response;
}
public String Request;
public String[] Response;
}
}

View File

@ -1,20 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace IW4MAdmin
{
class Report
{
public Report(Player T, Player O, String R)
{
Target = T;
Origin = O;
Reason = R;
}
public Player Target { get; private set; }
public Player Origin { get; private set; }
public String Reason { get; private set; }
}
}

View File

@ -12,8 +12,6 @@ namespace IW4MAdmin
{ {
class IW4MServer : SharedLibrary.Server class IW4MServer : SharedLibrary.Server
{ {
const int FLOOD_TIMEOUT = 300;
public IW4MServer(string address, int port, string password, int H, int PID) : base(address, port, password, H, PID) public IW4MServer(string address, int port, string password, int H, int PID) : base(address, port, password, H, PID)
{ {
playerHistory = new Queue<pHistory>(); playerHistory = new Queue<pHistory>();
@ -194,7 +192,7 @@ namespace IW4MAdmin
players[NewPlayer.clientID] = NewPlayer; players[NewPlayer.clientID] = NewPlayer;
} }
#if DEBUG == FALSE #if DEBUG == FALSE
NewPlayer.Tell("Welcome ^5" + NewPlayer.Name + " ^7this is your ^5" + Utilities.timesConnected(NewPlayer.Connections) + " ^7time connecting!"); NewPlayer.Tell("Welcome ^5" + NewPlayer.Name + " ^7this is your ^5" + SharedLibrary.Utilities.timesConnected(NewPlayer.Connections) + " ^7time connecting!");
#endif #endif
Log.Write("Client " + NewPlayer.Name + " connecting...", Log.Level.Debug); // they're clean Log.Write("Client " + NewPlayer.Name + " connecting...", Log.Level.Debug); // they're clean
@ -326,8 +324,14 @@ namespace IW4MAdmin
//Procses requested command correlating to an event //Procses requested command correlating to an event
override public Command processCommand(Event E, Command C) override public Command processCommand(Event E, Command C)
{ {
E.Data = Utilities.removeWords(E.Data, 1); E.Data = SharedLibrary.Utilities.removeWords(E.Data, 1);
String[] Args = E.Data.Trim().Split(' '); String[] Args = E.Data.Trim().Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
if (E.Origin.Level < C.Permission)
{
E.Origin.Tell("You do not have access to that command!");
return null;
}
if (Args.Length < (C.requiredArgNum)) if (Args.Length < (C.requiredArgNum))
{ {
@ -335,12 +339,6 @@ namespace IW4MAdmin
return null; return null;
} }
if(E.Origin.Level < C.Permission)
{
E.Origin.Tell("You do not have access to that command!");
return null;
}
if (C.needsTarget) if (C.needsTarget)
{ {
int cNum = -1; int cNum = -1;
@ -407,6 +405,18 @@ namespace IW4MAdmin
[DllImport("kernel32.dll")] [DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead); public static extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);
private void manageEventQueue()
{
while(isRunning)
{
if (events.Count > 0)
processEvent(events.Dequeue());
if (commandQueue.Count > 0)
lastCommandPointer = Utilities.executeCommand(PID, commandQueue.Dequeue(), lastCommandPointer);
Thread.Sleep(350);
}
}
//Starts the monitoring process //Starts the monitoring process
override public void Monitor() override public void Monitor()
{ {
@ -419,6 +429,10 @@ namespace IW4MAdmin
return; return;
} }
Thread eventQueueThread = new Thread(new ThreadStart(manageEventQueue));
eventQueueThread.Name = "Event Queue Manager";
eventQueueThread.Start();
long l_size = -1; long l_size = -1;
bool checkedForOutdate = false; bool checkedForOutdate = false;
String[] lines = new String[8]; String[] lines = new String[8];
@ -451,7 +465,7 @@ namespace IW4MAdmin
if(lastMessage.TotalSeconds > messageTime && messages.Count > 0) if(lastMessage.TotalSeconds > messageTime && messages.Count > 0)
{ {
initMacros(); // somethings dynamically change so we have to re-init the dictionary initMacros(); // somethings dynamically change so we have to re-init the dictionary
Broadcast(Utilities.processMacro(Macros, messages[nextMessage])); Broadcast(SharedLibrary.Utilities.processMacro(Macros, messages[nextMessage]));
if (nextMessage == (messages.Count - 1)) if (nextMessage == (messages.Count - 1))
nextMessage = 0; nextMessage = 0;
else else
@ -490,7 +504,7 @@ namespace IW4MAdmin
else if (eachClient.state == 5 ) else if (eachClient.state == 5 )
{ {
addPlayer(new Player(Utilities.stripColors(Utilities.cleanChars(eachClient.name)), eachClient.steamid.ToString("x16"), i, 0, i, null, 0, Helpers.NET_AdrToString(eachClient.adr).Split(':')[0])); addPlayer(new Player(SharedLibrary.Utilities.stripColors(SharedLibrary.Utilities.cleanChars(eachClient.name)), eachClient.steamid.ToString("x16"), i, 0, i, null, 0, Helpers.NET_AdrToString(eachClient.adr).Split(':')[0]));
activeClients++; activeClients++;
} }
} }
@ -533,7 +547,7 @@ namespace IW4MAdmin
event_.Origin.lastEvent = event_; event_.Origin.lastEvent = event_;
event_.Origin.lastEvent.Owner = this; event_.Origin.lastEvent.Owner = this;
processEvent(event_); events.Enqueue(event_);
} }
} }
@ -542,20 +556,19 @@ namespace IW4MAdmin
} }
oldLines = lines; oldLines = lines;
l_size = logFile.getSize(); l_size = logFile.getSize();
if (commandQueue.Count > 0) Thread.Sleep(350);
lastCommandPointer = Utilities.executeCommand(PID, commandQueue.Dequeue(), lastCommandPointer);
Thread.Sleep(150);
} }
#if DEBUG == false #if DEBUG == false
catch (Exception E) catch (Exception E)
{ {
Log.Write("Something unexpected occured. Hopefully we can ignore it - " + E.Message + " @" + Utilities.GetLineNumber(E), Log.Level.All); Log.Write("Something unexpected occured. Hopefully we can ignore it :)", Log.Level.All);
continue; continue;
} }
#endif #endif
} }
isRunning = false; isRunning = false;
eventQueueThread.Join();
} }
override public bool intializeBasics() override public bool intializeBasics()
@ -570,7 +583,7 @@ namespace IW4MAdmin
} }
// basic info dvars // basic info dvars
hostname = Utilities.stripColors(getDvar("sv_hostname").current); hostname = SharedLibrary.Utilities.stripColors(getDvar("sv_hostname").current);
mapname = getDvar("mapname").current; mapname = getDvar("mapname").current;
IW_Ver = getDvar("shortversion").current; IW_Ver = getDvar("shortversion").current;
maxClients = -1; maxClients = -1;
@ -721,7 +734,7 @@ namespace IW4MAdmin
if (E.Data.Substring(0, 1) != "!") // Not a command so who gives an F? if (E.Data.Substring(0, 1) != "!") // Not a command so who gives an F?
{ {
E.Data = Utilities.stripColors(Utilities.cleanChars(E.Data)); E.Data = SharedLibrary.Utilities.stripColors(SharedLibrary.Utilities.cleanChars(E.Data));
if (E.Data.Length > 50) if (E.Data.Length > 50)
E.Data = E.Data.Substring(0, 50) + "..."; E.Data = E.Data.Substring(0, 50) + "...";
while (chatHistory.Count > Math.Ceiling((double)clientnum/2)) while (chatHistory.Count > Math.Ceiling((double)clientnum/2))

View File

@ -1,39 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
using Moserware.Skills.TrueSkill;
using IW4MAdmin;
using SharedLibrary;
namespace Moserware
{
class TrueSkill
{
public TrueSkill()
{
calculator = new TwoPlayerTrueSkillCalculator();
gInfo = Skills.GameInfo.DefaultGameInfo;
}
public void updateNewSkill(Player P1, Player P2)
{
/* var player1 = new Skills.Player(P1.databaseID);
var player2 = new Skills.Player(P2.databaseID);
var team1 = new Skills.Team(player1, P1.stats.Rating);
var team2 = new Skills.Team(player2, P2.stats.Rating);
var newRatings = calculator.CalculateNewRatings(gInfo, Skills.Teams.Concat(team1, team2), 1, 2);
P1.stats.Rating = newRatings[player1];
P2.stats.Rating = newRatings[player2];
P1.stats.Skill = Math.Round(P1.stats.Rating.ConservativeRating, 3)*10;
P2.stats.Skill = Math.Round(P2.stats.Rating.ConservativeRating, 3)*10;*/
}
private Skills.SkillCalculator calculator;
public Skills.GameInfo gInfo;
}
}

View File

@ -11,314 +11,6 @@ namespace IW4MAdmin
{ {
class Utilities class Utilities
{ {
//Get string with specified number of spaces -- really only for visual output
public static String getSpaces(int Num)
{
String SpaceString = String.Empty;
while (Num > 0)
{
SpaceString += ' ';
Num--;
}
return SpaceString;
}
//Sleep for x amount of seconds
public static void Wait(double time)
{
Thread.Sleep((int)Math.Ceiling(time*1000));
}
//Remove words from a space delimited string
public static String removeWords(String str, int num)
{
String newStr = String.Empty;
String[] tmp = str.Split(' ');
for (int i = 0; i < tmp.Length; i++)
{
if (i >= num)
newStr += tmp[i] + ' ';
}
return newStr;
}
public static Player.Permission matchPermission(String str)
{
String lookingFor = str.ToLower();
for (Player.Permission Perm = Player.Permission.User; Perm < Player.Permission.Owner; Perm++)
{
if (lookingFor.Contains(Perm.ToString().ToLower()))
return Perm;
}
return Player.Permission.Banned;
}
public static String removeNastyChars(String str)
{
if (str != null)
return str.Replace("`", "").Replace("\\", "").Replace("\"", "").Replace("&quot;", "''").Replace("&amp;", "&").Replace("\"", "''");
else
return String.Empty;
}
public static int GetLineNumber(Exception ex)
{
var lineNumber = 0;
const string lineSearch = ":line ";
var index = ex.StackTrace.LastIndexOf(lineSearch);
if (index != -1)
{
var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length);
if (int.TryParse(lineNumberText, out lineNumber))
{
}
}
return lineNumber;
}
public static String cleanChars(String S)
{
StringBuilder Cleaned = new StringBuilder();
foreach (char c in S)
if (c < 127 && c > 31 && c != 37 && c != 34 && c != 92) Cleaned.Append(c);
return Cleaned.ToString();
}
public static String stripColors(String str)
{
if (str == null)
return "";
return Regex.Replace(str, @"\^[0-9]", "");
}
public static String levelToColor(Player.Permission level)
{
switch (level)
{
case Player.Permission.Banned:
return "^1" + Player.Permission.Banned;
case Player.Permission.Flagged:
return "^0" + Player.Permission.Flagged;
case Player.Permission.Owner:
return "^5" + Player.Permission.Owner;
case Player.Permission.User:
return "^2" + Player.Permission.User;
default:
return "^3" + level;
}
}
public static String processMacro(Dictionary<String, Object> Dict, String str)
{
MatchCollection Found = Regex.Matches(str, @"\{\{[A-Z]+\}\}", RegexOptions.IgnoreCase);
foreach (Match M in Found)
{
String Match = M.Value;
String Identifier = M.Value.Substring(2, M.Length - 4);
String Replacement = Dict[Identifier].ToString();
str = str.Replace(Match, Replacement);
}
return str;
}
public static Dictionary<String, String> IPFromStatus(String[] players)
{
Dictionary<String, String> Dict = new Dictionary<String, String>();
if (players == null)
return null;
foreach (String S in players)
{
String S2 = S.Trim();
if (S.Length < 50)
continue;
if (Regex.Matches(S2, @"\d+$", RegexOptions.IgnoreCase).Count > 0)
{
String[] eachPlayer = S2.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 3; i < eachPlayer.Length; i++ )
{
if (eachPlayer[i].Split(':').Length > 1)
{
Dict.Add(eachPlayer[3], eachPlayer[i].Split(':')[0]);
break;
}
}
}
}
return Dict;
}
public static String nameHTMLFormatted(Player P)
{
switch (P.Level)
{
case Player.Permission.User:
return "<span style='color:rgb(87, 150, 66)'>" + P.Name+ "</span>";
case Player.Permission.Moderator:
return "<span style='color:#e7b402'>" + P.Name+ "</span>";
case Player.Permission.Administrator:
return "<span style='color:#ec82de'>" + P.Name+ "</span>";
case Player.Permission.SeniorAdmin:
return "<span style='color:#2eb6bf'>" + P.Name+ "</span>";
case Player.Permission.Owner:
return "<span style='color:rgb(38,120,230)'>" + P.Name+ "</span>";
case Player.Permission.Creator:
return "<span style='color:rgb(38,120,230)'>" + P.Name+ "</span>";
case Player.Permission.Banned:
return "<span style='color:rgb(196, 22, 28)'>" + P.Name+ "</span>";
case Player.Permission.Flagged:
return "<span style='color:rgb(251, 124, 98)'>" + P.Name+ "</span>";
default:
return "<i>" + P.Name+ "</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)
{
switch (input)
{
case "dm":
return "Deathmatch";
case "war":
return "Team Deathmatch";
case "koth":
return "Headquarters";
case "ctf":
return "Capture The Flag";
case "dd":
return "Demolition";
case "dom":
return "Domination";
case "sab":
return "Sabotage";
case "sd":
return "Search & Destroy";
case "vip":
return "Very Important Person";
case "gtnw":
return "Global Thermonuclear War";
case "oitc":
return "One In The Chamber";
case "arena":
return "Arena";
case "dzone":
return "Drop Zone";
case "gg":
return "Gun Game";
case "snipe":
return "Sniping";
case "ss":
return "Sharp Shooter";
case "m40a3":
return "M40A3";
case "fo":
return "Face Off";
case "dmc":
return "Deathmatch Classic";
case "killcon":
return "Kill Confirmed";
case "oneflag":
return "One Flag CTF";
default:
return "Unknown";
}
}
public static Dictionary<String, Player> playersFromStatus(String[] Status)
{
Dictionary<String, Player> playerDictionary = new Dictionary<String, Player>();
if (Status == null) // looks like we didn't get a proper response
return null;
foreach (String S in Status)
{
String responseLine = S.Trim();
if (Regex.Matches(responseLine, @"\d+$", RegexOptions.IgnoreCase).Count > 0 && responseLine.Length > 92) // its a client line!
{
String[] playerInfo = responseLine.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
int cID = -1;
String cName = stripColors(responseLine.Substring(46, 18)).Trim();
String npID = responseLine.Substring(29, 17).Trim(); // DONT TOUCH PLZ
int.TryParse(playerInfo[0], out cID);
String cIP = responseLine.Substring(72,20).Trim().Split(':')[0];
Player P = new Player(cName, npID, cID, cIP);
try
{
playerDictionary.Add(npID, P);
}
catch(Exception E)
{
/// need to handle eventually
Program.getManager().mainLog.Write("Error handling player add -- " + E.Message);
continue;
}
}
}
return playerDictionary;
}
public static String DateTimeSQLite(DateTime datetime)
{
string dateTimeFormat = "{0}-{1}-{2} {3}:{4}:{5}.{6}";
return string.Format(dateTimeFormat, datetime.Year, datetime.Month, datetime.Day, datetime.Hour, datetime.Minute, datetime.Second, datetime.Millisecond);
}
public static String timePassed(DateTime start)
{
TimeSpan Elapsed = DateTime.Now - start;
if (Elapsed.TotalMinutes < 120)
return Math.Round(Elapsed.TotalMinutes, 0) + " minutes";
if (Elapsed.TotalHours <= 24)
return Math.Round(Elapsed.TotalHours, 0) + " hours";
if (Elapsed.TotalDays <= 365)
return Math.Round(Elapsed.TotalDays, 0) + " days";
else
return "a very long time";
}
const int PROCESS_CREATE_THREAD = 0x0002; const int PROCESS_CREATE_THREAD = 0x0002;
const int PROCESS_QUERY_INFORMATION = 0x0400; const int PROCESS_QUERY_INFORMATION = 0x0400;
const int PROCESS_VM_OPERATION = 0x0008; const int PROCESS_VM_OPERATION = 0x0008;
@ -400,7 +92,7 @@ namespace IW4MAdmin
[DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)] [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName); static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)] [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
static extern IntPtr GetModuleHandle(string lpModuleName); static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("kernel32.dll", SetLastError = true)] [DllImport("kernel32.dll", SetLastError = true)]
@ -514,7 +206,7 @@ namespace IW4MAdmin
ReadProcessMemory(Handle, Location, Buff, Buff.Length, ref numberRead); ReadProcessMemory(Handle, Location, Buff, Buff.Length, ref numberRead);
StringBuilder str = new StringBuilder(); StringBuilder str = new StringBuilder();
for ( int i = 0; i < Buff.Length; i++) for (int i = 0; i < Buff.Length; i++)
{ {
if (Buff[i] == 0) if (Buff[i] == 0)
break; break;
@ -596,7 +288,7 @@ namespace IW4MAdmin
} }
} }
IntPtr memoryForDvarName = allocateAndWrite(Encoding.ASCII.GetBytes(Command + "\0"), ProcessHandle); // this gets disposed next call IntPtr memoryForDvarName = allocateAndWrite(Encoding.ASCII.GetBytes(Command + "\0"), ProcessHandle); // this gets disposed next call
if (memoryForDvarName == IntPtr.Zero) if (memoryForDvarName == IntPtr.Zero)
{ {
@ -707,8 +399,8 @@ namespace IW4MAdmin
{ {
if (Pointer != IntPtr.Zero) if (Pointer != IntPtr.Zero)
{ {
// if (!VirtualFreeEx(ProcessHandle, Pointer, 0, AllocationType.Release)) // if (!VirtualFreeEx(ProcessHandle, Pointer, 0, AllocationType.Release))
// Program.getManager().mainLog.Write("Virtual Free Failed During Exit Cleanup -- Error #" + Marshal.GetLastWin32Error()); // Program.getManager().mainLog.Write("Virtual Free Failed During Exit Cleanup -- Error #" + Marshal.GetLastWin32Error());
} }
} }
@ -717,7 +409,7 @@ namespace IW4MAdmin
#endif #endif
return true; return true;
} }
///////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////
public static Boolean initalizeInterface(int pID) public static Boolean initalizeInterface(int pID)
{ {
@ -804,8 +496,8 @@ namespace IW4MAdmin
public static dvar getDvar(int pID, String DVAR, IntPtr lastMemoryLocation) public static dvar getDvar(int pID, String DVAR, IntPtr lastMemoryLocation)
{ {
dvar requestedDvar = new dvar(); dvar requestedDvar = new dvar();
IntPtr ProcessHandle = OpenProcess(ProcessAccessFlags.All, false, pID); IntPtr ProcessHandle = OpenProcess(ProcessAccessFlags.All, false, pID);
if (lastMemoryLocation != IntPtr.Zero) if (lastMemoryLocation != IntPtr.Zero)
{ {
@ -813,7 +505,7 @@ namespace IW4MAdmin
Program.getManager().mainLog.Write("Virtual free failed during cleanup-- Error #" + Marshal.GetLastWin32Error(), Log.Level.Debug); Program.getManager().mainLog.Write("Virtual free failed during cleanup-- Error #" + Marshal.GetLastWin32Error(), Log.Level.Debug);
} }
IntPtr memoryForDvarName = allocateAndWrite(Encoding.ASCII.GetBytes(DVAR + "\0"), ProcessHandle); IntPtr memoryForDvarName = allocateAndWrite(Encoding.ASCII.GetBytes(DVAR + "\0"), ProcessHandle);
if (memoryForDvarName == IntPtr.Zero) if (memoryForDvarName == IntPtr.Zero)
{ {
@ -865,46 +557,5 @@ namespace IW4MAdmin
return requestedDvar; return requestedDvar;
} }
public static String timesConnected(int connection)
{
String Prefix = String.Empty;
if (connection % 10 > 3 || connection % 10 == 0 || (connection % 100 > 9 && connection % 100 < 19))
Prefix = "th";
else
{
switch (connection % 10)
{
case 1:
Prefix = "st";
break;
case 2:
Prefix = "nd";
break;
case 3:
Prefix = "rd";
break;
}
}
switch (connection)
{
case 0:
case 1:
return "first";
case 2:
return "second";
case 3:
return "third";
case 4:
return "fourth";
case 5:
return "fifth";
case 100:
return "One-Hundreth (amazing!)";
default:
return connection.ToString() + Prefix;
}
}
} }
} }

View File

@ -128,7 +128,7 @@ namespace IW4MAdmin_Web
} }
} }
players.AppendFormat("<td><a href='/{0}/{1}/userip/?player'>{2}</a></td>", i, P.databaseID, Utilities.nameHTMLFormatted(P)); players.AppendFormat("<td><a href='/{0}/{1}/userip/?player'>{2}</a></td>", i, P.databaseID, SharedLibrary.Utilities.nameHTMLFormatted(P));
if (count % 2 != 0) if (count % 2 != 0)
{ {
@ -153,7 +153,7 @@ namespace IW4MAdmin_Web
<table cellpadding='0' cellspacing='0' class='players'> <table cellpadding='0' cellspacing='0' class='players'>
{5} {5}
</table>", </table>",
Servers[i].getName(), Servers[i].getMap(), Servers[i].getClientNum() + "/" + Servers[i].getMaxClients(), Utilities.gametypeLocalized(Servers[i].getGametype()), i, players.ToString()); Servers[i].getName(), Servers[i].getMap(), Servers[i].getClientNum() + "/" + Servers[i].getMaxClients(), SharedLibrary.Utilities.gametypeLocalized(Servers[i].getGametype()), i, players.ToString());
buffer.AppendFormat("<div class='chatHistory' id='chatHistory_{0}'></div><script type='text/javascript'>$( document ).ready(function() {{ setInterval({1}loadChatMessages({0}, '#chatHistory_{0}'){1}, 2500); }});</script><div class='null' style='clear:both;'></div>", i, '\"'); buffer.AppendFormat("<div class='chatHistory' id='chatHistory_{0}'></div><script type='text/javascript'>$( document ).ready(function() {{ setInterval({1}loadChatMessages({0}, '#chatHistory_{0}'){1}, 2500); }});</script><div class='null' style='clear:both;'></div>", i, '\"');
if (Servers[i].getClientNum() > 0) if (Servers[i].getClientNum() > 0)
buffer.AppendFormat("<form class='chatOutFormat' action={1}javascript:chatRequest({0}, 'chatEntry_{0}'){1}><input class='chatFormat_text' type='text' placeholder='Enter a message...' id='chatEntry_{0}'/><input class='chatFormat_submit' type='submit'/></form>", i, '\"'); buffer.AppendFormat("<form class='chatOutFormat' action={1}javascript:chatRequest({0}, 'chatEntry_{0}'){1}><input class='chatFormat_text' type='text' placeholder='Enter a message...' id='chatEntry_{0}'/><input class='chatFormat_submit' type='submit'/></form>", i, '\"');
@ -187,7 +187,7 @@ namespace IW4MAdmin_Web
buffer.Append("<h1 style=margin-top: 0;>{{TIME}}</h1><hr /><tr><th>Name</th><th style=text-align:left;>Offense</th><th style=text-align:left;>Banned By</th><th style='width: 175px; text-align:right;padding-right: 80px;'>Time</th></tr>"); buffer.Append("<h1 style=margin-top: 0;>{{TIME}}</h1><hr /><tr><th>Name</th><th style=text-align:left;>Offense</th><th style=text-align:left;>Banned By</th><th style='width: 175px; text-align:right;padding-right: 80px;'>Time</th></tr>");
if (Bans[0] != null) if (Bans[0] != null)
buffer = buffer.Replace("{{TIME}}", "From " + Utilities.timePassed(Bans[0].When) + " ago" + " &mdash; " + totalBans + " total"); buffer = buffer.Replace("{{TIME}}", "From " + SharedLibrary.Utilities.timePassed(Bans[0].When) + " ago" + " &mdash; " + totalBans + " total");
for (int i = 0; i < Bans.Count; i++) for (int i = 0; i < Bans.Count; i++)
{ {
@ -216,7 +216,7 @@ namespace IW4MAdmin_Web
else else
Prefix = "class=row-white"; Prefix = "class=row-white";
String Link = "/" + server + "/" + P.databaseID + "/userip/?player"; String Link = "/" + server + "/" + P.databaseID + "/userip/?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.Name, P.lastOffense, Utilities.nameHTMLFormatted(B), Bans[i].getWhen(), Prefix, Link); 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.Name, P.lastOffense, SharedLibrary.Utilities.nameHTMLFormatted(B), Bans[i].getWhen(), Prefix, Link);
cycleFix++; cycleFix++;
} }
} }
@ -364,7 +364,7 @@ namespace IW4MAdmin_Web
if (logged) if (logged)
Screenshot = String.Format("<a href='http://server.nbsclan.org/screen.php?id={0}&name={1}'><div style='background-image:url(http://server.nbsclan.org/shutter.png); width: 20px; height: 20px;float: right; position:relative; right: 21%; background-size: contain;'></div></a>", forumID, Player.Name); Screenshot = String.Format("<a href='http://server.nbsclan.org/screen.php?id={0}&name={1}'><div style='background-image:url(http://server.nbsclan.org/shutter.png); width: 20px; height: 20px;float: right; position:relative; right: 21%; background-size: contain;'></div></a>", forumID, Player.Name);
buffer.AppendFormat("<td><a style='float: left;' href='{9}'>{0}</a>{10}</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.Name, str, IPs, Rating, Utilities.nameHTMLFormatted(Player.Level), Player.Connections, Player.getLastConnection(), forumID, Player.Name, "/0/" + Player.databaseID + "/userip/?player", Screenshot); buffer.AppendFormat("<td><a style='float: left;' href='{9}'>{0}</a>{10}</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.Name, str, IPs, Rating, SharedLibrary.Utilities.nameHTMLFormatted(Player), Player.Connections, Player.getLastConnection(), forumID, Player.Name, "/0/" + Player.databaseID + "/userip/?player", Screenshot);
buffer.Append("</tr>"); buffer.Append("</tr>");
} }
@ -547,7 +547,7 @@ namespace IW4MAdmin_Web
if (req.Length > 3) if (req.Length > 3)
{ {
IP = req[2]; IP = req[2];
Text = Utilities.cleanChars(HttpUtility.UrlDecode(req[3])); Text = SharedLibrary.Utilities.cleanChars(HttpUtility.UrlDecode(req[3]));
} }
else else
@ -560,7 +560,7 @@ namespace IW4MAdmin_Web
{ {
chatMessages.Append("<table id='table_chatHistory'>"); chatMessages.Append("<table id='table_chatHistory'>");
foreach (Chat Message in Program.getServers()[server].chatHistory) foreach (Chat Message in Program.getServers()[server].chatHistory)
chatMessages.AppendFormat("<tr><td class='chat_name' style='text-align: left;'>{0}</td><td class='chat_message'>{1}</td><td class='chat_time' style='text-align: right;'>{2}</td></tr>", Utilities.nameHTMLFormatted(Message.Origin), Message.Message, Message.timeString()); chatMessages.AppendFormat("<tr><td class='chat_name' style='text-align: left;'>{0}</td><td class='chat_message'>{1}</td><td class='chat_time' style='text-align: right;'>{2}</td></tr>", SharedLibrary.Utilities.nameHTMLFormatted(Message.Origin), Message.Message, Message.timeString());
chatMessages.Append("</table>"); chatMessages.Append("</table>");
body = chatMessages.ToString(); body = chatMessages.ToString();
} }

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +1,8 @@
VERSION 0.9.2 VERSION 0.9.5
-Major refactoring to support plugins
-*web front redux*
VERSION 0.9.2
CHANGELOG: CHANGELOG:
-fixed issues with crashing IW4 Servers -fixed issues with crashing IW4 Servers

View File

@ -4,10 +4,16 @@ Microsoft Visual Studio Solution File, Format Version 12.00
VisualStudioVersion = 12.0.30723.0 VisualStudioVersion = 12.0.30723.0
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IW4M ADMIN", "Admin\IW4M ADMIN.csproj", "{DD5DCDA2-51DB-4B1A-922F-5705546E6115}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IW4M ADMIN", "Admin\IW4M ADMIN.csproj", "{DD5DCDA2-51DB-4B1A-922F-5705546E6115}"
ProjectSection(ProjectDependencies) = postProject
{D51EECEB-438A-47DA-870F-7D7B41BC24D6} = {D51EECEB-438A-47DA-870F-7D7B41BC24D6}
EndProjectSection
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedLibrary", "SharedLibary\SharedLibrary.csproj", "{D51EECEB-438A-47DA-870F-7D7B41BC24D6}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedLibrary", "SharedLibary\SharedLibrary.csproj", "{D51EECEB-438A-47DA-870F-7D7B41BC24D6}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SamplePlugin", "SamplePlugin\SamplePlugin.csproj", "{4785AB75-66F3-4391-985D-63A5A049A0FA}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SamplePlugin", "SamplePlugin\SamplePlugin.csproj", "{4785AB75-66F3-4391-985D-63A5A049A0FA}"
ProjectSection(ProjectDependencies) = postProject
{D51EECEB-438A-47DA-870F-7D7B41BC24D6} = {D51EECEB-438A-47DA-870F-7D7B41BC24D6}
EndProjectSection
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution

View File

@ -34,7 +34,7 @@ namespace SamplePlugin
String Sender = E.Origin.Name; String Sender = E.Origin.Name;
for (int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)
originatingServer.Broadcast(String.Format("^7{0}: {1}", Sender, Message)); originatingServer.Broadcast(String.Format("^7{0}: ^{1}{2}^7", Sender, i, Message));
} }
} }

View File

@ -32,7 +32,6 @@
<ItemGroup> <ItemGroup>
<Reference Include="SharedLibary"> <Reference Include="SharedLibary">
<HintPath>..\SharedLibary\bin\Release\SharedLibary.dll</HintPath> <HintPath>..\SharedLibary\bin\Release\SharedLibary.dll</HintPath>
<Private>False</Private>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />

View File

@ -22,7 +22,7 @@ namespace SharedLibrary
catch(System.DllNotFoundException) catch(System.DllNotFoundException)
{ {
Console.WriteLine("Could not locate the SQLite DLL!\nEnsure it is located in the 'lib' folder"); Console.WriteLine("Fatal Error: could not locate the SQLite DLL(s)!\nEnsure they are located in the 'lib' folder");
Utilities.Wait(5); Utilities.Wait(5);
System.Environment.Exit(0); System.Environment.Exit(0);
} }

View File

@ -62,6 +62,9 @@
<Compile Include="Utilities.cs" /> <Compile Include="Utilities.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)Admin\lib\$(TargetName).dll"</PostBuildEvent>
</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.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">

View File

@ -6,7 +6,7 @@ using System.Collections.Generic;
namespace SharedLibrary namespace SharedLibrary
{ {
class Utilities public class Utilities
{ {
//Get string with specified number of spaces -- really only for visual output //Get string with specified number of spaces -- really only for visual output
public static String getSpaces(int Num) public static String getSpaces(int Num)
@ -114,6 +114,31 @@ namespace SharedLibrary
} }
} }
public static String nameHTMLFormatted(Player P)
{
switch (P.Level)
{
case Player.Permission.User:
return "<span style='color:rgb(87, 150, 66)'>" + P.Name + "</span>";
case Player.Permission.Moderator:
return "<span style='color:#e7b402'>" + P.Name + "</span>";
case Player.Permission.Administrator:
return "<span style='color:#ec82de'>" + P.Name + "</span>";
case Player.Permission.SeniorAdmin:
return "<span style='color:#2eb6bf'>" + P.Name + "</span>";
case Player.Permission.Owner:
return "<span style='color:rgb(38,120,230)'>" + P.Name + "</span>";
case Player.Permission.Creator:
return "<span style='color:rgb(38,120,230)'>" + P.Name + "</span>";
case Player.Permission.Banned:
return "<span style='color:rgb(196, 22, 28)'>" + P.Name + "</span>";
case Player.Permission.Flagged:
return "<span style='color:rgb(251, 124, 98)'>" + P.Name + "</span>";
default:
return "<i>" + P.Name + "</i>";
}
}
public static String processMacro(Dictionary<String, Object> Dict, String str) public static String processMacro(Dictionary<String, Object> Dict, String str)
{ {
MatchCollection Found = Regex.Matches(str, @"\{\{[A-Z]+\}\}", RegexOptions.IgnoreCase); MatchCollection Found = Regex.Matches(str, @"\{\{[A-Z]+\}\}", RegexOptions.IgnoreCase);