diff --git a/src/main/java/com/songoda/skyblock/command/commands/admin/ChatSpyCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/ChatSpyCommand.java index cc397517..a77f5521 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/admin/ChatSpyCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/admin/ChatSpyCommand.java @@ -1,28 +1,90 @@ package com.songoda.skyblock.command.commands.admin; +import com.songoda.core.compatibility.CompatibleSound; +import com.songoda.core.hooks.EconomyManager; import com.songoda.skyblock.command.SubCommand; import com.songoda.skyblock.config.FileManager; +import com.songoda.skyblock.gui.bank.GuiBank; +import com.songoda.skyblock.island.Island; +import com.songoda.skyblock.island.IslandManager; import com.songoda.skyblock.message.MessageManager; import com.songoda.skyblock.playerdata.PlayerData; import com.songoda.skyblock.playerdata.PlayerDataManager; +import com.songoda.skyblock.sound.SoundManager; +import com.songoda.skyblock.utils.player.OfflinePlayer; +import org.bukkit.Bukkit; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import java.io.File; +import java.util.UUID; public class ChatSpyCommand extends SubCommand { @Override public void onCommandByPlayer(Player player, String[] args) { - MessageManager messageManager = skyblock.getMessageManager(); PlayerDataManager playerDataManager = skyblock.getPlayerDataManager(); + MessageManager messageManager = skyblock.getMessageManager(); + IslandManager islandManager = skyblock.getIslandManager(); FileManager fileManager = skyblock.getFileManager(); + SoundManager soundManager = skyblock.getSoundManager(); FileManager.Config language = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); FileConfiguration languageLoad = language.getFileConfiguration(); PlayerData playerData = playerDataManager.getPlayerData(player); + + if (args.length < 1) { + toggleSpy(player, messageManager, languageLoad, playerData); + } else { + switch (args[0].toLowerCase()) { + case "toggle": + toggleSpy(player, messageManager, languageLoad, playerData); + break; + case "global": + if(!playerData.isGlobalChatSpy()){ + playerData.enableGlobalChatSpy(); + messageManager.sendMessage(player, languageLoad.getString("Command.Island.Admin.Bank.ByConsole.Message")); + } else { + messageManager.sendMessage(player, languageLoad.getString("Command.Island.Admin.Bank.ByConsole.Message")); + soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1f, 1f); + } + break; + case "add": + if(args.length > 2){ + Island island = islandManager.getIslandByPlayer(new OfflinePlayer(UUID.fromString(args[1])).getBukkitOfflinePlayer()); + if(island != null) { + playerData.addChatSpyIsland(island); + } + } else { + messageManager.sendMessage(player, languageLoad.getString("Command.Island.Admin.Bank.Unexpected.Message")); + soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1f, 1f); + } + break; + case "remove": + if(args.length > 2){ + Island island = islandManager.getIslandByPlayer(new OfflinePlayer(UUID.fromString(args[1])).getBukkitOfflinePlayer()); + if(island != null) { + playerData.removeChatSpyIsland(island); + } + } else { + messageManager.sendMessage(player, languageLoad.getString("Command.Island.Admin.Bank.Unexpected.Message")); + soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1f, 1f); + } + break; + case "list": + + break; + default: + messageManager.sendMessage(player, languageLoad.getString("Command.Island.Admin.Bank.Unexpected.Message")); + soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1f, 1f); + break; + } + } + } + + private void toggleSpy(Player player, MessageManager messageManager, FileConfiguration languageLoad, PlayerData playerData) { if(playerData != null) { if(playerData.isChatSpy()){ playerData.setChatSpy(false); diff --git a/src/main/java/com/songoda/skyblock/listeners/Chat.java b/src/main/java/com/songoda/skyblock/listeners/Chat.java index 573a90d2..fb984512 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Chat.java +++ b/src/main/java/com/songoda/skyblock/listeners/Chat.java @@ -95,7 +95,7 @@ public class Chat implements Listener { for(Player targetPlayer : Bukkit.getServer().getOnlinePlayers()){ if(targetPlayer.hasPermission("fabledskyblock.admin.chatspy")) { PlayerData pd = playerDataManager.getPlayerData(targetPlayer); - if(pd != null && pd.isChatSpy()) { + if(pd != null && pd.isChatSpy() && (pd.isGlobalChatSpy() || pd.isChatSpyIsland(island))) { String message = ChatColor.translateAlternateColorCodes('&', messageManager.replaceMessage(targetPlayer, islandChatEvent.getFormat().replace("%role", islandRole).replace("%player", player.getName()))) .replace("%islandOwner", new OfflinePlayer(island.getOwnerUUID()).getName()) diff --git a/src/main/java/com/songoda/skyblock/playerdata/PlayerData.java b/src/main/java/com/songoda/skyblock/playerdata/PlayerData.java index 9490d12f..291e033d 100644 --- a/src/main/java/com/songoda/skyblock/playerdata/PlayerData.java +++ b/src/main/java/com/songoda/skyblock/playerdata/PlayerData.java @@ -5,6 +5,7 @@ import com.songoda.skyblock.bank.BankManager; import com.songoda.skyblock.bank.Transaction; import com.songoda.skyblock.config.FileManager.Config; import com.songoda.skyblock.confirmation.Confirmation; +import com.songoda.skyblock.island.Island; import com.songoda.skyblock.menus.MenuType; import com.songoda.skyblock.utils.structure.Area; @@ -17,7 +18,8 @@ import java.io.IOException; import java.util.*; public class PlayerData { - + + private final SkyBlock skyblock; private UUID uuid; private UUID islandOwnerUUID; private UUID ownershipUUID; @@ -35,6 +37,7 @@ public class PlayerData { private Area area; private boolean chatSpy; + private Set spiedIslands; private boolean chat; private boolean preview; @@ -44,6 +47,8 @@ public class PlayerData { private List transactions; public PlayerData(Player player) { + this.skyblock = SkyBlock.getInstance(); + uuid = player.getUniqueId(); islandOwnerUUID = null; @@ -55,6 +60,12 @@ public class PlayerData { area = new Area(); chatSpy = getConfig().getFileConfiguration().getBoolean("ChatSpy", false); + + if (getConfig().getFileConfiguration().getString("ChatSpiedIslands") != null) { + for (String islandUUID : getConfig().getFileConfiguration().getStringList("ChatSpiedIslands")) { + spiedIslands.add(UUID.fromString(islandUUID)); + } + } chat = false; preview = false; @@ -270,7 +281,7 @@ public class PlayerData { } } - public void save() { + public synchronized void save() { transactions = BankManager.getInstance().getTransactionList(getPlayerUUID()); Config config = getConfig(); FileConfiguration configLoad = config.getFileConfiguration(); @@ -288,6 +299,10 @@ public class PlayerData { }else { configLoad.set("Bank.Transactions.Size", 0); } + + configLoad.set("ChatSpy", chatSpy); + configLoad.set("ChatSpiedIslands", spiedIslands); + try { configLoad.save(config.getFile()); } catch (IOException e) { @@ -318,6 +333,41 @@ public class PlayerData { public void setChatSpy(boolean chatSpy) { this.chatSpy = chatSpy; - getConfig().getFileConfiguration().set("ChatSpy", chatSpy); + Bukkit.getScheduler().runTaskAsynchronously(skyblock, this::save); + } + + public void addChatSpyIsland(UUID uuid) { + spiedIslands.add(uuid); + Bukkit.getScheduler().runTaskAsynchronously(skyblock, this::save); + } + + public boolean isChatSpyIsland(UUID uuid) { + return spiedIslands.contains(uuid); + } + + public void removeChatSpyIsland(UUID uuid) { + spiedIslands.remove(uuid); + Bukkit.getScheduler().runTaskAsynchronously(skyblock, this::save); + } + + public void addChatSpyIsland(Island island) { + this.addChatSpyIsland(island.getOwnerUUID()); + } + + public boolean isChatSpyIsland(Island island) { + return this.isChatSpyIsland(island.getOwnerUUID()); + } + + public void removeChatSpyIsland(Island island) { + this.removeChatSpyIsland(island.getOwnerUUID()); + } + + public boolean isGlobalChatSpy() { + return spiedIslands.isEmpty(); + } + + public void enableGlobalChatSpy() { + spiedIslands.clear(); + Bukkit.getScheduler().runTaskAsynchronously(skyblock, this::save); } } diff --git a/src/main/java/com/songoda/skyblock/utils/player/OfflinePlayer.java b/src/main/java/com/songoda/skyblock/utils/player/OfflinePlayer.java index 9219e68e..5a26bf33 100644 --- a/src/main/java/com/songoda/skyblock/utils/player/OfflinePlayer.java +++ b/src/main/java/com/songoda/skyblock/utils/player/OfflinePlayer.java @@ -12,6 +12,7 @@ import java.util.UUID; public class OfflinePlayer { private UUID uuid; + org.bukkit.OfflinePlayer bukkitOfflinePlayer; private String name; private String memberSince; @@ -24,12 +25,11 @@ public class OfflinePlayer { public OfflinePlayer(String name) { SkyBlock skyblock = SkyBlock.getInstance(); UserCacheManager userCacheManager = skyblock.getUserCacheManager(); + + bukkitOfflinePlayer = Bukkit.getServer().getOfflinePlayer(name); - @SuppressWarnings("deprecation") - org.bukkit.OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(name); - - this.name = offlinePlayer.getName(); - this.uuid = offlinePlayer.getUniqueId(); + this.name = bukkitOfflinePlayer.getName(); + this.uuid = bukkitOfflinePlayer.getUniqueId(); if (this.uuid == null && userCacheManager.hasUser(name)) { this.uuid = userCacheManager.getUser(name); @@ -50,10 +50,10 @@ public class OfflinePlayer { public OfflinePlayer(UUID uuid) { SkyBlock skyblock = SkyBlock.getInstance(); UserCacheManager userCacheManager = skyblock.getUserCacheManager(); + + bukkitOfflinePlayer = Bukkit.getServer().getOfflinePlayer(uuid); - org.bukkit.OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(uuid); - - this.name = offlinePlayer.getName(); + this.name = bukkitOfflinePlayer.getName(); this.uuid = uuid; if (this.name == null && userCacheManager.hasUser(uuid)) { @@ -103,4 +103,8 @@ public class OfflinePlayer { public int getPlaytime() { return playtime; } + + public org.bukkit.OfflinePlayer getBukkitOfflinePlayer() { + return bukkitOfflinePlayer; + } }