diff --git a/.gitignore b/.gitignore index ef56bf6..6c98f90 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,5 @@ bin/ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* + +/target \ No newline at end of file diff --git a/src/main/java/me/ryandw11/ultrachat/UltraChat.java b/src/main/java/me/ryandw11/ultrachat/UltraChat.java index 2b436d2..b3fbde8 100644 --- a/src/main/java/me/ryandw11/ultrachat/UltraChat.java +++ b/src/main/java/me/ryandw11/ultrachat/UltraChat.java @@ -1,9 +1,18 @@ package me.ryandw11.ultrachat; +import me.ryandw11.ultrachat.commands.ChatCommand; import org.bukkit.plugin.java.JavaPlugin; +import java.util.Objects; + /** * The main class of UltraChat. */ public class UltraChat extends JavaPlugin { + + @Override + public void onEnable() { + Objects.requireNonNull(getCommand("chat")).setExecutor(new ChatCommand(this)); + getLogger().info("UltraChat v" + getDescription().getVersion() + " was successfully enabled."); + } } diff --git a/src/main/java/me/ryandw11/ultrachat/commands/ChatCommand.java b/src/main/java/me/ryandw11/ultrachat/commands/ChatCommand.java new file mode 100644 index 0000000..ffe4456 --- /dev/null +++ b/src/main/java/me/ryandw11/ultrachat/commands/ChatCommand.java @@ -0,0 +1,51 @@ +package me.ryandw11.ultrachat.commands; + +import me.ryandw11.ultrachat.UltraChat; +import me.ryandw11.ultrachat.commands.chat.ClearCommand; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +/** + * The main chat command for the plugin. + */ +public class ChatCommand implements CommandExecutor { + private final UltraChat plugin; + private final CommandHandler commandHandler; + + public ChatCommand(UltraChat plugin) { + this.plugin = plugin; + this.commandHandler = new CommandHandler(); + this.commandHandler.registerCommand(new ClearCommand(), "clear"); + } + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String s, @NotNull String[] args) { + try { + if (args.length != 0) + return commandHandler.handleCommand(sender, cmd, s, args); + } catch (IllegalArgumentException ex) { + // Do nothing as this exception was triggered purposefully. + } + + if (sender.hasPermission("ultrachat.command.help")) { + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', + "&3=============[&2UltraChat&3]=============")); + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&3Created by: &2Ryandw11")); + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', + "&3Version: &2" + plugin.getDescription().getVersion())); + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', + "&3Github wiki:&2 https://github.com/ryandw11/CustomStructures/wiki")); + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&3Commands:")); + + for (SubCommand command : commandHandler.getSubCommands()) { + if (!sender.hasPermission(command.commandPermission())) continue; + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', + command.helpMessage())); + } + } + return false; + } +} diff --git a/src/main/java/me/ryandw11/ultrachat/commands/CommandHandler.java b/src/main/java/me/ryandw11/ultrachat/commands/CommandHandler.java new file mode 100644 index 0000000..b8357ed --- /dev/null +++ b/src/main/java/me/ryandw11/ultrachat/commands/CommandHandler.java @@ -0,0 +1,78 @@ +package me.ryandw11.ultrachat.commands; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * An extremely primitive command handler. + */ +public class CommandHandler { + private final Map, SubCommand> commandMap; + + public CommandHandler() { + commandMap = new HashMap<>(); + } + + /** + * Register a command. + * + * @param s The command to register. + * @param subCommand The sub command. + */ + public void registerCommand(String s, SubCommand subCommand) { + if (commandMap.containsKey(Collections.singletonList(s.toLowerCase()))) + throw new IllegalArgumentException("Command already exists!"); + + commandMap.put(Collections.singletonList(s.toLowerCase()), subCommand); + } + + /** + * Register a command. + * + * @param subCommand The sub command. + * @param args The aliases to register. + */ + public void registerCommand(SubCommand subCommand, String... args) { + List list = new ArrayList<>(Arrays.asList(args)); + list = list.stream().map(String::toLowerCase).collect(Collectors.toList()); + if (commandMap.containsKey(list)) + throw new IllegalArgumentException("Command already exists!"); + + commandMap.put(list, subCommand); + } + + /** + * Handle a command. + * + *

Throws IllegalArgumentException if sub command does not exist.

+ * + * @param sender The command sender. + * @param cmd The command. + * @param s The string. + * @param args The arguments. + * @return If the command is valid. + */ + public boolean handleCommand(CommandSender sender, Command cmd, String s, String[] args) { + if (args.length == 0) + return false; + for (Map.Entry, SubCommand> entry : commandMap.entrySet()) { + if (entry.getKey().contains(args[0].toLowerCase())) { + String[] newArgs = new String[args.length - 1]; + if (newArgs.length > 0) { + System.arraycopy(args, 1, newArgs, 0, newArgs.length); + } + return entry.getValue().subCommand(sender, cmd, s, newArgs); + } + } + throw new IllegalArgumentException("Invalid command"); + } + + public Collection getSubCommands() { + return commandMap.values(); + } + + +} \ No newline at end of file diff --git a/src/main/java/me/ryandw11/ultrachat/commands/SubCommand.java b/src/main/java/me/ryandw11/ultrachat/commands/SubCommand.java new file mode 100644 index 0000000..d0dc0b1 --- /dev/null +++ b/src/main/java/me/ryandw11/ultrachat/commands/SubCommand.java @@ -0,0 +1,30 @@ +package me.ryandw11.ultrachat.commands; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; + +public interface SubCommand { + + /** + * Get the help message for the command. + * @return The help message for the command. + */ + String helpMessage(); + + /** + * The permission for the command. + * @return The permission for the command. + */ + String commandPermission(); + + /** + * The sub command. + * + * @param sender The sender. + * @param cmd The command. + * @param s The command string. + * @param args The arguments. (Does not include the subcommand name. So args.length for `/chat color` is 0.) + * @return If the sub-command is valid. + */ + boolean subCommand(CommandSender sender, Command cmd, String s, String[] args); +} diff --git a/src/main/java/me/ryandw11/ultrachat/commands/chat/ClearCommand.java b/src/main/java/me/ryandw11/ultrachat/commands/chat/ClearCommand.java new file mode 100644 index 0000000..3bded5d --- /dev/null +++ b/src/main/java/me/ryandw11/ultrachat/commands/chat/ClearCommand.java @@ -0,0 +1,49 @@ +package me.ryandw11.ultrachat.commands.chat; + +import me.ryandw11.ultrachat.commands.SubCommand; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +/** + * This is the clear command for UltraChat. + *

/chat clear

+ *

Permission:

+ * + * ultrachat.command.clear + * + */ +public class ClearCommand implements SubCommand { + @Override + public String helpMessage() { + return "&2/chat clear &3- &bClear all messages from the chat."; + } + + @Override + public String commandPermission() { + return "ultrachat.command.clear"; + } + + @Override + public boolean subCommand(CommandSender sender, Command cmd, String s, String[] args) { + if(!sender.hasPermission(commandPermission())) { + sender.sendMessage(ChatColor.RED + "You do not have permission for this command!"); + return true; + } + + for(int i = 0; i < 100; i++) { + for(Player player : Bukkit.getOnlinePlayers()) { + player.sendMessage(" "); + } + } + + Bukkit.getServer().broadcastMessage(String.format("%s%s%s has cleared the chat!", + ChatColor.GOLD, + sender.getName(), + ChatColor.GREEN)); + + return false; + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 7d780a9..8cdbcdf 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,8 +1,12 @@ name: UltraChat version: 3.0.0 -main: me.ryandw11.ultrachat +main: me.ryandw11.ultrachat.UltraChat author: Ryandw11 description: An advanced chat management plugin. depend: [Vault] softdepend: [PlaceholderAPI] -api-version: 1.13 \ No newline at end of file +api-version: 1.13 +commands: + chat: + description: The main command for Ultra Chat. + aliases: [uchat, ultrac, ultrachat] \ No newline at end of file