1
0
mirror of https://github.com/RaidMax/IW4M-Admin.git synced 2025-06-10 23:31:13 -05:00

-stability fixes

-welcome has post-fixed connection indicator
This commit is contained in:
RaidMax
2015-03-14 11:42:36 -05:00
parent 73dfb9a612
commit b0e32e9a91
11 changed files with 193 additions and 74 deletions

View File

@ -99,11 +99,72 @@ namespace IW4MAdmin
{
return Bans;
}
public void threadedConnect(Player P, Player NewPlayer)
{
bool updated = false;
while (!updated)
{
try
{
P.updateIP(IPS[P.getID()].Trim());
updated = true;
Log.Write("Sucessfully updated " + NewPlayer.getName() + "'s IP to " + P.getIP(), Log.Level.Debug);
}
catch
{
//Log.Write("Looks like the connecting player doesn't have an IP location assigned yet. Let's wait for next poll", Log.Level.Debug);
Utilities.Wait(1);
}
}
if (NewPlayer.Alias == null)
{
aliasDB.addPlayer(new Aliases(NewPlayer.getDBID(), NewPlayer.getName(), P.getIP()));
}
if (P.getName() != NewPlayer.getName())
{
NewPlayer.updateName(P.getName());
NewPlayer.Alias.addName(P.getName());
aliasDB.updatePlayer(NewPlayer.Alias);
}
if (P.getIP() != NewPlayer.getIP())
{
NewPlayer.updateIP(P.getIP());
NewPlayer.Alias.addIP(P.getIP());
aliasDB.updatePlayer(NewPlayer.Alias);
}
clientDB.updatePlayer(NewPlayer);
Ban B = isBanned(NewPlayer);
if (B != null || NewPlayer.getLevel() == Player.Permission.Banned)
{
Log.Write("Banned client " + P.getName() + " trying to connect...", Log.Level.Debug);
string Reason = String.Empty;
if (B != null)
Reason = B.getReason();
else
Reason = P.LastOffense;
String Message = "^1Player Kicked: ^7Previously Banned for ^5" + Reason;
P.Kick(Message);
}
players[NewPlayer.getClientNum()] = null;
players[NewPlayer.getClientNum()] = NewPlayer;
}
//Add player object p to `players` list
public bool addPlayer(Player P)
{
#if DEBUG == false
try
#endif
{
if (clientDB.getPlayer(P.getID(), P.getClientNum()) == null)
{
@ -117,68 +178,38 @@ namespace IW4MAdmin
//messy way to prevent loss of last event
Player NewPlayer = clientDB.getPlayer(P.getID(), P.getClientNum());
NewPlayer.stats = statDB.getStats(NewPlayer.getDBID());
if (NewPlayer.stats == null)
NewPlayer.Alias = aliasDB.getPlayer(NewPlayer.getDBID());
if (NewPlayer.stats == null) //For safety
{
statDB.addPlayer(NewPlayer);
NewPlayer.stats = statDB.getStats(NewPlayer.getDBID());
}
NewPlayer.Alias = aliasDB.getPlayer(NewPlayer.getDBID());
NewPlayer.lastEvent = P.lastEvent;
if (P.lastEvent == null)
NewPlayer.lastEvent = new Event(Event.GType.Say, null, NewPlayer, null, this); // this is messy but its throwing an error when they've started it too late
else
NewPlayer.lastEvent = P.lastEvent;
if (players[NewPlayer.getClientNum()] == null)
{
try
{
P.updateIP(IPS[P.getID()]);
}
catch
{
Log.Write("Looks like the connecting player doesn't have an IP location assigned yet.", Log.Level.Debug);
P.updateIP(getPlayerIP(P.getID()));
}
if (P.getName() != NewPlayer.getName())
{
NewPlayer.updateName(P.getName());
NewPlayer.Alias.addName(P.getName());
}
if (P.getIP() != NewPlayer.getIP())
{
NewPlayer.updateIP(P.getIP());
NewPlayer.Alias.addIP(P.getIP());
}
Thread connectThread = new Thread(() => threadedConnect(P, NewPlayer));
connectThread.Start(); // We don't want events to get behind
NewPlayer.Tell("Welcome ^5" + NewPlayer.getName() + " ^7this is your ^5" + Utilities.timesConnected(NewPlayer.getConnections()) + " ^7time connecting!");
Log.Write("Client " + NewPlayer.getName() + " connecting...", Log.Level.Debug);
clientnum++;
}
NewPlayer.lastEvent = P.lastEvent;
players[NewPlayer.getClientNum()] = null;
players[NewPlayer.getClientNum()] = NewPlayer;
Ban B = isBanned(NewPlayer);
if (NewPlayer.getLevel() == Player.Permission.Banned || B != null)
{
Log.Write("Banned client " + P.getName() + " trying to connect...", Log.Level.Debug);
String Message = "^1Player Kicked: ^7Previously Banned for ^5" + B.getReason();
P.Kick(Message);
}
else
Log.Write("Client " + NewPlayer.getName() + " connecting...", Log.Level.Debug);
clientDB.updatePlayer(NewPlayer);
aliasDB.updatePlayer(NewPlayer.Alias);
return true;
}
#if DEBUG == false
catch (Exception E)
{
Log.Write("Unable to add player " + P.getName() + " - " + E.Message, Log.Level.Debug);
return false;
}
#endif
}
//Remove player by CLIENT NUMBER
@ -214,7 +245,8 @@ namespace IW4MAdmin
}
Log.Write("Could not find player but player is in server. Lets try to manually add (looks like you didn't start me on an empty server)", Log.Level.All);
addPlayer(new Player(Name, line[1].ToString(), Convert.ToInt16(line[2]), 0));
players[Convert.ToInt16(line[2])] = null;
addPlayer(new Player(Name, line[1].ToString().Trim(), Convert.ToInt16(line[2]), 0));
return players[Convert.ToInt16(line[2])];
}
}
@ -326,7 +358,7 @@ namespace IW4MAdmin
private void manageEventQueue()
{
while (true)
while (isRunning)
{
if (events.Count > 0)
{
@ -340,6 +372,7 @@ namespace IW4MAdmin
//Starts the monitoring process
public void Monitor()
{
isRunning = true;
//Handles new rcon requests in a fashionable manner
Thread RCONQueue = new Thread(new ThreadStart(RCON.ManageRCONQueue));
@ -348,32 +381,41 @@ namespace IW4MAdmin
if (!intializeBasics())
{
Log.Write("Stopping " + Port + " due to uncorrectable errors (check log)" + logPath, Log.Level.Production);
Utilities.Wait(10);
isRunning = false;
Utilities.Wait(10);
return;
}
Thread statusUpdate = new Thread(new ThreadStart(pollServer));
statusUpdate.Start();
//Handles new events in a fashionable manner
Thread eventQueue = new Thread(new ThreadStart(manageEventQueue));
eventQueue.Start();
int timesFailed = 0;
long l_size = -1;
bool checkedForOutdate = false;
String[] lines = new String[8];
String[] oldLines = new String[8];
DateTime start = DateTime.Now;
Utilities.Wait(1);
#if DEBUG == false
Broadcast("IW4M Admin is now ^2ONLINE");
#endif
while (errors <=5)
{
try
#if DEBUG == false
try
#endif
{
lastMessage = DateTime.Now - start;
if(lastMessage.TotalSeconds > messageTime && messages.Count > 0)
{
if (RCON.responseSendRCON("sv_online") == null)
if (RCON.addRCON("sv_online") == null)
{
timesFailed++;
Log.Write("Server appears to be offline - " + timesFailed, Log.Level.Debug);
@ -381,7 +423,7 @@ namespace IW4MAdmin
else
timesFailed = 0;
Thread.Sleep(300);
initMacros();
initMacros(); // somethings dynamically change so we have to re-init the dictionary
Broadcast(Utilities.processMacro(Macros, messages[nextMessage]));
if (nextMessage == (messages.Count - 1))
nextMessage = 0;
@ -390,6 +432,16 @@ namespace IW4MAdmin
start = DateTime.Now;
if (timesFailed <= 3)
HB.Send();
String checkVer = new Connection("http://raidmax.org/IW4M/Admin/version.php").Read();
double checkVerNum;
double.TryParse(checkVer, out checkVerNum);
if (checkVerNum != Program.Version && checkVerNum != 0 && !checkedForOutdate)
{
messages.Add("^5IW4M Admin ^7is outdated. Please ^5update ^7to version " + checkVerNum);
checkedForOutdate = true;
}
}
if (l_size != logFile.getSize())
@ -438,20 +490,38 @@ namespace IW4MAdmin
l_size = logFile.getSize();
Thread.Sleep(1);
}
#if DEBUG == false
catch (Exception E)
{
Log.Write("Something unexpected occured. Hopefully we can ignore it - " + E.Message + " @" + Utilities.GetLineNumber(E), Log.Level.All);
errors++;
continue;
}
#endif
}
isRunning = false;
RCONQueue.Abort();
eventQueue.Abort();
}
private void pollServer()
{
while (isRunning)
{
IPS = Utilities.IPFromStatus(RCON.addRCON("status"));
while (IPS == null)
{
IPS = Utilities.IPFromStatus(RCON.addRCON("status"));
Utilities.Wait(1);
}
lastPoll = DateTime.Now;
Utilities.Wait(15);
}
}
//Vital RCON commands to establish log file and server name. May need to cleanup in the future
private bool intializeBasics()
{
@ -513,7 +583,7 @@ namespace IW4MAdmin
//END
//get fs_game
p =RCON.addRCON("fs_game");
p = RCON.addRCON("fs_game");
if (p == null)
{
@ -550,7 +620,7 @@ namespace IW4MAdmin
//END
//get g_logsync
p =RCON.addRCON("g_logsync");
p = RCON.addRCON("g_logsync");
if (p == null)
{
@ -595,8 +665,8 @@ namespace IW4MAdmin
logFile = new file(logPath);
Log.Write("Log file is " + logPath, Log.Level.Debug);
//get players ip's
p =RCON.addRCON("status");
//get players ip's
p = RCON.addRCON("status");
if (p == null)
{
Log.Write("Unable to get initial player list!", Log.Level.Debug);
@ -604,6 +674,7 @@ namespace IW4MAdmin
}
IPS = Utilities.IPFromStatus(p);
lastPoll = DateTime.Now;
#if DEBUG
/* System.Net.FtpWebRequest tmp = (System.Net.FtpWebRequest)System.Net.FtpWebRequest.Create("ftp://raidmax.org/logs/games_old.log");
@ -612,7 +683,6 @@ namespace IW4MAdmin
String ftpLog = new StreamReader(ftpStream).ReadToEnd();*/
logPath = "games_old.log";
#endif
return true;
}
catch (Exception E)
@ -978,6 +1048,8 @@ namespace IW4MAdmin
//Will probably move this later
private Dictionary<String, String> IPS;
public bool isRunning;
private DateTime lastPoll;
//Log stuff