diff --git a/.idea/ButtonChat.iml b/.idea/ButtonChat.iml index d69e1d2..8c6eb35 100644 --- a/.idea/ButtonChat.iml +++ b/.idea/ButtonChat.iml @@ -35,13 +35,13 @@ - - + + diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java b/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java index 476ab03..4dc3ba2 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java +++ b/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java @@ -21,7 +21,7 @@ public class HistoryCommand extends UCommandBase { /** * Key: ChannelID_groupID */ - private static HashMap> messages = new HashMap<>(); + private static final HashMap> messages = new HashMap<>(); @Command2.Subcommand public boolean def(CommandSender sender, @Command2.OptionalArg String channel) { @@ -43,13 +43,15 @@ public class HistoryCommand extends UCommandBase { stream = Stream.of(och.get()); } AtomicBoolean sent = new AtomicBoolean(); - val arr = stream.map(getThem).filter(Objects::nonNull).flatMap(Collection::stream) + synchronized (messages) { + val arr = stream.map(getThem).filter(Objects::nonNull).flatMap(Collection::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("[" + e.channel.DisplayName().get() + "] " + cm.getSender().getName() + ": " + cm.getMessage()); - sent.set(true); + for (int i = Math.max(0, arr.length - 10); i < arr.length; i++) { + HistoryEntry e = arr[i]; + val cm = e.chatMessage; + sender.sendMessage("[" + e.channel.DisplayName().get() + "] " + cm.getSender().getName() + ": " + cm.getMessage()); + sent.set(true); + } } if (!sent.get()) sender.sendMessage("No messages can be found."); @@ -69,9 +71,11 @@ public class HistoryCommand extends UCommandBase { public static void addChatMessage(ChatMessage chatMessage, Channel channel) { val groupID = channel.getGroupID(chatMessage.getPermCheck()); if (groupID == null) return; //Just to be sure - var ll = messages.computeIfAbsent(channel.ID + "_" + groupID, 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 + synchronized (messages) { + var ll = messages.computeIfAbsent(channel.ID + "_" + groupID, 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/components/fun/FunComponent.java b/src/main/java/buttondevteam/chat/components/fun/FunComponent.java index 82b1229..bd8cceb 100644 --- a/src/main/java/buttondevteam/chat/components/fun/FunComponent.java +++ b/src/main/java/buttondevteam/chat/components/fun/FunComponent.java @@ -26,14 +26,14 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scheduler.BukkitTask; -import java.util.ArrayList; +import java.util.HashSet; import java.util.Random; public class FunComponent extends Component implements Listener { private boolean ActiveF = false; private ChatPlayer FPlayer = null; private BukkitTask Ftask = null; - private ArrayList Fs = new ArrayList<>(); + private HashSet Fs = new HashSet<>(); private UnlolCommand command; private TBMCSystemChatEvent.BroadcastTarget unlolTarget; private TBMCSystemChatEvent.BroadcastTarget fTarget; @@ -119,7 +119,7 @@ public class FunComponent extends Component implements Listener { FPlayer.FDeaths().set(FPlayer.FDeaths().get() + 1); TBMCChatAPI.SendSystemMessage(Channel.GlobalChat, Channel.RecipientTestResult.ALL, "§bPress F to pay respects.§r", fTarget); - Bukkit.getScheduler().runTaskLaterAsynchronously(PluginMain.Instance, tt, 15 * 20); + Ftask = Bukkit.getScheduler().runTaskLaterAsynchronously(PluginMain.Instance, tt, 15 * 20); } } @EventHandler diff --git a/src/main/java/buttondevteam/chat/listener/PlayerListener.java b/src/main/java/buttondevteam/chat/listener/PlayerListener.java index eb3aaf9..b9c05e7 100644 --- a/src/main/java/buttondevteam/chat/listener/PlayerListener.java +++ b/src/main/java/buttondevteam/chat/listener/PlayerListener.java @@ -161,6 +161,8 @@ public class PlayerListener implements Listener { } } + private long lastError = 0; + @EventHandler public void onPlayerTBMCChat(TBMCChatEvent e) { try { @@ -169,6 +171,13 @@ public class PlayerListener implements Listener { HistoryCommand.addChatMessage(e.getCm(), e.getChannel()); e.setCancelled(FormatterComponent.handleChat(e)); } catch (NoClassDefFoundError | Exception ex) { // Weird things can happen + if (lastError < System.nanoTime() - 1000L * 1000L * 1000L * 60 * 60 //60 mins + && Bukkit.getOnlinePlayers().size() > 0) { //If there are no players on, display to the first person + lastError = System.nanoTime(); //I put the whole thing in the if to protect against race conditions + for (Player p : Bukkit.getOnlinePlayers()) + if (e.shouldSendTo(p)) + p.sendMessage("[" + e.getChannel().DisplayName().get() + "] §cSome features in the message below might be unavailable due to an error."); + } ChatUtils.sendChatMessage(e, s -> "§c!§r" + s); TBMCCoreAPI.SendException("An error occured while processing a chat message!", ex); }