* destroys the group if there is only one player left
*/
@SuppressWarnings("unchecked")
public void clean() {
Set<String> toRemove = new HashSet<String>();
StendhalRPRuleProcessor ruleProcessor = SingletonRepository.getRuleProcessor();
Long currentTime = Long.valueOf(System.currentTimeMillis());
Long timeoutTime = Long.valueOf(System.currentTimeMillis() - TIMEOUT);
// remove offline members and set keep alive timestamp
for (Map.Entry<String, Long> entry : ((Map<String, Long>)membersAndLastSeen.clone()).entrySet()) {
String playerName = entry.getKey();
if (ruleProcessor.getPlayer(playerName) != null) {
membersAndLastSeen.put(playerName, currentTime);
} else {
if (entry.getValue().compareTo(timeoutTime) < 0) {
toRemove.add(playerName);
new GameEvent(playerName, "group", playerName, "timeout").raise();
}
}
}
membersAndLastSeen.keySet().removeAll(toRemove);
// expire open invites
Iterator<Map.Entry<String, Long>> itr = openInvites.entrySet().iterator();
while (itr.hasNext()) {
Map.Entry<String, Long> entry = itr.next();
if (entry.getValue().compareTo(timeoutTime) < 0) {
// TODO: "leader" needs to be the leader at invite time
// TODO: alternatively: cancel the old invite and create a new one on leader change
// but the new leader may not agree with the invite, so it may not be a good idea
// to fake it his name.
Player invitedPlayer = ruleProcessor.getPlayer(entry.getKey());
if (invitedPlayer != null) {
invitedPlayer.addEvent(new GroupInviteEvent(leader, true));
}
itr.remove();