From 3f387a9775272770caec989961658eb40456a6d7 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sun, 13 Jan 2019 01:40:54 +0100 Subject: [PATCH] C o m p o n e n t s FlairComponent AnnouncerComponent TownyComponent Some fixes Removed old fields and JarUtils #85 #84 #4 --- .../buttondevteam/chat/AnnouncerThread.java | 25 -- .../java/buttondevteam/chat/ChatPlayer.java | 267 ++++++++-------- .../java/buttondevteam/chat/JarUtils.java | 90 ------ .../java/buttondevteam/chat/PluginMain.java | 268 +--------------- .../chat/commands/ucmds/HistoryCommand.java | 4 +- .../chat/commands/ucmds/NColorCommand.java | 3 +- .../commands/ucmds/NationColorCommand.java | 6 +- .../chat/commands/ucmds/TownColorCommand.java | 6 +- .../ucmds/admin/NationColorCommand.java | 3 +- .../ucmds/admin/TownColorCommand.java | 9 +- .../chat/components/TownyComponent.java | 15 - .../announce/AddCommand.java | 73 +++-- .../announce/AnnounceCommandBase.java | 26 +- .../announce/AnnouncerComponent.java | 50 +++ .../announce/EditCommand.java | 89 +++--- .../announce/ListCommand.java | 55 ++-- .../announce/RemoveCommand.java | 58 ++-- .../announce/SetTimeCommand.java | 64 ++-- .../flair}/AcceptCommand.java | 196 ++++++------ .../chat/components/flair/FlairComponent.java | 185 +++++++++++ .../{ => components/flair}/FlairStates.java | 10 +- .../flair}/IgnoreCommand.java | 87 +++--- .../flair}/SetFlairCommand.java | 141 +++++---- .../{ => towny}/TownyAnnouncer.java | 6 +- .../chat/components/towny/TownyComponent.java | 94 ++++++ .../listener/PlayerJoinLeaveListener.java | 293 +++++++++--------- .../chat/listener/PlayerListener.java | 23 +- 27 files changed, 1046 insertions(+), 1100 deletions(-) delete mode 100644 src/main/java/buttondevteam/chat/AnnouncerThread.java delete mode 100644 src/main/java/buttondevteam/chat/JarUtils.java delete mode 100644 src/main/java/buttondevteam/chat/components/TownyComponent.java rename src/main/java/buttondevteam/chat/{commands/ucmds => components}/announce/AddCommand.java (84%) rename src/main/java/buttondevteam/chat/{commands/ucmds => components}/announce/AnnounceCommandBase.java (84%) create mode 100644 src/main/java/buttondevteam/chat/components/announce/AnnouncerComponent.java rename src/main/java/buttondevteam/chat/{commands/ucmds => components}/announce/EditCommand.java (79%) rename src/main/java/buttondevteam/chat/{commands/ucmds => components}/announce/ListCommand.java (72%) rename src/main/java/buttondevteam/chat/{commands/ucmds => components}/announce/RemoveCommand.java (78%) rename src/main/java/buttondevteam/chat/{commands/ucmds => components}/announce/SetTimeCommand.java (78%) rename src/main/java/buttondevteam/chat/{commands/ucmds => components/flair}/AcceptCommand.java (91%) create mode 100644 src/main/java/buttondevteam/chat/components/flair/FlairComponent.java rename src/main/java/buttondevteam/chat/{ => components/flair}/FlairStates.java (64%) rename src/main/java/buttondevteam/chat/{commands/ucmds => components/flair}/IgnoreCommand.java (92%) rename src/main/java/buttondevteam/chat/{commands/ucmds/admin => components/flair}/SetFlairCommand.java (87%) rename src/main/java/buttondevteam/chat/components/{ => towny}/TownyAnnouncer.java (86%) create mode 100644 src/main/java/buttondevteam/chat/components/towny/TownyComponent.java diff --git a/src/main/java/buttondevteam/chat/AnnouncerThread.java b/src/main/java/buttondevteam/chat/AnnouncerThread.java deleted file mode 100644 index 60d40e7..0000000 --- a/src/main/java/buttondevteam/chat/AnnouncerThread.java +++ /dev/null @@ -1,25 +0,0 @@ -package buttondevteam.chat; - -import org.bukkit.Bukkit; - -public class AnnouncerThread implements Runnable { - private static int AnnounceMessageIndex = 0; - - @Override - public void run() { - while (!PluginMain.Instance.stop) { - try { - Thread.sleep(PluginMain.AnnounceTime); - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - } - if (Bukkit.getOnlinePlayers().size() == 0) continue; //Don't post to Discord if nobody is on - if (PluginMain.AnnounceMessages.size() > AnnounceMessageIndex) { - Bukkit.broadcastMessage(PluginMain.AnnounceMessages.get(AnnounceMessageIndex)); - AnnounceMessageIndex++; - if (AnnounceMessageIndex == PluginMain.AnnounceMessages.size()) - AnnounceMessageIndex = 0; - } - } - } -} diff --git a/src/main/java/buttondevteam/chat/ChatPlayer.java b/src/main/java/buttondevteam/chat/ChatPlayer.java index 2ffa48d..f3ee87b 100644 --- a/src/main/java/buttondevteam/chat/ChatPlayer.java +++ b/src/main/java/buttondevteam/chat/ChatPlayer.java @@ -1,135 +1,132 @@ -package buttondevteam.chat; - -import buttondevteam.lib.chat.Color; -import buttondevteam.lib.player.EnumPlayerData; -import buttondevteam.lib.player.PlayerClass; -import buttondevteam.lib.player.PlayerData; -import buttondevteam.lib.player.TBMCPlayerBase; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -@PlayerClass(pluginname = "Button1Chat") -public class ChatPlayer extends TBMCPlayerBase { - public PlayerData UserName() { - return data(null); - } - - public List UserNames() { - return data(new ArrayList()).get(); - } - - public PlayerData FlairTime() { - return data(FlairTimeNone); - } - - public EnumPlayerData FlairState() { - return dataEnum(FlairStates.class, FlairStates.NoComment); - } - - public PlayerData FCount() { - return data(0); - } - - public PlayerData FDeaths() { - return data(0); - } - - public PlayerData FlairCheater() { - return data(false); - } - - public PlayerData> NameColorLocations() { // No byte[], no TIntArrayList - return data(null); - } - - public Location SavedLocation; - public boolean Working; - // public int Tables = 10; - public boolean SendingLink = false; - public boolean RainbowPresserColorMode = false; - public Color OtherColorMode = null; - public boolean ChatOnly = false; - public int LoginWarningCount = 0; - - public static final int FlairTimeNonPresser = -1; - public static final int FlairTimeCantPress = -2; - public static final int FlairTimeNone = -3; - - /** - * Gets the player's flair, optionally formatting for Minecraft. - * - * @param noformats - * The MC formatting codes will be only applied if false - * @return The flair - */ - public String GetFormattedFlair(boolean noformats) { - int time = FlairTime().get(); - if (time == FlairTimeCantPress) - return noformats ? "(can't press)" : "§r(--s)§r"; - if (time == FlairTimeNonPresser) - return noformats ? "(non-presser)" : "§7(--s)§r"; - if (time == FlairTimeNone) - return ""; - return noformats ? String.format("(%ds)", time) : String.format("§%x(%ds)§r", GetFlairColor(), time); - } - - /** - * Gets the player's flair, formatted for Minecraft. - * - * @return The flair - */ - public String GetFormattedFlair() { - return GetFormattedFlair(false); - } - - public void SetFlair(int time) { - FlairTime().set(time); - FlairUpdate(); - } - - public void SetFlair(int time, boolean cheater) { - FlairTime().set(time); - FlairCheater().set(cheater); - FlairUpdate(); - } - - public void FlairUpdate() { - - // Flairs from Command Block The Button - Teams - // PluginMain.Instance.getServer().getScoreboardManager().getMainScoreboard().getTeams().add() - Player p = Bukkit.getPlayer(uuid); - if (p != null) - p.setPlayerListName(String.format("%s%s", p.getDisplayName(), GetFormattedFlair())); - } - - public short GetFlairColor() { - if (FlairCheater().get()) - return 0x5; - final int flairTime = FlairTime().get(); - if (flairTime == FlairTimeNonPresser) - return 0x7; - else if (flairTime == FlairTimeCantPress) - return 0xf; - else if (flairTime <= 60 && flairTime >= 52) - return 0x5; - else if (flairTime <= 51 && flairTime >= 42) - return 0x9; - else if (flairTime <= 41 && flairTime >= 32) - return 0xa; - else if (flairTime <= 31 && flairTime >= 22) - return 0xe; - else if (flairTime <= 21 && flairTime >= 11) - return 0x6; - else if (flairTime <= 11 && flairTime >= 0) - return 0xc; - return 0x00; //Return 0 if none or too high, so names will get aqua default color, not white - } - - public double getF() { - return (double) FCount().get() / (double) FDeaths().get(); - } -} +package buttondevteam.chat; + +import buttondevteam.chat.components.flair.FlairStates; +import buttondevteam.lib.chat.Color; +import buttondevteam.lib.player.EnumPlayerData; +import buttondevteam.lib.player.PlayerClass; +import buttondevteam.lib.player.PlayerData; +import buttondevteam.lib.player.TBMCPlayerBase; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +@PlayerClass(pluginname = "Button1Chat") +public class ChatPlayer extends TBMCPlayerBase { + public PlayerData UserName() { + return data(null); + } + + public List UserNames() { + return data(new ArrayList()).get(); + } + + public PlayerData FlairTime() { + return data(FlairTimeNone); + } + + public EnumPlayerData FlairState() { + return dataEnum(FlairStates.class, FlairStates.NoComment); + } + + public PlayerData FCount() { + return data(0); + } + + public PlayerData FDeaths() { + return data(0); + } + + public PlayerData FlairCheater() { + return data(false); + } + + public PlayerData> NameColorLocations() { // No byte[], no TIntArrayList + return data(null); + } + + public boolean Working; + // public int Tables = 10; + public boolean RainbowPresserColorMode = false; + public Color OtherColorMode = null; + public boolean ChatOnly = false; + + public static final int FlairTimeNonPresser = -1; + public static final int FlairTimeCantPress = -2; + public static final int FlairTimeNone = -3; + + /** + * Gets the player's flair, optionally formatting for Minecraft. + * + * @param noformats + * The MC formatting codes will be only applied if false + * @return The flair + */ + public String GetFormattedFlair(boolean noformats) { + int time = FlairTime().get(); + if (time == FlairTimeCantPress) + return noformats ? "(can't press)" : "§r(--s)§r"; + if (time == FlairTimeNonPresser) + return noformats ? "(non-presser)" : "§7(--s)§r"; + if (time == FlairTimeNone) + return ""; + return noformats ? String.format("(%ds)", time) : String.format("§%x(%ds)§r", GetFlairColor(), time); + } + + /** + * Gets the player's flair, formatted for Minecraft. + * + * @return The flair + */ + public String GetFormattedFlair() { + return GetFormattedFlair(false); + } + + public void SetFlair(int time) { + FlairTime().set(time); + FlairUpdate(); + } + + public void SetFlair(int time, boolean cheater) { + FlairTime().set(time); + FlairCheater().set(cheater); + FlairUpdate(); + } + + public void FlairUpdate() { + + // Flairs from Command Block The Button - Teams + // PluginMain.Instance.getServer().getScoreboardManager().getMainScoreboard().getTeams().add() + Player p = Bukkit.getPlayer(uuid); + if (p != null) + p.setPlayerListName(String.format("%s%s", p.getDisplayName(), GetFormattedFlair())); + } + + public short GetFlairColor() { + if (FlairCheater().get()) + return 0x5; + final int flairTime = FlairTime().get(); + if (flairTime == FlairTimeNonPresser) + return 0x7; + else if (flairTime == FlairTimeCantPress) + return 0xf; + else if (flairTime <= 60 && flairTime >= 52) + return 0x5; + else if (flairTime <= 51 && flairTime >= 42) + return 0x9; + else if (flairTime <= 41 && flairTime >= 32) + return 0xa; + else if (flairTime <= 31 && flairTime >= 22) + return 0xe; + else if (flairTime <= 21 && flairTime >= 11) + return 0x6; + else if (flairTime <= 11 && flairTime >= 0) + return 0xc; + return 0x00; //Return 0 if none or too high, so names will get aqua default color, not white + } + + public double getF() { + return (double) FCount().get() / (double) FDeaths().get(); + } +} diff --git a/src/main/java/buttondevteam/chat/JarUtils.java b/src/main/java/buttondevteam/chat/JarUtils.java deleted file mode 100644 index 5e8c2d6..0000000 --- a/src/main/java/buttondevteam/chat/JarUtils.java +++ /dev/null @@ -1,90 +0,0 @@ -package buttondevteam.chat; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URL; -import java.net.URLDecoder; -import java.util.Enumeration; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; - -public class JarUtils { - - public static boolean extractFromJar(final String fileName, - final String dest) throws IOException { - if (getRunningJar() == null) { - return false; - } - final File file = new File(dest); - if (file.isDirectory()) { - file.mkdir(); - return false; - } - if (!file.exists()) { - file.getParentFile().mkdirs(); - } - - final JarFile jar = getRunningJar(); - final Enumeration e = jar.entries(); - while (e.hasMoreElements()) { - final JarEntry je = e.nextElement(); - if (!je.getName().contains(fileName)) { - continue; - } - final InputStream in = new BufferedInputStream( - jar.getInputStream(je)); - final OutputStream out = new BufferedOutputStream( - new FileOutputStream(file)); - copyInputStream(in, out); - jar.close(); - return true; - } - jar.close(); - return false; - } - - private final static void copyInputStream(final InputStream in, - final OutputStream out) throws IOException { - try { - final byte[] buff = new byte[4096]; - int n; - while ((n = in.read(buff)) > 0) { - out.write(buff, 0, n); - } - } finally { - out.flush(); - out.close(); - in.close(); - } - } - - public static URL getJarUrl(final File file) throws IOException { - return new URL("jar:" + file.toURI().toURL().toExternalForm() + "!/"); - } - - public static JarFile getRunningJar() throws IOException { - if (!RUNNING_FROM_JAR) { - return null; // null if not running from jar - } - String path = new File(JarUtils.class.getProtectionDomain() - .getCodeSource().getLocation().getPath()).getAbsolutePath(); - path = URLDecoder.decode(path, "UTF-8"); - return new JarFile(path); - } - - private static boolean RUNNING_FROM_JAR = false; - - static { - final URL resource = JarUtils.class.getClassLoader().getResource( - "plugin.yml"); - if (resource != null) { - RUNNING_FROM_JAR = true; - } - } - -} diff --git a/src/main/java/buttondevteam/chat/PluginMain.java b/src/main/java/buttondevteam/chat/PluginMain.java index 157c743..1599d6f 100644 --- a/src/main/java/buttondevteam/chat/PluginMain.java +++ b/src/main/java/buttondevteam/chat/PluginMain.java @@ -3,52 +3,36 @@ package buttondevteam.chat; import buttondevteam.chat.commands.YeehawCommand; import buttondevteam.chat.commands.ucmds.TownColorCommand; import buttondevteam.chat.components.TownColorComponent; -import buttondevteam.chat.components.TownyComponent; +import buttondevteam.chat.components.announce.AnnouncerComponent; +import buttondevteam.chat.components.flair.FlairComponent; +import buttondevteam.chat.components.towny.TownyComponent; import buttondevteam.chat.listener.PlayerJoinLeaveListener; import buttondevteam.chat.listener.PlayerListener; import buttondevteam.chat.listener.TownyListener; import buttondevteam.component.channel.Channel; -import buttondevteam.component.channel.Channel.RecipientTestResult; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.architecture.Component; import buttondevteam.lib.chat.Color; import buttondevteam.lib.chat.TBMCChatAPI; -import buttondevteam.lib.player.TBMCPlayerBase; import com.earth2me.essentials.Essentials; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.palmergames.bukkit.towny.Towny; -import com.palmergames.bukkit.towny.exceptions.NotRegisteredException; -import com.palmergames.bukkit.towny.object.Nation; -import com.palmergames.bukkit.towny.object.Resident; -import com.palmergames.bukkit.towny.object.Town; -import com.palmergames.bukkit.towny.object.TownyUniverse; import lombok.val; import net.milkbowl.vault.chat.Chat; import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.permission.Permission; import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scoreboard.Scoreboard; import org.dynmap.towny.DTBridge; import org.dynmap.towny.DynmapTownyPlugin; -import org.htmlcleaner.HtmlCleaner; -import org.htmlcleaner.TagNode; import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; -import java.net.UnknownHostException; -import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @@ -57,26 +41,11 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15. // https://www.reddit.com/r/thebutton/comments/31c32v/i_pressed_the_button_without_really_thinking/ public static PluginMain Instance; public static ConsoleCommandSender Console; - private final static String FlairThreadURL = "https://www.reddit.com/r/Chromagamers/comments/51ys94/flair_thread_for_the_mc_server/"; public static Scoreboard SB; - public static TownyUniverse TU; - private static ArrayList Towns; - private static ArrayList Nations; public static Channel TownChat; public static Channel NationChat; - private static Channel RPChannel; - - /** - *

