diff --git a/src/main/java/com/songoda/ultimatemoderation/UltimateModeration.java b/src/main/java/com/songoda/ultimatemoderation/UltimateModeration.java index 31027ae..fb7fc67 100644 --- a/src/main/java/com/songoda/ultimatemoderation/UltimateModeration.java +++ b/src/main/java/com/songoda/ultimatemoderation/UltimateModeration.java @@ -9,6 +9,7 @@ import com.songoda.ultimatemoderation.punish.player.PlayerPunishData; import com.songoda.ultimatemoderation.punish.player.PunishmentManager; import com.songoda.ultimatemoderation.punish.template.Template; import com.songoda.ultimatemoderation.punish.template.TemplateManager; +import com.songoda.ultimatemoderation.staffchat.StaffChatManager; import com.songoda.ultimatemoderation.storage.Storage; import com.songoda.ultimatemoderation.storage.StorageRow; import com.songoda.ultimatemoderation.storage.types.StorageMysql; @@ -37,6 +38,7 @@ public class UltimateModeration extends JavaPlugin { private SettingsManager settingsManager; private CommandManager commandManager; private PunishmentManager punishmentManager; + private StaffChatManager staffChatManager; private Locale locale; private Storage storage; @@ -89,6 +91,7 @@ public class UltimateModeration extends JavaPlugin { this.templateManager = new TemplateManager(); this.commandManager = new CommandManager(this); this.punishmentManager = new PunishmentManager(); + this.staffChatManager = new StaffChatManager(); // Load data this.checkStorage(); @@ -236,4 +239,8 @@ public class UltimateModeration extends JavaPlugin { public TicketManager getTicketManager() { return ticketManager; } + + public StaffChatManager getStaffChatManager() { + return staffChatManager; + } } diff --git a/src/main/java/com/songoda/ultimatemoderation/command/CommandManager.java b/src/main/java/com/songoda/ultimatemoderation/command/CommandManager.java index ea59a5b..7e7c196 100644 --- a/src/main/java/com/songoda/ultimatemoderation/command/CommandManager.java +++ b/src/main/java/com/songoda/ultimatemoderation/command/CommandManager.java @@ -42,6 +42,7 @@ public class CommandManager implements CommandExecutor { instance.getCommand("Warn").setExecutor(this); instance.getCommand("RunTemplate").setExecutor(this); instance.getCommand("Ticket").setExecutor(this); + instance.getCommand("StaffChat").setExecutor(this); AbstractCommand commandUltimateModeration = addCommand(new CommandUltimateModeration()); addCommand(new CommandClearChat()); @@ -62,6 +63,7 @@ public class CommandManager implements CommandExecutor { addCommand(new CommandWarn()); addCommand(new CommandRunTemplate()); addCommand(new CommandTicket()); + addCommand(new CommandStaffChat()); addCommand(new CommandSettings(commandUltimateModeration)); addCommand(new CommandHelp(commandUltimateModeration)); diff --git a/src/main/java/com/songoda/ultimatemoderation/command/commands/CommandStaffChat.java b/src/main/java/com/songoda/ultimatemoderation/command/commands/CommandStaffChat.java new file mode 100644 index 0000000..dace00a --- /dev/null +++ b/src/main/java/com/songoda/ultimatemoderation/command/commands/CommandStaffChat.java @@ -0,0 +1,61 @@ +package com.songoda.ultimatemoderation.command.commands; + +import com.songoda.ultimatemoderation.UltimateModeration; +import com.songoda.ultimatemoderation.command.AbstractCommand; + +import com.songoda.ultimatemoderation.staffchat.StaffChannel; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class CommandStaffChat extends AbstractCommand { + + public CommandStaffChat() { + super(true, true, "StaffChat"); + } + + @Override + protected ReturnType runCommand(UltimateModeration instance, CommandSender sender, String... args) { + if (args.length != 1) + return ReturnType.SYNTAX_ERROR; + + String channelName = args[0]; + Player player = (Player)sender; + + if (channelName.trim().equalsIgnoreCase("leave")) { + for (StaffChannel channel : instance.getStaffChatManager().getChats().values()) { + if (!channel.listMembers().contains(player.getUniqueId())) continue; + channel.removeMember(player); + player.sendMessage("You left " + channel.getChannelName() + " successfully."); + return ReturnType.SUCCESS; + } + player.sendMessage("You are not in any channels."); + return ReturnType.FAILURE; + } + + instance.getStaffChatManager().getChat(channelName).addMember(player); + return ReturnType.SUCCESS; + } + + @Override + protected List onTab(UltimateModeration instance, CommandSender sender, String... args) { + return new ArrayList<>(instance.getStaffChatManager().getChats().keySet()); + } + + @Override + public String getPermissionNode() { + return "um.staffchat"; + } + + @Override + public String getSyntax() { + return "/sc "; + } + + @Override + public String getDescription() { + return "Opens a staff chat channel."; + } +} diff --git a/src/main/java/com/songoda/ultimatemoderation/listeners/ChatListener.java b/src/main/java/com/songoda/ultimatemoderation/listeners/ChatListener.java index b1668ac..f057b94 100644 --- a/src/main/java/com/songoda/ultimatemoderation/listeners/ChatListener.java +++ b/src/main/java/com/songoda/ultimatemoderation/listeners/ChatListener.java @@ -3,13 +3,17 @@ package com.songoda.ultimatemoderation.listeners; import com.songoda.ultimatemoderation.UltimateModeration; import com.songoda.ultimatemoderation.punish.AppliedPunishment; import com.songoda.ultimatemoderation.punish.PunishmentType; +import com.songoda.ultimatemoderation.staffchat.StaffChannel; import com.songoda.ultimatemoderation.utils.Methods; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; import java.util.List; +import java.util.Map; +import java.util.UUID; public class ChatListener implements Listener { @@ -27,6 +31,20 @@ public class ChatListener implements Listener { @EventHandler public void onChat(AsyncPlayerChatEvent event) { Player player = event.getPlayer(); + + for (Map.Entry entry : instance.getStaffChatManager().getChats().entrySet()) { + String channel = entry.getKey(); + StaffChannel members = entry.getValue(); + if (!members.listMembers().contains(player.getUniqueId())) continue; + + event.setCancelled(true); + for (UUID uuid : members.listMembers()) { + Player p = Bukkit.getPlayer(uuid); + if (p == null) continue; + p.sendMessage(Methods.formatText(channel + " " + player.getDisplayName() + "&" + members.getChatChar() + ": " + event.getMessage())); + } + } + if (!isChatToggled && !player.hasPermission("um.togglechat.bypass")) { event.setCancelled(true); player.sendMessage(instance.getReferences().getPrefix() + Methods.formatText(instance.getLocale().getMessage("command.togglechat.muted"))); diff --git a/src/main/java/com/songoda/ultimatemoderation/staffchat/StaffChannel.java b/src/main/java/com/songoda/ultimatemoderation/staffchat/StaffChannel.java new file mode 100644 index 0000000..8e0b0a8 --- /dev/null +++ b/src/main/java/com/songoda/ultimatemoderation/staffchat/StaffChannel.java @@ -0,0 +1,60 @@ +package com.songoda.ultimatemoderation.staffchat; + +import com.songoda.ultimatemoderation.UltimateModeration; +import com.songoda.ultimatemoderation.utils.Methods; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class StaffChannel { + + private final String channelName; + private char chatChar = 'b'; + private final List members = new ArrayList<>(); + + public StaffChannel(String channelName) { + this.channelName = channelName; + } + + public List listMembers() { + return new ArrayList<>(members); + } + + public void addMember(Player player) { + UltimateModeration.getInstance().getStaffChatManager().getChats().values().stream().forEach(members1 -> { + if (members1.listMembers().contains(player.getUniqueId())) { + members1.removeMember(player); + } + }); + members.add(player.getUniqueId()); + for (UUID uuid : members) { + Player p = Bukkit.getPlayer(uuid); + if (p == null) continue; + p.sendMessage(Methods.formatText(channelName + " " + player.getDisplayName() + "&" + chatChar + " has just entered the channel.")); + } + } + + public void removeMember(Player player) { + members.remove(player.getUniqueId()); + for (UUID uuid : members) { + Player p = Bukkit.getPlayer(uuid); + if (p == null) continue; + p.sendMessage(Methods.formatText(channelName + " " + player.getDisplayName() + "&" + chatChar + " has just left the channel.")); + } + } + + public String getChannelName() { + return channelName; + } + + public char getChatChar() { + return chatChar; + } + + public void setChatChar(char chatChar) { + this.chatChar = chatChar; + } +} diff --git a/src/main/java/com/songoda/ultimatemoderation/staffchat/StaffChatManager.java b/src/main/java/com/songoda/ultimatemoderation/staffchat/StaffChatManager.java new file mode 100644 index 0000000..47a81bf --- /dev/null +++ b/src/main/java/com/songoda/ultimatemoderation/staffchat/StaffChatManager.java @@ -0,0 +1,27 @@ +package com.songoda.ultimatemoderation.staffchat; + +import java.util.*; + +public class StaffChatManager { + + private final Map chats = new HashMap<>(); + + public Map getChats() { + return Collections.unmodifiableMap(chats); + } + + public StaffChannel getChat(String channel) { + return chats.computeIfAbsent(formatName(channel), k -> new StaffChannel(formatName(channel))); + } + + public void removeChat(String channel) { + chats.remove(formatName(channel)); + } + + private String formatName(String name) { + if (name == null) return null; + name = name.toUpperCase().trim(); + name = name.replace(" ", "_"); + return name; + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 30d3c96..318d1f5 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -87,4 +87,9 @@ commands: Ticket: description: Ticket defaullt: false - usage: /ticket \ No newline at end of file + usage: /ticket + StaffChat: + description: StaffChat + defaullt: false + aliases: [sc] + usage: /staffchat \ No newline at end of file