private void timer_Elapsed(object sender, ElapsedEventArgs e) { lock (timer) { timer.Stop(); try { if (from > 0 && !spring.IsRunning) { var b = tas.GetBattle(); if (b != null) { int plrCnt = b.CountPlayers(); if (plrCnt >= from) { List <string> notReady; if (!ah.AllUniqueTeams(out notReady)) { ah.ComFix(TasSayEventArgs.Default, new string[] {}); return; } bool isReady = ah.AllReadyAndSynced(out notReady); if (plrCnt % 2 == 0) { int allyno; if (!ah.BalancedTeams(out allyno)) { //teams are not balanced but even number - fix colors and balance ah.ComFixColors(TasSayEventArgs.Default, new string[] {}); ah.BalanceTeams(2, false); } } if (isReady) { Thread.Sleep(1000); if (!spring.IsRunning) { ah.ComStart(TasSayEventArgs.Default, new string[] {}); } } else { var now = DateTime.Now; // we have enough people, but its odd number and server locked = unlock for more if (plrCnt > from && plrCnt % 2 == 1 && b.IsLocked) { ah.ComAutoLock(TasSayEventArgs.Default, new[] { (plrCnt + 1).ToString() }); } if (plrCnt % 2 == 0) { // even number of players if (now.Subtract(lastRing).TotalSeconds > RingEvery) { // we ring them lastRing = now; ah.ComRing(TasSayEventArgs.Default, new string[] {}); } var worstTime = DateTime.MaxValue; String worstName = ""; foreach (var s in notReady) { // find longest offending player if (!problemSince.ContainsKey(s)) { problemSince[s] = DateTime.Now; } if (problemSince[s] < worstTime) { worstTime = problemSince[s]; worstName = s; } } foreach (var s in new List <string>(problemSince.Keys)) { // delete not offending plaeyrs if (!notReady.Contains(s)) { problemSince.Remove(s); } } if (now.Subtract(worstTime).TotalSeconds > SpecForceAfter) { ah.ComForceSpectator(TasSayEventArgs.Default, new[] { worstName }); // spec longest offending person } if (now.Subtract(worstTime).TotalSeconds > KickAfter) { ah.ComKick(TasSayEventArgs.Default, new[] { worstName }); // kick longest offending } } else { // teams are not even delet offender list problemSince.Clear(); } } } else { // not enough players, make sure we unlock and clear offenders if (b.IsLocked && plrCnt < from) { ah.ComAutoLock(TasSayEventArgs.Default, new[] { to.ToString() }); } problemSince.Clear(); } } } else { // spring running, reset timer and delete offenders lastRing = DateTime.Now; problemSince.Clear(); } } finally { timer.Start(); } } }