- * This variable is used as a cache for flair state checking when reading the flair thread. - *

- *

- * It's used because normally it has to load all associated player files every time to read the flair state - *

- */ - private Set PlayersWithFlairs = new HashSet<>(); // Fired when plugin is first enabled @Override @@ -92,18 +61,12 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15. LoadFiles(); SB = getServer().getScoreboardManager().getMainScoreboard(); // Main can be detected with @a[score_...] - TU = ((Towny) Bukkit.getPluginManager().getPlugin("Towny")).getTownyUniverse(); - Towns = TU.getTownsMap().values().stream().map(Town::getName).collect(Collectors.toCollection(ArrayList::new)); // Creates a snapshot of towns, new towns will be added when needed - Nations = TU.getNationsMap().values().stream().map(Nation::getName).collect(Collectors.toCollection(ArrayList::new)); // Same here but with nations - TownColors.keySet().removeIf(t -> !TU.getTownsMap().containsKey(t)); // Removes town colors for deleted/renamed towns - NationColor.keySet().removeIf(n -> !TU.getNationsMap().containsKey(n)); // Removes nation colors for deleted/renamed nations + Component.registerComponent(this, new TownyComponent()); + TownColors.keySet().removeIf(t -> !TownyComponent.TU.getTownsMap().containsKey(t)); // Removes town colors for deleted/renamed towns + NationColor.keySet().removeIf(n -> !TownyComponent.TU.getNationsMap().containsKey(n)); // Removes nation colors for deleted/renamed nations - TBMCChatAPI.RegisterChatChannel( - TownChat = new Channel("§3TC§f", Color.DarkAqua, "tc", s -> checkTownNationChat(s, false))); - TBMCChatAPI.RegisterChatChannel( - NationChat = new Channel("§6NC§f", Color.Gold, "nc", s -> checkTownNationChat(s, true))); - TBMCChatAPI.RegisterChatChannel(RPChannel = new Channel("§7RP§f", Color.Gray, "rp", null)); //Since it's null, it's recognised as global + TBMCChatAPI.RegisterChatChannel(new Channel("§7RP§f", Color.Gray, "rp", null)); //Since it's null, it's recognised as global Bukkit.getScheduler().runTask(this, () -> { val dtp = (DynmapTownyPlugin) Bukkit.getPluginManager().getPlugin("Dynmap-Towny"); @@ -116,11 +79,9 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15. if (!setupEconomy() || !setupPermissions()) TBMCCoreAPI.SendException("We're in trouble", new Exception("Failed to set up economy or permissions!")); - new Thread(this::FlairGetterThreadMethod).start(); - new Thread(new AnnouncerThread()).start(); - - Component.registerComponent(this, new TownyComponent()); Component.registerComponent(this, new TownColorComponent()); + Component.registerComponent(this, new FlairComponent()); //The original purpose of this plugin + Component.registerComponent(this, new AnnouncerComponent()); } /** @@ -140,152 +101,14 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15. } } - public Boolean stop = false; public static Essentials essentials = null; // Fired when plugin is disabled @Override public void onDisable() { SaveFiles(); - stop = true; } - private void FlairGetterThreadMethod() { - int errorcount = 0; - while (!stop) { - try { - String body = TBMCCoreAPI.DownloadString(FlairThreadURL + ".json?limit=1000"); - JsonArray json = new JsonParser().parse(body).getAsJsonArray().get(1).getAsJsonObject().get("data") - .getAsJsonObject().get("children").getAsJsonArray(); - for (Object obj : json) { - JsonObject item = (JsonObject) obj; - String author = item.get("data").getAsJsonObject().get("author").getAsString(); - String ign = item.get("data").getAsJsonObject().get("body").getAsString(); - int start = ign.indexOf("IGN:") + "IGN:".length(); - if (start == -1 + "IGN:".length()) - continue; - int end = ign.indexOf(' ', start); - if (end == -1 || end == start) - end = ign.indexOf('\n', start); - if (end == -1 || end == start) - ign = ign.substring(start); - else - ign = ign.substring(start, end); - ign = ign.trim(); - if (PlayersWithFlairs.contains(ign)) - continue; - try (ChatPlayer mp = TBMCPlayerBase.getFromName(ign, ChatPlayer.class)) { // Loads player file - if (mp == null) - continue; - /* - * if (!JoinedBefore(mp, 2015, 6, 5)) continue; - */ - if (!mp.UserNames().contains(author)) - mp.UserNames().add(author); - if (mp.FlairState().get().equals(FlairStates.NoComment)) { - mp.FlairState().set(FlairStates.Commented); - ConfirmUserMessage(mp); - } - PlayersWithFlairs.add(ign); // Don't redownload even if flair isn't accepted - } - } - } catch (Exception e) { - errorcount++; - if (errorcount >= 10) { - errorcount = 0; - if (!e.getMessage().contains("Server returned HTTP response code") - && !(e instanceof UnknownHostException)) - TBMCCoreAPI.SendException("Error while getting flairs from Reddit!", e); - } - } - try { - Thread.sleep(10000); - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - } - } - } - - public void DownloadFlair(ChatPlayer mp) throws IOException { - String[] flairdata = TBMCCoreAPI - .DownloadString("http://karmadecay.com/thebutton-data.php?users=" + mp.UserName().get()) - .replace("\"", "").split(":"); - String flair; - if (flairdata.length > 1) - flair = flairdata[1]; - else - flair = ""; - String flairclass; - if (flairdata.length > 2) - flairclass = flairdata[2]; - else - flairclass = "unknown"; - SetFlair(mp, flair, flairclass, mp.UserName().get()); - } - - private void SetFlair(ChatPlayer p, String text, String flairclass, String username) { - p.UserName().set(username); - p.FlairState().set(FlairStates.Recognised); - switch (flairclass) { - case "cheater": - p.SetFlair(Short.parseShort(text), true); - return; - case "unknown": - try { - if (CheckForJoinDate(p)) { - if (text.equals("-1")) // If true, only non-presser/can't press; if false, any flair (but we can still detect can't press) - p.SetFlair(ChatPlayer.FlairTimeNonPresser); - else - p.SetFlair(ChatPlayer.FlairTimeNone); // Flair unknown - } else { - p.SetFlair(ChatPlayer.FlairTimeCantPress); - } - } catch (Exception e) { - p.FlairState().set(FlairStates.Commented); // Flair unknown - p.SetFlair(ChatPlayer.FlairTimeNone); - TBMCCoreAPI.SendException("Error while checking join date for player " + p.PlayerName() + "!", e); - } - return; - default: - break; - } - p.SetFlair(Short.parseShort(text)); - } - - private static boolean CheckForJoinDate(ChatPlayer mp) throws Exception { - return JoinedBefore(mp, 2015, 4, 1); - } - - private static boolean JoinedBefore(ChatPlayer mp, int year, int month, int day) throws Exception { - URL url = new URL("https://www.reddit.com/u/" + mp.UserName()); - URLConnection con = url.openConnection(); - con.setRequestProperty("User-Agent", "TheButtonAutoFlair"); - InputStream in = con.getInputStream(); - HtmlCleaner cleaner = new HtmlCleaner(); - TagNode node = cleaner.clean(in); - - node = node.getElementsByAttValue("class", "age", true, true)[0]; - node = node.getElementsByName("time", false)[0]; - String joindate = node.getAttributeByName("datetime"); - SimpleDateFormat parserSDF = new SimpleDateFormat("yyyy-MM-dd"); - joindate = joindate.split("T")[0]; - Date date = parserSDF.parse(joindate); - return date.before(new Calendar.Builder().setTimeZone(TimeZone.getTimeZone("UTC")).setDate(year, month, day) - .build().getTime()); - } - - public static void ConfirmUserMessage(ChatPlayer mp) { - Player p = Bukkit.getPlayer(mp.getUUID()); - if (mp.FlairState().get().equals(FlairStates.Commented) && p != null) - if (mp.UserNames().size() > 1) - p.sendMessage( - "§9Multiple Reddit users commented your name. You can select with /u accept.§r §6Type /u accept or /u ignore§r"); - else - p.sendMessage("§9A Reddit user commented your name. Is that you?§r §6Type /u accept or /u ignore§r"); - } - - public static ArrayList AnnounceMessages = new ArrayList<>(); - public static int AnnounceTime = 15 * 60 * 1000; /** * Names lowercased */ @@ -305,9 +128,6 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15. yc.load(file); PlayerListener.NotificationSound = yc.getString("notificationsound"); PlayerListener.NotificationPitch = yc.getDouble("notificationpitch"); - AnnounceTime = yc.getInt("announcetime", 15 * 60 * 1000); - AnnounceMessages.addAll(yc.getStringList("announcements")); - PlayerListener.AlphaDeaths = yc.getInt("alphadeaths"); val cs = yc.getConfigurationSection("towncolors"); if (cs != null) TownColors.putAll(cs.getValues(true).entrySet().stream() @@ -333,9 +153,6 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15. YamlConfiguration yc = new YamlConfiguration(); yc.set("notificationsound", PlayerListener.NotificationSound); yc.set("notificationpitch", PlayerListener.NotificationPitch); - yc.set("announcetime", AnnounceTime); - yc.set("announcements", AnnounceMessages); - yc.set("alphadeaths", PlayerListener.AlphaDeaths); yc.createSection("towncolors", TownColors.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, v -> Arrays.stream(v.getValue()).map(Enum::toString).toArray(String[]::new)))); yc.set("towncolorcount", TownColorCommand.ColorCount); @@ -361,16 +178,6 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15. return (permission != null); } - private boolean setupChat() { - RegisteredServiceProvider chatProvider = getServer().getServicesManager() - .getRegistration(net.milkbowl.vault.chat.Chat.class); - if (chatProvider != null) { - chat = chatProvider.getProvider(); - } - - return (chat != null); - } - private boolean setupEconomy() { RegisteredServiceProvider economyProvider = getServer().getServicesManager() .getRegistration(net.milkbowl.vault.economy.Economy.class); @@ -381,53 +188,4 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15. return (economy != null); } - /** - * Return the error message for the message sender if they can't send it and the score - */ - private static RecipientTestResult checkTownNationChat(CommandSender sender, boolean nationchat) { - if (!(sender instanceof Player)) - return new RecipientTestResult("§cYou are not a player!"); - Resident resident = PluginMain.TU.getResidentMap().get(sender.getName().toLowerCase()); - RecipientTestResult result = checkTownNationChatInternal(sender, nationchat, resident); - if (result.errormessage != null && resident != null && resident.getModes().contains("spy")) // Only use spy if they wouldn't see it - result = new RecipientTestResult(1000, "allspies"); // There won't be more than a thousand towns/nations probably - return result; - } - - private static RecipientTestResult checkTownNationChatInternal(CommandSender sender, boolean nationchat, - Resident resident) { - try { - /* - * p.sendMessage(String.format("[SPY-%s] - %s: %s", channel.DisplayName, ((Player) sender).getDisplayName(), message)); - */ - Town town = null; - if (resident != null && resident.hasTown()) - town = resident.getTown(); - if (town == null) - return new RecipientTestResult("You aren't in a town."); - Nation nation = null; - int index; - if (nationchat) { - if (town.hasNation()) - nation = town.getNation(); - if (nation == null) - return new RecipientTestResult("Your town isn't in a nation."); - index = getTownNationIndex(nation.getName(), true); - } else - index = getTownNationIndex(town.getName(), false); - return new RecipientTestResult(index, nationchat ? nation.getName() : town.getName()); - } catch (NotRegisteredException e) { - return new RecipientTestResult("You (probably) aren't knwon by Towny! (Not in a town)"); - } - } - - public static int getTownNationIndex(String name, boolean nation) { - val list = nation ? Nations : Towns; - int index = list.indexOf(name); - if (index < 0) { - list.add(name); - index = list.size() - 1; - } - return index; - } } diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java b/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java index dc27b5c..5bbe364 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java +++ b/src/main/java/buttondevteam/chat/commands/ucmds/HistoryCommand.java @@ -39,9 +39,9 @@ public class HistoryCommand extends UCommandBase { sender.sendMessage("§6---- Chat History ----"); Stream stream; if (args.length == 0) { - stream = Channel.getChannels().stream(); + stream = Channel.getChannels(); } else { - Optional och = Channel.getChannels().stream().filter(chan -> chan.ID.equalsIgnoreCase(args[0])).findAny(); + Optional och = Channel.getChannels().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; diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/NColorCommand.java b/src/main/java/buttondevteam/chat/commands/ucmds/NColorCommand.java index 88403b1..4c9943e 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/NColorCommand.java +++ b/src/main/java/buttondevteam/chat/commands/ucmds/NColorCommand.java @@ -2,6 +2,7 @@ package buttondevteam.chat.commands.ucmds; import buttondevteam.chat.ChatPlayer; import buttondevteam.chat.PluginMain; +import buttondevteam.chat.components.towny.TownyComponent; import buttondevteam.chat.listener.PlayerJoinLeaveListener; import buttondevteam.lib.chat.Color; import buttondevteam.lib.chat.CommandClass; @@ -34,7 +35,7 @@ public class NColorCommand extends UCommandBase { Resident res; Town town; try { - if ((res = PluginMain.TU.getResidentMap().get(player.getName().toLowerCase())) == null || !res.hasTown() + if ((res = TownyComponent.TU.getResidentMap().get(player.getName().toLowerCase())) == null || !res.hasTown() || (town = res.getTown()) == null) { player.sendMessage("§cYou need to be in a town."); return true; diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/NationColorCommand.java b/src/main/java/buttondevteam/chat/commands/ucmds/NationColorCommand.java index cbfb0de..8cba718 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/NationColorCommand.java +++ b/src/main/java/buttondevteam/chat/commands/ucmds/NationColorCommand.java @@ -1,6 +1,6 @@ package buttondevteam.chat.commands.ucmds; -import buttondevteam.chat.PluginMain; +import buttondevteam.chat.components.towny.TownyComponent; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.chat.CommandClass; import buttondevteam.lib.chat.OptionallyPlayerCommandClass; @@ -26,8 +26,8 @@ public class NationColorCommand extends UCommandBase { @Override public boolean OnCommand(Player player, String alias, String[] args) { Resident res; - if (!(PluginMain.TU.getResidentMap().containsKey(player.getName().toLowerCase()) - && (res = PluginMain.TU.getResidentMap().get(player.getName().toLowerCase())).isKing())) { + if (!(TownyComponent.TU.getResidentMap().containsKey(player.getName().toLowerCase()) + && (res = TownyComponent.TU.getResidentMap().get(player.getName().toLowerCase())).isKing())) { player.sendMessage("§cYou need to be the king of a nation to set it's colors."); return true; } diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/TownColorCommand.java b/src/main/java/buttondevteam/chat/commands/ucmds/TownColorCommand.java index 648daf1..bdda3d8 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/TownColorCommand.java +++ b/src/main/java/buttondevteam/chat/commands/ucmds/TownColorCommand.java @@ -1,6 +1,6 @@ package buttondevteam.chat.commands.ucmds; -import buttondevteam.chat.PluginMain; +import buttondevteam.chat.components.towny.TownyComponent; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.chat.CommandClass; import buttondevteam.lib.chat.OptionallyPlayerCommandClass; @@ -31,8 +31,8 @@ public class TownColorCommand extends UCommandBase { @Override public boolean OnCommand(Player player, String alias, String[] args) { Resident res; - if (!(PluginMain.TU.getResidentMap().containsKey(player.getName().toLowerCase()) - && (res = PluginMain.TU.getResidentMap().get(player.getName().toLowerCase())).isMayor())) { + if (!(TownyComponent.TU.getResidentMap().containsKey(player.getName().toLowerCase()) + && (res = TownyComponent.TU.getResidentMap().get(player.getName().toLowerCase())).isMayor())) { player.sendMessage("§cYou need to be the mayor of a town to set it's colors."); return true; } diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/admin/NationColorCommand.java b/src/main/java/buttondevteam/chat/commands/ucmds/admin/NationColorCommand.java index ddc8e5b..9c9d4b1 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/admin/NationColorCommand.java +++ b/src/main/java/buttondevteam/chat/commands/ucmds/admin/NationColorCommand.java @@ -1,6 +1,7 @@ package buttondevteam.chat.commands.ucmds.admin; import buttondevteam.chat.PluginMain; +import buttondevteam.chat.components.towny.TownyComponent; import buttondevteam.chat.listener.TownyListener; import buttondevteam.lib.chat.Color; import com.palmergames.bukkit.towny.object.Nation; @@ -31,7 +32,7 @@ public class NationColorCommand extends AdminCommandBase { sender.sendMessage("§cYou can only use one color as a nation color."); return true; } - final Nation nation = PluginMain.TU.getNationsMap().get(args[0].toLowerCase()); + final Nation nation = TownyComponent.TU.getNationsMap().get(args[0].toLowerCase()); if (nation == null) { sender.sendMessage("§cThe nation '" + args[0] + "' cannot be found."); return true; diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/admin/TownColorCommand.java b/src/main/java/buttondevteam/chat/commands/ucmds/admin/TownColorCommand.java index 97224ad..21b7659 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/admin/TownColorCommand.java +++ b/src/main/java/buttondevteam/chat/commands/ucmds/admin/TownColorCommand.java @@ -1,6 +1,7 @@ package buttondevteam.chat.commands.ucmds.admin; import buttondevteam.chat.PluginMain; +import buttondevteam.chat.components.towny.TownyComponent; import buttondevteam.chat.listener.TownyListener; import buttondevteam.lib.chat.Color; import com.palmergames.bukkit.towny.object.Town; @@ -35,12 +36,12 @@ public class TownColorCommand extends AdminCommandBase { public static boolean SetTownColor(CommandSender sender, String alias, String[] args) { if (args.length < 2) return false; - if (!PluginMain.TU.getTownsMap().containsKey(args[0].toLowerCase())) { + if (!TownyComponent.TU.getTownsMap().containsKey(args[0].toLowerCase())) { sender.sendMessage("§cThe town '" + args[0] + "' cannot be found."); return true; } Color[] clrs = new Color[args.length - 1]; - Town targetTown = PluginMain.TU.getTownsMap().get(args[0].toLowerCase()); + Town targetTown = TownyComponent.TU.getTownsMap().get(args[0].toLowerCase()); for (int i = 1; i < args.length; i++) { val c = getColorOrSendError(args[i], sender); if (!c.isPresent()) @@ -50,7 +51,7 @@ public class TownColorCommand extends AdminCommandBase { for (Map.Entry other : PluginMain.TownColors.entrySet()) { Color nc, tnc; try { - nc = PluginMain.NationColor.get(PluginMain.TU.getTownsMap().get(other.getKey()).getNation().getName().toLowerCase()); + nc = PluginMain.NationColor.get(TownyComponent.TU.getTownsMap().get(other.getKey()).getNation().getName().toLowerCase()); } catch (Exception e) { //Too lazy for lots of null-checks and it may throw exceptions anyways nc = null; } @@ -103,6 +104,6 @@ public class TownColorCommand extends AdminCommandBase { } public static String getTownNameCased(String name) { - return PluginMain.TU.getTownsMap().get(name.toLowerCase()).getName(); + return TownyComponent.TU.getTownsMap().get(name.toLowerCase()).getName(); } } diff --git a/src/main/java/buttondevteam/chat/components/TownyComponent.java b/src/main/java/buttondevteam/chat/components/TownyComponent.java deleted file mode 100644 index b176710..0000000 --- a/src/main/java/buttondevteam/chat/components/TownyComponent.java +++ /dev/null @@ -1,15 +0,0 @@ -package buttondevteam.chat.components; - -import buttondevteam.lib.architecture.Component; - -public class TownyComponent extends Component { - @Override - protected void enable() { - TownyAnnouncer.setup(); - } - - @Override - protected void disable() { - TownyAnnouncer.setdown(); - } -} diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/announce/AddCommand.java b/src/main/java/buttondevteam/chat/components/announce/AddCommand.java similarity index 84% rename from src/main/java/buttondevteam/chat/commands/ucmds/announce/AddCommand.java rename to src/main/java/buttondevteam/chat/components/announce/AddCommand.java index d86fcf2..d236f56 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/announce/AddCommand.java +++ b/src/main/java/buttondevteam/chat/components/announce/AddCommand.java @@ -1,37 +1,36 @@ -package buttondevteam.chat.commands.ucmds.announce; - -import org.bukkit.command.CommandSender; - -import buttondevteam.chat.PluginMain; - -public class AddCommand extends AnnounceCommandBase { - - @Override - public String[] GetHelpText(String alias) { - return new String[] { - "§6---- Add announcement ----", - "This command adds a new announcement", - "Note: Please avoid using this command, if possible", - "Instead, use the command blocks in flatworld to set announcements", - "This makes editing announcements easier" }; - } - - @Override - public boolean OnCommand(CommandSender sender, String alias, - String[] args) { - if (args.length < 1) { - return false; - } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < args.length; i++) { - sb.append(args[i]); - if (i != args.length - 1) - sb.append(" "); - } - String finalmessage = sb.toString().replace('&', '§'); - PluginMain.AnnounceMessages.add(finalmessage); - sender.sendMessage("§bAnnouncement added. - Plase avoid using this command if possible, see /u announce add without args.§r"); - return true; - } - -} +package buttondevteam.chat.components.announce; + +import org.bukkit.command.CommandSender; + +public class AddCommand extends AnnounceCommandBase { + + @Override + public String[] GetHelpText(String alias) { + return new String[] { + "§6---- Add announcement ----", + "This command adds a new announcement", + "Note: Please avoid using this command, if possible", + "Instead, use the command blocks in flatworld to set announcements", + "This makes editing announcements easier" }; + } + + @Override + public boolean OnCommand(CommandSender sender, String alias, + String[] args) { + if (args.length < 1) { + return false; + } + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < args.length; i++) { + sb.append(args[i]); + if (i != args.length - 1) + sb.append(" "); + } + String finalmessage = sb.toString().replace('&', '§'); + AnnouncerComponent component = (AnnouncerComponent) getComponent(); + component.AnnounceMessages().get().add(finalmessage); + sender.sendMessage("§bAnnouncement added. - Plase avoid using this command if possible, see /u announce add without args.§r"); + return true; + } + +} diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/announce/AnnounceCommandBase.java b/src/main/java/buttondevteam/chat/components/announce/AnnounceCommandBase.java similarity index 84% rename from src/main/java/buttondevteam/chat/commands/ucmds/announce/AnnounceCommandBase.java rename to src/main/java/buttondevteam/chat/components/announce/AnnounceCommandBase.java index c721891..308a845 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/announce/AnnounceCommandBase.java +++ b/src/main/java/buttondevteam/chat/components/announce/AnnounceCommandBase.java @@ -1,13 +1,13 @@ -package buttondevteam.chat.commands.ucmds.announce; - -import buttondevteam.chat.commands.ucmds.UCommandBase; -import buttondevteam.lib.chat.CommandClass; -import buttondevteam.lib.chat.OptionallyPlayerCommandClass; - -@CommandClass(modOnly = true) -@OptionallyPlayerCommandClass(playerOnly = false) -public abstract class AnnounceCommandBase extends UCommandBase { - - public abstract String[] GetHelpText(String alias); - -} +package buttondevteam.chat.components.announce; + +import buttondevteam.chat.commands.ucmds.UCommandBase; +import buttondevteam.lib.chat.CommandClass; +import buttondevteam.lib.chat.OptionallyPlayerCommandClass; + +@CommandClass(modOnly = true) +@OptionallyPlayerCommandClass(playerOnly = false) +public abstract class AnnounceCommandBase extends UCommandBase { + + public abstract String[] GetHelpText(String alias); + +} diff --git a/src/main/java/buttondevteam/chat/components/announce/AnnouncerComponent.java b/src/main/java/buttondevteam/chat/components/announce/AnnouncerComponent.java new file mode 100644 index 0000000..fce4422 --- /dev/null +++ b/src/main/java/buttondevteam/chat/components/announce/AnnouncerComponent.java @@ -0,0 +1,50 @@ +package buttondevteam.chat.components.announce; + +import buttondevteam.lib.architecture.Component; +import buttondevteam.lib.architecture.ConfigData; +import org.bukkit.Bukkit; + +import java.util.ArrayList; + +public class AnnouncerComponent extends Component implements Runnable { + public ConfigData> AnnounceMessages() { + return getConfig().getData("announceMessages", new ArrayList<>(0)); + } + + public ConfigData AnnounceTime() { + return getConfig().getData("announceTime", 15 * 60 * 1000); + } + private static int AnnounceMessageIndex = 0; + + @Override + public void run() { + while (isEnabled()) { + try { + Thread.sleep(AnnounceTime().get()); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } + if (Bukkit.getOnlinePlayers().size() == 0) continue; //Don't post to Discord if nobody is on + if (AnnounceMessages().get().size() > AnnounceMessageIndex) { + Bukkit.broadcastMessage(AnnounceMessages().get().get(AnnounceMessageIndex)); + AnnounceMessageIndex++; + if (AnnounceMessageIndex == AnnounceMessages().get().size()) + AnnounceMessageIndex = 0; + } + } + } + + @Override + protected void enable() { + registerCommand(new AddCommand()); + registerCommand(new EditCommand()); + registerCommand(new ListCommand()); + registerCommand(new RemoveCommand()); + registerCommand(new SetTimeCommand()); + new Thread(this).start(); + } + + @Override + protected void disable() { + } +} diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/announce/EditCommand.java b/src/main/java/buttondevteam/chat/components/announce/EditCommand.java similarity index 79% rename from src/main/java/buttondevteam/chat/commands/ucmds/announce/EditCommand.java rename to src/main/java/buttondevteam/chat/components/announce/EditCommand.java index 0bb0c32..a53793b 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/announce/EditCommand.java +++ b/src/main/java/buttondevteam/chat/components/announce/EditCommand.java @@ -1,45 +1,44 @@ -package buttondevteam.chat.commands.ucmds.announce; - -import org.bukkit.command.BlockCommandSender; -import org.bukkit.command.CommandSender; - -import buttondevteam.chat.PluginMain; - -public class EditCommand extends AnnounceCommandBase { - - @Override - public String[] GetHelpText(String alias) { - return new String[] { "§6---- Edit announcement ----", - "This command can only be used in a command block.", - "Usage: /u annonunce edit " }; - } - - @Override - public boolean OnCommand(CommandSender sender, String alias, - String[] args) { - if (!(sender instanceof BlockCommandSender)) { - sender.sendMessage("§cError: This command can only be used from a command block. You can use add and remove, though it's not recommended."); - return true; - } - if (args.length < 1) { - return false; - } - StringBuilder sb1 = new StringBuilder(); - for (int i1 = 1; i1 < args.length; i1++) { - sb1.append(args[i1]); - if (i1 != args.length - 1) - sb1.append(" "); - } - String finalmessage1 = sb1.toString().replace('&', '§'); - int index = Integer.parseInt(args[0]); - if (index > 100) - return false; - while (PluginMain.AnnounceMessages.size() <= index) - PluginMain.AnnounceMessages.add(""); - PluginMain.AnnounceMessages.set(Integer.parseInt(args[0]), - finalmessage1); - sender.sendMessage("Announcement edited."); - return true; - } - -} +package buttondevteam.chat.components.announce; + +import org.bukkit.command.BlockCommandSender; +import org.bukkit.command.CommandSender; + +public class EditCommand extends AnnounceCommandBase { + + @Override + public String[] GetHelpText(String alias) { + return new String[] { "§6---- Edit announcement ----", + "This command can only be used in a command block.", + "Usage: /u annonunce edit " }; + } + + @Override + public boolean OnCommand(CommandSender sender, String alias, + String[] args) { + if (!(sender instanceof BlockCommandSender)) { + sender.sendMessage("§cError: This command can only be used from a command block. You can use add and remove, though it's not recommended."); + return true; + } + if (args.length < 1) { + return false; + } + StringBuilder sb1 = new StringBuilder(); + for (int i1 = 1; i1 < args.length; i1++) { + sb1.append(args[i1]); + if (i1 != args.length - 1) + sb1.append(" "); + } + String finalmessage1 = sb1.toString().replace('&', '§'); + int index = Integer.parseInt(args[0]); + if (index > 100) + return false; + AnnouncerComponent component = (AnnouncerComponent) getComponent(); + while (component.AnnounceMessages().get().size() <= index) + component.AnnounceMessages().get().add(""); + component.AnnounceMessages().get().set(Integer.parseInt(args[0]), + finalmessage1); + sender.sendMessage("Announcement edited."); + return true; + } + +} diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/announce/ListCommand.java b/src/main/java/buttondevteam/chat/components/announce/ListCommand.java similarity index 72% rename from src/main/java/buttondevteam/chat/commands/ucmds/announce/ListCommand.java rename to src/main/java/buttondevteam/chat/components/announce/ListCommand.java index 079e2a2..6c15593 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/announce/ListCommand.java +++ b/src/main/java/buttondevteam/chat/components/announce/ListCommand.java @@ -1,28 +1,27 @@ -package buttondevteam.chat.commands.ucmds.announce; - -import org.bukkit.command.CommandSender; - -import buttondevteam.chat.PluginMain; - -public class ListCommand extends AnnounceCommandBase { - - @Override - public String[] GetHelpText(String alias) { - return new String[] { "§6---- List announcements ----", - "This command lists the announcements and the time between them" }; - } - - @Override - public boolean OnCommand(CommandSender sender, String alias, - String[] args) { - sender.sendMessage("§bList of announce messages:§r"); - sender.sendMessage("§bFormat: [index] message§r"); - int i = 0; - for (String message : PluginMain.AnnounceMessages) - sender.sendMessage("[" + i++ + "] " + message); - sender.sendMessage("§bCurrent wait time between announcements: " - + PluginMain.AnnounceTime / 60 / 1000 + " minute(s)§r"); - return true; - } - -} +package buttondevteam.chat.components.announce; + +import org.bukkit.command.CommandSender; + +public class ListCommand extends AnnounceCommandBase { + + @Override + public String[] GetHelpText(String alias) { + return new String[] { "§6---- List announcements ----", + "This command lists the announcements and the time between them" }; + } + + @Override + public boolean OnCommand(CommandSender sender, String alias, + String[] args) { + sender.sendMessage("§bList of announce messages:§r"); + sender.sendMessage("§bFormat: [index] message§r"); + int i = 0; + AnnouncerComponent component = (AnnouncerComponent) getComponent(); + for (String message : component.AnnounceMessages().get()) + sender.sendMessage("[" + i++ + "] " + message); + sender.sendMessage("§bCurrent wait time between announcements: " + + component.AnnounceTime().get() / 60 / 1000 + " minute(s)§r"); + return true; + } + +} diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/announce/RemoveCommand.java b/src/main/java/buttondevteam/chat/components/announce/RemoveCommand.java similarity index 78% rename from src/main/java/buttondevteam/chat/commands/ucmds/announce/RemoveCommand.java rename to src/main/java/buttondevteam/chat/components/announce/RemoveCommand.java index 3e4cda1..6f7ba30 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/announce/RemoveCommand.java +++ b/src/main/java/buttondevteam/chat/components/announce/RemoveCommand.java @@ -1,30 +1,28 @@ -package buttondevteam.chat.commands.ucmds.announce; - -import org.bukkit.command.CommandSender; - -import buttondevteam.chat.PluginMain; - -public class RemoveCommand extends AnnounceCommandBase { - - @Override - public String[] GetHelpText(String alias) { - return new String[] { - "§6---- Remove announcement ----", - "This command removes an announcement", - "Note: Please avoid using this command, if possible", - "Instead, use the command blocks in flatworld to set announcements", - "This makes editing announcements easier" }; - } - - @Override - public boolean OnCommand(CommandSender sender, String alias, - String[] args) { - if (args.length < 1) { - sender.sendMessage("§cUsage: /u announce remove "); - return true; - } - PluginMain.AnnounceMessages.remove(Integer.parseInt(args[0])); - return true; - } - -} +package buttondevteam.chat.components.announce; + +import org.bukkit.command.CommandSender; + +public class RemoveCommand extends AnnounceCommandBase { + + @Override + public String[] GetHelpText(String alias) { + return new String[] { + "§6---- Remove announcement ----", + "This command removes an announcement", + "Note: Please avoid using this command, if possible", + "Instead, use the command blocks in flatworld to set announcements", + "This makes editing announcements easier" }; + } + + @Override + public boolean OnCommand(CommandSender sender, String alias, + String[] args) { + if (args.length < 1) { + sender.sendMessage("§cUsage: /u announce remove "); + return true; + } + ((AnnouncerComponent) getComponent()).AnnounceMessages().get().remove(Integer.parseInt(args[0])); + return true; + } + +} diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/announce/SetTimeCommand.java b/src/main/java/buttondevteam/chat/components/announce/SetTimeCommand.java similarity index 78% rename from src/main/java/buttondevteam/chat/commands/ucmds/announce/SetTimeCommand.java rename to src/main/java/buttondevteam/chat/components/announce/SetTimeCommand.java index 4e36a0b..ee8b849 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/announce/SetTimeCommand.java +++ b/src/main/java/buttondevteam/chat/components/announce/SetTimeCommand.java @@ -1,33 +1,31 @@ -package buttondevteam.chat.commands.ucmds.announce; - -import org.bukkit.command.CommandSender; - -import buttondevteam.chat.PluginMain; - -public class SetTimeCommand extends AnnounceCommandBase { - - @Override - public String[] GetHelpText(String alias) { - return new String[] { "§6---- Set time ----", - "This command sets the time between the announcements", - "Usage: /u anonunce settime ", "Default: 15" }; - } - - @Override - public boolean OnCommand(CommandSender sender, String alias, - String[] args) { - if (args.length < 1) { - return false; - } - try { - PluginMain.AnnounceTime = Integer.parseInt(args[0]) * 60 * 1000; - } catch (Exception e) { - sender.sendMessage("§cMinutes argument must be a number. Got: " - + args[0]); - return true; - } - sender.sendMessage("Time set between announce messages"); - return true; - } - -} +package buttondevteam.chat.components.announce; + +import org.bukkit.command.CommandSender; + +public class SetTimeCommand extends AnnounceCommandBase { + + @Override + public String[] GetHelpText(String alias) { + return new String[] { "§6---- Set time ----", + "This command sets the time between the announcements", + "Usage: /u anonunce settime ", "Default: 15" }; + } + + @Override + public boolean OnCommand(CommandSender sender, String alias, + String[] args) { + if (args.length < 1) { + return false; + } + try { + ((AnnouncerComponent) getComponent()).AnnounceTime().set(Integer.parseInt(args[0]) * 60 * 1000); + } catch (Exception e) { + sender.sendMessage("§cMinutes argument must be a number. Got: " + + args[0]); + return true; + } + sender.sendMessage("Time set between announce messages"); + return true; + } + +} diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/AcceptCommand.java b/src/main/java/buttondevteam/chat/components/flair/AcceptCommand.java similarity index 91% rename from src/main/java/buttondevteam/chat/commands/ucmds/AcceptCommand.java rename to src/main/java/buttondevteam/chat/components/flair/AcceptCommand.java index a588b6c..51ae309 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/AcceptCommand.java +++ b/src/main/java/buttondevteam/chat/components/flair/AcceptCommand.java @@ -1,99 +1,97 @@ -package buttondevteam.chat.commands.ucmds; - -import java.util.Timer; - -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import buttondevteam.chat.ChatPlayer; -import buttondevteam.chat.FlairStates; -import buttondevteam.chat.PlayerJoinTimerTask; -import buttondevteam.chat.PluginMain; -import buttondevteam.lib.TBMCCoreAPI; -import buttondevteam.lib.chat.CommandClass; -import buttondevteam.lib.chat.OptionallyPlayerCommandClass; -import buttondevteam.lib.player.TBMCPlayer; - -@CommandClass(modOnly = false) -@OptionallyPlayerCommandClass(playerOnly = true) -public class AcceptCommand extends UCommandBase { - - @Override - public String[] GetHelpText(String alias) { - return new String[] { "§6---- Accept flair ----", // - "Accepts a flair from Reddit", // - "Use /u accept if you commented from multiple accounts" // - }; - } - - @Override - public boolean OnCommand(CommandSender sender, String alias, String[] args) { - final Player player = (Player) sender; - ChatPlayer p = TBMCPlayer.getPlayer(player.getUniqueId(), ChatPlayer.class); - if (args.length < 1 && p.UserNames().size() > 1) { - player.sendMessage("§9Multiple users commented your name. §bPlease pick one using /u accept "); - StringBuilder sb = new StringBuilder(); - sb.append("§6Usernames:"); - for (String username : p.UserNames()) - sb.append(" ").append(username); - player.sendMessage(sb.toString()); - return true; - } - if (p.FlairState().get().equals(FlairStates.NoComment) || p.UserNames().size() == 0) { - player.sendMessage("§cError: You need to write your username to the reddit thread at /r/ChromaGamers§r"); - return true; - } - if (args.length > 0 && !p.UserNames().contains(args[0])) { - player.sendMessage("§cError: Unknown name: " + args[0] + "§r"); - return true; - } - if (p.Working) { - player.sendMessage("§cError: Something is already in progress.§r"); - return true; - } - - if ((args.length > 0 ? args[0] : p.UserNames().get(0)).equals(p.UserName().get())) { - player.sendMessage("§cYou already have this user's flair.§r"); - return true; - } - if (args.length > 0) - p.UserName().set(args[0]); - else - p.UserName().set(p.UserNames().get(0)); - - player.sendMessage("§bObtaining flair..."); - p.Working = true; - Timer timer = new Timer(); - PlayerJoinTimerTask tt = new PlayerJoinTimerTask() { - @Override - public void run() { - try { - PluginMain.Instance.DownloadFlair(mp); - } catch (Exception e) { - TBMCCoreAPI.SendException( - "An error occured while downloading flair for " + player.getCustomName() + "!", e); - player.sendMessage( - "Sorry, but an error occured while trying to get your flair. Please contact a mod."); - mp.Working = false; - return; - } - - if (mp.FlairState().get().equals(FlairStates.Commented)) { - player.sendMessage( - "Sorry, but your flair isn't recorded. Please ask an admin to set it for you. Also, prepare a comment on /r/thebutton, if possible."); - mp.Working = false; - return; - } - String flair = mp.GetFormattedFlair(); - mp.FlairState().set(FlairStates.Accepted); - PluginMain.ConfirmUserMessage(mp); - player.sendMessage("§bYour flair has been set:§r " + flair); - mp.Working = false; - } - }; - tt.mp = p; - timer.schedule(tt, 20); - return true; - } - -} +package buttondevteam.chat.components.flair; + +import buttondevteam.chat.ChatPlayer; +import buttondevteam.chat.PlayerJoinTimerTask; +import buttondevteam.chat.commands.ucmds.UCommandBase; +import buttondevteam.lib.TBMCCoreAPI; +import buttondevteam.lib.chat.CommandClass; +import buttondevteam.lib.chat.OptionallyPlayerCommandClass; +import buttondevteam.lib.player.TBMCPlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.Timer; + +@CommandClass(modOnly = false) +@OptionallyPlayerCommandClass(playerOnly = true) +public class AcceptCommand extends UCommandBase { + + @Override + public String[] GetHelpText(String alias) { + return new String[] { "§6---- Accept flair ----", // + "Accepts a flair from Reddit", // + "Use /u accept if you commented from multiple accounts" // + }; + } + + @Override + public boolean OnCommand(CommandSender sender, String alias, String[] args) { + final Player player = (Player) sender; + ChatPlayer p = TBMCPlayer.getPlayer(player.getUniqueId(), ChatPlayer.class); + if (args.length < 1 && p.UserNames().size() > 1) { + player.sendMessage("§9Multiple users commented your name. §bPlease pick one using /u accept "); + StringBuilder sb = new StringBuilder(); + sb.append("§6Usernames:"); + for (String username : p.UserNames()) + sb.append(" ").append(username); + player.sendMessage(sb.toString()); + return true; + } + if (p.FlairState().get().equals(FlairStates.NoComment) || p.UserNames().size() == 0) { + player.sendMessage("§cError: You need to write your username to the reddit thread at /r/ChromaGamers§r"); + return true; + } + if (args.length > 0 && !p.UserNames().contains(args[0])) { + player.sendMessage("§cError: Unknown name: " + args[0] + "§r"); + return true; + } + if (p.Working) { + player.sendMessage("§cError: Something is already in progress.§r"); + return true; + } + + if ((args.length > 0 ? args[0] : p.UserNames().get(0)).equals(p.UserName().get())) { + player.sendMessage("§cYou already have this user's flair.§r"); + return true; + } + if (args.length > 0) + p.UserName().set(args[0]); + else + p.UserName().set(p.UserNames().get(0)); + + player.sendMessage("§bObtaining flair..."); + p.Working = true; + Timer timer = new Timer(); + PlayerJoinTimerTask tt = new PlayerJoinTimerTask() { + @Override + public void run() { + try { + FlairComponent.DownloadFlair(mp); + } catch (Exception e) { + TBMCCoreAPI.SendException( + "An error occured while downloading flair for " + player.getCustomName() + "!", e); + player.sendMessage( + "Sorry, but an error occured while trying to get your flair. Please contact a mod."); + mp.Working = false; + return; + } + + if (mp.FlairState().get().equals(FlairStates.Commented)) { + player.sendMessage( + "Sorry, but your flair isn't recorded. Please ask an admin to set it for you. Also, prepare a comment on /r/thebutton, if possible."); + mp.Working = false; + return; + } + String flair = mp.GetFormattedFlair(); + mp.FlairState().set(FlairStates.Accepted); + FlairComponent.ConfirmUserMessage(mp); + player.sendMessage("§bYour flair has been set:§r " + flair); + mp.Working = false; + } + }; + tt.mp = p; + timer.schedule(tt, 20); + return true; + } + +} diff --git a/src/main/java/buttondevteam/chat/components/flair/FlairComponent.java b/src/main/java/buttondevteam/chat/components/flair/FlairComponent.java new file mode 100644 index 0000000..3243205 --- /dev/null +++ b/src/main/java/buttondevteam/chat/components/flair/FlairComponent.java @@ -0,0 +1,185 @@ +package buttondevteam.chat.components.flair; + +import buttondevteam.chat.ChatPlayer; +import buttondevteam.lib.TBMCCoreAPI; +import buttondevteam.lib.architecture.Component; +import buttondevteam.lib.architecture.ConfigData; +import buttondevteam.lib.player.TBMCPlayerBase; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.htmlcleaner.HtmlCleaner; +import org.htmlcleaner.TagNode; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.net.UnknownHostException; +import java.text.SimpleDateFormat; +import java.util.*; + +public class FlairComponent extends Component { + private ConfigData FlairThreadURL() { + return getConfig().getData("flairThreadURL", "https://www.reddit.com/r/Chromagamers/comments/51ys94/flair_thread_for_the_mc_server/"); + } + + /** + *

