private void send(Player player, MessageNode node, String message) { switch (messages.getCat(node)) { case NOTIFICATION: if (player == null) { plugin.getLogger().warning("Could not send the following message: " + message); } else { // FEATURE: don't spam messages PlayerData playerData = plugin.getModuleForClass(DataStoreModule.class).getPlayerData(player.getName()); long now = Calendar.getInstance().getTimeInMillis(); if (!node.equals(playerData.lastMessageSent) || now - playerData.lastMessageTimestamp > 30000) { if (popupsAreEnabled(MsgCategory.NOTIFICATION)) sendPopup(player, MsgCategory.NOTIFICATION, message); else player.sendMessage(message); playerData.lastMessageSent = node; playerData.lastMessageTimestamp = now; } } break; case TUTORIAL: Validate.notNull(player); if (persistModule.getCountFor(node, player.getName()) < messages.getMsgCount(node)) { long now = Calendar.getInstance().getTimeInMillis(); if (!timeouts.contains(player.getName(), node) || now - timeouts.get(player.getName(), node) > 120000) // only if contains { timeouts.put(player.getName(), node, now); String msgText = messages.getString(node); if (manager != null) sendPopup(player, MsgCategory.TUTORIAL, msgText); else player.sendMessage( ChatColor.DARK_RED + plugin.getTag() + ChatColor.WHITE + " " + msgText); persistModule.increment(node, player.getName()); } } else timeouts.remove(player, message); break; case BROADCAST: plugin.getServer().broadcastMessage(message); break; default: throw new UnsupportedOperationException(messages.getCat(node) + " not implemented"); } }