From 5ff71b4eebdf0effb0327de6396cba466496f773 Mon Sep 17 00:00:00 2001 From: Aust1n46 Date: Mon, 17 Jan 2022 03:26:47 -0600 Subject: [PATCH] Working iteration. --- .settings/.gitignore | 2 - pom.xml | 2 +- .../chat/command/VentureCommandExecutor.java | 140 ++++++++--- ...IgnoreCommandExecutor.java => Ignore.java} | 24 +- ...ssageCommandExecutor.java => Message.java} | 26 +-- src/main/resources/commands.yml | 119 ++++++++++ src/main/resources/plugin.yml | 221 ------------------ 7 files changed, 247 insertions(+), 287 deletions(-) rename src/main/java/mineverse/Aust1n46/chat/command/message/{IgnoreCommandExecutor.java => Ignore.java} (90%) rename src/main/java/mineverse/Aust1n46/chat/command/message/{MessageCommandExecutor.java => Message.java} (95%) create mode 100644 src/main/resources/commands.yml diff --git a/.settings/.gitignore b/.settings/.gitignore index f80ee1c..3b1537c 100644 --- a/.settings/.gitignore +++ b/.settings/.gitignore @@ -1,3 +1 @@ /org.eclipse.jdt.core.prefs -/org.eclipse.core.resources.prefs -/org.eclipse.m2e.core.prefs diff --git a/pom.xml b/pom.xml index 676fbb5..5e888bc 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 mineverse.Aust1n46.chat VentureChat - 3.2.3 + 3.3.0 https://bitbucket.org/Aust1n46/venturechat/src/master https://bitbucket.org/Aust1n46/venturechat/src/master diff --git a/src/main/java/mineverse/Aust1n46/chat/command/VentureCommandExecutor.java b/src/main/java/mineverse/Aust1n46/chat/command/VentureCommandExecutor.java index df735d5..f9d8b99 100644 --- a/src/main/java/mineverse/Aust1n46/chat/command/VentureCommandExecutor.java +++ b/src/main/java/mineverse/Aust1n46/chat/command/VentureCommandExecutor.java @@ -1,13 +1,23 @@ package mineverse.Aust1n46.chat.command; +import java.io.File; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.bukkit.Server; import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.bukkit.command.PluginCommand; +import org.bukkit.command.SimpleCommandMap; import org.bukkit.command.TabExecutor; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.Plugin; import mineverse.Aust1n46.chat.MineverseChat; import mineverse.Aust1n46.chat.command.chat.Broadcast; @@ -38,8 +48,8 @@ import mineverse.Aust1n46.chat.command.chat.Setchannel; import mineverse.Aust1n46.chat.command.chat.Setchannelall; import mineverse.Aust1n46.chat.command.chat.VentureChatGui; import mineverse.Aust1n46.chat.command.chat.Venturechat; -import mineverse.Aust1n46.chat.command.message.IgnoreCommandExecutor; -import mineverse.Aust1n46.chat.command.message.MessageCommandExecutor; +import mineverse.Aust1n46.chat.command.message.Ignore; +import mineverse.Aust1n46.chat.command.message.Message; import mineverse.Aust1n46.chat.command.message.MessageToggle; import mineverse.Aust1n46.chat.command.message.Notifications; import mineverse.Aust1n46.chat.command.message.Reply; @@ -48,18 +58,24 @@ import mineverse.Aust1n46.chat.command.mute.Mute; import mineverse.Aust1n46.chat.command.mute.Muteall; import mineverse.Aust1n46.chat.command.mute.Unmute; import mineverse.Aust1n46.chat.command.mute.Unmuteall; +import mineverse.Aust1n46.chat.utilities.Format; /** * Class that initializes and executes the plugin's commands. */ public class VentureCommandExecutor implements TabExecutor { - private static Map commands = new HashMap(); - private static MineverseChat plugin = MineverseChat.getInstance(); + private static final String VERSION = "3.3.0"; + private static final Map commands = new HashMap<>(); + private static final MineverseChat plugin = MineverseChat.getInstance(); + private static VentureCommandExecutor commandExecutor; + private static Map knownCommands; + private static Constructor pluginCommandConstructor; @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] parameters) { commands.get(command.getName()).execute(sender, command.getName(), parameters); + command.execute(sender, label, parameters); return true; } @@ -67,12 +83,46 @@ public class VentureCommandExecutor implements TabExecutor { public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { return commands.get(command.getName()).onTabComplete(sender, command, label, args); } - + + @SuppressWarnings("unchecked") public static void initialize() { - commandExecutor = new VentureCommandExecutor(); + final Server server = plugin.getServer(); + final File commandsFile = new File(plugin.getDataFolder().getAbsolutePath(), "commands.yml"); + if (!commandsFile.isFile()) { + plugin.saveResource("commands.yml", true); + } + FileConfiguration commandsFileConfiguration = YamlConfiguration.loadConfiguration(commandsFile); + final String fileVersion = commandsFileConfiguration.getString("Version", "null"); + if (!fileVersion.equals(VERSION)) { + server.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Version Change Detected! Saving Old commands.yml and Generating Latest File")); + commandsFile.renameTo(new File(plugin.getDataFolder().getAbsolutePath(), "commands_old_" + fileVersion + ".yml")); + plugin.saveResource("commands.yml", true); + commandsFileConfiguration = YamlConfiguration.loadConfiguration(commandsFile); + } + try { + knownCommands = server.getCommandMap().getKnownCommands(); // Paper :) + } + // Spigot :( + catch (final NoSuchMethodError error) { + try { + final Field commandMapField = server.getClass().getDeclaredField("commandMap"); + commandMapField.setAccessible(true); + final SimpleCommandMap simpleCommandMap = (SimpleCommandMap) commandMapField.get(server); + final Field knownCommandsField = SimpleCommandMap.class.getDeclaredField("knownCommands"); + knownCommandsField.setAccessible(true); + knownCommands = (Map) knownCommandsField.get(simpleCommandMap); + } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + e.printStackTrace(); + } + } + try { + pluginCommandConstructor = PluginCommand.class.getDeclaredConstructor(String.class, Plugin.class); + pluginCommandConstructor.setAccessible(true); + } catch (NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + } commands.put("broadcast", new Broadcast()); commands.put("channel", new Channel()); - commands.put("join", new Channel()); commands.put("channelinfo", new Channelinfo()); commands.put("chatinfo", new Chatinfo()); commands.put("chatreload", new Chatreload()); @@ -102,39 +152,53 @@ public class VentureCommandExecutor implements TabExecutor { commands.put("venturechatgui", new VentureChatGui()); commands.put("messagetoggle", new MessageToggle()); commands.put("bungeetoggle", new BungeeToggle()); - for(String command : commands.keySet()) { + commands.put("mute", new Mute()); + commands.put("muteall", new Muteall()); + commands.put("unmute", new Unmute()); + commands.put("unmuteall", new Unmuteall()); + commands.put("reply", new Reply()); + commands.put("message", new Message()); + commands.put("ignore", new Ignore()); + final ConfigurationSection commandsSection = commandsFileConfiguration.getConfigurationSection("commands"); + for (final String commandLabel : commandsSection.getKeys(false)) { + final ConfigurationSection commandSection = commandsSection.getConfigurationSection(commandLabel); + final boolean isEnabled = commandSection.getBoolean("enabled", true); + if (!isEnabled) { + commands.remove(commandLabel); + } else { + final VentureCommand command = commands.get(commandLabel); + if (command != null) { + final List aliases = commandSection.getStringList("aliases"); + for (final String alias : aliases) { + commands.put(alias, command); + } + commands.put("venturechat:" + commandLabel, command); + } + } + } + commandExecutor = new VentureCommandExecutor(); + // Initial registration is required to ensure commands are recognized by the + // server after enabling every plugin + for (final String command : commands.keySet()) { registerCommand(command, commandExecutor); } - - plugin.getServer().getScheduler().runTaskLater(plugin, () -> { - VentureCommand reply = new Reply(); - commands.put("reply", reply); - commands.put("r", reply); - registerCommand("reply", commandExecutor); - registerCommand("r", commandExecutor); - - commands.put("mute", new Mute()); - commands.put("muteall", new Muteall()); - commands.put("unmute", new Unmute()); - commands.put("unmuteall", new Unmuteall()); - registerCommand("mute", commandExecutor); - registerCommand("muteall", commandExecutor); - registerCommand("unmute", commandExecutor); - registerCommand("unmuteall", commandExecutor); - - MessageCommandExecutor messageCommandExecutor = new MessageCommandExecutor(); - registerCommand("message", messageCommandExecutor); - registerCommand("msg", messageCommandExecutor); - registerCommand("tell", messageCommandExecutor); - registerCommand("whisper", messageCommandExecutor); - - registerCommand("ignore", new IgnoreCommandExecutor()); - }, 0); + // Forcibly re-register enabled VentureChat commands on a delay to ensure they + // have priority + server.getScheduler().runTaskLater(plugin, () -> { + for (final String command : commands.keySet()) { + registerCommand(command, commandExecutor); + } + }, 10); } - - private static void registerCommand(String command, CommandExecutor commandExecutor) { - if(plugin.getCommand(command) != null) { - plugin.getCommand(command).setExecutor(commandExecutor); + + private static void registerCommand(String command, TabExecutor tabExecutor) { + try { + final PluginCommand pluginCommand = pluginCommandConstructor.newInstance(command, plugin); + pluginCommand.setExecutor(tabExecutor); + pluginCommand.setTabCompleter(tabExecutor); + knownCommands.put(command, pluginCommand); + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); } } } diff --git a/src/main/java/mineverse/Aust1n46/chat/command/message/IgnoreCommandExecutor.java b/src/main/java/mineverse/Aust1n46/chat/command/message/Ignore.java similarity index 90% rename from src/main/java/mineverse/Aust1n46/chat/command/message/IgnoreCommandExecutor.java rename to src/main/java/mineverse/Aust1n46/chat/command/message/Ignore.java index ed671c4..38c4e71 100644 --- a/src/main/java/mineverse/Aust1n46/chat/command/message/IgnoreCommandExecutor.java +++ b/src/main/java/mineverse/Aust1n46/chat/command/message/Ignore.java @@ -10,28 +10,28 @@ import java.util.UUID; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; import mineverse.Aust1n46.chat.MineverseChat; import mineverse.Aust1n46.chat.api.MineverseChatAPI; import mineverse.Aust1n46.chat.api.MineverseChatPlayer; +import mineverse.Aust1n46.chat.command.VentureCommand; import mineverse.Aust1n46.chat.localization.LocalizedMessage; -public class IgnoreCommandExecutor implements TabExecutor { +public class Ignore implements VentureCommand { private MineverseChat plugin = MineverseChat.getInstance(); @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public void execute(CommandSender sender, String command, String[] args) { if (!(sender instanceof Player)) { plugin.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); - return true; + return; } MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); if (args.length == 0) { mcp.getPlayer().sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS_IGNORE.toString()); - return true; + return; } if (args[0].equalsIgnoreCase("list")) { String ignoreList = ""; @@ -47,11 +47,11 @@ public class IgnoreCommandExecutor implements TabExecutor { if (ignoreList.length() > 0) { mcp.getPlayer().sendMessage(ignoreList.substring(0, ignoreList.length() - 2)); } - return true; + return; } if (mcp.getName().equalsIgnoreCase(args[0])) { mcp.getPlayer().sendMessage(LocalizedMessage.IGNORE_YOURSELF.toString()); - return true; + return; } if (plugin.getConfig().getBoolean("bungeecordmessaging", true)) { ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); @@ -66,32 +66,32 @@ public class IgnoreCommandExecutor implements TabExecutor { } catch (Exception e) { e.printStackTrace(); } - return true; + return; } MineverseChatPlayer player = MineverseChatAPI.getOnlineMineverseChatPlayer(args[0]); if (player == null) { mcp.getPlayer().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() .replace("{args}", args[0])); - return true; + return; } if (mcp.getIgnores().contains(player.getUUID())) { mcp.getPlayer().sendMessage(LocalizedMessage.IGNORE_PLAYER_OFF.toString() .replace("{player}", player.getName())); mcp.removeIgnore(player.getUUID()); MineverseChat.synchronize(mcp, true); - return true; + return; } if (player.getPlayer().hasPermission("venturechat.ignore.bypass")) { mcp.getPlayer().sendMessage(LocalizedMessage.IGNORE_PLAYER_CANT.toString() .replace("{player}", player.getName())); - return true; + return; } mcp.getPlayer().sendMessage(LocalizedMessage.IGNORE_PLAYER_ON.toString() .replace("{player}", player.getName())); mcp.addIgnore(player.getUUID()); MineverseChat.synchronize(mcp, true); - return true; + return; } @Override diff --git a/src/main/java/mineverse/Aust1n46/chat/command/message/MessageCommandExecutor.java b/src/main/java/mineverse/Aust1n46/chat/command/message/Message.java similarity index 95% rename from src/main/java/mineverse/Aust1n46/chat/command/message/MessageCommandExecutor.java rename to src/main/java/mineverse/Aust1n46/chat/command/message/Message.java index 08cf5e6..531a42a 100644 --- a/src/main/java/mineverse/Aust1n46/chat/command/message/MessageCommandExecutor.java +++ b/src/main/java/mineverse/Aust1n46/chat/command/message/Message.java @@ -8,7 +8,6 @@ import java.util.List; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; @@ -16,52 +15,53 @@ 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.command.VentureCommand; import mineverse.Aust1n46.chat.localization.LocalizedMessage; import mineverse.Aust1n46.chat.utilities.Format; -public class MessageCommandExecutor implements TabExecutor { +public class Message implements VentureCommand { private MineverseChat plugin = MineverseChat.getInstance(); @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public void execute(CommandSender sender, String command, String[] args) { if (!(sender instanceof Player)) { plugin.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); - return true; + return; } MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); if (args.length == 0) { mcp.getPlayer().sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString() - .replace("{command}", "/" + command.getName()) + .replace("{command}", "/" + command) .replace("{args}", "[player] [message]")); - return true; + return; } if (plugin.getConfig().getBoolean("bungeecordmessaging", true)) { - sendBungeeCordMessage(mcp, command.getName(), args); - return true; + sendBungeeCordMessage(mcp, command, args); + return; } MineverseChatPlayer player = MineverseChatAPI.getOnlineMineverseChatPlayer(args[0]); if (player == null) { mcp.getPlayer().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() .replace("{args}", args[0])); - return true; + return; } if (!mcp.getPlayer().canSee(player.getPlayer())) { mcp.getPlayer().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString() .replace("{args}", args[0])); - return true; + return; } if (player.getIgnores().contains(mcp.getUUID())) { mcp.getPlayer().sendMessage(LocalizedMessage.IGNORING_MESSAGE.toString() .replace("{player}", player.getName())); - return true; + return; } if (!player.getMessageToggle()) { mcp.getPlayer().sendMessage(LocalizedMessage.BLOCKING_MESSAGE.toString() .replace("{player}", player.getName())); - return true; + return; } if (args.length >= 2) { @@ -150,7 +150,7 @@ public class MessageCommandExecutor implements TabExecutor { } } } - return true; + return; } @Override diff --git a/src/main/resources/commands.yml b/src/main/resources/commands.yml new file mode 100644 index 0000000..fe06b31 --- /dev/null +++ b/src/main/resources/commands.yml @@ -0,0 +1,119 @@ +Version: 3.3.0 +# Restart server after editing this file!!! +# Restart server after editing this file!!! +# Restart server after editing this file!!! +commands: + message: + aliases: [vmessage,msg,tell,whisper,pm] + enabled: true + ignore: + aliases: [vignore] + enabled: true + reply: + aliases: [vreply,r] + enabled: true + spy: + aliases: [vspy] + enabled: true + mute: + aliases: [mp,vmute] + enabled: true + unmute: + aliases: [ump,vunmute] + enabled: true + muteall: + aliases: [mpa,vmuteall] + enabled: true + unmuteall: + aliases: [umpa,vunmuteall] + enabled: true + channel: + aliases: [ch,vchannel,join] + enabled: true + listen: + aliases: [lis,vlisten] + enabled: true + leave: + aliases: [lev,vleave] + enabled: true + chlist: + aliases: [chl,vchlist] + enabled: true + chwho: + aliases: [chw,vchwho] + enabled: true + setchannel: + aliases: [sc,vsetchannel] + enabled: true + kickchannel: + aliases: [kc,vkickchannel] + enabled: true + kickchannelall: + aliases: [kca,vkickchannelall] + enabled: true + setchannelall: + aliases: [sca,vsetchannelall] + enabled: true + force: + aliases: [for,vforce] + enabled: true + forceall: + aliases: [fora,vforceall] + enabled: true + chatreload: + aliases: [cr,vchatreload] + enabled: true + commandspy: + aliases: [comspy,vcommandspy] + enabled: true + chatinfo: + aliases: [ci,vchatinfo] + enabled: true + channelinfo: + aliases: [chi,vchannelinfo] + enabled: true + venturechat: + aliases: [vc] + enabled: true + me: + aliases: [vme] + enabled: true + filter: + aliases: [fil,vfilter] + enabled: true + broadcast: + aliases: [bc,vbroadcast] + enabled: true + commandblock: + aliases: [cb,vcommandblock] + enabled: true + party: + aliases: [p,chatparty,cp,vparty] + enabled: true + clearchat: + aliases: [cc,vclearchat] + enabled: true + notifications: + aliases: [notify,vnotify] + enabled: true + removemessage: + aliases: [rm,vremovemessage] + enabled: true + rangedspy: + aliases: [rspy,vrangedspy] + enabled: true + venturechatgui: + aliases: [vchatgui] + enabled: true + messagetoggle: + aliases: [mtoggle,vmessagetoggle] + enabled: true + bungeetoggle: + aliases: [btoggle,vbungeetoggle] + enabled: true + config: + aliases: [vconfig] + enabled: false + edit: + aliases: [vedit] + enabled: false diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 583d560..e552819 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -7,224 +7,3 @@ softdepend: [Towny, Factions, EssentialsDiscord] author: Aust1n46 website: https://bitbucket.org/Aust1n46/venturechat/ description: #1 Channels Chat plugin! Spigot + Bungee. Supports PlaceholderAPI + JSON formatting. Moderation GUI! -commands: - mute: - usage: /mute [playername] [channel] - aliases: [mp,vmute] - description: Mutes player in a channel so they cannot talk. - permission-message: You don't have - unmute: - usage: /unmute [playername] [channel] - aliases: [ump,vunmute] - description: Unmutes player in a channel so they can talk again. - permission-message: You don't have - msg: - usage: /msg [playername] [msg] - aliases: [vmsg] - description: Send a message to a player - permission-message: You don't have - tell: - usage: /tell [playername] [msg] - aliases: [vtell] - description: Send a message to a player - permission-message: You don't have - whisper: - usage: /whisper [playername] [msg] - aliases: [vwhisper,w] - description: Send a message to a player - permission-message: You don't have - message: - usage: /message [playername] [msg] - aliases: [vmessage,pm] - description: Send a message to a player - permission-message: You don't have - ignore: - usage: /ignore [playername] or /ignore ? for more information - aliases: [vignore] - description: This allows you to prevent a player from sending you a tell /ignore list to see who you have ignored - permission-message: You don't have - channel: - usage: /channel [channelname] - aliases: [ch,vchannel] - description: Allows players to add the ability to listen to the channel - permission-message: You don't have - leave: - usage: /leave [channelname] - aliases: [lev,vleave] - description: Allows players to leave listening to a channel - permission-message: You don't have - join: - usage: /join [channelname] - aliases: [vjoin] - description: Allows players to join a channel - permission-message: You don't have - chlist: - usage: /chlist - aliases: [chl,vchlist] - description: Allows players to see a listing of available channels - permission-message: You don't have - chwho: - usage: /chwho [channelname] - aliases: [chw,vchwho] - description: Allows players to see a listing of who is listening on a channel - permission-message: You don't have - setchannel: - usage: /setchannel [playername] [channel] - aliases: [sc,vsetchannel] - description: Sets a players channel - permission-message: You don't have - kickchannel: - usage: /kickchannel [playername] [channel] - aliases: [kc,vkickchannel] - description: Kicks a player out of a channel - permission-message: You don't have - muteall: - usage: /muteall [playername] - aliases: [mpa,vmuteall] - description: Mute a player in all channels - permission-message: You don't have - unmuteall: - usage: /unmuteall [playername] - aliases: [umpa,vunmuteall] - description: Unmute a player in all channels - permission-message: You don't have - kickchannelall: - usage: /kickchannelall [playername] - aliases: [kca,vkickchannelall] - description: Kick a player from all channels - permission-message: You don't have - setchannelall: - usage: /setchannelall [playername] - aliases: [sca,vsetchannelall] - description: Set a player into all channels - permission-message: You don't have - force: - usage: /force [playername] [message] - aliases: [for,vforce] - description: Force a player to chat or execute a command - permission-message: You don't have - forceall: - usage: /forceall [message] - aliases: [fora,vforceall] - description: Force all players to chat or execute a command - permission-message: You don't have - listen: - usage: /listen [channel] - aliases: [lis,vlisten] - description: Listen to a channel without setting it as the one your chatting in - permission-message: You don't have - chatreload: - usage: /chatreload - aliases: [cr,vchatreload] - description: Reload the config file - permission-message: You don't have - reply: - usage: /reply [msg] - aliases: [vreply] - description: Reply to a message - permission-message: You don't have - r: - usage: /r [msg] - aliases: [] - description: Reply to a message - permission-message: You don't have - spy: - usage: /spy - aliases: [vspy] - description: Spy on tells - permission-message: You don't have - commandspy: - usage: /commandspy - aliases: [comspy,vcommandspy] - description: Spy on commands - permission-message: You don't have - chatinfo: - usage: /chatinfo - aliases: [ci,vchatinfo] - description: Check a players chat info - permission-message: You don't have - channelinfo: - usage: /channelinfo - aliases: [chi,vchannelinfo] - description: Check a channels info - permission-message: You don't have - venturechat: - usage: /venturechat - aliases: [vc] - description: Check plugin information - permission-message: You don't have - me: - usage: /me - aliases: [vme] - description: Send an emote - permission-message: You don't have - filter: - usage: /filter - aliases: [fil,vfilter] - description: Toggle filter on and off - permission-message: You don't have - broadcast: - usage: /broadcast [msg] - aliases: [bc,vbroadcast] - description: Broadcast a message - permission-message: You don't have - commandblock: - usage: /commandblock [player] [command] - aliases: [cb,vcommandblock] - description: Toggle a player blocked from entering a command - permission-message: You don't have - party: - usage: /party help - aliases: [p,chatparty,cp,vparty] - description: Party commands - permission-message: You don't have - config: - usage: /config help - aliases: [vconfig] - description: Edit commands - permission-message: You don't have - clearchat: - usage: /clearchat - aliases: [cc,vclearchat] - description: Clear every players chat - permission-message: You don't have - notifications: - usage: /notifications - aliases: [notify,vnotify] - description: Toggles your notifications - permission-message: You don't have - removemessage: - usage: /removemessage [hashcode] - aliases: [rm,vremovemessage] - description: Remove a message from the chat - permission-message: You don't have - edit: - usage: / - aliases: [vedit] - description: Edit your last chat message - permission-message: You don't have - rangedspy: - usage: / - aliases: [rspy,vrangedspy] - description: Toggle spying on ranged channels - permission-message: You don't have - buttons: - usage: / - aliases: [vbuttons] - description: Toggle viewing json buttons - permission-message: You don't have - venturechatgui: - usage: / - aliases: [vchatgui] - description: Opens the chat management gui - permission-message: You don't have - messagetoggle: - usage: / - aliases: [mtoggle,vmessagetoggle] - description: Toggle receiving messages - permission-message: You don't have - bungeetoggle: - usage: / - aliases: [btoggle,vbungeetoggle] - description: Toggle receiving BungeeCord chat - permission-message: You don't have \ No newline at end of file