+ * This variable is used as a cache for flair state checking when reading the flair thread. + *

+ *

+ * It's used because normally it has to load all associated player files every time to read the flair state + *

+ */ + private Set PlayersWithFlairs = new HashSet<>(); + + @Override + protected void enable() { + registerCommand(new AcceptCommand()); + registerCommand(new IgnoreCommand()); + registerCommand(new SetFlairCommand()); + new Thread(this::FlairGetterThreadMethod).start(); + } + + @Override + protected void disable() { + + } + + private void FlairGetterThreadMethod() { + int errorcount = 0; + while (isEnabled()) { + try { + String body = TBMCCoreAPI.DownloadString(FlairThreadURL().get() + ".json?limit=1000"); + JsonArray json = new JsonParser().parse(body).getAsJsonArray().get(1).getAsJsonObject().get("data") + .getAsJsonObject().get("children").getAsJsonArray(); + for (Object obj : json) { + JsonObject item = (JsonObject) obj; + String author = item.get("data").getAsJsonObject().get("author").getAsString(); + String ign = item.get("data").getAsJsonObject().get("body").getAsString(); + int start = ign.indexOf("IGN:") + "IGN:".length(); + if (start == -1 + "IGN:".length()) + continue; + int end = ign.indexOf(' ', start); + if (end == -1 || end == start) + end = ign.indexOf('\n', start); + if (end == -1 || end == start) + ign = ign.substring(start); + else + ign = ign.substring(start, end); + ign = ign.trim(); + if (PlayersWithFlairs.contains(ign)) + continue; + try (ChatPlayer mp = TBMCPlayerBase.getFromName(ign, ChatPlayer.class)) { // Loads player file + if (mp == null) + continue; + /* + * if (!JoinedBefore(mp, 2015, 6, 5)) continue; + */ + if (!mp.UserNames().contains(author)) + mp.UserNames().add(author); + if (mp.FlairState().get().equals(FlairStates.NoComment)) { + mp.FlairState().set(FlairStates.Commented); + ConfirmUserMessage(mp); + } + PlayersWithFlairs.add(ign); // Don't redownload even if flair isn't accepted + } + } + } catch (Exception e) { + errorcount++; + if (errorcount >= 10) { + errorcount = 0; + if (!e.getMessage().contains("Server returned HTTP response code") + && !(e instanceof UnknownHostException)) + TBMCCoreAPI.SendException("Error while getting flairs from Reddit!", e); + } + } + try { + Thread.sleep(10000); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } + } + } + + public static void DownloadFlair(ChatPlayer mp) throws IOException { + String[] flairdata = TBMCCoreAPI + .DownloadString("http://karmadecay.com/thebutton-data.php?users=" + mp.UserName().get()) + .replace("\"", "").split(":"); + String flair; + if (flairdata.length > 1) + flair = flairdata[1]; + else + flair = ""; + String flairclass; + if (flairdata.length > 2) + flairclass = flairdata[2]; + else + flairclass = "unknown"; + SetFlair(mp, flair, flairclass, mp.UserName().get()); + } + + private static void SetFlair(ChatPlayer p, String text, String flairclass, String username) { + p.UserName().set(username); + p.FlairState().set(FlairStates.Recognised); + switch (flairclass) { + case "cheater": + p.SetFlair(Short.parseShort(text), true); + return; + case "unknown": + try { + if (CheckForJoinDate(p)) { + if (text.equals("-1")) // If true, only non-presser/can't press; if false, any flair (but we can still detect can't press) + p.SetFlair(ChatPlayer.FlairTimeNonPresser); + else + p.SetFlair(ChatPlayer.FlairTimeNone); // Flair unknown + } else { + p.SetFlair(ChatPlayer.FlairTimeCantPress); + } + } catch (Exception e) { + p.FlairState().set(FlairStates.Commented); // Flair unknown + p.SetFlair(ChatPlayer.FlairTimeNone); + TBMCCoreAPI.SendException("Error while checking join date for player " + p.PlayerName() + "!", e); + } + return; + default: + break; + } + p.SetFlair(Short.parseShort(text)); + } + + private static boolean CheckForJoinDate(ChatPlayer mp) throws Exception { + return JoinedBefore(mp, 2015, 4, 1); + } + + private static boolean JoinedBefore(ChatPlayer mp, int year, int month, int day) throws Exception { + URL url = new URL("https://www.reddit.com/u/" + mp.UserName()); + URLConnection con = url.openConnection(); + con.setRequestProperty("User-Agent", "TheButtonAutoFlair"); + InputStream in = con.getInputStream(); + HtmlCleaner cleaner = new HtmlCleaner(); + TagNode node = cleaner.clean(in); + + node = node.getElementsByAttValue("class", "age", true, true)[0]; + node = node.getElementsByName("time", false)[0]; + String joindate = node.getAttributeByName("datetime"); + SimpleDateFormat parserSDF = new SimpleDateFormat("yyyy-MM-dd"); + joindate = joindate.split("T")[0]; + Date date = parserSDF.parse(joindate); + return date.before(new Calendar.Builder().setTimeZone(TimeZone.getTimeZone("UTC")).setDate(year, month, day) + .build().getTime()); + } + + public static void ConfirmUserMessage(ChatPlayer mp) { + Player p = Bukkit.getPlayer(mp.getUUID()); + if (mp.FlairState().get().equals(FlairStates.Commented) && p != null) + if (mp.UserNames().size() > 1) + p.sendMessage( + "§9Multiple Reddit users commented your name. You can select with /u accept.§r §6Type /u accept or /u ignore§r"); + else + p.sendMessage("§9A Reddit user commented your name. Is that you?§r §6Type /u accept or /u ignore§r"); + } +} diff --git a/src/main/java/buttondevteam/chat/FlairStates.java b/src/main/java/buttondevteam/chat/components/flair/FlairStates.java similarity index 64% rename from src/main/java/buttondevteam/chat/FlairStates.java rename to src/main/java/buttondevteam/chat/components/flair/FlairStates.java index b217d95..3830e2d 100644 --- a/src/main/java/buttondevteam/chat/FlairStates.java +++ b/src/main/java/buttondevteam/chat/components/flair/FlairStates.java @@ -1,5 +1,5 @@ -package buttondevteam.chat; - -public enum FlairStates { - Accepted, Ignored, Recognised, Commented, NoComment -} +package buttondevteam.chat.components.flair; + +public enum FlairStates { + Accepted, Ignored, Recognised, Commented, NoComment +} diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/IgnoreCommand.java b/src/main/java/buttondevteam/chat/components/flair/IgnoreCommand.java similarity index 92% rename from src/main/java/buttondevteam/chat/commands/ucmds/IgnoreCommand.java rename to src/main/java/buttondevteam/chat/components/flair/IgnoreCommand.java index 4ea2973..a556455 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/IgnoreCommand.java +++ b/src/main/java/buttondevteam/chat/components/flair/IgnoreCommand.java @@ -1,44 +1,43 @@ -package buttondevteam.chat.commands.ucmds; - -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import buttondevteam.chat.ChatPlayer; -import buttondevteam.chat.FlairStates; -import buttondevteam.lib.chat.CommandClass; -import buttondevteam.lib.chat.OptionallyPlayerCommandClass; -import buttondevteam.lib.player.TBMCPlayer; - -@CommandClass(modOnly = false) -@OptionallyPlayerCommandClass(playerOnly = true) -public final class IgnoreCommand extends UCommandBase { - - @Override - public String[] GetHelpText(String alias) { - return new String[] { "§6---- Ignore flair ----", - "Stop the \"write your name in the thread\" message from showing up" }; - } - - @Override - public boolean OnCommand(CommandSender sender, String alias, String[] args) { - final Player player = (Player) sender; - ChatPlayer p = TBMCPlayer.getPlayer(player.getUniqueId(), ChatPlayer.class); - if (p.FlairState().get().equals(FlairStates.Accepted)) { - player.sendMessage("§cYou can only ignore the \"write your name in the thread\" message."); - return true; - } - if (p.FlairState().get().equals(FlairStates.Commented)) { - player.sendMessage("Sorry, but your flair isn't recorded. Please ask a mod to set it for you."); - return true; - } - if (!p.FlairState().get().equals(FlairStates.Ignored)) { - p.FlairState().set(FlairStates.Ignored); - p.SetFlair(ChatPlayer.FlairTimeNone); - p.UserName().set(""); - player.sendMessage("§bYou have ignored the message.§r"); - } else - player.sendMessage("§cYou already ignored the message.§r"); - return true; - } - -} +package buttondevteam.chat.components.flair; + +import buttondevteam.chat.ChatPlayer; +import buttondevteam.chat.commands.ucmds.UCommandBase; +import buttondevteam.lib.chat.CommandClass; +import buttondevteam.lib.chat.OptionallyPlayerCommandClass; +import buttondevteam.lib.player.TBMCPlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandClass(modOnly = false) +@OptionallyPlayerCommandClass(playerOnly = true) +public final class IgnoreCommand extends UCommandBase { + + @Override + public String[] GetHelpText(String alias) { + return new String[] { "§6---- Ignore flair ----", + "Stop the \"write your name in the thread\" message from showing up" }; + } + + @Override + public boolean OnCommand(CommandSender sender, String alias, String[] args) { + final Player player = (Player) sender; + ChatPlayer p = TBMCPlayer.getPlayer(player.getUniqueId(), ChatPlayer.class); + if (p.FlairState().get().equals(FlairStates.Accepted)) { + player.sendMessage("§cYou can only ignore the \"write your name in the thread\" message."); + return true; + } + if (p.FlairState().get().equals(FlairStates.Commented)) { + player.sendMessage("Sorry, but your flair isn't recorded. Please ask a mod to set it for you."); + return true; + } + if (!p.FlairState().get().equals(FlairStates.Ignored)) { + p.FlairState().set(FlairStates.Ignored); + p.SetFlair(ChatPlayer.FlairTimeNone); + p.UserName().set(""); + player.sendMessage("§bYou have ignored the message.§r"); + } else + player.sendMessage("§cYou already ignored the message.§r"); + return true; + } + +} diff --git a/src/main/java/buttondevteam/chat/commands/ucmds/admin/SetFlairCommand.java b/src/main/java/buttondevteam/chat/components/flair/SetFlairCommand.java similarity index 87% rename from src/main/java/buttondevteam/chat/commands/ucmds/admin/SetFlairCommand.java rename to src/main/java/buttondevteam/chat/components/flair/SetFlairCommand.java index e932138..dcd22ac 100644 --- a/src/main/java/buttondevteam/chat/commands/ucmds/admin/SetFlairCommand.java +++ b/src/main/java/buttondevteam/chat/components/flair/SetFlairCommand.java @@ -1,71 +1,70 @@ -package buttondevteam.chat.commands.ucmds.admin; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import buttondevteam.chat.ChatPlayer; -import buttondevteam.chat.FlairStates; -import buttondevteam.lib.player.TBMCPlayerBase; - -public class SetFlairCommand extends AdminCommandBase { - - @Override - public String[] GetHelpText(String alias) { - return new String[] { "§6---- Set flair -----", "Set a flair for a player", - "Usage: /u admin setflair [username]", - "Example 1: /u admin setflair NorbiPeti 19 false NorbiPeti --> orange (19s)", - "Example 2: /u admin setflair iie 0 true asde --> purple (0s)" }; - } - - @Override - public boolean OnCommand(CommandSender sender, String alias, String[] args) { - if (args.length < 3) { - return false; - } - Player p = Bukkit.getPlayer(args[0]); - if (p == null) { - sender.sendMessage("§cPlayer not found.&r"); - return true; - } - short flairtime = 0x00; - if (args[1].equalsIgnoreCase("non-presser")) - flairtime = ChatPlayer.FlairTimeNonPresser; - else if (args[1].equalsIgnoreCase("cant-press")) - flairtime = ChatPlayer.FlairTimeCantPress; - else if (args[1].equalsIgnoreCase("none")) - flairtime = ChatPlayer.FlairTimeNone; - else { - try { - flairtime = Short.parseShort(args[1]); - } catch (Exception e) { - sender.sendMessage( - "§cFlairtime must be a number, \"non-presser\", \"cant-press\" or \"none\". Run without args to see usage."); - return true; - } - } - boolean cheater = false; - if (args[2].equalsIgnoreCase("true")) - cheater = true; - else if (args[2].equalsIgnoreCase("false")) - cheater = false; - else { - sender.sendMessage("§cUnknown value for cheater parameter. Run without args to see usage."); - return true; - } - ChatPlayer mp = TBMCPlayerBase.getPlayer(p.getUniqueId(), ChatPlayer.class); - mp.SetFlair(flairtime, cheater); - mp.FlairState().set(FlairStates.Accepted); - if (args.length < 4) - mp.UserName().set(""); - else { - mp.UserName().set(args[3]); - if (!mp.UserNames().contains(args[3])) - mp.UserNames().add(args[3]); - } - sender.sendMessage( - "§bThe flair has been set. Player: " + mp.PlayerName() + " Flair: " + mp.GetFormattedFlair() + "§r"); - return true; - } - -} +package buttondevteam.chat.components.flair; + +import buttondevteam.chat.ChatPlayer; +import buttondevteam.chat.commands.ucmds.admin.AdminCommandBase; +import buttondevteam.lib.player.TBMCPlayerBase; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class SetFlairCommand extends AdminCommandBase { + + @Override + public String[] GetHelpText(String alias) { + return new String[] { "§6---- Set flair -----", "Set a flair for a player", + "Usage: /u admin setflair [username]", + "Example 1: /u admin setflair NorbiPeti 19 false NorbiPeti --> orange (19s)", + "Example 2: /u admin setflair iie 0 true asde --> purple (0s)" }; + } + + @Override + public boolean OnCommand(CommandSender sender, String alias, String[] args) { + if (args.length < 3) { + return false; + } + Player p = Bukkit.getPlayer(args[0]); + if (p == null) { + sender.sendMessage("§cPlayer not found.&r"); + return true; + } + short flairtime = 0x00; + if (args[1].equalsIgnoreCase("non-presser")) + flairtime = ChatPlayer.FlairTimeNonPresser; + else if (args[1].equalsIgnoreCase("cant-press")) + flairtime = ChatPlayer.FlairTimeCantPress; + else if (args[1].equalsIgnoreCase("none")) + flairtime = ChatPlayer.FlairTimeNone; + else { + try { + flairtime = Short.parseShort(args[1]); + } catch (Exception e) { + sender.sendMessage( + "§cFlairtime must be a number, \"non-presser\", \"cant-press\" or \"none\". Run without args to see usage."); + return true; + } + } + boolean cheater; + if (args[2].equalsIgnoreCase("true")) + cheater = true; + else if (args[2].equalsIgnoreCase("false")) + cheater = false; + else { + sender.sendMessage("§cUnknown value for cheater parameter."); + return false; + } + ChatPlayer mp = TBMCPlayerBase.getPlayer(p.getUniqueId(), ChatPlayer.class); + mp.SetFlair(flairtime, cheater); + mp.FlairState().set(FlairStates.Accepted); + if (args.length < 4) + mp.UserName().set(""); + else { + mp.UserName().set(args[3]); + if (!mp.UserNames().contains(args[3])) + mp.UserNames().add(args[3]); + } + sender.sendMessage( + "§bThe flair has been set. Player: " + mp.PlayerName() + " Flair: " + mp.GetFormattedFlair() + "§r"); + return true; + } + +} diff --git a/src/main/java/buttondevteam/chat/components/TownyAnnouncer.java b/src/main/java/buttondevteam/chat/components/towny/TownyAnnouncer.java similarity index 86% rename from src/main/java/buttondevteam/chat/components/TownyAnnouncer.java rename to src/main/java/buttondevteam/chat/components/towny/TownyAnnouncer.java index a368c83..dc579d3 100644 --- a/src/main/java/buttondevteam/chat/components/TownyAnnouncer.java +++ b/src/main/java/buttondevteam/chat/components/towny/TownyAnnouncer.java @@ -1,4 +1,4 @@ -package buttondevteam.chat.components; +package buttondevteam.chat.components.towny; import buttondevteam.chat.ChatProcessing; import buttondevteam.chat.PluginMain; @@ -23,12 +23,12 @@ public class TownyAnnouncer { switch (String.valueOf(m.group(1))) { //valueOf: Handles null case "Town": TBMCChatAPI.SendSystemMessage(PluginMain.TownChat, - new Channel.RecipientTestResult(PluginMain.getTownNationIndex(groupID, false), groupID), + new Channel.RecipientTestResult(TownyComponent.getTownNationIndex(groupID, false), groupID), logRecord.getMessage(), ChatProcessing.MCORIGIN); break; case "Nation": TBMCChatAPI.SendSystemMessage(PluginMain.NationChat, - new Channel.RecipientTestResult(PluginMain.getTownNationIndex(groupID, true), groupID), + new Channel.RecipientTestResult(TownyComponent.getTownNationIndex(groupID, true), groupID), logRecord.getMessage(), ChatProcessing.MCORIGIN); break; case "Global": diff --git a/src/main/java/buttondevteam/chat/components/towny/TownyComponent.java b/src/main/java/buttondevteam/chat/components/towny/TownyComponent.java new file mode 100644 index 0000000..c93cf7e --- /dev/null +++ b/src/main/java/buttondevteam/chat/components/towny/TownyComponent.java @@ -0,0 +1,94 @@ +package buttondevteam.chat.components.towny; + +import buttondevteam.chat.PluginMain; +import buttondevteam.component.channel.Channel; +import buttondevteam.lib.architecture.Component; +import buttondevteam.lib.chat.Color; +import buttondevteam.lib.chat.TBMCChatAPI; +import com.palmergames.bukkit.towny.Towny; +import com.palmergames.bukkit.towny.exceptions.NotRegisteredException; +import com.palmergames.bukkit.towny.object.Nation; +import com.palmergames.bukkit.towny.object.Resident; +import com.palmergames.bukkit.towny.object.Town; +import com.palmergames.bukkit.towny.object.TownyUniverse; +import lombok.val; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.stream.Collectors; + +public class TownyComponent extends Component { + public static TownyUniverse TU; + private static ArrayList Towns; + private static ArrayList Nations; + + @Override + protected void enable() { + TU = ((Towny) Bukkit.getPluginManager().getPlugin("Towny")).getTownyUniverse(); + Towns = TU.getTownsMap().values().stream().map(Town::getName).collect(Collectors.toCollection(ArrayList::new)); // Creates a snapshot of towns, new towns will be added when needed + Nations = TU.getNationsMap().values().stream().map(Nation::getName).collect(Collectors.toCollection(ArrayList::new)); // Same here but with nations + TBMCChatAPI.RegisterChatChannel( + PluginMain.TownChat = new Channel("§3TC§f", Color.DarkAqua, "tc", s -> checkTownNationChat(s, false))); + TBMCChatAPI.RegisterChatChannel( + PluginMain.NationChat = new Channel("§6NC§f", Color.Gold, "nc", s -> checkTownNationChat(s, true))); + TownyAnnouncer.setup(); + } + + @Override + protected void disable() { + TownyAnnouncer.setdown(); + } + + + /** + * Return the error message for the message sender if they can't send it and the score + */ + private static Channel.RecipientTestResult checkTownNationChat(CommandSender sender, boolean nationchat) { + if (!(sender instanceof Player)) + return new Channel.RecipientTestResult("§cYou are not a player!"); + Resident resident = TU.getResidentMap().get(sender.getName().toLowerCase()); + Channel.RecipientTestResult result = checkTownNationChatInternal(sender, nationchat, resident); + if (result.errormessage != null && resident != null && resident.getModes().contains("spy")) // Only use spy if they wouldn't see it + result = new Channel.RecipientTestResult(1000, "allspies"); // There won't be more than a thousand towns/nations probably + return result; + } + + private static Channel.RecipientTestResult checkTownNationChatInternal(CommandSender sender, boolean nationchat, + Resident resident) { + try { + /* + * p.sendMessage(String.format("[SPY-%s] - %s: %s", channel.DisplayName, ((Player) sender).getDisplayName(), message)); + */ + Town town = null; + if (resident != null && resident.hasTown()) + town = resident.getTown(); + if (town == null) + return new Channel.RecipientTestResult("You aren't in a town."); + Nation nation = null; + int index; + if (nationchat) { + if (town.hasNation()) + nation = town.getNation(); + if (nation == null) + return new Channel.RecipientTestResult("Your town isn't in a nation."); + index = getTownNationIndex(nation.getName(), true); + } else + index = getTownNationIndex(town.getName(), false); + return new Channel.RecipientTestResult(index, nationchat ? nation.getName() : town.getName()); + } catch (NotRegisteredException e) { + return new Channel.RecipientTestResult("You (probably) aren't knwon by Towny! (Not in a town)"); + } + } + + public static int getTownNationIndex(String name, boolean nation) { + val list = nation ? Nations : Towns; + int index = list.indexOf(name); + if (index < 0) { + list.add(name); + index = list.size() - 1; + } + return index; + } +} diff --git a/src/main/java/buttondevteam/chat/listener/PlayerJoinLeaveListener.java b/src/main/java/buttondevteam/chat/listener/PlayerJoinLeaveListener.java index 3a49a4a..196a8d0 100644 --- a/src/main/java/buttondevteam/chat/listener/PlayerJoinLeaveListener.java +++ b/src/main/java/buttondevteam/chat/listener/PlayerJoinLeaveListener.java @@ -1,144 +1,149 @@ -package buttondevteam.chat.listener; - -import buttondevteam.chat.ChatPlayer; -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; -import buttondevteam.lib.player.TBMCPlayerSaveEvent; -import com.earth2me.essentials.User; -import com.palmergames.bukkit.towny.exceptions.NotRegisteredException; -import lombok.val; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerQuitEvent; - -import java.util.Arrays; -import java.util.Optional; -import java.util.Timer; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.BiFunction; - -public class PlayerJoinLeaveListener implements Listener { - - @EventHandler - public void onPlayerLoad(TBMCPlayerLoadEvent e) { - ChatPlayer cp = e.GetPlayer().asPluginPlayer(ChatPlayer.class); - cp.FlairUpdate(); - } - - @EventHandler - public void onPlayerTBMCJoin(TBMCPlayerJoinEvent e) { - ChatPlayer cp = e.GetPlayer().asPluginPlayer(ChatPlayer.class); - Player p = Bukkit.getPlayer(cp.getUUID()); - - if (!cp.FlairState().get().equals(FlairStates.NoComment)) { - PluginMain.ConfirmUserMessage(cp); - Timer timer = new Timer(); - PlayerJoinTimerTask tt = new PlayerJoinTimerTask() { - @Override - public void run() { - mp.FlairUpdate(); - } - }; - tt.mp = cp; - timer.schedule(tt, 1000); - } //TODO: Better Reddit integration (OAuth) - - String nwithoutformatting = PluginMain.essentials.getUser(p).getNickname(); - - int index; - if (nwithoutformatting != null) { - while ((index = nwithoutformatting.indexOf("§k")) != -1) - nwithoutformatting = nwithoutformatting.replace("§k" + nwithoutformatting.charAt(index + 2), ""); // Support for one random char - while ((index = nwithoutformatting.indexOf('§')) != -1) - nwithoutformatting = nwithoutformatting.replace("§" + nwithoutformatting.charAt(index + 1), ""); - } else - nwithoutformatting = p.getName(); - PlayerListener.nicknames.forcePut(nwithoutformatting.toLowerCase(), p.getUniqueId()); - - 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 - public void onPlayerSave(TBMCPlayerSaveEvent e) { - } - - @EventHandler - public void onPlayerLeave(PlayerQuitEvent event) { - PlayerListener.nicknames.inverse().remove(event.getPlayer().getUniqueId()); - UnlolCommand.Lastlol.values().removeIf(lld -> lld.getLolowner().equals(event.getPlayer())); - } - - private static String getPlayerNickname(Player player, User user, ChatPlayer cp) { - String nickname = user.getNick(true); - if (nickname.contains("~")) //StartsWith doesn't work because of color codes - nickname = nickname.replace("~", ""); //It gets stacked otherwise - String name = ChatColor.stripColor(nickname); //Enforce "town colors" on non-members - val res = PluginMain.TU.getResidentMap().get(player.getName().toLowerCase()); - if (res == null || !res.hasTown()) - return name; - try { - Color[] clrs = Optional.ofNullable( - PluginMain.TownColors.get(res.getTown().getName().toLowerCase()) - ).orElse(new Color[]{Color.White}); //Use white as default town color - StringBuilder ret = new StringBuilder(); - AtomicInteger prevlen = new AtomicInteger(); - BiFunction anyColoredNamePart = (c, len) -> "§" //Len==0 if last part - + Integer.toHexString(c.ordinal()) // 'Odds' are the last character is chopped off so we make sure to include all chars at the end - + (len == 0 ? name.substring(prevlen.get()) - : name.substring(prevlen.get(), prevlen.addAndGet(len))); - BiFunction coloredNamePart = (len, i) - -> anyColoredNamePart.apply(clrs[i], i + 1 == clrs.length ? 0 : len); - final int len = name.length() / (clrs.length + 1); //The above param is needed because this isn't always passed - Color nc; - /*if(res.getTown().hasNation() - &&(nc=PluginMain.NationColor.get(res.getTown().getNation().getName().toLowerCase()))!=null) - len = name.length() / (clrs.length+1); - else - len = name.length() / clrs.length;*/ - val nclar = cp.NameColorLocations().get(); - int[] ncl = nclar == null ? null : nclar.stream().mapToInt(Integer::intValue).toArray(); - if (ncl != null && (Arrays.stream(ncl).sum() != name.length() || ncl.length != clrs.length + 1)) //+1: Nation color - ncl = null; // Reset if name length changed - //System.out.println("ncl: "+Arrays.toString(ncl)+" - sum: "+Arrays.stream(ncl).sum()+" - name len: "+name.length()); - if (!res.getTown().hasNation() - || (nc = PluginMain.NationColor.get(res.getTown().getNation().getName().toLowerCase())) == null) - nc = Color.White; - ret.append(anyColoredNamePart.apply(nc, ncl == null ? len : ncl[0])); //Make first color the nation color - for (int i = 0; i < clrs.length; i++) - //ret.append(coloredNamePart.apply(ncl == null ? len : (nc==null?ncl[i]:ncl[i+1]), i)); - ret.append(coloredNamePart.apply(ncl == null ? len : ncl[i + 1], i)); - return ret.toString(); - } catch (NotRegisteredException e) { - return nickname; - } - } - - public static void updatePlayerColors(Player player) { //Probably while ingame (/u ncolor) - updatePlayerColors(player, ChatPlayer.getPlayer(player.getUniqueId(), ChatPlayer.class)); - } - - @SuppressWarnings("WeakerAccess") - public static void updatePlayerColors(Player player, ChatPlayer cp) { //Probably at join - nop, nicknames - User user = PluginMain.essentials.getUser(player); - user.setNickname(getPlayerNickname(player, user, cp)); - user.setDisplayNick(); //These won't fire the nick change event - cp.FlairUpdate(); //Update in list - } -} +package buttondevteam.chat.listener; + +import buttondevteam.chat.ChatPlayer; +import buttondevteam.chat.PlayerJoinTimerTask; +import buttondevteam.chat.PluginMain; +import buttondevteam.chat.commands.UnlolCommand; +import buttondevteam.chat.commands.ucmds.HistoryCommand; +import buttondevteam.chat.components.flair.FlairComponent; +import buttondevteam.chat.components.flair.FlairStates; +import buttondevteam.chat.components.towny.TownyComponent; +import buttondevteam.core.ComponentManager; +import buttondevteam.lib.chat.Color; +import buttondevteam.lib.player.TBMCPlayerJoinEvent; +import buttondevteam.lib.player.TBMCPlayerLoadEvent; +import buttondevteam.lib.player.TBMCPlayerSaveEvent; +import com.earth2me.essentials.User; +import com.palmergames.bukkit.towny.exceptions.NotRegisteredException; +import lombok.val; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.util.Arrays; +import java.util.Optional; +import java.util.Timer; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiFunction; + +public class PlayerJoinLeaveListener implements Listener { + + @EventHandler + public void onPlayerLoad(TBMCPlayerLoadEvent e) { + ChatPlayer cp = e.GetPlayer().asPluginPlayer(ChatPlayer.class); + cp.FlairUpdate(); + } + + @EventHandler + public void onPlayerTBMCJoin(TBMCPlayerJoinEvent e) { + ChatPlayer cp = e.GetPlayer().asPluginPlayer(ChatPlayer.class); + Player p = Bukkit.getPlayer(cp.getUUID()); + + if (ComponentManager.isEnabled(FlairComponent.class)) { + if (!cp.FlairState().get().equals(FlairStates.NoComment)) { + FlairComponent.ConfirmUserMessage(cp); + Timer timer = new Timer(); + PlayerJoinTimerTask tt = new PlayerJoinTimerTask() { + @Override + public void run() { + mp.FlairUpdate(); + } + }; + tt.mp = cp; + timer.schedule(tt, 1000); + } //TODO: Better Reddit integration (OAuth) + } + + String nwithoutformatting = PluginMain.essentials.getUser(p).getNickname(); + + int index; + if (nwithoutformatting != null) { + while ((index = nwithoutformatting.indexOf("§k")) != -1) + nwithoutformatting = nwithoutformatting.replace("§k" + nwithoutformatting.charAt(index + 2), ""); // Support for one random char + while ((index = nwithoutformatting.indexOf('§')) != -1) + nwithoutformatting = nwithoutformatting.replace("§" + nwithoutformatting.charAt(index + 1), ""); + } else + nwithoutformatting = p.getName(); + PlayerListener.nicknames.forcePut(nwithoutformatting.toLowerCase(), p.getUniqueId()); + + 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 + public void onPlayerSave(TBMCPlayerSaveEvent e) { + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) { + PlayerListener.nicknames.inverse().remove(event.getPlayer().getUniqueId()); + UnlolCommand.Lastlol.values().removeIf(lld -> lld.getLolowner().equals(event.getPlayer())); + } + + private static String getPlayerNickname(Player player, User user, ChatPlayer cp) { + String nickname = user.getNick(true); + if (nickname.contains("~")) //StartsWith doesn't work because of color codes + nickname = nickname.replace("~", ""); //It gets stacked otherwise + String name = ChatColor.stripColor(nickname); //Enforce "town colors" on non-members + val res = TownyComponent.TU.getResidentMap().get(player.getName().toLowerCase()); + if (res == null || !res.hasTown()) + return name; + try { + Color[] clrs = Optional.ofNullable( + PluginMain.TownColors.get(res.getTown().getName().toLowerCase()) + ).orElse(new Color[]{Color.White}); //Use white as default town color + StringBuilder ret = new StringBuilder(); + AtomicInteger prevlen = new AtomicInteger(); + BiFunction anyColoredNamePart = (c, len) -> "§" //Len==0 if last part + + Integer.toHexString(c.ordinal()) // 'Odds' are the last character is chopped off so we make sure to include all chars at the end + + (len == 0 ? name.substring(prevlen.get()) + : name.substring(prevlen.get(), prevlen.addAndGet(len))); + BiFunction coloredNamePart = (len, i) + -> anyColoredNamePart.apply(clrs[i], i + 1 == clrs.length ? 0 : len); + final int len = name.length() / (clrs.length + 1); //The above param is needed because this isn't always passed + Color nc; + /*if(res.getTown().hasNation() + &&(nc=PluginMain.NationColor.get(res.getTown().getNation().getName().toLowerCase()))!=null) + len = name.length() / (clrs.length+1); + else + len = name.length() / clrs.length;*/ + val nclar = cp.NameColorLocations().get(); + int[] ncl = nclar == null ? null : nclar.stream().mapToInt(Integer::intValue).toArray(); + if (ncl != null && (Arrays.stream(ncl).sum() != name.length() || ncl.length != clrs.length + 1)) //+1: Nation color + ncl = null; // Reset if name length changed + //System.out.println("ncl: "+Arrays.toString(ncl)+" - sum: "+Arrays.stream(ncl).sum()+" - name len: "+name.length()); + if (!res.getTown().hasNation() + || (nc = PluginMain.NationColor.get(res.getTown().getNation().getName().toLowerCase())) == null) + nc = Color.White; + ret.append(anyColoredNamePart.apply(nc, ncl == null ? len : ncl[0])); //Make first color the nation color + for (int i = 0; i < clrs.length; i++) + //ret.append(coloredNamePart.apply(ncl == null ? len : (nc==null?ncl[i]:ncl[i+1]), i)); + ret.append(coloredNamePart.apply(ncl == null ? len : ncl[i + 1], i)); + return ret.toString(); + } catch (NotRegisteredException e) { + return nickname; + } + } + + public static void updatePlayerColors(Player player) { //Probably while ingame (/u ncolor) + updatePlayerColors(player, ChatPlayer.getPlayer(player.getUniqueId(), ChatPlayer.class)); + } + + @SuppressWarnings("WeakerAccess") + public static void updatePlayerColors(Player player, ChatPlayer cp) { //Probably at join - nop, nicknames + User user = PluginMain.essentials.getUser(player); + user.setNickname(getPlayerNickname(player, user, cp)); + user.setDisplayNick(); //These won't fire the nick change event + cp.FlairUpdate(); //Update in list + } +} diff --git a/src/main/java/buttondevteam/chat/listener/PlayerListener.java b/src/main/java/buttondevteam/chat/listener/PlayerListener.java index e077f8f..42dd4ef 100644 --- a/src/main/java/buttondevteam/chat/listener/PlayerListener.java +++ b/src/main/java/buttondevteam/chat/listener/PlayerListener.java @@ -4,9 +4,11 @@ import buttondevteam.chat.ChatPlayer; import buttondevteam.chat.ChatProcessing; import buttondevteam.chat.PluginMain; import buttondevteam.chat.commands.ucmds.HistoryCommand; +import buttondevteam.chat.components.flair.FlairComponent; import buttondevteam.component.channel.Channel; import buttondevteam.component.channel.ChatChannelRegisterEvent; import buttondevteam.component.channel.ChatRoom; +import buttondevteam.core.ComponentManager; import buttondevteam.lib.TBMCChatEvent; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.chat.ChatMessage; @@ -50,15 +52,9 @@ public class PlayerListener implements Listener { */ public static BiMap nicknames = HashBiMap.create(); - public static boolean Enable = false; - - public static int LoginWarningCountTotal = 5; - public static String NotificationSound; public static double NotificationPitch; - public static boolean ShowRPTag = false; - public final static String[] LaughStrings = new String[]{"xd", "lel", "lawl", "kek", "lmao", "hue", "hah", "rofl"}; @EventHandler(priority = EventPriority.HIGHEST) @@ -88,7 +84,7 @@ public class PlayerListener implements Listener { return false; // ^^ We can only store player or console channels - Directly sending to channels would still work if they had an event cmd = sender instanceof ConsoleCommandSender ? message : message.substring(1); - for (Channel channel : Channel.getChannels()) { + for (Channel channel : ((Iterable) Channel.getChannels()::iterator)) { //Using Stream.forEach would be too easy if (checkchid.test(channel, cmd)) { Channel oldch = mp.channel().get(); if (oldch instanceof ChatRoom) @@ -130,7 +126,7 @@ public class PlayerListener implements Listener { return true; } } else - for (Channel channel : Channel.getChannels()) { + for (Channel channel : (Iterable) Channel.getChannels()::iterator) { if (checkchid.test(channel, cmd)) { //Apparently method references don't require final variables TBMCChatAPI.SendChatMessage(ChatMessage.builder(sender, mp, message.substring(index + 1)).build(), channel); return true; @@ -173,13 +169,10 @@ public class PlayerListener implements Listener { public static boolean ActiveF = false; public static ChatPlayer FPlayer = null; public static BukkitTask Ftask = null; - public static int AlphaDeaths; public static ArrayList Fs = new ArrayList<>(); @EventHandler public void onPlayerDeath(PlayerDeathEvent e) { - if (e.getEntity().getName().equals("Alpha_Bacca44")) - AlphaDeaths++; // MinigamePlayer mgp = Minigames.plugin.pdata.getMinigamePlayer(e.getEntity()); if (/* (mgp != null && !mgp.isInMinigame()) && */ new Random().nextBoolean()) { // Don't store Fs for NPCs Runnable tt = () -> { @@ -249,9 +242,11 @@ public class PlayerListener implements Listener { e.addInfo("Minecraft name: " + cp.PlayerName().get()); if (cp.UserName().get() != null && cp.UserName().get().length() > 0) e.addInfo("Reddit name: " + cp.UserName().get()); - final String flair = cp.GetFormattedFlair(e.getTarget() != InfoTarget.MCCommand); - if (flair.length() > 0) - e.addInfo("/r/TheButton flair: " + flair); + if (ComponentManager.isEnabled(FlairComponent.class)) { + final String flair = cp.GetFormattedFlair(e.getTarget() != InfoTarget.MCCommand); + if (flair.length() > 0) + e.addInfo("/r/TheButton flair: " + flair); + } e.addInfo(String.format("Respect: %.2f", cp.getF())); } catch (Exception ex) { TBMCCoreAPI.SendException("Error while providing chat info for player " + e.getPlayer().getFileName(), ex);