Pushing 2.12.2 changes

This commit is contained in:
Aust1n46 2018-01-19 20:55:00 -05:00
parent d79bb350c3
commit db901ffd6f
8 changed files with 1985 additions and 1975 deletions

View File

@ -8,11 +8,12 @@
<classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/Heroes.jar"/> <classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/Heroes.jar"/>
<classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/MassiveCore.jar"/> <classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/MassiveCore.jar"/>
<classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/PlaceholderAPI.jar"/> <classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/PlaceholderAPI.jar"/>
<classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/ProtocolLib-3.5.0-SNAPSHOT.jar"/>
<classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/spigot-1.8.8.jar"/> <classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/spigot-1.8.8.jar"/>
<classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/spigot-1.9.jar"/> <classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/spigot-1.9.jar"/>
<classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/spigot-1.9-R0.1-SNAPSHOT.jar"/> <classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/spigot-1.9-R0.1-SNAPSHOT.jar"/>
<classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/Towny.jar"/> <classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/Towny.jar"/>
<classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/Vault.jar"/> <classpathentry kind="lib" path="C:/Users/aust1/workspace/VentureChat Dependencies/Vault.jar"/>
<classpathentry kind="lib" path="C:/Users/aust1/Desktop/SSD Backup 12_28_17/Desktop/Mineverse Network/Servers/Hub/plugins/ProtocolLib.jar"/>
<classpathentry kind="lib" path="C:/Users/aust1/Desktop/SSD Backup 12_28_17/Desktop/Mineverse Network/Servers/Hub/spigot-1.12.2.jar"/>
<classpathentry kind="output" path=""/> <classpathentry kind="output" path=""/>
</classpath> </classpath>

View File

@ -1,4 +1,4 @@
name: VentureChat name: VentureChat
main: mineverse.Aust1n46.chat.bungee.MineverseChatBungee main: mineverse.Aust1n46.chat.bungee.MineverseChatBungee
version: 2.12.3 version: 2.12.2
author: Aust1n46 author: Aust1n46

File diff suppressed because it is too large Load Diff

View File

