package com.demigodsrpg.util; import com.demigodsrpg.util.misc.TimeUtil; import com.google.common.base.Function; import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.plugin.Plugin; import java.util.List; import java.util.Map; public class ChatRecorder { private Map<Long, String> lines; // Format: <System.currentTimeMillis, Message> private Player player; private Listener listener; private boolean recording; public void start(Player player) { this.player = player; listener = new ChatListener(); lines = Maps.newTreeMap(); recording = true; } public List<String> stop() { HandlerList.unregisterAll(this.listener); return Lists.newArrayList(Collections2.transform(lines.entrySet(), new Function<Map.Entry<Long, String>, String>() { @Override public String apply(Map.Entry<Long, String> entry) { return ChatColor.GRAY + "[" + TimeUtil.getTimeTagged(entry.getKey(), true) + " ago]" + entry.getValue(); } })); } public Listener getListener() { return listener; } public boolean isRecording() { return recording; } class ChatListener implements Listener { @EventHandler(priority = EventPriority.MONITOR) private void onChatEvent(AsyncPlayerChatEvent event) { if (event.getRecipients().contains(player)) lines.put(System.currentTimeMillis(), event.getFormat()); } @EventHandler(priority = EventPriority.MONITOR) private void onAllianceChatEvent(AsyncPlayerChatEvent event) { if (event.getRecipients().contains(player)) lines.put(System.currentTimeMillis(), event.getMessage()); } } public static ChatRecorder startRecording(Player player, Plugin plugin) { ChatRecorder recorder = new ChatRecorder(); recorder.start(player); plugin.getServer().getPluginManager().registerEvents(recorder.getListener(), plugin); return recorder; } }