diff --git a/src/Messages.yml b/src/Messages.yml index 8b0e3b2..8c77454 100644 --- a/src/Messages.yml +++ b/src/Messages.yml @@ -1,4 +1,4 @@ -Version: 2.20.0 +Version: 2.22.4 BlockCommandPlayer: '&cYou have been blocked from entering command {command}.' BlockCommandSender: '&cBlocked player &6{player} &cfrom entering command {command}.' BlockedCommand: '&cYou are blocked from entering this command: {command}' @@ -8,7 +8,7 @@ BungeeToggleOn: '&6You are now receiving BungeeCord chat.' ClearChatSender: '&aCleared the server chat.' ClearChatServer: '&aYour chat has been cleared.' ChannelCannotMute: '&cYou cannot mute players in this channel: {channel_color}{channel_name}' -ChannelCooldown: '&c{cooldown} {units} of cooldown remaining.' +ChannelCooldown: '&c{cooldown} of cooldown remaining.' ChannelList: '{channel_color}{channel_name} : {channel_alias}' ChannelListHeader: '&6Channel List : Alias' ChannelListWithPermissions: '{channel_color}{channel_name} : {channel_alias} - Permission Required' @@ -17,7 +17,9 @@ ChannelNoPermissionView: '&cYou do not have permission to look at this channel.' ChannelNoSpeakPermissions: '&cYou do not have permission to speak in this channel.' ChannelPlayerListHeader: '&6Players in Channel: {channel_color}{channel_name}' ChannelMuted: '&cYou are muted in this channel: {channel_color}{channel_name}' -ChannelMutedTimed: '&cYou are muted in this channel: {channel_color}{channel_name}&c for {time} more {units}' +ChannelMutedReason: '&cYou are muted in this channel: {channel_color}{channel_name} &4Reason:&c {reason}' +ChannelMutedTimed: '&cYou are muted in this channel: {channel_color}{channel_name}&c for {time}' +ChannelMutedTimedReason: '&cYou are muted in this channel: {channel_color}{channel_name}&c for {time} &4Reason:&c {reason}' CommandInvalidArguments: '&cInvalid command: {command} {args}' CommandInvalidArgumentsIgnore: '&cInvalid command: /ignore [player] or /ignore list' CommandMustBeRunByPlayer: '&cThis command must be run by a player.' @@ -52,13 +54,17 @@ MessageToggleOff: '&6You are now blocking messages.' MessageToggleOn: '&6You are now receiving messages.' MustListenOneChannel: '&cYou need to be listening on at least one channel, setting you into the default channel.' MutePlayerAllPlayer: '&cYou have just been muted in all channels.' +MutePlayerAllPlayerReason: '&cYou have just been muted in all channels. &4Reason:&c {reason}' MutePlayerAllSender: '&cMuted player &6{player} &cin all channels.' +MutePlayerAllSenderReason: '&cMuted player &6{player} &cin all channels. &4Reason:&c {reason}' MutePlayerPlayer: '&cYou have just been muted in: {channel_color}{channel_name}' -MutePlayerPlayerTime: '&cYou have just been muted in: {channel_color}{channel_name} &cfor {time} {units}' -MutePlayerSpam: '&cYou have been muted for spamming in: {channel_color}{channel_name}' -MutePlayerSpamTime: '&cYou have been muted for spamming in: {channel_color}{channel_name} &cfor {time} {units}' +MutePlayerPlayerReason: '&cYou have just been muted in: {channel_color}{channel_name} &4Reason:&c {reason}' +MutePlayerPlayerTime: '&cYou have just been muted in: {channel_color}{channel_name} &cfor {time}' +MutePlayerPlayerTimeReason: '&cYou have just been muted in: {channel_color}{channel_name} &cfor {time} &4Reason:&c {reason}' MutePlayerSender: '&cMuted player &6{player} &cin: {channel_color}{channel_name}' -MutePlayerSenderTime: '&cMuted player &6{player} &cin: {channel_color}{channel_name} &cfor {time} {units}' +MutePlayerSenderReason: '&cMuted player &6{player} &cin: {channel_color}{channel_name} &4Reason:&c {reason}' +MutePlayerSenderTime: '&cMuted player &6{player} &cin: {channel_color}{channel_name} &cfor {time}' +MutePlayerSenderTimeReason: '&cMuted player &6{player} &cin: {channel_color}{channel_name} &cfor {time} &4Reason:&c {reason}' NoPlayerToReplyTo: '&cYou do not have anyone to reply to.' NotificationsOff: '&aYou are no longer receiving notifications.' NotificationsOn: '&aYou are now receiving notifications.' @@ -73,11 +79,16 @@ SetChannelAllPlayer: '&cYou have been set into all channels.' SetChannelAllSender: '&6Set player &c{player} &6into all channels.' SetChannelPlayerChannelNoPermission: '&cThis player does not have permission for channel: {channel_color}{channel_name}' SetChannelSender: '&6Set player &c{player} &6into channel: {channel_color}{channel_name}' +SpamMuteReasonText: 'Spamming' SpamWarning: '&cSlow down your chat! You''re halfway to being muted for spam!' SpyOff: '&6You are no longer spying.' SpyOn: '&6You are now spying.' UnblockCommandPlayer: '&cYou have been unblocked from entering command {command}.' UnblockCommandSender: '&cUnblocked player &6{player} &cfrom entering command {command}.' +UnitsDayPlural: 'days' +UnitsDaySingular: 'day' +UnitsHourPlural: 'hours' +UnitsHourSingular: 'hour' UnitsMinutePlural: 'minutes' UnitsMinuteSingular: 'minute' UnitsSecondPlural: 'seconds' diff --git a/src/bungee.yml b/src/bungee.yml index c8954d7..d43476c 100644 --- a/src/bungee.yml +++ b/src/bungee.yml @@ -1,4 +1,4 @@ name: VentureChat -main: mineverse.Aust1n46.chat.bungee.MineverseChatBungee -version: 2.22.3 +main: mineverse.Aust1n46.chat.bungee.MineverseChatBungee +version: 2.22.4 author: Aust1n46 \ No newline at end of file diff --git a/src/config.yml b/src/config.yml index 270e63d..e89b849 100644 --- a/src/config.yml +++ b/src/config.yml @@ -55,14 +55,17 @@ commandspy: antispam: enabled: true - # number of messages to be spam + # Number of messages to be spam spamnumber: 5 - # amount of time in seconds for it to be spam + # Amount of time in seconds for it to be spam spamtime: 10 - # amount of time in minutes for the mute to last, use 0 for untimed mute - mutetime: 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: @@ -105,6 +108,9 @@ 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 @@ -179,16 +185,16 @@ venturegui: mute: icon: 'REDSTONE_BLOCK' durability: 0 - text: '&cMute {player_name}' + text: '&cMute {player_name} &410m' permission: 'mute' - command: '/mute {player_name} {channel} 10' + command: '/mute {channel} {player_name} 10m' slot: 1 unmute: icon: 'DIAMOND_BLOCK' durability: 0 text: '&bUnmute {player_name}' permission: 'mute' - command: '/unmute {player_name} {channel}' + command: '/unmute {channel} {player_name} ' slot: 2 removemessage: icon: 'DIAMOND_AXE' diff --git a/src/defaultconfig.yml b/src/example_config_always_up_to_date!.yml similarity index 93% rename from src/defaultconfig.yml rename to src/example_config_always_up_to_date!.yml index 06b1c27..e89b849 100644 --- a/src/defaultconfig.yml +++ b/src/example_config_always_up_to_date!.yml @@ -1,6 +1,6 @@ #=============================================================== # VentureChat Config = -# Author: Aust1n46 = +# Author: Aust1n46 = #=============================================================== # - regex1,regex2 @@ -55,14 +55,17 @@ commandspy: antispam: enabled: true - # number of messages to be spam + # Number of messages to be spam spamnumber: 5 - # amount of time in seconds for it to be spam + # Amount of time in seconds for it to be spam spamtime: 10 - # amount of time in minutes for the mute to last, use 0 for untimed mute - mutetime: 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: @@ -105,6 +108,9 @@ 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 @@ -179,16 +185,16 @@ venturegui: mute: icon: 'REDSTONE_BLOCK' durability: 0 - text: '&cMute {player_name}' + text: '&cMute {player_name} &410m' permission: 'mute' - command: '/mute {player_name} {channel} 10' + command: '/mute {channel} {player_name} 10m' slot: 1 unmute: icon: 'DIAMOND_BLOCK' durability: 0 text: '&bUnmute {player_name}' permission: 'mute' - command: '/unmute {player_name} {channel}' + command: '/unmute {channel} {player_name} ' slot: 2 removemessage: icon: 'DIAMOND_AXE' diff --git a/src/mineverse/Aust1n46/chat/MineverseChat.java b/src/mineverse/Aust1n46/chat/MineverseChat.java index ba14da2..b43d643 100644 --- a/src/mineverse/Aust1n46/chat/MineverseChat.java +++ b/src/mineverse/Aust1n46/chat/MineverseChat.java @@ -1,7 +1,3 @@ -/* - * VentureChat plugin for Minecraft servers running Bukkit or Spigot software. - * @author Aust1n46 - */ package mineverse.Aust1n46.chat; import java.io.ByteArrayInputStream; @@ -12,9 +8,7 @@ import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Calendar; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -81,11 +75,11 @@ 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.MuteContainer; import mineverse.Aust1n46.chat.command.mute.Muteall; import mineverse.Aust1n46.chat.command.mute.Unmute; import mineverse.Aust1n46.chat.command.mute.Unmuteall; import mineverse.Aust1n46.chat.database.Database; -import mineverse.Aust1n46.chat.database.MySQL; import mineverse.Aust1n46.chat.database.PlayerData; import mineverse.Aust1n46.chat.gui.GuiSlotInfo; import mineverse.Aust1n46.chat.utilities.Format; @@ -97,15 +91,12 @@ import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandMap; import org.bukkit.command.SimpleCommandMap; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; 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 org.bukkit.Sound; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; @@ -113,6 +104,10 @@ import com.comphenix.protocol.utility.MinecraftReflection; import me.clip.placeholderapi.PlaceholderAPI; +/** + * VentureChat Minecraft plugin for servers running Spigot or Paper software. + * @author Aust1n46 + */ public class MineverseChat extends JavaPlugin implements PluginMessageListener { // Listeners -------------------------------- private ChatListener chatListener; @@ -135,9 +130,6 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { private MineverseCommandExecutor commandExecutor; private Map commands = new HashMap(); - // Database ------------------------------------ - public Database db = null; - // Misc -------------------------------- public static AliasInfo aaInfo; public static JsonFormatInfo jfInfo; @@ -195,7 +187,7 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Config found! Loading file.")); } - saveResource("defaultconfig.yml", true); + saveResource("example_config_always_up_to_date!.yml", true); } catch(Exception ex) { log.severe(String.format("[" + String.format("VentureChat") + "]" + " - Could not load configuration!\n " + ex, getDescription().getName())); @@ -248,17 +240,10 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { MineverseChatAPI.addMineverseChatOnlinePlayerToMap(mcp); MineverseChatAPI.addNameToMap(mcp); } - - FileConfiguration config = getConfig(); - ConfigurationSection mysqlConfig = config.getConfigurationSection("mysql"); - if (this.getConfig().getConfigurationSection("mysql").getBoolean("enabled")) { - String host = mysqlConfig.getString("host"); - int port = mysqlConfig.getInt("port"); - String database = mysqlConfig.getString("database"); - String user = mysqlConfig.getString("user"); - String password = mysqlConfig.getString("password"); - db = new MySQL(host, port, database, user, password); - } + + Bukkit.getScheduler().runTaskAsynchronously(this, () -> { + Database.initializeMySQL(); + }); commands.put("broadcast", new Broadcast("broadcast")); commands.put("channel", new Channel("channel")); @@ -391,25 +376,27 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { @Override public void run() { for (MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - int time = Format.currentTimeMillis(); - Iterator iterator = p.getMutes().keySet().iterator(); + long currentTimeMillis = System.currentTimeMillis(); + Iterator iterator = p.getMutes().iterator(); while (iterator.hasNext()) { - ChatChannel channel = ChatChannel.getChannel(iterator.next()); - int timemark = p.getMutes().get(channel.getName()); - if (timemark == 0) { - continue; - } - if (getConfig().getString("loglevel", "info").equals("debug")) { - System.out.println(time + " " + timemark); - } - if (time >= timemark) { - iterator.remove(); - if (p.isOnline()) { + 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}", channel.getName())); - } else { - p.setModified(true); + .replace("{channel_name}", mute.getChannel())); + if(channel.getBungee()) { + MineverseChat.getInstance().synchronize(p, true); + } } } } @@ -419,7 +406,7 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { .sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Updating Player Mutes")); } } - }, 0L, 1200L); // one minute interval + }, 0L, 60L); // three second interval } @Override @@ -548,6 +535,15 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { // System.out.println(mcp.getPlayer().getServer().getServerName()); // out.writeUTF(mcp.getPlayer().getServer().getServerName()); out.writeUTF(mcp.getUUID().toString()); + Bukkit.getServer().getScheduler().runTaskLaterAsynchronously(this, new Runnable() { + @Override + public void run() { + if(mcp.hasPlayed()) { + return; + } + synchronize(mcp, false); + } + }, 20L); // one second delay before running again } else { out.writeUTF("Update"); @@ -569,18 +565,20 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { } // out.writeUTF("Mutes"); int muteCount = 0; - for(String c : mcp.getMutes().keySet()) { - ChatChannel channel = ChatChannel.getChannel(c); + for(MuteContainer mute : mcp.getMutes()) { + ChatChannel channel = ChatChannel.getChannel(mute.getChannel()); if(channel.getBungee()) { muteCount++; } } // System.out.println(muteCount + " mutes"); out.write(muteCount); - for(String c : mcp.getMutes().keySet()) { - ChatChannel channel = ChatChannel.getChannel(c); + 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; @@ -607,6 +605,10 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { } } + public static void sendPluginMessage(ByteArrayOutputStream byteOutStream) { + MineverseChatAPI.getOnlineMineverseChatPlayers().iterator().next().getPlayer().sendPluginMessage(MineverseChat.getInstance(), MineverseChat.PLUGIN_MESSAGING_CHANNEL, byteOutStream.toByteArray()); + } + public static void sendDiscordSRVPluginMessage(String chatChannel, String message) { if(MineverseChatAPI.getOnlineMineverseChatPlayers().size() == 0) { return; @@ -680,11 +682,8 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { Bukkit.getConsoleSender().sendMessage(consoleChat); - if(db != null) { - Calendar currentDate = Calendar.getInstance(); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String date = formatter.format(currentDate.getTime()); - db.writeVentureChat(date, senderUUID.toString(), senderName, server, chatchannel, chat.replace("'", "''"), "Chat"); + if(Database.isEnabled()) { + Database.writeVentureChat(senderUUID.toString(), senderName, server, chatchannel, chat.replace("'", "''"), "Chat"); } for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { @@ -794,6 +793,9 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { } String uuid = msgin.readUTF(); MineverseChatPlayer p = MineverseChatAPI.getMineverseChatPlayer(UUID.fromString(uuid)); + if(p.hasPlayed()) { + return; + } for(Object ch : p.getListening().toArray()) { String c = ch.toString(); ChatChannel cha = ChatChannel.getChannel(c); @@ -811,19 +813,16 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { } } } - for(Object o : p.getMutes().keySet().toArray()) { - ChatChannel ch = ChatChannel.getChannel((String) o); - if(ch.getBungee()) { - p.removeMute(ch.getName()); - } - } + 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, 0); + p.addMute(ch, muteTime, muteReason); } } // System.out.println(msgin.available() + " available before"); @@ -843,7 +842,7 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { if(!p.hasPlayed()) { boolean isThereABungeeChannel = false; for(ChatChannel ch : ChatChannel.getAutojoinList()) { - if(!ch.hasPermission() || p.getPlayer().hasPermission(ch.getPermission())) { + if((!ch.hasPermission() || p.getPlayer().hasPermission(ch.getPermission())) && !p.isListening(ch.getName())) { p.addListening(ch.getName()); if(ch.getBungee()) { isThereABungeeChannel = true; @@ -909,6 +908,324 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { this.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")) { @@ -917,12 +1234,11 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { MineverseChatPlayer p = MineverseChatAPI.getOnlineMineverseChatPlayer(receiver); UUID sender = UUID.fromString(msgin.readUTF()); String sName = msgin.readUTF(); - MineverseChatPlayer s = MineverseChatAPI.getMineverseChatPlayer(sender); String send = msgin.readUTF(); String echo = msgin.readUTF(); String spy = msgin.readUTF(); String msg = msgin.readUTF(); - if(!this.getConfig().getBoolean("bungeecordmessaging", true) || p == null || !p.isOnline()) { + if(!this.getConfig().getBoolean("bungeecordmessaging", true) || p == null) { out.writeUTF("Message"); out.writeUTF("Offline"); out.writeUTF(server); @@ -949,28 +1265,9 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); return; } - else { - UUID uuid = sender; - String name = sName; - ChatChannel current = ChatChannel.getDefaultChannel(); - Set ignores = new HashSet(); - Set listening = new HashSet(); - listening.add(current.getName()); - HashMap mutes = new HashMap(); - Set blockedCommands = new HashSet(); - String jsonFormat = "Default"; - s = new MineverseChatPlayer(uuid, name, current, ignores, listening, mutes, blockedCommands, false, null, true, true, name, jsonFormat, false, false, false, true, true); - MineverseChatAPI.addMineverseChatPlayerToMap(s); - MineverseChatAPI.addNameToMap(s); - } p.getPlayer().sendMessage(Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(p.getPlayer(), send.replaceAll("receiver_", ""))) + msg); if(p.hasNotifications()) { - if(VersionHandler.is1_8() || VersionHandler.is1_7_10() || VersionHandler.is1_7_2() || VersionHandler.is1_7_9()) { - p.getPlayer().playSound(p.getPlayer().getLocation(), Sound.valueOf("LEVEL_UP"), 1, 0); - } - else { - p.getPlayer().playSound(p.getPlayer().getLocation(), Sound.valueOf("ENTITY_PLAYER_LEVELUP"), 1, 0); - } + Format.playMessageSound(p); } p.setReplyPlayer(sender); out.writeUTF("Message"); @@ -1021,319 +1318,14 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { String receiverName = msgin.readUTF(); String senderName = msgin.readUTF(); String spy = msgin.readUTF(); - for(MineverseChatPlayer pl : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - if(pl.isSpy() && !pl.getName().equals(senderName) && !pl.getName().equals(receiverName)) { - pl.getPlayer().sendMessage(spy); - } - } - } - } - if(subchannel.equals("Mute")) { - String sendplayer = msgin.readUTF(); - String mutePlayer = msgin.readUTF(); - String chatchannel = msgin.readUTF(); - String server = msgin.readUTF(); - String time = msgin.readUTF(); - int numtime = 0; - MineverseChatPlayer p = MineverseChatAPI.getMineverseChatPlayer(mutePlayer); - ChatChannel cc = ChatChannel.getChannel(chatchannel); - if(cc == null) { - try { - out.writeUTF("Mute"); - out.writeUTF("Channel"); - out.writeUTF(sendplayer); - out.writeUTF(chatchannel); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - if(p == null) { - try { - out.writeUTF("Mute"); - out.writeUTF("Player"); - out.writeUTF(sendplayer); - out.writeUTF(mutePlayer); - out.writeUTF(server); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - if(!cc.isMutable()) { - try { - out.writeUTF("Mute"); - out.writeUTF("Mutable"); - out.writeUTF(sendplayer); - out.writeUTF(cc.getName()); - out.writeUTF(cc.getColor()); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - if(p.isMuted(cc.getName())) { - try { - out.writeUTF("Mute"); - out.writeUTF("Already"); - out.writeUTF(sendplayer); - out.writeUTF(mutePlayer); - out.writeUTF(cc.getName()); - out.writeUTF(cc.getColor()); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - if(!time.equals("None\n")) { - try { - numtime = Integer.parseInt(time); - if(numtime > 0) { - Calendar currentDate = Calendar.getInstance(); - SimpleDateFormat formatter = new SimpleDateFormat("dd:HH:mm:ss"); - String date = formatter.format(currentDate.getTime()); - String[] datearray = date.split(":"); - int datetime = (Integer.parseInt(datearray[0]) * 1440) + (Integer.parseInt(datearray[1]) * 60) + (Integer.parseInt(datearray[2])); - p.addMute(cc.getName(), datetime + numtime); - String keyword = "minutes"; - if(numtime == 1) keyword = "minute"; - if(p.isOnline()) p.getPlayer().sendMessage(ChatColor.RED + "You have just been muted in: " + ChatColor.valueOf(cc.getColor().toUpperCase()) + cc.getName() + ChatColor.RED + " for " + time + " " + keyword); - else p.setModified(true); - if(cc.getBungee()) { - MineverseChat.getInstance().synchronize(p, true); + 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); } - try { - out.writeUTF("Mute"); - out.writeUTF("Valid"); - out.writeUTF(sendplayer); - out.writeUTF(mutePlayer); - out.writeUTF(cc.getName()); - out.writeUTF(cc.getColor()); - out.writeUTF(time); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - try { - out.writeUTF("Mute"); - out.writeUTF("Time"); - out.writeUTF(sendplayer); - out.writeUTF(time); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - catch(Exception e) { - try { - out.writeUTF("Mute"); - out.writeUTF("Time"); - out.writeUTF(sendplayer); - out.writeUTF(time); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e1) { - e1.printStackTrace(); - } - return; - } - } - p.addMute(cc.getName(), 0); - if(p.isOnline()) p.getPlayer().sendMessage(ChatColor.RED + "You have just been muted in: " + ChatColor.valueOf(cc.getColor().toUpperCase()) + cc.getName()); - else p.setModified(true); - if(cc.getBungee()) { - MineverseChat.getInstance().synchronize(p, true); - } - try { - out.writeUTF("Mute"); - out.writeUTF("Valid"); - out.writeUTF(sendplayer); - out.writeUTF(mutePlayer); - out.writeUTF(cc.getName()); - out.writeUTF(cc.getColor()); - out.writeUTF(time); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - if(subchannel.equals("Muteall")) { - String sendplayer = msgin.readUTF(); - String muteplayer = msgin.readUTF(); - String server = msgin.readUTF(); - Player mp = Bukkit.getPlayer(muteplayer); - MineverseChatPlayer p = MineverseChatAPI.getMineverseChatPlayer(mp); - if(mp == null) { - try { - out.writeUTF("Muteall"); - out.writeUTF("Player"); - out.writeUTF(sendplayer); - out.writeUTF(muteplayer); - out.writeUTF(server); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - boolean bungee = false; - for(ChatChannel c : ChatChannel.getChannels()) { - if(c.isMutable()) { - p.addMute(c.getName(), 0); - if(c.getBungee()) { - bungee = true; } } } - if(bungee) { - MineverseChat.getInstance().synchronize(p, true); - } - if(p.isOnline()) { - p.getPlayer().sendMessage(ChatColor.RED + "You have just been muted in all channels."); - } - else p.setModified(true); - try { - out.writeUTF("Muteall"); - out.writeUTF("Valid"); - out.writeUTF(sendplayer); - out.writeUTF(muteplayer); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - if(subchannel.equals("Unmuteall")) { - String sendplayer = msgin.readUTF(); - String muteplayer = msgin.readUTF(); - String server = msgin.readUTF(); - Player mp = Bukkit.getPlayer(muteplayer); - MineverseChatPlayer p = MineverseChatAPI.getMineverseChatPlayer(mp); - if(mp == null) { - try { - out.writeUTF("Unmuteall"); - out.writeUTF("Player"); - out.writeUTF(sendplayer); - out.writeUTF(muteplayer); - out.writeUTF(server); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - boolean bungee = false; - for(ChatChannel c : ChatChannel.getChannels()) { - p.removeMute(c.getName()); - if(c.getBungee()) { - bungee = true; - } - } - if(bungee) { - MineverseChat.getInstance().synchronize(p, true); - } - if(p.isOnline()) { - p.getPlayer().sendMessage(ChatColor.RED + "You have just been unmuted in all channels."); - } - else p.setModified(true); - try { - out.writeUTF("Unmuteall"); - out.writeUTF("Valid"); - out.writeUTF(sendplayer); - out.writeUTF(muteplayer); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - if(subchannel.equals("Unmute")) { - String sendplayer = msgin.readUTF(); - String mutePlayer = msgin.readUTF(); - String chatchannel = msgin.readUTF(); - String server = msgin.readUTF(); - MineverseChatPlayer p = MineverseChatAPI.getMineverseChatPlayer(mutePlayer); - ChatChannel cc = ChatChannel.getChannel(chatchannel); - if(cc == null) { - try { - out.writeUTF("Unmute"); - out.writeUTF("Channel"); - out.writeUTF(sendplayer); - out.writeUTF(chatchannel); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - if(p == null) { - try { - out.writeUTF("Unmute"); - out.writeUTF("Player"); - out.writeUTF(sendplayer); - out.writeUTF(mutePlayer); - out.writeUTF(server); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - if(!p.isMuted(cc.getName())) { - try { - out.writeUTF("Unmute"); - out.writeUTF("Already"); - out.writeUTF(sendplayer); - out.writeUTF(mutePlayer); - out.writeUTF(cc.getName()); - out.writeUTF(cc.getColor()); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - p.removeMute(cc.getName()); - if(p.isOnline()) p.getPlayer().sendMessage(ChatColor.RED + "You have just been unmuted in: " + ChatColor.valueOf(cc.getColor().toUpperCase()) + cc.getName()); - else p.setModified(true); - if(cc.getBungee()) { - MineverseChat.getInstance().synchronize(p, true); - } - try { - out.writeUTF("Unmute"); - out.writeUTF("Valid"); - out.writeUTF(sendplayer); - out.writeUTF(mutePlayer); - out.writeUTF(cc.getName()); - out.writeUTF(cc.getColor()); - player.sendPluginMessage(this, MineverseChat.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - } - catch(Exception e) { - e.printStackTrace(); - } - return; } } catch(Exception e) { diff --git a/src/mineverse/Aust1n46/chat/api/MineverseChatPlayer.java b/src/mineverse/Aust1n46/chat/api/MineverseChatPlayer.java index 70ca53a..6f811e8 100644 --- a/src/mineverse/Aust1n46/chat/api/MineverseChatPlayer.java +++ b/src/mineverse/Aust1n46/chat/api/MineverseChatPlayer.java @@ -1,7 +1,9 @@ package mineverse.Aust1n46.chat.api; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.UUID; @@ -9,6 +11,7 @@ import java.util.UUID; import mineverse.Aust1n46.chat.ChatMessage; import mineverse.Aust1n46.chat.MineverseChat; import mineverse.Aust1n46.chat.channel.ChatChannel; +import mineverse.Aust1n46.chat.command.mute.MuteContainer; import mineverse.Aust1n46.chat.json.JsonFormat; import org.bukkit.Bukkit; @@ -22,7 +25,7 @@ public class MineverseChatPlayer { private ChatChannel currentChannel; private Set ignores; private Set listening; - private HashMap mutes; + private HashMap mutes; private Set blockedCommands; private boolean host; private UUID party; @@ -38,9 +41,9 @@ public class MineverseChatPlayer { private boolean quickChat; private ChatChannel quickChannel; private UUID replyPlayer; - private HashMap cooldowns; + private HashMap cooldowns; private boolean partyChat; - private HashMap> spam; + private HashMap> spam; private boolean modified; private List messages; private String jsonFormat; @@ -49,15 +52,8 @@ public class MineverseChatPlayer { private boolean rangedSpy; private boolean messageToggle; private boolean bungeeToggle; - - //buttons variable no longer used - //mail variable no longer used - @Deprecated - public MineverseChatPlayer(UUID uuid, String name, ChatChannel currentChannel, Set ignores, Set listening, HashMap mutes, Set blockedCommands, List mail, boolean host, UUID party, boolean filter, boolean notifications, String nickname, String jsonFormat, boolean spy, boolean commandSpy, boolean rangedSpy, boolean buttons, boolean messageToggle, boolean bungeeToggle) { - this(uuid, name, currentChannel, ignores, listening, mutes, blockedCommands, host, party, filter, notifications, nickname, jsonFormat, spy, commandSpy, rangedSpy, messageToggle, bungeeToggle); - } - public MineverseChatPlayer(UUID uuid, String name, ChatChannel currentChannel, Set ignores, Set listening, HashMap mutes, Set blockedCommands, boolean host, UUID party, boolean filter, boolean notifications, String nickname, String jsonFormat, boolean spy, boolean commandSpy, boolean rangedSpy, boolean messageToggle, boolean bungeeToggle) { + public MineverseChatPlayer(UUID uuid, String name, ChatChannel currentChannel, Set ignores, Set listening, HashMap mutes, Set blockedCommands, boolean host, UUID party, boolean filter, boolean notifications, String nickname, String jsonFormat, boolean spy, boolean commandSpy, boolean rangedSpy, boolean messageToggle, boolean bungeeToggle) { this.uuid = uuid; this.name = name; this.currentChannel = currentChannel; @@ -84,12 +80,46 @@ public class MineverseChatPlayer { this.modified = false; this.messages = new ArrayList(); this.jsonFormat = jsonFormat; - this.cooldowns = new HashMap(); - this.spam = new HashMap>(); + this.cooldowns = new HashMap(); + this.spam = new HashMap>(); this.messageToggle = messageToggle; this.bungeeToggle = bungeeToggle; } + public MineverseChatPlayer(UUID uuid, String name) { + this.uuid = uuid; + this.name = name; + this.currentChannel = ChatChannel.getDefaultChannel(); + this.ignores = new HashSet(); + this.listening = new HashSet(); + listening.add(currentChannel.getName()); + this.mutes = new HashMap(); + this.blockedCommands = new HashSet(); + this.host = false; + this.party = null; + this.filter = true; + this.notifications = true; + this.nickname = name; + this.online = false; + this.player = null; + this.hasPlayed = false; + this.conversation = null; + this.spy = false; + this.rangedSpy = false; + this.commandSpy = false; + this.quickChat = false; + this.quickChannel = null; + this.replyPlayer = null; + this.partyChat = false; + this.modified = false; + this.messages = new ArrayList(); + this.jsonFormat = "Default"; + this.cooldowns = new HashMap(); + this.spam = new HashMap>(); + this.messageToggle = true; + this.bungeeToggle = true; + } + public boolean getBungeeToggle() { return this.bungeeToggle; } @@ -214,13 +244,29 @@ public class MineverseChatPlayer { this.listening.clear(); } - public HashMap getMutes() { - return this.mutes; + public Collection getMutes() { + return this.mutes.values(); + } + + public MuteContainer getMute(String channel) { + return mutes.get(channel); } - public boolean addMute(String channel, int time) { + public boolean addMute(String channel) { + return addMute(channel, 0, ""); + } + + public boolean addMute(String channel, long time) { + return addMute(channel, time, ""); + } + + public boolean addMute(String channel, String reason) { + return addMute(channel, 0, reason); + } + + public boolean addMute(String channel, long time, String reason) { if(channel != null && time >= 0) { - mutes.put(channel, time); + mutes.put(channel, new MuteContainer(channel, time, reason)); return true; } return false; @@ -412,11 +458,11 @@ public class MineverseChatPlayer { this.partyChat = partyChat; } - public HashMap getCooldowns() { + public HashMap getCooldowns() { return this.cooldowns; } - public boolean addCooldown(ChatChannel channel, int time) { + public boolean addCooldown(ChatChannel channel, long time) { if(channel != null && time > 0) { cooldowns.put(channel, time); return true; @@ -436,7 +482,7 @@ public class MineverseChatPlayer { return channel != null && this.cooldowns != null ? this.cooldowns.containsKey(channel) : false; } - public HashMap> getSpam() { + public HashMap> getSpam() { return this.spam; } @@ -446,7 +492,7 @@ public class MineverseChatPlayer { public boolean addSpam(ChatChannel channel) { if(channel != null) { - spam.put(channel, new ArrayList()); + spam.put(channel, new ArrayList()); return true; } return false; diff --git a/src/mineverse/Aust1n46/chat/api/SynchronizedMineverseChatPlayer.java b/src/mineverse/Aust1n46/chat/api/SynchronizedMineverseChatPlayer.java index 591aaa0..a6cee45 100644 --- a/src/mineverse/Aust1n46/chat/api/SynchronizedMineverseChatPlayer.java +++ b/src/mineverse/Aust1n46/chat/api/SynchronizedMineverseChatPlayer.java @@ -1,22 +1,26 @@ package mineverse.Aust1n46.chat.api; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.UUID; +import mineverse.Aust1n46.chat.command.mute.MuteContainer; + public class SynchronizedMineverseChatPlayer { private UUID uuid; private Set listening; - private HashMap mutes; + private HashMap mutes; private Set ignores; private int messagePackets; private List messageData = new ArrayList(); private boolean spy; private boolean messageToggle; - public SynchronizedMineverseChatPlayer(UUID uuid, Set listening, HashMap mutes, Set ignores, boolean spy, boolean messageToggle) { + public SynchronizedMineverseChatPlayer(UUID uuid, Set listening, HashMap mutes, Set ignores, boolean spy, boolean messageToggle) { this.uuid = uuid; this.listening = listening; this.mutes = mutes; @@ -25,6 +29,15 @@ public class SynchronizedMineverseChatPlayer { this.messageToggle = messageToggle; } + public SynchronizedMineverseChatPlayer(UUID uuid) { + this.uuid = uuid; + listening = new HashSet(); + mutes = new HashMap(); + ignores = new HashSet(); + spy = false; + messageToggle = true; + } + public List getMessageData() { return this.messageData; } @@ -61,16 +74,16 @@ public class SynchronizedMineverseChatPlayer { return this.ignores; } - public void addMute(String channel) { - this.mutes.put(channel, 0); + public void addMute(String channel, long time, String reason) { + mutes.put(channel, new MuteContainer(channel, time, reason)); } - public void removeMute(String channel) { - this.mutes.remove(channel); + public void clearMutes() { + this.mutes.clear(); } - public HashMap getMutes() { - return this.mutes; + public Collection getMutes() { + return this.mutes.values(); } public void addListening(String channel) { diff --git a/src/mineverse/Aust1n46/chat/bungee/MineverseChatBungee.java b/src/mineverse/Aust1n46/chat/bungee/MineverseChatBungee.java index 27cd8a1..2493b1e 100644 --- a/src/mineverse/Aust1n46/chat/bungee/MineverseChatBungee.java +++ b/src/mineverse/Aust1n46/chat/bungee/MineverseChatBungee.java @@ -6,20 +6,14 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.nio.file.Files; -import java.util.HashMap; -import java.util.HashSet; import java.util.UUID; import mineverse.Aust1n46.chat.api.MineverseChatAPI; import mineverse.Aust1n46.chat.api.SynchronizedMineverseChatPlayer; -import mineverse.Aust1n46.chat.bungee.command.GlobalMute; -import mineverse.Aust1n46.chat.bungee.command.GlobalMuteAll; -import mineverse.Aust1n46.chat.bungee.command.GlobalUnmute; -import mineverse.Aust1n46.chat.bungee.command.GlobalUnmuteAll; +import mineverse.Aust1n46.chat.command.mute.MuteContainer; import mineverse.Aust1n46.chat.database.BungeePlayerData; +import mineverse.Aust1n46.chat.database.TemporaryDataInstance; import mineverse.Aust1n46.chat.utilities.UUIDFetcher; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.event.PluginMessageEvent; @@ -62,8 +56,6 @@ public class MineverseChatBungee extends Plugin implements Listener { this.getProxy().registerChannel(MineverseChatBungee.PLUGIN_MESSAGING_CHANNEL); this.getProxy().getPluginManager().registerListener(this, this); - - registerBungeeCordMuteCommands(); } @Override @@ -71,21 +63,6 @@ public class MineverseChatBungee extends Plugin implements Listener { BungeePlayerData.saveBungeePlayerData(); } - /** - * Old BungeeCord mute commands that pretty much no one even knows about let alone uses... - * Slated for removal when the mute system is reworked. - */ - private void registerBungeeCordMuteCommands() { - getProxy().getPluginManager().registerCommand(this, new GlobalMute(this, "globalmute")); - getProxy().getPluginManager().registerCommand(this, new GlobalMute(this, "gmute")); - getProxy().getPluginManager().registerCommand(this, new GlobalMuteAll(this, "globalmuteall")); - getProxy().getPluginManager().registerCommand(this, new GlobalMuteAll(this, "gmuteall")); - getProxy().getPluginManager().registerCommand(this, new GlobalUnmute(this, "globalunmute")); - getProxy().getPluginManager().registerCommand(this, new GlobalUnmute(this, "gunmute")); - getProxy().getPluginManager().registerCommand(this, new GlobalUnmuteAll(this, "globalunmuteall")); - getProxy().getPluginManager().registerCommand(this, new GlobalUnmuteAll(this, "gunmuteall")); - } - public static MineverseChatBungee getInstance() { return instance; } @@ -309,6 +286,162 @@ public class MineverseChatBungee extends Plugin implements Listener { } } } + if(subchannel.equals("Mute")) { + String identifier = in.readUTF(); + if(identifier.equals("Send")) { + String server = ser.getInfo().getName(); + String senderIdentifier = in.readUTF(); + String playerToMute = in.readUTF(); + String channelName = in.readUTF(); + long time = in.readLong(); + String reason = in.readUTF(); + UUID temporaryDataInstanceUUID = TemporaryDataInstance.createTemporaryDataInstance(); + out.writeUTF("Mute"); + out.writeUTF("Send"); + out.writeUTF(server); + out.writeUTF(senderIdentifier); + out.writeUTF(temporaryDataInstanceUUID.toString()); + out.writeUTF(playerToMute); + out.writeUTF(channelName); + out.writeLong(time); + out.writeUTF(reason); + for(String send : getProxy().getServers().keySet()) { + if(getProxy().getServers().get(send).getPlayers().size() > 0) { + getProxy().getServers().get(send).sendData(MineverseChatBungee.PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); + } + } + } + if(identifier.equals("Valid")) { + String server = in.readUTF(); + String senderIdentifier = in.readUTF(); + String playerToMute = in.readUTF(); + String channelName = in.readUTF(); + long time = in.readLong(); + String reason = in.readUTF(); + out.writeUTF("Mute"); + out.writeUTF("Valid"); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToMute); + out.writeUTF(channelName); + out.writeLong(time); + out.writeUTF(reason); + if(getProxy().getServers().get(server).getPlayers().size() > 0) { + getProxy().getServers().get(server).sendData(MineverseChatBungee.PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); + } + } + if(identifier.equals("Offline")) { + String server = in.readUTF(); + UUID temporaryDataInstanceUUID = UUID.fromString(in.readUTF()); + String senderIdentifier = in.readUTF(); + String playerToMute = in.readUTF(); + TemporaryDataInstance temporaryDataInstance = TemporaryDataInstance.getTemporaryDataInstance(temporaryDataInstanceUUID); + temporaryDataInstance.incrementMessagePackets(); + int servers = 0; + for(String send : getProxy().getServers().keySet()) { + if(getProxy().getServers().get(send).getPlayers().size() > 0) { + servers ++; + } + } + if(temporaryDataInstance.getMessagePackets() >= servers) { + temporaryDataInstance.destroyInstance(); + out.writeUTF("Mute"); + out.writeUTF("Offline"); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToMute); + if(getProxy().getServers().get(server).getPlayers().size() > 0) { + getProxy().getServers().get(server).sendData(MineverseChatBungee.PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); + } + } + } + if(identifier.equals("AlreadyMuted")) { + String server = in.readUTF(); + String senderIdentifier = in.readUTF(); + String playerToMute = in.readUTF(); + String channelName = in.readUTF(); + out.writeUTF("Mute"); + out.writeUTF("AlreadyMuted"); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToMute); + out.writeUTF(channelName); + if(getProxy().getServers().get(server).getPlayers().size() > 0) { + getProxy().getServers().get(server).sendData(MineverseChatBungee.PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); + } + } + } + if(subchannel.equals("Unmute")) { + String identifier = in.readUTF(); + if(identifier.equals("Send")) { + String server = ser.getInfo().getName(); + String senderIdentifier = in.readUTF(); + String playerToUnmute = in.readUTF(); + String channelName = in.readUTF(); + UUID temporaryDataInstanceUUID = TemporaryDataInstance.createTemporaryDataInstance(); + out.writeUTF("Unmute"); + out.writeUTF("Send"); + out.writeUTF(server); + out.writeUTF(senderIdentifier); + out.writeUTF(temporaryDataInstanceUUID.toString()); + out.writeUTF(playerToUnmute); + out.writeUTF(channelName); + for(String send : getProxy().getServers().keySet()) { + if(getProxy().getServers().get(send).getPlayers().size() > 0) { + getProxy().getServers().get(send).sendData(MineverseChatBungee.PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); + } + } + } + if(identifier.equals("Valid")) { + String server = in.readUTF(); + String senderIdentifier = in.readUTF(); + String playerToUnmute = in.readUTF(); + String channelName = in.readUTF(); + out.writeUTF("Unmute"); + out.writeUTF("Valid"); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToUnmute); + out.writeUTF(channelName); + if(getProxy().getServers().get(server).getPlayers().size() > 0) { + getProxy().getServers().get(server).sendData(MineverseChatBungee.PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); + } + } + if(identifier.equals("Offline")) { + String server = in.readUTF(); + UUID temporaryDataInstanceUUID = UUID.fromString(in.readUTF()); + String senderIdentifier = in.readUTF(); + String playerToUnmute = in.readUTF(); + TemporaryDataInstance temporaryDataInstance = TemporaryDataInstance.getTemporaryDataInstance(temporaryDataInstanceUUID); + temporaryDataInstance.incrementMessagePackets(); + int servers = 0; + for(String send : getProxy().getServers().keySet()) { + if(getProxy().getServers().get(send).getPlayers().size() > 0) { + servers ++; + } + } + if(temporaryDataInstance.getMessagePackets() >= servers) { + temporaryDataInstance.destroyInstance(); + out.writeUTF("Unmute"); + out.writeUTF("Offline"); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToUnmute); + if(getProxy().getServers().get(server).getPlayers().size() > 0) { + getProxy().getServers().get(server).sendData(MineverseChatBungee.PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); + } + } + } + if(identifier.equals("NotMuted")) { + String server = in.readUTF(); + String senderIdentifier = in.readUTF(); + String playerToUnmute = in.readUTF(); + String channelName = in.readUTF(); + out.writeUTF("Unmute"); + out.writeUTF("NotMuted"); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToUnmute); + out.writeUTF(channelName); + if(getProxy().getServers().get(server).getPlayers().size() > 0) { + getProxy().getServers().get(server).sendData(MineverseChatBungee.PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); + } + } + } if(subchannel.equals("Message")) { String identifier = in.readUTF(); if(identifier.equals("Send")) { @@ -423,7 +556,7 @@ public class MineverseChatBungee extends Plugin implements Listener { UUID uuid = UUID.fromString(in.readUTF()); SynchronizedMineverseChatPlayer smcp = MineverseChatAPI.getSynchronizedMineverseChatPlayer(uuid); if(smcp == null) { - smcp = new SynchronizedMineverseChatPlayer(uuid, new HashSet(), new HashMap(), new HashSet(), false, true); + smcp = new SynchronizedMineverseChatPlayer(uuid); MineverseChatAPI.addSynchronizedMineverseChatPlayerToMap(smcp); } out.writeUTF("Sync"); @@ -434,12 +567,13 @@ public class MineverseChatBungee extends Plugin implements Listener { for(String channel : smcp.getListening()) { out.writeUTF(channel); } - int muteCount = smcp.getMutes().keySet().size(); + int muteCount = smcp.getMutes().size(); //System.out.println(muteCount); out.write(muteCount); - for(String channel : smcp.getMutes().keySet()) { - //System.out.println(channel); - out.writeUTF(channel); + for(MuteContainer muteContainer : smcp.getMutes()) { + out.writeUTF(muteContainer.getChannel()); + out.writeLong(muteContainer.getDuration()); + out.writeUTF(muteContainer.getReason()); } //System.out.println(smcp.isSpy() + " spy value"); //System.out.println(out.size() + " size before"); @@ -459,11 +593,11 @@ public class MineverseChatBungee extends Plugin implements Listener { UUID uuid = UUID.fromString(in.readUTF()); SynchronizedMineverseChatPlayer smcp = MineverseChatAPI.getSynchronizedMineverseChatPlayer(uuid); if(smcp == null) { - smcp = new SynchronizedMineverseChatPlayer(uuid, new HashSet(), new HashMap(), new HashSet(), false, true); + smcp = new SynchronizedMineverseChatPlayer(uuid); MineverseChatAPI.addSynchronizedMineverseChatPlayerToMap(smcp); } smcp.getListening().clear(); - smcp.getMutes().clear(); + smcp.clearMutes(); smcp.getIgnores().clear(); int sizeL = in.read(); //System.out.println(sizeL + " listening"); @@ -471,11 +605,12 @@ public class MineverseChatBungee extends Plugin implements Listener { smcp.addListening(in.readUTF()); } int sizeM = in.read(); - //System.out.println(size + " mutes"); for(int b = 0; b < sizeM; b++) { String mute = in.readUTF(); + long muteTime = in.readLong(); + String muteReason = in.readUTF(); //System.out.println(mute); - smcp.addMute(mute); + smcp.addMute(mute, muteTime, muteReason); } int sizeI = in.read(); for(int c = 0; c < sizeI; c++) { @@ -487,124 +622,6 @@ public class MineverseChatBungee extends Plugin implements Listener { smcp.setMessageToggle(in.readBoolean()); } } - if(subchannel.equals("Mute")) { - String identifier = in.readUTF(); - if(identifier.equals("Channel")) { - String player = in.readUTF(); - String channel = in.readUTF(); - ProxiedPlayer p = getProxy().getPlayer(player); - p.sendMessage(new TextComponent(ChatColor.RED + "Invalid channel: " + channel)); - } - if(identifier.equals("Player")) { - String player = in.readUTF(); - String muteplayer = in.readUTF(); - String server = in.readUTF(); - ProxiedPlayer p = getProxy().getPlayer(player); - p.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + muteplayer + ChatColor.RED + " is not connected to server: " + server)); - } - if(identifier.equals("Mutable")) { - String player = in.readUTF(); - String channel = in.readUTF(); - String color = in.readUTF(); - ProxiedPlayer p = getProxy().getPlayer(player); - p.sendMessage(new TextComponent(ChatColor.RED + "You cannot mute players in this channel: " + ChatColor.valueOf(color.toUpperCase()) + channel)); - } - if(identifier.equals("Already")) { - String player = in.readUTF(); - String muteplayer = in.readUTF(); - String channel = in.readUTF(); - String color = in.readUTF(); - ProxiedPlayer p = getProxy().getPlayer(player); - p.sendMessage(new TextComponent(ChatColor.GOLD + muteplayer + ChatColor.RED + " is already muted in channel: " + ChatColor.valueOf(color.toUpperCase()) + channel)); - } - if(identifier.equals("Time")) { - String player = in.readUTF(); - String muteplayer = in.readUTF(); - String channel = in.readUTF(); - String color = in.readUTF(); - ProxiedPlayer p = getProxy().getPlayer(player); - p.sendMessage(new TextComponent(ChatColor.RED + "Muted player " + ChatColor.GOLD + muteplayer + ChatColor.RED + " in: " + ChatColor.valueOf(color.toUpperCase()) + channel)); - } - if(identifier.equals("Valid")) { - String player = in.readUTF(); - String muteplayer = in.readUTF(); - String channel = in.readUTF(); - String color = in.readUTF(); - String time = in.readUTF(); - ProxiedPlayer p = getProxy().getPlayer(player); - String timedmute = ""; - if(!time.equals("None\n")) { - String keyword = "minutes"; - if(time.equals("1")) keyword = "minute"; - timedmute = ChatColor.RED + " for " + time + " " + keyword; - } - p.sendMessage(new TextComponent(ChatColor.RED + "Muted player " + ChatColor.GOLD + muteplayer + ChatColor.RED + " in: " + ChatColor.valueOf(color.toUpperCase()) + channel + timedmute)); - } - } - if(subchannel.equals("Muteall")) { - String identifier = in.readUTF(); - if(identifier.equals("Player")) { - String player = in.readUTF(); - String muteplayer = in.readUTF(); - String server = in.readUTF(); - ProxiedPlayer p = getProxy().getPlayer(player); - p.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + muteplayer + ChatColor.RED + " is not connected to server: " + server)); - } - if(identifier.equals("Valid")) { - String player = in.readUTF(); - String muteplayer = in.readUTF(); - ProxiedPlayer p = getProxy().getPlayer(player); - p.sendMessage(new TextComponent(ChatColor.RED + "Muted player " + ChatColor.GOLD + muteplayer + ChatColor.RED + " in all channels.")); - } - } - if(subchannel.equals("Unmuteall")) { - String identifier = in.readUTF(); - if(identifier.equals("Player")) { - String player = in.readUTF(); - String muteplayer = in.readUTF(); - String server = in.readUTF(); - ProxiedPlayer p = getProxy().getPlayer(player); - p.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + muteplayer + ChatColor.RED + " is not connected to server: " + server)); - } - if(identifier.equals("Valid")) { - String player = in.readUTF(); - String muteplayer = in.readUTF(); - ProxiedPlayer p = getProxy().getPlayer(player); - p.sendMessage(new TextComponent(ChatColor.RED + "Unmuted player " + ChatColor.GOLD + muteplayer + ChatColor.RED + " in all channels.")); - } - } - if(subchannel.equals("Unmute")) { - String identifier = in.readUTF(); - if(identifier.equals("Channel")) { - String player = in.readUTF(); - String channel = in.readUTF(); - ProxiedPlayer p = getProxy().getPlayer(player); - p.sendMessage(new TextComponent(ChatColor.RED + "Invalid channel: " + channel)); - } - if(identifier.equals("Player")) { - String player = in.readUTF(); - String muteplayer = in.readUTF(); - String server = in.readUTF(); - ProxiedPlayer p = getProxy().getPlayer(player); - p.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + muteplayer + ChatColor.RED + " is not connected to server: " + server)); - } - if(identifier.equals("Already")) { - String player = in.readUTF(); - String muteplayer = in.readUTF(); - String channel = in.readUTF(); - String color = in.readUTF(); - ProxiedPlayer p = getProxy().getPlayer(player); - p.sendMessage(new TextComponent(ChatColor.GOLD + muteplayer + ChatColor.RED + " is not muted in channel: " + ChatColor.valueOf(color.toUpperCase()) + channel)); - } - if(identifier.equals("Valid")) { - String player = in.readUTF(); - String muteplayer = in.readUTF(); - String channel = in.readUTF(); - String color = in.readUTF(); - ProxiedPlayer p = getProxy().getPlayer(player); - p.sendMessage(new TextComponent(ChatColor.RED + "Unmuted player " + ChatColor.GOLD + muteplayer + ChatColor.RED + " in: " + ChatColor.valueOf(color.toUpperCase()) + channel)); - } - } } catch(Exception e) { e.printStackTrace(); diff --git a/src/mineverse/Aust1n46/chat/bungee/command/.gitignore b/src/mineverse/Aust1n46/chat/bungee/command/.gitignore deleted file mode 100644 index aca4cb5..0000000 --- a/src/mineverse/Aust1n46/chat/bungee/command/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/GlobalMute.class -/GlobalMuteAll.class -/GlobalUnmute.class -/GlobalUnmuteAll.class diff --git a/src/mineverse/Aust1n46/chat/bungee/command/GlobalMute.java b/src/mineverse/Aust1n46/chat/bungee/command/GlobalMute.java deleted file mode 100644 index f22ca30..0000000 --- a/src/mineverse/Aust1n46/chat/bungee/command/GlobalMute.java +++ /dev/null @@ -1,70 +0,0 @@ -package mineverse.Aust1n46.chat.bungee.command; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; - -import mineverse.Aust1n46.chat.bungee.MineverseChatBungee; - -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.plugin.Command; - -public class GlobalMute extends Command { - private MineverseChatBungee plugin; - private String alias; - - public GlobalMute(MineverseChatBungee plugin, String alias) { - super(alias); - this.plugin = plugin; - this.alias = alias; - } - - @Override - public void execute(CommandSender commandSender, String[] args) { - if(!(commandSender instanceof ProxiedPlayer)) { - return; - } - if(commandSender.hasPermission("venturechat.mute")) { - if(args.length < 3) { - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Invalid command: /" + alias + " [server] [player] [channel] {time}")); - return; - } - ProxiedPlayer player = plugin.getProxy().getPlayer(args[1]); - if(player != null) { - if(plugin.getProxy().getServers().containsKey(args[0])) { - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(stream); - try { - out.writeUTF("Mute"); - out.writeUTF(commandSender.getName()); - out.writeUTF(args[1]); - out.writeUTF(args[2]); - out.writeUTF(args[0]); - String time = "None\n"; - if(args.length > 3) { - time = args[3]; - } - out.writeUTF(time); - if(plugin.getProxy().getServers().get(args[0]).getPlayers().size() > 0) { - plugin.getProxy().getServers().get(args[0]).sendData(MineverseChatBungee.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + args[1] + ChatColor.RED + " is not connected to server: " + args[0])); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Invalid server: " + args[0])); - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + args[1] + ChatColor.RED + " is not online.")); - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "You do not have permission for this command.")); - return; - } -} \ No newline at end of file diff --git a/src/mineverse/Aust1n46/chat/bungee/command/GlobalMuteAll.java b/src/mineverse/Aust1n46/chat/bungee/command/GlobalMuteAll.java deleted file mode 100644 index 3a5578d..0000000 --- a/src/mineverse/Aust1n46/chat/bungee/command/GlobalMuteAll.java +++ /dev/null @@ -1,62 +0,0 @@ -package mineverse.Aust1n46.chat.bungee.command; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import mineverse.Aust1n46.chat.bungee.MineverseChatBungee; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.plugin.Command; - -public class GlobalMuteAll extends Command { - private MineverseChatBungee plugin; - private String alias; - - public GlobalMuteAll(MineverseChatBungee plugin, String alias) { - super(alias); - this.plugin = plugin; - this.alias = alias; - } - - @Override - public void execute(CommandSender commandSender, String[] args) { - if(!(commandSender instanceof ProxiedPlayer)) { - return; - } - if(commandSender.hasPermission("venturechat.mute")) { - if(args.length < 2) { - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Invalid command: /" + alias + " [server] [player]")); - return; - } - ProxiedPlayer player = plugin.getProxy().getPlayer(args[1]); - if(player != null) { - if(plugin.getProxy().getServers().containsKey(args[0])) { - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(stream); - try { - out.writeUTF("Muteall"); - out.writeUTF(commandSender.getName()); - out.writeUTF(args[1]); - out.writeUTF(args[0]); - if(plugin.getProxy().getServers().get(args[0]).getPlayers().size() > 0) { - plugin.getProxy().getServers().get(args[0]).sendData(MineverseChatBungee.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + args[1] + ChatColor.RED + " is not connected to server: " + args[0])); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Invalid server: " + args[0])); - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + args[1] + ChatColor.RED + " is not online.")); - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "You do not have permission for this command.")); - return; - } -} \ No newline at end of file diff --git a/src/mineverse/Aust1n46/chat/bungee/command/GlobalUnmute.java b/src/mineverse/Aust1n46/chat/bungee/command/GlobalUnmute.java deleted file mode 100644 index b7d1234..0000000 --- a/src/mineverse/Aust1n46/chat/bungee/command/GlobalUnmute.java +++ /dev/null @@ -1,64 +0,0 @@ -package mineverse.Aust1n46.chat.bungee.command; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; - -import mineverse.Aust1n46.chat.bungee.MineverseChatBungee; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.plugin.Command; - -public class GlobalUnmute extends Command { - private MineverseChatBungee plugin; - private String alias; - - public GlobalUnmute(MineverseChatBungee plugin, String alias) { - super(alias); - this.plugin = plugin; - this.alias = alias; - } - - @Override - public void execute(CommandSender commandSender, String[] args) { - if(!(commandSender instanceof ProxiedPlayer)) { - return; - } - if(commandSender.hasPermission("venturechat.mute")) { - if(args.length < 3) { - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Invalid command: /" + alias + " [server] [player] [channel]")); - return; - } - ProxiedPlayer player = plugin.getProxy().getPlayer(args[1]); - if(player != null) { - if(plugin.getProxy().getServers().containsKey(args[0])) { - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(stream); - try { - out.writeUTF("Unmute"); - out.writeUTF(commandSender.getName()); - out.writeUTF(args[1]); - out.writeUTF(args[2]); - out.writeUTF(args[0]); - if(plugin.getProxy().getServers().get(args[0]).getPlayers().size() > 0) { - plugin.getProxy().getServers().get(args[0]).sendData(MineverseChatBungee.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + args[1] + ChatColor.RED + " is not connected to server: " + args[0])); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Invalid server: " + args[0])); - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + args[1] + ChatColor.RED + " is not online.")); - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "You do not have permission for this command.")); - return; - } -} \ No newline at end of file diff --git a/src/mineverse/Aust1n46/chat/bungee/command/GlobalUnmuteAll.java b/src/mineverse/Aust1n46/chat/bungee/command/GlobalUnmuteAll.java deleted file mode 100644 index 15538d1..0000000 --- a/src/mineverse/Aust1n46/chat/bungee/command/GlobalUnmuteAll.java +++ /dev/null @@ -1,62 +0,0 @@ -package mineverse.Aust1n46.chat.bungee.command; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import mineverse.Aust1n46.chat.bungee.MineverseChatBungee; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.plugin.Command; - -public class GlobalUnmuteAll extends Command { - private MineverseChatBungee plugin; - private String alias; - - public GlobalUnmuteAll(MineverseChatBungee plugin, String alias) { - super(alias); - this.plugin = plugin; - this.alias = alias; - } - - @Override - public void execute(CommandSender commandSender, String[] args) { - if(!(commandSender instanceof ProxiedPlayer)) { - return; - } - if(commandSender.hasPermission("venturechat.mute")) { - if(args.length < 2) { - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Invalid command: /" + alias + " [server] [player]")); - return; - } - ProxiedPlayer player = plugin.getProxy().getPlayer(args[1]); - if(player != null) { - if(plugin.getProxy().getServers().containsKey(args[0])) { - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(stream); - try { - out.writeUTF("Unmuteall"); - out.writeUTF(commandSender.getName()); - out.writeUTF(args[1]); - out.writeUTF(args[0]); - if(plugin.getProxy().getServers().get(args[0]).getPlayers().size() > 0) { - plugin.getProxy().getServers().get(args[0]).sendData(MineverseChatBungee.PLUGIN_MESSAGING_CHANNEL, stream.toByteArray()); - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + args[1] + ChatColor.RED + " is not connected to server: " + args[0])); - } - catch(Exception e) { - e.printStackTrace(); - } - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Invalid server: " + args[0])); - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + args[1] + ChatColor.RED + " is not online.")); - return; - } - commandSender.sendMessage(new TextComponent(ChatColor.RED + "You do not have permission for this command.")); - return; - } -} \ No newline at end of file diff --git a/src/mineverse/Aust1n46/chat/channel/ChatChannel.java b/src/mineverse/Aust1n46/chat/channel/ChatChannel.java index a51c3a1..6202741 100644 --- a/src/mineverse/Aust1n46/chat/channel/ChatChannel.java +++ b/src/mineverse/Aust1n46/chat/channel/ChatChannel.java @@ -21,8 +21,10 @@ public class ChatChannel { private static MineverseChat plugin = MineverseChat.getInstance(); private static ChatChannel defaultChatChannel; + @Deprecated private static ChatChannel[] channels; private static String defaultColor; + private static List chatChannels = new ArrayList(); private String name; private String permission; @@ -65,6 +67,7 @@ public class ChatChannel { ChatChannel chatChannel = new ChatChannel(name, color, chatColor, permission, speakPermission, mutable, filter, defaultChannel, alias, distance, autojoin, bungee, cooldown, format); channels[counter++] = chatChannel; + chatChannels.add(chatChannel); if (defaultChannel) { defaultChatChannel = chatChannel; defaultColor = color; @@ -77,9 +80,19 @@ public class ChatChannel { * * @return {@link ChatChannel}[] */ + @Deprecated public static ChatChannel[] getChannels() { return channels; } + + /** + * Get list of chat channels. + * + * @return {@link List}<{@link ChatChannel}> + */ + public static List getChatChannels() { + return chatChannels; + } /** * Get a chat channel by name. diff --git a/src/mineverse/Aust1n46/chat/command/MineverseCommand.java b/src/mineverse/Aust1n46/chat/command/MineverseCommand.java index e1a5876..818a793 100644 --- a/src/mineverse/Aust1n46/chat/command/MineverseCommand.java +++ b/src/mineverse/Aust1n46/chat/command/MineverseCommand.java @@ -1,5 +1,8 @@ package mineverse.Aust1n46.chat.command; +import java.util.List; + +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; //This class is the parent class of all of the plugins commands. The execute method runs the command. @@ -13,8 +16,12 @@ public abstract class MineverseCommand { } public abstract void execute(CommandSender sender, String command, String[] args); - + + public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { + return null; + } + public String getName() { return name; } -} \ No newline at end of file +} diff --git a/src/mineverse/Aust1n46/chat/command/MineverseCommandExecutor.java b/src/mineverse/Aust1n46/chat/command/MineverseCommandExecutor.java index 1518bbf..fe442f8 100644 --- a/src/mineverse/Aust1n46/chat/command/MineverseCommandExecutor.java +++ b/src/mineverse/Aust1n46/chat/command/MineverseCommandExecutor.java @@ -1,13 +1,14 @@ package mineverse.Aust1n46.chat.command; +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; //This class is a standard command executor that is used to run the MineverseCommand's. -public class MineverseCommandExecutor implements CommandExecutor { +public class MineverseCommandExecutor implements TabExecutor { private Map commands; public MineverseCommandExecutor(Map commands) { @@ -16,12 +17,12 @@ public class MineverseCommandExecutor implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] parameters) { - for(String com : commands.keySet()) { - if(command.getName().equalsIgnoreCase(com)) { - commands.get(com).execute(sender, command.getName(), parameters); - return true; - } - } - return false; + commands.get(command.getName()).execute(sender, command.getName(), parameters); + return true; } -} \ No newline at end of file + + @Override + public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { + return commands.get(command.getName()).onTabComplete(sender, command, label, args); + } +} diff --git a/src/mineverse/Aust1n46/chat/command/chat/Broadcast.java b/src/mineverse/Aust1n46/chat/command/chat/Broadcast.java index 5574860..33da48f 100644 --- a/src/mineverse/Aust1n46/chat/command/chat/Broadcast.java +++ b/src/mineverse/Aust1n46/chat/command/chat/Broadcast.java @@ -20,7 +20,7 @@ public class Broadcast extends MineverseCommand { public void execute(CommandSender sender, String command, String[] args) { ConfigurationSection bs = plugin.getConfig().getConfigurationSection("broadcast"); String broadcastColor = bs.getString("color", "white"); - String broadcastPermissions = bs.getString("permissions", ""); + String broadcastPermissions = bs.getString("permissions", "None"); String broadcastDisplayTag = Format.FormatStringAll(bs.getString("displaytag", "[Broadcast]")); if(broadcastPermissions.equalsIgnoreCase("None") || sender.hasPermission(broadcastPermissions)) { if(args.length > 0) { @@ -29,7 +29,7 @@ public class Broadcast extends MineverseCommand { if(args[x].length() > 0) bc += args[x] + " "; } bc = Format.FormatStringAll(bc); - plugin.getServer().broadcastMessage(broadcastDisplayTag + ChatColor.valueOf(broadcastColor.toUpperCase()) + " " + bc); + Format.broadcastToServer(broadcastDisplayTag + ChatColor.valueOf(broadcastColor.toUpperCase()) + " " + bc); return; } else { diff --git a/src/mineverse/Aust1n46/chat/command/chat/Chatinfo.java b/src/mineverse/Aust1n46/chat/command/chat/Chatinfo.java index 227929b..9cd1872 100644 --- a/src/mineverse/Aust1n46/chat/command/chat/Chatinfo.java +++ b/src/mineverse/Aust1n46/chat/command/chat/Chatinfo.java @@ -9,6 +9,7 @@ import mineverse.Aust1n46.chat.api.MineverseChatAPI; import mineverse.Aust1n46.chat.api.MineverseChatPlayer; import mineverse.Aust1n46.chat.channel.ChatChannel; import mineverse.Aust1n46.chat.command.MineverseCommand; +import mineverse.Aust1n46.chat.command.mute.MuteContainer; public class Chatinfo extends MineverseCommand { private MineverseChat plugin = MineverseChat.getInstance();; @@ -36,8 +37,8 @@ public class Chatinfo extends MineverseCommand { ChatChannel channel = ChatChannel.getChannel(c); listen += channel.getColor() + channel.getName() + " "; } - for(String c : mcp.getMutes().keySet()) { - ChatChannel channel = ChatChannel.getChannel(c); + for(MuteContainer muteContainer : mcp.getMutes()) { + ChatChannel channel = ChatChannel.getChannel(muteContainer.getChannel()); mute += channel.getColor() + channel.getName() + " "; } for(String bc : mcp.getBlockedCommands()) { @@ -97,8 +98,8 @@ public class Chatinfo extends MineverseCommand { ChatChannel channel = ChatChannel.getChannel(c); listen += channel.getColor() + channel.getName() + " "; } - for(String c : p.getMutes().keySet()) { - ChatChannel channel = ChatChannel.getChannel(c); + for(MuteContainer muteContainer : p.getMutes()) { + ChatChannel channel = ChatChannel.getChannel(muteContainer.getChannel()); mute += channel.getColor() + channel.getName() + " "; } for(String bc : p.getBlockedCommands()) { diff --git a/src/mineverse/Aust1n46/chat/command/chat/Chlist.java b/src/mineverse/Aust1n46/chat/command/chat/Chlist.java index 65fe61e..f526c55 100644 --- a/src/mineverse/Aust1n46/chat/command/chat/Chlist.java +++ b/src/mineverse/Aust1n46/chat/command/chat/Chlist.java @@ -15,7 +15,7 @@ public class Chlist extends MineverseCommand { @Override public void execute(CommandSender sender, String command, String[] args) { sender.sendMessage(LocalizedMessage.CHANNEL_LIST_HEADER.toString()); - for(ChatChannel chname : ChatChannel.getChannels()) { + for(ChatChannel chname : ChatChannel.getChatChannels()) { if(chname.hasPermission()) { if(sender.hasPermission(chname.getPermission())) { sender.sendMessage(LocalizedMessage.CHANNEL_LIST_WITH_PERMISSIONS.toString() diff --git a/src/mineverse/Aust1n46/chat/command/chat/Setchannelall.java b/src/mineverse/Aust1n46/chat/command/chat/Setchannelall.java index c85eb05..a21e427 100644 --- a/src/mineverse/Aust1n46/chat/command/chat/Setchannelall.java +++ b/src/mineverse/Aust1n46/chat/command/chat/Setchannelall.java @@ -29,7 +29,7 @@ public class Setchannelall extends MineverseCommand { .replace("{args}", args[0])); return; } - for(ChatChannel channel : ChatChannel.getChannels()) { + for(ChatChannel channel : ChatChannel.getChatChannels()) { if(channel.hasPermission()) { if(!player.isOnline()) { sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE_NO_PERMISSIONS_CHECK.toString()); diff --git a/src/mineverse/Aust1n46/chat/command/message/MessageCommandExecutor.java b/src/mineverse/Aust1n46/chat/command/message/MessageCommandExecutor.java index 11407fc..aaeef4b 100644 --- a/src/mineverse/Aust1n46/chat/command/message/MessageCommandExecutor.java +++ b/src/mineverse/Aust1n46/chat/command/message/MessageCommandExecutor.java @@ -6,7 +6,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.bukkit.Sound; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; @@ -19,7 +18,6 @@ import mineverse.Aust1n46.chat.api.MineverseChatAPI; import mineverse.Aust1n46.chat.api.MineverseChatPlayer; import mineverse.Aust1n46.chat.localization.LocalizedMessage; import mineverse.Aust1n46.chat.utilities.Format; -import mineverse.Aust1n46.chat.versions.VersionHandler; public class MessageCommandExecutor implements TabExecutor { private MineverseChat plugin = MineverseChat.getInstance(); @@ -101,12 +99,7 @@ public class MessageCommandExecutor implements TabExecutor { player.getPlayer().sendMessage(send); mcp.getPlayer().sendMessage(echo); if(player.hasNotifications()) { - if(VersionHandler.is1_8() || VersionHandler.is1_7_10() || VersionHandler.is1_7_2() || VersionHandler.is1_7_9()) { - player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.valueOf("LEVEL_UP"), 1, 0); - } - else { - player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.valueOf("ENTITY_PLAYER_LEVELUP"), 1, 0); - } + Format.playMessageSound(player); } if(!mcp.getPlayer().hasPermission("venturechat.spy.override")) { for(MineverseChatPlayer sp : MineverseChatAPI.getOnlineMineverseChatPlayers()) { @@ -181,13 +174,11 @@ public class MessageCommandExecutor implements TabExecutor { } ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(byteOutStream); - String msg = ""; - String send = ""; - String echo = ""; - String spy = ""; + StringBuilder msgBuilder = new StringBuilder(); for(int r = 1; r < args.length; r++) { - msg += " " + args[r]; + msgBuilder.append(" " + args[r]); } + String msg = msgBuilder.toString(); if(mcp.hasFilter()) { msg = Format.FilterChat(msg); } @@ -201,9 +192,12 @@ public class MessageCommandExecutor implements TabExecutor { msg = Format.FormatString(msg); } - 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_", ""))); + String send = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("tellformatfrom").replaceAll("sender_", ""))); + String echo = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("tellformatto").replaceAll("sender_", ""))); + String spy = "VentureChat:NoSpy"; + if(!mcp.getPlayer().hasPermission("venturechat.spy.override")) { + spy = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("tellformatspy").replaceAll("sender_", ""))); + } try { out.writeUTF("Message"); out.writeUTF("Send"); diff --git a/src/mineverse/Aust1n46/chat/command/message/Reply.java b/src/mineverse/Aust1n46/chat/command/message/Reply.java index ea90389..d6863ab 100644 --- a/src/mineverse/Aust1n46/chat/command/message/Reply.java +++ b/src/mineverse/Aust1n46/chat/command/message/Reply.java @@ -3,7 +3,6 @@ package mineverse.Aust1n46.chat.command.message; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; -import org.bukkit.Sound; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -14,7 +13,6 @@ import mineverse.Aust1n46.chat.api.MineverseChatPlayer; import mineverse.Aust1n46.chat.command.MineverseCommand; import mineverse.Aust1n46.chat.localization.LocalizedMessage; import mineverse.Aust1n46.chat.utilities.Format; -import mineverse.Aust1n46.chat.versions.VersionHandler; public class Reply extends MineverseCommand { private MineverseChat plugin = MineverseChat.getInstance(); @@ -97,12 +95,7 @@ public class Reply extends MineverseCommand { player.getPlayer().sendMessage(send); mcp.getPlayer().sendMessage(echo); if(player.hasNotifications()) { - if(VersionHandler.is1_8() || VersionHandler.is1_7_10() || VersionHandler.is1_7_2() || VersionHandler.is1_7_9()) { - player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.valueOf("LEVEL_UP"), 1, 0); - } - else { - player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.valueOf("ENTITY_PLAYER_LEVELUP"), 1, 0); - } + Format.playMessageSound(player); } player.setReplyPlayer(mcp.getUUID()); return; @@ -119,13 +112,11 @@ public class Reply extends MineverseCommand { private void sendBungeeCordReply(MineverseChatPlayer mcp, String[] args) { ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(byteOutStream); - String msg = ""; - String send = ""; - String echo = ""; - String spy = ""; + StringBuilder msgBuilder = new StringBuilder(); for(int r = 0; r < args.length; r++) { - msg += " " + args[r]; + msgBuilder.append(" " + args[r]); } + String msg = msgBuilder.toString(); if(mcp.hasFilter()) { msg = Format.FilterChat(msg); } @@ -139,9 +130,12 @@ public class Reply extends MineverseCommand { msg = Format.FormatString(msg); } - send = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("replyformatfrom").replaceAll("sender_", ""))); - echo = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("replyformatto").replaceAll("sender_", ""))); - spy = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("replyformatspy").replaceAll("sender_", ""))); + String send = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("replyformatfrom").replaceAll("sender_", ""))); + String echo = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("replyformatto").replaceAll("sender_", ""))); + String spy = "VentureChat:NoSpy"; + if(!mcp.getPlayer().hasPermission("venturechat.spy.override")) { + spy = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("replyformatspy").replaceAll("sender_", ""))); + } try { out.writeUTF("Message"); out.writeUTF("Send"); diff --git a/src/mineverse/Aust1n46/chat/command/mute/Mute.java b/src/mineverse/Aust1n46/chat/command/mute/Mute.java index 2006a02..570b7ef 100644 --- a/src/mineverse/Aust1n46/chat/command/mute/Mute.java +++ b/src/mineverse/Aust1n46/chat/command/mute/Mute.java @@ -1,6 +1,17 @@ package mineverse.Aust1n46.chat.command.mute; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; import mineverse.Aust1n46.chat.MineverseChat; import mineverse.Aust1n46.chat.api.MineverseChatAPI; @@ -11,7 +22,7 @@ import mineverse.Aust1n46.chat.localization.LocalizedMessage; import mineverse.Aust1n46.chat.utilities.Format; public class Mute extends MineverseCommand { - private static final int MILLISECONDS_PER_MINUTE = 60000; + private static final List COMMON_MUTE_TIMES = Collections.unmodifiableList(Arrays.asList(new String[]{"12h", "15m", "1d", "1h", "1m", "30s"})); public Mute(String name) { super(name); @@ -22,96 +33,191 @@ public class Mute extends MineverseCommand { if (sender.hasPermission("venturechat.mute")) { if (args.length < 2) { sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/mute") - .replace("{args}", "[player] [channel] {time}")); + .replace("{args}", "[channel] [player] {time} {reason}")); return; } - MineverseChatPlayer player = MineverseChatAPI.getMineverseChatPlayer(args[0]); - if (player == null || (!player.isOnline() && !sender.hasPermission("venturechat.mute.offline"))) { - sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[0])); - return; - } - if (args.length == 2) { - if (ChatChannel.isChannel(args[1])) { - ChatChannel channel = ChatChannel.getChannel(args[1]); - if (player.isMuted(channel.getName())) { - sender.sendMessage(LocalizedMessage.PLAYER_ALREADY_MUTED.toString() - .replace("{player}", player.getName()).replace("{channel_color}", channel.getColor()) - .replace("{channel_name}", channel.getName())); - return; - } - if (channel.isMutable()) { - player.addMute(channel.getName(), 0); - sender.sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER.toString() - .replace("{player}", player.getName()).replace("{channel_color}", channel.getColor()) - .replace("{channel_name}", channel.getName())); - if (player.isOnline()) - player.getPlayer() - .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER.toString() - .replace("{channel_color}", channel.getColor()) - .replace("{channel_name}", channel.getName())); - else - player.setModified(true); - if (channel.getBungee()) { - MineverseChat.getInstance().synchronize(player, true); - } - return; - } - sender.sendMessage(LocalizedMessage.CHANNEL_CANNOT_MUTE.toString() - .replace("{channel_color}", channel.getColor()) - .replace("{channel_name}", channel.getName())); - return; - } - sender.sendMessage(LocalizedMessage.INVALID_CHANNEL.toString().replace("{args}", args[1])); - return; - } - if (ChatChannel.isChannel(args[1])) { - ChatChannel channel = ChatChannel.getChannel(args[1]); - if (player.isMuted(channel.getName())) { - sender.sendMessage(LocalizedMessage.PLAYER_ALREADY_MUTED.toString() - .replace("{player}", player.getName()).replace("{channel_color}", channel.getColor()) - .replace("{channel_name}", channel.getName())); - return; - } + if (ChatChannel.isChannel(args[0])) { + ChatChannel channel = ChatChannel.getChannel(args[0]); if (channel.isMutable()) { - try { - int datetime = Format.currentTimeMillis(); - int time = Integer.parseInt(args[2]); - if (time > 0) { - player.addMute(channel.getName(), datetime + (time * MILLISECONDS_PER_MINUTE)); - String units = LocalizedMessage.UNITS_MINUTE_PLURAL.toString(); - if (time == 1) - units = LocalizedMessage.UNITS_MINUTE_SINGULAR.toString(); + long datetime = System.currentTimeMillis(); + long time = 0; + int reasonStartPos = 2; + String reason = ""; + if(args.length > 2) { + String timeString = args[2]; + if(Character.isDigit(timeString.charAt(0))) { + reasonStartPos = 3; + time = Format.parseTimeStringToMillis(timeString); + if (time <= 0) { + sender.sendMessage(LocalizedMessage.INVALID_TIME.toString().replace("{args}", timeString)); + return; + } + } + StringBuilder reasonBuilder = new StringBuilder(); + for(int a = reasonStartPos; a < args.length; a ++) { + reasonBuilder.append(args[a]); + } + reason = reasonBuilder.toString(); + } + if(channel.getBungee()) { + sendBungeeCordMute(sender, args[1], channel, time, reason); + return; + } + MineverseChatPlayer playerToMute = MineverseChatAPI.getMineverseChatPlayer(args[1]); + if (playerToMute == null || (!playerToMute.isOnline() && !sender.hasPermission("venturechat.mute.offline"))) { + sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[1])); + return; + } + if (playerToMute.isMuted(channel.getName())) { + sender.sendMessage(LocalizedMessage.PLAYER_ALREADY_MUTED.toString() + .replace("{player}", playerToMute.getName()).replace("{channel_color}", channel.getColor()) + .replace("{channel_name}", channel.getName())); + return; + } + + if(time > 0) { + if(reason.isEmpty()) { + playerToMute.addMute(channel.getName(), datetime + time); + String timeString = Format.parseTimeStringFromMillis(time); sender.sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_TIME.toString() - .replace("{player}", player.getName()) + .replace("{player}", playerToMute.getName()) .replace("{channel_color}", channel.getColor()) - .replace("{channel_name}", channel.getName()).replace("{time}", time + "") - .replace("{units}", units)); - if (player.isOnline()) - player.getPlayer() + .replace("{channel_name}", channel.getName()) + .replace("{time}", timeString)); + if (playerToMute.isOnline()) { + playerToMute.getPlayer() .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_TIME.toString() .replace("{channel_color}", channel.getColor()) .replace("{channel_name}", channel.getName()) - .replace("{time}", time + "").replace("{units}", units)); - else - player.setModified(true); - if (channel.getBungee()) { - MineverseChat.getInstance().synchronize(player, true); + .replace("{time}", timeString)); + } + else { + playerToMute.setModified(true); + } + return; + } + else { + playerToMute.addMute(channel.getName(), datetime + time, reason); + String timeString = Format.parseTimeStringFromMillis(time); + sender.sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_TIME_REASON.toString() + .replace("{player}", playerToMute.getName()) + .replace("{channel_color}", channel.getColor()) + .replace("{channel_name}", channel.getName()) + .replace("{time}", timeString) + .replace("{reason}", reason)); + if (playerToMute.isOnline()) { + playerToMute.getPlayer() + .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_TIME_REASON.toString() + .replace("{channel_color}", channel.getColor()) + .replace("{channel_name}", channel.getName()) + .replace("{time}", timeString) + .replace("{reason}", reason)); + } + else { + playerToMute.setModified(true); + } + return; + } + } + else { + if(reason.isEmpty()) { + playerToMute.addMute(channel.getName()); + sender.sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER.toString() + .replace("{player}", playerToMute.getName()).replace("{channel_color}", channel.getColor()) + .replace("{channel_name}", channel.getName())); + if (playerToMute.isOnline()) { + playerToMute.getPlayer() + .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER.toString() + .replace("{channel_color}", channel.getColor()) + .replace("{channel_name}", channel.getName())); + } + else { + playerToMute.setModified(true); + } + return; + } + else { + playerToMute.addMute(channel.getName(), reason); + sender.sendMessage(LocalizedMessage.MUTE_PLAYER_SENDER_REASON.toString() + .replace("{player}", playerToMute.getName()).replace("{channel_color}", channel.getColor()) + .replace("{channel_name}", channel.getName()) + .replace("{reason}", reason)); + if (playerToMute.isOnline()) { + playerToMute.getPlayer() + .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_REASON.toString() + .replace("{channel_color}", channel.getColor()) + .replace("{channel_name}", channel.getName()) + .replace("{reason}", reason)); + } + else { + playerToMute.setModified(true); } return; } - sender.sendMessage(LocalizedMessage.INVALID_TIME.toString().replace("{args}", args[2])); - } catch (Exception e) { - sender.sendMessage(LocalizedMessage.INVALID_TIME.toString().replace("{args}", args[2])); } - return; } sender.sendMessage(LocalizedMessage.CHANNEL_CANNOT_MUTE.toString() - .replace("{channel_color}", channel.getColor()).replace("{channel_name}", channel.getName())); + .replace("{channel_color}", channel.getColor()) + .replace("{channel_name}", channel.getName())); return; } - sender.sendMessage(LocalizedMessage.INVALID_CHANNEL.toString().replace("{args}", args[1])); + sender.sendMessage(LocalizedMessage.INVALID_CHANNEL.toString().replace("{args}", args[0])); return; } sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); } + + @Override + public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { + List completions = new ArrayList<>(); + if(args.length == 1) { + StringUtil.copyPartialMatches(args[0], ChatChannel.getChatChannels().stream().map(ChatChannel::getName).collect(Collectors.toList()), completions); + Collections.sort(completions); + return completions; + } + if(args.length == 2) { + if(ChatChannel.isChannel(args[0])) { + ChatChannel chatChannelObj = ChatChannel.getChannel(args[0]); + if(chatChannelObj.getBungee()) { + StringUtil.copyPartialMatches(args[1], MineverseChat.networkPlayerNames, completions); + Collections.sort(completions); + return completions; + } + StringUtil.copyPartialMatches(args[1], MineverseChatAPI.getOnlineMineverseChatPlayers().stream().filter(mcp -> !mcp.isMuted(chatChannelObj.getName())).map(MineverseChatPlayer::getName).collect(Collectors.toList()), completions); + Collections.sort(completions); + return completions; + } + } + if(args.length == 3) { + StringUtil.copyPartialMatches(args[2], COMMON_MUTE_TIMES, completions); + Collections.sort(completions); + return completions; + + } + return Collections.emptyList(); + } + + private void sendBungeeCordMute(CommandSender sender, String playerToMute, ChatChannel channel, long time, String reason) { + ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(byteOutStream); + try { + out.writeUTF("Mute"); + out.writeUTF("Send"); + if(sender instanceof Player) { + out.writeUTF(((Player) sender).getUniqueId().toString()); + } + else { + out.writeUTF("VentureChat:Console"); + } + out.writeUTF(playerToMute); + out.writeUTF(channel.getName()); + out.writeLong(time); + out.writeUTF(reason); + MineverseChat.sendPluginMessage(byteOutStream); + out.close(); + } + catch(Exception e) { + e.printStackTrace(); + } + } } diff --git a/src/mineverse/Aust1n46/chat/command/mute/MuteContainer.java b/src/mineverse/Aust1n46/chat/command/mute/MuteContainer.java new file mode 100644 index 0000000..49d37da --- /dev/null +++ b/src/mineverse/Aust1n46/chat/command/mute/MuteContainer.java @@ -0,0 +1,45 @@ +package mineverse.Aust1n46.chat.command.mute; + +public class MuteContainer { + private String channel; + private String reason; + private long duration; + + public MuteContainer(String channel) { + this(channel, 0, ""); + } + + public MuteContainer(String channel, long duration) { + this(channel, duration, ""); + } + + public MuteContainer(String channel, String reason) { + this(channel, 0, reason); + } + + public MuteContainer(String channel, long duration, String reason) { + this.channel = channel; + this.reason = reason; + this.duration = duration; + } + + public String getChannel() { + return channel; + } + + public boolean hasReason() { + return !reason.equals(""); + } + + public String getReason() { + return reason; + } + + public boolean hasDuration() { + return duration > 0; + } + + public long getDuration() { + return duration; + } +} diff --git a/src/mineverse/Aust1n46/chat/command/mute/Muteall.java b/src/mineverse/Aust1n46/chat/command/mute/Muteall.java index 4d8d5b3..66b4a27 100644 --- a/src/mineverse/Aust1n46/chat/command/mute/Muteall.java +++ b/src/mineverse/Aust1n46/chat/command/mute/Muteall.java @@ -21,7 +21,7 @@ public class Muteall extends MineverseCommand { if(args.length < 1) { sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString() .replace("{command}", "/muteall") - .replace("{args}", "[player]")); + .replace("{args}", "[player] {reason}")); return; } MineverseChatPlayer player = MineverseChatAPI.getMineverseChatPlayer(args[0]); @@ -30,30 +30,64 @@ public class Muteall extends MineverseCommand { .replace("{args}", args[0])); return; } - boolean bungee = false; - for(ChatChannel channel : ChatChannel.getChannels()) { - if(channel.isMutable()) { - player.addMute(channel.getName(), 0); - if(channel.getBungee()) { - bungee = true; + String reason = ""; + if(args.length > 1) { + StringBuilder reasonBuilder = new StringBuilder(); + for(int a = 1; a < args.length; a ++) { + reasonBuilder.append(args[a]); + } + reason = reasonBuilder.toString(); + } + if(reason.isEmpty()) { + boolean bungee = false; + for(ChatChannel channel : ChatChannel.getChatChannels()) { + if(channel.isMutable()) { + player.addMute(channel.getName()); + if(channel.getBungee()) { + bungee = true; + } } } + if(bungee) { + MineverseChat.getInstance().synchronize(player, true); + } + sender.sendMessage(LocalizedMessage.MUTE_PLAYER_ALL_SENDER.toString() + .replace("{player}", player.getName())); + if(player.isOnline()) { + player.getPlayer().sendMessage(LocalizedMessage.MUTE_PLAYER_ALL_PLAYER.toString()); + } + else + player.setModified(true); + return; } - if(bungee) { - MineverseChat.getInstance().synchronize(player, true); + else { + boolean bungee = false; + for(ChatChannel channel : ChatChannel.getChatChannels()) { + if(channel.isMutable()) { + player.addMute(channel.getName(), reason); + if(channel.getBungee()) { + bungee = true; + } + } + } + if(bungee) { + MineverseChat.getInstance().synchronize(player, true); + } + sender.sendMessage(LocalizedMessage.MUTE_PLAYER_ALL_SENDER_REASON.toString() + .replace("{player}", player.getName()) + .replace("{reason}", reason)); + if(player.isOnline()) { + player.getPlayer().sendMessage(LocalizedMessage.MUTE_PLAYER_ALL_PLAYER_REASON.toString() + .replace("{reason}", reason)); + } + else + player.setModified(true); + return; } - sender.sendMessage(LocalizedMessage.MUTE_PLAYER_ALL_SENDER.toString() - .replace("{player}", player.getName())); - if(player.isOnline()) { - player.getPlayer().sendMessage(LocalizedMessage.MUTE_PLAYER_ALL_PLAYER.toString()); - } - else - player.setModified(true); - return; } else { sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); return; } } -} \ No newline at end of file +} diff --git a/src/mineverse/Aust1n46/chat/command/mute/Unmute.java b/src/mineverse/Aust1n46/chat/command/mute/Unmute.java index 9d27e99..6461a8d 100644 --- a/src/mineverse/Aust1n46/chat/command/mute/Unmute.java +++ b/src/mineverse/Aust1n46/chat/command/mute/Unmute.java @@ -1,6 +1,16 @@ package mineverse.Aust1n46.chat.command.mute; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; import mineverse.Aust1n46.chat.MineverseChat; import mineverse.Aust1n46.chat.api.MineverseChatAPI; @@ -20,44 +30,91 @@ public class Unmute extends MineverseCommand { if (sender.hasPermission("venturechat.mute")) { if (args.length < 2) { sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/unmute") - .replace("{args}", "[player] [channel]")); + .replace("{args}", "[channel] [player]")); return; } - MineverseChatPlayer player = MineverseChatAPI.getMineverseChatPlayer(args[0]); - if (player == null || (!player.isOnline() && !sender.hasPermission("venturechat.mute.offline"))) { - sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[0])); - return; - } - for (ChatChannel channel : ChatChannel.getChannels()) { - if (channel.getName().equalsIgnoreCase(args[1]) || channel.getAlias().equalsIgnoreCase(args[1])) { - if (!player.isMuted(channel.getName())) { - sender.sendMessage(LocalizedMessage.PLAYER_NOT_MUTED.toString() - .replace("{player}", player.getName()).replace("{channel_color}", channel.getColor()) - .replace("{channel_name}", channel.getName())); - return; - } - player.removeMute(channel.getName()); - sender.sendMessage(LocalizedMessage.UNMUTE_PLAYER_SENDER.toString() - .replace("{player}", player.getName()).replace("{channel_color}", channel.getColor()) - .replace("{channel_name}", channel.getName())); - if (player.isOnline()) { - player.getPlayer().sendMessage(LocalizedMessage.UNMUTE_PLAYER_PLAYER.toString() - .replace("{player}", player.getName()).replace("{channel_color}", channel.getColor()) - .replace("{channel_name}", channel.getName())); - } else { - player.setModified(true); - } - if (channel.getBungee()) { - MineverseChat.getInstance().synchronize(player, true); - } + if (ChatChannel.isChannel(args[0])) { + ChatChannel channel = ChatChannel.getChannel(args[0]); + if(channel.getBungee()) { + sendBungeeCordUnmute(sender, args[1], channel); return; } + MineverseChatPlayer player = MineverseChatAPI.getMineverseChatPlayer(args[1]); + if (player == null || (!player.isOnline() && !sender.hasPermission("venturechat.mute.offline"))) { + sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[1])); + return; + } + if (!player.isMuted(channel.getName())) { + sender.sendMessage(LocalizedMessage.PLAYER_NOT_MUTED.toString() + .replace("{player}", player.getName()).replace("{channel_color}", channel.getColor()) + .replace("{channel_name}", channel.getName())); + return; + } + player.removeMute(channel.getName()); + sender.sendMessage(LocalizedMessage.UNMUTE_PLAYER_SENDER.toString() + .replace("{player}", player.getName()).replace("{channel_color}", channel.getColor()) + .replace("{channel_name}", channel.getName())); + if (player.isOnline()) { + player.getPlayer().sendMessage(LocalizedMessage.UNMUTE_PLAYER_PLAYER.toString() + .replace("{player}", player.getName()).replace("{channel_color}", channel.getColor()) + .replace("{channel_name}", channel.getName())); + } + else { + player.setModified(true); + } + return; } - sender.sendMessage(LocalizedMessage.INVALID_CHANNEL.toString().replace("{args}", args[1])); + sender.sendMessage(LocalizedMessage.INVALID_CHANNEL.toString().replace("{args}", args[0])); return; } else { sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); return; } } -} \ No newline at end of file + + @Override + public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { + List completions = new ArrayList<>(); + if(args.length == 1) { + StringUtil.copyPartialMatches(args[0], ChatChannel.getChatChannels().stream().map(ChatChannel::getName).collect(Collectors.toList()), completions); + Collections.sort(completions); + return completions; + } + if(args.length == 2) { + if(ChatChannel.isChannel(args[0])) { + ChatChannel chatChannelObj = ChatChannel.getChannel(args[0]); + if(chatChannelObj.getBungee()) { + StringUtil.copyPartialMatches(args[1], MineverseChat.networkPlayerNames, completions); + Collections.sort(completions); + return completions; + } + StringUtil.copyPartialMatches(args[1], MineverseChatAPI.getOnlineMineverseChatPlayers().stream().filter(mcp -> mcp.isMuted(chatChannelObj.getName())).map(MineverseChatPlayer::getName).collect(Collectors.toList()), completions); + Collections.sort(completions); + return completions; + } + } + return Collections.emptyList(); + } + + private void sendBungeeCordUnmute(CommandSender sender, String playerToUnmute, ChatChannel channel) { + ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(byteOutStream); + try { + out.writeUTF("Unmute"); + out.writeUTF("Send"); + if(sender instanceof Player) { + out.writeUTF(((Player) sender).getUniqueId().toString()); + } + else { + out.writeUTF("VentureChat:Console"); + } + out.writeUTF(playerToUnmute); + out.writeUTF(channel.getName()); + MineverseChat.sendPluginMessage(byteOutStream); + out.close(); + } + catch(Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/mineverse/Aust1n46/chat/command/mute/Unmuteall.java b/src/mineverse/Aust1n46/chat/command/mute/Unmuteall.java index 841d4c6..6bc2648 100644 --- a/src/mineverse/Aust1n46/chat/command/mute/Unmuteall.java +++ b/src/mineverse/Aust1n46/chat/command/mute/Unmuteall.java @@ -31,7 +31,7 @@ public class Unmuteall extends MineverseCommand { return; } boolean bungee = false; - for(ChatChannel channel : ChatChannel.getChannels()) { + for(ChatChannel channel : ChatChannel.getChatChannels()) { player.removeMute(channel.getName()); if(channel.getBungee()) { bungee = true; diff --git a/src/mineverse/Aust1n46/chat/database/BungeePlayerData.java b/src/mineverse/Aust1n46/chat/database/BungeePlayerData.java index 591301e..c454d50 100644 --- a/src/mineverse/Aust1n46/chat/database/BungeePlayerData.java +++ b/src/mineverse/Aust1n46/chat/database/BungeePlayerData.java @@ -14,6 +14,7 @@ import java.util.UUID; import mineverse.Aust1n46.chat.api.MineverseChatAPI; import mineverse.Aust1n46.chat.api.SynchronizedMineverseChatPlayer; import mineverse.Aust1n46.chat.bungee.MineverseChatBungee; +import mineverse.Aust1n46.chat.command.mute.MuteContainer; import mineverse.Aust1n46.chat.utilities.Format; import mineverse.Aust1n46.chat.utilities.UUIDFetcher; import net.md_5.bungee.api.ProxyServer; @@ -52,11 +53,12 @@ public class BungeePlayerData { String channel = l.nextToken(); listening.add(channel); } - HashMap mutes = new HashMap(); + HashMap mutes = new HashMap(); StringTokenizer m = new StringTokenizer(playerData.getString(uuidString + ".mutes"), ","); while(m.hasMoreTokens()) { String[] parts = m.nextToken().split(":"); - mutes.put(parts[0], Integer.parseInt(parts[1])); + String channelName = parts[0]; + mutes.put(channelName, new MuteContainer(channelName, Long.parseLong(parts[1]))); } HashSet ignores = new HashSet(); StringTokenizer n = new StringTokenizer(playerData.getString(uuidString + ".ignores"), ","); @@ -115,11 +117,11 @@ public class BungeePlayerData { String channel = l.nextToken(); listening.add(channel); } - HashMap mutes = new HashMap(); - StringTokenizer m = new StringTokenizer(bungeePlayerDataFileConfiguration.getString("mutes"), ","); - while(m.hasMoreTokens()) { - String[] parts = m.nextToken().split(":"); - mutes.put(parts[0], Integer.parseInt(parts[1])); + HashMap mutes = new HashMap(); + Configuration muteSection = bungeePlayerDataFileConfiguration.getSection("mutes"); + for(String channelName : muteSection.getKeys()) { + Configuration channelSection = muteSection.getSection(channelName); + mutes.put(channelName, new MuteContainer(channelName, channelSection.getLong("time"), channelSection.getString("reason"))); } HashSet ignores = new HashSet(); StringTokenizer n = new StringTokenizer(bungeePlayerDataFileConfiguration.getString("ignores"), ","); @@ -157,20 +159,20 @@ public class BungeePlayerData { String listen = ""; for(String s : p.getListening()) listen += s + ","; - String mute = ""; - for(String s : p.getMutes().keySet()) - mute += s + ":0,"; String ignore = ""; for(UUID s : p.getIgnores()) ignore += s.toString() + ","; if(listen.length() > 0) listen = listen.substring(0, listen.length() - 1); - if(mute.length() > 0) - mute = mute.substring(0, mute.length() - 1); if(ignore.length() > 0) ignore = ignore.substring(0, ignore.length() - 1); bungeePlayerDataFileConfiguration.set("channels", listen); - bungeePlayerDataFileConfiguration.set("mutes", mute); + Configuration muteSection = createSection(bungeePlayerDataFileConfiguration, "mutes"); + for(MuteContainer mute : p.getMutes()) { + Configuration channelSection = createSection(muteSection, mute.getChannel()); + channelSection.set("time", mute.getDuration()); + channelSection.set("reason", mute.getReason()); + } bungeePlayerDataFileConfiguration.set("ignores", ignore); bungeePlayerDataFileConfiguration.set("spy", p.isSpy()); bungeePlayerDataFileConfiguration.set("messagetoggle", p.getMessageToggle()); @@ -182,4 +184,16 @@ public class BungeePlayerData { e.printStackTrace(); } } + + /** + * Create a new {@link Configuration} section. + * + * @param configurationSection + * @param sectionKey + * @return Configuration + */ + private static Configuration createSection(Configuration configurationSection, String sectionKey) { + configurationSection.set(sectionKey, null); + return configurationSection.getSection(sectionKey); + } } diff --git a/src/mineverse/Aust1n46/chat/database/Database.java b/src/mineverse/Aust1n46/chat/database/Database.java index 63d68e5..b65bd8c 100644 --- a/src/mineverse/Aust1n46/chat/database/Database.java +++ b/src/mineverse/Aust1n46/chat/database/Database.java @@ -3,27 +3,76 @@ package mineverse.Aust1n46.chat.database; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.Calendar; import org.bukkit.Bukkit; +import org.bukkit.configuration.ConfigurationSection; +import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import mineverse.Aust1n46.chat.MineverseChat; +import mineverse.Aust1n46.chat.utilities.Format; -//Parent class for both the MySQL and SQLite database classes. -public abstract class Database { +/** + * Initializes and handles writing to the chat logging database. + */ +public class Database { + private static HikariDataSource dataSource = null; - protected HikariDataSource dataSource = null; + public static void initializeMySQL() { + try { + ConfigurationSection mysqlConfig = MineverseChat.getInstance().getConfig().getConfigurationSection("mysql"); + if (mysqlConfig.getBoolean("enabled", false)) { + String host = mysqlConfig.getString("host"); + int port = mysqlConfig.getInt("port"); + String database = mysqlConfig.getString("database"); + String user = mysqlConfig.getString("user"); + String password = mysqlConfig.getString("password"); - public void writeVentureChat(String time, String uuid, String name, String server, String channel, String text, String type) { + final HikariConfig config = new HikariConfig(); + // config.setDriverClassName(org.postgresql.Driver.class.getName()); + // final String jdbcUrl = String.format("jdbc:postgresql://%s:%d/%s", hostname, + // port, database); + final String jdbcUrl = String.format("jdbc:mysql://%s:%d/%s?autoReconnect=true&useSSL=false", host, + port, database); + config.setJdbcUrl(jdbcUrl); + config.setUsername(user); + config.setPassword(password); + config.addDataSourceProperty("cachePrepStmts", "true"); + config.addDataSourceProperty("prepStmtCacheSize", "250"); + config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); + dataSource = new HikariDataSource(config); + final String SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS VentureChat " + + "(ID SERIAL PRIMARY KEY, ChatTime TEXT, UUID TEXT, Name TEXT, " + + "Server TEXT, Channel TEXT, Text TEXT, Type TEXT)"; + final Connection conn = dataSource.getConnection(); + final PreparedStatement statement = conn.prepareStatement(SQL_CREATE_TABLE); + statement.executeUpdate(); + } + } catch (Exception exception) { + Bukkit.getConsoleSender().sendMessage( + Format.FormatStringAll("&8[&eVentureChat&8]&c - Database could not be loaded. Is it running?")); + } + } + + public static boolean isEnabled() { + return dataSource != null; + } + + public static void writeVentureChat(String uuid, String name, String server, String channel, String text, + String type) { MineverseChat plugin = MineverseChat.getInstance(); + Calendar currentDate = Calendar.getInstance(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String date = formatter.format(currentDate.getTime()); Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { - try(final Connection conn = dataSource.getConnection(); + try (final Connection conn = dataSource.getConnection(); final PreparedStatement statement = conn.prepareStatement( - "INSERT INTO VentureChat " + - "(ChatTime, UUID, Name, Server, Channel, Text, Type) " + - "VALUES (?, ?, ?, ?, ?, ?, ?)")) { - statement.setString(1, time); + "INSERT INTO VentureChat " + "(ChatTime, UUID, Name, Server, Channel, Text, Type) " + + "VALUES (?, ?, ?, ?, ?, ?, ?)")) { + statement.setString(1, date); statement.setString(2, uuid); statement.setString(3, name); statement.setString(4, server); @@ -31,10 +80,9 @@ public abstract class Database { statement.setString(6, text); statement.setString(7, type); statement.executeUpdate(); - } - catch(SQLException e) { - throw new RuntimeException(e); + } catch (SQLException error) { + error.printStackTrace(); } }); } -} \ No newline at end of file +} diff --git a/src/mineverse/Aust1n46/chat/database/MySQL.java b/src/mineverse/Aust1n46/chat/database/MySQL.java deleted file mode 100644 index 8ba5a79..0000000 --- a/src/mineverse/Aust1n46/chat/database/MySQL.java +++ /dev/null @@ -1,36 +0,0 @@ -package mineverse.Aust1n46.chat.database; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; - -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; - -//This class initializes the plugin's connection to the MySQL database if it's enabled. -public class MySQL extends Database { - - public MySQL(String hostname, int port, String database, String user, String password) { - final HikariConfig config = new HikariConfig(); - //config.setDriverClassName(org.postgresql.Driver.class.getName()); - //final String jdbcUrl = String.format("jdbc:postgresql://%s:%d/%s", hostname, port, database); - final String jdbcUrl = String.format("jdbc:mysql://%s:%d/%s", hostname, port, database); - config.setJdbcUrl(jdbcUrl); - config.setUsername(user); - config.setPassword(password); - config.addDataSourceProperty("cachePrepStmts", "true"); - config.addDataSourceProperty("prepStmtCacheSize", "250"); - config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); - dataSource = new HikariDataSource(config); - final String SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS VentureChat " + - "(ID SERIAL PRIMARY KEY, ChatTime TEXT, UUID TEXT, Name TEXT, " + - "Server TEXT, Channel TEXT, Text TEXT, Type TEXT)"; - try (final Connection conn = dataSource.getConnection(); - final PreparedStatement statement = conn.prepareStatement(SQL_CREATE_TABLE)) { - statement.executeUpdate(); - } - catch (SQLException e) { - throw new RuntimeException(e); - } - } -} \ No newline at end of file diff --git a/src/mineverse/Aust1n46/chat/database/PlayerData.java b/src/mineverse/Aust1n46/chat/database/PlayerData.java index 6e3c513..1c26466 100644 --- a/src/mineverse/Aust1n46/chat/database/PlayerData.java +++ b/src/mineverse/Aust1n46/chat/database/PlayerData.java @@ -14,6 +14,7 @@ import java.util.StringTokenizer; import java.util.UUID; import org.bukkit.Bukkit; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -21,6 +22,7 @@ import mineverse.Aust1n46.chat.MineverseChat; import mineverse.Aust1n46.chat.api.MineverseChatAPI; import mineverse.Aust1n46.chat.api.MineverseChatPlayer; import mineverse.Aust1n46.chat.channel.ChatChannel; +import mineverse.Aust1n46.chat.command.mute.MuteContainer; import mineverse.Aust1n46.chat.utilities.Format; import mineverse.Aust1n46.chat.utilities.UUIDFetcher; @@ -64,7 +66,7 @@ public class PlayerData { listening.add(channel); } } - HashMap mutes = new HashMap(); + HashMap mutes = new HashMap(); StringTokenizer m = new StringTokenizer(playerData.getConfigurationSection("players." + uuidString).getString("mutes"), ","); while(m.hasMoreTokens()) { String[] parts = m.nextToken().split(":"); @@ -73,7 +75,8 @@ public class PlayerData { Bukkit.getConsoleSender().sendMessage("[VentureChat] Null Mute Time: " + parts[0] + " " + name); continue; } - mutes.put(ChatChannel.getChannel(parts[0]).getName(), Integer.parseInt(parts[1])); + String channelName = parts[0]; + mutes.put(channelName, new MuteContainer(channelName, Long.parseLong(parts[1]))); } } Set blockedCommands = new HashSet(); @@ -160,18 +163,13 @@ public class PlayerData { listening.add(channel); } } - HashMap mutes = new HashMap(); - StringTokenizer m = new StringTokenizer(playerDataFileYamlConfiguration.getString("mutes"), ","); - while(m.hasMoreTokens()) { - String[] parts = m.nextToken().split(":"); - if(ChatChannel.isChannel(parts[0])) { - if(parts[1].equals("null")) { - Bukkit.getConsoleSender().sendMessage("[VentureChat] Null Mute Time: " + parts[0] + " " + name); - continue; - } - mutes.put(ChatChannel.getChannel(parts[0]).getName(), Integer.parseInt(parts[1])); - } + HashMap mutes = new HashMap(); + ConfigurationSection muteSection = playerDataFileYamlConfiguration.getConfigurationSection("mutes"); + for(String channelName : muteSection.getKeys(false)) { + ConfigurationSection channelSection = muteSection.getConfigurationSection(channelName); + mutes.put(channelName, new MuteContainer(channelName, channelSection.getLong("time"), channelSection.getString("reason"))); } + Set blockedCommands = new HashSet(); StringTokenizer b = new StringTokenizer(playerDataFileYamlConfiguration.getString("blockedcommands"), ","); while(b.hasMoreTokens()) { @@ -225,11 +223,6 @@ public class PlayerData { ChatChannel c = ChatChannel.getChannel(channel); listening += c.getName() + ","; } - String mutes = ""; - for(String channel : mcp.getMutes().keySet()) { - ChatChannel c = ChatChannel.getChannel(channel); - mutes += c.getName() + ":" + mcp.getMutes().get(c.getName()) + ","; - } String blockedCommands = ""; for(String s : mcp.getBlockedCommands()) { blockedCommands += s + ","; @@ -238,13 +231,14 @@ public class PlayerData { listening = listening.substring(0, listening.length() - 1); } playerDataFileYamlConfiguration.set("listen", listening); - if(mutes.length() > 0) { - mutes = mutes.substring(0, mutes.length() - 1); - } - playerDataFileYamlConfiguration.set("mutes", mutes); - if(blockedCommands.length() > 0) { - blockedCommands = blockedCommands.substring(0, blockedCommands.length() - 1); + + ConfigurationSection muteSection = playerDataFileYamlConfiguration.createSection("mutes"); + for(MuteContainer mute : mcp.getMutes()) { + ConfigurationSection channelSection = muteSection.createSection(mute.getChannel()); + channelSection.set("time", mute.getDuration()); + channelSection.set("reason", mute.getReason()); } + playerDataFileYamlConfiguration.set("blockedcommands", blockedCommands); playerDataFileYamlConfiguration.set("host", mcp.isHost()); playerDataFileYamlConfiguration.set("party", mcp.hasParty() ? mcp.getParty().toString() : ""); diff --git a/src/mineverse/Aust1n46/chat/database/SQLite.java b/src/mineverse/Aust1n46/chat/database/SQLite.java deleted file mode 100644 index 75f17ed..0000000 --- a/src/mineverse/Aust1n46/chat/database/SQLite.java +++ /dev/null @@ -1,28 +0,0 @@ -package mineverse.Aust1n46.chat.database; - -import java.io.File; -import java.io.IOException; - -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; - -import mineverse.Aust1n46.chat.MineverseChat; - -//This class initializes the connection to a SQLite database, which has no implementations currently in the plugin. -public class SQLite extends Database { - - public SQLite(String dbLocation) { - File dataFolder = MineverseChat.getInstance().getDataFolder(); - if (!dataFolder.exists()) dataFolder.mkdirs(); - File databaseFile = new File(dataFolder, dbLocation); - try { - if (!databaseFile.exists()) databaseFile.createNewFile(); - } catch (IOException e) { - throw new RuntimeException(e); - } - HikariConfig config = new HikariConfig(); - final String jdbcUrl = String.format("jdbc:sqlite:%s", databaseFile); - config.setJdbcUrl(jdbcUrl); - dataSource = new HikariDataSource(config); - } -} \ No newline at end of file diff --git a/src/mineverse/Aust1n46/chat/database/TemporaryDataInstance.java b/src/mineverse/Aust1n46/chat/database/TemporaryDataInstance.java new file mode 100644 index 0000000..af7b9dc --- /dev/null +++ b/src/mineverse/Aust1n46/chat/database/TemporaryDataInstance.java @@ -0,0 +1,37 @@ +package mineverse.Aust1n46.chat.database; + +import java.util.HashMap; +import java.util.UUID; + +public class TemporaryDataInstance { + private int messagePackets; + private UUID uuid; + + private static HashMap temporaryDataInstances = new HashMap(); + + private TemporaryDataInstance(UUID uuid) { + this.uuid = uuid; + } + + public static UUID createTemporaryDataInstance() { + UUID uuid = UUID.randomUUID(); + temporaryDataInstances.put(uuid, new TemporaryDataInstance(uuid)); + return uuid; + } + + public static TemporaryDataInstance getTemporaryDataInstance(UUID uuid) { + return temporaryDataInstances.get(uuid); + } + + public int getMessagePackets() { + return this.messagePackets; + } + + public void incrementMessagePackets() { + this.messagePackets++; + } + + public void destroyInstance() { + temporaryDataInstances.remove(uuid); + } +} diff --git a/src/mineverse/Aust1n46/chat/listeners/ChatListener.java b/src/mineverse/Aust1n46/chat/listeners/ChatListener.java index 401f95c..4345b94 100644 --- a/src/mineverse/Aust1n46/chat/listeners/ChatListener.java +++ b/src/mineverse/Aust1n46/chat/listeners/ChatListener.java @@ -2,14 +2,11 @@ package mineverse.Aust1n46.chat.listeners; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; -import java.text.SimpleDateFormat; -import java.util.Calendar; import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; -import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -29,15 +26,13 @@ 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; -import mineverse.Aust1n46.chat.versions.VersionHandler; //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 static final int MILLISECONDS_PER_MINUTE = 60000; - private static final int MILLISECONDS_PER_SECOND = 1000; - private MineverseChat plugin = MineverseChat.getInstance(); @EventHandler(priority = EventPriority.NORMAL) @@ -147,20 +142,12 @@ public class ChatListener implements Listener { tp.getPlayer().sendMessage(send); mcp.getPlayer().sendMessage(echo); if(tp.hasNotifications()) { - if(VersionHandler.is1_8()) { - tp.getPlayer().playSound(tp.getPlayer().getLocation(), Sound.valueOf("LEVEL_UP"), 1, 0); - } - if(VersionHandler.is1_9()) { - tp.getPlayer().playSound(tp.getPlayer().getLocation(), Sound.valueOf("ENTITY_PLAYER_LEVELUP"), 1, 0); - } + Format.playMessageSound(tp); } mcp.setReplyPlayer(tp.getUUID()); tp.setReplyPlayer(mcp.getUUID()); - if(plugin.db != null) { - Calendar currentDate = Calendar.getInstance(); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String date = formatter.format(currentDate.getTime()); - plugin.db.writeVentureChat(date, mcp.getUUID().toString(), mcp.getName(), "Local", "Messaging_Component", chat.replace("'", "''"), "Chat"); + if(Database.isEnabled()) { + Database.writeVentureChat(mcp.getUUID().toString(), mcp.getName(), "Local", "Messaging_Component", chat.replace("'", "''"), "Chat"); } } return; @@ -195,11 +182,8 @@ public class ChatListener implements Listener { } } Bukkit.getConsoleSender().sendMessage(partyformat); - if(plugin.db != null) { - Calendar currentDate = Calendar.getInstance(); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String date = formatter.format(currentDate.getTime()); - plugin.db.writeVentureChat(date, mcp.getUUID().toString(), mcp.getName(), "Local", "Party_Component", chat.replace("'", "''"), "Chat"); + if(Database.isEnabled()) { + Database.writeVentureChat(mcp.getUUID().toString(), mcp.getName(), "Local", "Party_Component", chat.replace("'", "''"), "Chat"); } return; } @@ -213,34 +197,50 @@ public class ChatListener implements Listener { Boolean filterthis = true; mcp.addListening(eventChannel.getName()); if (mcp.isMuted(eventChannel.getName())) { - if (mcp.getMutes().get(eventChannel.getName()).intValue() > 0) { - int dateTimeMillis = Format.currentTimeMillis(); - String units = LocalizedMessage.UNITS_MINUTE_PLURAL.toString(); - int muteTimeMillis = mcp.getMutes().get(eventChannel.getName()).intValue(); - int remainingMuteTime = (muteTimeMillis - dateTimeMillis) / MILLISECONDS_PER_MINUTE; - if (remainingMuteTime <= 0) { - remainingMuteTime = 1; + 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; } - if (remainingMuteTime == 1) { - units = LocalizedMessage.UNITS_MINUTE_SINGULAR.toString(); + 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)); } - mcp.getPlayer() - .sendMessage(LocalizedMessage.CHANNEL_MUTED_TIMED.toString() - .replace("{channel_color}", eventChannel.getColor()) - .replace("{channel_name}", eventChannel.getName()) - .replace("{time}", String.valueOf(remainingMuteTime)).replace("{units}", units)); } else { - mcp.getPlayer() - .sendMessage(LocalizedMessage.CHANNEL_MUTED.toString() - .replace("{channel_color}", eventChannel.getColor()) - .replace("{channel_name}", eventChannel.getName())); + 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; - int chCooldown = 0; String curColor = ""; if(eventChannel.hasPermission() && !mcp.getPlayer().hasPermission(eventChannel.getPermission())) { mcp.getPlayer().sendMessage(LocalizedMessage.CHANNEL_NO_PERMISSION.toString()); @@ -257,22 +257,20 @@ public class ChatListener implements Listener { curColor = eventChannel.getChatColor(); bungee = eventChannel.getBungee(); - int dateTimeSeconds = Format.currentTimeMillis() / MILLISECONDS_PER_SECOND; + long dateTimeSeconds = System.currentTimeMillis() / Format.MILLISECONDS_PER_SECOND; + int chCooldown = 0; if(eventChannel.hasCooldown()) { chCooldown = eventChannel.getCooldown(); } try { if (mcp.hasCooldown(eventChannel)) { - int cooldownTime = mcp.getCooldowns().get(eventChannel).intValue(); + long cooldownTime = mcp.getCooldowns().get(eventChannel).longValue(); if (dateTimeSeconds < cooldownTime) { - int remainingCooldownTime = cooldownTime - dateTimeSeconds; - String units = LocalizedMessage.UNITS_SECOND_PLURAL.toString(); - if (remainingCooldownTime == 1) { - units = LocalizedMessage.UNITS_SECOND_SINGULAR.toString(); - } + long remainingCooldownTime = cooldownTime - dateTimeSeconds; + String cooldownString = Format.parseTimeStringFromMillis(remainingCooldownTime * Format.MILLISECONDS_PER_SECOND); mcp.getPlayer().sendMessage(LocalizedMessage.CHANNEL_COOLDOWN.toString() - .replace("{cooldown}", String.valueOf(remainingCooldownTime)).replace("{units}", units)); + .replace("{cooldown}", cooldownString)); mcp.setQuickChat(false); bungee = false; return; @@ -289,34 +287,37 @@ public class ChatListener implements Listener { if (mcp.hasSpam(eventChannel) && plugin.getConfig().getConfigurationSection("antispam").getBoolean("enabled") && !mcp.getPlayer().hasPermission("venturechat.spam.bypass")) { - int spamcount = mcp.getSpam().get(eventChannel).get(0); - int spamtime = mcp.getSpam().get(eventChannel).get(1); - int spamtimeconfig = plugin.getConfig().getConfigurationSection("antispam").getInt("spamnumber"); - int mutedForTime = plugin.getConfig().getConfigurationSection("antispam").getInt("mutetime", 0); - int dateTime = Format.currentTimeMillis(); + 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").getInt("spamtime")) { + + plugin.getConfig().getConfigurationSection("antispam").getLong("spamtime")) { if (spamcount + 1 >= spamtimeconfig) { - if (mutedForTime > 0) { - mcp.addMute(eventChannel.getName(), dateTime + (mutedForTime * MILLISECONDS_PER_MINUTE)); - String units = LocalizedMessage.UNITS_MINUTE_PLURAL.toString(); - if (mutedForTime == 1) { - units = LocalizedMessage.UNITS_MINUTE_SINGULAR.toString(); - } + 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_SPAM_TIME.toString() + .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_TIME_REASON.toString() .replace("{channel_color}", eventChannel.getColor()) .replace("{channel_name}", eventChannel.getName()) - .replace("{time}", String.valueOf(mutedForTime)).replace("{units}", units)); + .replace("{time}", timeString) + .replace("{reason}", LocalizedMessage.SPAM_MUTE_REASON_TEXT.toString())); } else { - mcp.addMute(eventChannel.getName(), 0); + mcp.addMute(eventChannel.getName(), LocalizedMessage.SPAM_MUTE_REASON_TEXT.toString()); mcp.getPlayer() - .sendMessage(LocalizedMessage.MUTE_PLAYER_SPAM.toString() + .sendMessage(LocalizedMessage.MUTE_PLAYER_PLAYER_REASON.toString() .replace("{channel_color}", eventChannel.getColor()) - .replace("{channel_name}", eventChannel.getName())); + .replace("{channel_name}", eventChannel.getName()) + .replace("{reason}", LocalizedMessage.SPAM_MUTE_REASON_TEXT.toString())); } - mcp.getSpam().get(eventChannel).set(0, 0); + if(eventChannel.getBungee()) { + plugin.synchronize(mcp, true); + } + mcp.getSpam().get(eventChannel).set(0, 0L); mcp.setQuickChat(false); return; } else { @@ -329,12 +330,12 @@ public class ChatListener implements Listener { mcp.getSpam().get(eventChannel).set(0, spamcount + 1); } } else { - mcp.getSpam().get(eventChannel).set(0, 1); + mcp.getSpam().get(eventChannel).set(0, 1L); mcp.getSpam().get(eventChannel).set(1, dateTimeSeconds); } } else { mcp.addSpam(eventChannel); - mcp.getSpam().get(eventChannel).add(0, 1); + mcp.getSpam().get(eventChannel).add(0, 1L); mcp.getSpam().get(eventChannel).add(1, dateTimeSeconds); } @@ -511,11 +512,8 @@ public class ChatListener implements Listener { boolean bungee = event.isBungee(); if(!bungee) { - if(plugin.db != null) { - Calendar currentDate = Calendar.getInstance(); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String date = formatter.format(currentDate.getTime()); - plugin.db.writeVentureChat(date, mcp.getUUID().toString(), mcp.getName(), "Local", channel.getName(), chat.replace("'", "''"), "Chat"); + if(Database.isEnabled()) { + Database.writeVentureChat(mcp.getUUID().toString(), mcp.getName(), "Local", channel.getName(), chat.replace("'", "''"), "Chat"); } if(recipientCount == 1) { diff --git a/src/mineverse/Aust1n46/chat/listeners/CommandListener.java b/src/mineverse/Aust1n46/chat/listeners/CommandListener.java index 87830cb..710494e 100644 --- a/src/mineverse/Aust1n46/chat/listeners/CommandListener.java +++ b/src/mineverse/Aust1n46/chat/listeners/CommandListener.java @@ -1,8 +1,6 @@ package mineverse.Aust1n46.chat.listeners; import java.io.FileNotFoundException; -import java.text.SimpleDateFormat; -import java.util.Calendar; import mineverse.Aust1n46.chat.MineverseChat; import mineverse.Aust1n46.chat.alias.Alias; @@ -10,6 +8,7 @@ import mineverse.Aust1n46.chat.alias.AliasInfo; import mineverse.Aust1n46.chat.api.MineverseChatAPI; import mineverse.Aust1n46.chat.api.MineverseChatPlayer; import mineverse.Aust1n46.chat.channel.ChatChannel; +import mineverse.Aust1n46.chat.database.Database; import mineverse.Aust1n46.chat.gui.GuiSlot; import mineverse.Aust1n46.chat.localization.LocalizedMessage; import mineverse.Aust1n46.chat.utilities.Format; @@ -47,19 +46,21 @@ public class CommandListener implements CommandExecutor, Listener { public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) throws FileNotFoundException { ConfigurationSection cs = plugin.getConfig().getConfigurationSection("commandspy"); Boolean wec = cs.getBoolean("worldeditcommands", true); - MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(event.getPlayer()); - for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { - if(p.hasCommandSpy()) { - if(wec) { - p.getPlayer().sendMessage(Format.FormatStringAll(cs.getString("format").replace("{player}", mcp.getName()).replace("{command}", event.getMessage()))); - } - else { - if(!(event.getMessage().toLowerCase().startsWith("//"))) { - p.getPlayer().sendMessage(Format.FormatStringAll(cs.getString("format").replace("{player}", mcp.getName()).replace("{command}", event.getMessage()))); + MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(event.getPlayer()); + if(!mcp.getPlayer().hasPermission("venturechat.commandspy.override")) { + for(MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { + if(p.hasCommandSpy()) { + if(wec) { + p.getPlayer().sendMessage(Format.FormatStringAll(cs.getString("format").replace("{player}", mcp.getName()).replace("{command}", event.getMessage()))); } else { if(!(event.getMessage().toLowerCase().startsWith("//"))) { - p.getPlayer().sendMessage(ChatColor.GOLD + mcp.getName() + ": " + event.getMessage()); + p.getPlayer().sendMessage(Format.FormatStringAll(cs.getString("format").replace("{player}", mcp.getName()).replace("{command}", event.getMessage()))); + } + else { + if(!(event.getMessage().toLowerCase().startsWith("//"))) { + p.getPlayer().sendMessage(ChatColor.GOLD + mcp.getName() + ": " + event.getMessage()); + } } } } @@ -75,30 +76,9 @@ public class CommandListener implements CommandExecutor, Listener { } String message = event.getMessage(); - /* - * boolean cus = false; if((message.startsWith("/pl") || - * message.startsWith("/plugins")) && - * plugin.getConfig().getBoolean("modifypluginlist", true)) { - * if(message.contains(" ")) { if(message.split(" ")[0].equals("/pl") || - * message.split(" ")[0].equals("/plugins")) { cus = true; } } - * if(message.equals("/pl") || message.equals("/plugins")) { cus = true; - * } if(cus && mcp.getPlayer().hasPermission("bukkit.command.plugins")) - * { String pluginlist = ""; for(Plugin p : - * Bukkit.getPluginManager().getPlugins()) { pluginlist += - * ChatColor.GREEN + p.getName().replace("VentureChat", - * plugin.getConfig().getString("pluginname", "VentureChat")) + - * ChatColor.WHITE + ", "; } if(pluginlist.length() > 2) { pluginlist = - * pluginlist.substring(0, pluginlist.length() - 2); } - * mcp.getPlayer().sendMessage("Plugins (" + - * Bukkit.getPluginManager().getPlugins().length + "): " + pluginlist); - * event.setCancelled(true); return; } } - */ - if(plugin.db != null) { - Calendar currentDate = Calendar.getInstance(); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String date = formatter.format(currentDate.getTime()); - plugin.db.writeVentureChat(date, mcp.getUUID().toString(), mcp.getName(), "Local", "Command_Component", event.getMessage().replace("'", "''"), "Command"); + if(Database.isEnabled()) { + Database.writeVentureChat(mcp.getUUID().toString(), mcp.getName(), "Local", "Command_Component", event.getMessage().replace("'", "''"), "Command"); } for(Alias a : aa.getAliases()) { @@ -145,7 +125,7 @@ public class CommandListener implements CommandExecutor, Listener { event.setCancelled(true); } if(s.startsWith("Broadcast:")) { - plugin.getServer().broadcastMessage(s.substring(11).replace("$", send)); + Format.broadcastToServer(s.substring(11).replace("$", send)); event.setCancelled(true); } } @@ -153,7 +133,7 @@ public class CommandListener implements CommandExecutor, Listener { } if(!plugin.quickchat) { - for(ChatChannel channel : ChatChannel.getChannels()) { + for(ChatChannel channel : ChatChannel.getChatChannels()) { if(!channel.hasPermission() || mcp.getPlayer().hasPermission(channel.getPermission())) { if(message.equals("/" + channel.getAlias())) { mcp.getPlayer().sendMessage(LocalizedMessage.SET_CHANNEL.toString() @@ -209,11 +189,8 @@ public class CommandListener implements CommandExecutor, Listener { //old 1.8 command map @EventHandler public void onServerCommand(ServerCommandEvent event) { - if (plugin.db != null) { - Calendar currentDate = Calendar.getInstance(); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String date = formatter.format(currentDate.getTime()); - plugin.db.writeVentureChat(date, "N/A", "Console", "Local", "Command_Component", event.getCommand().replace("'", "''") , "Command"); + if (Database.isEnabled()) { + Database.writeVentureChat("N/A", "Console", "Local", "Command_Component", event.getCommand().replace("'", "''") , "Command"); } } @@ -227,7 +204,7 @@ public class CommandListener implements CommandExecutor, Listener { return true; } MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); - for(ChatChannel channel : ChatChannel.getChannels()) { + for(ChatChannel channel : ChatChannel.getChatChannels()) { if(command.getName().toLowerCase().equals(channel.getAlias())) { if(args.length == 0) { mcp.getPlayer().sendMessage(ChatColor.RED + "Invalid command: /" + channel.getAlias() + " message"); diff --git a/src/mineverse/Aust1n46/chat/listeners/LoginListener.java b/src/mineverse/Aust1n46/chat/listeners/LoginListener.java index d54c962..8879658 100644 --- a/src/mineverse/Aust1n46/chat/listeners/LoginListener.java +++ b/src/mineverse/Aust1n46/chat/listeners/LoginListener.java @@ -1,8 +1,5 @@ package mineverse.Aust1n46.chat.listeners; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; import java.util.UUID; import org.bukkit.Bukkit; @@ -12,6 +9,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.spigotmc.SpigotConfig; import mineverse.Aust1n46.chat.MineverseChat; import mineverse.Aust1n46.chat.api.MineverseChatAPI; @@ -25,7 +23,6 @@ import mineverse.Aust1n46.chat.utilities.UUIDFetcher; //and it's data. public class LoginListener implements Listener { private MineverseChat plugin = MineverseChat.getInstance(); - private boolean firstPlayerHasJoined = false; @EventHandler(priority = EventPriority.LOW) public void onPlayerQuit(PlayerQuitEvent plog) { @@ -45,6 +42,18 @@ public class LoginListener implements Listener { mcp.setOnline(false); MineverseChatAPI.removeMineverseChatOnlinePlayerToMap(mcp); } + + void handleNameChange(MineverseChatPlayer mcp, Player eventPlayerInstance) { + Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Detected Name Change. Old Name:&c " + mcp.getName() + " &eNew Name:&c " + eventPlayerInstance.getName())); + MineverseChatAPI.removeNameFromMap(mcp.getName()); + //reset nickname if nickname equals old username + if(mcp.getName().equals(eventPlayerInstance.getDisplayName())) { + eventPlayerInstance.setDisplayName(eventPlayerInstance.getName()); + mcp.setNickname(eventPlayerInstance.getName()); + } + mcp.setName(eventPlayerInstance.getName()); + MineverseChatAPI.addNameToMap(mcp); + } @EventHandler(priority = EventPriority.LOW) public void onPlayerJoin(PlayerJoinEvent event) throws Exception { @@ -53,24 +62,14 @@ public class LoginListener implements Listener { Player player = event.getPlayer(); String name = player.getName(); UUID uuid = player.getUniqueId(); - ChatChannel current = ChatChannel.getDefaultChannel(); - Set ignores = new HashSet(); - Set listening = new HashSet(); - listening.add(current.getName()); - HashMap mutes = new HashMap(); - Set blockedCommands = new HashSet(); - String jsonFormat = "Default"; - mcp = new MineverseChatPlayer(uuid, name, current, ignores, listening, mutes, blockedCommands, false, null, true, true, name, jsonFormat, false, false, false, true, true); + mcp = new MineverseChatPlayer(uuid, name); MineverseChatAPI.addMineverseChatPlayerToMap(mcp); MineverseChatAPI.addNameToMap(mcp); } UUIDFetcher.checkOfflineUUIDWarning(mcp.getUUID()); //check for name change if(!mcp.getName().equals(event.getPlayer().getName())) { - Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Detected Name Change. Old Name:&c " + mcp.getName() + " &eNew Name:&c " + event.getPlayer().getName())); - MineverseChatAPI.removeNameFromMap(mcp.getName()); - mcp.setName(event.getPlayer().getName()); - MineverseChatAPI.addNameToMap(mcp); + handleNameChange(mcp, event.getPlayer()); } if(!event.getPlayer().getDisplayName().equals(mcp.getName())) { mcp.setNickname(event.getPlayer().getDisplayName()); @@ -97,19 +96,15 @@ public class LoginListener implements Listener { mcp.addListening(ch.getName()); } } - - long delayInTicks = 20L; - // Add extra delay to allow the sync to run properly - if(!firstPlayerHasJoined) { - delayInTicks = 100L; - firstPlayerHasJoined = true; + if(SpigotConfig.bungee) { + long delayInTicks = 20L; + final MineverseChatPlayer sync = mcp; + plugin.getServer().getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() { + public void run() { + plugin.synchronize(sync, false); + } + }, delayInTicks); } - final MineverseChatPlayer sync = mcp; - plugin.getServer().getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() { - public void run() { - plugin.synchronize(sync, false); - } - }, delayInTicks); if(!plugin.getConfig().getConfigurationSection("login").getString("message", "Default").equalsIgnoreCase("Default")) { event.setJoinMessage(Format.FormatStringAll(plugin.getConfig().getConfigurationSection("login").getString("message", "Default").replace("{player}", event.getPlayer().getName()))); } diff --git a/src/mineverse/Aust1n46/chat/localization/Localization.java b/src/mineverse/Aust1n46/chat/localization/Localization.java index 4a28528..f96eb2e 100644 --- a/src/mineverse/Aust1n46/chat/localization/Localization.java +++ b/src/mineverse/Aust1n46/chat/localization/Localization.java @@ -14,7 +14,7 @@ public class Localization { private static MineverseChat plugin = MineverseChat.getInstance(); private static FileConfiguration localization; - private static final String VERSION = "2.20.0"; + private static final String VERSION = "2.22.4"; public static void initialize() { File localizationFile = new File(plugin.getDataFolder().getAbsolutePath(), "Messages.yml"); diff --git a/src/mineverse/Aust1n46/chat/localization/LocalizedMessage.java b/src/mineverse/Aust1n46/chat/localization/LocalizedMessage.java index 0a0fa5d..f13b99e 100644 --- a/src/mineverse/Aust1n46/chat/localization/LocalizedMessage.java +++ b/src/mineverse/Aust1n46/chat/localization/LocalizedMessage.java @@ -24,7 +24,9 @@ public enum LocalizedMessage { CHANNEL_NO_SPEAK_PERMISSIONS("ChannelNoSpeakPermissions"), CHANNEL_PLAYER_LIST_HEADER("ChannelPlayerListHeader"), CHANNEL_MUTED("ChannelMuted"), + CHANNEL_MUTED_REASON("ChannelMutedReason"), CHANNEL_MUTED_TIMED("ChannelMutedTimed"), + CHANNEL_MUTED_TIMED_REASON("ChannelMutedTimedReason"), COMMAND_INVALID_ARGUMENTS("CommandInvalidArguments"), COMMAND_INVALID_ARGUMENTS_IGNORE("CommandInvalidArgumentsIgnore"), COMMAND_MUST_BE_RUN_BY_PLAYER("CommandMustBeRunByPlayer"), @@ -59,13 +61,19 @@ public enum LocalizedMessage { MESSAGE_TOGGLE_ON("MessageToggleOn"), MUST_LISTEN_ONE_CHANNEL("MustListenOneChannel"), MUTE_PLAYER_ALL_PLAYER("MutePlayerAllPlayer"), + MUTE_PLAYER_ALL_PLAYER_REASON("MutePlayerAllPlayerReason"), MUTE_PLAYER_ALL_SENDER("MutePlayerAllSender"), + MUTE_PLAYER_ALL_SENDER_REASON("MutePlayerAllSenderReason"), MUTE_PLAYER_PLAYER("MutePlayerPlayer"), MUTE_PLAYER_PLAYER_TIME("MutePlayerPlayerTime"), + MUTE_PLAYER_PLAYER_TIME_REASON("MutePlayerPlayerTimeReason"), + MUTE_PLAYER_PLAYER_REASON("MutePlayerPlayerReason"), MUTE_PLAYER_SPAM("MutePlayerSpam"), MUTE_PLAYER_SPAM_TIME("MutePlayerSpamTime"), MUTE_PLAYER_SENDER("MutePlayerSender"), + MUTE_PLAYER_SENDER_REASON("MutePlayerSenderReason"), MUTE_PLAYER_SENDER_TIME("MutePlayerSenderTime"), + MUTE_PLAYER_SENDER_TIME_REASON("MutePlayerSenderTimeReason"), NO_PLAYER_TO_REPLY_TO("NoPlayerToReplyTo"), NOTIFICATIONS_OFF("NotificationsOff"), NOTIFICATIONS_ON("NotificationsOn"), @@ -80,11 +88,16 @@ public enum LocalizedMessage { SET_CHANNEL_ALL_SENDER("SetChannelAllSender"), SET_CHANNEL_PLAYER_CHANNEL_NO_PERMISSION("SetChannelPlayerChannelNoPermission"), SET_CHANNEL_SENDER("SetChannelSender"), + SPAM_MUTE_REASON_TEXT("SpamMuteReasonText"), SPAM_WARNING("SpamWarning"), SPY_OFF("SpyOff"), SPY_ON("SpyOn"), UNBLOCK_COMMAND_PLAYER("UnblockCommandPlayer"), UNBLOCK_COMMAND_SENDER("UnblockCommandSender"), + UNITS_DAY_PLURAL("UnitsDayPlural"), + UNITS_DAY_SINGULAR("UnitsDaySingular"), + UNITS_HOUR_PLURAL("UnitsHourPlural"), + UNITS_HOUR_SINGULAR("UnitsHourSingular"), UNITS_MINUTE_PLURAL("UnitsMinutePlural"), UNITS_MINUTE_SINGULAR("UnitsMinuteSingular"), UNITS_SECOND_PLURAL("UnitsSecondPlural"), diff --git a/src/mineverse/Aust1n46/chat/utilities/Format.java b/src/mineverse/Aust1n46/chat/utilities/Format.java index a7d6b4f..fc2280d 100644 --- a/src/mineverse/Aust1n46/chat/utilities/Format.java +++ b/src/mineverse/Aust1n46/chat/utilities/Format.java @@ -3,13 +3,16 @@ 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 com.comphenix.protocol.PacketType; @@ -19,8 +22,10 @@ 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; /** @@ -38,6 +43,14 @@ public class Format { private static final Pattern LEGACY_CHAT_COLOR_DIGITS_PATTERN = Pattern.compile("&([0-9])"); private static final Pattern LEGACY_CHAT_COLOR_PATTERN = Pattern.compile( "(?= 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; - public static int currentTimeMillis() { - return (int) (System.currentTimeMillis() % Integer.MAX_VALUE); + 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_8() || VersionHandler.is1_7_10() || VersionHandler.is1_7_2() || VersionHandler.is1_7_9()) { + return Sound.valueOf(DEFAULT_LEGACY_MESSAGE_SOUND); + } + else { + return Sound.valueOf(DEFAULT_MESSAGE_SOUND); + } } } diff --git a/src/plugin.yml b/src/plugin.yml index 8350763..bf78690 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,5 +1,5 @@ -name: VentureChat -version: 2.22.3 +name: VentureChat +version: 2.22.4 api-version: 1.13 main: mineverse.Aust1n46.chat.MineverseChat depend: [Vault, ProtocolLib, PlaceholderAPI] diff --git a/test/mineverse/Aust1n46/chat/listeners/LoginListenerTest.java b/test/mineverse/Aust1n46/chat/listeners/LoginListenerTest.java new file mode 100644 index 0000000..08ee786 --- /dev/null +++ b/test/mineverse/Aust1n46/chat/listeners/LoginListenerTest.java @@ -0,0 +1,62 @@ +package mineverse.Aust1n46.chat.listeners; + +import org.bukkit.Bukkit; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +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; +import mineverse.Aust1n46.chat.api.MineverseChatAPI; +import mineverse.Aust1n46.chat.api.MineverseChatPlayer; +import mineverse.Aust1n46.chat.listeners.LoginListener;; + +/** + * Tests {@link LoginListener}. + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({ MineverseChat.class, MineverseChatAPI.class, Bukkit.class}) +public class LoginListenerTest { + private MineverseChat mockPlugin; + private Player mockPlayer; + private MineverseChatPlayer mockMCP; + private ConsoleCommandSender mockConsoleSender; + + @Before + public void setUp() { + mockPlugin = Mockito.mock(MineverseChat.class); + mockPlayer = Mockito.mock(Player.class); + mockMCP = Mockito.mock(MineverseChatPlayer.class); + mockConsoleSender = Mockito.mock(ConsoleCommandSender.class); + + PowerMockito.mockStatic(MineverseChat.class); + PowerMockito.when(MineverseChat.getInstance()).thenReturn(mockPlugin); + + PowerMockito.mockStatic(MineverseChatAPI.class); + PowerMockito.when(MineverseChatAPI.getMineverseChatPlayer(Mockito.any(Player.class))).thenReturn(mockMCP); + + PowerMockito.mockStatic(Bukkit.class); + PowerMockito.when(Bukkit.getConsoleSender()).thenReturn(mockConsoleSender); + } + + @After + public void tearDown() { + mockPlugin = null; + } + + @Test + public void testLoginWithNameChange() throws Exception { + Mockito.when(mockPlayer.getName()).thenReturn("NewName"); + Mockito.when(mockMCP.getName()).thenReturn("OldName"); + Mockito.when(mockPlayer.getDisplayName()).thenReturn("OldName"); + LoginListener testLoginListener = new LoginListener(); + testLoginListener.handleNameChange(mockMCP, mockPlayer); + Mockito.verify(mockMCP, Mockito.times(1)).setNickname("NewName"); + } +}