diff --git a/src/main/java/buttondevteam/chat/PluginMain.java b/src/main/java/buttondevteam/chat/PluginMain.java index b6095a1..6e0f929 100644 --- a/src/main/java/buttondevteam/chat/PluginMain.java +++ b/src/main/java/buttondevteam/chat/PluginMain.java @@ -16,7 +16,6 @@ import buttondevteam.chat.components.towncolors.TownColorComponent; import buttondevteam.chat.components.towny.TownyComponent; import buttondevteam.chat.listener.PlayerJoinLeaveListener; import buttondevteam.chat.listener.PlayerListener; -import buttondevteam.core.MainPlugin; import buttondevteam.core.component.channel.Channel; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.architecture.ButtonPlugin; @@ -37,12 +36,12 @@ public class PluginMain extends ButtonPlugin { // Translated to Java: 2015.07.15 public static PluginMain Instance; public static ConsoleCommandSender Console; - public ConfigData notificationSound() { - return getIConfig().getData("notificationSound", ""); - } - - public ConfigData notificationPitch() { - return getIConfig().getData("notificationPitch", 1.0f); + /** + * If enabled, stores and displays the last 10 messages the player can see (public, their town chat etc.) + * Can be used with the Discord plugin so players can see some of the conversation they missed that's visible on Discord anyways. + */ + public ConfigData storeChatHistory() { + return getIConfig().getData("storeChatHistory", true); } // Fired when plugin is first enabled diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java b/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java index 4dc3ba2..25393be 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java +++ b/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java @@ -1,5 +1,6 @@ package buttondevteam.chat.commands.ucmds; +import buttondevteam.chat.PluginMain; import buttondevteam.core.component.channel.Channel; import buttondevteam.lib.chat.ChatMessage; import buttondevteam.lib.chat.Command2; @@ -29,6 +30,10 @@ public class HistoryCommand extends UCommandBase { } public static boolean showHistory(CommandSender sender, String channel) { + if (!PluginMain.Instance.storeChatHistory().get()) { + sender.sendMessage("§6Chat history is disabled"); + return true; + } Function> getThem = ch -> messages.get(ch.ID + "_" + ch.getGroupID(sender)); //If can't see, groupID is null, and that shouldn't be in the map sender.sendMessage("§6---- Chat History ----"); Stream stream; @@ -69,6 +74,7 @@ public class HistoryCommand extends UCommandBase { } public static void addChatMessage(ChatMessage chatMessage, Channel channel) { + if (!PluginMain.Instance.storeChatHistory().get()) return; val groupID = channel.getGroupID(chatMessage.getPermCheck()); if (groupID == null) return; //Just to be sure synchronized (messages) { diff --git a/src/main/java/buttondevteam/chat/components/announce/AnnouncerComponent.java b/src/main/java/buttondevteam/chat/components/announce/AnnouncerComponent.java index 1d41d62..10aa1ac 100644 --- a/src/main/java/buttondevteam/chat/components/announce/AnnouncerComponent.java +++ b/src/main/java/buttondevteam/chat/components/announce/AnnouncerComponent.java @@ -10,18 +10,27 @@ import org.bukkit.Bukkit; import java.util.ArrayList; +/** + * Displays the configured messages at the set interval when someone is online. + */ public class AnnouncerComponent extends Component implements Runnable { + /** + * The messages to display to players. + */ public ConfigData> announceMessages() { return getConfig().getData("announceMessages", new ArrayList<>(0)); } + /** + * The time in milliseconds between the messages. Use /u announce settime to set minutes. + */ public ConfigData announceTime() { return getConfig().getData("announceTime", 15 * 60 * 1000); } private TBMCSystemChatEvent.BroadcastTarget target; - private static int AnnounceMessageIndex = 0; + private int AnnounceMessageIndex = 0; @Override public void run() { @@ -43,7 +52,7 @@ public class AnnouncerComponent extends Component implements Runnabl @Override protected void enable() { - target= TBMCSystemChatEvent.BroadcastTarget.add("announcements"); + target = TBMCSystemChatEvent.BroadcastTarget.add("announcements"); registerCommand(new AnnounceCommand(this)); new Thread(this).start(); } diff --git a/src/main/java/buttondevteam/chat/components/appendext/AppendTextComponent.java b/src/main/java/buttondevteam/chat/components/appendext/AppendTextComponent.java index 7bd9778..8d9c3dd 100644 --- a/src/main/java/buttondevteam/chat/components/appendext/AppendTextComponent.java +++ b/src/main/java/buttondevteam/chat/components/appendext/AppendTextComponent.java @@ -15,8 +15,12 @@ import java.util.Map; import java.util.NoSuchElementException; import java.util.function.Consumer; +/** + * Allows players to append tableflips and other things to their messages. Everything is configurable here. + */ public class AppendTextComponent extends Component { private Map appendTexts; + private ConfigData helpText(IHaveConfig config) { return config.getData("helpText", () -> new String[]{ "Tableflip", // diff --git a/src/main/java/buttondevteam/chat/components/chatonly/ChatOnlyComponent.java b/src/main/java/buttondevteam/chat/components/chatonly/ChatOnlyComponent.java index 5f012dd..6aa9763 100644 --- a/src/main/java/buttondevteam/chat/components/chatonly/ChatOnlyComponent.java +++ b/src/main/java/buttondevteam/chat/components/chatonly/ChatOnlyComponent.java @@ -15,6 +15,9 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerTeleportEvent; +/** + * Allows players to enter chat-only mode which puts them into spectator mode and disallows everything besides chatting. + */ public class ChatOnlyComponent extends Component implements Listener { @Override protected void enable() { diff --git a/src/main/java/buttondevteam/chat/components/flair/FlairComponent.java b/src/main/java/buttondevteam/chat/components/flair/FlairComponent.java index 7c8440a..38948fb 100644 --- a/src/main/java/buttondevteam/chat/components/flair/FlairComponent.java +++ b/src/main/java/buttondevteam/chat/components/flair/FlairComponent.java @@ -22,9 +22,16 @@ import java.net.UnknownHostException; import java.text.SimpleDateFormat; import java.util.*; +/** + * This component checks a specific Reddit thread every 10 seconds for comments such as "IGN: NorbiPeti" to link Reddit accounts and to determine their /r/thebutton flair. + * This was the original goal of this plugin when it was made. + */ public class FlairComponent extends Component { + /** + * The Reddit thread to check for account connections. Re-enable the component if this was empty. + */ ConfigData flairThreadURL() { - return getConfig().getData("flairThreadURL", "https://www.reddit.com/r/Chromagamers/comments/51ys94/flair_thread_for_the_mc_server/"); + return getConfig().getData("flairThreadURL", ""); } /** @@ -52,7 +59,7 @@ public class FlairComponent extends Component { private void FlairGetterThreadMethod() { int errorcount = 0; - while (isEnabled()) { + while (isEnabled() && flairThreadURL().get().length() > 0) { try { String body = TBMCCoreAPI.DownloadString(flairThreadURL().get() + ".json?limit=1000"); JsonArray json = new JsonParser().parse(body).getAsJsonArray().get(1).getAsJsonObject().get("data") diff --git a/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java b/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java index fbbacca..fa14b21 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java +++ b/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java @@ -107,7 +107,7 @@ public class ChatProcessing { var players = ImmutableList.copyOf(Bukkit.getOnlinePlayers()); var playerC = new Random().nextInt(players.size()); var player = players.get(playerC); - playPingSound(player); + playPingSound(player, ComponentManager.getIfEnabled(FormatterComponent.class)); return "@someone (" + player.getDisplayName() + ")"; }).build()); private static Gson gson = new GsonBuilder() @@ -157,7 +157,7 @@ public class ChatProcessing { ArrayList formatters; if (component.allowFormatting().get()) { - formatters = addFormatters(colormode, e::shouldSendTo); + formatters = addFormatters(colormode, e::shouldSendTo, component); if (colormode == channel.Color().get() && mp != null && mp.RainbowPresserColorMode) { // Only overwrite channel color final AtomicInteger rpc = new AtomicInteger(0); formatters.add(ChatFormatter.builder("word", WORD_PATTERN).color(colormode).onmatch((match, cf, s) -> { @@ -260,7 +260,7 @@ public class ChatProcessing { + "]"; } - static ArrayList addFormatters(Color colormode, Predicate canSee) { + static ArrayList addFormatters(Color colormode, Predicate canSee, @Nullable FormatterComponent component) { @SuppressWarnings("unchecked") ArrayList formatters = (ArrayList) commonFormatters.clone(); @@ -317,7 +317,7 @@ public class ChatProcessing { } ChatPlayer mpp = TBMCPlayer.getPlayer(nottest ? p.getUniqueId() : new UUID(0, 0), ChatPlayer.class); if (nottest) { - playPingSound(p); + playPingSound(p, component); } String color = String.format("§%x", (mpp.GetFlairColor() == 0x00 ? 0xb : mpp.GetFlairColor())); return color + (nottest ? p.getName() : pn.get()) + "§r"; //Fix name casing, except when testing @@ -333,7 +333,7 @@ public class ChatProcessing { + match.toLowerCase() + " but was reported as online."); return "§c" + match + "§r"; } - playPingSound(p); + playPingSound(p, component); return PluginMain.essentials.getUser(p).getNickname(); } error.accept("Player nicknamed " + match.toLowerCase() @@ -344,12 +344,12 @@ public class ChatProcessing { return formatters; } - private static void playPingSound(Player p) { - if (PluginMain.Instance.notificationSound().get().length() == 0) + private static void playPingSound(Player p, @Nullable FormatterComponent component) { + if (component == null || component.notificationSound().get().length() == 0) p.playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1.0f, 0.5f); // TODO: Airhorn else - p.playSound(p.getLocation(), PluginMain.Instance.notificationSound().get(), 1.0f, - PluginMain.Instance.notificationPitch().get()); + p.playSound(p.getLocation(), component.notificationSound().get(), 1.0f, + component.notificationPitch().get()); } static void doFunStuff(CommandSender sender, TBMCChatEventBase event, String message) { diff --git a/src/main/java/buttondevteam/chat/components/formatter/FormatterComponent.java b/src/main/java/buttondevteam/chat/components/formatter/FormatterComponent.java index 6789b0d..2f9ec20 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/FormatterComponent.java +++ b/src/main/java/buttondevteam/chat/components/formatter/FormatterComponent.java @@ -8,14 +8,33 @@ import buttondevteam.lib.architecture.Component; import buttondevteam.lib.architecture.ConfigData; /** - * This component handles the custom processing of chat messages. If this component is disabled channels won't be supported either in Minecraft. + * This component handles the custom processing of chat messages. If this component is disabled channels won't be supported in Minecraft. * If you only want to disable the formatting features, set allowFormatting to false. + * If you're using another chat plugin, you should disable the whole component. */ public class FormatterComponent extends Component { + /** + * Determines whether Markdown formatting, name mentioning and similar features are enabled. + */ ConfigData allowFormatting() { return getConfig().getData("allowFormatting", true); } + /** + * The sound to play when a player is mentioned. Leave empty to use default. + */ + public ConfigData notificationSound() { + return getConfig().getData("notificationSound", ""); + } + + /** + * The pitch of the notification sound. + */ + public ConfigData notificationPitch() { + return getConfig().getData("notificationPitch", 1.0f); + } + + @Override protected void enable() { MainPlugin.Instance.setChatHandlerEnabled(false); //Disable Core chat handler - if this component is disabled then let it do it's job diff --git a/src/main/java/buttondevteam/chat/components/fun/FunComponent.java b/src/main/java/buttondevteam/chat/components/fun/FunComponent.java index bd8cceb..3eff9cd 100644 --- a/src/main/java/buttondevteam/chat/components/fun/FunComponent.java +++ b/src/main/java/buttondevteam/chat/components/fun/FunComponent.java @@ -29,6 +29,9 @@ import org.bukkit.scheduler.BukkitTask; import java.util.HashSet; import java.util.Random; +/** + * Random things I added over the years. + */ public class FunComponent extends Component implements Listener { private boolean ActiveF = false; private ChatPlayer FPlayer = null; @@ -38,14 +41,26 @@ public class FunComponent extends Component implements Listener { private TBMCSystemChatEvent.BroadcastTarget unlolTarget; private TBMCSystemChatEvent.BroadcastTarget fTarget; + /** + * The strings that count as laughs, see unlol. + */ private ConfigData laughStrings() { return getConfig().getData("laughStrings", () -> new String[]{"xd", "lel", "lawl", "kek", "lmao", "hue", "hah", "rofl"}); } + /** + * The "Press F to pay respects" meme in Minecraft. It will randomly appear on player death and keep track of how many "F"s are said in chat. + * You can hover over a player's name to see their respect. + */ private ConfigData respect() { return getConfig().getData("respect", true); } + /** + * This is a sort of inside joke between me and Ghostise, who said "no, it was very unlol" after I said lol. + * It keeps track of laughs (lols and what's defined in laughStrings) and if someone does /unlol or /unlaugh it will unlaugh the last person who laughed. + * This action can only be performed once per laugh. + */ private ConfigData unlol() { return getConfig().getData("unlol", true); } @@ -105,7 +120,7 @@ public class FunComponent extends Component implements Listener { FPlayer.FCount().set(FPlayer.FCount().get() + Fs.size()); TBMCChatAPI.SendSystemMessage(Channel.GlobalChat, Channel.RecipientTestResult.ALL, "§b" + Fs.size() + " " + (Fs.size() == 1 ? "person" : "people") - + " paid their respects.§r", fTarget); + + " paid their respects.§r", fTarget); Fs.clear(); } }; @@ -122,6 +137,7 @@ public class FunComponent extends Component implements Listener { Ftask = Bukkit.getScheduler().runTaskLaterAsynchronously(PluginMain.Instance, tt, 15 * 20); } } + @EventHandler public void onPlayerLeave(PlayerQuitEvent event) { if (unlol().get()) diff --git a/src/main/java/buttondevteam/chat/components/towncolors/TownColorComponent.java b/src/main/java/buttondevteam/chat/components/towncolors/TownColorComponent.java index d685030..c41e86a 100644 --- a/src/main/java/buttondevteam/chat/components/towncolors/TownColorComponent.java +++ b/src/main/java/buttondevteam/chat/components/towncolors/TownColorComponent.java @@ -34,6 +34,10 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; +/** + * Town colors for Towny. It allows mayors and kings to set a color for their town/nation (nation can be disabled). + * This color is applied to the player names in chat and on Dynmap, if used. + */ @ComponentMetadata(depends = TownyComponent.class) public class TownColorComponent extends Component implements Listener { /** @@ -45,10 +49,17 @@ public class TownColorComponent extends Component implements Listene */ public static Map NationColor = new HashMap<>(); + /** + * The amount of town colors allowed. If more than one is used, players can change how many letters to be in a specific color using /u ncolor. + */ public ConfigData colorCount() { return getConfig().getData("colorCount", (byte) 1, cc -> ((Integer) cc).byteValue(), Byte::intValue); } + /** + * If enabled, players will have a nation-defined color in addition to town colors, white by default. + * They can change how much of each color they want with this as well. + */ public ConfigData useNationColors() { return getConfig().getData("useNationColors", true); } @@ -60,7 +71,6 @@ public class TownColorComponent extends Component implements Listene @Override protected void enable() { component = this; - //TODO: Don't register all commands automatically (welp) Consumer loadTC = cs -> TownColorComponent.TownColors.putAll(cs.getValues(true).entrySet().stream() .collect(Collectors.toMap(Map.Entry::getKey, v -> ((List) v.getValue()).stream() .map(Color::valueOf).toArray(Color[]::new)))); diff --git a/src/main/java/buttondevteam/chat/components/towny/TownyComponent.java b/src/main/java/buttondevteam/chat/components/towny/TownyComponent.java index a77bc83..7ee1735 100644 --- a/src/main/java/buttondevteam/chat/components/towny/TownyComponent.java +++ b/src/main/java/buttondevteam/chat/components/towny/TownyComponent.java @@ -22,6 +22,10 @@ import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; +/** + * This component manages the town and nation chat. It's also needed for the TownColorComponent. + * It provides the TC and NC channels, and posts Towny messages (global, town, nation) to the correct channels for other platforms like Discord. + */ public class TownyComponent extends Component { public static TownyUniverse TU; private static ArrayList Towns; diff --git a/src/main/java/buttondevteam/chat/listener/PlayerJoinLeaveListener.java b/src/main/java/buttondevteam/chat/listener/PlayerJoinLeaveListener.java index 9b1e999..6023038 100644 --- a/src/main/java/buttondevteam/chat/listener/PlayerJoinLeaveListener.java +++ b/src/main/java/buttondevteam/chat/listener/PlayerJoinLeaveListener.java @@ -57,7 +57,8 @@ public class PlayerJoinLeaveListener implements Listener { nwithoutformatting = p.getName(); PlayerListener.nicknames.forcePut(nwithoutformatting.toLowerCase(), p.getUniqueId()); //TODO: FormatterComponent - HistoryCommand.showHistory(e.getPlayer(), null); + if (PluginMain.Instance.storeChatHistory().get()) + HistoryCommand.showHistory(e.getPlayer(), null); } @EventHandler diff --git a/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java b/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java index ecd3def..cf8c43d 100644 --- a/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java +++ b/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java @@ -98,7 +98,7 @@ public class ChatFormatIT { @Test public void testMessage() { - ArrayList cfs = ChatProcessing.addFormatters(Color.White, p -> true); + ArrayList cfs = ChatProcessing.addFormatters(Color.White, p -> true, null); final String chid = ChatProcessing.getChannelID(Channel.GlobalChat, ChatUtils.MCORIGIN); final TellrawPart tp = ChatProcessing.createTellraw(sender, message, null, null, null, chid, ChatUtils.MCORIGIN); ChatFormatter.Combine(cfs, message, tp, null);