diff --git a/lombok.config b/lombok.config new file mode 100644 index 0000000..d959b09 --- /dev/null +++ b/lombok.config @@ -0,0 +1 @@ +lombok.var.flagUsage = ALLOW diff --git a/src/main/java/buttondevteam/chat/PluginMain.java b/src/main/java/buttondevteam/chat/PluginMain.java index 7ad1825..b02f678 100644 --- a/src/main/java/buttondevteam/chat/PluginMain.java +++ b/src/main/java/buttondevteam/chat/PluginMain.java @@ -2,6 +2,7 @@ package buttondevteam.chat; import buttondevteam.chat.commands.YeehawCommand; import buttondevteam.chat.commands.ucmds.TownColorCommand; +import buttondevteam.chat.listener.PlayerJoinLeaveListener; import buttondevteam.chat.listener.PlayerListener; import buttondevteam.chat.listener.TownyListener; import buttondevteam.lib.TBMCCoreAPI; @@ -81,6 +82,7 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15. PluginMain.essentials = (Essentials) (Bukkit.getPluginManager().getPlugin("Essentials")); TBMCCoreAPI.RegisterEventsForExceptions(new PlayerListener(), this); + TBMCCoreAPI.RegisterEventsForExceptions(new PlayerJoinLeaveListener(), this); TBMCCoreAPI.RegisterEventsForExceptions(new TownyListener(), this); TBMCChatAPI.AddCommands(this, YeehawCommand.class); Console = this.getServer().getConsoleSender(); diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java b/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java index c32401b..8729986 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java +++ b/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java @@ -4,20 +4,19 @@ import buttondevteam.lib.chat.Channel; import buttondevteam.lib.chat.ChatMessage; import buttondevteam.lib.chat.CommandClass; import lombok.RequiredArgsConstructor; +import lombok.experimental.var; import lombok.val; import org.bukkit.command.CommandSender; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Map; +import javax.annotation.Nullable; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; import java.util.stream.Stream; @CommandClass public class HistoryCommand extends UCommandBase { - private static HashMap messages = new HashMap<>(); + private static HashMap> messages = new HashMap<>(); @Override public String[] GetHelpText(String alias) { @@ -29,46 +28,65 @@ public class HistoryCommand extends UCommandBase { @Override public boolean OnCommand(CommandSender sender, String alias, String[] args) { - Function, Map.Entry> filterThem = e -> { + return showHistory(sender, alias, args, this); + } + + public static boolean showHistory(CommandSender sender, String alias, String[] args, @Nullable HistoryCommand hc) { + Function>, Map.Entry>> filterThem = e -> { int score = e.getKey().getMCScore(sender); - HistoryEntry[] he = new HistoryEntry[10]; - for (int i = 0, j = 0; i < 10; i++) { - val cm = e.getValue()[i].chatMessage; - if (cm == null) - break; //Don't have 10 messages yet + LinkedList he = new LinkedList<>(); + for (int i = 0; i < 10 && i < e.getValue().size(); i++) { + val heh = e.getValue().get(i); + val cm = heh.chatMessage; if (score == e.getKey().getMCScore(cm.getPermCheck())) - he[j++] = e.getValue()[i]; + he.push(heh); } return new HashMap.SimpleEntry<>(e.getKey(), he); }; sender.sendMessage("§6---- Chat History ----"); - Stream stream; + Stream>> stream; if (args.length == 0) { - stream = messages.entrySet().stream().map(filterThem).flatMap(e -> Arrays.stream(e.getValue())); + stream = messages.entrySet().stream(); } else { - Channel ch = Channel.GlobalChat; //TODO: Channel param - val hes = messages.get(ch); - if (hes == null) + Optional och = Channel.getChannels().stream().filter(chan -> chan.ID.equalsIgnoreCase(args[0])).findAny(); + if (!och.isPresent()) { + sender.sendMessage("§cChannel not found. Use the ID, for example: /" + (hc == null ? "u history" : hc.GetCommandPath()) + " ooc"); return true; - stream = Arrays.stream(hes); + } + val hes = messages.get(och.get()); + if (hes == null) + stream = Stream.empty(); + else + stream = Stream.of(new HashMap.SimpleEntry<>(och.get(), hes)); } AtomicBoolean sent = new AtomicBoolean(); - stream.sorted(Comparator.comparingLong(he -> he.timestamp)).forEach(e -> { + val arr = stream.map(filterThem).flatMap(e -> e.getValue().stream()) + .sorted(Comparator.comparingLong(he -> he.timestamp)).toArray(HistoryEntry[]::new); + for (int i = Math.max(0, arr.length - 10); i < arr.length; i++) { + HistoryEntry e = arr[i]; val cm = e.chatMessage; - sender.sendMessage(cm.getSender().getName() + ": " + cm.getMessage()); + sender.sendMessage("[" + e.channel.DisplayName + "] " + cm.getSender().getName() + ": " + cm.getMessage()); sent.set(true); - }); + } if (!sent.get()) sender.sendMessage("No messages can be found."); return true; } @RequiredArgsConstructor - public static class HistoryEntry { + private static class HistoryEntry { /** * System.nanoTime() */ private final long timestamp; private final ChatMessage chatMessage; + private final Channel channel; + } + + public static void addChatMessage(ChatMessage chatMessage, Channel channel) { + var ll = messages.computeIfAbsent(channel, k -> new LinkedList<>()); //<-- TIL + ll.add(new HistoryEntry(System.nanoTime(), chatMessage, channel)); //Adds as last element + while (ll.size() > 10) + ll.remove(); //Removes the first element } } diff --git a/src/main/java/buttondevteam/chat/listener/PlayerJoinLeaveListener.java b/src/main/java/buttondevteam/chat/listener/PlayerJoinLeaveListener.java index 0c57e7c..3a49a4a 100644 --- a/src/main/java/buttondevteam/chat/listener/PlayerJoinLeaveListener.java +++ b/src/main/java/buttondevteam/chat/listener/PlayerJoinLeaveListener.java @@ -5,6 +5,7 @@ import buttondevteam.chat.FlairStates; import buttondevteam.chat.PlayerJoinTimerTask; import buttondevteam.chat.PluginMain; import buttondevteam.chat.commands.UnlolCommand; +import buttondevteam.chat.commands.ucmds.HistoryCommand; import buttondevteam.lib.chat.Color; import buttondevteam.lib.player.TBMCPlayerJoinEvent; import buttondevteam.lib.player.TBMCPlayerLoadEvent; @@ -64,14 +65,14 @@ public class PlayerJoinLeaveListener implements Listener { nwithoutformatting = p.getName(); PlayerListener.nicknames.forcePut(nwithoutformatting.toLowerCase(), p.getUniqueId()); - Bukkit.getScheduler().runTaskLater(PluginMain.Instance, () -> { - updatePlayerColors(p, cp); //TODO: Doesn't have effect - }, 5); + updatePlayerColors(p, cp); //TO!DO: Doesn't have effect - It can help to register the listener if (cp.ChatOnly || p.getGameMode().equals(GameMode.SPECTATOR)) { cp.ChatOnly = false; p.setGameMode(GameMode.SURVIVAL); } + + HistoryCommand.showHistory(e.getPlayer(), "u history", new String[0], null); } @EventHandler diff --git a/src/main/java/buttondevteam/chat/listener/PlayerListener.java b/src/main/java/buttondevteam/chat/listener/PlayerListener.java index 2304407..fd8dfb5 100644 --- a/src/main/java/buttondevteam/chat/listener/PlayerListener.java +++ b/src/main/java/buttondevteam/chat/listener/PlayerListener.java @@ -3,6 +3,7 @@ package buttondevteam.chat.listener; import buttondevteam.chat.ChatPlayer; import buttondevteam.chat.ChatProcessing; import buttondevteam.chat.PluginMain; +import buttondevteam.chat.commands.ucmds.HistoryCommand; import buttondevteam.lib.TBMCChatEvent; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.chat.*; @@ -258,6 +259,7 @@ public class PlayerListener implements Listener { try { if (e.isCancelled()) return; + HistoryCommand.addChatMessage(e.getCm(), e.getChannel()); e.setCancelled(ChatProcessing.ProcessChat(e)); } catch (NoClassDefFoundError | Exception ex) { // Weird things can happen for (Player p : Bukkit.getOnlinePlayers())