@ -158,15 +158,15 @@ public class MineverseChatBungee extends Plugin implements Listener {
String f = in.readUTF(); String f = in.readUTF();
String c = in.readUTF(); String c = in.readUTF();
String json = in.readUTF(); String json = in.readUTF();
out.writeUTF("Chat");
out.writeUTF(chatchannel);
out.writeUTF(message);
out.writeUTF(playerName);
out.writeUTF(lastMessage);
out.writeUTF(f);
out.writeUTF(c);
out.writeUTF(json);
for(String send : getProxy().getServers().keySet()) { for(String send : getProxy().getServers().keySet()) {
out.writeUTF("Chat");
out.writeUTF(chatchannel);
out.writeUTF(message);
out.writeUTF(playerName);
out.writeUTF(lastMessage);
out.writeUTF(f);
out.writeUTF(c);
out.writeUTF(json);
if(getProxy().getServers().get(send).getPlayers().size() > 0) { if(getProxy().getServers().get(send).getPlayers().size() > 0) {
getProxy().getServers().get(send).sendData("VentureChat", outstream.toByteArray()); getProxy().getServers().get(send).sendData("VentureChat", outstream.toByteArray());
} }
@ -174,9 +174,9 @@ public class MineverseChatBungee extends Plugin implements Listener {
} }
if(subchannel.equals("RemoveMessage")) { if(subchannel.equals("RemoveMessage")) {
String hash = in.readUTF(); String hash = in.readUTF();
out.writeUTF("RemoveMessage");
out.writeUTF(hash);
for(String send : getProxy().getServers().keySet()) { for(String send : getProxy().getServers().keySet()) {
out.writeUTF("RemoveMessage");
out.writeUTF(hash);
if(getProxy().getServers().get(send).getPlayers().size() > 0) { if(getProxy().getServers().get(send).getPlayers().size() > 0) {
getProxy().getServers().get(send).sendData("VentureChat", outstream.toByteArray()); getProxy().getServers().get(send).sendData("VentureChat", outstream.toByteArray());
} }

View File

@ -1,190 +1,194 @@
package mineverse.Aust1n46.chat.command.chat; package mineverse.Aust1n46.chat.command.chat;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import mineverse.Aust1n46.chat.ChatMessage; import mineverse.Aust1n46.chat.ChatMessage;
import mineverse.Aust1n46.chat.MineverseChat; import mineverse.Aust1n46.chat.MineverseChat;
import mineverse.Aust1n46.chat.api.MineverseChatPlayer; import mineverse.Aust1n46.chat.api.MineverseChatPlayer;
import mineverse.Aust1n46.chat.command.MineverseCommand; import mineverse.Aust1n46.chat.command.MineverseCommand;
//import mineverse.Aust1n46.chat.json.JsonButton; //import mineverse.Aust1n46.chat.json.JsonButton;
import mineverse.Aust1n46.chat.utilities.Format; import mineverse.Aust1n46.chat.utilities.Format;
import mineverse.Aust1n46.chat.versions.VersionHandler;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.command.CommandSender;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.wrappers.EnumWrappers.ChatType; import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.wrappers.WrappedChatComponent; import com.comphenix.protocol.wrappers.EnumWrappers.ChatType;
import com.comphenix.protocol.wrappers.WrappedChatComponent;
public class Removemessage extends MineverseCommand {
private PacketContainer emptyLinePacketContainer = createPacketPlayOutChat(WrappedChatComponent.fromJson("{\"extra\":[\" \"],\"text\":\"\"}")); public class Removemessage extends MineverseCommand {
private MineverseChat plugin; private PacketContainer emptyLinePacketContainer = createPacketPlayOutChat(WrappedChatComponent.fromJson("{\"extra\":[\" \"],\"text\":\"\"}"));
private WrappedChatComponent messageDeletedComponentPlayer; private MineverseChat plugin;
private WrappedChatComponent messageDeletedComponentPlayer;
public Removemessage(String name) {
super(name); public Removemessage(String name) {
this.plugin = MineverseChat.getInstance(); super(name);
} this.plugin = MineverseChat.getInstance();
}
@Override
@SuppressWarnings({ "unchecked", "rawtypes" }) @Override
public void execute(CommandSender sender, String command, String[] args) { @SuppressWarnings({ "unchecked", "rawtypes" })
if(args.length == 0) { public void execute(CommandSender sender, String command, String[] args) {
sender.sendMessage(ChatColor.RED + "Invalid command: /removemessage [hashcode]"); if(args.length == 0) {
return; sender.sendMessage(ChatColor.RED + "Invalid command: /removemessage [hashcode]");
} return;
final int hash; }
try { final int hash;
hash = Integer.parseInt(args[0]); try {
} hash = Integer.parseInt(args[0]);
catch(Exception e) { }
sender.sendMessage(ChatColor.RED + "Invalid hashcode."); catch(Exception e) {
return; sender.sendMessage(ChatColor.RED + "Invalid hashcode.");
} return;
if(args.length > 1 && Boolean.parseBoolean(args[1]) && sender instanceof Player) { }
ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); if(args.length > 1 && Boolean.parseBoolean(args[1]) && sender instanceof Player) {
DataOutputStream out = new DataOutputStream(byteOutStream); ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
try { DataOutputStream out = new DataOutputStream(byteOutStream);
out.writeUTF("RemoveMessage"); try {
out.writeUTF(String.valueOf(hash)); out.writeUTF("RemoveMessage");
((Player) sender).sendPluginMessage(plugin, "VentureChat", byteOutStream.toByteArray()); out.writeUTF(String.valueOf(hash));
out.close(); ((Player) sender).sendPluginMessage(plugin, "VentureChat", byteOutStream.toByteArray());
} out.close();
catch(Exception e) { }
e.printStackTrace(); catch(Exception e) {
} e.printStackTrace();
} }
new BukkitRunnable() { return;
public void run() { }
final Map<Player, List<PacketContainer>> packets = new HashMap(); new BukkitRunnable() {
for(MineverseChatPlayer p : MineverseChat.onlinePlayers) { public void run() {
List<ChatMessage> messages = p.getMessages(); final Map<Player, List<PacketContainer>> packets = new HashMap();
List<PacketContainer> playerPackets = new ArrayList(); for(MineverseChatPlayer p : MineverseChat.onlinePlayers) {
boolean resend = false; List<ChatMessage> messages = p.getMessages();
for(int fill = 0; fill < 100 - messages.size(); fill++) { List<PacketContainer> playerPackets = new ArrayList();
playerPackets.add(Removemessage.this.emptyLinePacketContainer); boolean resend = false;
} for(int fill = 0; fill < 100 - messages.size(); fill++) {
for(ChatMessage message : messages) { playerPackets.add(Removemessage.this.emptyLinePacketContainer);
if(message.getHash() == hash) { }
WrappedChatComponent removedComponent = p.getPlayer().hasPermission("venturechat.message.bypass") ? Removemessage.this.getMessageDeletedChatComponentAdmin(message) : Removemessage.this.getMessageDeletedChatComponentPlayer(); for(ChatMessage message : messages) {
message.setComponent(removedComponent); if(message.getHash() == hash) {
message.setHash(-1); WrappedChatComponent removedComponent = p.getPlayer().hasPermission("venturechat.message.bypass") ? Removemessage.this.getMessageDeletedChatComponentAdmin(message) : Removemessage.this.getMessageDeletedChatComponentPlayer();
playerPackets.add(Removemessage.this.createPacketPlayOutChat(removedComponent)); message.setComponent(removedComponent);
resend = true; message.setHash(-1);
continue; playerPackets.add(Removemessage.this.createPacketPlayOutChat(removedComponent));
} resend = true;
if(message.getMessage().contains(ChatColor.stripColor(Format.FormatStringAll(plugin.getConfig().getString("guiicon"))))) { continue;
String submessage = message.getMessage().substring(0, message.getMessage().length() - ChatColor.stripColor(Format.FormatStringAll(plugin.getConfig().getString("guiicon"))).length()); }
if(submessage.hashCode() == hash) { if(message.getMessage().contains(ChatColor.stripColor(Format.FormatStringAll(plugin.getConfig().getString("guiicon"))))) {
WrappedChatComponent removedComponent = p.getPlayer().hasPermission("venturechat.message.bypass") ? Removemessage.this.getMessageDeletedChatComponentAdmin(message) : Removemessage.this.getMessageDeletedChatComponentPlayer(); String submessage = message.getMessage().substring(0, message.getMessage().length() - ChatColor.stripColor(Format.FormatStringAll(plugin.getConfig().getString("guiicon"))).length());
message.setComponent(removedComponent); if(submessage.hashCode() == hash) {
message.setHash(-1); WrappedChatComponent removedComponent = p.getPlayer().hasPermission("venturechat.message.bypass") ? Removemessage.this.getMessageDeletedChatComponentAdmin(message) : Removemessage.this.getMessageDeletedChatComponentPlayer();
playerPackets.add(Removemessage.this.createPacketPlayOutChat(removedComponent)); message.setComponent(removedComponent);
resend = true; message.setHash(-1);
continue; playerPackets.add(Removemessage.this.createPacketPlayOutChat(removedComponent));
} resend = true;
} continue;
/*if(message.getMessage().contains(Format.FormatStringAll(plugin.getConfig().getString("messageremovericon")))) { }
String submessage = message.getMessage().substring(0, message.getMessage().length() - plugin.getConfig().getString("messageremovericon").length() - 1).replaceAll("(§([a-z0-9]))", ""); }
if(submessage.hashCode() == hash) { /*if(message.getMessage().contains(Format.FormatStringAll(plugin.getConfig().getString("messageremovericon")))) {
WrappedChatComponent removedComponent = p.getPlayer().hasPermission("venturechat.message.bypass") ? Removemessage.this.getMessageDeletedChatComponentAdmin(message) : Removemessage.this.getMessageDeletedChatComponentPlayer(); String submessage = message.getMessage().substring(0, message.getMessage().length() - plugin.getConfig().getString("messageremovericon").length() - 1).replaceAll("(§([a-z0-9]))", "");
message.setComponent(removedComponent); if(submessage.hashCode() == hash) {
message.setHash(-1); WrappedChatComponent removedComponent = p.getPlayer().hasPermission("venturechat.message.bypass") ? Removemessage.this.getMessageDeletedChatComponentAdmin(message) : Removemessage.this.getMessageDeletedChatComponentPlayer();
playerPackets.add(Removemessage.this.createPacketPlayOutChat(removedComponent)); message.setComponent(removedComponent);
resend = true; message.setHash(-1);
continue; playerPackets.add(Removemessage.this.createPacketPlayOutChat(removedComponent));
} resend = true;
int cut = 0; continue;
for(JsonButton b : MineverseChat.jbInfo.getJsonButtons()) { }
if(b.hasPermission() && p.getPlayer().hasPermission(b.getPermission())) { int cut = 0;
cut += b.getIcon().length() - 1; for(JsonButton b : MineverseChat.jbInfo.getJsonButtons()) {
} if(b.hasPermission() && p.getPlayer().hasPermission(b.getPermission())) {
} cut += b.getIcon().length() - 1;
submessage = submessage.substring(0, submessage.length() - cut).replaceAll("(§([a-z0-9]))", ""); }
//System.out.println(submessage + " submess"); }
if(submessage.hashCode() == hash) { submessage = submessage.substring(0, submessage.length() - cut).replaceAll("(§([a-z0-9]))", "");
WrappedChatComponent removedComponent = p.getPlayer().hasPermission("venturechat.message.bypass") ? Removemessage.this.getMessageDeletedChatComponentAdmin(message) : Removemessage.this.getMessageDeletedChatComponentPlayer(); //System.out.println(submessage + " submess");
message.setComponent(removedComponent); if(submessage.hashCode() == hash) {
message.setHash(-1); WrappedChatComponent removedComponent = p.getPlayer().hasPermission("venturechat.message.bypass") ? Removemessage.this.getMessageDeletedChatComponentAdmin(message) : Removemessage.this.getMessageDeletedChatComponentPlayer();
playerPackets.add(Removemessage.this.createPacketPlayOutChat(removedComponent)); message.setComponent(removedComponent);
resend = true; message.setHash(-1);
continue; playerPackets.add(Removemessage.this.createPacketPlayOutChat(removedComponent));
} resend = true;
} continue;
int cut = 0; }
for(JsonButton b : MineverseChat.jbInfo.getJsonButtons()) { }
if(b.hasPermission() && p.getPlayer().hasPermission(b.getPermission()) && message.getMessage().contains(b.getIcon())) { int cut = 0;
cut += b.getIcon().length() - 1; for(JsonButton b : MineverseChat.jbInfo.getJsonButtons()) {
} if(b.hasPermission() && p.getPlayer().hasPermission(b.getPermission()) && message.getMessage().contains(b.getIcon())) {
} cut += b.getIcon().length() - 1;
String submessage = message.getMessage().replaceAll("(§([a-z0-9]))", ""); }
//System.out.println(submessage + " " + submessage.length()); }
submessage = submessage.substring(0, submessage.length() - cut); String submessage = message.getMessage().replaceAll("(§([a-z0-9]))", "");
//System.out.println(submessage); //System.out.println(submessage + " " + submessage.length());
if(submessage.hashCode() == hash) { submessage = submessage.substring(0, submessage.length() - cut);
WrappedChatComponent removedComponent = p.getPlayer().hasPermission("venturechat.message.bypass") ? Removemessage.this.getMessageDeletedChatComponentAdmin(message) : Removemessage.this.getMessageDeletedChatComponentPlayer(); //System.out.println(submessage);
message.setComponent(removedComponent); if(submessage.hashCode() == hash) {
message.setHash(-1); WrappedChatComponent removedComponent = p.getPlayer().hasPermission("venturechat.message.bypass") ? Removemessage.this.getMessageDeletedChatComponentAdmin(message) : Removemessage.this.getMessageDeletedChatComponentPlayer();
playerPackets.add(Removemessage.this.createPacketPlayOutChat(removedComponent)); message.setComponent(removedComponent);
resend = true; message.setHash(-1);
continue; playerPackets.add(Removemessage.this.createPacketPlayOutChat(removedComponent));
}*/ resend = true;
playerPackets.add(Removemessage.this.createPacketPlayOutChat(message.getComponent())); continue;
} }*/
if(resend) { playerPackets.add(Removemessage.this.createPacketPlayOutChat(message.getComponent()));
packets.put(p.getPlayer(), playerPackets); }
} if(resend) {
} packets.put(p.getPlayer(), playerPackets);
new BukkitRunnable() { }
public void run() { }
for(Player p : packets.keySet()) { new BukkitRunnable() {
List<PacketContainer> pPackets = packets.get(p); public void run() {
for(PacketContainer c : pPackets) { for(Player p : packets.keySet()) {
Removemessage.this.sendPacketPlayOutChat(p, c); List<PacketContainer> pPackets = packets.get(p);
} for(PacketContainer c : pPackets) {
} Removemessage.this.sendPacketPlayOutChat(p, c);
} }
}.runTask(plugin); }
} }
}.runTaskAsynchronously(plugin); }.runTask(plugin);
} }
}.runTaskAsynchronously(plugin);
private PacketContainer createPacketPlayOutChat(WrappedChatComponent component) { }
PacketContainer container = new PacketContainer(PacketType.Play.Server.CHAT);
container.getChatComponents().write(0, component); private PacketContainer createPacketPlayOutChat(WrappedChatComponent component) {
container.getChatTypes().write(0, ChatType.CHAT); PacketContainer container = new PacketContainer(PacketType.Play.Server.CHAT);
return container; container.getChatComponents().write(0, component);
} if(!VersionHandler.is1_7_10() && !VersionHandler.is1_8() && !VersionHandler.is1_9() && !VersionHandler.is1_10() && !VersionHandler.is1_11()) {
container.getChatTypes().write(0, ChatType.CHAT);
private void sendPacketPlayOutChat(Player player, PacketContainer packet) { }
try { return container;
plugin.protocolManager.sendServerPacket(player, packet); }
}
catch(Exception e) { private void sendPacketPlayOutChat(Player player, PacketContainer packet) {
e.printStackTrace(); try {
} plugin.protocolManager.sendServerPacket(player, packet);
} }
catch(Exception e) {
public WrappedChatComponent getMessageDeletedChatComponentPlayer() { e.printStackTrace();
if(this.messageDeletedComponentPlayer == null) { }
this.messageDeletedComponentPlayer = WrappedChatComponent.fromJson("{\"text\":\"\",\"extra\":[{\"text\":\"<message removed>\",\"color\":\"red\",\"italic\":\"true\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"" + Format.FormatStringAll(plugin.getConfig().getString("messageremoverpermissions")) + "\"}]}}}]}"); }
}
return this.messageDeletedComponentPlayer; public WrappedChatComponent getMessageDeletedChatComponentPlayer() {
} if(this.messageDeletedComponentPlayer == null) {
this.messageDeletedComponentPlayer = WrappedChatComponent.fromJson("{\"text\":\"\",\"extra\":[{\"text\":\"<message removed>\",\"color\":\"red\",\"italic\":\"true\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"" + Format.FormatStringAll(plugin.getConfig().getString("messageremoverpermissions")) + "\"}]}}}]}");
public WrappedChatComponent getMessageDeletedChatComponentAdmin(ChatMessage message) { }
String oMessage = message.getOriginalComponent().getJson().substring(1, message.getOriginalComponent().getJson().length() - 11); return this.messageDeletedComponentPlayer;
if(message.getMessage().contains(ChatColor.stripColor(Format.FormatStringAll(plugin.getConfig().getString("guiicon"))))) { }
oMessage = oMessage.substring(0, oMessage.length() - ChatColor.stripColor(Format.FormatStringAll(plugin.getConfig().getString("guiicon"))).length() - 3) + "\"}]";
} public WrappedChatComponent getMessageDeletedChatComponentAdmin(ChatMessage message) {
return WrappedChatComponent.fromJson(Format.FormatStringAll("{\"text\":\"\",\"extra\":[{\"text\":\"&c&o<message removed>\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"&7Message: \"," + oMessage + "}}}]}")); String oMessage = message.getOriginalComponent().getJson().substring(1, message.getOriginalComponent().getJson().length() - 11);
} if(message.getMessage().contains(ChatColor.stripColor(Format.FormatStringAll(plugin.getConfig().getString("guiicon"))))) {
oMessage = oMessage.substring(0, oMessage.length() - ChatColor.stripColor(Format.FormatStringAll(plugin.getConfig().getString("guiicon"))).length() - 3) + "\"}]";
}
return WrappedChatComponent.fromJson(Format.FormatStringAll("{\"text\":\"\",\"extra\":[{\"text\":\"&c&o<message removed>\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"&7Message: \"," + oMessage + "}}}]}"));
}
} }

View File

@ -66,7 +66,7 @@ public class VentureChatGui extends MineverseCommand {
Set<String> blockedCommands = new HashSet<String>(); Set<String> blockedCommands = new HashSet<String>();
List<String> mail = new ArrayList<String>(); List<String> mail = new ArrayList<String>();
String jsonFormat = "Default"; String jsonFormat = "Default";
target = new MineverseChatPlayer(uuid, name, current, ignores, listening, mutes, blockedCommands, mail, false, null, true, true, name, jsonFormat, false, false, false, true, true, true); target = new MineverseChatPlayer(uuid, name, current, ignores, listening, mutes, blockedCommands, mail, false, null, true, true, name, jsonFormat, false, false, false, true, true);
MineverseChat.players.add(target); MineverseChat.players.add(target);
} }
if(MineverseChat.ccInfo.isChannel(args[1])) { if(MineverseChat.ccInfo.isChannel(args[1])) {

View File

@ -1,152 +1,152 @@
package mineverse.Aust1n46.chat.listeners; package mineverse.Aust1n46.chat.listeners;
import java.util.Iterator; import java.util.Iterator;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.json.simple.JSONValue; import org.json.simple.JSONValue;
import mineverse.Aust1n46.chat.ChatMessage; import mineverse.Aust1n46.chat.ChatMessage;
import mineverse.Aust1n46.chat.MineverseChat; import mineverse.Aust1n46.chat.MineverseChat;
import mineverse.Aust1n46.chat.api.MineverseChatAPI; import mineverse.Aust1n46.chat.api.MineverseChatAPI;
import mineverse.Aust1n46.chat.api.MineverseChatPlayer; import mineverse.Aust1n46.chat.api.MineverseChatPlayer;
import mineverse.Aust1n46.chat.utilities.Format; import mineverse.Aust1n46.chat.utilities.Format;
import mineverse.Aust1n46.chat.versions.VersionHandler; import mineverse.Aust1n46.chat.versions.VersionHandler;
import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.chat.ComponentSerializer; import net.md_5.bungee.chat.ComponentSerializer;
import com.comphenix.protocol.PacketType; import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.reflect.StructureModifier; import com.comphenix.protocol.reflect.StructureModifier;
import com.comphenix.protocol.wrappers.WrappedChatComponent; import com.comphenix.protocol.wrappers.WrappedChatComponent;
import me.clip.placeholderapi.PlaceholderAPI; import me.clip.placeholderapi.PlaceholderAPI;
//This class listens for chat packets and intercepts them before they are sent to the Player. //This class listens for chat packets and intercepts them before they are sent to the Player.
//The packets are modified to include advanced json formating and the message remover button if the //The packets are modified to include advanced json formating and the message remover button if the
//player has permission to remove messages. //player has permission to remove messages.
public class PacketListener extends PacketAdapter { public class PacketListener extends PacketAdapter {
public PacketListener(MineverseChat plugin) { public PacketListener(MineverseChat plugin) {
super(plugin, ListenerPriority.MONITOR, new PacketType[] { PacketType.Play.Server.CHAT }); super(plugin, ListenerPriority.MONITOR, new PacketType[] { PacketType.Play.Server.CHAT });
this.plugin = plugin; this.plugin = plugin;
} }
@Override @Override
public void onPacketSending(PacketEvent event) { public void onPacketSending(PacketEvent event) {
if(event.isCancelled() || event.getPacketType() != PacketType.Play.Server.CHAT) { if(event.isCancelled() || event.getPacketType() != PacketType.Play.Server.CHAT) {
return; return;
} }
StructureModifier<WrappedChatComponent> chatP = event.getPacket().getChatComponents(); StructureModifier<WrappedChatComponent> chatP = event.getPacket().getChatComponents();
WrappedChatComponent c = chatP.read(0); WrappedChatComponent c = chatP.read(0);
if (c == null) { if (c == null) {
StructureModifier<BaseComponent[]> modifier = event.getPacket().getSpecificModifier(BaseComponent[].class); StructureModifier<BaseComponent[]> modifier = event.getPacket().getSpecificModifier(BaseComponent[].class);
BaseComponent[] components = modifier.readSafely(0); BaseComponent[] components = modifier.readSafely(0);
if (components == null) { if (components == null) {
return; return;
} }
String msg = ComponentSerializer.toString(components); String msg = ComponentSerializer.toString(components);
if (msg == null) { if (msg == null) {
return; return;
} }
if (!PlaceholderAPI.getBracketPlaceholderPattern().matcher(msg).find()) { if (!PlaceholderAPI.getBracketPlaceholderPattern().matcher(msg).find()) {
return; return;
} }
msg = PlaceholderAPI.setBracketPlaceholders(event.getPlayer(), msg); msg = PlaceholderAPI.setBracketPlaceholders(event.getPlayer(), msg);
modifier.write(0, ComponentSerializer.parse(msg)); modifier.write(0, ComponentSerializer.parse(msg));
return; return;
} }
String msg = c.getJson(); String msg = c.getJson();
if (msg == null) { if (msg == null) {
return; return;
} }
if (!PlaceholderAPI.getBracketPlaceholderPattern().matcher(msg).find()) { if (!PlaceholderAPI.getBracketPlaceholderPattern().matcher(msg).find()) {
return; return;
} }
msg = PlaceholderAPI.setBracketPlaceholders(event.getPlayer(), msg); msg = PlaceholderAPI.setBracketPlaceholders(event.getPlayer(), msg);
chatP.write(0, WrappedChatComponent.fromJson(msg)); chatP.write(0, WrappedChatComponent.fromJson(msg));
try { try {
if(VersionHandler.is1_7_10() || VersionHandler.is1_7_9() || VersionHandler.is1_7_2()) { if(VersionHandler.is1_7_10() || VersionHandler.is1_7_9() || VersionHandler.is1_7_2()) {
if((MineverseChat.posField != null) && !(((boolean) MineverseChat.posField.get(event.getPacket().getHandle())))) { if((MineverseChat.posField != null) && !(((boolean) MineverseChat.posField.get(event.getPacket().getHandle())))) {
return; return;
} }
} }
else if(VersionHandler.is1_8()) { else if(VersionHandler.is1_8()) {
if((MineverseChat.posField != null) && (((Byte) MineverseChat.posField.get(event.getPacket().getHandle())).intValue() > 1)) { if((MineverseChat.posField != null) && (((Byte) MineverseChat.posField.get(event.getPacket().getHandle())).intValue() > 1)) {
return; return;
} }
} }
else if(VersionHandler.is1_9() || VersionHandler.is1_10() || VersionHandler.is1_11()){ else if(VersionHandler.is1_9() || VersionHandler.is1_10() || VersionHandler.is1_11()){
if((MineverseChat.posField != null) && (((Byte) MineverseChat.posField.get(event.getPacket().getHandle())).intValue() > 1)) { if((MineverseChat.posField != null) && (((Byte) MineverseChat.posField.get(event.getPacket().getHandle())).intValue() > 1)) {
return; return;
} }
} }
else { else {
if((MineverseChat.posField != null) && ((Object) MineverseChat.posField.get(event.getPacket().getHandle())) == MineverseChat.chatMessageType.getEnumConstants()[2]) { if((MineverseChat.posField != null) && ((Object) MineverseChat.posField.get(event.getPacket().getHandle())) == MineverseChat.chatMessageType.getEnumConstants()[2]) {
return; return;
} }
} }
} }
catch(IllegalArgumentException | IllegalAccessException e) { catch(IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace(); e.printStackTrace();
} }
WrappedChatComponent chat = (WrappedChatComponent) event.getPacket().getChatComponents().read(0); WrappedChatComponent chat = (WrappedChatComponent) event.getPacket().getChatComponents().read(0);
WrappedChatComponent originalChat = (WrappedChatComponent) event.getPacket().getChatComponents().read(0); WrappedChatComponent originalChat = (WrappedChatComponent) event.getPacket().getChatComponents().read(0);
String message = null; String message = null;
int hash = -1; int hash = -1;
try { try {
//System.out.println(chat.getJson()); //System.out.println(chat.getJson());
//message = TextComponent.toPlainText(new TextComponent(chat.getJson())); //message = TextComponent.toPlainText(new TextComponent(chat.getJson()));
message = (String) MineverseChat.messageMethod.invoke(chat.getHandle(), new Object[0]); message = (String) MineverseChat.messageMethod.invoke(chat.getHandle(), new Object[0]);
//System.out.println(MineverseChat.lastChatMessage.getMessage()); //System.out.println(MineverseChat.lastChatMessage.getMessage());
hash = message != null ? message.hashCode() : -1; hash = message != null ? message.hashCode() : -1;
} }
catch(Exception ex) { catch(Exception ex) {
message = TextComponent.toPlainText(new TextComponent(chat.getJson())); message = TextComponent.toPlainText(new TextComponent(chat.getJson()));
System.out.println(message); System.out.println(message);
//ex.printStackTrace(); //ex.printStackTrace();
} }
ChatMessage lastChatMessage = MineverseChat.lastChatMessage; ChatMessage lastChatMessage = MineverseChat.lastChatMessage;
MineverseChatPlayer mcp = MineverseChatAPI.getMineverseChatPlayer(event.getPlayer()); MineverseChatPlayer mcp = MineverseChatAPI.getMineverseChatPlayer(event.getPlayer());
if(lastChatMessage != null && lastChatMessage.getHash() == hash) { if(lastChatMessage != null && lastChatMessage.getHash() == hash) {
String json = MineverseChat.lastJson; String json = MineverseChat.lastJson;
/*if(mcp.getPlayer().hasPermission("venturechat.message.remove")) { /*if(mcp.getPlayer().hasPermission("venturechat.message.remove")) {
json = json.substring(0, json.length() - 1); json = json.substring(0, json.length() - 1);
json += ",{\"text\":\" " + Format.FormatStringAll(plugin.getConfig().getString("messageremovericon")) + "\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/removemessage " + lastChatMessage.getHash() + " true" +"\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"" + Format.FormatStringAll(plugin.getConfig().getString("messageremovertext")) + "\"}}}]"; json += ",{\"text\":\" " + Format.FormatStringAll(plugin.getConfig().getString("messageremovericon")) + "\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/removemessage " + lastChatMessage.getHash() + " true" +"\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"" + Format.FormatStringAll(plugin.getConfig().getString("messageremovertext")) + "\"}}}]";
} }
if(!mcp.getButtons()) { if(!mcp.getButtons()) {
for(JsonButton j : MineverseChat.jbInfo.getJsonButtons()) { for(JsonButton j : MineverseChat.jbInfo.getJsonButtons()) {
if(j.hasPermission() && mcp.getPlayer().hasPermission(j.getPermission())) { if(j.hasPermission() && mcp.getPlayer().hasPermission(j.getPermission())) {
json = json.substring(0, json.length() - 1); json = json.substring(0, json.length() - 1);
json += ",{\"text\":\" " + Format.FormatStringAll(j.getIcon()) + "\",\"clickEvent\":{\"action\":\"" + j.getAction() + "\",\"value\":\"/" + j.getCommand().replace("{channel}", lastChatMessage.getChannel()).replace("{player}", lastChatMessage.getSender()) + "\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"" + Format.FormatStringAll(j.getText()) + "\"}}}]"; json += ",{\"text\":\" " + Format.FormatStringAll(j.getIcon()) + "\",\"clickEvent\":{\"action\":\"" + j.getAction() + "\",\"value\":\"/" + j.getCommand().replace("{channel}", lastChatMessage.getChannel()).replace("{player}", lastChatMessage.getSender()) + "\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"" + Format.FormatStringAll(j.getText()) + "\"}}}]";
} }
} }
}*/ }*/
if(mcp.getPlayer().hasPermission("venturechat.gui")) { if(mcp.getPlayer().hasPermission("venturechat.gui")) {
json = json.substring(0, json.length() - 1); json = json.substring(0, json.length() - 1);
json += "," + Format.convertToJsonColors(Format.FormatStringAll(plugin.getConfig().getString("guiicon")), ",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/vchatgui " + lastChatMessage.getSender() + " " + lastChatMessage.getChannel() + " " + lastChatMessage.getHash() +"\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[" + Format.convertToJsonColors(Format.FormatStringAll(plugin.getConfig().getString("guitext"))) + "]}}") + "]}]"; json += "," + Format.convertToJsonColors(Format.FormatStringAll(plugin.getConfig().getString("guiicon")), ",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/vchatgui " + lastChatMessage.getSender() + " " + lastChatMessage.getChannel() + " " + lastChatMessage.getHash() +"\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[" + Format.convertToJsonColors(Format.FormatStringAll(plugin.getConfig().getString("guitext"))) + "]}}") + "]}]";
} }
//System.out.println(json); //System.out.println(json);
chat.setJson(json); chat.setJson(json);
event.getPacket().getChatComponents().write(0, chat); event.getPacket().getChatComponents().write(0, chat);
} }
if((message != null) && (chat.getHandle() != null) && mcp != null) { if((message != null) && (chat.getHandle() != null) && mcp != null) {
mcp.addMessage(new ChatMessage(originalChat, chat, lastChatMessage != null ? lastChatMessage.getSender() : null, message, hash)); mcp.addMessage(new ChatMessage(originalChat, chat, lastChatMessage != null ? lastChatMessage.getSender() : null, message, hash));
} }
} }
@SuppressWarnings("unused") @SuppressWarnings("unused")
private String getMessage(String json) { private String getMessage(String json) {
JSONArray components = (JSONArray) ((JSONObject) JSONValue.parse(json)).get("extra"); JSONArray components = (JSONArray) ((JSONObject) JSONValue.parse(json)).get("extra");
Iterator<?> iterator = components.iterator(); Iterator<?> iterator = components.iterator();
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
while(iterator.hasNext()) { while(iterator.hasNext()) {
builder.append(((JSONObject) iterator.next()).get("text").toString()); builder.append(((JSONObject) iterator.next()).get("text").toString());
} }
return builder.toString(); return builder.toString();
} }
} }

View File

@ -1,227 +1,227 @@
name: VentureChat name: VentureChat
version: 2.12.0 version: 2.12.2
main: mineverse.Aust1n46.chat.MineverseChat main: mineverse.Aust1n46.chat.MineverseChat
depend: [Vault, ProtocolLib, PlaceholderAPI] depend: [Vault, ProtocolLib, PlaceholderAPI]
softdepend: [Towny, Factions, Heroes] softdepend: [Towny, Factions, Heroes]
Author: Aust1n46 Author: Aust1n46
description: Chat with channels with many features! description: Chat with channels with many features!
commands: commands:
mute: mute:
usage: /mute [playername] [channel] usage: /mute [playername] [channel]
aliases: [mp,vmute] aliases: [mp,vmute]
description: Mutes player in a channel so they cannot talk. description: Mutes player in a channel so they cannot talk.
permission-message: You don't have <permission> permission-message: You don't have <permission>
unmute: unmute:
usage: /unmute [playername] [channel] usage: /unmute [playername] [channel]
aliases: [ump,vunmute] aliases: [ump,vunmute]
description: Unmutes player in a channel so they can talk again. description: Unmutes player in a channel so they can talk again.
permission-message: You don't have <permission> permission-message: You don't have <permission>
tell: tell:
usage: /tell [playername] [msg] usage: /tell [playername] [msg]
aliases: [vtell] aliases: [vtell]
description: Send a message to a player description: Send a message to a player
permission-message: You don't have <permission> permission-message: You don't have <permission>
ignore: ignore:
usage: /ignore [playername] or /ignore ? for more information usage: /ignore [playername] or /ignore ? for more information
aliases: [vignore] aliases: [vignore]
description: This allows you to prevent a player from sending you a tell /ignore list to see who you have ignored 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 <permission> permission-message: You don't have <permission>
whisper: whisper:
usage: /whisper [playername] [msg] usage: /whisper [playername] [msg]
aliases: [w,vwhisper] aliases: [w,vwhisper]
description: Send a message to a player description: Send a message to a player
permission-message: You don't have <permission> permission-message: You don't have <permission>
channel: channel:
usage: /channel [channelname] usage: /channel [channelname]
aliases: [ch,vchannel] aliases: [ch,vchannel]
description: Allows players to add the ability to listen to the channel description: Allows players to add the ability to listen to the channel
permission-message: You don't have <permission> permission-message: You don't have <permission>
leave: leave:
usage: /leave [channelname] usage: /leave [channelname]
aliases: [lev,vleave] aliases: [lev,vleave]
description: Allows players to leave listening to a channel description: Allows players to leave listening to a channel
permission-message: You don't have <permission> permission-message: You don't have <permission>
join: join:
usage: /join [channelname] usage: /join [channelname]
aliases: [vjoin] aliases: [vjoin]
description: Allows players to join a channel description: Allows players to join a channel
permission-message: You don't have <permission> permission-message: You don't have <permission>
chlist: chlist:
usage: /chlist usage: /chlist
aliases: [chl,vchlist] aliases: [chl,vchlist]
description: Allows players to see a listing of available channels description: Allows players to see a listing of available channels
permission-message: You don't have <permission> permission-message: You don't have <permission>
chwho: chwho:
usage: /chwho [channelname] usage: /chwho [channelname]
aliases: [chw,vchwho] aliases: [chw,vchwho]
description: Allows players to see a listing of who is listening on a channel description: Allows players to see a listing of who is listening on a channel
permission-message: You don't have <permission> permission-message: You don't have <permission>
setchannel: setchannel:
usage: /setchannel [playername] [channel] usage: /setchannel [playername] [channel]
aliases: [sc,vsetchannel] aliases: [sc,vsetchannel]
description: Sets a players channel description: Sets a players channel
permission-message: You don't have <permission> permission-message: You don't have <permission>
kickchannel: kickchannel:
usage: /kickchannel [playername] [channel] usage: /kickchannel [playername] [channel]
aliases: [kc,vkickchannel] aliases: [kc,vkickchannel]
description: Kicks a player out of a channel description: Kicks a player out of a channel
permission-message: You don't have <permission> permission-message: You don't have <permission>
message: message:
usage: /message [playername] [msg] usage: /message [playername] [msg]
aliases: [msg,pm,vmessage] aliases: [msg,pm,vmessage]
description: Send a message to a player description: Send a message to a player
muteall: muteall:
usage: /muteall [playername] usage: /muteall [playername]
aliases: [mpa,vmuteall] aliases: [mpa,vmuteall]
description: Mute a player in all channels description: Mute a player in all channels
permission-message: You don't have <permission> permission-message: You don't have <permission>
unmuteall: unmuteall:
usage: /unmuteall [playername] usage: /unmuteall [playername]
aliases: [umpa,vunmuteall] aliases: [umpa,vunmuteall]
description: Unmute a player in all channels description: Unmute a player in all channels
permission-message: You don't have <permission> permission-message: You don't have <permission>
kickchannelall: kickchannelall:
usage: /kickchannelall [playername] usage: /kickchannelall [playername]
aliases: [kca,vkickchannelall] aliases: [kca,vkickchannelall]
description: Kick a player from all channels description: Kick a player from all channels
permission-message: You don't have <permission> permission-message: You don't have <permission>
setchannelall: setchannelall:
usage: /setchannelall [playername] usage: /setchannelall [playername]
aliases: [sca,vsetchannelall] aliases: [sca,vsetchannelall]
description: Set a player into all channels description: Set a player into all channels
permission-message: You don't have <permission> permission-message: You don't have <permission>
force: force:
usage: /force [playername] [message] usage: /force [playername] [message]
aliases: [for,vforce] aliases: [for,vforce]
description: Force a player to chat or execute a command description: Force a player to chat or execute a command
permission-message: You don't have <permission> permission-message: You don't have <permission>
forceall: forceall:
usage: /forceall [message] usage: /forceall [message]
aliases: [fora,vforceall] aliases: [fora,vforceall]
description: Force all players to chat or execute a command description: Force all players to chat or execute a command
permission-message: You don't have <permission> permission-message: You don't have <permission>
listen: listen:
usage: /listen [channel] usage: /listen [channel]
aliases: [lis,vlisten] aliases: [lis,vlisten]
description: Listen to a channel without setting it as the one your chatting in description: Listen to a channel without setting it as the one your chatting in
permission-message: You don't have <permission> permission-message: You don't have <permission>
chatreload: chatreload:
usage: /chatreload usage: /chatreload
aliases: [cr,vchatreload] aliases: [cr,vchatreload]
description: Reload the config file description: Reload the config file
permission-message: You don't have <permission> permission-message: You don't have <permission>
afk: afk:
usage: /afk usage: /afk
aliases: [vafk] aliases: [vafk]
description: Set yourself as afk description: Set yourself as afk
permission-message: You don't have <permission> permission-message: You don't have <permission>
reply: reply:
usage: /reply [msg] usage: /reply [msg]
aliases: [r,vreply] aliases: [r,vreply]
description: Reply to a message description: Reply to a message
permission-message: You don't have <permission> permission-message: You don't have <permission>
spy: spy:
usage: /spy usage: /spy
aliases: [vspy] aliases: [vspy]
description: Spy on tells description: Spy on tells
permission-message: You don't have <permission> permission-message: You don't have <permission>
commandspy: commandspy:
usage: /commandspy usage: /commandspy
aliases: [comspy,vcommandspy] aliases: [comspy,vcommandspy]
description: Spy on commands description: Spy on commands
permission-message: You don't have <permission> permission-message: You don't have <permission>
chatinfo: chatinfo:
usage: /chatinfo usage: /chatinfo
aliases: [ci,vchatinfo] aliases: [ci,vchatinfo]
description: Check a players chat info description: Check a players chat info
permission-message: You don't have <permission> permission-message: You don't have <permission>
channelinfo: channelinfo:
usage: /channelinfo usage: /channelinfo
aliases: [chi,vchannelinfo] aliases: [chi,vchannelinfo]
description: Check a channels info description: Check a channels info
permission-message: You don't have <permission> permission-message: You don't have <permission>
venturechat: venturechat:
usage: /venturechat usage: /venturechat
aliases: [vc] aliases: [vc]
description: Check plugin information description: Check plugin information
permission-message: You don't have <permission> permission-message: You don't have <permission>
me: me:
usage: /me usage: /me
aliases: [vme] aliases: [vme]
description: Send an emote description: Send an emote
permission-message: You don't have <permission> permission-message: You don't have <permission>
filter: filter:
usage: /filter usage: /filter
aliases: [fil,vfilter] aliases: [fil,vfilter]
description: Toggle filter on and off description: Toggle filter on and off
permission-message: You don't have <permission> permission-message: You don't have <permission>
broadcast: broadcast:
usage: /broadcast [msg] usage: /broadcast [msg]
aliases: [bc,vbroadcast] aliases: [bc,vbroadcast]
description: Broadcast a message description: Broadcast a message
permission-message: You don't have <permission> permission-message: You don't have <permission>
commandblock: commandblock:
usage: /commandblock [player] [command] usage: /commandblock [player] [command]
aliases: [cb,vcommandblock] aliases: [cb,vcommandblock]
description: Toggle a player blocked from entering a command description: Toggle a player blocked from entering a command
permission-message: You don't have <permission> permission-message: You don't have <permission>
nick: nick:
usage: /nick {player} [nickname] usage: /nick {player} [nickname]
aliases: [vnick] aliases: [vnick]
description: Set a players nickname description: Set a players nickname
permission-message: You don't have <permission> permission-message: You don't have <permission>
party: party:
usage: /party help usage: /party help
aliases: [p,chatparty,cp,vparty] aliases: [p,chatparty,cp,vparty]
description: Party commands description: Party commands
permission-message: You don't have <permission> permission-message: You don't have <permission>
config: config:
usage: /config help usage: /config help
aliases: [vconfig] aliases: [vconfig]
description: Edit commands description: Edit commands
permission-message: You don't have <permission> permission-message: You don't have <permission>
clearchat: clearchat:
usage: /clearchat usage: /clearchat
aliases: [cc,vclearchat] aliases: [cc,vclearchat]
description: Clear every players chat description: Clear every players chat
permission-message: You don't have <permission> permission-message: You don't have <permission>
notifications: notifications:
usage: /notifications usage: /notifications
aliases: [notify,vnotify] aliases: [notify,vnotify]
description: Toggles your notifications description: Toggles your notifications
permission-message: You don't have <permission> permission-message: You don't have <permission>
mail: mail:
usage: /mail help usage: /mail help
aliases: [vmail] aliases: [vmail]
description: Mail commands description: Mail commands
permission-message: You don't have <permission> permission-message: You don't have <permission>
removemessage: removemessage:
usage: /removemessage [hashcode] usage: /removemessage [hashcode]
aliases: [rm,vremovemessage] aliases: [rm,vremovemessage]
description: Remove a message from the chat description: Remove a message from the chat
permission-message: You don't have <permission> permission-message: You don't have <permission>
edit: edit:
usage: /<command> usage: /<command>
aliases: [vedit] aliases: [vedit]
description: Edit your last chat message description: Edit your last chat message
permission-message: You don't have <permission> permission-message: You don't have <permission>
rangedspy: rangedspy:
usage: /<command> usage: /<command>
aliases: [rspy,vrangedspy] aliases: [rspy,vrangedspy]
description: Toggle spying on ranged channels description: Toggle spying on ranged channels
permission-message: You don't have <permission> permission-message: You don't have <permission>
buttons: buttons:
usage: /<command> usage: /<command>
aliases: [vbuttons] aliases: [vbuttons]
description: Toggle viewing json buttons description: Toggle viewing json buttons
permission-message: You don't have <permission> permission-message: You don't have <permission>
venturechatgui: venturechatgui:
usage: /<command> usage: /<command>
aliases: [vchatgui] aliases: [vchatgui]
description: Opens the chat management gui description: Opens the chat management gui
permission-message: You don't have <permission> permission-message: You don't have <permission>
messagetoggle: messagetoggle:
usage: /<command> usage: /<command>
aliases: [mtoggle,vmessagetoggle] aliases: [mtoggle,vmessagetoggle]
description: Toggle receiving messages description: Toggle receiving messages
permission-message: You don't have <permission> permission-message: You don't have <permission>