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);
}