static void Main(string[] args) { int refreshTimeInSeconds = 10; var logRefreshString = HttpGet(LogRefreshUrl); if (!Int32.TryParse(logRefreshString, out refreshTimeInSeconds)) { Logging.WriteLog("Invalid refresh time. Setting log refresh to 10 seconds. Server response was {0}.", logRefreshString); } else { Logging.WriteLog("Current Refresh Time {0}",refreshTimeInSeconds); } bool shutdown = false; double lastTimeStampRead = 0; currentPlayers = new Dictionary<string,CodPlayer>(); rcon = new RCON(rconHost, rconPort, rconPw); var messageEvent = new System.Threading.AutoResetEvent(false); Thread messageThread = new Thread(new ThreadStart(() => { while (!shutdown) { Logging.WriteLog("Sending server messages"); rcon.Say(Strings.WelcomeMessage); if (messageEvent.WaitOne(new TimeSpan(0, 0, 15)) && shutdown) { return; } rcon.Say(Strings.FriendInviteMessage); if (messageEvent.WaitOne(new TimeSpan(0, 0, 15)) && shutdown) { return; } rcon.Say(Strings.ServerProtection); if (messageEvent.WaitOne(new TimeSpan(0, 0, 15)) && shutdown) { return; } //send the server rules SendRulesToPlayer(null); //rcon.Say(String.Format(Strings.RulesTrigger, CodServerLogLine.RulesTrigger)); Logging.WriteLog("finished sending server messages"); if (messageEvent.WaitOne(new TimeSpan(0, 0, 60)) && shutdown) { return; } } })); var logEvent = new AutoResetEvent(false); Thread logParserThread = new Thread(new ThreadStart(() => { while (!shutdown) { Logging.WriteLog("Getting Log data..."); var logSnippet = HttpGet(XDSniperLogUrl,true); //should be 2MB at most. add range header Logging.WriteLog("Log Data collected..."); var lines = new List<string>(logSnippet.Split('\n')); Logging.WriteLog("Recieved {0} log lines.", lines.Count); var parsedLines = FindAllValidLogLines(lines, ref lastTimeStampRead); if (parsedLines != null) { //now go through the stack, and take appropriate action... HandleCurrentLogs(parsedLines, ref lastTimeStampRead); } if (logEvent.WaitOne(new TimeSpan(0, 0, refreshTimeInSeconds)) && shutdown) { // if we're shutting down, or already in this loop, just return. return; } } })); logParserThread.Start(); messageThread.Start(); System.Threading.AutoResetEvent wait = new System.Threading.AutoResetEvent(false); Console.CancelKeyPress += new ConsoleCancelEventHandler((o,e) => { Logging.WriteLog("Shutting down"); shutdown = true; messageEvent.Set(); logEvent.Set(); var w = new System.Threading.AutoResetEvent(false); //wait 15 seconds for things to shutdown w.WaitOne(new TimeSpan(0, 0, 5)); wait.Set(); }); wait.WaitOne(); //meh assyemtric behavior... :( ConnectionPool.DrainPool(); }
static void Main(string[] args) { int refreshTimeInSeconds = 10; var logRefreshString = HttpGet(LogRefreshUrl); if (!Int32.TryParse(logRefreshString, out refreshTimeInSeconds)) { Logging.WriteLog("Invalid refresh time. Setting log refresh to 10 seconds. Server response was {0}.", logRefreshString); } else { Logging.WriteLog("Current Refresh Time {0}", refreshTimeInSeconds); } bool shutdown = false; double lastTimeStampRead = 0; currentPlayers = new Dictionary <string, CodPlayer>(); rcon = new RCON(rconHost, rconPort, rconPw); var messageEvent = new System.Threading.AutoResetEvent(false); Thread messageThread = new Thread(new ThreadStart(() => { while (!shutdown) { Logging.WriteLog("Sending server messages"); rcon.Say(Strings.WelcomeMessage); if (messageEvent.WaitOne(new TimeSpan(0, 0, 15)) && shutdown) { return; } rcon.Say(Strings.FriendInviteMessage); if (messageEvent.WaitOne(new TimeSpan(0, 0, 15)) && shutdown) { return; } rcon.Say(Strings.ServerProtection); if (messageEvent.WaitOne(new TimeSpan(0, 0, 15)) && shutdown) { return; } //send the server rules SendRulesToPlayer(null); //rcon.Say(String.Format(Strings.RulesTrigger, CodServerLogLine.RulesTrigger)); Logging.WriteLog("finished sending server messages"); if (messageEvent.WaitOne(new TimeSpan(0, 0, 60)) && shutdown) { return; } } })); var logEvent = new AutoResetEvent(false); Thread logParserThread = new Thread(new ThreadStart(() => { while (!shutdown) { Logging.WriteLog("Getting Log data..."); var logSnippet = HttpGet(XDSniperLogUrl, true); //should be 2MB at most. add range header Logging.WriteLog("Log Data collected..."); var lines = new List <string>(logSnippet.Split('\n')); Logging.WriteLog("Recieved {0} log lines.", lines.Count); var parsedLines = FindAllValidLogLines(lines, ref lastTimeStampRead); if (parsedLines != null) { //now go through the stack, and take appropriate action... HandleCurrentLogs(parsedLines, ref lastTimeStampRead); } if (logEvent.WaitOne(new TimeSpan(0, 0, refreshTimeInSeconds)) && shutdown) { // if we're shutting down, or already in this loop, just return. return; } } })); logParserThread.Start(); messageThread.Start(); System.Threading.AutoResetEvent wait = new System.Threading.AutoResetEvent(false); Console.CancelKeyPress += new ConsoleCancelEventHandler((o, e) => { Logging.WriteLog("Shutting down"); shutdown = true; messageEvent.Set(); logEvent.Set(); var w = new System.Threading.AutoResetEvent(false); //wait 15 seconds for things to shutdown w.WaitOne(new TimeSpan(0, 0, 5)); wait.Set(); }); wait.WaitOne(); //meh assyemtric behavior... :( ConnectionPool.DrainPool(); }