package me.rkfg.ns2gather.server; import java.util.LinkedList; import java.util.List; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentLinkedQueue; import ru.ppsrk.gwt.client.ClientAuthException; import ru.ppsrk.gwt.client.LogicException; import me.rkfg.ns2gather.dto.MessageDTO; import me.rkfg.ns2gather.dto.MessageType; import me.rkfg.ns2gather.dto.MessageVisibility; public class MessageManager implements AutoCloseable { ConcurrentLinkedQueue<MessageDTO> messages = new ConcurrentLinkedQueue<>(); Timer messageCleanupTimer = new Timer("Message cleanup", true); public MessageManager() { runMessageCleanup(); } public List<MessageDTO> getNewMessages(Long gatherId, Long steamId, Long since) { List<MessageDTO> result = new LinkedList<>(); for (MessageDTO messageDTO : messages) { if (messageDTO.getTimestamp() > since) { if (messageDTO.getVisibility() == MessageVisibility.BROADCAST && (messageDTO.getGatherId() == gatherId || messageDTO.getGatherId() == null) || messageDTO.getVisibility() == MessageVisibility.PERSONAL && messageDTO.getToSteamId().equals(steamId)) { result.add(messageDTO); } } } return result; } private void runMessageCleanup() { messageCleanupTimer.schedule(new TimerTask() { @Override public void run() { for (MessageDTO messageDTO : messages) { if (System.currentTimeMillis() - messageDTO.getTimestamp() > Settings.MESSAGE_CLEANUP_INTERVAL) { messages.remove(messageDTO); } } } }, 10000, 10000); } @Override public void close() throws Exception { messageCleanupTimer.cancel(); } public void postMessage(MessageDTO messageDTO) { messages.offer(messageDTO); } public void postMessage(MessageType type, String content, Long gatherId) throws LogicException, ClientAuthException { postMessage(new MessageDTO(type, content, gatherId)); } }