private void GarbageCollectKnownPlayers()
{
int n = 0;
bool revalidate = false;
lock (fKnownPlayers) {
List<String> garbage = new List<String>();
// collect up garbage
foreach (String name in fKnownPlayers.Keys) {
PlayerModel m = fKnownPlayers[name];
m.LastMoveTo = 0; // reset this value while we are here
if (DateTime.Now.Subtract(m.LastSeenTimestamp).TotalMinutes > MODEL_TIMEOUT) {
if (IsKnownPlayer(name)) {
ConsoleDebug("^b" + name + "^n has timed out and is still on active players list, idling?");
// Revalidate the data model
revalidate = true;
} else {
garbage.Add(name);
}
}
}
// remove garbage
if (garbage.Count > 0) foreach (String name in garbage) {
fKnownPlayers.Remove(name);
n = n + 1;
}
}
if (revalidate) {
lock (fAllPlayers) {
fAllPlayers.Clear();
ScheduleListPlayers(1);
}
}
if (n > 0) {
DebugWrite("^9Garbage collected " + n + " old players from known players table", 6);
}
}