diff --git a/src/main/java/mineverse/Aust1n46/chat/MineverseChat.java b/src/main/java/mineverse/Aust1n46/chat/MineverseChat.java index 05f33f2..234bc93 100644 --- a/src/main/java/mineverse/Aust1n46/chat/MineverseChat.java +++ b/src/main/java/mineverse/Aust1n46/chat/MineverseChat.java @@ -1,1085 +1,1074 @@ -package mineverse.Aust1n46.chat; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.UUID; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.plugin.PluginManager; -import org.bukkit.plugin.RegisteredServiceProvider; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.plugin.messaging.PluginMessageListener; -import org.bukkit.scheduler.BukkitScheduler; - -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.events.PacketContainer; - -import me.clip.placeholderapi.PlaceholderAPI; -import mineverse.Aust1n46.chat.alias.Alias; -import mineverse.Aust1n46.chat.api.MineverseChatAPI; -import mineverse.Aust1n46.chat.api.MineverseChatPlayer; -import mineverse.Aust1n46.chat.api.events.VentureChatEvent; -import mineverse.Aust1n46.chat.channel.ChatChannel; -import mineverse.Aust1n46.chat.channel.ChatChannelInfo; -import mineverse.Aust1n46.chat.command.VentureCommandExecutor; -import mineverse.Aust1n46.chat.command.chat.Channel; -import mineverse.Aust1n46.chat.command.mute.MuteContainer; -import mineverse.Aust1n46.chat.database.Database; -import mineverse.Aust1n46.chat.database.PlayerData; -import mineverse.Aust1n46.chat.gui.GuiSlot; -import mineverse.Aust1n46.chat.json.JsonFormat; -import mineverse.Aust1n46.chat.listeners.ChatListener; -import mineverse.Aust1n46.chat.listeners.CommandListener; -import mineverse.Aust1n46.chat.listeners.LoginListener; -import mineverse.Aust1n46.chat.listeners.PacketListener; -import mineverse.Aust1n46.chat.listeners.SignListener; -import mineverse.Aust1n46.chat.localization.Localization; -import mineverse.Aust1n46.chat.localization.LocalizedMessage; -import mineverse.Aust1n46.chat.utilities.Format; -import net.milkbowl.vault.chat.Chat; -import net.milkbowl.vault.permission.Permission; - -/** - * VentureChat Minecraft plugin for servers running Spigot or Paper software. - * - * @author Aust1n46 - */ -public class MineverseChat extends JavaPlugin implements PluginMessageListener { - // Plugin Messaging Channel - public static final String PLUGIN_MESSAGING_CHANNEL = "venturechat:data"; - - // Event constants - public static final boolean ASYNC = true; - public static final boolean SYNC = false; - - public static final int LINE_LENGTH = 40; - - // DiscordSRV backwards compatibility - @Deprecated - public static ChatChannelInfo ccInfo; - - @Deprecated - public static Set players = new HashSet(); - @Deprecated - public static Set onlinePlayers = new HashSet(); - - // Vault - private static Permission permission = null; - private static Chat chat = null; - - @Override - public void onEnable() { - ccInfo = new ChatChannelInfo(); - - try { - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Initializing...")); - if(!getDataFolder().exists()) { - getDataFolder().mkdirs(); - } - File file = new File(getDataFolder(), "config.yml"); - if(!file.exists()) { - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Config not found! Generating file.")); - saveDefaultConfig(); - } - else { - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Config found! Loading file.")); - } - - saveResource("example_config_always_up_to_date!.yml", true); - } - catch(Exception ex) { - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - &cCould not load configuration! Something unexpected went wrong!")); - } - - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Checking for Vault...")); - - if(!setupPermissions() || !setupChat()) { - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - &cCould not find Vault dependency, disabling.")); - Bukkit.getPluginManager().disablePlugin(this); - } - - Localization.initialize(); - Alias.initialize(); - JsonFormat.initialize(); - GuiSlot.initialize(); - ChatChannel.initialize(false); - - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Loading player data")); - PlayerData.loadLegacyPlayerData(); - PlayerData.loadPlayerData(); - for(Player p : getServer().getOnlinePlayers()) { - MineverseChatPlayer mcp = MineverseChatAPI.getMineverseChatPlayer(p); - if(mcp == null) { - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Could not find player data post reload for currently online player: " + p.getName())); - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - There could be an issue with your player data saving.")); - String name = p.getName(); - UUID uuid = p.getUniqueId(); - mcp = new MineverseChatPlayer(uuid, name); - } - mcp.setOnline(true); - mcp.setHasPlayed(false); - mcp.setJsonFormat(); - MineverseChatAPI.addMineverseChatOnlinePlayerToMap(mcp); - MineverseChatAPI.addNameToMap(mcp); - } - - Bukkit.getScheduler().runTaskAsynchronously(this, () -> { - Database.initializeMySQL(); - }); - - VentureCommandExecutor.initialize(); - - registerListeners(); - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Registering Listeners")); - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Attaching to Executors")); - - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Establishing BungeeCord")); - Bukkit.getMessenger().registerOutgoingPluginChannel(this, PLUGIN_MESSAGING_CHANNEL); - Bukkit.getMessenger().registerIncomingPluginChannel(this, PLUGIN_MESSAGING_CHANNEL, this); - - PluginManager pluginManager = getServer().getPluginManager(); - if(pluginManager.isPluginEnabled("Towny")) { - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Enabling Towny Formatting")); - } - if(pluginManager.isPluginEnabled("Jobs")) { - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Enabling Jobs Formatting")); - } - if(pluginManager.isPluginEnabled("Factions")) { - String version = pluginManager.getPlugin("Factions").getDescription().getVersion(); - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Enabling Factions Formatting version " + version)); - } - if(pluginManager.isPluginEnabled("PlaceholderAPI")) { - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Enabling PlaceholderAPI Hook")); - } - - new VentureChatPlaceholders().register(); - - startRepeatingTasks(); - - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Enabled Successfully")); - } - - @Override - public void onDisable() { - PlayerData.savePlayerData(); - MineverseChatAPI.clearMineverseChatPlayerMap(); - MineverseChatAPI.clearNameMap(); - MineverseChatAPI.clearOnlineMineverseChatPlayerMap(); - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Disabling...")); - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Disabled Successfully")); - } - - private void startRepeatingTasks() { - BukkitScheduler scheduler = Bukkit.getServer().getScheduler(); - scheduler.runTaskTimerAsynchronously(this, new Runnable() { - @Override - public void run() { - PlayerData.savePlayerData(); - if(getConfig().getString("loglevel", "info").equals("debug")) { - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Saving Player Data")); - } - } - }, 0L, getConfig().getInt("saveinterval") * 1200); //one minute * save interval - - scheduler.runTaskTimerAsynchronously(this, new Runnable() { - @Override - public void run() { - for (MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - long currentTimeMillis = System.currentTimeMillis(); - Iterator iterator = p.getMutes().iterator(); - while (iterator.hasNext()) { - MuteContainer mute = iterator.next(); - if(ChatChannel.isChannel(mute.getChannel())) { - ChatChannel channel = ChatChannel.getChannel(mute.getChannel()); - long timemark = mute.getDuration(); - if (timemark == 0) { - continue; - } - if (getConfig().getString("loglevel", "info").equals("debug")) { - System.out.println(currentTimeMillis + " " + timemark); - } - if (currentTimeMillis >= timemark) { - iterator.remove(); - p.getPlayer().sendMessage(LocalizedMessage.UNMUTE_PLAYER_PLAYER.toString() - .replace("{player}", p.getName()).replace("{channel_color}", channel.getColor()) - .replace("{channel_name}", mute.getChannel())); - if(channel.getBungee()) { - synchronize(p, true); - } - } - } - } - } - if (getConfig().getString("loglevel", "info").equals("debug")) { - Bukkit.getConsoleSender() - .sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Updating Player Mutes")); - } - } - }, 0L, 60L); // three second interval - } - - private void registerListeners() { - PluginManager pluginManager = getServer().getPluginManager(); - pluginManager.registerEvents(new Channel(), this); - pluginManager.registerEvents(new ChatListener(), this); - pluginManager.registerEvents(new SignListener(), this); - pluginManager.registerEvents(new CommandListener(), this); - pluginManager.registerEvents(new LoginListener(), this); - ProtocolLibrary.getProtocolManager().addPacketListener(new PacketListener()); - } - - private boolean setupPermissions() { - RegisteredServiceProvider permissionProvider = getServer().getServicesManager().getRegistration(net.milkbowl.vault.permission.Permission.class); - if(permissionProvider != null) { - permission = permissionProvider.getProvider(); - } - 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); - } - - public static MineverseChat getInstance() { - return getPlugin(MineverseChat.class); - } - - public static Chat getVaultChat() { - return chat; - } - - public static Permission getVaultPermission() { - return permission; - } - - public static void synchronize(MineverseChatPlayer mcp, boolean changes) { - // System.out.println("Sync started..."); - ByteArrayOutputStream outstream = new ByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(outstream); - try { - out.writeUTF("Sync"); - if(!changes) { - out.writeUTF("Receive"); - // System.out.println(mcp.getPlayer().getServer().getServerName()); - // out.writeUTF(mcp.getPlayer().getServer().getServerName()); - out.writeUTF(mcp.getUUID().toString()); - Bukkit.getServer().getScheduler().runTaskLaterAsynchronously(getInstance(), new Runnable() { - @Override - public void run() { - if(!mcp.isOnline() || mcp.hasPlayed()) { - return; - } - synchronize(mcp, false); - } - }, 20L); // one second delay before running again - } - else { - out.writeUTF("Update"); - out.writeUTF(mcp.getUUID().toString()); - // out.writeUTF("Channels"); - int channelCount = 0; - for(String c : mcp.getListening()) { - ChatChannel channel = ChatChannel.getChannel(c); - if(channel.getBungee()) { - channelCount++; - } - } - out.write(channelCount); - for(String c : mcp.getListening()) { - ChatChannel channel = ChatChannel.getChannel(c); - if(channel.getBungee()) { - out.writeUTF(channel.getName()); - } - } - // out.writeUTF("Mutes"); - int muteCount = 0; - for(MuteContainer mute : mcp.getMutes()) { - ChatChannel channel = ChatChannel.getChannel(mute.getChannel()); - if(channel.getBungee()) { - muteCount++; - } - } - // System.out.println(muteCount + " mutes"); - out.write(muteCount); - for(MuteContainer mute : mcp.getMutes()) { - ChatChannel channel = ChatChannel.getChannel(mute.getChannel()); - if(channel.getBungee()) { - out.writeUTF(channel.getName()); - out.writeLong(mute.getDuration()); - out.writeUTF(mute.getReason()); - } - } - int ignoreCount = 0; - for(@SuppressWarnings("unused") - UUID c : mcp.getIgnores()) { - ignoreCount++; - } - out.write(ignoreCount); - for(UUID c : mcp.getIgnores()) { - out.writeUTF(c.toString()); - } - out.writeBoolean(mcp.isSpy()); - out.writeBoolean(mcp.getMessageToggle()); - } - sendPluginMessage(outstream); - // System.out.println("Sync start bottom..."); - out.close(); - } - catch(IOException e) { - e.printStackTrace(); - } - } - - public static void sendPluginMessage(ByteArrayOutputStream byteOutStream) { - if(MineverseChatAPI.getOnlineMineverseChatPlayers().size() > 0) { - MineverseChatAPI.getOnlineMineverseChatPlayers().iterator().next().getPlayer().sendPluginMessage(getInstance(), PLUGIN_MESSAGING_CHANNEL, byteOutStream.toByteArray()); - } - } - - public static void sendDiscordSRVPluginMessage(String chatChannel, String message) { - if(MineverseChatAPI.getOnlineMineverseChatPlayers().size() == 0) { - return; - } - ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(byteOutStream); - try { - out.writeUTF("DiscordSRV"); - out.writeUTF(chatChannel); - out.writeUTF(message); - sendPluginMessage(byteOutStream); - out.close(); - } - catch(Exception e) { - e.printStackTrace(); - } - } - - @Override - public void onPluginMessageReceived(String channel, Player player, byte[] inputStream) { - if(!channel.equals(PLUGIN_MESSAGING_CHANNEL)) { - return; - } - try { - DataInputStream msgin = new DataInputStream(new ByteArrayInputStream(inputStream)); - if(getConfig().getString("loglevel", "info").equals("debug")) { - System.out.println(msgin.available() + " size on receiving end"); - } - String subchannel = msgin.readUTF(); - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(stream); - if(subchannel.equals("Chat")) { - String server = msgin.readUTF(); - String chatchannel = msgin.readUTF(); - String senderName = msgin.readUTF(); - UUID senderUUID = UUID.fromString(msgin.readUTF()); - int hash = msgin.readInt(); - String format = msgin.readUTF(); - String chat = msgin.readUTF(); - String consoleChat = format + chat; - String globalJSON = msgin.readUTF(); - String primaryGroup = msgin.readUTF(); - String nickname = msgin.readUTF(); - - if(!ChatChannel.isChannel(chatchannel)) { - return; - } - ChatChannel chatChannelObject = ChatChannel.getChannel(chatchannel); - - if(!chatChannelObject.getBungee()) { - return; - } - - Set recipients = new HashSet(); - for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - if(p.isListening(chatChannelObject.getName())) { - recipients.add(p.getPlayer()); - } - } - - Bukkit.getServer().getScheduler().runTaskAsynchronously(this, new Runnable() { - @Override - public void run() { - //Create VentureChatEvent - VentureChatEvent ventureChatEvent = new VentureChatEvent(null, senderName, nickname, primaryGroup, chatChannelObject, recipients, recipients.size(), format, chat, globalJSON, hash, false); - //Fire event and wait for other plugin listeners to act on it - Bukkit.getServer().getPluginManager().callEvent(ventureChatEvent); - } - }); - - Bukkit.getConsoleSender().sendMessage(consoleChat); - - if(Database.isEnabled()) { - Database.writeVentureChat(senderUUID.toString(), senderName, server, chatchannel, chat.replace("'", "''"), "Chat"); - } - - for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - if(p.isListening(chatChannelObject.getName())) { - if(!p.getBungeeToggle() && MineverseChatAPI.getOnlineMineverseChatPlayer(senderName) == null) { - continue; - } - - String json = Format.formatModerationGUI(globalJSON, p.getPlayer(), senderName, chatchannel, hash); - PacketContainer packet = Format.createPacketPlayOutChat(json); - - if(getConfig().getBoolean("ignorechat", false)) { - if(!p.getIgnores().contains(senderUUID)) { - // System.out.println("Chat sent"); - Format.sendPacketPlayOutChat(p.getPlayer(), packet); - } - continue; - } - Format.sendPacketPlayOutChat(p.getPlayer(), packet); - } - } - } - if(subchannel.equals("DiscordSRV")) { - String chatChannel = msgin.readUTF(); - String message = msgin.readUTF(); - if(!ChatChannel.isChannel(chatChannel)) { - return; - } - ChatChannel chatChannelObj = ChatChannel.getChannel(chatChannel); - if(!chatChannelObj.getBungee()) { - return; - } - - String json = Format.convertPlainTextToJson(message, true); - int hash = (message.replaceAll("([�]([a-z0-9]))", "")).hashCode(); - - for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - if(p.isListening(chatChannelObj.getName())) { - String finalJSON = Format.formatModerationGUI(json, p.getPlayer(), "Discord", chatChannelObj.getName(), hash); - PacketContainer packet = Format.createPacketPlayOutChat(finalJSON); - Format.sendPacketPlayOutChat(p.getPlayer(), packet); - } - } - } - if(subchannel.equals("PlayerNames")) { - MineverseChatAPI.clearNetworkPlayerNames(); - int playerCount = msgin.readInt(); - for(int a = 0; a < playerCount; a ++) { - MineverseChatAPI.addNetworkPlayerName(msgin.readUTF()); - } - } - if(subchannel.equals("Chwho")) { - String identifier = msgin.readUTF(); - if(identifier.equals("Get")) { - String sender = msgin.readUTF(); - String name = msgin.readUTF(); - String chatchannel = msgin.readUTF(); - List listening = new ArrayList(); - if(ChatChannel.isChannel(chatchannel)) { - for(MineverseChatPlayer mcp : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - if(mcp.isListening(chatchannel)) { - String entry = "&f" + mcp.getName(); - if(mcp.isMuted(chatchannel)) { - entry = "&c" + mcp.getName(); - } - listening.add(entry); - } - } - } - out.writeUTF("Chwho"); - out.writeUTF("Receive"); - out.writeUTF(sender); - out.writeUTF(name); - out.writeUTF(chatchannel); - out.writeInt(listening.size()); - for(String s : listening) { - out.writeUTF(s); - } - sendPluginMessage(stream); - } - if(identifier.equals("Receive")) { - String sender = msgin.readUTF(); - String stringchannel = msgin.readUTF(); - MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(UUID.fromString(sender)); - ChatChannel chatchannel = ChatChannel.getChannel(stringchannel); - String playerList = ""; - int size = msgin.readInt(); - for(int a = 0; a < size; a++) { - playerList += msgin.readUTF() + ChatColor.WHITE + ", "; - } - if(playerList.length() > 2) { - playerList = playerList.substring(0, playerList.length() - 2); - } - mcp.getPlayer().sendMessage(LocalizedMessage.CHANNEL_PLAYER_LIST_HEADER.toString() - .replace("{channel_color}", chatchannel.getColor().toString()) - .replace("{channel_name}", chatchannel.getName())); - mcp.getPlayer().sendMessage(Format.FormatStringAll(playerList)); - } - } - if(subchannel.equals("RemoveMessage")) { - String hash = msgin.readUTF(); - getServer().dispatchCommand(this.getServer().getConsoleSender(), "removemessage " + hash); - } - if(subchannel.equals("Sync")) { - if(getConfig().getString("loglevel", "info").equals("debug")) { - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Received update...")); - } - String uuid = msgin.readUTF(); - MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(UUID.fromString(uuid)); - if(p == null || p.hasPlayed()) { - return; - } - for(Object ch : p.getListening().toArray()) { - String c = ch.toString(); - ChatChannel cha = ChatChannel.getChannel(c); - if(cha.getBungee()) { - p.removeListening(c); - } - } - int size = msgin.read(); - for(int a = 0; a < size; a++) { - String ch = msgin.readUTF(); - if(ChatChannel.isChannel(ch)) { - ChatChannel cha = ChatChannel.getChannel(ch); - if(!cha.hasPermission() || p.getPlayer().hasPermission(cha.getPermission())) { - p.addListening(ch); - } - } - } - p.getMutes().removeIf(mute -> ChatChannel.getChannel(mute.getChannel()).getBungee()); - int sizeB = msgin.read(); - // System.out.println(sizeB + " mute size"); - for(int b = 0; b < sizeB; b++) { - String ch = msgin.readUTF(); - long muteTime = msgin.readLong(); - String muteReason = msgin.readUTF(); - // System.out.println(ch); - if(ChatChannel.isChannel(ch)) { - p.addMute(ch, muteTime, muteReason); - } - } - // System.out.println(msgin.available() + " available before"); - p.setSpy(msgin.readBoolean()); - p.setMessageToggle(msgin.readBoolean()); - // System.out.println(msgin.available() + " available after"); - for(Object o : p.getIgnores().toArray()) { - p.removeIgnore((UUID) o); - } - int sizeC = msgin.read(); - // System.out.println(sizeC + " ignore size"); - for(int c = 0; c < sizeC; c++) { - String i = msgin.readUTF(); - // System.out.println(i); - p.addIgnore(UUID.fromString(i)); - } - if(!p.hasPlayed()) { - boolean isThereABungeeChannel = false; - for(ChatChannel ch : ChatChannel.getAutojoinList()) { - if((!ch.hasPermission() || p.getPlayer().hasPermission(ch.getPermission())) && !p.isListening(ch.getName())) { - p.addListening(ch.getName()); - if(ch.getBungee()) { - isThereABungeeChannel = true; - } - } - } - p.setHasPlayed(true); - // Only run a sync update if the player joined a BungeeCord channel - if(isThereABungeeChannel) { - synchronize(p, true); - } - } - } - if(subchannel.equals("Ignore")) { - String identifier = msgin.readUTF(); - if(identifier.equals("Send")) { - String server = msgin.readUTF(); - String receiver = msgin.readUTF(); - MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(receiver); - UUID sender = UUID.fromString(msgin.readUTF()); - if(!getConfig().getBoolean("bungeecordmessaging", true) || p == null || !p.isOnline()) { - out.writeUTF("Ignore"); - out.writeUTF("Offline"); - out.writeUTF(server); - out.writeUTF(receiver); - out.writeUTF(sender.toString()); - sendPluginMessage(stream); - return; - } - out.writeUTF("Ignore"); - out.writeUTF("Echo"); - out.writeUTF(server); - out.writeUTF(p.getUUID().toString()); - out.writeUTF(receiver); - out.writeUTF(sender.toString()); - sendPluginMessage(stream); - return; - } - if(identifier.equals("Offline")) { - String receiver = msgin.readUTF(); - UUID sender = UUID.fromString(msgin.readUTF()); - MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); - p.getPlayer().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() - .replace("{args}", receiver)); - } - if(identifier.equals("Echo")) { - UUID receiver = UUID.fromString(msgin.readUTF()); - String receiverName = msgin.readUTF(); - UUID sender = UUID.fromString(msgin.readUTF()); - MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); - - if(p.getIgnores().contains(receiver)) { - p.getPlayer().sendMessage(LocalizedMessage.IGNORE_PLAYER_OFF.toString() - .replace("{player}", receiverName)); - p.removeIgnore(receiver); - synchronize(p, true); - return; - } - - p.addIgnore(receiver); - p.getPlayer().sendMessage(LocalizedMessage.IGNORE_PLAYER_ON.toString() - .replace("{player}", receiverName)); - synchronize(p, true); - } - } - if(subchannel.equals("Mute")) { - String identifier = msgin.readUTF(); - if(identifier.equals("Send")) { - String server = msgin.readUTF(); - String senderIdentifier = msgin.readUTF(); - String temporaryDataInstanceUUIDString = msgin.readUTF(); - String playerToMute = msgin.readUTF(); - String channelName = msgin.readUTF(); - long time = msgin.readLong(); - String reason = msgin.readUTF(); - MineverseChatPlayer playerToMuteMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(playerToMute); - if(playerToMuteMCP == null) { - out.writeUTF("Mute"); - out.writeUTF("Offline"); - out.writeUTF(server); - out.writeUTF(temporaryDataInstanceUUIDString); - out.writeUTF(senderIdentifier); - out.writeUTF(playerToMute); - sendPluginMessage(stream); - return; - } - if(!ChatChannel.isChannel(channelName)) { - return; - } - ChatChannel chatChannelObj = ChatChannel.getChannel(channelName); - if (playerToMuteMCP.isMuted(chatChannelObj.getName())) { - out.writeUTF("Mute"); - out.writeUTF("AlreadyMuted"); - out.writeUTF(server); - out.writeUTF(senderIdentifier); - out.writeUTF(playerToMute); - out.writeUTF(channelName); - sendPluginMessage(stream); - return; - } - if(time > 0) { - long datetime = System.currentTimeMillis(); - if(reason.isEmpty()) { - playerToMuteMCP.addMute(chatChannelObj.getName(), datetime + time); - String timeString = Format.parseTimeStringFromMillis(time); - playerToMuteMCP.getPlayer() - .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_TIME.toString() - .replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName()) - .replace("{time}", timeString)); - } - else { - playerToMuteMCP.addMute(chatChannelObj.getName(), datetime + time, reason); - String timeString = Format.parseTimeStringFromMillis(time); - playerToMuteMCP.getPlayer() - .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_TIME_REASON.toString() - .replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName()) - .replace("{time}", timeString) - .replace("{reason}", reason)); - } - } - else { - if(reason.isEmpty()) { - playerToMuteMCP.addMute(chatChannelObj.getName()); - playerToMuteMCP.getPlayer() - .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER.toString() - .replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName())); - } - else { - playerToMuteMCP.addMute(chatChannelObj.getName(), reason); - playerToMuteMCP.getPlayer() - .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_REASON.toString() - .replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName()) - .replace("{reason}", reason)); - } - } - synchronize(playerToMuteMCP, true); - out.writeUTF("Mute"); - out.writeUTF("Valid"); - out.writeUTF(server); - out.writeUTF(senderIdentifier); - out.writeUTF(playerToMute); - out.writeUTF(channelName); - out.writeLong(time); - out.writeUTF(reason); - sendPluginMessage(stream); - return; - } - if(identifier.equals("Valid")) { - String senderIdentifier = msgin.readUTF(); - String playerToMute = msgin.readUTF(); - String channelName = msgin.readUTF(); - long time = msgin.readLong(); - String reason = msgin.readUTF(); - if(!ChatChannel.isChannel(channelName)) { - return; - } - ChatChannel chatChannelObj = ChatChannel.getChannel(channelName); - if(time > 0) { - String timeString = Format.parseTimeStringFromMillis(time); - if(reason.isEmpty()) { - if(senderIdentifier.equals("VentureChat:Console")) { - Bukkit.getConsoleSender().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_TIME.toString() - .replace("{player}", playerToMute) - .replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName()) - .replace("{time}", timeString)); - } - else { - UUID sender = UUID.fromString(senderIdentifier); - MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); - senderMCP.getPlayer().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_TIME.toString() - .replace("{player}", playerToMute) - .replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName()) - .replace("{time}", timeString)); - } - } - else { - if(senderIdentifier.equals("VentureChat:Console")) { - Bukkit.getConsoleSender().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_TIME_REASON.toString() - .replace("{player}", playerToMute) - .replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName()) - .replace("{time}", timeString) - .replace("{reason}", reason)); - } - else { - UUID sender = UUID.fromString(senderIdentifier); - MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); - senderMCP.getPlayer().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_TIME_REASON.toString() - .replace("{player}", playerToMute) - .replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName()) - .replace("{time}", timeString) - .replace("{reason}", reason)); - } - } - } - else { - if(reason.isEmpty()) { - if(senderIdentifier.equals("VentureChat:Console")) { - Bukkit.getConsoleSender().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER.toString() - .replace("{player}", playerToMute) - .replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName())); - } - else { - UUID sender = UUID.fromString(senderIdentifier); - MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); - senderMCP.getPlayer().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER.toString() - .replace("{player}", playerToMute) - .replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName())); - } - } - else { - if(senderIdentifier.equals("VentureChat:Console")) { - Bukkit.getConsoleSender().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_REASON.toString() - .replace("{player}", playerToMute) - .replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName()) - .replace("{reason}", reason)); - } - else { - UUID sender = UUID.fromString(senderIdentifier); - MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); - senderMCP.getPlayer().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_REASON.toString() - .replace("{player}", playerToMute) - .replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName()) - .replace("{reason}", reason)); - } - } - } - return; - } - if(identifier.equals("Offline")) { - String senderIdentifier = msgin.readUTF(); - String playerToMute = msgin.readUTF(); - if(senderIdentifier.equals("VentureChat:Console")) { - Bukkit.getConsoleSender().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() - .replace("{args}", playerToMute)); - return; - } - UUID sender = UUID.fromString(senderIdentifier); - MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); - senderMCP.getPlayer().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() - .replace("{args}", playerToMute)); - return; - } - if(identifier.equals("AlreadyMuted")) { - String senderIdentifier = msgin.readUTF(); - String playerToMute = msgin.readUTF(); - String channelName = msgin.readUTF(); - if(!ChatChannel.isChannel(channelName)) { - return; - } - ChatChannel chatChannelObj = ChatChannel.getChannel(channelName); - if(senderIdentifier.equals("VentureChat:Console")) { - Bukkit.getConsoleSender().sendMessage(LocalizedMessage.PLAYER_ALREADY_MUTED.toString() - .replace("{player}", playerToMute).replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName())); - return; - } - UUID sender = UUID.fromString(senderIdentifier); - MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); - senderMCP.getPlayer().sendMessage(LocalizedMessage.PLAYER_ALREADY_MUTED.toString() - .replace("{player}", playerToMute).replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName())); - return; - } - } - if(subchannel.equals("Unmute")) { - String identifier = msgin.readUTF(); - if(identifier.equals("Send")) { - String server = msgin.readUTF(); - String senderIdentifier = msgin.readUTF(); - String temporaryDataInstanceUUIDString = msgin.readUTF(); - String playerToUnmute = msgin.readUTF(); - String channelName = msgin.readUTF(); - MineverseChatPlayer playerToUnmuteMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(playerToUnmute); - if(playerToUnmuteMCP == null) { - out.writeUTF("Unmute"); - out.writeUTF("Offline"); - out.writeUTF(server); - out.writeUTF(temporaryDataInstanceUUIDString); - out.writeUTF(senderIdentifier); - out.writeUTF(playerToUnmute); - sendPluginMessage(stream); - return; - } - if(!ChatChannel.isChannel(channelName)) { - return; - } - ChatChannel chatChannelObj = ChatChannel.getChannel(channelName); - if (!playerToUnmuteMCP.isMuted(chatChannelObj.getName())) { - out.writeUTF("Unmute"); - out.writeUTF("NotMuted"); - out.writeUTF(server); - out.writeUTF(senderIdentifier); - out.writeUTF(playerToUnmute); - out.writeUTF(channelName); - sendPluginMessage(stream); - return; - } - playerToUnmuteMCP.removeMute(chatChannelObj.getName()); - playerToUnmuteMCP.getPlayer().sendMessage(LocalizedMessage.UNMUTE_PLAYER_PLAYER.toString() - .replace("{player}", player.getName()).replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName())); - synchronize(playerToUnmuteMCP, true); - out.writeUTF("Unmute"); - out.writeUTF("Valid"); - out.writeUTF(server); - out.writeUTF(senderIdentifier); - out.writeUTF(playerToUnmute); - out.writeUTF(channelName); - sendPluginMessage(stream); - return; - } - if(identifier.equals("Valid")) { - String senderIdentifier = msgin.readUTF(); - String playerToUnmute = msgin.readUTF(); - String channelName = msgin.readUTF(); - if(!ChatChannel.isChannel(channelName)) { - return; - } - ChatChannel chatChannelObj = ChatChannel.getChannel(channelName); - if(senderIdentifier.equals("VentureChat:Console")) { - Bukkit.getConsoleSender().sendMessage(LocalizedMessage.UNMUTE_PLAYER_SENDER.toString() - .replace("{player}", playerToUnmute) - .replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName())); - } - else { - UUID sender = UUID.fromString(senderIdentifier); - MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); - senderMCP.getPlayer().sendMessage(LocalizedMessage.UNMUTE_PLAYER_SENDER.toString() - .replace("{player}", playerToUnmute) - .replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName())); - } - return; - } - if(identifier.equals("Offline")) { - String senderIdentifier = msgin.readUTF(); - String playerToUnmute = msgin.readUTF(); - if(senderIdentifier.equals("VentureChat:Console")) { - Bukkit.getConsoleSender().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() - .replace("{args}", playerToUnmute)); - return; - } - UUID sender = UUID.fromString(senderIdentifier); - MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); - senderMCP.getPlayer().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() - .replace("{args}", playerToUnmute)); - return; - } - if(identifier.equals("NotMuted")) { - String senderIdentifier = msgin.readUTF(); - String playerToUnmute = msgin.readUTF(); - String channelName = msgin.readUTF(); - if(!ChatChannel.isChannel(channelName)) { - return; - } - ChatChannel chatChannelObj = ChatChannel.getChannel(channelName); - if(senderIdentifier.equals("VentureChat:Console")) { - Bukkit.getConsoleSender().sendMessage(LocalizedMessage.PLAYER_NOT_MUTED.toString() - .replace("{player}", playerToUnmute).replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName())); - return; - } - UUID sender = UUID.fromString(senderIdentifier); - MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); - senderMCP.getPlayer().sendMessage(LocalizedMessage.PLAYER_NOT_MUTED.toString() - .replace("{player}", playerToUnmute).replace("{channel_color}", chatChannelObj.getColor()) - .replace("{channel_name}", chatChannelObj.getName())); - return; - } - } - if(subchannel.equals("Message")) { - String identifier = msgin.readUTF(); - if(identifier.equals("Send")) { - String server = msgin.readUTF(); - String receiver = msgin.readUTF(); - MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(receiver); - UUID sender = UUID.fromString(msgin.readUTF()); - String sName = msgin.readUTF(); - String send = msgin.readUTF(); - String echo = msgin.readUTF(); - String spy = msgin.readUTF(); - String msg = msgin.readUTF(); - if(!getConfig().getBoolean("bungeecordmessaging", true) || p == null) { - out.writeUTF("Message"); - out.writeUTF("Offline"); - out.writeUTF(server); - out.writeUTF(receiver); - out.writeUTF(sender.toString()); - sendPluginMessage(stream); - return; - } - if(p.getIgnores().contains(sender)) { - out.writeUTF("Message"); - out.writeUTF("Ignore"); - out.writeUTF(server); - out.writeUTF(receiver); - out.writeUTF(sender.toString()); - sendPluginMessage(stream); - return; - } - if(!p.getMessageToggle()) { - out.writeUTF("Message"); - out.writeUTF("Blocked"); - out.writeUTF(server); - out.writeUTF(receiver); - out.writeUTF(sender.toString()); - sendPluginMessage(stream); - return; - } - p.getPlayer().sendMessage(Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(p.getPlayer(), send.replaceAll("receiver_", ""))) + msg); - if(p.hasNotifications()) { - Format.playMessageSound(p); - } - if(MineverseChatAPI.getMineverseChatPlayer(sender) == null) { - MineverseChatPlayer senderMCP = new MineverseChatPlayer(sender, sName); - MineverseChatAPI.addMineverseChatPlayerToMap(senderMCP); - MineverseChatAPI.addNameToMap(senderMCP); - } - p.setReplyPlayer(sender); - out.writeUTF("Message"); - out.writeUTF("Echo"); - out.writeUTF(server); - out.writeUTF(receiver); - out.writeUTF(p.getUUID().toString()); - out.writeUTF(sender.toString()); - out.writeUTF(sName); - out.writeUTF(Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(p.getPlayer(), echo.replaceAll("receiver_", ""))) + msg); - out.writeUTF(Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(p.getPlayer(), spy.replaceAll("receiver_", ""))) + msg); - sendPluginMessage(stream); - return; - } - if(identifier.equals("Offline")) { - String receiver = msgin.readUTF(); - UUID sender = UUID.fromString(msgin.readUTF()); - MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); - p.getPlayer().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() - .replace("{args}", receiver)); - p.setReplyPlayer(null); - } - if(identifier.equals("Ignore")) { - String receiver = msgin.readUTF(); - UUID sender = UUID.fromString(msgin.readUTF()); - MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); - p.getPlayer().sendMessage(LocalizedMessage.IGNORING_MESSAGE.toString() - .replace("{player}", receiver)); - } - if(identifier.equals("Blocked")) { - String receiver = msgin.readUTF(); - UUID sender = UUID.fromString(msgin.readUTF()); - MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); - p.getPlayer().sendMessage(LocalizedMessage.BLOCKING_MESSAGE.toString() - .replace("{player}", receiver)); - } - if(identifier.equals("Echo")) { - String receiverName = msgin.readUTF(); - UUID receiverUUID = UUID.fromString(msgin.readUTF()); - UUID senderUUID = UUID.fromString(msgin.readUTF()); - MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(senderUUID); - String echo = msgin.readUTF(); - if(MineverseChatAPI.getMineverseChatPlayer(receiverUUID) == null) { - MineverseChatPlayer receiverMCP = new MineverseChatPlayer(receiverUUID, receiverName); - MineverseChatAPI.addMineverseChatPlayerToMap(receiverMCP); - MineverseChatAPI.addNameToMap(receiverMCP); - } - senderMCP.setReplyPlayer(receiverUUID); - senderMCP.getPlayer().sendMessage(echo); - } - if(identifier.equals("Spy")) { - String receiverName = msgin.readUTF(); - String senderName = msgin.readUTF(); - String spy = msgin.readUTF(); - if(!spy.startsWith("VentureChat:NoSpy")) { - for(MineverseChatPlayer pl : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - if(pl.isSpy() && !pl.getName().equals(senderName) && !pl.getName().equals(receiverName)) { - pl.getPlayer().sendMessage(spy); - } - } - } - } - } - } - catch(Exception e) { - e.printStackTrace(); - } - } -} +package mineverse.Aust1n46.chat; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.RegisteredServiceProvider; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.messaging.PluginMessageListener; +import org.bukkit.scheduler.BukkitScheduler; + +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.PacketContainer; + +import me.clip.placeholderapi.PlaceholderAPI; +import mineverse.Aust1n46.chat.alias.Alias; +import mineverse.Aust1n46.chat.api.MineverseChatAPI; +import mineverse.Aust1n46.chat.api.MineverseChatPlayer; +import mineverse.Aust1n46.chat.api.events.VentureChatEvent; +import mineverse.Aust1n46.chat.channel.ChatChannel; +import mineverse.Aust1n46.chat.channel.ChatChannelInfo; +import mineverse.Aust1n46.chat.command.VentureCommandExecutor; +import mineverse.Aust1n46.chat.command.chat.Channel; +import mineverse.Aust1n46.chat.command.mute.MuteContainer; +import mineverse.Aust1n46.chat.database.Database; +import mineverse.Aust1n46.chat.database.PlayerData; +import mineverse.Aust1n46.chat.gui.GuiSlot; +import mineverse.Aust1n46.chat.json.JsonFormat; +import mineverse.Aust1n46.chat.listeners.ChatListener; +import mineverse.Aust1n46.chat.listeners.CommandListener; +import mineverse.Aust1n46.chat.listeners.LoginListener; +import mineverse.Aust1n46.chat.listeners.PacketListener; +import mineverse.Aust1n46.chat.listeners.SignListener; +import mineverse.Aust1n46.chat.localization.Localization; +import mineverse.Aust1n46.chat.localization.LocalizedMessage; +import mineverse.Aust1n46.chat.utilities.Format; +import net.milkbowl.vault.chat.Chat; +import net.milkbowl.vault.permission.Permission; + +/** + * VentureChat Minecraft plugin for servers running Spigot or Paper software. + * + * @author Aust1n46 + */ +public class MineverseChat extends JavaPlugin implements PluginMessageListener { + // Plugin Messaging Channel + public static final String PLUGIN_MESSAGING_CHANNEL = "venturechat:data"; + + // Event constants + public static final boolean ASYNC = true; + public static final boolean SYNC = false; + + public static final int LINE_LENGTH = 40; + + // DiscordSRV backwards compatibility + @Deprecated + public static ChatChannelInfo ccInfo; + + @Deprecated + public static Set players = new HashSet(); + @Deprecated + public static Set onlinePlayers = new HashSet(); + + // Vault + private static Permission permission = null; + private static Chat chat = null; + + @Override + public void onEnable() { + ccInfo = new ChatChannelInfo(); + + try { + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Initializing...")); + if(!getDataFolder().exists()) { + getDataFolder().mkdirs(); + } + File file = new File(getDataFolder(), "config.yml"); + if(!file.exists()) { + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Config not found! Generating file.")); + saveDefaultConfig(); + } + else { + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Config found! Loading file.")); + } + + saveResource("example_config_always_up_to_date!.yml", true); + } + catch(Exception ex) { + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - &cCould not load configuration! Something unexpected went wrong!")); + } + + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Checking for Vault...")); + + if(!setupPermissions() || !setupChat()) { + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - &cCould not find Vault and/or a Vault compatible permissions plugin!")); + Bukkit.getPluginManager().disablePlugin(this); + } + + initializeConfigReaders(); + + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Loading player data")); + PlayerData.loadLegacyPlayerData(); + PlayerData.loadPlayerData(); + + Bukkit.getScheduler().runTaskAsynchronously(this, () -> { + Database.initializeMySQL(); + }); + + VentureCommandExecutor.initialize(); + + registerListeners(); + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Registering Listeners")); + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Attaching to Executors")); + + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Establishing BungeeCord")); + Bukkit.getMessenger().registerOutgoingPluginChannel(this, PLUGIN_MESSAGING_CHANNEL); + Bukkit.getMessenger().registerIncomingPluginChannel(this, PLUGIN_MESSAGING_CHANNEL, this); + + PluginManager pluginManager = getServer().getPluginManager(); + if(pluginManager.isPluginEnabled("Towny")) { + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Enabling Towny Formatting")); + } + if(pluginManager.isPluginEnabled("Jobs")) { + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Enabling Jobs Formatting")); + } + if(pluginManager.isPluginEnabled("Factions")) { + String version = pluginManager.getPlugin("Factions").getDescription().getVersion(); + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Enabling Factions Formatting version " + version)); + } + if(pluginManager.isPluginEnabled("PlaceholderAPI")) { + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Enabling PlaceholderAPI Hook")); + } + + new VentureChatPlaceholders().register(); + + startRepeatingTasks(); + + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Enabled Successfully")); + } + + @Override + public void onDisable() { + PlayerData.savePlayerData(); + MineverseChatAPI.clearMineverseChatPlayerMap(); + MineverseChatAPI.clearNameMap(); + MineverseChatAPI.clearOnlineMineverseChatPlayerMap(); + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Disabling...")); + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Disabled Successfully")); + } + + private void startRepeatingTasks() { + BukkitScheduler scheduler = Bukkit.getServer().getScheduler(); + scheduler.runTaskTimerAsynchronously(this, new Runnable() { + @Override + public void run() { + PlayerData.savePlayerData(); + if(getConfig().getString("loglevel", "info").equals("debug")) { + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Saving Player Data")); + } + } + }, 0L, getConfig().getInt("saveinterval") * 1200); //one minute * save interval + + scheduler.runTaskTimerAsynchronously(this, new Runnable() { + @Override + public void run() { + for (MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { + long currentTimeMillis = System.currentTimeMillis(); + Iterator iterator = p.getMutes().iterator(); + while (iterator.hasNext()) { + MuteContainer mute = iterator.next(); + if(ChatChannel.isChannel(mute.getChannel())) { + ChatChannel channel = ChatChannel.getChannel(mute.getChannel()); + long timemark = mute.getDuration(); + if (timemark == 0) { + continue; + } + if (getConfig().getString("loglevel", "info").equals("debug")) { + System.out.println(currentTimeMillis + " " + timemark); + } + if (currentTimeMillis >= timemark) { + iterator.remove(); + p.getPlayer().sendMessage(LocalizedMessage.UNMUTE_PLAYER_PLAYER.toString() + .replace("{player}", p.getName()).replace("{channel_color}", channel.getColor()) + .replace("{channel_name}", mute.getChannel())); + if(channel.getBungee()) { + synchronize(p, true); + } + } + } + } + } + if (getConfig().getString("loglevel", "info").equals("debug")) { + Bukkit.getConsoleSender() + .sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Updating Player Mutes")); + } + } + }, 0L, 60L); // three second interval + } + + private void registerListeners() { + PluginManager pluginManager = getServer().getPluginManager(); + pluginManager.registerEvents(new Channel(), this); + pluginManager.registerEvents(new ChatListener(), this); + pluginManager.registerEvents(new SignListener(), this); + pluginManager.registerEvents(new CommandListener(), this); + pluginManager.registerEvents(new LoginListener(), this); + ProtocolLibrary.getProtocolManager().addPacketListener(new PacketListener()); + } + + private boolean setupPermissions() { + RegisteredServiceProvider permissionProvider = getServer().getServicesManager().getRegistration(net.milkbowl.vault.permission.Permission.class); + if(permissionProvider != null) { + permission = permissionProvider.getProvider(); + } + 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); + } + + public static MineverseChat getInstance() { + return getPlugin(MineverseChat.class); + } + + public static void initializeConfigReaders() { + Localization.initialize(); + Alias.initialize(); + JsonFormat.initialize(); + GuiSlot.initialize(); + ChatChannel.initialize(false); + } + + public static Chat getVaultChat() { + return chat; + } + + public static Permission getVaultPermission() { + return permission; + } + + public static void synchronize(MineverseChatPlayer mcp, boolean changes) { + // System.out.println("Sync started..."); + ByteArrayOutputStream outstream = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(outstream); + try { + out.writeUTF("Sync"); + if(!changes) { + out.writeUTF("Receive"); + // System.out.println(mcp.getPlayer().getServer().getServerName()); + // out.writeUTF(mcp.getPlayer().getServer().getServerName()); + out.writeUTF(mcp.getUUID().toString()); + Bukkit.getServer().getScheduler().runTaskLaterAsynchronously(getInstance(), new Runnable() { + @Override + public void run() { + if(!mcp.isOnline() || mcp.hasPlayed()) { + return; + } + synchronize(mcp, false); + } + }, 20L); // one second delay before running again + } + else { + out.writeUTF("Update"); + out.writeUTF(mcp.getUUID().toString()); + // out.writeUTF("Channels"); + int channelCount = 0; + for(String c : mcp.getListening()) { + ChatChannel channel = ChatChannel.getChannel(c); + if(channel.getBungee()) { + channelCount++; + } + } + out.write(channelCount); + for(String c : mcp.getListening()) { + ChatChannel channel = ChatChannel.getChannel(c); + if(channel.getBungee()) { + out.writeUTF(channel.getName()); + } + } + // out.writeUTF("Mutes"); + int muteCount = 0; + for(MuteContainer mute : mcp.getMutes()) { + ChatChannel channel = ChatChannel.getChannel(mute.getChannel()); + if(channel.getBungee()) { + muteCount++; + } + } + // System.out.println(muteCount + " mutes"); + out.write(muteCount); + for(MuteContainer mute : mcp.getMutes()) { + ChatChannel channel = ChatChannel.getChannel(mute.getChannel()); + if(channel.getBungee()) { + out.writeUTF(channel.getName()); + out.writeLong(mute.getDuration()); + out.writeUTF(mute.getReason()); + } + } + int ignoreCount = 0; + for(@SuppressWarnings("unused") + UUID c : mcp.getIgnores()) { + ignoreCount++; + } + out.write(ignoreCount); + for(UUID c : mcp.getIgnores()) { + out.writeUTF(c.toString()); + } + out.writeBoolean(mcp.isSpy()); + out.writeBoolean(mcp.getMessageToggle()); + } + sendPluginMessage(outstream); + // System.out.println("Sync start bottom..."); + out.close(); + } + catch(IOException e) { + e.printStackTrace(); + } + } + + public static void sendPluginMessage(ByteArrayOutputStream byteOutStream) { + if(MineverseChatAPI.getOnlineMineverseChatPlayers().size() > 0) { + MineverseChatAPI.getOnlineMineverseChatPlayers().iterator().next().getPlayer().sendPluginMessage(getInstance(), PLUGIN_MESSAGING_CHANNEL, byteOutStream.toByteArray()); + } + } + + public static void sendDiscordSRVPluginMessage(String chatChannel, String message) { + if(MineverseChatAPI.getOnlineMineverseChatPlayers().size() == 0) { + return; + } + ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(byteOutStream); + try { + out.writeUTF("DiscordSRV"); + out.writeUTF(chatChannel); + out.writeUTF(message); + sendPluginMessage(byteOutStream); + out.close(); + } + catch(Exception e) { + e.printStackTrace(); + } + } + + @Override + public void onPluginMessageReceived(String channel, Player player, byte[] inputStream) { + if(!channel.equals(PLUGIN_MESSAGING_CHANNEL)) { + return; + } + try { + DataInputStream msgin = new DataInputStream(new ByteArrayInputStream(inputStream)); + if(getConfig().getString("loglevel", "info").equals("debug")) { + System.out.println(msgin.available() + " size on receiving end"); + } + String subchannel = msgin.readUTF(); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(stream); + if(subchannel.equals("Chat")) { + String server = msgin.readUTF(); + String chatchannel = msgin.readUTF(); + String senderName = msgin.readUTF(); + UUID senderUUID = UUID.fromString(msgin.readUTF()); + int hash = msgin.readInt(); + String format = msgin.readUTF(); + String chat = msgin.readUTF(); + String consoleChat = format + chat; + String globalJSON = msgin.readUTF(); + String primaryGroup = msgin.readUTF(); + String nickname = msgin.readUTF(); + + if(!ChatChannel.isChannel(chatchannel)) { + return; + } + ChatChannel chatChannelObject = ChatChannel.getChannel(chatchannel); + + if(!chatChannelObject.getBungee()) { + return; + } + + Set recipients = new HashSet(); + for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { + if(p.isListening(chatChannelObject.getName())) { + recipients.add(p.getPlayer()); + } + } + + Bukkit.getServer().getScheduler().runTaskAsynchronously(this, new Runnable() { + @Override + public void run() { + //Create VentureChatEvent + VentureChatEvent ventureChatEvent = new VentureChatEvent(null, senderName, nickname, primaryGroup, chatChannelObject, recipients, recipients.size(), format, chat, globalJSON, hash, false); + //Fire event and wait for other plugin listeners to act on it + Bukkit.getServer().getPluginManager().callEvent(ventureChatEvent); + } + }); + + Bukkit.getConsoleSender().sendMessage(consoleChat); + + if(Database.isEnabled()) { + Database.writeVentureChat(senderUUID.toString(), senderName, server, chatchannel, chat.replace("'", "''"), "Chat"); + } + + for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { + if(p.isListening(chatChannelObject.getName())) { + if(!p.getBungeeToggle() && MineverseChatAPI.getOnlineMineverseChatPlayer(senderName) == null) { + continue; + } + + String json = Format.formatModerationGUI(globalJSON, p.getPlayer(), senderName, chatchannel, hash); + PacketContainer packet = Format.createPacketPlayOutChat(json); + + if(getConfig().getBoolean("ignorechat", false)) { + if(!p.getIgnores().contains(senderUUID)) { + // System.out.println("Chat sent"); + Format.sendPacketPlayOutChat(p.getPlayer(), packet); + } + continue; + } + Format.sendPacketPlayOutChat(p.getPlayer(), packet); + } + } + } + if(subchannel.equals("DiscordSRV")) { + String chatChannel = msgin.readUTF(); + String message = msgin.readUTF(); + if(!ChatChannel.isChannel(chatChannel)) { + return; + } + ChatChannel chatChannelObj = ChatChannel.getChannel(chatChannel); + if(!chatChannelObj.getBungee()) { + return; + } + + String json = Format.convertPlainTextToJson(message, true); + int hash = (message.replaceAll("([�]([a-z0-9]))", "")).hashCode(); + + for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { + if(p.isListening(chatChannelObj.getName())) { + String finalJSON = Format.formatModerationGUI(json, p.getPlayer(), "Discord", chatChannelObj.getName(), hash); + PacketContainer packet = Format.createPacketPlayOutChat(finalJSON); + Format.sendPacketPlayOutChat(p.getPlayer(), packet); + } + } + } + if(subchannel.equals("PlayerNames")) { + MineverseChatAPI.clearNetworkPlayerNames(); + int playerCount = msgin.readInt(); + for(int a = 0; a < playerCount; a ++) { + MineverseChatAPI.addNetworkPlayerName(msgin.readUTF()); + } + } + if(subchannel.equals("Chwho")) { + String identifier = msgin.readUTF(); + if(identifier.equals("Get")) { + String sender = msgin.readUTF(); + String name = msgin.readUTF(); + String chatchannel = msgin.readUTF(); + List listening = new ArrayList(); + if(ChatChannel.isChannel(chatchannel)) { + for(MineverseChatPlayer mcp : MineverseChatAPI.getOnlineMineverseChatPlayers()) { + if(mcp.isListening(chatchannel)) { + String entry = "&f" + mcp.getName(); + if(mcp.isMuted(chatchannel)) { + entry = "&c" + mcp.getName(); + } + listening.add(entry); + } + } + } + out.writeUTF("Chwho"); + out.writeUTF("Receive"); + out.writeUTF(sender); + out.writeUTF(name); + out.writeUTF(chatchannel); + out.writeInt(listening.size()); + for(String s : listening) { + out.writeUTF(s); + } + sendPluginMessage(stream); + } + if(identifier.equals("Receive")) { + String sender = msgin.readUTF(); + String stringchannel = msgin.readUTF(); + MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(UUID.fromString(sender)); + ChatChannel chatchannel = ChatChannel.getChannel(stringchannel); + String playerList = ""; + int size = msgin.readInt(); + for(int a = 0; a < size; a++) { + playerList += msgin.readUTF() + ChatColor.WHITE + ", "; + } + if(playerList.length() > 2) { + playerList = playerList.substring(0, playerList.length() - 2); + } + mcp.getPlayer().sendMessage(LocalizedMessage.CHANNEL_PLAYER_LIST_HEADER.toString() + .replace("{channel_color}", chatchannel.getColor().toString()) + .replace("{channel_name}", chatchannel.getName())); + mcp.getPlayer().sendMessage(Format.FormatStringAll(playerList)); + } + } + if(subchannel.equals("RemoveMessage")) { + String hash = msgin.readUTF(); + getServer().dispatchCommand(this.getServer().getConsoleSender(), "removemessage " + hash); + } + if(subchannel.equals("Sync")) { + if(getConfig().getString("loglevel", "info").equals("debug")) { + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Received update...")); + } + String uuid = msgin.readUTF(); + MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(UUID.fromString(uuid)); + if(p == null || p.hasPlayed()) { + return; + } + for(Object ch : p.getListening().toArray()) { + String c = ch.toString(); + ChatChannel cha = ChatChannel.getChannel(c); + if(cha.getBungee()) { + p.removeListening(c); + } + } + int size = msgin.read(); + for(int a = 0; a < size; a++) { + String ch = msgin.readUTF(); + if(ChatChannel.isChannel(ch)) { + ChatChannel cha = ChatChannel.getChannel(ch); + if(!cha.hasPermission() || p.getPlayer().hasPermission(cha.getPermission())) { + p.addListening(ch); + } + } + } + p.getMutes().removeIf(mute -> ChatChannel.getChannel(mute.getChannel()).getBungee()); + int sizeB = msgin.read(); + // System.out.println(sizeB + " mute size"); + for(int b = 0; b < sizeB; b++) { + String ch = msgin.readUTF(); + long muteTime = msgin.readLong(); + String muteReason = msgin.readUTF(); + // System.out.println(ch); + if(ChatChannel.isChannel(ch)) { + p.addMute(ch, muteTime, muteReason); + } + } + // System.out.println(msgin.available() + " available before"); + p.setSpy(msgin.readBoolean()); + p.setMessageToggle(msgin.readBoolean()); + // System.out.println(msgin.available() + " available after"); + for(Object o : p.getIgnores().toArray()) { + p.removeIgnore((UUID) o); + } + int sizeC = msgin.read(); + // System.out.println(sizeC + " ignore size"); + for(int c = 0; c < sizeC; c++) { + String i = msgin.readUTF(); + // System.out.println(i); + p.addIgnore(UUID.fromString(i)); + } + if(!p.hasPlayed()) { + boolean isThereABungeeChannel = false; + for(ChatChannel ch : ChatChannel.getAutojoinList()) { + if((!ch.hasPermission() || p.getPlayer().hasPermission(ch.getPermission())) && !p.isListening(ch.getName())) { + p.addListening(ch.getName()); + if(ch.getBungee()) { + isThereABungeeChannel = true; + } + } + } + p.setHasPlayed(true); + // Only run a sync update if the player joined a BungeeCord channel + if(isThereABungeeChannel) { + synchronize(p, true); + } + } + } + if(subchannel.equals("Ignore")) { + String identifier = msgin.readUTF(); + if(identifier.equals("Send")) { + String server = msgin.readUTF(); + String receiver = msgin.readUTF(); + MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(receiver); + UUID sender = UUID.fromString(msgin.readUTF()); + if(!getConfig().getBoolean("bungeecordmessaging", true) || p == null || !p.isOnline()) { + out.writeUTF("Ignore"); + out.writeUTF("Offline"); + out.writeUTF(server); + out.writeUTF(receiver); + out.writeUTF(sender.toString()); + sendPluginMessage(stream); + return; + } + out.writeUTF("Ignore"); + out.writeUTF("Echo"); + out.writeUTF(server); + out.writeUTF(p.getUUID().toString()); + out.writeUTF(receiver); + out.writeUTF(sender.toString()); + sendPluginMessage(stream); + return; + } + if(identifier.equals("Offline")) { + String receiver = msgin.readUTF(); + UUID sender = UUID.fromString(msgin.readUTF()); + MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); + p.getPlayer().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() + .replace("{args}", receiver)); + } + if(identifier.equals("Echo")) { + UUID receiver = UUID.fromString(msgin.readUTF()); + String receiverName = msgin.readUTF(); + UUID sender = UUID.fromString(msgin.readUTF()); + MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); + + if(p.getIgnores().contains(receiver)) { + p.getPlayer().sendMessage(LocalizedMessage.IGNORE_PLAYER_OFF.toString() + .replace("{player}", receiverName)); + p.removeIgnore(receiver); + synchronize(p, true); + return; + } + + p.addIgnore(receiver); + p.getPlayer().sendMessage(LocalizedMessage.IGNORE_PLAYER_ON.toString() + .replace("{player}", receiverName)); + synchronize(p, true); + } + } + if(subchannel.equals("Mute")) { + String identifier = msgin.readUTF(); + if(identifier.equals("Send")) { + String server = msgin.readUTF(); + String senderIdentifier = msgin.readUTF(); + String temporaryDataInstanceUUIDString = msgin.readUTF(); + String playerToMute = msgin.readUTF(); + String channelName = msgin.readUTF(); + long time = msgin.readLong(); + String reason = msgin.readUTF(); + MineverseChatPlayer playerToMuteMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(playerToMute); + if(playerToMuteMCP == null) { + out.writeUTF("Mute"); + out.writeUTF("Offline"); + out.writeUTF(server); + out.writeUTF(temporaryDataInstanceUUIDString); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToMute); + sendPluginMessage(stream); + return; + } + if(!ChatChannel.isChannel(channelName)) { + return; + } + ChatChannel chatChannelObj = ChatChannel.getChannel(channelName); + if (playerToMuteMCP.isMuted(chatChannelObj.getName())) { + out.writeUTF("Mute"); + out.writeUTF("AlreadyMuted"); + out.writeUTF(server); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToMute); + out.writeUTF(channelName); + sendPluginMessage(stream); + return; + } + if(time > 0) { + long datetime = System.currentTimeMillis(); + if(reason.isEmpty()) { + playerToMuteMCP.addMute(chatChannelObj.getName(), datetime + time); + String timeString = Format.parseTimeStringFromMillis(time); + playerToMuteMCP.getPlayer() + .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_TIME.toString() + .replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName()) + .replace("{time}", timeString)); + } + else { + playerToMuteMCP.addMute(chatChannelObj.getName(), datetime + time, reason); + String timeString = Format.parseTimeStringFromMillis(time); + playerToMuteMCP.getPlayer() + .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_TIME_REASON.toString() + .replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName()) + .replace("{time}", timeString) + .replace("{reason}", reason)); + } + } + else { + if(reason.isEmpty()) { + playerToMuteMCP.addMute(chatChannelObj.getName()); + playerToMuteMCP.getPlayer() + .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER.toString() + .replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName())); + } + else { + playerToMuteMCP.addMute(chatChannelObj.getName(), reason); + playerToMuteMCP.getPlayer() + .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_REASON.toString() + .replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName()) + .replace("{reason}", reason)); + } + } + synchronize(playerToMuteMCP, true); + out.writeUTF("Mute"); + out.writeUTF("Valid"); + out.writeUTF(server); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToMute); + out.writeUTF(channelName); + out.writeLong(time); + out.writeUTF(reason); + sendPluginMessage(stream); + return; + } + if(identifier.equals("Valid")) { + String senderIdentifier = msgin.readUTF(); + String playerToMute = msgin.readUTF(); + String channelName = msgin.readUTF(); + long time = msgin.readLong(); + String reason = msgin.readUTF(); + if(!ChatChannel.isChannel(channelName)) { + return; + } + ChatChannel chatChannelObj = ChatChannel.getChannel(channelName); + if(time > 0) { + String timeString = Format.parseTimeStringFromMillis(time); + if(reason.isEmpty()) { + if(senderIdentifier.equals("VentureChat:Console")) { + Bukkit.getConsoleSender().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_TIME.toString() + .replace("{player}", playerToMute) + .replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName()) + .replace("{time}", timeString)); + } + else { + UUID sender = UUID.fromString(senderIdentifier); + MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); + senderMCP.getPlayer().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_TIME.toString() + .replace("{player}", playerToMute) + .replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName()) + .replace("{time}", timeString)); + } + } + else { + if(senderIdentifier.equals("VentureChat:Console")) { + Bukkit.getConsoleSender().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_TIME_REASON.toString() + .replace("{player}", playerToMute) + .replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName()) + .replace("{time}", timeString) + .replace("{reason}", reason)); + } + else { + UUID sender = UUID.fromString(senderIdentifier); + MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); + senderMCP.getPlayer().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_TIME_REASON.toString() + .replace("{player}", playerToMute) + .replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName()) + .replace("{time}", timeString) + .replace("{reason}", reason)); + } + } + } + else { + if(reason.isEmpty()) { + if(senderIdentifier.equals("VentureChat:Console")) { + Bukkit.getConsoleSender().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER.toString() + .replace("{player}", playerToMute) + .replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName())); + } + else { + UUID sender = UUID.fromString(senderIdentifier); + MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); + senderMCP.getPlayer().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER.toString() + .replace("{player}", playerToMute) + .replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName())); + } + } + else { + if(senderIdentifier.equals("VentureChat:Console")) { + Bukkit.getConsoleSender().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_REASON.toString() + .replace("{player}", playerToMute) + .replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName()) + .replace("{reason}", reason)); + } + else { + UUID sender = UUID.fromString(senderIdentifier); + MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); + senderMCP.getPlayer().sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_REASON.toString() + .replace("{player}", playerToMute) + .replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName()) + .replace("{reason}", reason)); + } + } + } + return; + } + if(identifier.equals("Offline")) { + String senderIdentifier = msgin.readUTF(); + String playerToMute = msgin.readUTF(); + if(senderIdentifier.equals("VentureChat:Console")) { + Bukkit.getConsoleSender().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() + .replace("{args}", playerToMute)); + return; + } + UUID sender = UUID.fromString(senderIdentifier); + MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); + senderMCP.getPlayer().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() + .replace("{args}", playerToMute)); + return; + } + if(identifier.equals("AlreadyMuted")) { + String senderIdentifier = msgin.readUTF(); + String playerToMute = msgin.readUTF(); + String channelName = msgin.readUTF(); + if(!ChatChannel.isChannel(channelName)) { + return; + } + ChatChannel chatChannelObj = ChatChannel.getChannel(channelName); + if(senderIdentifier.equals("VentureChat:Console")) { + Bukkit.getConsoleSender().sendMessage(LocalizedMessage.PLAYER_ALREADY_MUTED.toString() + .replace("{player}", playerToMute).replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName())); + return; + } + UUID sender = UUID.fromString(senderIdentifier); + MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); + senderMCP.getPlayer().sendMessage(LocalizedMessage.PLAYER_ALREADY_MUTED.toString() + .replace("{player}", playerToMute).replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName())); + return; + } + } + if(subchannel.equals("Unmute")) { + String identifier = msgin.readUTF(); + if(identifier.equals("Send")) { + String server = msgin.readUTF(); + String senderIdentifier = msgin.readUTF(); + String temporaryDataInstanceUUIDString = msgin.readUTF(); + String playerToUnmute = msgin.readUTF(); + String channelName = msgin.readUTF(); + MineverseChatPlayer playerToUnmuteMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(playerToUnmute); + if(playerToUnmuteMCP == null) { + out.writeUTF("Unmute"); + out.writeUTF("Offline"); + out.writeUTF(server); + out.writeUTF(temporaryDataInstanceUUIDString); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToUnmute); + sendPluginMessage(stream); + return; + } + if(!ChatChannel.isChannel(channelName)) { + return; + } + ChatChannel chatChannelObj = ChatChannel.getChannel(channelName); + if (!playerToUnmuteMCP.isMuted(chatChannelObj.getName())) { + out.writeUTF("Unmute"); + out.writeUTF("NotMuted"); + out.writeUTF(server); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToUnmute); + out.writeUTF(channelName); + sendPluginMessage(stream); + return; + } + playerToUnmuteMCP.removeMute(chatChannelObj.getName()); + playerToUnmuteMCP.getPlayer().sendMessage(LocalizedMessage.UNMUTE_PLAYER_PLAYER.toString() + .replace("{player}", player.getName()).replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName())); + synchronize(playerToUnmuteMCP, true); + out.writeUTF("Unmute"); + out.writeUTF("Valid"); + out.writeUTF(server); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToUnmute); + out.writeUTF(channelName); + sendPluginMessage(stream); + return; + } + if(identifier.equals("Valid")) { + String senderIdentifier = msgin.readUTF(); + String playerToUnmute = msgin.readUTF(); + String channelName = msgin.readUTF(); + if(!ChatChannel.isChannel(channelName)) { + return; + } + ChatChannel chatChannelObj = ChatChannel.getChannel(channelName); + if(senderIdentifier.equals("VentureChat:Console")) { + Bukkit.getConsoleSender().sendMessage(LocalizedMessage.UNMUTE_PLAYER_SENDER.toString() + .replace("{player}", playerToUnmute) + .replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName())); + } + else { + UUID sender = UUID.fromString(senderIdentifier); + MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); + senderMCP.getPlayer().sendMessage(LocalizedMessage.UNMUTE_PLAYER_SENDER.toString() + .replace("{player}", playerToUnmute) + .replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName())); + } + return; + } + if(identifier.equals("Offline")) { + String senderIdentifier = msgin.readUTF(); + String playerToUnmute = msgin.readUTF(); + if(senderIdentifier.equals("VentureChat:Console")) { + Bukkit.getConsoleSender().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() + .replace("{args}", playerToUnmute)); + return; + } + UUID sender = UUID.fromString(senderIdentifier); + MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); + senderMCP.getPlayer().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() + .replace("{args}", playerToUnmute)); + return; + } + if(identifier.equals("NotMuted")) { + String senderIdentifier = msgin.readUTF(); + String playerToUnmute = msgin.readUTF(); + String channelName = msgin.readUTF(); + if(!ChatChannel.isChannel(channelName)) { + return; + } + ChatChannel chatChannelObj = ChatChannel.getChannel(channelName); + if(senderIdentifier.equals("VentureChat:Console")) { + Bukkit.getConsoleSender().sendMessage(LocalizedMessage.PLAYER_NOT_MUTED.toString() + .replace("{player}", playerToUnmute).replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName())); + return; + } + UUID sender = UUID.fromString(senderIdentifier); + MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); + senderMCP.getPlayer().sendMessage(LocalizedMessage.PLAYER_NOT_MUTED.toString() + .replace("{player}", playerToUnmute).replace("{channel_color}", chatChannelObj.getColor()) + .replace("{channel_name}", chatChannelObj.getName())); + return; + } + } + if(subchannel.equals("Message")) { + String identifier = msgin.readUTF(); + if(identifier.equals("Send")) { + String server = msgin.readUTF(); + String receiver = msgin.readUTF(); + MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(receiver); + UUID sender = UUID.fromString(msgin.readUTF()); + String sName = msgin.readUTF(); + String send = msgin.readUTF(); + String echo = msgin.readUTF(); + String spy = msgin.readUTF(); + String msg = msgin.readUTF(); + if(!getConfig().getBoolean("bungeecordmessaging", true) || p == null) { + out.writeUTF("Message"); + out.writeUTF("Offline"); + out.writeUTF(server); + out.writeUTF(receiver); + out.writeUTF(sender.toString()); + sendPluginMessage(stream); + return; + } + if(p.getIgnores().contains(sender)) { + out.writeUTF("Message"); + out.writeUTF("Ignore"); + out.writeUTF(server); + out.writeUTF(receiver); + out.writeUTF(sender.toString()); + sendPluginMessage(stream); + return; + } + if(!p.getMessageToggle()) { + out.writeUTF("Message"); + out.writeUTF("Blocked"); + out.writeUTF(server); + out.writeUTF(receiver); + out.writeUTF(sender.toString()); + sendPluginMessage(stream); + return; + } + p.getPlayer().sendMessage(Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(p.getPlayer(), send.replaceAll("receiver_", ""))) + msg); + if(p.hasNotifications()) { + Format.playMessageSound(p); + } + if(MineverseChatAPI.getMineverseChatPlayer(sender) == null) { + MineverseChatPlayer senderMCP = new MineverseChatPlayer(sender, sName); + MineverseChatAPI.addMineverseChatPlayerToMap(senderMCP); + MineverseChatAPI.addNameToMap(senderMCP); + } + p.setReplyPlayer(sender); + out.writeUTF("Message"); + out.writeUTF("Echo"); + out.writeUTF(server); + out.writeUTF(receiver); + out.writeUTF(p.getUUID().toString()); + out.writeUTF(sender.toString()); + out.writeUTF(sName); + out.writeUTF(Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(p.getPlayer(), echo.replaceAll("receiver_", ""))) + msg); + out.writeUTF(Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(p.getPlayer(), spy.replaceAll("receiver_", ""))) + msg); + sendPluginMessage(stream); + return; + } + if(identifier.equals("Offline")) { + String receiver = msgin.readUTF(); + UUID sender = UUID.fromString(msgin.readUTF()); + MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); + p.getPlayer().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() + .replace("{args}", receiver)); + p.setReplyPlayer(null); + } + if(identifier.equals("Ignore")) { + String receiver = msgin.readUTF(); + UUID sender = UUID.fromString(msgin.readUTF()); + MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); + p.getPlayer().sendMessage(LocalizedMessage.IGNORING_MESSAGE.toString() + .replace("{player}", receiver)); + } + if(identifier.equals("Blocked")) { + String receiver = msgin.readUTF(); + UUID sender = UUID.fromString(msgin.readUTF()); + MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(sender); + p.getPlayer().sendMessage(LocalizedMessage.BLOCKING_MESSAGE.toString() + .replace("{player}", receiver)); + } + if(identifier.equals("Echo")) { + String receiverName = msgin.readUTF(); + UUID receiverUUID = UUID.fromString(msgin.readUTF()); + UUID senderUUID = UUID.fromString(msgin.readUTF()); + MineverseChatPlayer senderMCP = MineverseChatAPI.getOnlineMineverseChatPlayer(senderUUID); + String echo = msgin.readUTF(); + if(MineverseChatAPI.getMineverseChatPlayer(receiverUUID) == null) { + MineverseChatPlayer receiverMCP = new MineverseChatPlayer(receiverUUID, receiverName); + MineverseChatAPI.addMineverseChatPlayerToMap(receiverMCP); + MineverseChatAPI.addNameToMap(receiverMCP); + } + senderMCP.setReplyPlayer(receiverUUID); + senderMCP.getPlayer().sendMessage(echo); + } + if(identifier.equals("Spy")) { + String receiverName = msgin.readUTF(); + String senderName = msgin.readUTF(); + String spy = msgin.readUTF(); + if(!spy.startsWith("VentureChat:NoSpy")) { + for(MineverseChatPlayer pl : MineverseChatAPI.getOnlineMineverseChatPlayers()) { + if(pl.isSpy() && !pl.getName().equals(senderName) && !pl.getName().equals(receiverName)) { + pl.getPlayer().sendMessage(spy); + } + } + } + } + } + } + catch(Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/mineverse/Aust1n46/chat/channel/ChatChannel.java b/src/main/java/mineverse/Aust1n46/chat/channel/ChatChannel.java index a52b42a..a45435a 100644 --- a/src/main/java/mineverse/Aust1n46/chat/channel/ChatChannel.java +++ b/src/main/java/mineverse/Aust1n46/chat/channel/ChatChannel.java @@ -1,454 +1,457 @@ -package mineverse.Aust1n46.chat.channel; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; - -import org.bukkit.ChatColor; -import org.bukkit.configuration.ConfigurationSection; - -import mineverse.Aust1n46.chat.MineverseChat; -import mineverse.Aust1n46.chat.utilities.Format; - -/** - * Chat channel object pojo. Class also contains static initialization methods - * for reading chat channels from the config file. - * - * @author Aust1n46 - */ -public class ChatChannel { - private static final String PERMISSION_PREFIX = "venturechat."; - private static final String NO_PERMISSIONS = "venturechat.none"; - - private static MineverseChat plugin = MineverseChat.getInstance(); - private static ChatChannel defaultChatChannel; - private static boolean aliasesRegisteredAsCommands; - - @Deprecated - private static ChatChannel[] channels; - - private static String defaultColor; - private static HashMap chatChannels; - - private String name; - private String permission; - private String speakPermission; - private boolean mutable; - private String color; - private String chatColor; - private boolean defaultChannel; - private boolean autojoin; - private String alias; - private double distance; - private boolean filter; - private boolean bungee; - private String format; - private int cooldown; - - /** - * Read chat channels from config file and initialize channel array. - */ - public static void initialize(boolean aliasesRegisteredAsCommands) { - chatChannels = new HashMap(); - ChatChannel.aliasesRegisteredAsCommands = aliasesRegisteredAsCommands; - ConfigurationSection cs = plugin.getConfig().getConfigurationSection("channels"); - int len = (cs.getKeys(false)).size(); - channels = new ChatChannel[len]; - int counter = 0; - for (String key : cs.getKeys(false)) { - String color = cs.getString(key + ".color", "white"); - String chatColor = cs.getString(key + ".chatcolor", "white"); - String name = key; - String permission = cs.getString(key + ".permissions", "None"); - String speakPermission = cs.getString(key + ".speak_permissions", "None"); - boolean mutable = cs.getBoolean(key + ".mutable", false); - boolean filter = cs.getBoolean(key + ".filter", true); - boolean bungee = cs.getBoolean(key + ".bungeecord", false); - String format = cs.getString(key + ".format", "Default"); - boolean defaultChannel = cs.getBoolean(key + ".default", false); - String alias = cs.getString(key + ".alias", "None"); - double distance = cs.getDouble(key + ".distance", (double) 0); - int cooldown = cs.getInt(key + ".cooldown", 0); - boolean autojoin = cs.getBoolean(key + ".autojoin", false); - ChatChannel chatChannel = new ChatChannel(name, color, chatColor, permission, speakPermission, mutable, - filter, defaultChannel, alias, distance, autojoin, bungee, cooldown, format); - channels[counter++] = chatChannel; - chatChannels.put(name.toLowerCase(), chatChannel); - chatChannels.put(alias.toLowerCase(), chatChannel); - if (defaultChannel) { - defaultChatChannel = chatChannel; - defaultColor = color; - } - } - } - - public static boolean areAliasesRegisteredAsCommands() { - return aliasesRegisteredAsCommands; - } - - /** - * Get array of chat channels. - * - * @return {@link ChatChannel}[] - */ - @Deprecated - public static ChatChannel[] getChannels() { - return channels; - } - - /** - * Get list of chat channels. - * - * @return {@link Collection}<{@link ChatChannel}> - */ - public static Collection getChatChannels() { - return new HashSet(chatChannels.values()); - } - - /** - * Get a chat channel by name. - * - * @param channelName name of channel to get. - * @return {@link ChatChannel} - */ - public static ChatChannel getChannel(String channelName) { - return chatChannels.get(channelName.toLowerCase()); - } - - /** - * Checks if the chat channel exists. - * - * @param channelName name of channel to check. - * @return true if channel exists, false otherwise. - */ - public static boolean isChannel(String channelName) { - return getChannel(channelName) != null; - } - - /** - * Get default chat channel color. - * - * @return {@link String} - */ - public static String getDefaultColor() { - return defaultColor; - } - - /** - * Get default chat channel. - * - * @return {@link ChatChannel} - */ - public static ChatChannel getDefaultChannel() { - return defaultChatChannel; - } - - /** - * Get list of chat channels with autojoin set to true. - * - * @return {@link List}<{@link ChatChannel}> - */ - public static List getAutojoinList() { - List joinlist = new ArrayList(); - for (ChatChannel c : channels) { - if (c.getAutojoin()) { - joinlist.add(c); - } - } - return joinlist; - } - - /** - * Parameterized constructor a {@link ChatChannel}. - * - * @param name - * @param color - * @param chatColor - * @param permission - * @param speakPermission - * @param mutable - * @param filter - * @param defaultChannel - * @param alias - * @param distance - * @param autojoin - * @param bungee - * @param cooldown - * @param format - */ - public ChatChannel(String name, String color, String chatColor, String permission, String speakPermission, - boolean mutable, boolean filter, boolean defaultChannel, String alias, double distance, boolean autojoin, - boolean bungee, int cooldown, String format) { - this.name = name; - this.color = color; - this.chatColor = chatColor; - this.permission = PERMISSION_PREFIX + permission; - this.speakPermission = PERMISSION_PREFIX + speakPermission; - this.mutable = mutable; - this.filter = filter; - this.defaultChannel = defaultChannel; - this.alias = alias; - this.distance = distance; - this.autojoin = autojoin; - this.bungee = bungee; - this.cooldown = cooldown; - this.format = format; - } - - /** - * Deprecated parameterized constructor a {@link ChatChannel}. - * - * @param name - * @param color - * @param chatColor - * @param permission - * @param speakPermission - * @param mutable - * @param filter - * @param defaultChannel - * @param alias - * @param distance - * @param autojoin - * @param bungee - * @param cooldown - * @param format - */ - @Deprecated - public ChatChannel(String name, String color, String chatColor, String permission, String speakPermission, - Boolean mutable, Boolean filter, Boolean defaultChannel, String alias, Double distance, Boolean autojoin, - Boolean bungee, int cooldown, String format) { - this.name = name; - this.color = color; - this.chatColor = chatColor; - this.permission = PERMISSION_PREFIX + permission; - this.speakPermission = PERMISSION_PREFIX + speakPermission; - this.mutable = mutable; - this.filter = filter; - this.defaultChannel = defaultChannel; - this.alias = alias; - this.distance = distance; - this.autojoin = autojoin; - this.bungee = bungee; - this.cooldown = cooldown; - this.format = format; - } - - /** - * Get the name of the chat channel. - * - * @return {@link String} - */ - public String getName() { - return name; - } - - /** - * Get the format of the chat channel. - * - * @return {@link String} - */ - public String getFormat() { - return format; - } - - /** - * Get the cooldown of the chat channel in seconds. - * - * @return int - */ - public int getCooldown() { - return cooldown; - } - - /** - * Check if the chat channel is BungeeCord enabled. - * - * @return {@link Boolean#TRUE} if the chat channel is BungeeCord enabled, - * {@link Boolean#FALSE} otherwise. - */ - public Boolean getBungee() { - return Boolean.valueOf(bungee); - } - - /** - * Get the permissions node for the chat channel. - * - * @return {@link String} - */ - public String getPermission() { - return permission; - } - - /** - * Check if autojoin is enabled for the chat channel. - * - * @return {@link Boolean#TRUE} if autojoin is enabled, {@link Boolean#FALSE} - * otherwise. - */ - public Boolean getAutojoin() { - return Boolean.valueOf(autojoin); - } - - /** - * Check if the chat channel allows muting. - * - * @return {@link Boolean#TRUE} if muting is allowed, {@link Boolean#FALSE} - * otherwise. - */ - public Boolean isMutable() { - return Boolean.valueOf(mutable); - } - - /** - * Get the formatted color of the chat channel. - * - * @return {@link String}. Returns {@link Format#DEFAULT_COLOR_CODE} if the - * color is invalid. - */ - public String getColor() { - if (Format.isValidColor(color)) { - return String.valueOf(ChatColor.valueOf(color.toUpperCase())); - } - if (Format.isValidHexColor(color)) { - return Format.convertHexColorCodeToBukkitColorCode(color); - } - return Format.DEFAULT_COLOR_CODE; - } - - /** - * Get the raw color value of the chat channel. - * - * @return {@link String} - */ - public String getColorRaw() { - return color; - } - - /** - * Get the formatted chat color of the chat channel. - * - * @return {@link String}. Returns {@link Format#DEFAULT_COLOR_CODE} if the chat - * color is invalid. - */ - public String getChatColor() { - if (chatColor.equalsIgnoreCase("None")) { - return chatColor; - } - if (Format.isValidColor(chatColor)) { - return String.valueOf(ChatColor.valueOf(chatColor.toUpperCase())); - } - if (Format.isValidHexColor(chatColor)) { - return Format.convertHexColorCodeToBukkitColorCode(chatColor); - } - return Format.DEFAULT_COLOR_CODE; - } - - /** - * Get the raw chat color value of the chat channel. - * - * @return {@link String} - */ - public String getChatColorRaw() { - return chatColor; - } - - /** - * Check if the chat channel is the default chat channel. - * - * @return {@link Boolean#TRUE} if the chat channel is the default chat channel, - * {@link Boolean#FALSE} otherwise. - */ - public Boolean isDefaultchannel() { - return Boolean.valueOf(defaultChannel); - } - - /** - * Get the alias of the chat channel. - * - * @return {@link String} - */ - public String getAlias() { - return alias; - } - - /** - * Get the distance of the chat channel in blocks. - * - * @return {@link Double} - */ - public Double getDistance() { - return Double.valueOf(distance); - } - - /** - * Checks if the chat channel has a distance set. - * - * @return {@link Boolean#TRUE} if the distance is greater than zero, - * {@link Boolean#FALSE} otherwise. - */ - public Boolean hasDistance() { - return Boolean.valueOf(distance > 0); - } - - /** - * Checks if the chat channel has a cooldown set. - * - * @return {@link Boolean#TRUE} if the cooldown is greater than zero, - * {@link Boolean#FALSE} otherwise. - */ - public Boolean hasCooldown() { - return Boolean.valueOf(cooldown > 0); - } - - /** - * Checks if the chat channel has a permission set. - * - * @return {@link Boolean#TRUE} if the permission does not equal - * {@link ChatChannel#NO_PERMISSIONS}, {@link Boolean#FALSE} otherwise. - */ - public Boolean hasPermission() { - return Boolean.valueOf(!permission.equalsIgnoreCase(NO_PERMISSIONS)); - } - - /** - * Checks if the chat channel has a speak permission set. - * - * @return true if the speak permission does not equal - * {@link ChatChannel#NO_PERMISSIONS}, false otherwise. - */ - public boolean hasSpeakPermission() { - return !speakPermission.equalsIgnoreCase(NO_PERMISSIONS); - } - - /** - * Get the speak permissions node for the chat channel. - * - * @return {@link String} - */ - public String getSpeakPermission() { - return speakPermission; - } - - /** - * Checks if the chat channel has the filter enabled. - * - * @return {@link Boolean#TRUE} if the chat channel has the filter enabled, - * {@link Boolean#FALSE} otherwise. - */ - public Boolean isFiltered() { - return Boolean.valueOf(filter); - } - - /** - * Compares the chat channel by name to determine equality. - * - * @param channel Object to compare for equality. - * @return true if the objects are equal, false otherwise. - */ - @Override - public boolean equals(Object channel) { - return channel instanceof ChatChannel && this.name.equals(((ChatChannel) channel).getName()); - } -} +package mineverse.Aust1n46.chat.channel; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; + +import org.bukkit.ChatColor; +import org.bukkit.configuration.ConfigurationSection; + +import mineverse.Aust1n46.chat.MineverseChat; +import mineverse.Aust1n46.chat.utilities.Format; + +/** + * Chat channel object pojo. Class also contains static initialization methods + * for reading chat channels from the config file. + * + * @author Aust1n46 + */ +public class ChatChannel { + private static final String PERMISSION_PREFIX = "venturechat."; + private static final String NO_PERMISSIONS = "venturechat.none"; + + private static boolean aliasesRegisteredAsCommands; + + private static MineverseChat plugin = MineverseChat.getInstance(); + private static ChatChannel defaultChatChannel; + private static String defaultColor; + private static HashMap chatChannels; + + @Deprecated + private static ChatChannel[] channels; + + private String name; + private String permission; + private String speakPermission; + private boolean mutable; + private String color; + private String chatColor; + private boolean defaultChannel; + private boolean autojoin; + private String alias; + private double distance; + private boolean filter; + private boolean bungee; + private String format; + private int cooldown; + + /** + * Read chat channels from config file and initialize channel array. + */ + public static void initialize(boolean aliasesRegisteredAsCommands) { + chatChannels = new HashMap(); + ChatChannel.aliasesRegisteredAsCommands = aliasesRegisteredAsCommands; + ConfigurationSection cs = plugin.getConfig().getConfigurationSection("channels"); + int len = (cs.getKeys(false)).size(); + channels = new ChatChannel[len]; + int counter = 0; + for (String key : cs.getKeys(false)) { + String color = cs.getString(key + ".color", "white"); + String chatColor = cs.getString(key + ".chatcolor", "white"); + String name = key; + String permission = cs.getString(key + ".permissions", "None"); + String speakPermission = cs.getString(key + ".speak_permissions", "None"); + boolean mutable = cs.getBoolean(key + ".mutable", false); + boolean filter = cs.getBoolean(key + ".filter", true); + boolean bungee = cs.getBoolean(key + ".bungeecord", false); + String format = cs.getString(key + ".format", "Default"); + boolean defaultChannel = cs.getBoolean(key + ".default", false); + String alias = cs.getString(key + ".alias", "None"); + double distance = cs.getDouble(key + ".distance", (double) 0); + int cooldown = cs.getInt(key + ".cooldown", 0); + boolean autojoin = cs.getBoolean(key + ".autojoin", false); + ChatChannel chatChannel = new ChatChannel(name, color, chatColor, permission, speakPermission, mutable, + filter, defaultChannel, alias, distance, autojoin, bungee, cooldown, format); + channels[counter++] = chatChannel; + chatChannels.put(name.toLowerCase(), chatChannel); + chatChannels.put(alias.toLowerCase(), chatChannel); + if (defaultChannel) { + defaultChatChannel = chatChannel; + defaultColor = color; + } + } + } + + public static boolean areAliasesRegisteredAsCommands() { + return aliasesRegisteredAsCommands; + } + + /** + * Get array of chat channels. + * + * @return {@link ChatChannel}[] + */ + @Deprecated + public static ChatChannel[] getChannels() { + return channels; + } + + /** + * Get list of chat channels. + * + * @return {@link Collection}<{@link ChatChannel}> + */ + public static Collection getChatChannels() { + return new HashSet(chatChannels.values()); + } + + /** + * Get a chat channel by name. + * + * @param channelName + * name of channel to get. + * @return {@link ChatChannel} + */ + public static ChatChannel getChannel(String channelName) { + return chatChannels.get(channelName.toLowerCase()); + } + + /** + * Checks if the chat channel exists. + * + * @param channelName + * name of channel to check. + * @return true if channel exists, false otherwise. + */ + public static boolean isChannel(String channelName) { + return getChannel(channelName) != null; + } + + /** + * Get default chat channel color. + * + * @return {@link String} + */ + public static String getDefaultColor() { + return defaultColor; + } + + /** + * Get default chat channel. + * + * @return {@link ChatChannel} + */ + public static ChatChannel getDefaultChannel() { + return defaultChatChannel; + } + + /** + * Get list of chat channels with autojoin set to true. + * + * @return {@link List}<{@link ChatChannel}> + */ + public static List getAutojoinList() { + List joinlist = new ArrayList(); + for (ChatChannel c : channels) { + if (c.getAutojoin()) { + joinlist.add(c); + } + } + return joinlist; + } + + /** + * Parameterized constructor a {@link ChatChannel}. + * + * @param name + * @param color + * @param chatColor + * @param permission + * @param speakPermission + * @param mutable + * @param filter + * @param defaultChannel + * @param alias + * @param distance + * @param autojoin + * @param bungee + * @param cooldown + * @param format + */ + public ChatChannel(String name, String color, String chatColor, String permission, String speakPermission, + boolean mutable, boolean filter, boolean defaultChannel, String alias, double distance, boolean autojoin, + boolean bungee, int cooldown, String format) { + this.name = name; + this.color = color; + this.chatColor = chatColor; + this.permission = PERMISSION_PREFIX + permission; + this.speakPermission = PERMISSION_PREFIX + speakPermission; + this.mutable = mutable; + this.filter = filter; + this.defaultChannel = defaultChannel; + this.alias = alias; + this.distance = distance; + this.autojoin = autojoin; + this.bungee = bungee; + this.cooldown = cooldown; + this.format = format; + } + + /** + * Deprecated parameterized constructor a {@link ChatChannel}. + * + * @param name + * @param color + * @param chatColor + * @param permission + * @param speakPermission + * @param mutable + * @param filter + * @param defaultChannel + * @param alias + * @param distance + * @param autojoin + * @param bungee + * @param cooldown + * @param format + */ + @Deprecated + public ChatChannel(String name, String color, String chatColor, String permission, String speakPermission, + Boolean mutable, Boolean filter, Boolean defaultChannel, String alias, Double distance, Boolean autojoin, + Boolean bungee, int cooldown, String format) { + this.name = name; + this.color = color; + this.chatColor = chatColor; + this.permission = PERMISSION_PREFIX + permission; + this.speakPermission = PERMISSION_PREFIX + speakPermission; + this.mutable = mutable; + this.filter = filter; + this.defaultChannel = defaultChannel; + this.alias = alias; + this.distance = distance; + this.autojoin = autojoin; + this.bungee = bungee; + this.cooldown = cooldown; + this.format = format; + } + + /** + * Get the name of the chat channel. + * + * @return {@link String} + */ + public String getName() { + return name; + } + + /** + * Get the format of the chat channel. + * + * @return {@link String} + */ + public String getFormat() { + return format; + } + + /** + * Get the cooldown of the chat channel in seconds. + * + * @return int + */ + public int getCooldown() { + return cooldown; + } + + /** + * Check if the chat channel is BungeeCord enabled. + * + * @return {@link Boolean#TRUE} if the chat channel is BungeeCord enabled, + * {@link Boolean#FALSE} otherwise. + */ + public Boolean getBungee() { + return Boolean.valueOf(bungee); + } + + /** + * Get the permissions node for the chat channel. + * + * @return {@link String} + */ + public String getPermission() { + return permission; + } + + /** + * Check if autojoin is enabled for the chat channel. + * + * @return {@link Boolean#TRUE} if autojoin is enabled, {@link Boolean#FALSE} + * otherwise. + */ + public Boolean getAutojoin() { + return Boolean.valueOf(autojoin); + } + + /** + * Check if the chat channel allows muting. + * + * @return {@link Boolean#TRUE} if muting is allowed, {@link Boolean#FALSE} + * otherwise. + */ + public Boolean isMutable() { + return Boolean.valueOf(mutable); + } + + /** + * Get the formatted color of the chat channel. + * + * @return {@link String}. Returns {@link Format#DEFAULT_COLOR_CODE} if the + * color is invalid. + */ + public String getColor() { + if (Format.isValidColor(color)) { + return String.valueOf(ChatColor.valueOf(color.toUpperCase())); + } + if (Format.isValidHexColor(color)) { + return Format.convertHexColorCodeToBukkitColorCode(color); + } + return Format.DEFAULT_COLOR_CODE; + } + + /** + * Get the raw color value of the chat channel. + * + * @return {@link String} + */ + public String getColorRaw() { + return color; + } + + /** + * Get the formatted chat color of the chat channel. + * + * @return {@link String}. Returns {@link Format#DEFAULT_COLOR_CODE} if the chat + * color is invalid. + */ + public String getChatColor() { + if (chatColor.equalsIgnoreCase("None")) { + return chatColor; + } + if (Format.isValidColor(chatColor)) { + return String.valueOf(ChatColor.valueOf(chatColor.toUpperCase())); + } + if (Format.isValidHexColor(chatColor)) { + return Format.convertHexColorCodeToBukkitColorCode(chatColor); + } + return Format.DEFAULT_COLOR_CODE; + } + + /** + * Get the raw chat color value of the chat channel. + * + * @return {@link String} + */ + public String getChatColorRaw() { + return chatColor; + } + + /** + * Check if the chat channel is the default chat channel. + * + * @return {@link Boolean#TRUE} if the chat channel is the default chat channel, + * {@link Boolean#FALSE} otherwise. + */ + public Boolean isDefaultchannel() { + return Boolean.valueOf(defaultChannel); + } + + /** + * Get the alias of the chat channel. + * + * @return {@link String} + */ + public String getAlias() { + return alias; + } + + /** + * Get the distance of the chat channel in blocks. + * + * @return {@link Double} + */ + public Double getDistance() { + return Double.valueOf(distance); + } + + /** + * Checks if the chat channel has a distance set. + * + * @return {@link Boolean#TRUE} if the distance is greater than zero, + * {@link Boolean#FALSE} otherwise. + */ + public Boolean hasDistance() { + return Boolean.valueOf(distance > 0); + } + + /** + * Checks if the chat channel has a cooldown set. + * + * @return {@link Boolean#TRUE} if the cooldown is greater than zero, + * {@link Boolean#FALSE} otherwise. + */ + public Boolean hasCooldown() { + return Boolean.valueOf(cooldown > 0); + } + + /** + * Checks if the chat channel has a permission set. + * + * @return {@link Boolean#TRUE} if the permission does not equal + * {@link ChatChannel#NO_PERMISSIONS}, {@link Boolean#FALSE} otherwise. + */ + public Boolean hasPermission() { + return Boolean.valueOf(!permission.equalsIgnoreCase(NO_PERMISSIONS)); + } + + /** + * Checks if the chat channel has a speak permission set. + * + * @return true if the speak permission does not equal + * {@link ChatChannel#NO_PERMISSIONS}, false otherwise. + */ + public boolean hasSpeakPermission() { + return !speakPermission.equalsIgnoreCase(NO_PERMISSIONS); + } + + /** + * Get the speak permissions node for the chat channel. + * + * @return {@link String} + */ + public String getSpeakPermission() { + return speakPermission; + } + + /** + * Checks if the chat channel has the filter enabled. + * + * @return {@link Boolean#TRUE} if the chat channel has the filter enabled, + * {@link Boolean#FALSE} otherwise. + */ + public Boolean isFiltered() { + return Boolean.valueOf(filter); + } + + /** + * Compares the chat channel by name to determine equality. + * + * @param channel + * Object to compare for equality. + * @return true if the objects are equal, false otherwise. + */ + @Override + public boolean equals(Object channel) { + return channel instanceof ChatChannel && this.name.equals(((ChatChannel) channel).getName()); + } +} diff --git a/src/main/java/mineverse/Aust1n46/chat/command/VentureCommandExecutor.java b/src/main/java/mineverse/Aust1n46/chat/command/VentureCommandExecutor.java index b00f531..89929fc 100644 --- a/src/main/java/mineverse/Aust1n46/chat/command/VentureCommandExecutor.java +++ b/src/main/java/mineverse/Aust1n46/chat/command/VentureCommandExecutor.java @@ -1,134 +1,142 @@ -package mineverse.Aust1n46.chat.command; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; - -import mineverse.Aust1n46.chat.MineverseChat; -import mineverse.Aust1n46.chat.command.chat.Broadcast; -import mineverse.Aust1n46.chat.command.chat.BungeeToggle; -import mineverse.Aust1n46.chat.command.chat.Channel; -import mineverse.Aust1n46.chat.command.chat.Channelinfo; -import mineverse.Aust1n46.chat.command.chat.Chatinfo; -import mineverse.Aust1n46.chat.command.chat.Chatreload; -import mineverse.Aust1n46.chat.command.chat.Chlist; -import mineverse.Aust1n46.chat.command.chat.Chwho; -import mineverse.Aust1n46.chat.command.chat.Clearchat; -import mineverse.Aust1n46.chat.command.chat.Commandblock; -import mineverse.Aust1n46.chat.command.chat.Commandspy; -import mineverse.Aust1n46.chat.command.chat.Config; -import mineverse.Aust1n46.chat.command.chat.Edit; -import mineverse.Aust1n46.chat.command.chat.Filter; -import mineverse.Aust1n46.chat.command.chat.Force; -import mineverse.Aust1n46.chat.command.chat.Forceall; -import mineverse.Aust1n46.chat.command.chat.Kickchannel; -import mineverse.Aust1n46.chat.command.chat.Kickchannelall; -import mineverse.Aust1n46.chat.command.chat.Leave; -import mineverse.Aust1n46.chat.command.chat.Listen; -import mineverse.Aust1n46.chat.command.chat.Me; -import mineverse.Aust1n46.chat.command.chat.Nick; -import mineverse.Aust1n46.chat.command.chat.Party; -import mineverse.Aust1n46.chat.command.chat.RangedSpy; -import mineverse.Aust1n46.chat.command.chat.Removemessage; -import mineverse.Aust1n46.chat.command.chat.Setchannel; -import mineverse.Aust1n46.chat.command.chat.Setchannelall; -import mineverse.Aust1n46.chat.command.chat.VentureChatGui; -import mineverse.Aust1n46.chat.command.chat.Venturechat; -import mineverse.Aust1n46.chat.command.message.IgnoreCommandExecutor; -import mineverse.Aust1n46.chat.command.message.MessageCommandExecutor; -import mineverse.Aust1n46.chat.command.message.MessageToggle; -import mineverse.Aust1n46.chat.command.message.Notifications; -import mineverse.Aust1n46.chat.command.message.Reply; -import mineverse.Aust1n46.chat.command.message.Spy; -import mineverse.Aust1n46.chat.command.mute.Mute; -import mineverse.Aust1n46.chat.command.mute.Muteall; -import mineverse.Aust1n46.chat.command.mute.Unmute; -import mineverse.Aust1n46.chat.command.mute.Unmuteall; - -/** - * Class that initializes and executes the plugin's commands. - */ -public class VentureCommandExecutor implements TabExecutor { - private static Map commands = new HashMap(); - private static MineverseChat plugin = MineverseChat.getInstance(); - private static VentureCommandExecutor commandExecutor; - - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] parameters) { - commands.get(command.getName()).execute(sender, command.getName(), parameters); - return true; - } - - @Override - public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { - return commands.get(command.getName()).onTabComplete(sender, command, label, args); - } - - public static void initialize() { - commandExecutor = new VentureCommandExecutor(); - commands.put("broadcast", new Broadcast()); - commands.put("channel", new Channel()); - commands.put("join", new Channel()); - commands.put("channelinfo", new Channelinfo()); - commands.put("chatinfo", new Chatinfo()); - commands.put("chatreload", new Chatreload()); - commands.put("chlist", new Chlist()); - commands.put("chwho", new Chwho()); - commands.put("clearchat", new Clearchat()); - commands.put("commandblock", new Commandblock()); - commands.put("commandspy", new Commandspy()); - commands.put("config", new Config()); - commands.put("edit", new Edit()); - commands.put("filter", new Filter()); - commands.put("force", new Force()); - commands.put("forceall", new Forceall()); - commands.put("kickchannel", new Kickchannel()); - commands.put("kickchannelall", new Kickchannelall()); - commands.put("leave", new Leave()); - commands.put("listen", new Listen()); - commands.put("me", new Me()); - commands.put("venturechat", new Venturechat()); - commands.put("setnickname", new Nick()); - commands.put("notifications", new Notifications()); - commands.put("party", new Party()); - commands.put("rangedspy", new RangedSpy()); - commands.put("removemessage", new Removemessage()); - commands.put("setchannel", new Setchannel()); - commands.put("setchannelall", new Setchannelall()); - commands.put("spy", new Spy()); - commands.put("venturechatgui", new VentureChatGui()); - commands.put("messagetoggle", new MessageToggle()); - commands.put("bungeetoggle", new BungeeToggle()); - for (String command : commands.keySet()) { - plugin.getCommand(command).setExecutor(commandExecutor); - } - - plugin.getServer().getScheduler().runTaskLater(plugin, () -> { - VentureCommand reply = new Reply(); - commands.put("reply", reply); - commands.put("r", reply); - plugin.getCommand("reply").setExecutor(commandExecutor); - plugin.getCommand("r").setExecutor(commandExecutor); - - commands.put("mute", new Mute()); - commands.put("muteall", new Muteall()); - commands.put("unmute", new Unmute()); - commands.put("unmuteall", new Unmuteall()); - plugin.getCommand("mute").setExecutor(commandExecutor); - plugin.getCommand("muteall").setExecutor(commandExecutor); - plugin.getCommand("unmute").setExecutor(commandExecutor); - plugin.getCommand("unmuteall").setExecutor(commandExecutor); - - MessageCommandExecutor messageCommandExecutor = new MessageCommandExecutor(); - plugin.getCommand("message").setExecutor(messageCommandExecutor); - plugin.getCommand("msg").setExecutor(messageCommandExecutor); - plugin.getCommand("tell").setExecutor(messageCommandExecutor); - plugin.getCommand("whisper").setExecutor(messageCommandExecutor); - plugin.getCommand("ignore").setExecutor(new IgnoreCommandExecutor()); - }, 0); - } -} +package mineverse.Aust1n46.chat.command; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; + +import mineverse.Aust1n46.chat.MineverseChat; +import mineverse.Aust1n46.chat.command.chat.Broadcast; +import mineverse.Aust1n46.chat.command.chat.BungeeToggle; +import mineverse.Aust1n46.chat.command.chat.Channel; +import mineverse.Aust1n46.chat.command.chat.Channelinfo; +import mineverse.Aust1n46.chat.command.chat.Chatinfo; +import mineverse.Aust1n46.chat.command.chat.Chatreload; +import mineverse.Aust1n46.chat.command.chat.Chlist; +import mineverse.Aust1n46.chat.command.chat.Chwho; +import mineverse.Aust1n46.chat.command.chat.Clearchat; +import mineverse.Aust1n46.chat.command.chat.Commandblock; +import mineverse.Aust1n46.chat.command.chat.Commandspy; +import mineverse.Aust1n46.chat.command.chat.Config; +import mineverse.Aust1n46.chat.command.chat.Edit; +import mineverse.Aust1n46.chat.command.chat.Filter; +import mineverse.Aust1n46.chat.command.chat.Force; +import mineverse.Aust1n46.chat.command.chat.Forceall; +import mineverse.Aust1n46.chat.command.chat.Kickchannel; +import mineverse.Aust1n46.chat.command.chat.Kickchannelall; +import mineverse.Aust1n46.chat.command.chat.Leave; +import mineverse.Aust1n46.chat.command.chat.Listen; +import mineverse.Aust1n46.chat.command.chat.Me; +import mineverse.Aust1n46.chat.command.chat.Nick; +import mineverse.Aust1n46.chat.command.chat.Party; +import mineverse.Aust1n46.chat.command.chat.RangedSpy; +import mineverse.Aust1n46.chat.command.chat.Removemessage; +import mineverse.Aust1n46.chat.command.chat.Setchannel; +import mineverse.Aust1n46.chat.command.chat.Setchannelall; +import mineverse.Aust1n46.chat.command.chat.VentureChatGui; +import mineverse.Aust1n46.chat.command.chat.Venturechat; +import mineverse.Aust1n46.chat.command.message.IgnoreCommandExecutor; +import mineverse.Aust1n46.chat.command.message.MessageCommandExecutor; +import mineverse.Aust1n46.chat.command.message.MessageToggle; +import mineverse.Aust1n46.chat.command.message.Notifications; +import mineverse.Aust1n46.chat.command.message.Reply; +import mineverse.Aust1n46.chat.command.message.Spy; +import mineverse.Aust1n46.chat.command.mute.Mute; +import mineverse.Aust1n46.chat.command.mute.Muteall; +import mineverse.Aust1n46.chat.command.mute.Unmute; +import mineverse.Aust1n46.chat.command.mute.Unmuteall; + +/** + * Class that initializes and executes the plugin's commands. + */ +public class VentureCommandExecutor implements TabExecutor { + private static Map commands = new HashMap(); + private static MineverseChat plugin = MineverseChat.getInstance(); + private static VentureCommandExecutor commandExecutor; + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] parameters) { + commands.get(command.getName()).execute(sender, command.getName(), parameters); + return true; + } + + @Override + public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { + return commands.get(command.getName()).onTabComplete(sender, command, label, args); + } + + public static void initialize() { + commandExecutor = new VentureCommandExecutor(); + commands.put("broadcast", new Broadcast()); + commands.put("channel", new Channel()); + commands.put("join", new Channel()); + commands.put("channelinfo", new Channelinfo()); + commands.put("chatinfo", new Chatinfo()); + commands.put("chatreload", new Chatreload()); + commands.put("chlist", new Chlist()); + commands.put("chwho", new Chwho()); + commands.put("clearchat", new Clearchat()); + commands.put("commandblock", new Commandblock()); + commands.put("commandspy", new Commandspy()); + commands.put("config", new Config()); + commands.put("edit", new Edit()); + commands.put("filter", new Filter()); + commands.put("force", new Force()); + commands.put("forceall", new Forceall()); + commands.put("kickchannel", new Kickchannel()); + commands.put("kickchannelall", new Kickchannelall()); + commands.put("leave", new Leave()); + commands.put("listen", new Listen()); + commands.put("me", new Me()); + commands.put("venturechat", new Venturechat()); + commands.put("setnickname", new Nick()); + commands.put("notifications", new Notifications()); + commands.put("party", new Party()); + commands.put("rangedspy", new RangedSpy()); + commands.put("removemessage", new Removemessage()); + commands.put("setchannel", new Setchannel()); + commands.put("setchannelall", new Setchannelall()); + commands.put("spy", new Spy()); + commands.put("venturechatgui", new VentureChatGui()); + commands.put("messagetoggle", new MessageToggle()); + commands.put("bungeetoggle", new BungeeToggle()); + for(String command : commands.keySet()) { + registerCommand(command, commandExecutor); + } + + plugin.getServer().getScheduler().runTaskLater(plugin, () -> { + VentureCommand reply = new Reply(); + commands.put("reply", reply); + commands.put("r", reply); + registerCommand("reply", commandExecutor); + registerCommand("r", commandExecutor); + + commands.put("mute", new Mute()); + commands.put("muteall", new Muteall()); + commands.put("unmute", new Unmute()); + commands.put("unmuteall", new Unmuteall()); + registerCommand("mute", commandExecutor); + registerCommand("muteall", commandExecutor); + registerCommand("unmute", commandExecutor); + registerCommand("unmuteall", commandExecutor); + + MessageCommandExecutor messageCommandExecutor = new MessageCommandExecutor(); + registerCommand("message", messageCommandExecutor); + registerCommand("msg", messageCommandExecutor); + registerCommand("tell", messageCommandExecutor); + registerCommand("whisper", messageCommandExecutor); + + registerCommand("ignore", new IgnoreCommandExecutor()); + }, 0); + } + + private static void registerCommand(String command, CommandExecutor commandExecutor) { + if(plugin.getCommand(command) != null) { + plugin.getCommand(command).setExecutor(commandExecutor); + } + } +} diff --git a/src/main/java/mineverse/Aust1n46/chat/command/chat/Chatreload.java b/src/main/java/mineverse/Aust1n46/chat/command/chat/Chatreload.java index 5b1e14b..038b7b8 100644 --- a/src/main/java/mineverse/Aust1n46/chat/command/chat/Chatreload.java +++ b/src/main/java/mineverse/Aust1n46/chat/command/chat/Chatreload.java @@ -1,32 +1,60 @@ -package mineverse.Aust1n46.chat.command.chat; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; - -import mineverse.Aust1n46.chat.MineverseChat; -import mineverse.Aust1n46.chat.api.MineverseChatAPI; -import mineverse.Aust1n46.chat.api.MineverseChatPlayer; -import mineverse.Aust1n46.chat.command.VentureCommand; -import mineverse.Aust1n46.chat.localization.LocalizedMessage; - -public class Chatreload implements VentureCommand { - private MineverseChat plugin = MineverseChat.getInstance(); - - @Override - public void execute(CommandSender sender, String command, String[] args) { - if (sender.hasPermission("venturechat.reload")) { - plugin.reloadConfig(); - Bukkit.getPluginManager().disablePlugin(plugin); - Bukkit.getPluginManager().enablePlugin(plugin); - plugin.getServer().getLogger().info("[VentureChat] Config reloaded"); - for (MineverseChatPlayer player : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - if (player.getPlayer().hasPermission("venturechat.reload")) { - player.getPlayer().sendMessage(LocalizedMessage.CONFIG_RELOADED.toString()); - } - } - return; - } - sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); - return; - } -} +package mineverse.Aust1n46.chat.command.chat; + +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import mineverse.Aust1n46.chat.MineverseChat; +import mineverse.Aust1n46.chat.api.MineverseChatAPI; +import mineverse.Aust1n46.chat.api.MineverseChatPlayer; +import mineverse.Aust1n46.chat.command.VentureCommand; +import mineverse.Aust1n46.chat.database.PlayerData; +import mineverse.Aust1n46.chat.localization.LocalizedMessage; +import mineverse.Aust1n46.chat.utilities.Format; + +public class Chatreload implements VentureCommand { + private MineverseChat plugin = MineverseChat.getInstance(); + + @Override + public void execute(CommandSender sender, String command, String[] args) { + if(sender.hasPermission("venturechat.reload")) { + PlayerData.savePlayerData(); + MineverseChatAPI.clearMineverseChatPlayerMap(); + MineverseChatAPI.clearNameMap(); + MineverseChatAPI.clearOnlineMineverseChatPlayerMap(); + + plugin.reloadConfig(); + MineverseChat.initializeConfigReaders(); + + PlayerData.loadLegacyPlayerData(); + PlayerData.loadPlayerData(); + for(Player p : plugin.getServer().getOnlinePlayers()) { + MineverseChatPlayer mcp = MineverseChatAPI.getMineverseChatPlayer(p); + if(mcp == null) { + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Could not find player data post reload for currently online player: " + p.getName())); + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - There could be an issue with your player data saving.")); + String name = p.getName(); + UUID uuid = p.getUniqueId(); + mcp = new MineverseChatPlayer(uuid, name); + } + mcp.setOnline(true); + mcp.setHasPlayed(false); + mcp.setJsonFormat(); + MineverseChatAPI.addMineverseChatOnlinePlayerToMap(mcp); + MineverseChatAPI.addNameToMap(mcp); + } + + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Config reloaded")); + for(MineverseChatPlayer player : MineverseChatAPI.getOnlineMineverseChatPlayers()) { + if(player.getPlayer().hasPermission("venturechat.reload")) { + player.getPlayer().sendMessage(LocalizedMessage.CONFIG_RELOADED.toString()); + } + } + return; + } + sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); + return; + } +} diff --git a/src/main/java/mineverse/Aust1n46/chat/listeners/ChatListener.java b/src/main/java/mineverse/Aust1n46/chat/listeners/ChatListener.java index 3deacd3..c7503c2 100644 --- a/src/main/java/mineverse/Aust1n46/chat/listeners/ChatListener.java +++ b/src/main/java/mineverse/Aust1n46/chat/listeners/ChatListener.java @@ -1,562 +1,562 @@ -package mineverse.Aust1n46.chat.listeners; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.util.Set; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.plugin.PluginManager; - -import com.comphenix.protocol.events.PacketContainer; -import com.massivecraft.factions.entity.MPlayer; -import com.palmergames.bukkit.towny.TownyUniverse; -import com.palmergames.bukkit.towny.object.Resident; - -import me.clip.placeholderapi.PlaceholderAPI; -import mineverse.Aust1n46.chat.MineverseChat; -import mineverse.Aust1n46.chat.api.MineverseChatAPI; -import mineverse.Aust1n46.chat.api.MineverseChatPlayer; -import mineverse.Aust1n46.chat.api.events.ChannelJoinEvent; -import mineverse.Aust1n46.chat.api.events.VentureChatEvent; -import mineverse.Aust1n46.chat.channel.ChatChannel; -import mineverse.Aust1n46.chat.command.mute.MuteContainer; -import mineverse.Aust1n46.chat.database.Database; -import mineverse.Aust1n46.chat.localization.LocalizedMessage; -import mineverse.Aust1n46.chat.utilities.Format; - -//This class listens to chat through the chat event and handles the bulk of the chat channels and formatting. -public class ChatListener implements Listener { - private MineverseChat plugin = MineverseChat.getInstance(); - - @EventHandler(priority = EventPriority.NORMAL) - public void onChannelJoin(ChannelJoinEvent event) { - - } - - // this event isn't always asynchronous even though the event's name starts with "Async" - // blame md_5 for that one - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onAsyncPlayerChatEvent(AsyncPlayerChatEvent event) { - event.setCancelled(true); - Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { - @Override - public void run() { - handleTrueAsyncPlayerChatEvent(event); - } - }); - } - - public void handleTrueAsyncPlayerChatEvent(AsyncPlayerChatEvent event) { - boolean bungee = false; - String chat = event.getMessage(); - String format; - Set recipients = event.getRecipients(); - int recipientCount = recipients.size(); // Don't count vanished players - MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(event.getPlayer()); - ChatChannel eventChannel = mcp.getCurrentChannel(); - - if(mcp.isEditing()) { - mcp.getPlayer().sendMessage(Format.FormatStringAll(chat)); - mcp.setEditing(false); - return; - } - - if(mcp.isQuickChat()) { - eventChannel = mcp.getQuickChannel(); - } - - if(mcp.hasConversation() && !mcp.isQuickChat()) { - MineverseChatPlayer tp = MineverseChatAPI.getMineverseChatPlayer(mcp.getConversation()); - if(!tp.isOnline()) { - mcp.getPlayer().sendMessage(ChatColor.RED + tp.getName() + " is not available."); - if(!mcp.getPlayer().hasPermission("venturechat.spy.override")) { - for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - if(p.getName().equals(mcp.getName())) { - continue; - } - if(p.isSpy()) { - p.getPlayer().sendMessage(LocalizedMessage.EXIT_PRIVATE_CONVERSATION_SPY.toString() - .replace("{player_sender}", mcp.getName()) - .replace("{player_receiver}", tp.getName())); - } - } - } - mcp.setConversation(null); - } - else { - if(tp.getIgnores().contains(mcp.getUUID())) { - mcp.getPlayer().sendMessage(LocalizedMessage.IGNORING_MESSAGE.toString() - .replace("{player}", tp.getName())); - event.setCancelled(true); - return; - } - if(!tp.getMessageToggle()) { - mcp.getPlayer().sendMessage(LocalizedMessage.BLOCKING_MESSAGE.toString() - .replace("{player}", tp.getName())); - event.setCancelled(true); - return; - } - String filtered = chat; - String echo = ""; - String send = ""; - String spy = ""; - if(mcp.hasFilter()) { - filtered = Format.FilterChat(filtered); - } - if(mcp.getPlayer().hasPermission("venturechat.color.legacy")) { - filtered = Format.FormatStringLegacyColor(filtered); - } - if(mcp.getPlayer().hasPermission("venturechat.color")) { - filtered = Format.FormatStringColor(filtered); - } - if(mcp.getPlayer().hasPermission("venturechat.format")) { - filtered = Format.FormatString(filtered); - } - filtered = " " + filtered; - - send = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("tellformatfrom").replaceAll("sender_", ""))); - echo = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("tellformatto").replaceAll("sender_", ""))); - spy = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("tellformatspy").replaceAll("sender_", ""))); - - send = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(tp.getPlayer(), send.replaceAll("receiver_", ""))) + filtered; - echo = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(tp.getPlayer(), echo.replaceAll("receiver_", ""))) + filtered; - spy = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(tp.getPlayer(), spy.replaceAll("receiver_", ""))) + filtered; - - if(!mcp.getPlayer().hasPermission("venturechat.spy.override")) { - for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - if(p.getName().equals(mcp.getName()) || p.getName().equals(tp.getName())) { - continue; - } - if(p.isSpy()) { - p.getPlayer().sendMessage(spy); - } - } - } - tp.getPlayer().sendMessage(send); - mcp.getPlayer().sendMessage(echo); - if(tp.hasNotifications()) { - Format.playMessageSound(tp); - } - mcp.setReplyPlayer(tp.getUUID()); - tp.setReplyPlayer(mcp.getUUID()); - if(Database.isEnabled()) { - Database.writeVentureChat(mcp.getUUID().toString(), mcp.getName(), "Local", "Messaging_Component", chat.replace("'", "''"), "Chat"); - } - } - return; - } - - if(mcp.isPartyChat() && !mcp.isQuickChat()) { - if(mcp.hasParty()) { - String partyformat = ""; - for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - if((p.hasParty() && p.getParty().toString().equals(mcp.getParty().toString()) || p.isSpy())) { - String filtered = chat; - if(mcp.hasFilter()) { - filtered = Format.FilterChat(filtered); - } - if(mcp.getPlayer().hasPermission("venturechat.color.legacy")) { - filtered = Format.FormatStringLegacyColor(filtered); - } - if(mcp.getPlayer().hasPermission("venturechat.color")) { - filtered = Format.FormatStringColor(filtered); - } - if(mcp.getPlayer().hasPermission("venturechat.format")) { - filtered = Format.FormatString(filtered); - } - filtered = " " + filtered; - if(plugin.getConfig().getString("partyformat").equalsIgnoreCase("Default")) { - partyformat = ChatColor.GREEN + "[" + MineverseChatAPI.getMineverseChatPlayer(mcp.getParty()).getName() + "'s Party] " + mcp.getName() + ":" + filtered; - } - else { - partyformat = Format.FormatStringAll(plugin.getConfig().getString("partyformat").replace("{host}", MineverseChatAPI.getMineverseChatPlayer(mcp.getParty()).getName()).replace("{player}", mcp.getName())) + filtered; - } - p.getPlayer().sendMessage(partyformat); - } - } - Bukkit.getConsoleSender().sendMessage(partyformat); - if(Database.isEnabled()) { - Database.writeVentureChat(mcp.getUUID().toString(), mcp.getName(), "Local", "Party_Component", chat.replace("'", "''"), "Chat"); - } - return; - } - mcp.getPlayer().sendMessage(ChatColor.RED + "You are not in a party."); - return; - } - - Location locreceip; - Location locsender = mcp.getPlayer().getLocation(); - Location diff; - Boolean filterthis = true; - mcp.addListening(eventChannel.getName()); - if (mcp.isMuted(eventChannel.getName())) { - MuteContainer muteContainer = mcp.getMute(eventChannel.getName()); - if (muteContainer.hasDuration()) { - long dateTimeMillis = System.currentTimeMillis(); - long muteTimeMillis = muteContainer.getDuration(); - long remainingMuteTime = muteTimeMillis - dateTimeMillis; - if (remainingMuteTime < 1000) { - remainingMuteTime = 1000; - } - String timeString = Format.parseTimeStringFromMillis(remainingMuteTime); - if(muteContainer.hasReason()) { - mcp.getPlayer() - .sendMessage(LocalizedMessage.CHANNEL_MUTED_TIMED_REASON.toString() - .replace("{channel_color}", eventChannel.getColor()) - .replace("{channel_name}", eventChannel.getName()) - .replace("{time}", timeString) - .replace("{reason}", muteContainer.getReason())); - } - else { - mcp.getPlayer() - .sendMessage(LocalizedMessage.CHANNEL_MUTED_TIMED.toString() - .replace("{channel_color}", eventChannel.getColor()) - .replace("{channel_name}", eventChannel.getName()) - .replace("{time}", timeString)); - } - } - else { - if(muteContainer.hasReason()) { - mcp.getPlayer() - .sendMessage(LocalizedMessage.CHANNEL_MUTED_REASON.toString() - .replace("{channel_color}", eventChannel.getColor()) - .replace("{channel_name}", eventChannel.getName()) - .replace("{reason}", muteContainer.getReason())); - } - else { - mcp.getPlayer() - .sendMessage(LocalizedMessage.CHANNEL_MUTED.toString() - .replace("{channel_color}", eventChannel.getColor()) - .replace("{channel_name}", eventChannel.getName())); - } - } - mcp.setQuickChat(false); - return; - } - Double chDistance = (double) 0; - String curColor = ""; - if(eventChannel.hasPermission() && !mcp.getPlayer().hasPermission(eventChannel.getPermission())) { - mcp.getPlayer().sendMessage(LocalizedMessage.CHANNEL_NO_PERMISSION.toString()); - mcp.setQuickChat(false); - mcp.removeListening(eventChannel.getName()); - mcp.setCurrentChannel(ChatChannel.getDefaultChannel()); - return; - } - if(eventChannel.hasSpeakPermission() && !mcp.getPlayer().hasPermission(eventChannel.getSpeakPermission())) { - mcp.getPlayer().sendMessage(LocalizedMessage.CHANNEL_NO_SPEAK_PERMISSIONS.toString()); - mcp.setQuickChat(false); - return; - } - curColor = eventChannel.getChatColor(); - bungee = eventChannel.getBungee(); - - long dateTimeSeconds = System.currentTimeMillis() / Format.MILLISECONDS_PER_SECOND; - - int chCooldown = 0; - if(eventChannel.hasCooldown()) { - chCooldown = eventChannel.getCooldown(); - } - try { - if (mcp.hasCooldown(eventChannel)) { - long cooldownTime = mcp.getCooldowns().get(eventChannel).longValue(); - if (dateTimeSeconds < cooldownTime) { - long remainingCooldownTime = cooldownTime - dateTimeSeconds; - String cooldownString = Format.parseTimeStringFromMillis(remainingCooldownTime * Format.MILLISECONDS_PER_SECOND); - mcp.getPlayer().sendMessage(LocalizedMessage.CHANNEL_COOLDOWN.toString() - .replace("{cooldown}", cooldownString)); - mcp.setQuickChat(false); - bungee = false; - return; - } - } - if (eventChannel.hasCooldown()) { - if (!mcp.getPlayer().hasPermission("venturechat.cooldown.bypass")) { - mcp.addCooldown(eventChannel, dateTimeSeconds + chCooldown); - } - } - } catch (NumberFormatException e) { - e.printStackTrace(); - } - - if (mcp.hasSpam(eventChannel) && plugin.getConfig().getConfigurationSection("antispam").getBoolean("enabled") - && !mcp.getPlayer().hasPermission("venturechat.spam.bypass")) { - long spamcount = mcp.getSpam().get(eventChannel).get(0); - long spamtime = mcp.getSpam().get(eventChannel).get(1); - long spamtimeconfig = plugin.getConfig().getConfigurationSection("antispam").getLong("spamnumber"); - String mutedForTime = plugin.getConfig().getConfigurationSection("antispam").getString("mutetime", "0"); - long dateTime = System.currentTimeMillis(); - if (dateTimeSeconds < spamtime - + plugin.getConfig().getConfigurationSection("antispam").getLong("spamtime")) { - if (spamcount + 1 >= spamtimeconfig) { - long time = Format.parseTimeStringToMillis(mutedForTime); - if (time > 0) { - mcp.addMute(eventChannel.getName(), dateTime + time, LocalizedMessage.SPAM_MUTE_REASON_TEXT.toString()); - String timeString = Format.parseTimeStringFromMillis(time); - mcp.getPlayer() - .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_TIME_REASON.toString() - .replace("{channel_color}", eventChannel.getColor()) - .replace("{channel_name}", eventChannel.getName()) - .replace("{time}", timeString) - .replace("{reason}", LocalizedMessage.SPAM_MUTE_REASON_TEXT.toString())); - } - else { - mcp.addMute(eventChannel.getName(), LocalizedMessage.SPAM_MUTE_REASON_TEXT.toString()); - mcp.getPlayer() - .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_REASON.toString() - .replace("{channel_color}", eventChannel.getColor()) - .replace("{channel_name}", eventChannel.getName()) - .replace("{reason}", LocalizedMessage.SPAM_MUTE_REASON_TEXT.toString())); - } - if(eventChannel.getBungee()) { - MineverseChat.synchronize(mcp, true); - } - mcp.getSpam().get(eventChannel).set(0, 0L); - mcp.setQuickChat(false); - return; - } else { - if (spamtimeconfig % 2 != 0) { - spamtimeconfig++; - } - if (spamcount + 1 == spamtimeconfig / 2) { - mcp.getPlayer().sendMessage(LocalizedMessage.SPAM_WARNING.toString()); - } - mcp.getSpam().get(eventChannel).set(0, spamcount + 1); - } - } else { - mcp.getSpam().get(eventChannel).set(0, 1L); - mcp.getSpam().get(eventChannel).set(1, dateTimeSeconds); - } - } else { - mcp.addSpam(eventChannel); - mcp.getSpam().get(eventChannel).add(0, 1L); - mcp.getSpam().get(eventChannel).add(1, dateTimeSeconds); - } - - if(eventChannel.hasDistance()) { - chDistance = eventChannel.getDistance(); - } - - format = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), Format.FormatStringAll(plugin.getConfig().getConfigurationSection("channels." + eventChannel.getName()).getString("format")))); - if(plugin.getConfig().getBoolean("formatcleaner", false)) { - format = format.replace("[]", " "); - format = format.replace(" ", " ").replace(" ", " ").replace(" ", " "); - } - - filterthis = eventChannel.isFiltered(); - if(filterthis) { - if(mcp.hasFilter()) { - chat = Format.FilterChat(chat); - } - } - PluginManager pluginManager = plugin.getServer().getPluginManager(); - for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - if(p.getPlayer() != mcp.getPlayer()) { - if(!p.isListening(eventChannel.getName())) { - recipients.remove(p.getPlayer()); - recipientCount--; - continue; - } - if(plugin.getConfig().getBoolean("ignorechat", false) && p.getIgnores().contains(mcp.getUUID())) { - recipients.remove(p.getPlayer()); - recipientCount--; - continue; - } - if(plugin.getConfig().getBoolean("enable_towny_channel") && pluginManager.isPluginEnabled("Towny")) { - try { - TownyUniverse towny = TownyUniverse.getInstance(); - if(eventChannel.getName().equalsIgnoreCase("Town")) { - Resident r = towny.getResident(p.getName()); - Resident pp = towny.getResident(mcp.getName()); - if(!pp.hasTown()) { - recipients.remove(p.getPlayer()); - recipientCount--; - continue; - } - else if(!r.hasTown()) { - recipients.remove(p.getPlayer()); - recipientCount--; - continue; - } - else if(!(r.getTown().getName().equals(pp.getTown().getName()))) { - recipients.remove(p.getPlayer()); - recipientCount--; - continue; - } - } - if(eventChannel.getName().equalsIgnoreCase("Nation")) { - Resident r = towny.getResident(p.getName()); - Resident pp = towny.getResident(mcp.getName()); - if(!pp.hasNation()) { - recipients.remove(p.getPlayer()); - recipientCount--; - continue; - } - else if(!r.hasNation()) { - recipients.remove(p.getPlayer()); - recipientCount--; - continue; - } - else if(!(r.getTown().getNation().getName().equals(pp.getTown().getNation().getName()))) { - recipients.remove(p.getPlayer()); - recipientCount--; - continue; - } - } - } - catch(Exception ex) { - ex.printStackTrace(); - } - } - - if(plugin.getConfig().getBoolean("enable_factions_channel") && pluginManager.isPluginEnabled("Factions")) { - try { - if(eventChannel.getName().equalsIgnoreCase("Faction")) { - MPlayer mplayer = MPlayer.get(mcp.getPlayer()); - MPlayer mplayerp = MPlayer.get(p.getPlayer()); - if(!mplayer.hasFaction()) { - recipients.remove(p.getPlayer()); - recipientCount--; - } - else if(!mplayerp.hasFaction()) { - recipients.remove(p.getPlayer()); - recipientCount--; - } - else if(!(mplayer.getFactionName().equals(mplayerp.getFactionName()))) { - recipients.remove(p.getPlayer()); - recipientCount--; - } - } - } - catch(Exception ex) { - ex.printStackTrace(); - } - } - - if(chDistance > (double) 0 && !bungee && !p.getRangedSpy()) { - locreceip = p.getPlayer().getLocation(); - if(locreceip.getWorld() == mcp.getPlayer().getWorld()) { - diff = locreceip.subtract(locsender); - if(Math.abs(diff.getX()) > chDistance || Math.abs(diff.getZ()) > chDistance || Math.abs(diff.getY()) > chDistance) { - recipients.remove(p.getPlayer()); - recipientCount--; - continue; - } - if(!mcp.getPlayer().canSee(p.getPlayer())) { - recipientCount--; - continue; - } - } - else { - recipients.remove(p.getPlayer()); - recipientCount--; - continue; - } - } - if(!mcp.getPlayer().canSee(p.getPlayer())) { - recipientCount--; - continue; - } - } - } - - if(mcp.getPlayer().hasPermission("venturechat.color.legacy")) { - chat = Format.FormatStringLegacyColor(chat); - } - if(mcp.getPlayer().hasPermission("venturechat.color")) { - chat = Format.FormatStringColor(chat); - } - if(mcp.getPlayer().hasPermission("venturechat.format")) { - chat = Format.FormatString(chat); - } - if(!mcp.isQuickChat()) { - chat = " " + chat; - } - mcp.setQuickChat(false); - if(curColor.equalsIgnoreCase("None")) { - chat = Format.getLastCode(format) + chat; - } - else { - chat = curColor + chat; - } - - String globalJSON = Format.convertToJson(mcp, format, chat); - String consoleChat = format + chat; - String message = consoleChat.replaceAll("(\ufffd([a-z0-9]))", ""); // UTF-8 encoding issues. - int hash = message.hashCode(); - - //Create VentureChatEvent - VentureChatEvent ventureChatEvent = new VentureChatEvent(mcp, mcp.getName(), mcp.getNickname(), MineverseChat.getVaultPermission().getPrimaryGroup(mcp.getPlayer()), eventChannel, recipients, recipientCount, format, chat, globalJSON, hash, bungee); - //Fire event and wait for other plugin listeners to act on it - Bukkit.getServer().getPluginManager().callEvent(ventureChatEvent); - //Call method to send the processed chat - handleVentureChatEvent(ventureChatEvent); - } - - public void handleVentureChatEvent(VentureChatEvent event) { - MineverseChatPlayer mcp = event.getMineverseChatPlayer(); - ChatChannel channel = event.getChannel(); - Set recipients = event.getRecipients(); - int recipientCount = event.getRecipientCount(); - String format = event.getFormat(); - String chat = event.getChat(); - String consoleChat = event.getConsoleChat(); - String globalJSON = event.getGlobalJSON(); - int hash = event.getHash(); - boolean bungee = event.isBungee(); - - if(!bungee) { - if(Database.isEnabled()) { - Database.writeVentureChat(mcp.getUUID().toString(), mcp.getName(), "Local", channel.getName(), chat.replace("'", "''"), "Chat"); - } - - if(recipientCount == 1) { - if(!plugin.getConfig().getString("emptychannelalert", "&6No one is listening to you.").equals("")) { - mcp.getPlayer().sendMessage(Format.FormatStringAll(plugin.getConfig().getString("emptychannelalert", "&6No one is listening to you."))); - } - } - for(Player p : recipients) { - String json = Format.formatModerationGUI(globalJSON, p, mcp.getName(), channel.getName(), hash); - PacketContainer packet = Format.createPacketPlayOutChat(json); - Format.sendPacketPlayOutChat(p, packet); - } - Bukkit.getConsoleSender().sendMessage(consoleChat); - return; - } - else { - ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(byteOutStream); - try { - out.writeUTF("Chat"); - out.writeUTF(channel.getName()); - out.writeUTF(mcp.getName()); - out.writeUTF(mcp.getUUID().toString()); - out.writeBoolean(mcp.getBungeeToggle()); - out.writeInt(hash); - out.writeUTF(format); - out.writeUTF(chat); - if(plugin.getConfig().getString("loglevel", "info").equals("debug")) { - System.out.println(out.size() + " size bytes without json"); - } - out.writeUTF(globalJSON); - if(plugin.getConfig().getString("loglevel", "info").equals("debug")) { - System.out.println(out.size() + " bytes size with json"); - } - out.writeUTF(MineverseChat.getVaultPermission().getPrimaryGroup(mcp.getPlayer())); - out.writeUTF(mcp.getNickname()); - mcp.getPlayer().sendPluginMessage(plugin, MineverseChat.PLUGIN_MESSAGING_CHANNEL, byteOutStream.toByteArray()); - out.close(); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - } -} +package mineverse.Aust1n46.chat.listeners; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.util.Set; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.plugin.PluginManager; + +import com.comphenix.protocol.events.PacketContainer; +import com.massivecraft.factions.entity.MPlayer; +import com.palmergames.bukkit.towny.TownyUniverse; +import com.palmergames.bukkit.towny.object.Resident; + +import me.clip.placeholderapi.PlaceholderAPI; +import mineverse.Aust1n46.chat.MineverseChat; +import mineverse.Aust1n46.chat.api.MineverseChatAPI; +import mineverse.Aust1n46.chat.api.MineverseChatPlayer; +import mineverse.Aust1n46.chat.api.events.ChannelJoinEvent; +import mineverse.Aust1n46.chat.api.events.VentureChatEvent; +import mineverse.Aust1n46.chat.channel.ChatChannel; +import mineverse.Aust1n46.chat.command.mute.MuteContainer; +import mineverse.Aust1n46.chat.database.Database; +import mineverse.Aust1n46.chat.localization.LocalizedMessage; +import mineverse.Aust1n46.chat.utilities.Format; + +//This class listens to chat through the chat event and handles the bulk of the chat channels and formatting. +public class ChatListener implements Listener { + private MineverseChat plugin = MineverseChat.getInstance(); + + @EventHandler(priority = EventPriority.NORMAL) + public void onChannelJoin(ChannelJoinEvent event) { + + } + + // this event isn't always asynchronous even though the event's name starts with "Async" + // blame md_5 for that one + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onAsyncPlayerChatEvent(AsyncPlayerChatEvent event) { + event.setCancelled(true); + Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { + @Override + public void run() { + handleTrueAsyncPlayerChatEvent(event); + } + }); + } + + public void handleTrueAsyncPlayerChatEvent(AsyncPlayerChatEvent event) { + boolean bungee = false; + String chat = event.getMessage(); + String format; + Set recipients = event.getRecipients(); + int recipientCount = recipients.size(); // Don't count vanished players + MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(event.getPlayer()); + ChatChannel eventChannel = mcp.getCurrentChannel(); + + if(mcp.isEditing()) { + mcp.getPlayer().sendMessage(Format.FormatStringAll(chat)); + mcp.setEditing(false); + return; + } + + if(mcp.isQuickChat()) { + eventChannel = mcp.getQuickChannel(); + } + + if(mcp.hasConversation() && !mcp.isQuickChat()) { + MineverseChatPlayer tp = MineverseChatAPI.getMineverseChatPlayer(mcp.getConversation()); + if(!tp.isOnline()) { + mcp.getPlayer().sendMessage(ChatColor.RED + tp.getName() + " is not available."); + if(!mcp.getPlayer().hasPermission("venturechat.spy.override")) { + for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { + if(p.getName().equals(mcp.getName())) { + continue; + } + if(p.isSpy()) { + p.getPlayer().sendMessage(LocalizedMessage.EXIT_PRIVATE_CONVERSATION_SPY.toString() + .replace("{player_sender}", mcp.getName()) + .replace("{player_receiver}", tp.getName())); + } + } + } + mcp.setConversation(null); + } + else { + if(tp.getIgnores().contains(mcp.getUUID())) { + mcp.getPlayer().sendMessage(LocalizedMessage.IGNORING_MESSAGE.toString() + .replace("{player}", tp.getName())); + event.setCancelled(true); + return; + } + if(!tp.getMessageToggle()) { + mcp.getPlayer().sendMessage(LocalizedMessage.BLOCKING_MESSAGE.toString() + .replace("{player}", tp.getName())); + event.setCancelled(true); + return; + } + String filtered = chat; + String echo = ""; + String send = ""; + String spy = ""; + if(mcp.hasFilter()) { + filtered = Format.FilterChat(filtered); + } + if(mcp.getPlayer().hasPermission("venturechat.color.legacy")) { + filtered = Format.FormatStringLegacyColor(filtered); + } + if(mcp.getPlayer().hasPermission("venturechat.color")) { + filtered = Format.FormatStringColor(filtered); + } + if(mcp.getPlayer().hasPermission("venturechat.format")) { + filtered = Format.FormatString(filtered); + } + filtered = " " + filtered; + + send = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("tellformatfrom").replaceAll("sender_", ""))); + echo = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("tellformatto").replaceAll("sender_", ""))); + spy = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("tellformatspy").replaceAll("sender_", ""))); + + send = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(tp.getPlayer(), send.replaceAll("receiver_", ""))) + filtered; + echo = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(tp.getPlayer(), echo.replaceAll("receiver_", ""))) + filtered; + spy = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(tp.getPlayer(), spy.replaceAll("receiver_", ""))) + filtered; + + if(!mcp.getPlayer().hasPermission("venturechat.spy.override")) { + for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { + if(p.getName().equals(mcp.getName()) || p.getName().equals(tp.getName())) { + continue; + } + if(p.isSpy()) { + p.getPlayer().sendMessage(spy); + } + } + } + tp.getPlayer().sendMessage(send); + mcp.getPlayer().sendMessage(echo); + if(tp.hasNotifications()) { + Format.playMessageSound(tp); + } + mcp.setReplyPlayer(tp.getUUID()); + tp.setReplyPlayer(mcp.getUUID()); + if(Database.isEnabled()) { + Database.writeVentureChat(mcp.getUUID().toString(), mcp.getName(), "Local", "Messaging_Component", chat.replace("'", "''"), "Chat"); + } + } + return; + } + + if(mcp.isPartyChat() && !mcp.isQuickChat()) { + if(mcp.hasParty()) { + String partyformat = ""; + for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { + if((p.hasParty() && p.getParty().toString().equals(mcp.getParty().toString()) || p.isSpy())) { + String filtered = chat; + if(mcp.hasFilter()) { + filtered = Format.FilterChat(filtered); + } + if(mcp.getPlayer().hasPermission("venturechat.color.legacy")) { + filtered = Format.FormatStringLegacyColor(filtered); + } + if(mcp.getPlayer().hasPermission("venturechat.color")) { + filtered = Format.FormatStringColor(filtered); + } + if(mcp.getPlayer().hasPermission("venturechat.format")) { + filtered = Format.FormatString(filtered); + } + filtered = " " + filtered; + if(plugin.getConfig().getString("partyformat").equalsIgnoreCase("Default")) { + partyformat = ChatColor.GREEN + "[" + MineverseChatAPI.getMineverseChatPlayer(mcp.getParty()).getName() + "'s Party] " + mcp.getName() + ":" + filtered; + } + else { + partyformat = Format.FormatStringAll(plugin.getConfig().getString("partyformat").replace("{host}", MineverseChatAPI.getMineverseChatPlayer(mcp.getParty()).getName()).replace("{player}", mcp.getName())) + filtered; + } + p.getPlayer().sendMessage(partyformat); + } + } + Bukkit.getConsoleSender().sendMessage(partyformat); + if(Database.isEnabled()) { + Database.writeVentureChat(mcp.getUUID().toString(), mcp.getName(), "Local", "Party_Component", chat.replace("'", "''"), "Chat"); + } + return; + } + mcp.getPlayer().sendMessage(ChatColor.RED + "You are not in a party."); + return; + } + + Location locreceip; + Location locsender = mcp.getPlayer().getLocation(); + Location diff; + Boolean filterthis = true; + mcp.addListening(eventChannel.getName()); + if (mcp.isMuted(eventChannel.getName())) { + MuteContainer muteContainer = mcp.getMute(eventChannel.getName()); + if (muteContainer.hasDuration()) { + long dateTimeMillis = System.currentTimeMillis(); + long muteTimeMillis = muteContainer.getDuration(); + long remainingMuteTime = muteTimeMillis - dateTimeMillis; + if (remainingMuteTime < 1000) { + remainingMuteTime = 1000; + } + String timeString = Format.parseTimeStringFromMillis(remainingMuteTime); + if(muteContainer.hasReason()) { + mcp.getPlayer() + .sendMessage(LocalizedMessage.CHANNEL_MUTED_TIMED_REASON.toString() + .replace("{channel_color}", eventChannel.getColor()) + .replace("{channel_name}", eventChannel.getName()) + .replace("{time}", timeString) + .replace("{reason}", muteContainer.getReason())); + } + else { + mcp.getPlayer() + .sendMessage(LocalizedMessage.CHANNEL_MUTED_TIMED.toString() + .replace("{channel_color}", eventChannel.getColor()) + .replace("{channel_name}", eventChannel.getName()) + .replace("{time}", timeString)); + } + } + else { + if(muteContainer.hasReason()) { + mcp.getPlayer() + .sendMessage(LocalizedMessage.CHANNEL_MUTED_REASON.toString() + .replace("{channel_color}", eventChannel.getColor()) + .replace("{channel_name}", eventChannel.getName()) + .replace("{reason}", muteContainer.getReason())); + } + else { + mcp.getPlayer() + .sendMessage(LocalizedMessage.CHANNEL_MUTED.toString() + .replace("{channel_color}", eventChannel.getColor()) + .replace("{channel_name}", eventChannel.getName())); + } + } + mcp.setQuickChat(false); + return; + } + Double chDistance = (double) 0; + String curColor = ""; + if(eventChannel.hasPermission() && !mcp.getPlayer().hasPermission(eventChannel.getPermission())) { + mcp.getPlayer().sendMessage(LocalizedMessage.CHANNEL_NO_PERMISSION.toString()); + mcp.setQuickChat(false); + mcp.removeListening(eventChannel.getName()); + mcp.setCurrentChannel(ChatChannel.getDefaultChannel()); + return; + } + if(eventChannel.hasSpeakPermission() && !mcp.getPlayer().hasPermission(eventChannel.getSpeakPermission())) { + mcp.getPlayer().sendMessage(LocalizedMessage.CHANNEL_NO_SPEAK_PERMISSIONS.toString()); + mcp.setQuickChat(false); + return; + } + curColor = eventChannel.getChatColor(); + bungee = eventChannel.getBungee(); + + long dateTimeSeconds = System.currentTimeMillis() / Format.MILLISECONDS_PER_SECOND; + + int chCooldown = 0; + if(eventChannel.hasCooldown()) { + chCooldown = eventChannel.getCooldown(); + } + try { + if (mcp.hasCooldown(eventChannel)) { + long cooldownTime = mcp.getCooldowns().get(eventChannel).longValue(); + if (dateTimeSeconds < cooldownTime) { + long remainingCooldownTime = cooldownTime - dateTimeSeconds; + String cooldownString = Format.parseTimeStringFromMillis(remainingCooldownTime * Format.MILLISECONDS_PER_SECOND); + mcp.getPlayer().sendMessage(LocalizedMessage.CHANNEL_COOLDOWN.toString() + .replace("{cooldown}", cooldownString)); + mcp.setQuickChat(false); + bungee = false; + return; + } + } + if (eventChannel.hasCooldown()) { + if (!mcp.getPlayer().hasPermission("venturechat.cooldown.bypass")) { + mcp.addCooldown(eventChannel, dateTimeSeconds + chCooldown); + } + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } + + if (mcp.hasSpam(eventChannel) && plugin.getConfig().getConfigurationSection("antispam").getBoolean("enabled") + && !mcp.getPlayer().hasPermission("venturechat.spam.bypass")) { + long spamcount = mcp.getSpam().get(eventChannel).get(0); + long spamtime = mcp.getSpam().get(eventChannel).get(1); + long spamtimeconfig = plugin.getConfig().getConfigurationSection("antispam").getLong("spamnumber"); + String mutedForTime = plugin.getConfig().getConfigurationSection("antispam").getString("mutetime", "0"); + long dateTime = System.currentTimeMillis(); + if (dateTimeSeconds < spamtime + + plugin.getConfig().getConfigurationSection("antispam").getLong("spamtime")) { + if (spamcount + 1 >= spamtimeconfig) { + long time = Format.parseTimeStringToMillis(mutedForTime); + if (time > 0) { + mcp.addMute(eventChannel.getName(), dateTime + time, LocalizedMessage.SPAM_MUTE_REASON_TEXT.toString()); + String timeString = Format.parseTimeStringFromMillis(time); + mcp.getPlayer() + .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_TIME_REASON.toString() + .replace("{channel_color}", eventChannel.getColor()) + .replace("{channel_name}", eventChannel.getName()) + .replace("{time}", timeString) + .replace("{reason}", LocalizedMessage.SPAM_MUTE_REASON_TEXT.toString())); + } + else { + mcp.addMute(eventChannel.getName(), LocalizedMessage.SPAM_MUTE_REASON_TEXT.toString()); + mcp.getPlayer() + .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_REASON.toString() + .replace("{channel_color}", eventChannel.getColor()) + .replace("{channel_name}", eventChannel.getName()) + .replace("{reason}", LocalizedMessage.SPAM_MUTE_REASON_TEXT.toString())); + } + if(eventChannel.getBungee()) { + MineverseChat.synchronize(mcp, true); + } + mcp.getSpam().get(eventChannel).set(0, 0L); + mcp.setQuickChat(false); + return; + } else { + if (spamtimeconfig % 2 != 0) { + spamtimeconfig++; + } + if (spamcount + 1 == spamtimeconfig / 2) { + mcp.getPlayer().sendMessage(LocalizedMessage.SPAM_WARNING.toString()); + } + mcp.getSpam().get(eventChannel).set(0, spamcount + 1); + } + } else { + mcp.getSpam().get(eventChannel).set(0, 1L); + mcp.getSpam().get(eventChannel).set(1, dateTimeSeconds); + } + } else { + mcp.addSpam(eventChannel); + mcp.getSpam().get(eventChannel).add(0, 1L); + mcp.getSpam().get(eventChannel).add(1, dateTimeSeconds); + } + + if(eventChannel.hasDistance()) { + chDistance = eventChannel.getDistance(); + } + + format = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), Format.FormatStringAll(eventChannel.getFormat()))); + if(plugin.getConfig().getBoolean("formatcleaner", false)) { + format = format.replace("[]", " "); + format = format.replace(" ", " ").replace(" ", " ").replace(" ", " "); + } + + filterthis = eventChannel.isFiltered(); + if(filterthis) { + if(mcp.hasFilter()) { + chat = Format.FilterChat(chat); + } + } + PluginManager pluginManager = plugin.getServer().getPluginManager(); + for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { + if(p.getPlayer() != mcp.getPlayer()) { + if(!p.isListening(eventChannel.getName())) { + recipients.remove(p.getPlayer()); + recipientCount--; + continue; + } + if(plugin.getConfig().getBoolean("ignorechat", false) && p.getIgnores().contains(mcp.getUUID())) { + recipients.remove(p.getPlayer()); + recipientCount--; + continue; + } + if(plugin.getConfig().getBoolean("enable_towny_channel") && pluginManager.isPluginEnabled("Towny")) { + try { + TownyUniverse towny = TownyUniverse.getInstance(); + if(eventChannel.getName().equalsIgnoreCase("Town")) { + Resident r = towny.getResident(p.getName()); + Resident pp = towny.getResident(mcp.getName()); + if(!pp.hasTown()) { + recipients.remove(p.getPlayer()); + recipientCount--; + continue; + } + else if(!r.hasTown()) { + recipients.remove(p.getPlayer()); + recipientCount--; + continue; + } + else if(!(r.getTown().getName().equals(pp.getTown().getName()))) { + recipients.remove(p.getPlayer()); + recipientCount--; + continue; + } + } + if(eventChannel.getName().equalsIgnoreCase("Nation")) { + Resident r = towny.getResident(p.getName()); + Resident pp = towny.getResident(mcp.getName()); + if(!pp.hasNation()) { + recipients.remove(p.getPlayer()); + recipientCount--; + continue; + } + else if(!r.hasNation()) { + recipients.remove(p.getPlayer()); + recipientCount--; + continue; + } + else if(!(r.getTown().getNation().getName().equals(pp.getTown().getNation().getName()))) { + recipients.remove(p.getPlayer()); + recipientCount--; + continue; + } + } + } + catch(Exception ex) { + ex.printStackTrace(); + } + } + + if(plugin.getConfig().getBoolean("enable_factions_channel") && pluginManager.isPluginEnabled("Factions")) { + try { + if(eventChannel.getName().equalsIgnoreCase("Faction")) { + MPlayer mplayer = MPlayer.get(mcp.getPlayer()); + MPlayer mplayerp = MPlayer.get(p.getPlayer()); + if(!mplayer.hasFaction()) { + recipients.remove(p.getPlayer()); + recipientCount--; + } + else if(!mplayerp.hasFaction()) { + recipients.remove(p.getPlayer()); + recipientCount--; + } + else if(!(mplayer.getFactionName().equals(mplayerp.getFactionName()))) { + recipients.remove(p.getPlayer()); + recipientCount--; + } + } + } + catch(Exception ex) { + ex.printStackTrace(); + } + } + + if(chDistance > (double) 0 && !bungee && !p.getRangedSpy()) { + locreceip = p.getPlayer().getLocation(); + if(locreceip.getWorld() == mcp.getPlayer().getWorld()) { + diff = locreceip.subtract(locsender); + if(Math.abs(diff.getX()) > chDistance || Math.abs(diff.getZ()) > chDistance || Math.abs(diff.getY()) > chDistance) { + recipients.remove(p.getPlayer()); + recipientCount--; + continue; + } + if(!mcp.getPlayer().canSee(p.getPlayer())) { + recipientCount--; + continue; + } + } + else { + recipients.remove(p.getPlayer()); + recipientCount--; + continue; + } + } + if(!mcp.getPlayer().canSee(p.getPlayer())) { + recipientCount--; + continue; + } + } + } + + if(mcp.getPlayer().hasPermission("venturechat.color.legacy")) { + chat = Format.FormatStringLegacyColor(chat); + } + if(mcp.getPlayer().hasPermission("venturechat.color")) { + chat = Format.FormatStringColor(chat); + } + if(mcp.getPlayer().hasPermission("venturechat.format")) { + chat = Format.FormatString(chat); + } + if(!mcp.isQuickChat()) { + chat = " " + chat; + } + mcp.setQuickChat(false); + if(curColor.equalsIgnoreCase("None")) { + chat = Format.getLastCode(format) + chat; + } + else { + chat = curColor + chat; + } + + String globalJSON = Format.convertToJson(mcp, format, chat); + String consoleChat = format + chat; + String message = consoleChat.replaceAll("(\ufffd([a-z0-9]))", ""); // UTF-8 encoding issues. + int hash = message.hashCode(); + + //Create VentureChatEvent + VentureChatEvent ventureChatEvent = new VentureChatEvent(mcp, mcp.getName(), mcp.getNickname(), MineverseChat.getVaultPermission().getPrimaryGroup(mcp.getPlayer()), eventChannel, recipients, recipientCount, format, chat, globalJSON, hash, bungee); + //Fire event and wait for other plugin listeners to act on it + Bukkit.getServer().getPluginManager().callEvent(ventureChatEvent); + //Call method to send the processed chat + handleVentureChatEvent(ventureChatEvent); + } + + public void handleVentureChatEvent(VentureChatEvent event) { + MineverseChatPlayer mcp = event.getMineverseChatPlayer(); + ChatChannel channel = event.getChannel(); + Set recipients = event.getRecipients(); + int recipientCount = event.getRecipientCount(); + String format = event.getFormat(); + String chat = event.getChat(); + String consoleChat = event.getConsoleChat(); + String globalJSON = event.getGlobalJSON(); + int hash = event.getHash(); + boolean bungee = event.isBungee(); + + if(!bungee) { + if(Database.isEnabled()) { + Database.writeVentureChat(mcp.getUUID().toString(), mcp.getName(), "Local", channel.getName(), chat.replace("'", "''"), "Chat"); + } + + if(recipientCount == 1) { + if(!plugin.getConfig().getString("emptychannelalert", "&6No one is listening to you.").equals("")) { + mcp.getPlayer().sendMessage(Format.FormatStringAll(plugin.getConfig().getString("emptychannelalert", "&6No one is listening to you."))); + } + } + for(Player p : recipients) { + String json = Format.formatModerationGUI(globalJSON, p, mcp.getName(), channel.getName(), hash); + PacketContainer packet = Format.createPacketPlayOutChat(json); + Format.sendPacketPlayOutChat(p, packet); + } + Bukkit.getConsoleSender().sendMessage(consoleChat); + return; + } + else { + ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(byteOutStream); + try { + out.writeUTF("Chat"); + out.writeUTF(channel.getName()); + out.writeUTF(mcp.getName()); + out.writeUTF(mcp.getUUID().toString()); + out.writeBoolean(mcp.getBungeeToggle()); + out.writeInt(hash); + out.writeUTF(format); + out.writeUTF(chat); + if(plugin.getConfig().getString("loglevel", "info").equals("debug")) { + System.out.println(out.size() + " size bytes without json"); + } + out.writeUTF(globalJSON); + if(plugin.getConfig().getString("loglevel", "info").equals("debug")) { + System.out.println(out.size() + " bytes size with json"); + } + out.writeUTF(MineverseChat.getVaultPermission().getPrimaryGroup(mcp.getPlayer())); + out.writeUTF(mcp.getNickname()); + mcp.getPlayer().sendPluginMessage(plugin, MineverseChat.PLUGIN_MESSAGING_CHANNEL, byteOutStream.toByteArray()); + out.close(); + } + catch(Exception e) { + e.printStackTrace(); + } + return; + } + } +} diff --git a/src/main/java/mineverse/Aust1n46/chat/utilities/Format.java b/src/main/java/mineverse/Aust1n46/chat/utilities/Format.java index 5ace683..1f31093 100644 --- a/src/main/java/mineverse/Aust1n46/chat/utilities/Format.java +++ b/src/main/java/mineverse/Aust1n46/chat/utilities/Format.java @@ -1,915 +1,918 @@ -package mineverse.Aust1n46.chat.utilities; - -import static mineverse.Aust1n46.chat.MineverseChat.getInstance; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.StringTokenizer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Sound; -import org.bukkit.entity.Player; -import org.json.simple.JSONObject; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.wrappers.WrappedChatComponent; - -import me.clip.placeholderapi.PlaceholderAPI; -import mineverse.Aust1n46.chat.MineverseChat; -import mineverse.Aust1n46.chat.api.MineverseChatAPI; -import mineverse.Aust1n46.chat.api.MineverseChatPlayer; -import mineverse.Aust1n46.chat.json.JsonFormat; -import mineverse.Aust1n46.chat.localization.LocalizedMessage; -import mineverse.Aust1n46.chat.versions.VersionHandler; - -/** - * Class containing chat formatting methods. - */ -public class Format { - public static final int LEGACY_COLOR_CODE_LENGTH = 2; - public static final int HEX_COLOR_CODE_LENGTH = 14; - public static final String HEX_COLOR_CODE_PREFIX = "#"; - public static final char BUKKIT_COLOR_CODE_PREFIX_CHAR = '\u00A7'; - public static final String BUKKIT_COLOR_CODE_PREFIX = String.valueOf(BUKKIT_COLOR_CODE_PREFIX_CHAR); - public static final String BUKKIT_HEX_COLOR_CODE_PREFIX = "x"; - public static final String DEFAULT_COLOR_CODE = BUKKIT_COLOR_CODE_PREFIX + "f"; - - private static final Pattern LEGACY_CHAT_COLOR_DIGITS_PATTERN = Pattern.compile("&([0-9])"); - private static final Pattern LEGACY_CHAT_COLOR_PATTERN = Pattern.compile( - "(? a + 13) { - if (String.valueOf(ch[a + 3]).matches("[0123456789abcdefABCDEF]") - && String.valueOf(ch[a + 5]).matches("[0123456789abcdefABCDEF]") - && String.valueOf(ch[a + 7]).matches("[0123456789abcdefABCDEF]") - && String.valueOf(ch[a + 9]).matches("[0123456789abcdefABCDEF]") - && String.valueOf(ch[a + 11]).matches("[0123456789abcdefABCDEF]") - && String.valueOf(ch[a + 13]).matches("[0123456789abcdefABCDEF]") - && ch[a + 2] == BUKKIT_COLOR_CODE_PREFIX_CHAR && ch[a + 4] == BUKKIT_COLOR_CODE_PREFIX_CHAR - && ch[a + 6] == BUKKIT_COLOR_CODE_PREFIX_CHAR && ch[a + 8] == BUKKIT_COLOR_CODE_PREFIX_CHAR - && ch[a + 10] == BUKKIT_COLOR_CODE_PREFIX_CHAR - && ch[a + 12] == BUKKIT_COLOR_CODE_PREFIX_CHAR) { - ts = String.valueOf(ch[a]) + ch[a + 1] + ch[a + 2] + ch[a + 3] + ch[a + 4] + ch[a + 5] - + ch[a + 6] + ch[a + 7] + ch[a + 8] + ch[a + 9] + ch[a + 10] + ch[a + 11] + ch[a + 12] - + ch[a + 13]; - a += 13; - } - } - } - } - return ts; - } - - /** - * Converts a message to JSON colors with no additional JSON extensions. - * - * @param s - * @return {@link String} - */ - public static String convertToJsonColors(String s) { - return convertToJsonColors(s, ""); - } - - /** - * Converts a message to JSON colors with additional JSON extensions. - * - * @param s - * @param extensions - * @return {@link String} - */ - private static String convertToJsonColors(String s, String extensions) { - String remaining = s; - String temp = ""; - int indexColor = -1; - int indexNextColor = -1; - String color = ""; - String modifier = ""; - boolean bold = false; - boolean obfuscated = false; - boolean italic = false; - boolean strikethrough = false; - boolean underlined = false; - String previousColor = ""; - int colorLength = LEGACY_COLOR_CODE_LENGTH; - do { - if (remaining.length() < LEGACY_COLOR_CODE_LENGTH) { - temp = "{\"text\":\"" + remaining + "\"},"; - break; - } - modifier = ""; - indexColor = remaining.indexOf(BUKKIT_COLOR_CODE_PREFIX); - previousColor = color; - - color = remaining.substring(1, indexColor + LEGACY_COLOR_CODE_LENGTH); - if (color.equals(BUKKIT_HEX_COLOR_CODE_PREFIX)) { - if (remaining.length() >= HEX_COLOR_CODE_LENGTH) { - color = HEX_COLOR_CODE_PREFIX - + remaining.substring(LEGACY_COLOR_CODE_LENGTH, indexColor + HEX_COLOR_CODE_LENGTH) - .replace(BUKKIT_COLOR_CODE_PREFIX, ""); - colorLength = HEX_COLOR_CODE_LENGTH; - bold = false; - obfuscated = false; - italic = false; - strikethrough = false; - underlined = false; - } - } else if (!color.matches("[0123456789abcdefABCDEF]")) { - switch (color) { - case "l": - case "L": { - bold = true; - break; - } - case "k": - case "K": { - obfuscated = true; - break; - } - case "o": - case "O": { - italic = true; - break; - } - case "m": - case "M": { - strikethrough = true; - break; - } - case "n": - case "N": { - underlined = true; - break; - } - case "r": - case "R": { - bold = false; - obfuscated = false; - italic = false; - strikethrough = false; - underlined = false; - color = "f"; - break; - } - } - if (!color.equals("f")) - color = previousColor; - if (color.length() == 0) - color = "f"; - } else { - bold = false; - obfuscated = false; - italic = false; - strikethrough = false; - underlined = false; - } - if (bold) - modifier += ",\"bold\":\"true\""; - if (obfuscated) - modifier += ",\"obfuscated\":\"true\""; - if (italic) - modifier += ",\"italic\":\"true\""; - if (underlined) - modifier += ",\"underlined\":\"true\""; - if (strikethrough) - modifier += ",\"strikethrough\":\"true\""; - remaining = remaining.substring(colorLength); - colorLength = LEGACY_COLOR_CODE_LENGTH; - indexNextColor = remaining.indexOf(BUKKIT_COLOR_CODE_PREFIX); - if (indexNextColor == -1) { - indexNextColor = remaining.length(); - } - temp += "{\"text\":\"" + remaining.substring(0, indexNextColor) + "\",\"color\":\"" - + hexidecimalToJsonColorRGB(color) + "\"" + modifier + extensions + "},"; - remaining = remaining.substring(indexNextColor); - } while (remaining.length() > 1 && indexColor != -1); - if (temp.length() > 1) - temp = temp.substring(0, temp.length() - 1); - return temp; - } - - private static String hexidecimalToJsonColorRGB(String c) { - if (c.length() == 1) { - switch (c) { - case "0": - return "black"; - case "1": - return "dark_blue"; - case "2": - return "dark_green"; - case "3": - return "dark_aqua"; - case "4": - return "dark_red"; - case "5": - return "dark_purple"; - case "6": - return "gold"; - case "7": - return "gray"; - case "8": - return "dark_gray"; - case "9": - return "blue"; - case "a": - case "A": - return "green"; - case "b": - case "B": - return "aqua"; - case "c": - case "C": - return "red"; - case "d": - case "D": - return "light_purple"; - case "e": - case "E": - return "yellow"; - case "f": - case "F": - return "white"; - default: - return "white"; - } - } - if (isValidHexColor(c)) { - return c; - } - return "white"; - } - - public static String convertPlainTextToJson(String s, boolean convertURL) { - s = escapeJsonChars(s); - if (convertURL) { - return "[" + Format.convertLinks(s) + "]"; - } else { - return "[" + convertToJsonColors(DEFAULT_COLOR_CODE + s) + "]"; - } - } - - private static String escapeJsonChars(String s) { - return s.replace("\\", "\\\\").replace("\"", "\\\""); - } - - public static String formatModerationGUI(String json, Player player, String sender, String channelName, int hash) { - if (player.hasPermission("venturechat.gui")) { - json = json.substring(0, json.length() - 1); - json += "," + Format.convertToJsonColors(Format.FormatStringAll(getInstance().getConfig().getString("guiicon")), - ",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/vchatgui " + sender + " " + channelName - + " " + hash - + "\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[" - + Format.convertToJsonColors( - Format.FormatStringAll(getInstance().getConfig().getString("guitext"))) - + "]}}") - + "]"; - } - return json; - } - - public static PacketContainer createPacketPlayOutChat(String json) { - WrappedChatComponent component = WrappedChatComponent.fromJson(json); - PacketContainer container = new PacketContainer(PacketType.Play.Server.CHAT); - container.getModifier().writeDefaults(); - container.getChatComponents().write(0, component); - return container; - } - - public static PacketContainer createPacketPlayOutChat(WrappedChatComponent component) { - PacketContainer container = new PacketContainer(PacketType.Play.Server.CHAT); - container.getModifier().writeDefaults(); - container.getChatComponents().write(0, component); - return container; - } - - public static void sendPacketPlayOutChat(Player player, PacketContainer packet) { - try { - ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @SuppressWarnings("unchecked") - public static String toColoredText(Object o, Class c) { - if (VersionHandler.is1_7()) { - return "\"extra\":[{\"text\":\"Hover to see original message is not currently supported in 1.7\",\"color\":\"red\"}]"; - } - List finalList = new ArrayList<>(); - StringBuilder stringbuilder = new StringBuilder(); - stringbuilder.append("\"extra\":["); - try { - splitComponents(finalList, o, c); - for (Object component : finalList) { - try { - String text = (String) component.getClass().getMethod("getText").invoke(component); - Object chatModifier = component.getClass().getMethod("getChatModifier").invoke(component); - String color = chatModifier.getClass().getMethod("getColor").invoke(chatModifier).toString(); - boolean bold = (boolean) chatModifier.getClass().getMethod("isBold").invoke(chatModifier); - boolean strikethrough = (boolean) chatModifier.getClass().getMethod("isStrikethrough").invoke(chatModifier); - boolean italic = (boolean) chatModifier.getClass().getMethod("isItalic").invoke(chatModifier); - boolean underlined = (boolean) chatModifier.getClass().getMethod("isUnderlined").invoke(chatModifier); - boolean obfuscated = (boolean) chatModifier.getClass().getMethod("isRandom").invoke(chatModifier); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("text", text); - jsonObject.put("color", color); - jsonObject.put("bold", bold); - jsonObject.put("strikethrough", strikethrough); - jsonObject.put("italic", italic); - jsonObject.put("underlined", underlined); - jsonObject.put("obfuscated", obfuscated); - stringbuilder.append(jsonObject.toJSONString() + ","); - } - catch(Exception e) { - return "\"extra\":[{\"text\":\"Something went wrong. Could not access color.\",\"color\":\"red\"}]"; - } - } - } catch (Exception e) { - e.printStackTrace(); - } - String coloredText = stringbuilder.toString(); - if(coloredText.endsWith(",")) { - coloredText = coloredText.substring(0, coloredText.length() - 1); - } - coloredText += "]"; - return coloredText; - } - - public static String toPlainText(Object o, Class c) { - List finalList = new ArrayList<>(); - StringBuilder stringbuilder = new StringBuilder(); - try { - splitComponents(finalList, o, c); - for (Object component : finalList) { - if (VersionHandler.is1_7()) { - stringbuilder.append((String) component.getClass().getMethod("e").invoke(component)); - } else { - stringbuilder.append((String) component.getClass().getMethod("getText").invoke(component)); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - // if(plugin.getConfig().getString("loglevel", "info").equals("debug")) { - // System.out.println("my string"); - // System.out.println("my string"); - // System.out.println("my string"); - // System.out.println("my string"); - // System.out.println("my string"); - // System.out.println(stringbuilder.toString()); - // } - return stringbuilder.toString(); - } - - private static void splitComponents(List finalList, Object o, Class c) throws Exception { -// for(Method m : c.getMethods()) { -// System.out.println(m.getName()); -// } - - if (VersionHandler.is1_7() || VersionHandler.is1_8() || VersionHandler.is1_9() || VersionHandler.is1_10() - || VersionHandler.is1_11() || VersionHandler.is1_12() || VersionHandler.is1_13() - || (VersionHandler.is1_14() && !VersionHandler.is1_14_4())) { - ArrayList list = (ArrayList) c.getMethod("a").invoke(o, new Object[0]); - for (Object component : list) { - ArrayList innerList = (ArrayList) c.getMethod("a").invoke(component, new Object[0]); - if (innerList.size() > 0) { - splitComponents(finalList, component, c); - } else { - finalList.add(component); - } - } - } else { - ArrayList list = (ArrayList) c.getMethod("getSiblings").invoke(o, new Object[0]); - for (Object component : list) { - ArrayList innerList = (ArrayList) c.getMethod("getSiblings").invoke(component, new Object[0]); - if (innerList.size() > 0) { - splitComponents(finalList, component, c); - } else { - finalList.add(component); - } - } - } - } - - /** - * Formats a string with both Spigot legacy colors codes and Spigot and - * VentureChat hex color codes. - * - * @param string to format. - * @return {@link String} - */ - public static String FormatStringColor(String string) { - String allFormated = string; - allFormated = LEGACY_CHAT_COLOR_DIGITS_PATTERN.matcher(allFormated).replaceAll("\u00A7$1"); - - allFormated = allFormated.replaceAll("&[x]", BUKKIT_COLOR_CODE_PREFIX + "x"); - allFormated = allFormated.replaceAll("&[aA]", BUKKIT_COLOR_CODE_PREFIX + "a"); - allFormated = allFormated.replaceAll("&[bB]", BUKKIT_COLOR_CODE_PREFIX + "b"); - allFormated = allFormated.replaceAll("&[cC]", BUKKIT_COLOR_CODE_PREFIX + "c"); - allFormated = allFormated.replaceAll("&[dD]", BUKKIT_COLOR_CODE_PREFIX + "d"); - allFormated = allFormated.replaceAll("&[eE]", BUKKIT_COLOR_CODE_PREFIX + "e"); - allFormated = allFormated.replaceAll("&[fF]", BUKKIT_COLOR_CODE_PREFIX + "f"); - - allFormated = allFormated.replaceAll("%", "\\%"); - - allFormated = convertHexColorCodeStringToBukkitColorCodeString(allFormated); - return allFormated; - } - - /** - * Formats a string with only legacy Spigot color codes &[0-9a-f]. Does not - * format the legacy color codes that make up a Spigot hex color code. - * - * @param string to format. - * @return {@link String} - */ - public static String FormatStringLegacyColor(String string) { - String allFormated = string; - - allFormated = LEGACY_CHAT_COLOR_PATTERN.matcher(allFormated).replaceAll("\u00A7$13"); - allFormated = allFormated.replaceAll(BUKKIT_COLOR_CODE_PREFIX + "[A]", BUKKIT_COLOR_CODE_PREFIX + "a"); - allFormated = allFormated.replaceAll(BUKKIT_COLOR_CODE_PREFIX + "[B]", BUKKIT_COLOR_CODE_PREFIX + "b"); - allFormated = allFormated.replaceAll(BUKKIT_COLOR_CODE_PREFIX + "[C]", BUKKIT_COLOR_CODE_PREFIX + "c"); - allFormated = allFormated.replaceAll(BUKKIT_COLOR_CODE_PREFIX + "[D]", BUKKIT_COLOR_CODE_PREFIX + "d"); - allFormated = allFormated.replaceAll(BUKKIT_COLOR_CODE_PREFIX + "[E]", BUKKIT_COLOR_CODE_PREFIX + "e"); - allFormated = allFormated.replaceAll(BUKKIT_COLOR_CODE_PREFIX + "[F]", BUKKIT_COLOR_CODE_PREFIX + "f"); - - allFormated = allFormated.replaceAll("%", "\\%"); - return allFormated; - } - - /** - * Formats a string with Spigot formatting codes. - * - * @param string to format. - * @return {@link String} - */ - public static String FormatString(String string) { - String allFormated = string; - allFormated = allFormated.replaceAll("&[kK]", BUKKIT_COLOR_CODE_PREFIX + "k"); - allFormated = allFormated.replaceAll("&[lL]", BUKKIT_COLOR_CODE_PREFIX + "l"); - allFormated = allFormated.replaceAll("&[mM]", BUKKIT_COLOR_CODE_PREFIX + "m"); - allFormated = allFormated.replaceAll("&[nN]", BUKKIT_COLOR_CODE_PREFIX + "n"); - allFormated = allFormated.replaceAll("&[oO]", BUKKIT_COLOR_CODE_PREFIX + "o"); - allFormated = allFormated.replaceAll("&[rR]", BUKKIT_COLOR_CODE_PREFIX + "r"); - - allFormated = allFormated.replaceAll("%", "\\%"); - return allFormated; - } - - /** - * Formats a string with Spigot legacy colors codes, Spigot and VentureChat hex - * color codes, and Spigot formatting codes. - * - * @param string to format. - * @return {@link String} - */ - public static String FormatStringAll(String string) { - String allFormated = Format.FormatString(string); - allFormated = Format.FormatStringColor(allFormated); - return allFormated; - } - - public static String FilterChat(String msg) { - int t = 0; - List filters = getInstance().getConfig().getStringList("filters"); - for (String s : filters) { - t = 0; - String[] pparse = new String[2]; - pparse[0] = " "; - pparse[1] = " "; - StringTokenizer st = new StringTokenizer(s, ","); - while (st.hasMoreTokens()) { - if (t < 2) { - pparse[t++] = st.nextToken(); - } - } - // (?i) = case insensitive - msg = msg.replaceAll("(?i)" + pparse[0], pparse[1]); - } - return msg; - } - - public static boolean isValidColor(String color) { - Boolean bFound = false; - for (ChatColor bkColors : ChatColor.values()) { - if (color.equalsIgnoreCase(bkColors.name())) { - bFound = true; - } - } - return bFound; - } - - /** - * Validates a hex color code. - * - * @param color to validate. - * @return true if color code is valid, false otherwise. - */ - public static boolean isValidHexColor(String color) { - Pattern pattern = Pattern.compile("(^&?#[0-9a-fA-F]{6}\\b)"); - Matcher matcher = pattern.matcher(color); - return matcher.find(); - } - - /** - * Convert a single hex color code to a single Bukkit hex color code. - * - * @param color to convert. - * @return {@link String} - */ - public static String convertHexColorCodeToBukkitColorCode(String color) { - color = color.replace("&", ""); - StringBuilder bukkitColorCode = new StringBuilder(BUKKIT_COLOR_CODE_PREFIX + BUKKIT_HEX_COLOR_CODE_PREFIX); - for (int a = 1; a < color.length(); a++) { - bukkitColorCode.append(BUKKIT_COLOR_CODE_PREFIX + color.charAt(a)); - } - return bukkitColorCode.toString().toLowerCase(); - } - - /** - * Convert an entire String of hex color codes to Bukkit hex color codes. - * - * @param string to convert. - * @return {@link String} - */ - public static String convertHexColorCodeStringToBukkitColorCodeString(String string) { - Pattern pattern = Pattern.compile("(&?#[0-9a-fA-F]{6})"); - Matcher matcher = pattern.matcher(string); - while (matcher.find()) { - int indexStart = matcher.start(); - int indexEnd = matcher.end(); - String hexColor = string.substring(indexStart, indexEnd); - String bukkitColor = convertHexColorCodeToBukkitColorCode(hexColor); - string = string.replaceAll(hexColor, bukkitColor); - matcher.reset(string); - } - return string; - } - - public static String escapeAllRegex(String input) { - return input.replace("[", "\\[").replace("]", "\\]").replace("{", "\\{").replace("}", "\\}").replace("(", "\\(") - .replace(")", "\\)").replace("|", "\\|").replace("+", "\\+").replace("*", "\\*"); - } - - public static boolean underlineURLs() { - return getInstance().getConfig().getBoolean("underlineurls", true); - } - - public static String parseTimeStringFromMillis(long millis) { - String timeString = ""; - if(millis >= Format.MILLISECONDS_PER_DAY) { - long numberOfDays = millis / Format.MILLISECONDS_PER_DAY; - millis -= Format.MILLISECONDS_PER_DAY * numberOfDays; - - String units = LocalizedMessage.UNITS_DAY_PLURAL.toString(); - if (numberOfDays == 1) { - units = LocalizedMessage.UNITS_DAY_SINGULAR.toString(); - } - timeString += numberOfDays + " " + units + " "; - } - - if(millis >= Format.MILLISECONDS_PER_HOUR) { - long numberOfHours = millis / Format.MILLISECONDS_PER_HOUR; - millis -= Format.MILLISECONDS_PER_HOUR * numberOfHours; - - String units = LocalizedMessage.UNITS_HOUR_PLURAL.toString(); - if (numberOfHours == 1) { - units = LocalizedMessage.UNITS_HOUR_SINGULAR.toString(); - } - timeString += numberOfHours + " " + units + " "; - } - - if(millis >= Format.MILLISECONDS_PER_MINUTE) { - long numberOfMinutes = millis / Format.MILLISECONDS_PER_MINUTE; - millis -= Format.MILLISECONDS_PER_MINUTE * numberOfMinutes; - - String units = LocalizedMessage.UNITS_MINUTE_PLURAL.toString(); - if (numberOfMinutes == 1) { - units = LocalizedMessage.UNITS_MINUTE_SINGULAR.toString(); - } - timeString += numberOfMinutes + " " + units + " "; - } - - if(millis >= Format.MILLISECONDS_PER_SECOND) { - long numberOfSeconds = millis / Format.MILLISECONDS_PER_SECOND; - millis -= Format.MILLISECONDS_PER_SECOND * numberOfSeconds; - - String units = LocalizedMessage.UNITS_SECOND_PLURAL.toString(); - if (numberOfSeconds == 1) { - units = LocalizedMessage.UNITS_SECOND_SINGULAR.toString(); - } - timeString += numberOfSeconds + " " + units; - } - return timeString.trim(); - } - - public static long parseTimeStringToMillis(String timeInput) { - long millis = 0L; - timeInput = timeInput.toLowerCase(); - char validChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'd', 'h', 'm', 's' }; - if(containsInvalidChars(validChars, timeInput)) { - return -1; - } - - long countDayTokens = timeInput.chars().filter(ch -> ch == 'd').count(); - long countHourTokens = timeInput.chars().filter(ch -> ch == 'h').count(); - long countMinuteTokens = timeInput.chars().filter(ch -> ch == 'm').count(); - long countSecondTokens = timeInput.chars().filter(ch -> ch == 's').count(); - if(countDayTokens > 1 || countHourTokens > 1 || countMinuteTokens > 1 || countSecondTokens > 1) { - return -1; - } - - int indexOfSecondToken = timeInput.indexOf("s"); - int indexOfMinuteToken = timeInput.indexOf("m"); - int indexOfHourToken = timeInput.indexOf("h"); - int indexOfDayToken = timeInput.indexOf("d"); - if(indexOfDayToken != -1) { - if((indexOfHourToken != -1 && indexOfHourToken < indexOfDayToken) || (indexOfMinuteToken != -1 && indexOfMinuteToken < indexOfDayToken) || (indexOfSecondToken != -1 && indexOfSecondToken < indexOfDayToken)) { - return -1; - } - } - if(indexOfHourToken != -1) { - if((indexOfMinuteToken != -1 && indexOfMinuteToken < indexOfHourToken) || (indexOfSecondToken != -1 && indexOfSecondToken < indexOfHourToken)) { - return -1; - } - } - if(indexOfMinuteToken != -1) { - if((indexOfSecondToken != -1 && indexOfSecondToken < indexOfMinuteToken)) { - return -1; - } - } - - if(indexOfDayToken != -1) { - int numberOfDays = Integer.parseInt(timeInput.substring(0, indexOfDayToken)); - timeInput = timeInput.substring(indexOfDayToken + 1); - millis += MILLISECONDS_PER_DAY * numberOfDays; - } - if(timeInput.length() > 0) { - indexOfHourToken = timeInput.indexOf("h"); - if(indexOfHourToken != -1) { - int numberOfHours = Integer.parseInt(timeInput.substring(0, indexOfHourToken)); - timeInput = timeInput.substring(indexOfHourToken + 1); - millis += MILLISECONDS_PER_HOUR * numberOfHours; - } - } - if(timeInput.length() > 0) { - indexOfMinuteToken = timeInput.indexOf("m"); - if(indexOfMinuteToken != -1) { - int numberOfMinutes = Integer.parseInt(timeInput.substring(0, indexOfMinuteToken)); - timeInput = timeInput.substring(indexOfMinuteToken + 1); - millis += MILLISECONDS_PER_MINUTE * numberOfMinutes; - } - } - if(timeInput.length() > 0) { - indexOfSecondToken = timeInput.indexOf("s"); - if(indexOfSecondToken != -1) { - int numberOfSeconds = Integer.parseInt(timeInput.substring(0, indexOfSecondToken)); - timeInput = timeInput.substring(indexOfSecondToken + 1); - millis += MILLISECONDS_PER_SECOND * numberOfSeconds; - } - } - return millis; - } - - private static boolean containsInvalidChars(char[] validChars, String validate) { - for(char c : validate.toCharArray()) { - boolean isValidChar = false; - for(char v : validChars) { - if(c == v) { - isValidChar = true; - } - } - if(!isValidChar) { - return true; - } - } - return false; - } - - public static void broadcastToServer(String message) { - for(MineverseChatPlayer mcp : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - mcp.getPlayer().sendMessage(message); - } - } - - public static void playMessageSound(MineverseChatPlayer mcp) { - Player player = mcp.getPlayer(); - Sound messageSound = getSound(getInstance().getConfig().getString("message_sound", DEFAULT_MESSAGE_SOUND)); - player.playSound(player.getLocation(), messageSound, 1, 0); - } - - private static Sound getSound(String soundName) { - if(Arrays.asList(Sound.values()).stream().map(Sound::toString).collect(Collectors.toList()).contains(soundName)) { - return Sound.valueOf(soundName); - } - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Message sound invalid!")); - return getDefaultMessageSound(); - } - - private static Sound getDefaultMessageSound() { - if(VersionHandler.is1_7() || VersionHandler.is1_8()) { - return Sound.valueOf(DEFAULT_LEGACY_MESSAGE_SOUND); - } - else { - return Sound.valueOf(DEFAULT_MESSAGE_SOUND); - } - } -} +package mineverse.Aust1n46.chat.utilities; + +import static mineverse.Aust1n46.chat.MineverseChat.getInstance; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.StringTokenizer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.json.simple.JSONObject; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.wrappers.WrappedChatComponent; + +import me.clip.placeholderapi.PlaceholderAPI; +import mineverse.Aust1n46.chat.MineverseChat; +import mineverse.Aust1n46.chat.api.MineverseChatAPI; +import mineverse.Aust1n46.chat.api.MineverseChatPlayer; +import mineverse.Aust1n46.chat.json.JsonFormat; +import mineverse.Aust1n46.chat.localization.LocalizedMessage; +import mineverse.Aust1n46.chat.versions.VersionHandler; + +/** + * Class containing chat formatting methods. + */ +public class Format { + public static final int LEGACY_COLOR_CODE_LENGTH = 2; + public static final int HEX_COLOR_CODE_LENGTH = 14; + public static final String HEX_COLOR_CODE_PREFIX = "#"; + public static final char BUKKIT_COLOR_CODE_PREFIX_CHAR = '\u00A7'; + public static final String BUKKIT_COLOR_CODE_PREFIX = String.valueOf(BUKKIT_COLOR_CODE_PREFIX_CHAR); + public static final String BUKKIT_HEX_COLOR_CODE_PREFIX = "x"; + public static final String DEFAULT_COLOR_CODE = BUKKIT_COLOR_CODE_PREFIX + "f"; + + private static final Pattern LEGACY_CHAT_COLOR_DIGITS_PATTERN = Pattern.compile("&([0-9])"); + private static final Pattern LEGACY_CHAT_COLOR_PATTERN = Pattern.compile( + "(? a + 13) { + if (String.valueOf(ch[a + 3]).matches("[0123456789abcdefABCDEF]") + && String.valueOf(ch[a + 5]).matches("[0123456789abcdefABCDEF]") + && String.valueOf(ch[a + 7]).matches("[0123456789abcdefABCDEF]") + && String.valueOf(ch[a + 9]).matches("[0123456789abcdefABCDEF]") + && String.valueOf(ch[a + 11]).matches("[0123456789abcdefABCDEF]") + && String.valueOf(ch[a + 13]).matches("[0123456789abcdefABCDEF]") + && ch[a + 2] == BUKKIT_COLOR_CODE_PREFIX_CHAR && ch[a + 4] == BUKKIT_COLOR_CODE_PREFIX_CHAR + && ch[a + 6] == BUKKIT_COLOR_CODE_PREFIX_CHAR && ch[a + 8] == BUKKIT_COLOR_CODE_PREFIX_CHAR + && ch[a + 10] == BUKKIT_COLOR_CODE_PREFIX_CHAR + && ch[a + 12] == BUKKIT_COLOR_CODE_PREFIX_CHAR) { + ts = String.valueOf(ch[a]) + ch[a + 1] + ch[a + 2] + ch[a + 3] + ch[a + 4] + ch[a + 5] + + ch[a + 6] + ch[a + 7] + ch[a + 8] + ch[a + 9] + ch[a + 10] + ch[a + 11] + ch[a + 12] + + ch[a + 13]; + a += 13; + } + } + } + } + return ts; + } + + /** + * Converts a message to JSON colors with no additional JSON extensions. + * + * @param s + * @return {@link String} + */ + public static String convertToJsonColors(String s) { + return convertToJsonColors(s, ""); + } + + /** + * Converts a message to JSON colors with additional JSON extensions. + * + * @param s + * @param extensions + * @return {@link String} + */ + private static String convertToJsonColors(String s, String extensions) { + String remaining = s; + String temp = ""; + int indexColor = -1; + int indexNextColor = -1; + String color = ""; + String modifier = ""; + boolean bold = false; + boolean obfuscated = false; + boolean italic = false; + boolean strikethrough = false; + boolean underlined = false; + String previousColor = ""; + int colorLength = LEGACY_COLOR_CODE_LENGTH; + do { + if (remaining.length() < LEGACY_COLOR_CODE_LENGTH) { + temp = "{\"text\":\"" + remaining + "\"},"; + break; + } + modifier = ""; + indexColor = remaining.indexOf(BUKKIT_COLOR_CODE_PREFIX); + previousColor = color; + + color = remaining.substring(1, indexColor + LEGACY_COLOR_CODE_LENGTH); + if (color.equals(BUKKIT_HEX_COLOR_CODE_PREFIX)) { + if (remaining.length() >= HEX_COLOR_CODE_LENGTH) { + color = HEX_COLOR_CODE_PREFIX + + remaining.substring(LEGACY_COLOR_CODE_LENGTH, indexColor + HEX_COLOR_CODE_LENGTH) + .replace(BUKKIT_COLOR_CODE_PREFIX, ""); + colorLength = HEX_COLOR_CODE_LENGTH; + bold = false; + obfuscated = false; + italic = false; + strikethrough = false; + underlined = false; + } + } else if (!color.matches("[0123456789abcdefABCDEF]")) { + switch (color) { + case "l": + case "L": { + bold = true; + break; + } + case "k": + case "K": { + obfuscated = true; + break; + } + case "o": + case "O": { + italic = true; + break; + } + case "m": + case "M": { + strikethrough = true; + break; + } + case "n": + case "N": { + underlined = true; + break; + } + case "r": + case "R": { + bold = false; + obfuscated = false; + italic = false; + strikethrough = false; + underlined = false; + color = "f"; + break; + } + } + if (!color.equals("f")) + color = previousColor; + if (color.length() == 0) + color = "f"; + } else { + bold = false; + obfuscated = false; + italic = false; + strikethrough = false; + underlined = false; + } + if (bold) + modifier += ",\"bold\":\"true\""; + if (obfuscated) + modifier += ",\"obfuscated\":\"true\""; + if (italic) + modifier += ",\"italic\":\"true\""; + if (underlined) + modifier += ",\"underlined\":\"true\""; + if (strikethrough) + modifier += ",\"strikethrough\":\"true\""; + remaining = remaining.substring(colorLength); + colorLength = LEGACY_COLOR_CODE_LENGTH; + indexNextColor = remaining.indexOf(BUKKIT_COLOR_CODE_PREFIX); + if (indexNextColor == -1) { + indexNextColor = remaining.length(); + } + temp += "{\"text\":\"" + remaining.substring(0, indexNextColor) + "\",\"color\":\"" + + hexidecimalToJsonColorRGB(color) + "\"" + modifier + extensions + "},"; + remaining = remaining.substring(indexNextColor); + } while (remaining.length() > 1 && indexColor != -1); + if (temp.length() > 1) + temp = temp.substring(0, temp.length() - 1); + return temp; + } + + private static String hexidecimalToJsonColorRGB(String c) { + if (c.length() == 1) { + switch (c) { + case "0": + return "black"; + case "1": + return "dark_blue"; + case "2": + return "dark_green"; + case "3": + return "dark_aqua"; + case "4": + return "dark_red"; + case "5": + return "dark_purple"; + case "6": + return "gold"; + case "7": + return "gray"; + case "8": + return "dark_gray"; + case "9": + return "blue"; + case "a": + case "A": + return "green"; + case "b": + case "B": + return "aqua"; + case "c": + case "C": + return "red"; + case "d": + case "D": + return "light_purple"; + case "e": + case "E": + return "yellow"; + case "f": + case "F": + return "white"; + default: + return "white"; + } + } + if (isValidHexColor(c)) { + return c; + } + return "white"; + } + + public static String convertPlainTextToJson(String s, boolean convertURL) { + s = escapeJsonChars(s); + if (convertURL) { + return "[" + Format.convertLinks(s) + "]"; + } else { + return "[" + convertToJsonColors(DEFAULT_COLOR_CODE + s) + "]"; + } + } + + private static String escapeJsonChars(String s) { + return s.replace("\\", "\\\\").replace("\"", "\\\""); + } + + public static String formatModerationGUI(String json, Player player, String sender, String channelName, int hash) { + if (player.hasPermission("venturechat.gui")) { + json = json.substring(0, json.length() - 1); + json += "," + Format.convertToJsonColors(Format.FormatStringAll(getInstance().getConfig().getString("guiicon")), + ",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/vchatgui " + sender + " " + channelName + + " " + hash + + "\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[" + + Format.convertToJsonColors( + Format.FormatStringAll(getInstance().getConfig().getString("guitext"))) + + "]}}") + + "]"; + } + return json; + } + + public static PacketContainer createPacketPlayOutChat(String json) { + WrappedChatComponent component = WrappedChatComponent.fromJson(json); + PacketContainer container = new PacketContainer(PacketType.Play.Server.CHAT); + container.getModifier().writeDefaults(); + container.getChatComponents().write(0, component); + return container; + } + + public static PacketContainer createPacketPlayOutChat(WrappedChatComponent component) { + PacketContainer container = new PacketContainer(PacketType.Play.Server.CHAT); + container.getModifier().writeDefaults(); + container.getChatComponents().write(0, component); + return container; + } + + public static void sendPacketPlayOutChat(Player player, PacketContainer packet) { + try { + ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @SuppressWarnings("unchecked") + public static String toColoredText(Object o, Class c) { + if (VersionHandler.is1_7()) { + return "\"extra\":[{\"text\":\"Hover to see original message is not currently supported in 1.7\",\"color\":\"red\"}]"; + } + List finalList = new ArrayList<>(); + StringBuilder stringbuilder = new StringBuilder(); + stringbuilder.append("\"extra\":["); + try { + splitComponents(finalList, o, c); + for (Object component : finalList) { + try { + String text = (String) component.getClass().getMethod("getText").invoke(component); + Object chatModifier = component.getClass().getMethod("getChatModifier").invoke(component); + String color = chatModifier.getClass().getMethod("getColor").invoke(chatModifier).toString(); + boolean bold = (boolean) chatModifier.getClass().getMethod("isBold").invoke(chatModifier); + boolean strikethrough = (boolean) chatModifier.getClass().getMethod("isStrikethrough").invoke(chatModifier); + boolean italic = (boolean) chatModifier.getClass().getMethod("isItalic").invoke(chatModifier); + boolean underlined = (boolean) chatModifier.getClass().getMethod("isUnderlined").invoke(chatModifier); + boolean obfuscated = (boolean) chatModifier.getClass().getMethod("isRandom").invoke(chatModifier); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("text", text); + jsonObject.put("color", color); + jsonObject.put("bold", bold); + jsonObject.put("strikethrough", strikethrough); + jsonObject.put("italic", italic); + jsonObject.put("underlined", underlined); + jsonObject.put("obfuscated", obfuscated); + stringbuilder.append(jsonObject.toJSONString() + ","); + } + catch(Exception e) { + return "\"extra\":[{\"text\":\"Something went wrong. Could not access color.\",\"color\":\"red\"}]"; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + String coloredText = stringbuilder.toString(); + if(coloredText.endsWith(",")) { + coloredText = coloredText.substring(0, coloredText.length() - 1); + } + coloredText += "]"; + return coloredText; + } + + public static String toPlainText(Object o, Class c) { + List finalList = new ArrayList<>(); + StringBuilder stringbuilder = new StringBuilder(); + try { + splitComponents(finalList, o, c); + for (Object component : finalList) { + if (VersionHandler.is1_7()) { + stringbuilder.append((String) component.getClass().getMethod("e").invoke(component)); + } else { + stringbuilder.append((String) component.getClass().getMethod("getText").invoke(component)); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + // if(plugin.getConfig().getString("loglevel", "info").equals("debug")) { + // System.out.println("my string"); + // System.out.println("my string"); + // System.out.println("my string"); + // System.out.println("my string"); + // System.out.println("my string"); + // System.out.println(stringbuilder.toString()); + // } + return stringbuilder.toString(); + } + + private static void splitComponents(List finalList, Object o, Class c) throws Exception { +// for(Method m : c.getMethods()) { +// System.out.println(m.getName()); +// } + + if (VersionHandler.is1_7() || VersionHandler.is1_8() || VersionHandler.is1_9() || VersionHandler.is1_10() + || VersionHandler.is1_11() || VersionHandler.is1_12() || VersionHandler.is1_13() + || (VersionHandler.is1_14() && !VersionHandler.is1_14_4())) { + ArrayList list = (ArrayList) c.getMethod("a").invoke(o, new Object[0]); + for (Object component : list) { + ArrayList innerList = (ArrayList) c.getMethod("a").invoke(component, new Object[0]); + if (innerList.size() > 0) { + splitComponents(finalList, component, c); + } else { + finalList.add(component); + } + } + } else { + ArrayList list = (ArrayList) c.getMethod("getSiblings").invoke(o, new Object[0]); + for (Object component : list) { + ArrayList innerList = (ArrayList) c.getMethod("getSiblings").invoke(component, new Object[0]); + if (innerList.size() > 0) { + splitComponents(finalList, component, c); + } else { + finalList.add(component); + } + } + } + } + + /** + * Formats a string with both Spigot legacy colors codes and Spigot and + * VentureChat hex color codes. + * + * @param string to format. + * @return {@link String} + */ + public static String FormatStringColor(String string) { + String allFormated = string; + allFormated = LEGACY_CHAT_COLOR_DIGITS_PATTERN.matcher(allFormated).replaceAll("\u00A7$1"); + + allFormated = allFormated.replaceAll("&[x]", BUKKIT_COLOR_CODE_PREFIX + "x"); + allFormated = allFormated.replaceAll("&[aA]", BUKKIT_COLOR_CODE_PREFIX + "a"); + allFormated = allFormated.replaceAll("&[bB]", BUKKIT_COLOR_CODE_PREFIX + "b"); + allFormated = allFormated.replaceAll("&[cC]", BUKKIT_COLOR_CODE_PREFIX + "c"); + allFormated = allFormated.replaceAll("&[dD]", BUKKIT_COLOR_CODE_PREFIX + "d"); + allFormated = allFormated.replaceAll("&[eE]", BUKKIT_COLOR_CODE_PREFIX + "e"); + allFormated = allFormated.replaceAll("&[fF]", BUKKIT_COLOR_CODE_PREFIX + "f"); + + allFormated = allFormated.replaceAll("%", "\\%"); + + allFormated = convertHexColorCodeStringToBukkitColorCodeString(allFormated); + return allFormated; + } + + /** + * Formats a string with only legacy Spigot color codes &[0-9a-f]. Does not + * format the legacy color codes that make up a Spigot hex color code. + * + * @param string to format. + * @return {@link String} + */ + public static String FormatStringLegacyColor(String string) { + String allFormated = string; + + allFormated = LEGACY_CHAT_COLOR_PATTERN.matcher(allFormated).replaceAll("\u00A7$13"); + allFormated = allFormated.replaceAll(BUKKIT_COLOR_CODE_PREFIX + "[A]", BUKKIT_COLOR_CODE_PREFIX + "a"); + allFormated = allFormated.replaceAll(BUKKIT_COLOR_CODE_PREFIX + "[B]", BUKKIT_COLOR_CODE_PREFIX + "b"); + allFormated = allFormated.replaceAll(BUKKIT_COLOR_CODE_PREFIX + "[C]", BUKKIT_COLOR_CODE_PREFIX + "c"); + allFormated = allFormated.replaceAll(BUKKIT_COLOR_CODE_PREFIX + "[D]", BUKKIT_COLOR_CODE_PREFIX + "d"); + allFormated = allFormated.replaceAll(BUKKIT_COLOR_CODE_PREFIX + "[E]", BUKKIT_COLOR_CODE_PREFIX + "e"); + allFormated = allFormated.replaceAll(BUKKIT_COLOR_CODE_PREFIX + "[F]", BUKKIT_COLOR_CODE_PREFIX + "f"); + + allFormated = allFormated.replaceAll("%", "\\%"); + return allFormated; + } + + /** + * Formats a string with Spigot formatting codes. + * + * @param string to format. + * @return {@link String} + */ + public static String FormatString(String string) { + String allFormated = string; + allFormated = allFormated.replaceAll("&[kK]", BUKKIT_COLOR_CODE_PREFIX + "k"); + allFormated = allFormated.replaceAll("&[lL]", BUKKIT_COLOR_CODE_PREFIX + "l"); + allFormated = allFormated.replaceAll("&[mM]", BUKKIT_COLOR_CODE_PREFIX + "m"); + allFormated = allFormated.replaceAll("&[nN]", BUKKIT_COLOR_CODE_PREFIX + "n"); + allFormated = allFormated.replaceAll("&[oO]", BUKKIT_COLOR_CODE_PREFIX + "o"); + allFormated = allFormated.replaceAll("&[rR]", BUKKIT_COLOR_CODE_PREFIX + "r"); + + allFormated = allFormated.replaceAll("%", "\\%"); + return allFormated; + } + + /** + * Formats a string with Spigot legacy colors codes, Spigot and VentureChat hex + * color codes, and Spigot formatting codes. + * + * @param string to format. + * @return {@link String} + */ + public static String FormatStringAll(String string) { + String allFormated = Format.FormatString(string); + allFormated = Format.FormatStringColor(allFormated); + return allFormated; + } + + public static String FilterChat(String msg) { + int t = 0; + List filters = getInstance().getConfig().getStringList("filters"); + for (String s : filters) { + t = 0; + String[] pparse = new String[2]; + pparse[0] = " "; + pparse[1] = " "; + StringTokenizer st = new StringTokenizer(s, ","); + while (st.hasMoreTokens()) { + if (t < 2) { + pparse[t++] = st.nextToken(); + } + } + // (?i) = case insensitive + msg = msg.replaceAll("(?i)" + pparse[0], pparse[1]); + } + return msg; + } + + public static boolean isValidColor(String color) { + Boolean bFound = false; + for (ChatColor bkColors : ChatColor.values()) { + if (color.equalsIgnoreCase(bkColors.name())) { + bFound = true; + } + } + return bFound; + } + + /** + * Validates a hex color code. + * + * @param color to validate. + * @return true if color code is valid, false otherwise. + */ + public static boolean isValidHexColor(String color) { + Pattern pattern = Pattern.compile("(^&?#[0-9a-fA-F]{6}\\b)"); + Matcher matcher = pattern.matcher(color); + return matcher.find(); + } + + /** + * Convert a single hex color code to a single Bukkit hex color code. + * + * @param color to convert. + * @return {@link String} + */ + public static String convertHexColorCodeToBukkitColorCode(String color) { + color = color.replace("&", ""); + StringBuilder bukkitColorCode = new StringBuilder(BUKKIT_COLOR_CODE_PREFIX + BUKKIT_HEX_COLOR_CODE_PREFIX); + for (int a = 1; a < color.length(); a++) { + bukkitColorCode.append(BUKKIT_COLOR_CODE_PREFIX + color.charAt(a)); + } + return bukkitColorCode.toString().toLowerCase(); + } + + /** + * Convert an entire String of hex color codes to Bukkit hex color codes. + * + * @param string to convert. + * @return {@link String} + */ + public static String convertHexColorCodeStringToBukkitColorCodeString(String string) { + Pattern pattern = Pattern.compile("(&?#[0-9a-fA-F]{6})"); + Matcher matcher = pattern.matcher(string); + while (matcher.find()) { + int indexStart = matcher.start(); + int indexEnd = matcher.end(); + String hexColor = string.substring(indexStart, indexEnd); + String bukkitColor = convertHexColorCodeToBukkitColorCode(hexColor); + string = string.replaceAll(hexColor, bukkitColor); + matcher.reset(string); + } + return string; + } + + public static String escapeAllRegex(String input) { + return input.replace("[", "\\[").replace("]", "\\]").replace("{", "\\{").replace("}", "\\}").replace("(", "\\(") + .replace(")", "\\)").replace("|", "\\|").replace("+", "\\+").replace("*", "\\*"); + } + + public static boolean underlineURLs() { + return getInstance().getConfig().getBoolean("underlineurls", true); + } + + public static String parseTimeStringFromMillis(long millis) { + String timeString = ""; + if(millis >= Format.MILLISECONDS_PER_DAY) { + long numberOfDays = millis / Format.MILLISECONDS_PER_DAY; + millis -= Format.MILLISECONDS_PER_DAY * numberOfDays; + + String units = LocalizedMessage.UNITS_DAY_PLURAL.toString(); + if (numberOfDays == 1) { + units = LocalizedMessage.UNITS_DAY_SINGULAR.toString(); + } + timeString += numberOfDays + " " + units + " "; + } + + if(millis >= Format.MILLISECONDS_PER_HOUR) { + long numberOfHours = millis / Format.MILLISECONDS_PER_HOUR; + millis -= Format.MILLISECONDS_PER_HOUR * numberOfHours; + + String units = LocalizedMessage.UNITS_HOUR_PLURAL.toString(); + if (numberOfHours == 1) { + units = LocalizedMessage.UNITS_HOUR_SINGULAR.toString(); + } + timeString += numberOfHours + " " + units + " "; + } + + if(millis >= Format.MILLISECONDS_PER_MINUTE) { + long numberOfMinutes = millis / Format.MILLISECONDS_PER_MINUTE; + millis -= Format.MILLISECONDS_PER_MINUTE * numberOfMinutes; + + String units = LocalizedMessage.UNITS_MINUTE_PLURAL.toString(); + if (numberOfMinutes == 1) { + units = LocalizedMessage.UNITS_MINUTE_SINGULAR.toString(); + } + timeString += numberOfMinutes + " " + units + " "; + } + + if(millis >= Format.MILLISECONDS_PER_SECOND) { + long numberOfSeconds = millis / Format.MILLISECONDS_PER_SECOND; + millis -= Format.MILLISECONDS_PER_SECOND * numberOfSeconds; + + String units = LocalizedMessage.UNITS_SECOND_PLURAL.toString(); + if (numberOfSeconds == 1) { + units = LocalizedMessage.UNITS_SECOND_SINGULAR.toString(); + } + timeString += numberOfSeconds + " " + units; + } + return timeString.trim(); + } + + public static long parseTimeStringToMillis(String timeInput) { + long millis = 0L; + timeInput = timeInput.toLowerCase(); + char validChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'd', 'h', 'm', 's' }; + if(containsInvalidChars(validChars, timeInput)) { + return -1; + } + + long countDayTokens = timeInput.chars().filter(ch -> ch == 'd').count(); + long countHourTokens = timeInput.chars().filter(ch -> ch == 'h').count(); + long countMinuteTokens = timeInput.chars().filter(ch -> ch == 'm').count(); + long countSecondTokens = timeInput.chars().filter(ch -> ch == 's').count(); + if(countDayTokens > 1 || countHourTokens > 1 || countMinuteTokens > 1 || countSecondTokens > 1) { + return -1; + } + + int indexOfSecondToken = timeInput.indexOf("s"); + int indexOfMinuteToken = timeInput.indexOf("m"); + int indexOfHourToken = timeInput.indexOf("h"); + int indexOfDayToken = timeInput.indexOf("d"); + if(indexOfDayToken != -1) { + if((indexOfHourToken != -1 && indexOfHourToken < indexOfDayToken) || (indexOfMinuteToken != -1 && indexOfMinuteToken < indexOfDayToken) || (indexOfSecondToken != -1 && indexOfSecondToken < indexOfDayToken)) { + return -1; + } + } + if(indexOfHourToken != -1) { + if((indexOfMinuteToken != -1 && indexOfMinuteToken < indexOfHourToken) || (indexOfSecondToken != -1 && indexOfSecondToken < indexOfHourToken)) { + return -1; + } + } + if(indexOfMinuteToken != -1) { + if((indexOfSecondToken != -1 && indexOfSecondToken < indexOfMinuteToken)) { + return -1; + } + } + + if(indexOfDayToken != -1) { + int numberOfDays = Integer.parseInt(timeInput.substring(0, indexOfDayToken)); + timeInput = timeInput.substring(indexOfDayToken + 1); + millis += MILLISECONDS_PER_DAY * numberOfDays; + } + if(timeInput.length() > 0) { + indexOfHourToken = timeInput.indexOf("h"); + if(indexOfHourToken != -1) { + int numberOfHours = Integer.parseInt(timeInput.substring(0, indexOfHourToken)); + timeInput = timeInput.substring(indexOfHourToken + 1); + millis += MILLISECONDS_PER_HOUR * numberOfHours; + } + } + if(timeInput.length() > 0) { + indexOfMinuteToken = timeInput.indexOf("m"); + if(indexOfMinuteToken != -1) { + int numberOfMinutes = Integer.parseInt(timeInput.substring(0, indexOfMinuteToken)); + timeInput = timeInput.substring(indexOfMinuteToken + 1); + millis += MILLISECONDS_PER_MINUTE * numberOfMinutes; + } + } + if(timeInput.length() > 0) { + indexOfSecondToken = timeInput.indexOf("s"); + if(indexOfSecondToken != -1) { + int numberOfSeconds = Integer.parseInt(timeInput.substring(0, indexOfSecondToken)); + timeInput = timeInput.substring(indexOfSecondToken + 1); + millis += MILLISECONDS_PER_SECOND * numberOfSeconds; + } + } + return millis; + } + + private static boolean containsInvalidChars(char[] validChars, String validate) { + for(char c : validate.toCharArray()) { + boolean isValidChar = false; + for(char v : validChars) { + if(c == v) { + isValidChar = true; + } + } + if(!isValidChar) { + return true; + } + } + return false; + } + + public static void broadcastToServer(String message) { + for(MineverseChatPlayer mcp : MineverseChatAPI.getOnlineMineverseChatPlayers()) { + mcp.getPlayer().sendMessage(message); + } + } + + public static void playMessageSound(MineverseChatPlayer mcp) { + Player player = mcp.getPlayer(); + String soundName = getInstance().getConfig().getString("message_sound", DEFAULT_MESSAGE_SOUND); + if(!soundName.equalsIgnoreCase("None")) { + Sound messageSound = getSound(soundName); + player.playSound(player.getLocation(), messageSound, 1, 0); + } + } + + private static Sound getSound(String soundName) { + if(Arrays.asList(Sound.values()).stream().map(Sound::toString).collect(Collectors.toList()).contains(soundName)) { + return Sound.valueOf(soundName); + } + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Message sound invalid!")); + return getDefaultMessageSound(); + } + + private static Sound getDefaultMessageSound() { + if(VersionHandler.is1_7() || VersionHandler.is1_8()) { + return Sound.valueOf(DEFAULT_LEGACY_MESSAGE_SOUND); + } + else { + return Sound.valueOf(DEFAULT_MESSAGE_SOUND); + } + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 025ba92..88ed9bc 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,423 +1,424 @@ -#=============================================================== -# VentureChat Config = -# Author: Aust1n46 = -#=============================================================== - -# - regex1,regex2 -# Simple regex tips: Use \b to "cut" a section of the word or phrase. Example: \bass,donuts -# Example filtered sentence: You are an ass. Will become: You are an donuts. -# Example filtered sentence: You caught a bass. Will stay: You caught a bass. -# Example filtered sentence: You are an asshole. Will become: You are an donutshole. -# Default filters by Jabelpeeps -filters: -- (\b.?anus),donuts -- (\ba+r*(se+|ss+(?!(ass|um|oc|ign|ist)).*?|s*e*h+[o0]*[l1]+e*[sz]*)\b),donuts -- (b[i1]a?tch(es)?),puppy -- Carpet Muncher,cookie monster -- (\bc((?!ook\b)[o0]+c*|aw)k\W?(sucker|s*|he[ea]*d)\b),rooster -- (\b[ck]r+a+p+(er|s|z)?\b),poopoo -- (\bcu+m+\b),go -- (\b.?[ck](u*n+|[l1]+[i1]+)t+[sz]*\b),peach -- (\b.?d[1i](c?k(head)?|[l1]+d[o0])e?[sz]?\b),rooster -- f u c k( e r)?,nono -- (\b.?fai*g+[oei1]*t*[sz]*\b),cigar -- Fudge Packer,fine person -- (\b(m[uo]+th[ae]r?)?(f|ph)uc*k*(e[rn]|ah*|ing?|)[sz]?\b),oh dear -- (\b(j(ac|er|ur)k\W?(of+))|(ji[sz]+i*m*)\b),bake brownies -- (\b(ma+s+te?rbai?te?[rs]?|wank(er)?[sz]?)\b),bake brownies -- orafi(s|ce),rooster -- (\bp+[e3]+[ai]*n+[i1!ua]+s+),rooster -- (\bp[i1]s+(?!(ton))(flap|face|drop)?),peepee -- (\b.?sh[i1!y]t+(er?|y|head)?[sz]*),poopoo -- (\bva[1i]?[gj]+[i1]+na+\b),peach -- vu[1l]+va,peach -- planet.?minecraft,another dimension -- pmc,another dimension -- ((\d+\.){3}\d+),another dimension - -# command without the / -blockablecommands: -- vote -- me - -# blacklisted nicknames -nicknames: -- Notch - -nickname-in-tablist: true - -# {player} : player sending command -# {command} : command typed -commandspy: - format: '&6{player}: {command}' - worldeditcommands: true - -antispam: - enabled: true - - # Number of messages to be spam - spamnumber: 5 - - # Amount of time in seconds for it to be spam - spamtime: 10 - - # Amount of time for the mute to last - # Acceptable units are: d,h,m,s - # Units can be combined, for example: 1d8h30m15s - # Use 0 for untimed mute - mutetime: 10m - -# Logging chat and commands to a mysql database -mysql: - enabled: false - user: User - port: 3306 - password: Password - host: localhost - database: Database - -# Loglevel feature is still in the works for adding of debug messages -# Valid loglevels: -# Info: Regular logging -# Debug: Show extra messages and caught errors for debugging -# Severe: Only show severe messages -loglevel: info - -# saveinterval is in minutes -saveinterval: 30 - -# If you're running a "cracked" server, player data might not be stored properly, and thus, you are on your own. -# If you run your server in offline mode, you might have to reset your player data when switching to online mode! -# If you see this warning by accident and you are using BungeeCord, make sure you have properly setup IP Forwarding. -# https://www.spigotmc.org/wiki/bungeecord-ip-forwarding/ -# No player data will be saved in offline mode unless you set this acknowledgement to 'true' -offline_server_acknowledgement: false - -# The time in seconds between each check to remove timed mutes -unmuteinterval: 60 - -# Enables or disabled BungeeCord messaging -bungeecordmessaging: false - -# Sound for message notification -message_sound: ENTITY_PLAYER_LEVELUP - -# This will allow vanished players to be exempt from being sent private messages, and will act as if they aren't online -vanishsupport: true - -# Use PlaceholderAPI placeholders -# Start the placeholder with 'sender_' for the sending players placeholder -# Start the placeholder with 'receiver_' for the receiving players placeholder -# The defaults shown below provide an example of each -tellformatto: '&7You message {receiver_vault_prefix}{receiver_player_displayname}&7:' -tellformatfrom: '{sender_vault_prefix}{sender_player_displayname} &7messages you:' -tellformatspy: '{sender_player_name} messages {receiver_player_name}:&7' -replyformatto: '&7You reply to {receiver_vault_prefix}{receiver_player_displayname}&7:' -replyformatfrom: '{sender_vault_prefix}{sender_player_displayname} &7replies to you:' -replyformatspy: '{sender_player_name} replies to {receiver_player_name}:&7' - -# {host} : party hosts name -# {player} : player name -# use Default for the basic formatting -partyformat: Default - -formatcleaner: true - -# If true, /ignore will block chat from the ignored player as well as PM's -ignorechat: false - -# The message shown to players alerting them no one is in the channel to hear them -emptychannelalert: "&6No one is listening to you." - -messageremoverpermissions: '&cYou need additional permissions to view this message!' -messageremovertext: '&c&o' - -# The name of the group is the permissions node for the format -# Example: venturechat.json.Owner is the node for the group Owner -# A lower priority overrides a higher priority if a player has more than 1 group -# Possible options for click_name and click_prefix are suggest_command, run_command, and open_url -jsonformatting: - Default: # This default format is required! Do not delete or rename it! - priority: 2147483647 # Integer.MAX_VALUE - hover_name: - - '&6I have no rank!' - click_name: 'suggest_command' - click_name_text: '/msg {player_name}' - hover_prefix: - - '&dI am default!' - click_prefix: 'run_command' - click_prefix_text: '/help' - hover_suffix: - - '&dI am default suffix!' - click_suffix: 'suggest_command' - click_suffix_text: '/msg {player_name}' - Owner: - priority: 1 # Lowest Priority - hover_name: - - '&cOwner of the server!' - - '&bMessage me for help!' - click_name: 'suggest_command' - click_name_text: '/msg {player_name}' - hover_prefix: - - '&dServer Owner' - click_prefix: 'run_command' - click_prefix_text: '/help' - hover_suffix: - - '&dI am Owner suffix!' - click_suffix: 'suggest_command' - click_suffix_text: '/msg {player_name}' - -# The icon is the block shown in the GUI -# The text is the display name of the block icon -# Include a slash (/) before the command -# Permissions are the name of the button and automatically include "venturechat." -# Example: mute equals venturechat.mute -venturegui: - mute: - icon: 'REDSTONE_BLOCK' - durability: 0 - text: '&cMute {player_name} &410m' - permission: 'mute' - command: '/mute {channel} {player_name} 10m' - slot: 1 - unmute: - icon: 'DIAMOND_BLOCK' - durability: 0 - text: '&bUnmute {player_name}' - permission: 'mute' - command: '/unmute {channel} {player_name} ' - slot: 2 - removemessage: - icon: 'DIAMOND_AXE' - durability: 0 - text: '&cRemove Message' - permission: 'removemessage' - command: '/removemessage {hash} {channel}' - slot: 7 - -guiicon: '&c [✓]' -guitext: '&cOpen Moderation GUI' -guirows: 1 - -# All clickable URL's will be underlined if set to true -underlineurls: true - -# broadcast information -broadcast: - color: red - permissions: venturechat.adminchannel - displaytag: '[Broadcast]' - -# Use $ to include arguments into the message -# Valid component types are: -# Command: Sends a message or command in chat -# Message: Sends a message to the player -# Broadcast: Sends a broadcast to all players on the server -# Permissions automatically include "venturechat." -# Example: permissions: alert equals venturechat.alert -# Use None for no permissions -# The number of arguments is the minimum number of required arguments, use 0 for no required arguments -alias: - vote: - arguments: 0 - permissions: None - components: - - 'Message: &6Vote here: www.votelinkhere.com' - bane: - arguments: 2 - permissions: bane - components: - - 'Command: /ban $ appeal at www.site.com' - - 'Command: /st banned $' - alert: - arguments: 1 - permissions: alert - components: - - 'Broadcast: &c $' - donate: - arguments: 0 - permissions: None - components: - - 'Message: &bDonate here: www.mywebsite.com' - website: - arguments: 0 - permissions: None - components: - - 'Message: &aThis is our website: www.site.net' - -# Enables the creation of special Towny channels: Town and Nation -# To create these channels, simply name two channels below "Town" and "Nation" -# Bungeecord must be set to false for these channels! -enable_towny_channel: false - -# Enables the creation of a special faction only channel using the Factions plugin -# To create this channel, simply name a channel below "Faction" -# Bungeecord must be set to false for this channel! -# WARNING: May not work for all versions of Factions! -enable_factions_channel: false - -# color = [channel] color -# chatcolor = text color -# cooldown is in seconds -# bungeecord overrides distance -# channel permissions are configurable -# channels can be changed, and new channels can be created -# Permissions automatically include "venturechat." -# Example: permissions: staff equals venturechat.staff -# Use None for no permissions - -# Use PlaceholderAPI placeholders are required!!! -# Use PlaceholderAPI placeholders are required!!! -# Use PlaceholderAPI placeholders are required!!! -# /papi ecloud download [plugin] -# /papi reload -# Use '' or "" around format, example: '[&2global&f] {vault_prefix} {player_displayname}&2:' -# You must have prefixes and suffixes set in a Vault compatible permissions plugin to avoid errors -# Use "" as the prefix or suffix to have none - -# Set chatcolor to 'None' to have a group based chat color! Don't forget to put a suffix or other placeholder at the end of the format! - -# Important!!! -# Important!!! -# If you delete a channel, restart the server! Do not use /chatreload!!! -channels: - GroupChatColorExample: - color: '#706C1E' - chatcolor: 'None' - mutable: true - filter: true - autojoin: true - default: false - distance: 0 - cooldown: 0 - bungeecord: false - alias: ge - permissions: None - speak_permissions: None - format: '&f[#706C1EGroupColorChat&f] {vault_prefix} {player_displayname}#706C1E:{vault_suffix}' - HexExample: - color: '#ff0000' - chatcolor: '#ff0000' - mutable: true - filter: true - autojoin: true - default: false - distance: 0 - cooldown: 0 - bungeecord: false - alias: he - permissions: None - speak_permissions: None - format: '&f[#ff0000Hex&f] {vault_prefix} {player_displayname}#ff0000:' - BungeeExample: - color: gold - chatcolor: gold - mutable: true - filter: true - autojoin: true - default: false - distance: 0 - cooldown: 3 - bungeecord: true - alias: be - permissions: None - speak_permissions: None - format: '&f[&6Network&f] {vault_prefix} {player_displayname}&6:' - AnnouncementExample: - color: red - chatcolor: red - mutable: false - filter: false - autojoin: true - default: false - distance: 0 - cooldown: 0 - bungeecord: true - alias: announce - permissions: None - speak_permissions: announcement - format: '&f[&aServer Announcement&f] {vault_prefix} {player_displayname}&c:' - Global: - color: dark_green - chatcolor: dark_green - mutable: true - filter: true - autojoin: true - default: true - distance: 0 - cooldown: 0 - bungeecord: false - alias: g - permissions: None - speak_permissions: None - format: '&f[&2Global&f] {vault_prefix} {player_displayname}&2:' - Staff: - color: green - chatcolor: green - mutable: false - filter: false - autojoin: true - default: false - distance: 0 - cooldown: 0 - bungeecord: false - alias: st - permissions: staffchannel - speak_permissions: None - format: '&f[&aStaff&f] {vault_prefix} {player_displayname}&a:' - Donator: - color: light_purple - chatcolor: light_purple - mutable: true - filter: true - autojoin: true - default: false - distance: 0 - cooldown: 0 - bungeecord: false - alias: d - permissions: donatorchannel - speak_permissions: None - format: '&f[&dDonator&f] {vault_prefix} {player_displayname}&d:' - Help: - color: aqua - chatcolor: aqua - mutable: true - filter: true - autojoin: true - default: false - distance: 0 - cooldown: 0 - bungeecord: false - alias: h - permissions: None - speak_permissions: None - format: '&f[&bHelp&f] {vault_prefix} {player_displayname}&b:' - Trade: - color: dark_aqua - chatcolor: dark_aqua - mutable: true - filter: true - autojoin: true - default: false - distance: 0 - cooldown: 0 - bungeecord: false - alias: t - permissions: None - speak_permissions: None - format: '&f[&3Trade&f] {vault_prefix} {player_displayname}&3:' - Local: - color: yellow - chatcolor: yellow - mutable: true - filter: true - autojoin: true - default: false - distance: 230 - cooldown: 0 - bungeecord: false - alias: l - permissions: None - speak_permissions: None +#=============================================================== +# VentureChat Config = +# Author: Aust1n46 = +#=============================================================== + +# - regex1,regex2 +# Simple regex tips: Use \b to "cut" a section of the word or phrase. Example: \bass,donuts +# Example filtered sentence: You are an ass. Will become: You are an donuts. +# Example filtered sentence: You caught a bass. Will stay: You caught a bass. +# Example filtered sentence: You are an asshole. Will become: You are an donutshole. +# Default filters by Jabelpeeps +filters: +- (\b.?anus),donuts +- (\ba+r*(se+|ss+(?!(ass|um|oc|ign|ist)).*?|s*e*h+[o0]*[l1]+e*[sz]*)\b),donuts +- (b[i1]a?tch(es)?),puppy +- Carpet Muncher,cookie monster +- (\bc((?!ook\b)[o0]+c*|aw)k\W?(sucker|s*|he[ea]*d)\b),rooster +- (\b[ck]r+a+p+(er|s|z)?\b),poopoo +- (\bcu+m+\b),go +- (\b.?[ck](u*n+|[l1]+[i1]+)t+[sz]*\b),peach +- (\b.?d[1i](c?k(head)?|[l1]+d[o0])e?[sz]?\b),rooster +- f u c k( e r)?,nono +- (\b.?fai*g+[oei1]*t*[sz]*\b),cigar +- Fudge Packer,fine person +- (\b(m[uo]+th[ae]r?)?(f|ph)uc*k*(e[rn]|ah*|ing?|)[sz]?\b),oh dear +- (\b(j(ac|er|ur)k\W?(of+))|(ji[sz]+i*m*)\b),bake brownies +- (\b(ma+s+te?rbai?te?[rs]?|wank(er)?[sz]?)\b),bake brownies +- orafi(s|ce),rooster +- (\bp+[e3]+[ai]*n+[i1!ua]+s+),rooster +- (\bp[i1]s+(?!(ton))(flap|face|drop)?),peepee +- (\b.?sh[i1!y]t+(er?|y|head)?[sz]*),poopoo +- (\bva[1i]?[gj]+[i1]+na+\b),peach +- vu[1l]+va,peach +- planet.?minecraft,another dimension +- pmc,another dimension +- ((\d+\.){3}\d+),another dimension + +# command without the / +blockablecommands: +- vote +- me + +# blacklisted nicknames +nicknames: +- Notch + +nickname-in-tablist: true + +# {player} : player sending command +# {command} : command typed +commandspy: + format: '&6{player}: {command}' + worldeditcommands: true + +antispam: + enabled: true + + # Number of messages to be spam + spamnumber: 5 + + # Amount of time in seconds for it to be spam + spamtime: 10 + + # Amount of time for the mute to last + # Acceptable units are: d,h,m,s + # Units can be combined, for example: 1d8h30m15s + # Use 0 for untimed mute + mutetime: 10m + +# Logging chat and commands to a mysql database +mysql: + enabled: false + user: User + port: 3306 + password: Password + host: localhost + database: Database + +# Loglevel feature is still in the works for adding of debug messages +# Valid loglevels: +# Info: Regular logging +# Debug: Show extra messages and caught errors for debugging +# Severe: Only show severe messages +loglevel: info + +# saveinterval is in minutes +saveinterval: 30 + +# If you're running a "cracked" server, player data might not be stored properly, and thus, you are on your own. +# If you run your server in offline mode, you might have to reset your player data when switching to online mode! +# If you see this warning by accident and you are using BungeeCord, make sure you have properly setup IP Forwarding. +# https://www.spigotmc.org/wiki/bungeecord-ip-forwarding/ +# No player data will be saved in offline mode unless you set this acknowledgement to 'true' +offline_server_acknowledgement: false + +# The time in seconds between each check to remove timed mutes +unmuteinterval: 60 + +# Enables or disabled BungeeCord messaging +bungeecordmessaging: false + +# Sound for message notification +# Enter 'None' to disable the sound +message_sound: ENTITY_PLAYER_LEVELUP + +# This will allow vanished players to be exempt from being sent private messages, and will act as if they aren't online +vanishsupport: true + +# Use PlaceholderAPI placeholders +# Start the placeholder with 'sender_' for the sending players placeholder +# Start the placeholder with 'receiver_' for the receiving players placeholder +# The defaults shown below provide an example of each +tellformatto: '&7You message {receiver_vault_prefix}{receiver_player_displayname}&7:' +tellformatfrom: '{sender_vault_prefix}{sender_player_displayname} &7messages you:' +tellformatspy: '{sender_player_name} messages {receiver_player_name}:&7' +replyformatto: '&7You reply to {receiver_vault_prefix}{receiver_player_displayname}&7:' +replyformatfrom: '{sender_vault_prefix}{sender_player_displayname} &7replies to you:' +replyformatspy: '{sender_player_name} replies to {receiver_player_name}:&7' + +# {host} : party hosts name +# {player} : player name +# use Default for the basic formatting +partyformat: Default + +formatcleaner: true + +# If true, /ignore will block chat from the ignored player as well as PM's +ignorechat: false + +# The message shown to players alerting them no one is in the channel to hear them +emptychannelalert: "&6No one is listening to you." + +messageremoverpermissions: '&cYou need additional permissions to view this message!' +messageremovertext: '&c&o' + +# The name of the group is the permissions node for the format +# Example: venturechat.json.Owner is the node for the group Owner +# A lower priority overrides a higher priority if a player has more than 1 group +# Possible options for click_name and click_prefix are suggest_command, run_command, and open_url +jsonformatting: + Default: # This default format is required! Do not delete or rename it! + priority: 2147483647 # Integer.MAX_VALUE + hover_name: + - '&6I have no rank!' + click_name: 'suggest_command' + click_name_text: '/msg {player_name}' + hover_prefix: + - '&dI am default!' + click_prefix: 'run_command' + click_prefix_text: '/help' + hover_suffix: + - '&dI am default suffix!' + click_suffix: 'suggest_command' + click_suffix_text: '/msg {player_name}' + Owner: + priority: 1 # Lowest Priority + hover_name: + - '&cOwner of the server!' + - '&bMessage me for help!' + click_name: 'suggest_command' + click_name_text: '/msg {player_name}' + hover_prefix: + - '&dServer Owner' + click_prefix: 'run_command' + click_prefix_text: '/help' + hover_suffix: + - '&dI am Owner suffix!' + click_suffix: 'suggest_command' + click_suffix_text: '/msg {player_name}' + +# The icon is the block shown in the GUI +# The text is the display name of the block icon +# Include a slash (/) before the command +# Permissions are the name of the button and automatically include "venturechat." +# Example: mute equals venturechat.mute +venturegui: + mute: + icon: 'REDSTONE_BLOCK' + durability: 0 + text: '&cMute {player_name} &410m' + permission: 'mute' + command: '/mute {channel} {player_name} 10m' + slot: 1 + unmute: + icon: 'DIAMOND_BLOCK' + durability: 0 + text: '&bUnmute {player_name}' + permission: 'mute' + command: '/unmute {channel} {player_name} ' + slot: 2 + removemessage: + icon: 'DIAMOND_AXE' + durability: 0 + text: '&cRemove Message' + permission: 'removemessage' + command: '/removemessage {hash} {channel}' + slot: 7 + +guiicon: '&c [✓]' +guitext: '&cOpen Moderation GUI' +guirows: 1 + +# All clickable URL's will be underlined if set to true +underlineurls: true + +# broadcast information +broadcast: + color: red + permissions: venturechat.adminchannel + displaytag: '[Broadcast]' + +# Use $ to include arguments into the message +# Valid component types are: +# Command: Sends a message or command in chat +# Message: Sends a message to the player +# Broadcast: Sends a broadcast to all players on the server +# Permissions automatically include "venturechat." +# Example: permissions: alert equals venturechat.alert +# Use None for no permissions +# The number of arguments is the minimum number of required arguments, use 0 for no required arguments +alias: + vote: + arguments: 0 + permissions: None + components: + - 'Message: &6Vote here: www.votelinkhere.com' + bane: + arguments: 2 + permissions: bane + components: + - 'Command: /ban $ appeal at www.site.com' + - 'Command: /st banned $' + alert: + arguments: 1 + permissions: alert + components: + - 'Broadcast: &c $' + donate: + arguments: 0 + permissions: None + components: + - 'Message: &bDonate here: www.mywebsite.com' + website: + arguments: 0 + permissions: None + components: + - 'Message: &aThis is our website: www.site.net' + +# Enables the creation of special Towny channels: Town and Nation +# To create these channels, simply name two channels below "Town" and "Nation" +# Bungeecord must be set to false for these channels! +enable_towny_channel: false + +# Enables the creation of a special faction only channel using the Factions plugin +# To create this channel, simply name a channel below "Faction" +# Bungeecord must be set to false for this channel! +# WARNING: May not work for all versions of Factions! +enable_factions_channel: false + +# color = [channel] color +# chatcolor = text color +# cooldown is in seconds +# bungeecord overrides distance +# channel permissions are configurable +# channels can be changed, and new channels can be created +# Permissions automatically include "venturechat." +# Example: permissions: staff equals venturechat.staff +# Use None for no permissions + +# Use PlaceholderAPI placeholders are required!!! +# Use PlaceholderAPI placeholders are required!!! +# Use PlaceholderAPI placeholders are required!!! +# /papi ecloud download [plugin] +# /papi reload +# Use '' or "" around format, example: '[&2global&f] {vault_prefix} {player_displayname}&2:' +# You must have prefixes and suffixes set in a Vault compatible permissions plugin to avoid errors +# Use "" as the prefix or suffix to have none + +# Set chatcolor to 'None' to have a group based chat color! Don't forget to put a suffix or other placeholder at the end of the format! + +# Important!!! +# Important!!! +# If you delete a channel, restart the server! Do not use /chatreload!!! +channels: + GroupChatColorExample: + color: '#706C1E' + chatcolor: 'None' + mutable: true + filter: true + autojoin: true + default: false + distance: 0 + cooldown: 0 + bungeecord: false + alias: ge + permissions: None + speak_permissions: None + format: '&f[#706C1EGroupColorChat&f] {vault_prefix} {player_displayname}#706C1E:{vault_suffix}' + HexExample: + color: '#ff0000' + chatcolor: '#ff0000' + mutable: true + filter: true + autojoin: true + default: false + distance: 0 + cooldown: 0 + bungeecord: false + alias: he + permissions: None + speak_permissions: None + format: '&f[#ff0000Hex&f] {vault_prefix} {player_displayname}#ff0000:' + BungeeExample: + color: gold + chatcolor: gold + mutable: true + filter: true + autojoin: true + default: false + distance: 0 + cooldown: 3 + bungeecord: true + alias: be + permissions: None + speak_permissions: None + format: '&f[&6Network&f] {vault_prefix} {player_displayname}&6:' + AnnouncementExample: + color: red + chatcolor: red + mutable: false + filter: false + autojoin: true + default: false + distance: 0 + cooldown: 0 + bungeecord: true + alias: announce + permissions: None + speak_permissions: announcement + format: '&f[&aServer Announcement&f] {vault_prefix} {player_displayname}&c:' + Global: + color: dark_green + chatcolor: dark_green + mutable: true + filter: true + autojoin: true + default: true + distance: 0 + cooldown: 0 + bungeecord: false + alias: g + permissions: None + speak_permissions: None + format: '&f[&2Global&f] {vault_prefix} {player_displayname}&2:' + Staff: + color: green + chatcolor: green + mutable: false + filter: false + autojoin: true + default: false + distance: 0 + cooldown: 0 + bungeecord: false + alias: st + permissions: staffchannel + speak_permissions: None + format: '&f[&aStaff&f] {vault_prefix} {player_displayname}&a:' + Donator: + color: light_purple + chatcolor: light_purple + mutable: true + filter: true + autojoin: true + default: false + distance: 0 + cooldown: 0 + bungeecord: false + alias: d + permissions: donatorchannel + speak_permissions: None + format: '&f[&dDonator&f] {vault_prefix} {player_displayname}&d:' + Help: + color: aqua + chatcolor: aqua + mutable: true + filter: true + autojoin: true + default: false + distance: 0 + cooldown: 0 + bungeecord: false + alias: h + permissions: None + speak_permissions: None + format: '&f[&bHelp&f] {vault_prefix} {player_displayname}&b:' + Trade: + color: dark_aqua + chatcolor: dark_aqua + mutable: true + filter: true + autojoin: true + default: false + distance: 0 + cooldown: 0 + bungeecord: false + alias: t + permissions: None + speak_permissions: None + format: '&f[&3Trade&f] {vault_prefix} {player_displayname}&3:' + Local: + color: yellow + chatcolor: yellow + mutable: true + filter: true + autojoin: true + default: false + distance: 230 + cooldown: 0 + bungeecord: false + alias: l + permissions: None + speak_permissions: None format: '&f[&eLocal&f] {vault_prefix} {player_displayname}&e:' \ No newline at end of file diff --git a/src/main/resources/example_config_always_up_to_date!.yml b/src/main/resources/example_config_always_up_to_date!.yml index 025ba92..88ed9bc 100644 --- a/src/main/resources/example_config_always_up_to_date!.yml +++ b/src/main/resources/example_config_always_up_to_date!.yml @@ -1,423 +1,424 @@ -#=============================================================== -# VentureChat Config = -# Author: Aust1n46 = -#=============================================================== - -# - regex1,regex2 -# Simple regex tips: Use \b to "cut" a section of the word or phrase. Example: \bass,donuts -# Example filtered sentence: You are an ass. Will become: You are an donuts. -# Example filtered sentence: You caught a bass. Will stay: You caught a bass. -# Example filtered sentence: You are an asshole. Will become: You are an donutshole. -# Default filters by Jabelpeeps -filters: -- (\b.?anus),donuts -- (\ba+r*(se+|ss+(?!(ass|um|oc|ign|ist)).*?|s*e*h+[o0]*[l1]+e*[sz]*)\b),donuts -- (b[i1]a?tch(es)?),puppy -- Carpet Muncher,cookie monster -- (\bc((?!ook\b)[o0]+c*|aw)k\W?(sucker|s*|he[ea]*d)\b),rooster -- (\b[ck]r+a+p+(er|s|z)?\b),poopoo -- (\bcu+m+\b),go -- (\b.?[ck](u*n+|[l1]+[i1]+)t+[sz]*\b),peach -- (\b.?d[1i](c?k(head)?|[l1]+d[o0])e?[sz]?\b),rooster -- f u c k( e r)?,nono -- (\b.?fai*g+[oei1]*t*[sz]*\b),cigar -- Fudge Packer,fine person -- (\b(m[uo]+th[ae]r?)?(f|ph)uc*k*(e[rn]|ah*|ing?|)[sz]?\b),oh dear -- (\b(j(ac|er|ur)k\W?(of+))|(ji[sz]+i*m*)\b),bake brownies -- (\b(ma+s+te?rbai?te?[rs]?|wank(er)?[sz]?)\b),bake brownies -- orafi(s|ce),rooster -- (\bp+[e3]+[ai]*n+[i1!ua]+s+),rooster -- (\bp[i1]s+(?!(ton))(flap|face|drop)?),peepee -- (\b.?sh[i1!y]t+(er?|y|head)?[sz]*),poopoo -- (\bva[1i]?[gj]+[i1]+na+\b),peach -- vu[1l]+va,peach -- planet.?minecraft,another dimension -- pmc,another dimension -- ((\d+\.){3}\d+),another dimension - -# command without the / -blockablecommands: -- vote -- me - -# blacklisted nicknames -nicknames: -- Notch - -nickname-in-tablist: true - -# {player} : player sending command -# {command} : command typed -commandspy: - format: '&6{player}: {command}' - worldeditcommands: true - -antispam: - enabled: true - - # Number of messages to be spam - spamnumber: 5 - - # Amount of time in seconds for it to be spam - spamtime: 10 - - # Amount of time for the mute to last - # Acceptable units are: d,h,m,s - # Units can be combined, for example: 1d8h30m15s - # Use 0 for untimed mute - mutetime: 10m - -# Logging chat and commands to a mysql database -mysql: - enabled: false - user: User - port: 3306 - password: Password - host: localhost - database: Database - -# Loglevel feature is still in the works for adding of debug messages -# Valid loglevels: -# Info: Regular logging -# Debug: Show extra messages and caught errors for debugging -# Severe: Only show severe messages -loglevel: info - -# saveinterval is in minutes -saveinterval: 30 - -# If you're running a "cracked" server, player data might not be stored properly, and thus, you are on your own. -# If you run your server in offline mode, you might have to reset your player data when switching to online mode! -# If you see this warning by accident and you are using BungeeCord, make sure you have properly setup IP Forwarding. -# https://www.spigotmc.org/wiki/bungeecord-ip-forwarding/ -# No player data will be saved in offline mode unless you set this acknowledgement to 'true' -offline_server_acknowledgement: false - -# The time in seconds between each check to remove timed mutes -unmuteinterval: 60 - -# Enables or disabled BungeeCord messaging -bungeecordmessaging: false - -# Sound for message notification -message_sound: ENTITY_PLAYER_LEVELUP - -# This will allow vanished players to be exempt from being sent private messages, and will act as if they aren't online -vanishsupport: true - -# Use PlaceholderAPI placeholders -# Start the placeholder with 'sender_' for the sending players placeholder -# Start the placeholder with 'receiver_' for the receiving players placeholder -# The defaults shown below provide an example of each -tellformatto: '&7You message {receiver_vault_prefix}{receiver_player_displayname}&7:' -tellformatfrom: '{sender_vault_prefix}{sender_player_displayname} &7messages you:' -tellformatspy: '{sender_player_name} messages {receiver_player_name}:&7' -replyformatto: '&7You reply to {receiver_vault_prefix}{receiver_player_displayname}&7:' -replyformatfrom: '{sender_vault_prefix}{sender_player_displayname} &7replies to you:' -replyformatspy: '{sender_player_name} replies to {receiver_player_name}:&7' - -# {host} : party hosts name -# {player} : player name -# use Default for the basic formatting -partyformat: Default - -formatcleaner: true - -# If true, /ignore will block chat from the ignored player as well as PM's -ignorechat: false - -# The message shown to players alerting them no one is in the channel to hear them -emptychannelalert: "&6No one is listening to you." - -messageremoverpermissions: '&cYou need additional permissions to view this message!' -messageremovertext: '&c&o' - -# The name of the group is the permissions node for the format -# Example: venturechat.json.Owner is the node for the group Owner -# A lower priority overrides a higher priority if a player has more than 1 group -# Possible options for click_name and click_prefix are suggest_command, run_command, and open_url -jsonformatting: - Default: # This default format is required! Do not delete or rename it! - priority: 2147483647 # Integer.MAX_VALUE - hover_name: - - '&6I have no rank!' - click_name: 'suggest_command' - click_name_text: '/msg {player_name}' - hover_prefix: - - '&dI am default!' - click_prefix: 'run_command' - click_prefix_text: '/help' - hover_suffix: - - '&dI am default suffix!' - click_suffix: 'suggest_command' - click_suffix_text: '/msg {player_name}' - Owner: - priority: 1 # Lowest Priority - hover_name: - - '&cOwner of the server!' - - '&bMessage me for help!' - click_name: 'suggest_command' - click_name_text: '/msg {player_name}' - hover_prefix: - - '&dServer Owner' - click_prefix: 'run_command' - click_prefix_text: '/help' - hover_suffix: - - '&dI am Owner suffix!' - click_suffix: 'suggest_command' - click_suffix_text: '/msg {player_name}' - -# The icon is the block shown in the GUI -# The text is the display name of the block icon -# Include a slash (/) before the command -# Permissions are the name of the button and automatically include "venturechat." -# Example: mute equals venturechat.mute -venturegui: - mute: - icon: 'REDSTONE_BLOCK' - durability: 0 - text: '&cMute {player_name} &410m' - permission: 'mute' - command: '/mute {channel} {player_name} 10m' - slot: 1 - unmute: - icon: 'DIAMOND_BLOCK' - durability: 0 - text: '&bUnmute {player_name}' - permission: 'mute' - command: '/unmute {channel} {player_name} ' - slot: 2 - removemessage: - icon: 'DIAMOND_AXE' - durability: 0 - text: '&cRemove Message' - permission: 'removemessage' - command: '/removemessage {hash} {channel}' - slot: 7 - -guiicon: '&c [✓]' -guitext: '&cOpen Moderation GUI' -guirows: 1 - -# All clickable URL's will be underlined if set to true -underlineurls: true - -# broadcast information -broadcast: - color: red - permissions: venturechat.adminchannel - displaytag: '[Broadcast]' - -# Use $ to include arguments into the message -# Valid component types are: -# Command: Sends a message or command in chat -# Message: Sends a message to the player -# Broadcast: Sends a broadcast to all players on the server -# Permissions automatically include "venturechat." -# Example: permissions: alert equals venturechat.alert -# Use None for no permissions -# The number of arguments is the minimum number of required arguments, use 0 for no required arguments -alias: - vote: - arguments: 0 - permissions: None - components: - - 'Message: &6Vote here: www.votelinkhere.com' - bane: - arguments: 2 - permissions: bane - components: - - 'Command: /ban $ appeal at www.site.com' - - 'Command: /st banned $' - alert: - arguments: 1 - permissions: alert - components: - - 'Broadcast: &c $' - donate: - arguments: 0 - permissions: None - components: - - 'Message: &bDonate here: www.mywebsite.com' - website: - arguments: 0 - permissions: None - components: - - 'Message: &aThis is our website: www.site.net' - -# Enables the creation of special Towny channels: Town and Nation -# To create these channels, simply name two channels below "Town" and "Nation" -# Bungeecord must be set to false for these channels! -enable_towny_channel: false - -# Enables the creation of a special faction only channel using the Factions plugin -# To create this channel, simply name a channel below "Faction" -# Bungeecord must be set to false for this channel! -# WARNING: May not work for all versions of Factions! -enable_factions_channel: false - -# color = [channel] color -# chatcolor = text color -# cooldown is in seconds -# bungeecord overrides distance -# channel permissions are configurable -# channels can be changed, and new channels can be created -# Permissions automatically include "venturechat." -# Example: permissions: staff equals venturechat.staff -# Use None for no permissions - -# Use PlaceholderAPI placeholders are required!!! -# Use PlaceholderAPI placeholders are required!!! -# Use PlaceholderAPI placeholders are required!!! -# /papi ecloud download [plugin] -# /papi reload -# Use '' or "" around format, example: '[&2global&f] {vault_prefix} {player_displayname}&2:' -# You must have prefixes and suffixes set in a Vault compatible permissions plugin to avoid errors -# Use "" as the prefix or suffix to have none - -# Set chatcolor to 'None' to have a group based chat color! Don't forget to put a suffix or other placeholder at the end of the format! - -# Important!!! -# Important!!! -# If you delete a channel, restart the server! Do not use /chatreload!!! -channels: - GroupChatColorExample: - color: '#706C1E' - chatcolor: 'None' - mutable: true - filter: true - autojoin: true - default: false - distance: 0 - cooldown: 0 - bungeecord: false - alias: ge - permissions: None - speak_permissions: None - format: '&f[#706C1EGroupColorChat&f] {vault_prefix} {player_displayname}#706C1E:{vault_suffix}' - HexExample: - color: '#ff0000' - chatcolor: '#ff0000' - mutable: true - filter: true - autojoin: true - default: false - distance: 0 - cooldown: 0 - bungeecord: false - alias: he - permissions: None - speak_permissions: None - format: '&f[#ff0000Hex&f] {vault_prefix} {player_displayname}#ff0000:' - BungeeExample: - color: gold - chatcolor: gold - mutable: true - filter: true - autojoin: true - default: false - distance: 0 - cooldown: 3 - bungeecord: true - alias: be - permissions: None - speak_permissions: None - format: '&f[&6Network&f] {vault_prefix} {player_displayname}&6:' - AnnouncementExample: - color: red - chatcolor: red - mutable: false - filter: false - autojoin: true - default: false - distance: 0 - cooldown: 0 - bungeecord: true - alias: announce - permissions: None - speak_permissions: announcement - format: '&f[&aServer Announcement&f] {vault_prefix} {player_displayname}&c:' - Global: - color: dark_green - chatcolor: dark_green - mutable: true - filter: true - autojoin: true - default: true - distance: 0 - cooldown: 0 - bungeecord: false - alias: g - permissions: None - speak_permissions: None - format: '&f[&2Global&f] {vault_prefix} {player_displayname}&2:' - Staff: - color: green - chatcolor: green - mutable: false - filter: false - autojoin: true - default: false - distance: 0 - cooldown: 0 - bungeecord: false - alias: st - permissions: staffchannel - speak_permissions: None - format: '&f[&aStaff&f] {vault_prefix} {player_displayname}&a:' - Donator: - color: light_purple - chatcolor: light_purple - mutable: true - filter: true - autojoin: true - default: false - distance: 0 - cooldown: 0 - bungeecord: false - alias: d - permissions: donatorchannel - speak_permissions: None - format: '&f[&dDonator&f] {vault_prefix} {player_displayname}&d:' - Help: - color: aqua - chatcolor: aqua - mutable: true - filter: true - autojoin: true - default: false - distance: 0 - cooldown: 0 - bungeecord: false - alias: h - permissions: None - speak_permissions: None - format: '&f[&bHelp&f] {vault_prefix} {player_displayname}&b:' - Trade: - color: dark_aqua - chatcolor: dark_aqua - mutable: true - filter: true - autojoin: true - default: false - distance: 0 - cooldown: 0 - bungeecord: false - alias: t - permissions: None - speak_permissions: None - format: '&f[&3Trade&f] {vault_prefix} {player_displayname}&3:' - Local: - color: yellow - chatcolor: yellow - mutable: true - filter: true - autojoin: true - default: false - distance: 230 - cooldown: 0 - bungeecord: false - alias: l - permissions: None - speak_permissions: None +#=============================================================== +# VentureChat Config = +# Author: Aust1n46 = +#=============================================================== + +# - regex1,regex2 +# Simple regex tips: Use \b to "cut" a section of the word or phrase. Example: \bass,donuts +# Example filtered sentence: You are an ass. Will become: You are an donuts. +# Example filtered sentence: You caught a bass. Will stay: You caught a bass. +# Example filtered sentence: You are an asshole. Will become: You are an donutshole. +# Default filters by Jabelpeeps +filters: +- (\b.?anus),donuts +- (\ba+r*(se+|ss+(?!(ass|um|oc|ign|ist)).*?|s*e*h+[o0]*[l1]+e*[sz]*)\b),donuts +- (b[i1]a?tch(es)?),puppy +- Carpet Muncher,cookie monster +- (\bc((?!ook\b)[o0]+c*|aw)k\W?(sucker|s*|he[ea]*d)\b),rooster +- (\b[ck]r+a+p+(er|s|z)?\b),poopoo +- (\bcu+m+\b),go +- (\b.?[ck](u*n+|[l1]+[i1]+)t+[sz]*\b),peach +- (\b.?d[1i](c?k(head)?|[l1]+d[o0])e?[sz]?\b),rooster +- f u c k( e r)?,nono +- (\b.?fai*g+[oei1]*t*[sz]*\b),cigar +- Fudge Packer,fine person +- (\b(m[uo]+th[ae]r?)?(f|ph)uc*k*(e[rn]|ah*|ing?|)[sz]?\b),oh dear +- (\b(j(ac|er|ur)k\W?(of+))|(ji[sz]+i*m*)\b),bake brownies +- (\b(ma+s+te?rbai?te?[rs]?|wank(er)?[sz]?)\b),bake brownies +- orafi(s|ce),rooster +- (\bp+[e3]+[ai]*n+[i1!ua]+s+),rooster +- (\bp[i1]s+(?!(ton))(flap|face|drop)?),peepee +- (\b.?sh[i1!y]t+(er?|y|head)?[sz]*),poopoo +- (\bva[1i]?[gj]+[i1]+na+\b),peach +- vu[1l]+va,peach +- planet.?minecraft,another dimension +- pmc,another dimension +- ((\d+\.){3}\d+),another dimension + +# command without the / +blockablecommands: +- vote +- me + +# blacklisted nicknames +nicknames: +- Notch + +nickname-in-tablist: true + +# {player} : player sending command +# {command} : command typed +commandspy: + format: '&6{player}: {command}' + worldeditcommands: true + +antispam: + enabled: true + + # Number of messages to be spam + spamnumber: 5 + + # Amount of time in seconds for it to be spam + spamtime: 10 + + # Amount of time for the mute to last + # Acceptable units are: d,h,m,s + # Units can be combined, for example: 1d8h30m15s + # Use 0 for untimed mute + mutetime: 10m + +# Logging chat and commands to a mysql database +mysql: + enabled: false + user: User + port: 3306 + password: Password + host: localhost + database: Database + +# Loglevel feature is still in the works for adding of debug messages +# Valid loglevels: +# Info: Regular logging +# Debug: Show extra messages and caught errors for debugging +# Severe: Only show severe messages +loglevel: info + +# saveinterval is in minutes +saveinterval: 30 + +# If you're running a "cracked" server, player data might not be stored properly, and thus, you are on your own. +# If you run your server in offline mode, you might have to reset your player data when switching to online mode! +# If you see this warning by accident and you are using BungeeCord, make sure you have properly setup IP Forwarding. +# https://www.spigotmc.org/wiki/bungeecord-ip-forwarding/ +# No player data will be saved in offline mode unless you set this acknowledgement to 'true' +offline_server_acknowledgement: false + +# The time in seconds between each check to remove timed mutes +unmuteinterval: 60 + +# Enables or disabled BungeeCord messaging +bungeecordmessaging: false + +# Sound for message notification +# Enter 'None' to disable the sound +message_sound: ENTITY_PLAYER_LEVELUP + +# This will allow vanished players to be exempt from being sent private messages, and will act as if they aren't online +vanishsupport: true + +# Use PlaceholderAPI placeholders +# Start the placeholder with 'sender_' for the sending players placeholder +# Start the placeholder with 'receiver_' for the receiving players placeholder +# The defaults shown below provide an example of each +tellformatto: '&7You message {receiver_vault_prefix}{receiver_player_displayname}&7:' +tellformatfrom: '{sender_vault_prefix}{sender_player_displayname} &7messages you:' +tellformatspy: '{sender_player_name} messages {receiver_player_name}:&7' +replyformatto: '&7You reply to {receiver_vault_prefix}{receiver_player_displayname}&7:' +replyformatfrom: '{sender_vault_prefix}{sender_player_displayname} &7replies to you:' +replyformatspy: '{sender_player_name} replies to {receiver_player_name}:&7' + +# {host} : party hosts name +# {player} : player name +# use Default for the basic formatting +partyformat: Default + +formatcleaner: true + +# If true, /ignore will block chat from the ignored player as well as PM's +ignorechat: false + +# The message shown to players alerting them no one is in the channel to hear them +emptychannelalert: "&6No one is listening to you." + +messageremoverpermissions: '&cYou need additional permissions to view this message!' +messageremovertext: '&c&o' + +# The name of the group is the permissions node for the format +# Example: venturechat.json.Owner is the node for the group Owner +# A lower priority overrides a higher priority if a player has more than 1 group +# Possible options for click_name and click_prefix are suggest_command, run_command, and open_url +jsonformatting: + Default: # This default format is required! Do not delete or rename it! + priority: 2147483647 # Integer.MAX_VALUE + hover_name: + - '&6I have no rank!' + click_name: 'suggest_command' + click_name_text: '/msg {player_name}' + hover_prefix: + - '&dI am default!' + click_prefix: 'run_command' + click_prefix_text: '/help' + hover_suffix: + - '&dI am default suffix!' + click_suffix: 'suggest_command' + click_suffix_text: '/msg {player_name}' + Owner: + priority: 1 # Lowest Priority + hover_name: + - '&cOwner of the server!' + - '&bMessage me for help!' + click_name: 'suggest_command' + click_name_text: '/msg {player_name}' + hover_prefix: + - '&dServer Owner' + click_prefix: 'run_command' + click_prefix_text: '/help' + hover_suffix: + - '&dI am Owner suffix!' + click_suffix: 'suggest_command' + click_suffix_text: '/msg {player_name}' + +# The icon is the block shown in the GUI +# The text is the display name of the block icon +# Include a slash (/) before the command +# Permissions are the name of the button and automatically include "venturechat." +# Example: mute equals venturechat.mute +venturegui: + mute: + icon: 'REDSTONE_BLOCK' + durability: 0 + text: '&cMute {player_name} &410m' + permission: 'mute' + command: '/mute {channel} {player_name} 10m' + slot: 1 + unmute: + icon: 'DIAMOND_BLOCK' + durability: 0 + text: '&bUnmute {player_name}' + permission: 'mute' + command: '/unmute {channel} {player_name} ' + slot: 2 + removemessage: + icon: 'DIAMOND_AXE' + durability: 0 + text: '&cRemove Message' + permission: 'removemessage' + command: '/removemessage {hash} {channel}' + slot: 7 + +guiicon: '&c [✓]' +guitext: '&cOpen Moderation GUI' +guirows: 1 + +# All clickable URL's will be underlined if set to true +underlineurls: true + +# broadcast information +broadcast: + color: red + permissions: venturechat.adminchannel + displaytag: '[Broadcast]' + +# Use $ to include arguments into the message +# Valid component types are: +# Command: Sends a message or command in chat +# Message: Sends a message to the player +# Broadcast: Sends a broadcast to all players on the server +# Permissions automatically include "venturechat." +# Example: permissions: alert equals venturechat.alert +# Use None for no permissions +# The number of arguments is the minimum number of required arguments, use 0 for no required arguments +alias: + vote: + arguments: 0 + permissions: None + components: + - 'Message: &6Vote here: www.votelinkhere.com' + bane: + arguments: 2 + permissions: bane + components: + - 'Command: /ban $ appeal at www.site.com' + - 'Command: /st banned $' + alert: + arguments: 1 + permissions: alert + components: + - 'Broadcast: &c $' + donate: + arguments: 0 + permissions: None + components: + - 'Message: &bDonate here: www.mywebsite.com' + website: + arguments: 0 + permissions: None + components: + - 'Message: &aThis is our website: www.site.net' + +# Enables the creation of special Towny channels: Town and Nation +# To create these channels, simply name two channels below "Town" and "Nation" +# Bungeecord must be set to false for these channels! +enable_towny_channel: false + +# Enables the creation of a special faction only channel using the Factions plugin +# To create this channel, simply name a channel below "Faction" +# Bungeecord must be set to false for this channel! +# WARNING: May not work for all versions of Factions! +enable_factions_channel: false + +# color = [channel] color +# chatcolor = text color +# cooldown is in seconds +# bungeecord overrides distance +# channel permissions are configurable +# channels can be changed, and new channels can be created +# Permissions automatically include "venturechat." +# Example: permissions: staff equals venturechat.staff +# Use None for no permissions + +# Use PlaceholderAPI placeholders are required!!! +# Use PlaceholderAPI placeholders are required!!! +# Use PlaceholderAPI placeholders are required!!! +# /papi ecloud download [plugin] +# /papi reload +# Use '' or "" around format, example: '[&2global&f] {vault_prefix} {player_displayname}&2:' +# You must have prefixes and suffixes set in a Vault compatible permissions plugin to avoid errors +# Use "" as the prefix or suffix to have none + +# Set chatcolor to 'None' to have a group based chat color! Don't forget to put a suffix or other placeholder at the end of the format! + +# Important!!! +# Important!!! +# If you delete a channel, restart the server! Do not use /chatreload!!! +channels: + GroupChatColorExample: + color: '#706C1E' + chatcolor: 'None' + mutable: true + filter: true + autojoin: true + default: false + distance: 0 + cooldown: 0 + bungeecord: false + alias: ge + permissions: None + speak_permissions: None + format: '&f[#706C1EGroupColorChat&f] {vault_prefix} {player_displayname}#706C1E:{vault_suffix}' + HexExample: + color: '#ff0000' + chatcolor: '#ff0000' + mutable: true + filter: true + autojoin: true + default: false + distance: 0 + cooldown: 0 + bungeecord: false + alias: he + permissions: None + speak_permissions: None + format: '&f[#ff0000Hex&f] {vault_prefix} {player_displayname}#ff0000:' + BungeeExample: + color: gold + chatcolor: gold + mutable: true + filter: true + autojoin: true + default: false + distance: 0 + cooldown: 3 + bungeecord: true + alias: be + permissions: None + speak_permissions: None + format: '&f[&6Network&f] {vault_prefix} {player_displayname}&6:' + AnnouncementExample: + color: red + chatcolor: red + mutable: false + filter: false + autojoin: true + default: false + distance: 0 + cooldown: 0 + bungeecord: true + alias: announce + permissions: None + speak_permissions: announcement + format: '&f[&aServer Announcement&f] {vault_prefix} {player_displayname}&c:' + Global: + color: dark_green + chatcolor: dark_green + mutable: true + filter: true + autojoin: true + default: true + distance: 0 + cooldown: 0 + bungeecord: false + alias: g + permissions: None + speak_permissions: None + format: '&f[&2Global&f] {vault_prefix} {player_displayname}&2:' + Staff: + color: green + chatcolor: green + mutable: false + filter: false + autojoin: true + default: false + distance: 0 + cooldown: 0 + bungeecord: false + alias: st + permissions: staffchannel + speak_permissions: None + format: '&f[&aStaff&f] {vault_prefix} {player_displayname}&a:' + Donator: + color: light_purple + chatcolor: light_purple + mutable: true + filter: true + autojoin: true + default: false + distance: 0 + cooldown: 0 + bungeecord: false + alias: d + permissions: donatorchannel + speak_permissions: None + format: '&f[&dDonator&f] {vault_prefix} {player_displayname}&d:' + Help: + color: aqua + chatcolor: aqua + mutable: true + filter: true + autojoin: true + default: false + distance: 0 + cooldown: 0 + bungeecord: false + alias: h + permissions: None + speak_permissions: None + format: '&f[&bHelp&f] {vault_prefix} {player_displayname}&b:' + Trade: + color: dark_aqua + chatcolor: dark_aqua + mutable: true + filter: true + autojoin: true + default: false + distance: 0 + cooldown: 0 + bungeecord: false + alias: t + permissions: None + speak_permissions: None + format: '&f[&3Trade&f] {vault_prefix} {player_displayname}&3:' + Local: + color: yellow + chatcolor: yellow + mutable: true + filter: true + autojoin: true + default: false + distance: 230 + cooldown: 0 + bungeecord: false + alias: l + permissions: None + speak_permissions: None format: '&f[&eLocal&f] {vault_prefix} {player_displayname}&e:' \ No newline at end of file diff --git a/src/test/java/mineverse/Aust1n46/chat/utilities/FormatTest.java b/src/test/java/mineverse/Aust1n46/chat/utilities/FormatTest.java index e4403c2..e7dfb25 100644 --- a/src/test/java/mineverse/Aust1n46/chat/utilities/FormatTest.java +++ b/src/test/java/mineverse/Aust1n46/chat/utilities/FormatTest.java @@ -1,187 +1,187 @@ -package mineverse.Aust1n46.chat.utilities; - -import static mineverse.Aust1n46.chat.utilities.Format.BUKKIT_COLOR_CODE_PREFIX; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; -import java.util.List; - -import org.bukkit.configuration.file.FileConfiguration; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -import mineverse.Aust1n46.chat.MineverseChat; - -/** - * Tests {@link Format}. - */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({ MineverseChat.class }) -public class FormatTest { - - private MineverseChat mockPlugin; - private FileConfiguration mockConfig; - - private List filters; - - @Before - public void setUp() { - filters = new ArrayList(); - filters.add("ass,donut"); - - mockPlugin = Mockito.mock(MineverseChat.class); - mockConfig = Mockito.mock(FileConfiguration.class); - - PowerMockito.mockStatic(MineverseChat.class); - PowerMockito.when(MineverseChat.getInstance()).thenReturn(mockPlugin); - Mockito.when(mockPlugin.getConfig()).thenReturn(mockConfig); - Mockito.when(mockConfig.getStringList("filters")).thenReturn(filters); - } - - @After - public void tearDown() { - mockPlugin = null; - mockConfig = null; - filters = new ArrayList(); - } - - @Test - public void testGetLastCodeSingleColor() { - String input = BUKKIT_COLOR_CODE_PREFIX + "cHello"; - String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "c"; - - String result = Format.getLastCode(input); - - assertEquals(expectedResult, result); - } - - @Test - public void testGetLastCodeColorAfterFormat() { - String input = BUKKIT_COLOR_CODE_PREFIX + "o" + BUKKIT_COLOR_CODE_PREFIX + "cHello"; - String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "c"; - - String result = Format.getLastCode(input); - - assertEquals(expectedResult, result); - } - - @Test - public void testGetLastCodeColorBeforeFormat() { - String input = BUKKIT_COLOR_CODE_PREFIX + "c" + BUKKIT_COLOR_CODE_PREFIX + "oHello"; - String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "c" + BUKKIT_COLOR_CODE_PREFIX + "o"; - - String result = Format.getLastCode(input); - - assertEquals(expectedResult, result); - } - - @Test - public void testFilterChat() { - String test = "I am an ass"; - String expectedResult = "I am an donut"; - - String result = Format.FilterChat(test); - assertEquals(expectedResult, result); - } - - @Test - public void testIsValidColor() { - String color = "red"; - - boolean result = Format.isValidColor(color); - assertTrue(result); - } - - @Test - public void testIsInvalidColor() { - String color = "randomString"; - - boolean result = Format.isValidColor(color); - assertFalse(result); - } - - @Test - public void testIsValidHexColor() { - String hexColor = "#ff00ff"; - - boolean result = Format.isValidHexColor(hexColor); - assertTrue(result); - } - - @Test - public void testIsInvalidHexColor() { - String hexColor = "#random"; - - boolean result = Format.isValidHexColor(hexColor); - assertFalse(result); - } - - @Test - public void testConvertHexColorCodeToBukkitColorCode() { - String hexColor = "#ff00ff"; - String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "x" + BUKKIT_COLOR_CODE_PREFIX + "f" - + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "0" + BUKKIT_COLOR_CODE_PREFIX + "0" - + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "f"; - - String result = Format.convertHexColorCodeToBukkitColorCode(hexColor); - assertEquals(expectedResult, result); - } - - @Test - public void testConvertHexColorCodeStringToBukkitColorCodeString() { - String input = "#ff00ffHello" + BUKKIT_COLOR_CODE_PREFIX + "cThere#00ff00Austin"; - String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "x" + BUKKIT_COLOR_CODE_PREFIX + "f" - + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "0" + BUKKIT_COLOR_CODE_PREFIX + "0" - + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "fHello" + BUKKIT_COLOR_CODE_PREFIX - + "cThere" + BUKKIT_COLOR_CODE_PREFIX + "x" + BUKKIT_COLOR_CODE_PREFIX + "0" + BUKKIT_COLOR_CODE_PREFIX - + "0" + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "0" - + BUKKIT_COLOR_CODE_PREFIX + "0Austin"; - - String result = Format.convertHexColorCodeStringToBukkitColorCodeString(input); - assertEquals(expectedResult, result); - } - - @Test - public void testFormatStringLegacyColor_NoColorCode() { - String input = "Hello There Austin"; - String expectedResult = "Hello There Austin"; - - String result = Format.FormatStringLegacyColor(input); - assertEquals(expectedResult, result); - } - - @Test - public void testFormatStringLegacyColor_LegacyCodeOnly() { - String input = "Hello &cThere Austin"; - String expectedResult = "Hello " + BUKKIT_COLOR_CODE_PREFIX + "cThere Austin"; - - String result = Format.FormatStringLegacyColor(input); - assertEquals(expectedResult, result); - } - - @Test - public void testFormatStringLegacyColor_SpigotHexCodeOnly() { - String input = "&x&f&f&f&f&f&fHello There Austin"; - String expectedResult = "&x&f&f&f&f&f&fHello There Austin"; - - String result = Format.FormatStringLegacyColor(input); - assertEquals(expectedResult, result); - } - - @Test - public void testFormatStringLegacyColor_BothColorCodes() { - String input = "&x&f&f&f&f&f&f&cHello There Austin"; - String expectedResult = "&x&f&f&f&f&f&f" + BUKKIT_COLOR_CODE_PREFIX + "cHello There Austin"; - - String result = Format.FormatStringLegacyColor(input); - assertEquals(expectedResult, result); - } -} +package mineverse.Aust1n46.chat.utilities; + +import static mineverse.Aust1n46.chat.utilities.Format.BUKKIT_COLOR_CODE_PREFIX; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.configuration.file.FileConfiguration; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import mineverse.Aust1n46.chat.MineverseChat; + +/** + * Tests {@link Format}. + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({ MineverseChat.class }) +public class FormatTest { + + private MineverseChat mockPlugin; + private FileConfiguration mockConfig; + + private List filters; + + @Before + public void setUp() { + filters = new ArrayList(); + filters.add("ass,donut"); + + mockPlugin = Mockito.mock(MineverseChat.class); + mockConfig = Mockito.mock(FileConfiguration.class); + + PowerMockito.mockStatic(MineverseChat.class); + PowerMockito.when(MineverseChat.getInstance()).thenReturn(mockPlugin); + Mockito.when(mockPlugin.getConfig()).thenReturn(mockConfig); + Mockito.when(mockConfig.getStringList("filters")).thenReturn(filters); + } + + @After + public void tearDown() { + mockPlugin = null; + mockConfig = null; + filters = new ArrayList(); + } + + @Test + public void testGetLastCodeSingleColor() { + String input = BUKKIT_COLOR_CODE_PREFIX + "cHello"; + String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "c"; + + String result = Format.getLastCode(input); + + assertEquals(expectedResult, result); + } + + @Test + public void testGetLastCodeColorAfterFormat() { + String input = BUKKIT_COLOR_CODE_PREFIX + "o" + BUKKIT_COLOR_CODE_PREFIX + "cHello"; + String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "c"; + + String result = Format.getLastCode(input); + + assertEquals(expectedResult, result); + } + + @Test + public void testGetLastCodeColorBeforeFormat() { + String input = BUKKIT_COLOR_CODE_PREFIX + "c" + BUKKIT_COLOR_CODE_PREFIX + "oHello"; + String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "c" + BUKKIT_COLOR_CODE_PREFIX + "o"; + + String result = Format.getLastCode(input); + + assertEquals(expectedResult, result); + } + + @Test + public void testFilterChat() { + String test = "I am an ass"; + String expectedResult = "I am an donut"; + + String result = Format.FilterChat(test); + assertEquals(expectedResult, result); + } + + @Test + public void testIsValidColor() { + String color = "red"; + + boolean result = Format.isValidColor(color); + assertTrue(result); + } + + @Test + public void testIsInvalidColor() { + String color = "randomString"; + + boolean result = Format.isValidColor(color); + assertFalse(result); + } + + @Test + public void testIsValidHexColor() { + String hexColor = "#ff00ff"; + + boolean result = Format.isValidHexColor(hexColor); + assertTrue(result); + } + + @Test + public void testIsInvalidHexColor() { + String hexColor = "#random"; + + boolean result = Format.isValidHexColor(hexColor); + assertFalse(result); + } + + @Test + public void testConvertHexColorCodeToBukkitColorCode() { + String hexColor = "#ff00ff"; + String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "x" + BUKKIT_COLOR_CODE_PREFIX + "f" + + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "0" + BUKKIT_COLOR_CODE_PREFIX + "0" + + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "f"; + + String result = Format.convertHexColorCodeToBukkitColorCode(hexColor); + assertEquals(expectedResult, result); + } + + @Test + public void testConvertHexColorCodeStringToBukkitColorCodeString() { + String input = "#ff00ffHello" + BUKKIT_COLOR_CODE_PREFIX + "cThere#00ff00Austin"; + String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "x" + BUKKIT_COLOR_CODE_PREFIX + "f" + + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "0" + BUKKIT_COLOR_CODE_PREFIX + "0" + + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "fHello" + BUKKIT_COLOR_CODE_PREFIX + + "cThere" + BUKKIT_COLOR_CODE_PREFIX + "x" + BUKKIT_COLOR_CODE_PREFIX + "0" + BUKKIT_COLOR_CODE_PREFIX + + "0" + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "0" + + BUKKIT_COLOR_CODE_PREFIX + "0Austin"; + + String result = Format.convertHexColorCodeStringToBukkitColorCodeString(input); + assertEquals(expectedResult, result); + } + + @Test + public void testFormatStringLegacyColor_NoColorCode() { + String input = "Hello There Austin"; + String expectedResult = "Hello There Austin"; + + String result = Format.FormatStringLegacyColor(input); + assertEquals(expectedResult, result); + } + + @Test + public void testFormatStringLegacyColor_LegacyCodeOnly() { + String input = "Hello &cThere Austin"; + String expectedResult = "Hello " + BUKKIT_COLOR_CODE_PREFIX + "cThere Austin"; + + String result = Format.FormatStringLegacyColor(input); + assertEquals(expectedResult, result); + } + + @Test + public void testFormatStringLegacyColor_SpigotHexCodeOnly() { + String input = "&x&f&f&f&f&f&fHello There Austin"; + String expectedResult = "&x&f&f&f&f&f&fHello There Austin"; + + String result = Format.FormatStringLegacyColor(input); + assertEquals(expectedResult, result); + } + + @Test + public void testFormatStringLegacyColor_BothColorCodes() { + String input = "&x&f&f&f&f&f&f&cHello There Austin"; + String expectedResult = "&x&f&f&f&f&f&f" + BUKKIT_COLOR_CODE_PREFIX + "cHello There Austin"; + + String result = Format.FormatStringLegacyColor(input); + assertEquals(expectedResult, result); + } +}