Compare commits

...
16 Commits
178 changed files with 10600 additions and 9547 deletions

No files matched your search

+24 -19
View File
@@ -6,7 +6,7 @@
<groupId>de.rayzs.pat</groupId>
<artifactId>ProAntiTab</artifactId>
<version>2.3.2</version>
<version>2.4.3</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
@@ -34,6 +34,11 @@
<url>https://jitpack.io</url>
</repository>
<repository>
<id>placeholderapi</id>
<url>https://repo.helpch.at/releases/</url>
</repository>
<repository>
<id>velocity</id>
<url>https://repo.velocitypowered.com/snapshots/</url>
@@ -50,11 +55,6 @@
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
<repository>
<id>placeholderapi</id>
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
<repository>
<id>viaversion-repo</id>
<url>https://repo.viaversion.com</url>
@@ -72,6 +72,11 @@
<url>https://repo.william278.net/papiproxybridge</url>
</repository>
<repository>
<id>central-snapshots</id>
<url>https://central.sonatype.com/repository/maven-snapshots/</url>
</repository>
</repositories>
<dependencies>
@@ -83,6 +88,13 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.21.11-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
@@ -192,14 +204,14 @@
<dependency>
<groupId>com.velocitypowered</groupId>
<artifactId>velocity-api</artifactId>
<version>3.3.0-SNAPSHOT</version>
<version>3.5.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.velocitypowered</groupId>
<artifactId>velocity-proxy</artifactId>
<version>3.3.0-SNAPSHOT</version>
<version>3.5.0-SNAPSHOT</version>
<scope>provided</scope>
<exclusions>
<exclusion>
@@ -227,14 +239,14 @@
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-text-minimessage</artifactId>
<version>4.26.1</version>
<version>5.2.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-api</artifactId>
<version>4.26.1</version>
<version>5.2.0</version>
<scope>compile</scope>
</dependency>
@@ -262,14 +274,14 @@
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.11.5</version>
<version>2.12.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.luckperms</groupId>
<artifactId>api</artifactId>
<version>5.4</version>
<version>5.5</version>
<scope>provided</scope>
</dependency>
@@ -280,13 +292,6 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.17-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
@@ -1,24 +0,0 @@
package de.rayzs.pat.api.brand;
import de.rayzs.pat.api.brand.impl.*;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.PacketUtils;
import de.rayzs.pat.utils.Reflection;
public class CustomServerBrand {
public static final String CHANNEL_NAME = Reflection.isBefore(1, 13) ? "MC|Brand" : "minecraft:brand";
private static final ServerBrand SERVER_BRAND = Reflection.isVelocityServer() ? new VelocityServerBrand() : Reflection.isProxyServer() ? new BungeeServerBrand() : new BukkitServerBrand();
public static void initialize() { refreshTask(); }
public static void refreshTask() { SERVER_BRAND.initializeTask(); }
public static void preparePlayer(Object playerObj) { SERVER_BRAND.preparePlayer(playerObj); }
public static void sendBrandToPlayer(Object playerObj) { SERVER_BRAND.send(playerObj); }
public static PacketUtils.BrandManipulate createBrandPacket(Object playerObj) { return SERVER_BRAND.createPacket(playerObj); }
public static boolean isEnabled() { return Storage.ConfigSections.Settings.CUSTOM_BRAND.ENABLED; }
public static boolean isBrandTag(String tag) {
return tag.equals("MC|Brand") || tag.equals("minecraft:brand");
}
}
@@ -1,133 +0,0 @@
package de.rayzs.pat.api.brand.impl;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.api.netty.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.api.brand.ServerBrand;
import de.rayzs.pat.utils.message.MessageTranslator;
import java.util.concurrent.atomic.AtomicInteger;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.BukkitLoader;
import de.rayzs.pat.utils.scheduler.PATScheduler;
import de.rayzs.pat.utils.scheduler.PATSchedulerTask;
import io.netty.channel.Channel;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import de.rayzs.pat.utils.*;
import java.lang.reflect.*;
import org.bukkit.*;
import java.util.*;
public class BukkitServerBrand implements ServerBrand {
private static final Server SERVER = Bukkit.getServer();
private static String BRAND = Storage.ConfigSections.Settings.CUSTOM_BRAND.BRANDS.getLines().get(0);
private static PATSchedulerTask TASK;
private static boolean INITIALIZED = false, NO_PREP_CHANNELS = false;
private static Class<?> brandPayloadClass, clientBoundCustomPacketPayloadPacketClass, customPacketPayloadPacketClass;
@Override
public void initializeTask() {
if (Reflection.isWeird()) {
NO_PREP_CHANNELS = Reflection.isAtLeast(1, 21, 7);
if (brandPayloadClass == null)
brandPayloadClass = Reflection.getClass("net.minecraft.network.protocol.common.custom.BrandPayload");
if (clientBoundCustomPacketPayloadPacketClass == null)
clientBoundCustomPacketPayloadPacketClass = Reflection.getClass("net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket");
if (customPacketPayloadPacketClass == null)
customPacketPayloadPacketClass = Reflection.getClass("net.minecraft.network.protocol.common.custom.CustomPacketPayload");
}
Bukkit.getOnlinePlayers().forEach(this::preparePlayer);
if (!INITIALIZED)
try {
Method method = Reflection.getMethodsByParameterAndName(SERVER.getMessenger(), "addToOutgoing", Plugin.class, String.class).get(0);
Reflection.invokeMethode(method, SERVER.getMessenger(), BukkitLoader.getPlugin(), CustomServerBrand.CHANNEL_NAME);
SERVER.getMessenger().registerOutgoingPluginChannel(BukkitLoader.getPlugin(), CustomServerBrand.CHANNEL_NAME);
INITIALIZED = true;
} catch (Exception exception) {
exception.printStackTrace();
}
if(TASK != null && TASK.isActive()) {
TASK.cancelTask();
TASK = null;
}
if(!Storage.ConfigSections.Settings.CUSTOM_BRAND.ENABLED) return;
if(Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY == -1) {
BRAND = Storage.ConfigSections.Settings.CUSTOM_BRAND.BRANDS.getLines().get(0) + "§r";
PATScheduler.createAsyncScheduler(() -> {
Bukkit.getOnlinePlayers().forEach(this::send);
}, 1, 1);
} else {
AtomicInteger animationState = new AtomicInteger(0);
TASK = PATScheduler.createAsyncScheduler(() -> {
if (animationState.getAndIncrement() >= Storage.ConfigSections.Settings.CUSTOM_BRAND.BRANDS.getLines().size() - 1)
animationState.set(0);
BRAND = Storage.ConfigSections.Settings.CUSTOM_BRAND.BRANDS.getLines().get(animationState.get()) + "§r";
Bukkit.getOnlinePlayers().forEach(this::send);
}, 1, Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY);
}
}
@Override
public void preparePlayer(Object playerObj) {
if(!(playerObj instanceof Player) || !Storage.ConfigSections.Settings.CUSTOM_BRAND.ENABLED) return;
Player player = (Player) playerObj;
if (NO_PREP_CHANNELS) {
return;
}
try {
Field channelsField = Reflection.getFieldByName(player.getClass(), "channels");
Set<String> channels = (Set<String>) channelsField.get(player);
channels.add(CustomServerBrand.CHANNEL_NAME);
Reflection.closeAccess(channelsField);
} catch (Exception exception) {
exception.printStackTrace();
}
}
@Override
public void send(Object playerObj) {
if(!(playerObj instanceof Player) || !Storage.ConfigSections.Settings.CUSTOM_BRAND.ENABLED) return;
Player player = (Player) playerObj;
String playerName = player.getName(), displayName = player.getDisplayName(), worldName = player.getWorld().getName(),
customBrand = BRAND.replace("%player%", playerName).replace("%displayname%", displayName).replace("%world%", worldName);
if(!Reflection.isWeird()) {
PacketUtils.BrandManipulate serverBrand = new PacketUtils.BrandManipulate(MessageTranslator.replaceMessage(player, customBrand));
player.sendPluginMessage(BukkitLoader.getPlugin(), CustomServerBrand.CHANNEL_NAME, serverBrand.getBytes());
return;
}
try {
Channel channel = BukkitPacketAnalyzer.INJECTED_PLAYERS.get(player.getUniqueId());
if(channel == null) return;
Object brandPayloadObj = brandPayloadClass.getDeclaredConstructor(String.class).newInstance(MessageTranslator.replaceMessage(player, customBrand)),
customPacketPayloadPacket = clientBoundCustomPacketPayloadPacketClass.getDeclaredConstructor(customPacketPayloadPacketClass).newInstance(brandPayloadObj);
channel.pipeline().writeAndFlush(customPacketPayloadPacket);
} catch (Exception exception) {
exception.printStackTrace();
}
}
@Override
public PacketUtils.BrandManipulate createPacket(Object playerObj) {
return null;
}
}
@@ -1,73 +0,0 @@
package de.rayzs.pat.api.brand.impl;
import de.rayzs.pat.utils.message.MessageTranslator;
import net.md_5.bungee.api.scheduler.ScheduledTask;
import net.md_5.bungee.protocol.ProtocolConstants;
import java.util.concurrent.atomic.AtomicInteger;
import de.rayzs.pat.api.brand.ServerBrand;
import net.md_5.bungee.api.connection.*;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.BungeeLoader;
import net.md_5.bungee.api.ProxyServer;
import de.rayzs.pat.utils.PacketUtils;
import java.util.concurrent.TimeUnit;
public class BungeeServerBrand implements ServerBrand {
private static final ProxyServer SERVER = BungeeLoader.getPlugin().getProxy();
private static ScheduledTask TASK;
private static String BRAND = Storage.ConfigSections.Settings.CUSTOM_BRAND.BRANDS.getLines().get(0);
public BungeeServerBrand() { }
@Override
public void initializeTask() {
if(TASK != null) TASK.cancel();
if(!Storage.ConfigSections.Settings.CUSTOM_BRAND.ENABLED) return;
if(Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY == -1) {
BRAND = MessageTranslator.replaceMessage(Storage.ConfigSections.Settings.CUSTOM_BRAND.BRANDS.getLines().get(0)) + "§r";
SERVER.getPlayers().forEach(this::send);
} else {
AtomicInteger animationState = new AtomicInteger(0);
TASK = SERVER.getScheduler().schedule(BungeeLoader.getPlugin(), () -> {
if (animationState.getAndIncrement() >= Storage.ConfigSections.Settings.CUSTOM_BRAND.BRANDS.getLines().size() - 1)
animationState.set(0);
BRAND = MessageTranslator.replaceMessage(Storage.ConfigSections.Settings.CUSTOM_BRAND.BRANDS.getLines().get(animationState.get())) + "§r";
SERVER.getPlayers().forEach(this::send);
}, 1, Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY, TimeUnit.MILLISECONDS);
}
}
@Override
public void preparePlayer(Object playerObj) { }
@Override
public void send(Object playerObj) {
if (!(playerObj instanceof ProxiedPlayer) || !Storage.ConfigSections.Settings.CUSTOM_BRAND.ENABLED) return;
ProxiedPlayer player = (ProxiedPlayer) playerObj;
String serverName = "", playerName = player.getName(), customBrand;
Server server = player.getServer();
if(server != null) serverName = server.getInfo().getName();
customBrand = BRAND.replace("%player%", playerName).replace("%server%", serverName);
PacketUtils.BrandManipulate serverBrand = new PacketUtils.BrandManipulate(customBrand);
String brand = player.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_13 ? "minecraft:brand" : "MC|Brand";
player.sendData(brand, serverBrand.getBytes());
}
@Override
public PacketUtils.BrandManipulate createPacket(Object playerObj) {
if (!(playerObj instanceof ProxiedPlayer) || !Storage.ConfigSections.Settings.CUSTOM_BRAND.ENABLED) return null;
ProxiedPlayer player = (ProxiedPlayer) playerObj;
String serverName = "", playerName = player.getName(), customBrand;
Server server = player.getServer();
if(server != null) serverName = server.getInfo().getName();
customBrand = BRAND.replace("%player%", playerName).replace("%server%", serverName);
return new PacketUtils.BrandManipulate(customBrand);
}
}
@@ -1,104 +0,0 @@
package de.rayzs.pat.api.brand.impl;
import com.velocitypowered.api.scheduler.ScheduledTask;
import de.rayzs.pat.utils.message.MessageTranslator;
import net.md_5.bungee.protocol.ProtocolConstants;
import java.util.concurrent.atomic.AtomicInteger;
import de.rayzs.pat.api.brand.ServerBrand;
import de.rayzs.pat.plugin.VelocityLoader;
import de.rayzs.pat.api.storage.Storage;
import com.velocitypowered.api.proxy.*;
import java.util.concurrent.TimeUnit;
import java.lang.reflect.Method;
import io.netty.buffer.ByteBuf;
import de.rayzs.pat.utils.*;
import java.util.Optional;
public class VelocityServerBrand implements ServerBrand {
private static final ProxyServer SERVER = VelocityLoader.getServer();
private static Class<?> pluginMessagePacketClass, minecraftConnectionClass, connectedPlayerConnectionClass;
private static Method connectionMethod;
private static ScheduledTask TASK;
private static String BRAND = Storage.ConfigSections.Settings.CUSTOM_BRAND.BRANDS.getLines().get(0);
@Override
public void initializeTask() {
if(TASK != null) TASK.cancel();
if(!Storage.ConfigSections.Settings.CUSTOM_BRAND.ENABLED) return;
if(pluginMessagePacketClass == null)
pluginMessagePacketClass = Reflection.getClass("com.velocitypowered.proxy.protocol.packet.PluginMessagePacket");
if(minecraftConnectionClass == null)
minecraftConnectionClass = Reflection.getClass("com.velocitypowered.proxy.connection.MinecraftConnection");
if(connectedPlayerConnectionClass == null)
connectedPlayerConnectionClass = Reflection.getClass("com.velocitypowered.proxy.connection.client.ConnectedPlayer");
if(connectionMethod == null)
connectionMethod = Reflection.getMethodByName(connectedPlayerConnectionClass, "getConnection");
if(Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY == -1) {
BRAND = MessageTranslator.replaceMessage(Storage.ConfigSections.Settings.CUSTOM_BRAND.BRANDS.getLines().get(0)) + "§r";
SERVER.getAllPlayers().forEach(this::send);
} else {
AtomicInteger animationState = new AtomicInteger(0);
TASK = SERVER.getScheduler().buildTask(VelocityLoader.getInstance(), () -> {
if (animationState.getAndIncrement() >= Storage.ConfigSections.Settings.CUSTOM_BRAND.BRANDS.getLines().size() - 1)
animationState.set(0);
BRAND = MessageTranslator.replaceMessage(Storage.ConfigSections.Settings.CUSTOM_BRAND.BRANDS.getLines().get(animationState.get())) + "§r";
SERVER.getAllPlayers().forEach(this::send);
}).repeat(Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY, TimeUnit.MILLISECONDS).schedule();
}
}
@Override
public void preparePlayer(Object playerObj) { }
@Override
public void send(Object playerObj) {
if (!(playerObj instanceof Player) || !Storage.ConfigSections.Settings.CUSTOM_BRAND.ENABLED) return;
try {
Player player = (Player) playerObj;
Object connectedPlayerObj = connectedPlayerConnectionClass.cast(player),
minecraftConnectionObj = connectionMethod.invoke(connectedPlayerObj);
String serverName = "", playerName = player.getUsername(), customBrand;
Optional<ServerConnection> serverConnection = player.getCurrentServer();
if(serverConnection.isPresent()) serverName = serverConnection.get().getServerInfo().getName();
customBrand = BRAND.replace("%player%", playerName).replace("%server%", serverName).replace("%ping%", String.valueOf(player.getPing()));
PacketUtils.BrandManipulate serverBrand = new PacketUtils.BrandManipulate(customBrand, false);
String brand = player.getProtocolVersion().getProtocol() >= ProtocolConstants.MINECRAFT_1_13 ? "minecraft:brand" : "MC|Brand";
Object pluginMessagePacket = pluginMessagePacketClass.getConstructor(String.class, ByteBuf.class).newInstance(brand, serverBrand.getByteBuf());
Reflection.getMethodsByParameterAndName(minecraftConnectionObj, "write", Object.class).get(0).invoke(minecraftConnectionObj, pluginMessagePacket);
} catch (Exception exception) {
exception.printStackTrace();
}
}
@Override
public PacketUtils.BrandManipulate createPacket(Object playerObj) {
if (!(playerObj instanceof Player) || !Storage.ConfigSections.Settings.CUSTOM_BRAND.ENABLED) return null;
try {
Player player = (Player) playerObj;
String serverName = "", playerName = player.getUsername(), customBrand;
Optional<ServerConnection> serverConnection = player.getCurrentServer();
if(serverConnection.isPresent()) serverName = serverConnection.get().getServerInfo().getName();
customBrand = BRAND.replace("%player%", playerName).replace("%server%", serverName).replace("%ping%", String.valueOf(player.getPing()));
return new PacketUtils.BrandManipulate(customBrand, false);
} catch (Exception exception) {
exception.printStackTrace();
}
return null;
}
}
@@ -1,12 +1,14 @@
package de.rayzs.pat.api.event;
import de.rayzs.pat.utils.sender.CommandSender;
public abstract class PATEvent<T> {
private final Object senderObj;
private final CommandSender player;
private boolean cancelled = false;
public PATEvent(Object senderObj) {
this.senderObj = senderObj;
public PATEvent(CommandSender player) {
this.player = player;
}
public abstract void handle(T t);
@@ -14,8 +16,8 @@ public abstract class PATEvent<T> {
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
public Object getSenderObj() {
return senderObj;
public CommandSender getPlayer() {
return player;
}
public boolean isCancelled() {
@@ -2,7 +2,7 @@ package de.rayzs.pat.api.event;
import de.rayzs.pat.api.event.events.*;
import de.rayzs.pat.utils.CommunicationPackets;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.*;
@@ -10,12 +10,11 @@ public class PATEventHandler {
private static List<PATEvent> EVENTS = new ArrayList<>();
public static ExecuteCommandEvent callExecuteCommandEvents(Object senderObj, String command, boolean blocked, boolean notify) {
ExecuteCommandEvent event = EmptyEvent.createEmptyExecuteCommandEvent(senderObj, command, blocked, notify);
public static ExecuteCommandEvent callExecuteCommandEvents(CommandSender player, String command, boolean blocked, boolean notify) {
ExecuteCommandEvent event = EmptyEvent.createEmptyExecuteCommandEvent(player, command, blocked, notify);
for (PATEvent patEvent : EVENTS) {
if(patEvent instanceof ExecuteCommandEvent) {
ExecuteCommandEvent executeCommandEvent = (ExecuteCommandEvent) patEvent;
if (patEvent instanceof ExecuteCommandEvent executeCommandEvent) {
executeCommandEvent.handle(event);
}
}
@@ -23,38 +22,35 @@ public class PATEventHandler {
return event;
}
public static FilteredSuggestionEvent callFilteredSuggestionEvents(Object senderObj, List<String> suggestions) {
FilteredSuggestionEvent event = EmptyEvent.createEmptyFilteredSuggestionEvent(senderObj, suggestions);
public static FilteredSuggestionEvent callFilteredSuggestionEvents(CommandSender player, HashSet<String> suggestions) {
FilteredSuggestionEvent event = EmptyEvent.createEmptyFilteredSuggestionEvent(player, suggestions);
for (PATEvent patEvent : EVENTS) {
if(patEvent instanceof FilteredSuggestionEvent) {
FilteredSuggestionEvent filteredSuggestion = (FilteredSuggestionEvent) patEvent;
filteredSuggestion.handle(event);
if (patEvent instanceof FilteredSuggestionEvent filteredSuggestionEvent) {
filteredSuggestionEvent.handle(event);
}
}
return event;
}
public static FilteredTabCompletionEvent callFilteredTabCompletionEvents(Object senderObj, String cursor, List<String> completion) {
FilteredTabCompletionEvent event = EmptyEvent.createEmptyFilteredTabCompletion(senderObj, cursor, completion);
public static FilteredTabCompletionEvent callFilteredTabCompletionEvents(CommandSender player, String cursor, List<String> completion) {
FilteredTabCompletionEvent event = EmptyEvent.createEmptyFilteredTabCompletion(player, cursor, completion);
for (PATEvent patEvent : EVENTS) {
if(patEvent instanceof FilteredTabCompletionEvent) {
FilteredTabCompletionEvent filteredTabCompletion = (FilteredTabCompletionEvent) patEvent;
filteredTabCompletion.handle(event);
if (patEvent instanceof FilteredTabCompletionEvent filteredTabCompletionEvent) {
filteredTabCompletionEvent.handle(event);
}
}
return event;
}
public static ServerPlayersChangeEvent callServerPlayersChangeEvents(Object senderObj, ServerPlayersChangeEvent.Type type) {
ServerPlayersChangeEvent event = EmptyEvent.createEmptyServerPlayersChangeEvent(senderObj, type);
public static ServerPlayersChangeEvent callServerPlayersChangeEvents(CommandSender player, ServerPlayersChangeEvent.Type type) {
ServerPlayersChangeEvent event = EmptyEvent.createEmptyServerPlayersChangeEvent(player, type);
for (PATEvent patEvent : EVENTS) {
if(patEvent instanceof ServerPlayersChangeEvent) {
ServerPlayersChangeEvent serverPlayersChangeEvent = (ServerPlayersChangeEvent) patEvent;
if (patEvent instanceof ServerPlayersChangeEvent serverPlayersChangeEvent) {
serverPlayersChangeEvent.handle(event);
}
}
@@ -66,8 +62,7 @@ public class PATEventHandler {
UpdatePluginEvent event = EmptyEvent.createEmptyUpdatePluginEvent();
for (PATEvent patEvent : EVENTS) {
if(patEvent instanceof UpdatePluginEvent) {
UpdatePluginEvent updatePluginEvent = (UpdatePluginEvent) patEvent;
if (patEvent instanceof UpdatePluginEvent updatePluginEvent) {
updatePluginEvent.handle(event);
}
}
@@ -75,12 +70,11 @@ public class PATEventHandler {
return event;
}
public static UpdatePlayerCommandsEvent callUpdatePlayerCommandsEvents(Object playerObj, List<String> commands, boolean serverBased) {
UpdatePlayerCommandsEvent event = EmptyEvent.createEmptyUpdatePlayerCommandsEvent(playerObj, commands, serverBased);
public static UpdatePlayerCommandsEvent callUpdatePlayerCommandsEvents(CommandSender player, HashSet<String> commands, boolean serverBased) {
UpdatePlayerCommandsEvent event = EmptyEvent.createEmptyUpdatePlayerCommandsEvent(player, commands, serverBased);
for (PATEvent patEvent : EVENTS) {
if(patEvent instanceof UpdatePlayerCommandsEvent) {
UpdatePlayerCommandsEvent updatePlayerCommandsEvent = (UpdatePlayerCommandsEvent) patEvent;
if (patEvent instanceof UpdatePlayerCommandsEvent updatePlayerCommandsEvent) {
updatePlayerCommandsEvent.handle(event);
}
}
@@ -92,8 +86,7 @@ public class PATEventHandler {
SentSyncEvent event = EmptyEvent.createEmptySentSyncEvent(dataSyncPacket, serverName);
for (PATEvent patEvent : EVENTS) {
if(patEvent instanceof SentSyncEvent) {
SentSyncEvent sentSyncEvent = (SentSyncEvent) patEvent;
if (patEvent instanceof SentSyncEvent sentSyncEvent) {
sentSyncEvent.handle(event);
}
}
@@ -105,9 +98,8 @@ public class PATEventHandler {
ReceiveSyncEvent event = EmptyEvent.createEmptyReceiveSyncEvent(dataSyncPacket);
for (PATEvent patEvent : EVENTS) {
if(patEvent instanceof ReceiveSyncEvent) {
ReceiveSyncEvent proxySyncEvent = (ReceiveSyncEvent) patEvent;
proxySyncEvent.handle(event);
if (patEvent instanceof ReceiveSyncEvent receiveSyncEvent) {
receiveSyncEvent.handle(event);
}
}
@@ -124,8 +116,8 @@ public class PATEventHandler {
public static class EmptyEvent {
public static ServerPlayersChangeEvent createEmptyServerPlayersChangeEvent(Object senderObj, ServerPlayersChangeEvent.Type type) {
return new ServerPlayersChangeEvent(senderObj, type) {
public static ServerPlayersChangeEvent createEmptyServerPlayersChangeEvent(CommandSender player, ServerPlayersChangeEvent.Type type) {
return new ServerPlayersChangeEvent(player, type) {
@Override
public void handle(ServerPlayersChangeEvent event) {
@@ -151,8 +143,8 @@ public class PATEventHandler {
};
}
public static UpdatePlayerCommandsEvent createEmptyUpdatePlayerCommandsEvent(Object playerObj, List<String> commands, boolean serverBased) {
return new UpdatePlayerCommandsEvent(playerObj, commands, serverBased) {
public static UpdatePlayerCommandsEvent createEmptyUpdatePlayerCommandsEvent(CommandSender player, HashSet<String> commands, boolean serverBased) {
return new UpdatePlayerCommandsEvent(player, commands, serverBased) {
@Override
public void handle(UpdatePlayerCommandsEvent event) {
@@ -169,8 +161,8 @@ public class PATEventHandler {
};
}
public static ExecuteCommandEvent createEmptyExecuteCommandEvent(Object senderObj, String command, boolean blocked, boolean notify) {
return new ExecuteCommandEvent(senderObj, command, blocked, notify) {
public static ExecuteCommandEvent createEmptyExecuteCommandEvent(CommandSender player, String command, boolean blocked, boolean notify) {
return new ExecuteCommandEvent(player, command, blocked, notify) {
@Override
public void handle(ExecuteCommandEvent event) {
@@ -178,8 +170,8 @@ public class PATEventHandler {
};
}
public static FilteredSuggestionEvent createEmptyFilteredSuggestionEvent(Object senderObj, List<String> suggestions) {
return new FilteredSuggestionEvent(senderObj, suggestions) {
public static FilteredSuggestionEvent createEmptyFilteredSuggestionEvent(CommandSender player, HashSet<String> suggestions) {
return new FilteredSuggestionEvent(player, suggestions) {
@Override
public void handle(FilteredSuggestionEvent event) {
@@ -187,8 +179,8 @@ public class PATEventHandler {
};
}
public static FilteredTabCompletionEvent createEmptyFilteredTabCompletion(Object senderObj, String cursor, List<String> completion) {
return new FilteredTabCompletionEvent(senderObj, cursor, completion) {
public static FilteredTabCompletionEvent createEmptyFilteredTabCompletion(CommandSender player, String cursor, List<String> completion) {
return new FilteredTabCompletionEvent(player, cursor, completion) {
@Override
public void handle(FilteredTabCompletionEvent event) {
@@ -1,6 +1,7 @@
package de.rayzs.pat.api.event.events;
import de.rayzs.pat.api.event.PATEvent;
import de.rayzs.pat.utils.sender.CommandSender;
public abstract class ExecuteCommandEvent extends PATEvent<ExecuteCommandEvent> {
@@ -9,13 +10,15 @@ public abstract class ExecuteCommandEvent extends PATEvent<ExecuteCommandEvent>
public ExecuteCommandEvent() {
super(null);
this.blocked = false;
this.notify = false;
this.command = null;
}
public ExecuteCommandEvent(Object senderObj, String command, boolean blocked, boolean notify) {
super(senderObj);
public ExecuteCommandEvent(CommandSender player, String command, boolean blocked, boolean notify) {
super(player);
this.blocked = blocked;
this.command = command;
this.notify = notify;
@@ -1,27 +1,30 @@
package de.rayzs.pat.api.event.events;
import de.rayzs.pat.api.event.PATEvent;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.*;
public abstract class FilteredSuggestionEvent extends PATEvent<FilteredSuggestionEvent> {
private List<String> suggestions;
private HashSet<String> suggestions;
public FilteredSuggestionEvent() {
super(null);
this.suggestions = null;
}
public FilteredSuggestionEvent(Object senderObj, List<String> suggestions) {
super(senderObj);
public FilteredSuggestionEvent(CommandSender player, HashSet<String> suggestions) {
super(player);
this.suggestions = suggestions;
}
public List<String> getSuggestions() {
public HashSet<String> getSuggestions() {
return suggestions;
}
public void setSuggestions(List<String> suggestions) {
public void setSuggestions(HashSet<String> suggestions) {
this.suggestions = suggestions;
}
}
@@ -1,6 +1,8 @@
package de.rayzs.pat.api.event.events;
import de.rayzs.pat.api.event.PATEvent;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.*;
public abstract class FilteredTabCompletionEvent extends PATEvent<FilteredTabCompletionEvent> {
@@ -10,12 +12,14 @@ public abstract class FilteredTabCompletionEvent extends PATEvent<FilteredTabCom
public FilteredTabCompletionEvent() {
super(null);
this.cursor = null;
this.completion = null;
}
public FilteredTabCompletionEvent(Object senderObj, String cursor, List<String> completion) {
super(senderObj);
public FilteredTabCompletionEvent(CommandSender player, String cursor, List<String> completion) {
super(player);
this.cursor = cursor;
this.completion = completion;
}
@@ -2,6 +2,7 @@ package de.rayzs.pat.api.event.events;
import de.rayzs.pat.utils.CommunicationPackets;
import de.rayzs.pat.api.event.PATEvent;
import de.rayzs.pat.utils.sender.CommandSender;
public abstract class ReceiveSyncEvent extends PATEvent<ReceiveSyncEvent> {
@@ -12,8 +13,9 @@ public abstract class ReceiveSyncEvent extends PATEvent<ReceiveSyncEvent> {
this.dataSyncPacket = null;
}
public ReceiveSyncEvent(Object senderObj, CommunicationPackets.Proxy2Backend.DataSyncPacket dataSyncPacket) {
super(senderObj);
public ReceiveSyncEvent(CommandSender player, CommunicationPackets.Proxy2Backend.DataSyncPacket dataSyncPacket) {
super(player);
this.dataSyncPacket = dataSyncPacket;
}
@@ -2,6 +2,7 @@ package de.rayzs.pat.api.event.events;
import de.rayzs.pat.utils.CommunicationPackets;
import de.rayzs.pat.api.event.PATEvent;
import de.rayzs.pat.utils.sender.CommandSender;
public abstract class SentSyncEvent extends PATEvent<SentSyncEvent> {
@@ -10,12 +11,14 @@ public abstract class SentSyncEvent extends PATEvent<SentSyncEvent> {
public SentSyncEvent() {
super(null);
this.dataSyncPacket = null;
this.serverName = null;
}
public SentSyncEvent(Object senderObj, CommunicationPackets.Proxy2Backend.DataSyncPacket dataSyncPacket, String serverName) {
super(senderObj);
public SentSyncEvent(CommandSender player, CommunicationPackets.Proxy2Backend.DataSyncPacket dataSyncPacket, String serverName) {
super(player);
this.dataSyncPacket = dataSyncPacket;
this.serverName = serverName;
}
@@ -1,13 +1,15 @@
package de.rayzs.pat.api.event.events;
import de.rayzs.pat.api.event.PATEvent;
import de.rayzs.pat.utils.sender.CommandSender;
public abstract class ServerPlayersChangeEvent extends PATEvent<ServerPlayersChangeEvent> {
private final Type type;
public ServerPlayersChangeEvent(Object senderObj, Type type) {
super(senderObj);
public ServerPlayersChangeEvent(CommandSender player, Type type) {
super(player);
this.type = type;
}
@@ -1,24 +1,27 @@
package de.rayzs.pat.api.event.events;
import de.rayzs.pat.api.event.PATEvent;
import java.util.List;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.HashSet;
public abstract class UpdatePlayerCommandsEvent extends PATEvent<UpdatePlayerCommandsEvent> {
private List<String> commands;
private HashSet<String> commands;
private boolean serverBased;
public UpdatePlayerCommandsEvent() {
super(null);;
}
public UpdatePlayerCommandsEvent(Object senderObj, List<String> commands, boolean serverBased) {
super(senderObj);
public UpdatePlayerCommandsEvent(CommandSender player, HashSet<String> commands, boolean serverBased) {
super(player);
this.commands = commands;
this.serverBased = serverBased;
}
public List<String> getCommands() {
public HashSet<String> getCommands() {
return commands;
}
@@ -1,6 +1,7 @@
package de.rayzs.pat.api.event.events;
import de.rayzs.pat.api.event.PATEvent;
import de.rayzs.pat.utils.sender.CommandSender;
public abstract class UpdatePluginEvent extends PATEvent<UpdatePluginEvent> {
@@ -8,7 +9,7 @@ public abstract class UpdatePluginEvent extends PATEvent<UpdatePluginEvent> {
super(null);;
}
public UpdatePluginEvent(Object senderObj) {
super(senderObj);
public UpdatePluginEvent(CommandSender player) {
super(player);
}
}
@@ -1,43 +0,0 @@
package de.rayzs.pat.api.event.events.bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
public abstract class ExecuteCommandEvent extends Event implements Cancellable {
private final String command;
private boolean blocked;
public ExecuteCommandEvent() {
this.blocked = false;
this.command = null;
}
public ExecuteCommandEvent(Player player, String command, boolean blocked) {
this.blocked = blocked;
this.command = command;
}
public String getCommand() {
return command;
}
public boolean isBlocked() {
return blocked;
}
public void setBlocked(boolean blocked) {
this.blocked = blocked;
}
@Override
public boolean isCancelled() {
return blocked;
}
@Override
public void setCancelled(boolean cancel) {
this.blocked = cancel;
}
}
@@ -1,26 +0,0 @@
package de.rayzs.pat.api.event.events.bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import java.util.List;
public abstract class FilteredSuggestionEvent extends Event {
private List<String> suggestions;
public FilteredSuggestionEvent() {
this.suggestions = null;
}
public FilteredSuggestionEvent(Player player, List<String> suggestions) {
this.suggestions = suggestions;
}
public List<String> getSuggestions() {
return suggestions;
}
public void setSuggestions(List<String> suggestions) {
this.suggestions = suggestions;
}
}
@@ -1,35 +0,0 @@
package de.rayzs.pat.api.event.events.bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import java.util.List;
public abstract class FilteredTabCompletionEvent extends Event {
private String cursor;
private List<String> completion;
public FilteredTabCompletionEvent() {
this.cursor = null;
this.completion = null;
}
public FilteredTabCompletionEvent(Player player, String cursor, List<String> completion) {
this.cursor = cursor;
this.completion = completion;
}
public abstract void handle(FilteredTabCompletionEvent event);
public String getCursor() {
return cursor;
}
public List<String> getCompletion() {
return completion;
}
public void setCompletion(List<String> completion) {
this.completion = completion;
}
}
@@ -1,9 +0,0 @@
package de.rayzs.pat.api.netty.bukkit;
import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.entity.Player;
public interface BukkitPacketHandler {
boolean handleIncomingPacket(Player player, CommandSender sender, Object packetObj) throws Exception;
boolean handleOutgoingPacket(Player player, CommandSender sender, Object packetObj) throws Exception;
}
@@ -1,22 +0,0 @@
package de.rayzs.pat.api.netty.bukkit.handlers;
import de.rayzs.pat.api.netty.bukkit.BukkitPacketHandler;
import de.rayzs.pat.plugin.subarguments.SubArguments;
import de.rayzs.pat.utils.node.BukkitCommandNodeHelper;
import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.entity.Player;
public class ModernCommandsNodeHandler implements BukkitPacketHandler {
public boolean handleIncomingPacket(Player player, CommandSender sender, Object packetObj) throws Exception {
// Ignored
return true;
}
@Override
public boolean handleOutgoingPacket(Player player, CommandSender sender, Object packetObj) throws Exception {
final BukkitCommandNodeHelper helper = new BukkitCommandNodeHelper(packetObj);
SubArguments.handleCommandNode(player.getUniqueId(), helper);
return true;
}
}
@@ -3,18 +3,19 @@ package de.rayzs.pat.api.storage;
import java.util.*;
import java.util.concurrent.TimeUnit;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.api.communication.BackendUpdater;
import de.rayzs.pat.api.communication.Communicator;
import de.rayzs.pat.api.netty.proxy.BungeePacketAnalyzer;
import de.rayzs.pat.plugin.system.serverbrand.CustomServerBrand;
import de.rayzs.pat.plugin.system.communication.BackendUpdater;
import de.rayzs.pat.plugin.system.communication.Communicator;
import de.rayzs.pat.plugin.packetanalyzer.proxy.BungeePacketAnalyzer;
import de.rayzs.pat.api.storage.config.messages.*;
import de.rayzs.pat.api.storage.config.settings.*;
import de.rayzs.pat.plugin.listeners.bukkit.BukkitAntiTabListener;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.plugin.subarguments.SubArguments;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.configuration.updater.ConfigUpdater;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.permission.PermissionPlugin;
import de.rayzs.pat.utils.response.ResponseHandler;
import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.entity.Player;
@@ -60,9 +61,8 @@ public class Storage {
public static final List<UUID> NOTIFY_PLAYERS = new ArrayList<>();
public static String TOKEN = "", CENSORED_TOKEN = "", SERVER_NAME = null, CURRENT_VERSION = "", NEWER_VERSION = "";
public static String TOKEN = "", HASHED_TOKEN = "", CENSORED_TOKEN = "", SERVER_NAME = null, CURRENT_VERSION = "", NEWER_VERSION = "";
public static boolean OUTDATED = false, SEND_CONSOLE_NOTIFICATION = true;
public static Object PLUGIN_OBJECT;
public static boolean USE_PLACEHOLDERAPI = false, USE_PAPIPROXYBRIDGE = false, USE_VIAVERSION = false;
private final static ExpireCache<UUID, String> TEMP_PLAYER_SERVER_CACHE = new ExpireCache<>(1, TimeUnit.SECONDS);
@@ -111,51 +111,40 @@ public class Storage {
}
public static void loadToken() {
Files.TOKEN.reload();
boolean invalidEnv = false;
if (Reflection.isProxyServer()) {
boolean loadFromEnv = (Boolean) Files.TOKEN.getOrSet("load-from-env.enabled", false);
String envVariable = (String) Files.TOKEN.getOrSet("load-from-env.name", "PAT_TOKEN");
if (loadFromEnv) {
Logger.info("Looking up token from environment variable: " + envVariable);
TOKEN = System.getenv(envVariable);
if (TOKEN != null) {
return;
} else invalidEnv = true;
}
TOKEN = (String) Files.TOKEN.getOrSet("token", UUID.randomUUID().toString());
if (invalidEnv)
Logger.warning("Environment variable not found! Using default Token from the token.yml instead.");
if (!Reflection.isProxyServer() && !ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
return;
}
if (!ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
return;
}
if (Reflection.isProxyServer()) Files.TOKEN.reload();
boolean loadFromEnv = ConfigSections.Settings.HANDLE_THROUGH_PROXY.LOAD_FROM_ENV;
String envVariable = ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENV_NAME;
final boolean loadFromEnv = Reflection.isProxyServer()
? (Boolean) Files.TOKEN.getOrSet("load-from-env.enabled", false)
: ConfigSections.Settings.HANDLE_THROUGH_PROXY.LOAD_FROM_ENV;
final String envVariable = Reflection.isProxyServer()
? (String) Files.TOKEN.getOrSet("load-from-env.name", "PAT_TOKEN")
: ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENV_NAME;
boolean useDefaultToken = true;
if (loadFromEnv) {
Logger.info("Looking up token from environment variable: " + envVariable);
TOKEN = System.getenv(envVariable);
if (TOKEN != null) {
return;
} else invalidEnv = true;
if (TOKEN == null) {
Logger.warning("Environment variable not found! Using default Token from the file instead.");
} else useDefaultToken = false;
}
TOKEN = ConfigSections.Settings.HANDLE_THROUGH_PROXY.TOKEN;
if (useDefaultToken) {
TOKEN = Reflection.isProxyServer()
? (String) Files.TOKEN.getOrSet("token", UUID.randomUUID().toString())
: ConfigSections.Settings.HANDLE_THROUGH_PROXY.TOKEN;
}
if (invalidEnv)
Logger.warning("Environment variable not found! Using default Token from the config.yml instead.");
HASHED_TOKEN = Objects.requireNonNullElse(StringUtils.hashString(TOKEN, "SHA-256"), TOKEN);
}
public static void loadConfig() {
@@ -169,18 +158,19 @@ public class Storage {
public static void reload() {
boolean proxy = Reflection.isProxyServer();
boolean backend = Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED && !proxy;
boolean backend = ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED && !proxy;
ConfigUpdater.initialize();
Storage.loadAll(Reflection.isProxyServer() || !backend);
CustomServerBrand.initialize();
CustomServerBrand.get().refreshTask();
GroupManager.clearAllGroups();
GroupManager.initialize();
if (!proxy) {
Communicator.get().reload();
BackendUpdater.restart();
BackendUpdater.get().restart();
}
if (!backend) {
@@ -191,6 +181,9 @@ public class Storage {
Communicator.Proxy2Backend.sendDataSync();
}
Files.CUSTOM_RESPONSES.reload();
ResponseHandler.update();
ConfigUpdater.broadcastMissingParts();
Storage.getLoader().handleReload();
}
@@ -203,59 +196,60 @@ public class Storage {
if (Reflection.isProxyServer()) {
boolean isVelocity = Reflection.isVelocityServer();
if (server != null) {
Storage.Blacklist.clearServerBlacklists(server);
Storage.Blacklist.loadCachedServerBlacklists(server);
Blacklist.clearServerBlacklists(server);
Blacklist.loadCachedServerBlacklists(server);
List<String> associatedServers = getServers()
final List<String> associatedServers = getServers()
.stream()
.filter(s -> !s.equals(server) && isServer(server, s))
.toList();
associatedServers.forEach(s -> {
Storage.Blacklist.clearServerBlacklists(s);
Storage.Blacklist.loadCachedServerBlacklists(s);
Blacklist.clearServerBlacklists(s);
Blacklist.loadCachedServerBlacklists(s);
});
if (isVelocity) {
associatedServers.forEach(serverName -> {
final List<UUID> playerIds = Storage.getLoader().getPlayerIdsByServer(serverName);
final HashSet<String> commands = Blacklist.Collector.collectAllServerCommands(serverName);
associatedServers.forEach(s -> {
List<UUID> playerIds = Storage.getLoader().getPlayerIdsByServer(s);
List<String> commands = new ArrayList<>(SubArguments.getServerCommands(s));
playerIds.forEach(playerId -> {
final CommandSender sender = CommandSender.from(playerId);
playerIds.forEach(playerId -> {
List<String> playerCommands = new ArrayList<>(commands);
playerCommands.addAll(SubArguments.getGroupCommands(playerId, s));
final HashSet<String> playerCommands = new HashSet<>(commands);
final HashSet<String> groupCommands = Blacklist.Collector.collectAllPlayerGroupCommands(sender, serverName);
PATEventHandler.callUpdatePlayerCommandsEvents(playerId, playerCommands, true);
});
playerCommands.addAll(groupCommands);
SubArgument.get().getUpdateArgumentsHandler().updatePlayerArguments(sender, playerCommands, commands, groupCommands);
PATEventHandler.callUpdatePlayerCommandsEvents(sender, playerCommands, true);
});
}
});
} else {
Storage.Blacklist.Experimental.forceCacheReset();
Blacklist.Experimental.forceCacheReset();
final List<UUID> playerIds = Storage.getLoader().getPlayerIds();
if (isVelocity) {
List<UUID> playerIds = Storage.getLoader().getPlayerIds();
playerIds.forEach(playerId -> {
final CommandSender sender = CommandSender.from(playerId);
playerIds.forEach(playerId -> {
List<String> playerCommands = new ArrayList<>(SubArguments.getServerCommands(playerId));
playerCommands.addAll(SubArguments.getGroupCommands(playerId));
final HashSet<String> serverCommands = Blacklist.Collector.collectAllServerCommands(sender.getServerName());
final HashSet<String> playerCommands = new HashSet<>(serverCommands);
final HashSet<String> groupCommands = Blacklist.Collector.collectAllPlayerGroupCommands(sender, sender.getServerName());
PATEventHandler.callUpdatePlayerCommandsEvents(playerId, playerCommands, false);
});
}
playerCommands.addAll(groupCommands);
SubArgument.get().getUpdateArgumentsHandler().updatePlayerArguments(sender, playerCommands, serverCommands, groupCommands);
PATEventHandler.callUpdatePlayerCommandsEvents(sender, playerCommands, false);
});
}
GroupManager.clearServerGroupBlacklists();
Storage.getLoader().updateCommandCache();
Storage.getLoader().resetCommandsCache();
if (!Reflection.isVelocityServer()) {
BungeePacketAnalyzer.sendCommandsPacket();
@@ -268,41 +262,22 @@ public class Storage {
getLoader().handleReload();
PermissionUtil.reloadPermissions();
if (Reflection.isBefore(1, 13)) {
final List<UUID> playerIds = Storage.getLoader().getPlayerIds();
final List<String> commands = new ArrayList<>(Blacklist.BLACKLIST.getCommands());
playerIds.forEach(playerId -> {
List<String> playerCommands = new ArrayList<>(commands);
playerCommands.addAll(SubArguments.getGroupCommands(playerId));
PATEventHandler.callUpdatePlayerCommandsEvents(playerId, playerCommands, true);
});
} else {
BukkitAntiTabListener.handleTabCompletion();
}
Storage.getLoader().resetCommandsCache();
Storage.getLoader().updateCommands();
}
public static void tempCachePlayerToServer(UUID playerId, String server) {
TEMP_PLAYER_SERVER_CACHE.put(playerId, server);
}
public static void getTempCachedPlayerToServer(UUID playerId, String server) {
TEMP_PLAYER_SERVER_CACHE.put(playerId, server);
public static String getTempCachedPlayerToServer(UUID playerId, String server) {
return TEMP_PLAYER_SERVER_CACHE.get(playerId);
}
public static String getCachedPlayerServername(UUID playerId) {
return TEMP_PLAYER_SERVER_CACHE.get(playerId);
}
// Quickly updates all player subarguments.
public static void quickSubArgumentUpdate(UUID uuid) {
List<String> playerCommands = new ArrayList<>(SubArguments.getServerCommands(uuid));
playerCommands.addAll(SubArguments.getGroupCommands(uuid));
PATEventHandler.callUpdatePlayerCommandsEvents(uuid, playerCommands, false);
}
public static PluginLoader getLoader() {
return LOADER;
}
@@ -329,13 +304,12 @@ public class Storage {
return false;
}
public static boolean isServer(String originServer, String targetServer) {
originServer = originServer.toLowerCase();
targetServer = targetServer.toLowerCase();
public static boolean isServer(final String originServer, final String targetServer) {
if (originServer.endsWith("*")) {
originServer = originServer.substring(0, originServer.length() - 2);
return targetServer.startsWith(originServer);
return StringUtils.startsWithIgnoreCase(
originServer.substring(0, originServer.length() - 2),
targetServer
);
}
return originServer.equalsIgnoreCase(targetServer);
@@ -359,24 +333,25 @@ public class Storage {
public static class Settings {
public static AllowGroupOverrulingSection ALLOW_GROUP_OVERRULING = new AllowGroupOverrulingSection();
public static AutoLowercaseCommandsSection AUTO_LOWERCASE_COMMANDS = new AutoLowercaseCommandsSection();
public static BlockNamespaceCommandsSection BLOCK_NAMESPACE_COMMANDS = new BlockNamespaceCommandsSection();
public static HandleThroughProxySection HANDLE_THROUGH_PROXY = new HandleThroughProxySection();
public static InjectionFailedSection INJECTION_FAILED = new InjectionFailedSection();
public static PatchExploitSection PATCH_EXPLOITS = new PatchExploitSection();
public static CustomBrandSection CUSTOM_BRAND = new CustomBrandSection();
public static CancelCommandSection CANCEL_COMMAND = new CancelCommandSection();
public static CustomPluginsSection CUSTOM_PLUGIN = new CustomPluginsSection();
public static CustomVersionSection CUSTOM_VERSION = new CustomVersionSection();
public static DisableSyncSection DISABLE_SYNC = new DisableSyncSection();
public static ForwardConsoleNotificationAlertsSection FORWARD_CONSOLE_NOTIFICATIONS = new ForwardConsoleNotificationAlertsSection();
public static CustomProtocolPingSection CUSTOM_PROTOCOL_PING = new CustomProtocolPingSection();
public static CustomUnknownCommandSection CUSTOM_UNKNOWN_COMMAND = new CustomUnknownCommandSection();
public static TurnBlacklistToWhitelistSection TURN_BLACKLIST_TO_WHITELIST = new TurnBlacklistToWhitelistSection();
public static BaseCommandCaseSensitiveSection BASE_COMMAND_CASE_SENSITIVE = new BaseCommandCaseSensitiveSection();
public static UpdateGroupsPerWorldSection UPDATE_GROUPS_PER_WORLD = new UpdateGroupsPerWorldSection();
public static UpdateGroupsPerServerSection UPDATE_GROUPS_PER_SERVER = new UpdateGroupsPerServerSection();
public static final AllowGroupOverrulingSection ALLOW_GROUP_OVERRULING = new AllowGroupOverrulingSection();
public static final AutoLowercaseCommandsSection AUTO_LOWERCASE_COMMANDS = new AutoLowercaseCommandsSection();
public static final BlockNamespaceCommandsSection BLOCK_NAMESPACE_COMMANDS = new BlockNamespaceCommandsSection();
public static final HandleThroughProxySection HANDLE_THROUGH_PROXY = new HandleThroughProxySection();
public static final InjectionFailedSection INJECTION_FAILED = new InjectionFailedSection();
public static final PatchExploitSection PATCH_EXPLOITS = new PatchExploitSection();
public static final CustomBrandSection CUSTOM_BRAND = new CustomBrandSection();
public static final CancelCommandSection CANCEL_COMMAND = new CancelCommandSection();
public static final CustomPluginsSection CUSTOM_PLUGIN = new CustomPluginsSection();
public static final CustomVersionSection CUSTOM_VERSION = new CustomVersionSection();
public static final DisableSyncSection DISABLE_SYNC = new DisableSyncSection();
public static final ForwardConsoleNotificationAlertsSection FORWARD_CONSOLE_NOTIFICATIONS = new ForwardConsoleNotificationAlertsSection();
public static final ForwardLuckPermsChangesSection FORWARD_LUCK_PERMS_CHANGES_SECTION = new ForwardLuckPermsChangesSection();
public static final CustomProtocolPingSection CUSTOM_PROTOCOL_PING = new CustomProtocolPingSection();
public static final CustomUnknownCommandSection CUSTOM_UNKNOWN_COMMAND = new CustomUnknownCommandSection();
public static final TurnBlacklistToWhitelistSection TURN_BLACKLIST_TO_WHITELIST = new TurnBlacklistToWhitelistSection();
public static final BaseCommandCaseSensitiveSection BASE_COMMAND_CASE_SENSITIVE = new BaseCommandCaseSensitiveSection();
public static final UpdateGroupsPerWorldSection UPDATE_GROUPS_PER_WORLD = new UpdateGroupsPerWorldSection();
public static final UpdateGroupsPerServerSection UPDATE_GROUPS_PER_SERVER = new UpdateGroupsPerServerSection();
public static UpdateSection UPDATE = new UpdateSection();
@@ -464,7 +439,62 @@ public class Storage {
public static class Blacklist {
public static class Experimental {
public static class Collector {
/**
* Collects all commands from the global section and
* that certain server.
*
* @param serverName Target server name.
* @return List of collected commands.
*/
public static HashSet<String> collectAllServerCommands(String serverName) {
HashSet<String> commands = new HashSet<>(Blacklist.getBlacklist().getCommands());
if (!Reflection.isProxyServer())
return commands;
if (serverName == null)
return commands;
List<GeneralBlacklist> blacklists = Blacklist.getServerBlacklists(serverName);
for (GeneralBlacklist blacklist : blacklists)
commands.addAll(blacklist.getCommands());
return commands;
}
/**
* Get a list of all available commands for a player
* based on the PAT groups the player is in.
*
* @param sender Target player.
* @param serverName Target server name.
* @return List of collected commands.
*/
public static HashSet<String> collectAllPlayerGroupCommands(CommandSender sender, String serverName) {
final HashSet<String> commands = new HashSet<>();
final List<Group> groups = GroupManager.getPlayerGroups(sender, sender.isOperator());
if (serverName == null) {
groups.forEach(group -> commands.addAll(group.getCommands()));
return commands;
}
groups.forEach(group -> {
commands.addAll(group.getCommands());
group.getBlacklistServerNames(serverName).forEach(s -> {
commands.addAll(group.getCommands(s));
});
});
return commands;
}
}
private static class Experimental {
public static void forceCacheReset() {
for (Object o : CACHED_SERVER_BLACKLIST.getCache().asMap().keySet()) {
@@ -507,7 +537,7 @@ public class Storage {
// Temporary list for all servers (e.g: server-1)
private static final ExpireCache<String, List<GeneralBlacklist>> CACHED_SERVER_BLACKLIST = new ExpireCache<>(1, TimeUnit.HOURS);
public static void loadAll() {
private static void loadAll() {
CACHED_SERVER_BLACKLIST.clear();
SERVER_BLACKLISTS.clear();
BLACKLIST.load();
@@ -577,28 +607,63 @@ public class Storage {
return IGNORED_SERVERS.isListed(server);
}
public static boolean canPlayerAccess(CommandSender sender, List<Group> groups, String command, BlockType type) {
return canPlayerAccess(sender, groups, command, type, null);
public static boolean canPlayerAccess(
final CommandSender sender,
final List<Group> groups,
final String command,
final BlockType type,
final boolean isOperator
) {
return canPlayerAccess(sender, groups, command, type, null, isOperator);
}
public static boolean canPlayerAccessChat(CommandSender sender, List<Group> groups, String command) {
return canPlayerAccess(sender, groups, command, BlockType.CHAT, null);
public static boolean canPlayerAccessChat(
final CommandSender sender,
final List<Group> groups,
final String command,
final boolean isOperator
) {
return canPlayerAccess(sender, groups, command, BlockType.CHAT, null, isOperator);
}
public static boolean canPlayerAccessChat(CommandSender sender, List<Group> groups, String command, String server) {
return canPlayerAccess(sender, groups, command, BlockType.CHAT, server);
public static boolean canPlayerAccessChat(
final CommandSender sender,
final List<Group> groups,
final String command,
final String server,
final boolean isOperator
) {
return canPlayerAccess(sender, groups, command, BlockType.CHAT, server, isOperator);
}
public static boolean canPlayerAccessTab(CommandSender sender, List<Group> groups, String command) {
return canPlayerAccess(sender, groups, command, BlockType.TAB, null);
public static boolean canPlayerAccessTab(
final CommandSender sender,
final List<Group> groups,
final String command,
final boolean isOperator
) {
return canPlayerAccess(sender, groups, command, BlockType.TAB, null, isOperator);
}
public static boolean canPlayerAccessTab(CommandSender sender, List<Group> groups, String command, String server) {
return canPlayerAccess(sender, groups, command, BlockType.TAB, server);
public static boolean canPlayerAccessTab(
final CommandSender sender,
final List<Group> groups,
final String command,
final String server,
final boolean isOperator
) {
return canPlayerAccess(sender, groups, command, BlockType.TAB, server, isOperator);
}
public static boolean canPlayerAccess(CommandSender sender, List<Group> groups, String command, BlockType type, String server) {
public static boolean canPlayerAccess(
final CommandSender sender,
final List<Group> groups,
final String command,
final BlockType type,
final String server,
final boolean isOperator
) {
final boolean allowGroupOverruling = ConfigSections.Settings.ALLOW_GROUP_OVERRULING.ENABLED;
final boolean blocked = isBlocked(command, type, server);
@@ -613,7 +678,7 @@ public class Storage {
}
if (Storage.getPermissionPlugin() != PermissionPlugin.NONE) {
if (PermissionUtil.hasBypassPermission(sender, command)) {
if (PermissionUtil.hasBypassPermission(sender, command, isOperator)) {
return true;
}
}
@@ -627,7 +692,7 @@ public class Storage {
}
if (Storage.getPermissionPlugin() != PermissionPlugin.NONE) {
if (PermissionUtil.hasBypassPermission(sender, command)) {
if (PermissionUtil.hasBypassPermission(sender, command, isOperator)) {
return true;
}
}
@@ -688,7 +753,7 @@ public class Storage {
String command = type.toString() + unmodifiedCommand;
if (server == null || !isIgnoredServer(server)) {
listed = BLACKLIST.isListed(command, false);
listed = BLACKLIST.isListed(command);
}
if (server == null) {
@@ -709,7 +774,7 @@ public class Storage {
break;
}
listed = blacklist.isListed(command, false);
listed = blacklist.isListed(command);
}
if (!listed && type != BlockType.BOTH) {
@@ -3,6 +3,7 @@ package de.rayzs.pat.api.storage.config.settings;
import de.rayzs.pat.api.storage.storages.ConfigStorage;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.sender.CommandSender;
public class BlockNamespaceCommandsSection extends ConfigStorage {
@@ -29,10 +30,10 @@ public class BlockNamespaceCommandsSection extends ConfigStorage {
return false;
}
return StringUtils.getFirstArg(command).contains(":");
return StringUtils.getFirstArg(command).indexOf(':') != -1;
}
public boolean doesBypass(CommandSender sender) {
return !ENABLED || sender.hasPermission("namespace");
public boolean doesBypass(final CommandSender sender, final boolean isOperator) {
return !ENABLED || PermissionUtil.hasPermission(sender, "namespace", isOperator);
}
}
@@ -38,6 +38,7 @@ public class CustomPluginsSection extends ConfigStorage {
if (currentCommand.equalsIgnoreCase(command))
return true;
}
return false;
}
}
@@ -10,7 +10,7 @@ import java.util.Arrays;
public class CustomProtocolPingSection extends ConfigStorage {
public boolean ENABLED, ALWAYS_SHOW, HIDE_PLAYERS, USE_EXTEND_AS_MAX_COUNT, USE_CUSTOM_PLAYERLIST;
public boolean ENABLED, ALWAYS_SHOW, HIDE_PLAYERS, USE_EXTEND_AS_MAX_COUNT, USE_CUSTOM_PLAYERLIST, USE_CENTER_VARIABLE;
public String PROTOCOL;
public MultipleMessagesHelper PLAYERLIST;
@@ -42,6 +42,7 @@ public class CustomProtocolPingSection extends ConfigStorage {
"&8> &7Using &fProAntiTab"
));
USE_CENTER_VARIABLE = PLAYERLIST.getLines().stream().anyMatch(l -> l.startsWith("%center%"));
if (HIDE_PLAYERS && USE_CUSTOM_PLAYERLIST) {
@@ -6,7 +6,7 @@ import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
public class DisableSyncSection extends ConfigStorage {
public boolean DISABLED;
public boolean ENABLED;
public DisableSyncSection() {
super("disable-sync");
@@ -16,7 +16,11 @@ public class DisableSyncSection extends ConfigStorage {
public void load() {
super.load();
if(!Reflection.isProxyServer()) return;
DISABLED = new ConfigSectionHelper<Boolean>(this, null, false).getOrSet();
if (!Reflection.isProxyServer()) {
return;
}
ENABLED = new ConfigSectionHelper<Boolean>(this, null, false).getOrSet();
}
}
@@ -0,0 +1,22 @@
package de.rayzs.pat.api.storage.config.settings;
import de.rayzs.pat.api.storage.storages.ConfigStorage;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
public class ForwardLuckPermsChangesSection extends ConfigStorage {
public boolean ENABLED = false;
public ForwardLuckPermsChangesSection() {
super("auto-forward-luckperms-changes");
}
@Override
public void load() {
super.load();
if (Reflection.isProxyServer()) return;
ENABLED = new ConfigSectionHelper<Boolean>(this, null, false).getOrSet();
}
}
@@ -20,4 +20,4 @@ public class InjectionFailedSection extends ConfigStorage {
KICK_MESSAGE = new ConfigSectionHelper<String>(this, "kick-message", "&cInjection process failed! Please reconnect.").getOrSet();
CONSOLE_MESSAGE = new ConfigSectionHelper<String>(this, "console-message", "&cInjection process failed! (%player%)").getOrSet();
}
}
}
@@ -4,7 +4,6 @@ import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
import de.rayzs.pat.api.storage.storages.PlaceholderStorage;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.group.GroupManager;
import org.bukkit.entity.Player;
public class ListCommandsPlaceholder extends PlaceholderStorage {
@@ -1,9 +1,10 @@
package de.rayzs.pat.api.storage.placeholders.commands.group;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
import de.rayzs.pat.api.storage.storages.PlaceholderStorage;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.group.*;
import org.bukkit.entity.Player;
public class ListGroupCommandsPlaceholder extends PlaceholderStorage {
@@ -1,9 +1,10 @@
package de.rayzs.pat.api.storage.placeholders.commands.group;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
import de.rayzs.pat.api.storage.storages.PlaceholderStorage;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.group.*;
import org.bukkit.entity.Player;
public class ListGroupReversedCommandsPlaceholder extends PlaceholderStorage {
@@ -1,7 +1,8 @@
package de.rayzs.pat.api.storage.placeholders.commands.group;
import de.rayzs.pat.api.storage.storages.PlaceholderStorage;
import de.rayzs.pat.utils.group.*;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import org.bukkit.entity.Player;
public class ListGroupSizeCommandsPlaceholder extends PlaceholderStorage {
@@ -1,9 +1,10 @@
package de.rayzs.pat.api.storage.placeholders.commands.group;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
import de.rayzs.pat.api.storage.storages.PlaceholderStorage;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.group.*;
import org.bukkit.entity.Player;
public class ListGroupSortedCommandsPlaceholder extends PlaceholderStorage {
@@ -1,9 +1,9 @@
package de.rayzs.pat.api.storage.placeholders.groups;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
import de.rayzs.pat.api.storage.storages.PlaceholderStorage;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.group.*;
import org.bukkit.entity.Player;
public class ListGroupsPlaceholder extends PlaceholderStorage {
@@ -1,9 +1,9 @@
package de.rayzs.pat.api.storage.placeholders.groups;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
import de.rayzs.pat.api.storage.storages.PlaceholderStorage;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.group.*;
import org.bukkit.entity.Player;
public class ListGroupsReversedPlaceholder extends PlaceholderStorage {
@@ -1,9 +1,9 @@
package de.rayzs.pat.api.storage.placeholders.groups;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
import de.rayzs.pat.api.storage.storages.PlaceholderStorage;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.group.*;
import org.bukkit.entity.Player;
public class ListGroupsSortedPlaceholder extends PlaceholderStorage {
@@ -9,17 +9,13 @@ import java.util.*;
public class BlacklistStorage extends StorageTemplate implements Serializable {
private List<String> commands = new ArrayList<>();
private List<String> hiddenCommands = new ArrayList<>();
private HashSet<String> hiddenCommands = new HashSet<>();
public BlacklistStorage(String navigatePath) {
super(Storage.Files.STORAGE, navigatePath);
}
public boolean isListed(String command) {
return isListed(command, false);
}
public boolean isListed(String command, boolean ignoreColons) {
final boolean caseSensitive = Storage.ConfigSections.Settings.BASE_COMMAND_CASE_SENSITIVE.ENABLED;
final boolean turn = Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED;
@@ -27,35 +23,18 @@ public class BlacklistStorage extends StorageTemplate implements Serializable {
return false;
}
boolean isNegated = Storage.Blacklist.BlockTypeFetcher.isNegated(command);
final boolean isNegated = Storage.Blacklist.BlockTypeFetcher.isNegated(command);
final boolean takeFirstArgument = !isNegated == turn;
if (!isNegated == turn) {
if (takeFirstArgument) {
command = StringUtils.getFirstArg(command);
}
for (String listedCommand : hiddenCommands) {
if (listedCommand == null)
continue;
if (ignoreColons) {
command = StringUtils.getFirstArg(command);
if (command.contains(":"))
command = command.substring(command.indexOf(':'));
}
if (!isNegated == turn) {
listedCommand = StringUtils.getFirstArg(listedCommand);
}
if (caseSensitive && listedCommand.equals(command)) {
return true;
} else if (!caseSensitive && listedCommand.equalsIgnoreCase(command)) {
return true;
}
if (!caseSensitive) {
command = command.toLowerCase();
}
return false;
return hiddenCommands.contains(command);
}
public void setList(List<String> commands) {
@@ -86,10 +65,6 @@ public class BlacklistStorage extends StorageTemplate implements Serializable {
return commands;
}
public List<String> getHiddenCommands() {
return hiddenCommands;
}
@Override
public void save() {
getConfig().setAndSave(getNavigatePath(), commands);
@@ -99,10 +74,13 @@ public class BlacklistStorage extends StorageTemplate implements Serializable {
public void load() {
getConfig().reload();
final boolean caseSensitive = Storage.ConfigSections.Settings.BASE_COMMAND_CASE_SENSITIVE.ENABLED;
commands = (ArrayList<String>) getConfig().getOrSet(getNavigatePath(), commands);
final List<String> tmpCommands = commands != null ? new ArrayList<>(commands) : new ArrayList<>();
final Set<String> pluginListCommands = new HashSet<>(), negatedPluginListCommands = new HashSet<>();
final HashSet<String> pluginListCommands = new HashSet<>(), negatedPluginListCommands = new HashSet<>();
final String pluginCommandPrefix = "plugin=";
final String negatedPluginCommandPrefix = Storage.Blacklist.BlockType.NEGATE + pluginCommandPrefix;
@@ -128,7 +106,8 @@ public class BlacklistStorage extends StorageTemplate implements Serializable {
for (String pluginCommand : pluginCommands) {
tmpCommands.remove(pluginCommand);
tmpCommands.add(Storage.Blacklist.BlockType.NEGATE + pluginCommand);
pluginCommand = Storage.Blacklist.BlockType.NEGATE + pluginCommand;
tmpCommands.add(caseSensitive ? pluginCommand : pluginCommand.toLowerCase());
}
}
@@ -141,11 +120,36 @@ public class BlacklistStorage extends StorageTemplate implements Serializable {
final String negated = Storage.Blacklist.BlockType.NEGATE + pluginCommand;
if (!commands.contains(negated) && !tmpCommands.contains(negated)) {
tmpCommands.add(pluginCommand);
tmpCommands.add(caseSensitive ? pluginCommand : pluginCommand.toLowerCase());
}
}
}
hiddenCommands = tmpCommands;
if (!Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED) {
hiddenCommands = new HashSet<>(tmpCommands);
return;
}
final List<String> finalisedCommands = new ArrayList<>();
for (String command : tmpCommands) {
if (Storage.Blacklist.BlockTypeFetcher.isNegated(command)) {
finalisedCommands.add(caseSensitive ? command : StringUtils.lowercaseFirstArgument(command));
continue;
}
if (command.contains(" ")) {
final String firstArgument = StringUtils.getFirstArg(command);
if (!finalisedCommands.contains(firstArgument)) {
finalisedCommands.add(caseSensitive ? firstArgument : firstArgument.toLowerCase());
}
}
finalisedCommands.add(caseSensitive ? command : StringUtils.lowercaseFirstArgument(command));
}
hiddenCommands = new HashSet<>(finalisedCommands);
}
}
File diff suppressed because it is too large. Load diff
@@ -1,321 +1,339 @@
package de.rayzs.pat.plugin;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.api.communication.impl.BungeeClient;
import de.rayzs.pat.plugin.converter.StorageConverter;
import de.rayzs.pat.plugin.process.CommandProcess;
import de.rayzs.pat.plugin.subarguments.SubArguments;
import de.rayzs.pat.api.netty.proxy.BungeePacketAnalyzer;
import de.rayzs.pat.utils.configuration.Configurator;
import de.rayzs.pat.utils.configuration.updater.ConfigUpdater;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.adapter.LuckPermsAdapter;
import de.rayzs.pat.api.communication.Communicator;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.response.action.ActionHandler;
import net.md_5.bungee.api.scheduler.ScheduledTask;
import de.rayzs.pat.plugin.commands.BungeeCommand;
import de.rayzs.pat.plugin.listeners.bungee.*;
import de.rayzs.pat.utils.group.GroupManager;
import net.md_5.bungee.api.config.ServerInfo;
import de.rayzs.pat.plugin.metrics.bStats;
import de.rayzs.pat.plugin.logger.Logger;
import net.md_5.bungee.api.connection.*;
import de.rayzs.pat.api.storage.Storage;
import net.md_5.bungee.api.ProxyServer;
import java.util.concurrent.TimeUnit;
import net.md_5.bungee.api.plugin.*;
import de.rayzs.pat.utils.*;
import java.util.*;
public class BungeeLoader extends Plugin implements PluginLoader {
private ScheduledTask updaterTask;
private static Plugin plugin;
private static java.util.logging.Logger logger;
private static final HashMap<String, CommandsCache> commandsCacheMap = new HashMap<>();
@Override
public void onLoad() {
Configurator.createResourcedFile("files\\proxy-config.yml", "config.yml", false);
Configurator.createResourcedFile("files\\proxy-storage.yml", "storage.yml", false);
Configurator.createResourcedFile("files\\proxy-placeholders.yml", "placeholders.yml", false);
Configurator.createResourcedFile("files\\proxy-custom-responses.yml", "custom-responses.yml", false);
}
@Override
public void onEnable() {
plugin = this;
logger = getLogger();
Reflection.initialize(getProxy());
CommandProcess.initialize();
ConfigUpdater.initialize();
Storage.initialize(this, getDescription().getVersion());
VersionComparer.get().setCurrentVersion(Storage.CURRENT_VERSION);
Storage.loadAll(true);
MessageTranslator.initialize();
CustomServerBrand.initialize();
GroupManager.initialize();
bStats.initialize(this);
PluginManager manager = ProxyServer.getInstance().getPluginManager();
registerCommand("bungeeproantitab", "bpat");
manager.registerListener(this, new BungeePlayerConnectionListener());
manager.registerListener(this, new BungeeAntiTabListener());
manager.registerListener(this, new BungeeBlockCommandListener());
manager.registerListener(this, new BungeePingListener());
if (Reflection.isPaper())
manager.registerListener(this, new WaterfallAntiTabListener());
startUpdaterTask();
Storage.PLUGIN_OBJECT = this;
if (manager.getPlugin("LuckPerms") != null)
LuckPermsAdapter.initialize();
if(manager.getPlugin("PAPIProxyBridge") != null) {
Storage.USE_PAPIPROXYBRIDGE = true;
Logger.info("Successfully hooked into PAPIProxyBridge!");
}
BungeePacketAnalyzer.injectAll();
Storage.broadcastPermissionsPluginNotice();
ConfigUpdater.broadcastMissingParts();
ActionHandler.initialize();
SubArguments.initialize();
StorageConverter.initialize();
Communicator.initialize(new BungeeClient());
// Reload proxy commands after 1, 5, and 15 seconds.
for (int i : new Integer[] { 1, 5, 15 }) {
ProxyServer.getInstance().getScheduler().schedule(this, BungeePacketAnalyzer::loadProxyCommands, i, TimeUnit.SECONDS);
}
BungeePacketAnalyzer.injectAll();
}
@Override
public void onDisable() {
BungeePacketAnalyzer.uninjectAll();
MessageTranslator.closeAudiences();
}
private static void registerCommand(String... commands) {
for (String commandName : commands) {
BungeeCommand command = new BungeeCommand(commandName);
ProxyServer.getInstance().getPluginManager().registerCommand(plugin, command);
}
}
@Override
public void handleReload() {
BungeePacketAnalyzer.loadProxyCommands();
}
@Override
public void delayedPermissionsReload() {
getProxy().getScheduler().schedule(this, () -> {
PermissionUtil.reloadPermissions();
Storage.getLoader().updateCommandCache();
Communicator.Proxy2Backend.sendUpdateCommand();
}, 1, TimeUnit.SECONDS);
}
@Override
public boolean doesCommandExist(String command) {
return false;
}
@Override
public List<String> getAllCommands(boolean useColons) {
return List.of();
}
@Override
public Object getConsoleSender() {
return ProxyServer.getInstance().getConsole();
}
@Override
public Object getPlayerObjByName(String name) {
return plugin.getProxy().getPlayer(name);
}
@Override
public Object getPlayerObjByUUID(UUID uuid) {
return plugin.getProxy().getPlayer(uuid);
}
@Override
public HashMap<String, CommandsCache> getCommandsCacheMap() {
return commandsCacheMap;
}
@Override
public void updateCommandCache() {
new ArrayList<>(commandsCacheMap.values()).forEach(CommandsCache::reset);
}
@Override
public String getPlayerServerName(UUID uuid) {
final String cachedServerName = Storage.getCachedPlayerServername(uuid);
if (cachedServerName != null) {
return cachedServerName;
}
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(uuid);
if (player == null || player.getServer() == null || player.getServer().getInfo() == null) {
return null;
}
return player.getServer().getInfo().getName();
}
@Override
public List<UUID> getPlayerIds() {
return new ArrayList<>(ProxyServer.getInstance().getPlayers().stream().map(ProxiedPlayer::getUniqueId).toList());
}
@Override
public List<UUID> getPlayerIdsByServer(String server) {
List<UUID> uuids = new ArrayList<>();
getServerNames().stream()
.filter(serverName -> Storage.isServer(server, serverName))
.forEach(serverName -> {
ServerInfo serverInfo = ProxyServer.getInstance().getServerInfo(serverName);
if (serverInfo == null)
return;
uuids.addAll(serverInfo.getPlayers().stream().map(ProxiedPlayer::getUniqueId).toList());
});
return uuids;
}
@Override
public List<String> getOnlinePlayerNames(String serverName) {
return new ArrayList<>(ProxyServer.getInstance().getPlayers().stream()
.filter(player -> {
if (player == null || player.getServer() == null || player.getServer().getInfo() == null)
return false;
return player.getServer().getInfo().getName().equalsIgnoreCase(serverName);
}).map(ProxiedPlayer::getName).toList());
}
@Override
public boolean isPlayerOnline(String playerName) {
return ProxyServer.getInstance().getPlayer(playerName) != null;
}
@Override
public boolean doesPlayerExist(String playerName) {
return isPlayerOnline(playerName);
}
@Override
public List<String> getOnlinePlayerNames() {
return new ArrayList<>(ProxyServer.getInstance().getPlayers().stream().map(ProxiedPlayer::getName).toList());
}
@Override
public List<String> getOfflinePlayerNames() {
return new ArrayList<>(ProxyServer.getInstance().getPlayers().stream().map(ProxiedPlayer::getName).toList());
}
@Override
public List<String> getPlayerNames() {
return new ArrayList<>(ProxyServer.getInstance().getPlayers().stream().map(ProxiedPlayer::getName).toList());
}
@Override
public String getNameByUUID(UUID uuid) {
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(uuid);
return player != null ? player.getName() : "";
}
@Override
public UUID getUUIDByName(String playerName) {
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(playerName);
return player != null ? player.getUniqueId() : null;
}
@Override
public List<String> getServerNames() {
return new ArrayList<>(ProxyServer.getInstance().getServers().keySet().stream().toList());
}
@Override
public List<String> getPluginNames(String format) {
List<String> pluginNames = new ArrayList<>();
for (Plugin plugin : ProxyServer.getInstance().getPluginManager().getPlugins()) {
PluginDescription description = plugin.getDescription();
pluginNames.add(
format.replace("%n", description.getName())
.replace("%v", description.getVersion())
);
}
return pluginNames;
}
@Override
public List<String> getPluginCommands(String pluginName, boolean useColons) {
return List.of();
}
public void startUpdaterTask() {
if (!Storage.ConfigSections.Settings.UPDATE.ENABLED)
return;
updaterTask = getProxy().getScheduler().schedule(this, () -> {
if (VersionComparer.get().computeComparison())
getProxy().getScheduler().cancel(updaterTask);
}, 20L, Storage.ConfigSections.Settings.UPDATE.PERIOD, TimeUnit.MILLISECONDS);
}
public static String getServerNameByPlayerUUID(UUID uuid) {
ProxiedPlayer proxiedPlayer = ProxyServer.getInstance().getPlayer(uuid);
if(proxiedPlayer == null) return null;
Server server = proxiedPlayer.getServer();
if(server == null) return null;
ServerInfo serverInfo = server.getInfo();
if(serverInfo == null) return null;
return serverInfo.getName();
}
public static Plugin getPlugin() {
return plugin;
}
public static java.util.logging.Logger getPluginLogger() {
return logger;
}
package de.rayzs.pat.plugin;
import de.rayzs.pat.plugin.system.communication.cph.impl.BungeeCommunicationHandler;
import de.rayzs.pat.plugin.system.serverbrand.CustomServerBrand;
import de.rayzs.pat.plugin.system.communication.pmc.impl.BungeePluginMessageClient;
import de.rayzs.pat.plugin.system.converter.StorageConverter;
import de.rayzs.pat.plugin.command.CommandProcess;
import de.rayzs.pat.plugin.system.serverbrand.impl.BungeeServerBrand;
import de.rayzs.pat.plugin.packetanalyzer.proxy.BungeePacketAnalyzer;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.configuration.Configurator;
import de.rayzs.pat.utils.configuration.updater.ConfigUpdater;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.hooks.LuckPermsHook;
import de.rayzs.pat.plugin.system.communication.Communicator;
import de.rayzs.pat.utils.response.ResponseHandler;
import de.rayzs.pat.utils.response.action.ActionHandler;
import de.rayzs.pat.utils.sender.CommandSender;
import net.md_5.bungee.api.scheduler.ScheduledTask;
import de.rayzs.pat.plugin.command.impl.BungeeCommand;
import de.rayzs.pat.plugin.listeners.bungee.*;
import de.rayzs.pat.utils.group.GroupManager;
import net.md_5.bungee.api.config.ServerInfo;
import de.rayzs.pat.plugin.metrics.bStats;
import de.rayzs.pat.plugin.logger.Logger;
import net.md_5.bungee.api.connection.*;
import de.rayzs.pat.api.storage.Storage;
import net.md_5.bungee.api.ProxyServer;
import java.util.concurrent.TimeUnit;
import net.md_5.bungee.api.plugin.*;
import de.rayzs.pat.utils.*;
import java.util.*;
public class BungeeLoader extends Plugin implements PluginLoader {
private ScheduledTask updaterTask;
private static Plugin plugin;
private static java.util.logging.Logger logger;
private static final HashMap<String, CommandsCache> commandsCacheMap = new HashMap<>();
@Override
public void onLoad() {
Configurator.createResourcedFile("files\\proxy-config.yml", "config.yml", false);
Configurator.createResourcedFile("files\\proxy-storage.yml", "storage.yml", false);
Configurator.createResourcedFile("files\\proxy-placeholders.yml", "placeholders.yml", false);
Configurator.createResourcedFile("files\\proxy-custom-responses.yml", "custom-responses.yml", false);
}
@Override
public void onEnable() {
plugin = this;
logger = getLogger();
Reflection.initialize(getProxy());
CommandProcess.initialize();
ConfigUpdater.initialize();
Storage.initialize(this, getDescription().getVersion());
VersionComparer.get().setCurrentVersion(Storage.CURRENT_VERSION);
Storage.loadAll(true);
MessageTranslator.initialize();
GroupManager.initialize();
bStats.initialize(this);
PluginManager manager = ProxyServer.getInstance().getPluginManager();
ProxyServer.getInstance().getPluginManager().registerCommand(
plugin,
new BungeeCommand("bungeeproantitab", "proantitab.use", "bpat")
);
manager.registerListener(this, new BungeePlayerConnectionListener());
manager.registerListener(this, new BungeeAntiTabListener());
manager.registerListener(this, new BungeeBlockCommandListener());
manager.registerListener(this, new BungeePingListener());
if (Reflection.isPaper())
manager.registerListener(this, new WaterfallAntiTabListener());
startUpdaterTask();
if (manager.getPlugin("LuckPerms") != null) {
manager.registerListener(this, new BungeeLuckPermsWarning());
LuckPermsHook.initialize();
}
if(manager.getPlugin("PAPIProxyBridge") != null) {
Storage.USE_PAPIPROXYBRIDGE = true;
Logger.info("Successfully hooked into PAPIProxyBridge!");
}
BungeePacketAnalyzer.injectAll();
Storage.broadcastPermissionsPluginNotice();
ConfigUpdater.broadcastMissingParts();
ActionHandler.initialize();
SubArgument.initialize();
ResponseHandler.update();
StorageConverter.initialize();
CustomServerBrand.initialize(new BungeeServerBrand());
Communicator.initialize(new BungeePluginMessageClient(), new BungeeCommunicationHandler());
// Reload proxy commands after 1, 5, and 15 seconds.
for (int i : new Integer[] { 1, 5, 15 }) {
ProxyServer.getInstance().getScheduler().schedule(this, BungeePacketAnalyzer::loadProxyCommands, i, TimeUnit.SECONDS);
}
BungeePacketAnalyzer.injectAll();
}
@Override
public void onDisable() {
BungeePacketAnalyzer.uninjectAll();
MessageTranslator.closeAudiences();
}
@Override
public void addPermission(String permission) {}
@Override
public void removePermission(String permission) {}
@Override
public Object getPluginObj() {
return plugin;
}
@Override
public void updateCommands() {
Communicator.Proxy2Backend.sendUpdateCommand();
}
@Override
public void updateCommands(CommandSender sender) {
Communicator.Proxy2Backend.sendUpdateCommand(sender.getUniqueId(), sender.getServerName());
}
@Override
public void handleReload() {
BungeePacketAnalyzer.loadProxyCommands();
}
@Override
public boolean doesCommandExist(String command) {
return false;
}
@Override
public List<String> getAllCommands(boolean useColons) {
return List.of();
}
@Override
public Object getConsoleSender() {
return ProxyServer.getInstance().getConsole();
}
@Override
public Object getPlayerObjByName(String name) {
return plugin.getProxy().getPlayer(name);
}
@Override
public Object getPlayerObjByUUID(UUID uuid) {
return plugin.getProxy().getPlayer(uuid);
}
@Override
public HashMap<String, CommandsCache> getPerServerCommandsCacheMap() {
return commandsCacheMap;
}
@Override
public CommandsCache getBukkitCommandsCacheMap() {
return null;
}
@Override
public void resetCommandsCache() {
new ArrayList<>(commandsCacheMap.values()).forEach(CommandsCache::reset);
}
@Override
public String getPlayerServerName(UUID uuid) {
final String cachedServerName = Storage.getCachedPlayerServername(uuid);
if (cachedServerName != null) {
return cachedServerName;
}
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(uuid);
if (player == null || player.getServer() == null || player.getServer().getInfo() == null) {
return null;
}
return player.getServer().getInfo().getName();
}
@Override
public List<UUID> getPlayerIds() {
return new ArrayList<>(ProxyServer.getInstance().getPlayers().stream().map(ProxiedPlayer::getUniqueId).toList());
}
@Override
public List<UUID> getPlayerIdsByServer(String server) {
List<UUID> uuids = new ArrayList<>();
getServerNames().stream()
.filter(serverName -> Storage.isServer(server, serverName))
.forEach(serverName -> {
ServerInfo serverInfo = ProxyServer.getInstance().getServerInfo(serverName);
if (serverInfo == null)
return;
uuids.addAll(serverInfo.getPlayers().stream().map(ProxiedPlayer::getUniqueId).toList());
});
return uuids;
}
@Override
public List<String> getOnlinePlayerNames(String serverName) {
return new ArrayList<>(ProxyServer.getInstance().getPlayers().stream()
.filter(player -> {
if (player == null || player.getServer() == null || player.getServer().getInfo() == null)
return false;
return player.getServer().getInfo().getName().equalsIgnoreCase(serverName);
}).map(ProxiedPlayer::getName).toList());
}
@Override
public boolean isPlayerOnline(String playerName) {
return ProxyServer.getInstance().getPlayer(playerName) != null;
}
@Override
public boolean doesPlayerExist(String playerName) {
return isPlayerOnline(playerName);
}
@Override
public List<String> getOnlinePlayerNames() {
return new ArrayList<>(ProxyServer.getInstance().getPlayers().stream().map(ProxiedPlayer::getName).toList());
}
@Override
public List<String> getOfflinePlayerNames() {
return new ArrayList<>(ProxyServer.getInstance().getPlayers().stream().map(ProxiedPlayer::getName).toList());
}
@Override
public List<String> getPlayerNames() {
return new ArrayList<>(ProxyServer.getInstance().getPlayers().stream().map(ProxiedPlayer::getName).toList());
}
@Override
public String getNameByUUID(UUID uuid) {
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(uuid);
return player != null ? player.getName() : "";
}
@Override
public UUID getUUIDByName(String playerName) {
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(playerName);
return player != null ? player.getUniqueId() : null;
}
@Override
public List<String> getServerNames() {
return new ArrayList<>(ProxyServer.getInstance().getServers().keySet().stream().toList());
}
@Override
public List<String> getFormattedPluginNames(String format) {
List<String> pluginNames = new ArrayList<>();
for (Plugin plugin : ProxyServer.getInstance().getPluginManager().getPlugins()) {
PluginDescription description = plugin.getDescription();
pluginNames.add(
format.replace("%n", description.getName())
.replace("%v", description.getVersion())
);
}
return pluginNames;
}
@Override
public List<String> getPluginCommands(String pluginName, boolean useColons) {
return List.of();
}
public void startUpdaterTask() {
if (!Storage.ConfigSections.Settings.UPDATE.ENABLED)
return;
updaterTask = getProxy().getScheduler().schedule(this, () -> {
if (VersionComparer.get().computeComparison())
getProxy().getScheduler().cancel(updaterTask);
}, 1, Storage.ConfigSections.Settings.UPDATE.PERIOD, TimeUnit.SECONDS);
}
public static String getServerNameByPlayerUUID(UUID uuid) {
ProxiedPlayer proxiedPlayer = ProxyServer.getInstance().getPlayer(uuid);
if(proxiedPlayer == null) return null;
Server server = proxiedPlayer.getServer();
if(server == null) return null;
ServerInfo serverInfo = server.getInfo();
if(serverInfo == null) return null;
return serverInfo.getName();
}
public static Plugin getPlugin() {
return plugin;
}
public static java.util.logging.Logger getPluginLogger() {
return logger;
}
}
@@ -1,6 +1,7 @@
package de.rayzs.pat.plugin;
import de.rayzs.pat.utils.CommandsCache;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.HashMap;
import java.util.List;
@@ -8,14 +9,32 @@ import java.util.UUID;
public interface PluginLoader {
void addPermission(String permission);
void removePermission(String permission);
Object getPluginObj();
void handleReload();
boolean doesCommandExist(String command);
HashMap<String, CommandsCache> getCommandsCacheMap();
/**
* Updates commands for all players.
* Requires PAT sync on proxy for it to work!
* Non-proxy servers do not require anything additionally.
*/
void updateCommands();
void delayedPermissionsReload();
/**
* Updates commands for a certain player.
* Requires PAT sync on proxy for it to work!
* Non-proxy servers do not require anything additionally.
*/
void updateCommands(CommandSender sender);
void updateCommandCache();
HashMap<String, CommandsCache> getPerServerCommandsCacheMap();
CommandsCache getBukkitCommandsCacheMap();
void resetCommandsCache();
List<String> getServerNames();
@@ -48,6 +67,7 @@ public interface PluginLoader {
* <pre>
* %n = Plugin name
* %v = Plugin version
* </pre>
*/
List<String> getPluginNames(String format);
List<String> getFormattedPluginNames(String format);
}
@@ -1,334 +1,345 @@
package de.rayzs.pat.plugin;
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ServerConnection;
import com.velocitypowered.api.proxy.server.RegisteredServer;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.api.communication.impl.VelocityClient;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.netty.proxy.VelocityPacketAnalyzer;
import de.rayzs.pat.plugin.converter.StorageConverter;
import de.rayzs.pat.plugin.subarguments.SubArguments;
import de.rayzs.pat.plugin.process.CommandProcess;
import de.rayzs.pat.utils.CommandsCache;
import de.rayzs.pat.plugin.metrics.impl.VelocityMetrics;
import com.velocitypowered.api.scheduler.ScheduledTask;
import de.rayzs.pat.utils.configuration.Configurator;
import de.rayzs.pat.utils.configuration.updater.ConfigUpdater;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.plugin.commands.VelocityCommand;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.api.communication.Communicator;
import de.rayzs.pat.utils.adapter.LuckPermsAdapter;
import com.velocitypowered.api.proxy.ProxyServer;
import de.rayzs.pat.plugin.listeners.velocity.*;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.VersionComparer;
import de.rayzs.pat.plugin.logger.Logger;
import com.velocitypowered.api.plugin.*;
import de.rayzs.pat.api.storage.Storage;
import com.velocitypowered.api.event.*;
import de.rayzs.pat.utils.Reflection;
import java.util.concurrent.TimeUnit;
import com.google.inject.Inject;
import de.rayzs.pat.utils.response.action.ActionHandler;
import java.util.*;
@Plugin(name = "ProAntiTab",
id = "proantitab",
version = "2.3.2",
authors = "Rayzs_YT",
description = "Hides more than just your plugins.",
url = "https://www.rayzs.de/products/proantitab/page",
dependencies = {
@Dependency(id = "luckperms", optional = true),
@Dependency(id = "papiproxybridge", optional = true)
})
public class VelocityLoader implements PluginLoader {
private static VelocityLoader instance;
private static ProxyServer server;
private static org.slf4j.Logger logger;
private final EventManager manager;
private final VelocityMetrics.Factory metricsFactory;
private ScheduledTask updaterTask;
private static final HashMap<String, CommandsCache> commandsCacheMap = new HashMap<>();
@Inject
public VelocityLoader(ProxyServer server, org.slf4j.Logger logger, VelocityMetrics.Factory metricsFactory) {
VelocityLoader.instance = this;
VelocityLoader.server = server;
VelocityLoader.logger = logger;
this.manager = server.getEventManager();
this.metricsFactory = metricsFactory;
}
@Subscribe
public void onProxyInitialization(ProxyInitializeEvent event) {
PluginContainer pluginContainer = server.getPluginManager().getPlugin("proantitab").get();
Configurator.createResourcedFile("files\\proxy-config.yml", "config.yml", false);
Configurator.createResourcedFile("files\\proxy-storage.yml", "storage.yml", false);
Configurator.createResourcedFile("files\\proxy-placeholders.yml", "placeholders.yml", false);
Configurator.createResourcedFile("files\\proxy-custom-responses.yml", "custom-responses.yml", false);
Reflection.initialize(server);
CommandProcess.initialize();
ConfigUpdater.initialize();
Storage.initialize(this, pluginContainer.getDescription().getVersion().get());
VersionComparer.get().setCurrentVersion(Storage.CURRENT_VERSION);
Storage.loadAll(true);
MessageTranslator.initialize();
CustomServerBrand.initialize();
GroupManager.initialize();
metricsFactory.make(this, 21638);
server.getCommandManager().register("bpat", new VelocityCommand(), "bungeeproantitab");
server.getEventManager().register(this, new VelocityBlockCommandListener());
server.getEventManager().register(this, new VelocityAntiTabListener(server));
server.getEventManager().register(this, new VelocityConnectionListener(server, this));
server.getEventManager().register(this, new VelocityPingListener(server));
startUpdaterTask();
Storage.PLUGIN_OBJECT = this;
if (server.getPluginManager().getPlugin("luckperms").isPresent())
LuckPermsAdapter.initialize();
if (server.getPluginManager().getPlugin("papiproxybridge").isPresent()) {
Storage.USE_PAPIPROXYBRIDGE = true;
Logger.info("Successfully hooked into PAPIProxyBridge!");
}
Storage.broadcastPermissionsPluginNotice();
ConfigUpdater.broadcastMissingParts();
ActionHandler.initialize();
SubArguments.initialize();
StorageConverter.initialize();
Communicator.initialize(new VelocityClient());
VelocityPacketAnalyzer.injectAll();
}
public static org.slf4j.Logger getPluginLogger() {
return logger;
}
@Override
public void delayedPermissionsReload() {
server.getScheduler().buildTask(VelocityLoader.instance, () -> {
PermissionUtil.reloadPermissions();
Storage.getLoader().updateCommandCache();
}).delay(1, TimeUnit.SECONDS).schedule();
}
public static void delayedPlayerReload(UUID uuid) {
server.getScheduler().buildTask(VelocityLoader.instance, () -> {
String serverName = Storage.getLoader().getPlayerServerName(uuid);
List<String> commands = new ArrayList<>(SubArguments.getServerCommands(serverName));
commands.addAll(SubArguments.getGroupCommands(uuid, serverName));
PATEventHandler.callUpdatePlayerCommandsEvents(uuid, commands, true);
}).delay(1, TimeUnit.SECONDS).schedule();
}
@Override
public void handleReload() {}
@Override
public boolean doesCommandExist(String command) {
return false;
}
@Override
public List<String> getAllCommands(boolean useColons) {
return List.of();
}
@Override
public Object getConsoleSender() {
return server.getConsoleCommandSource();
}
@Override
public Object getPlayerObjByName(String name) {
return server.getPlayer(name).orElse(null);
}
@Override
public Object getPlayerObjByUUID(UUID uuid) {
return server.getPlayer(uuid).orElse(null);
}
@Override
public void updateCommandCache() {
new ArrayList<>(commandsCacheMap.values()).forEach(CommandsCache::reset);
}
@Override
public HashMap<String, CommandsCache> getCommandsCacheMap() {
return commandsCacheMap;
}
@Override
public boolean isPlayerOnline(String playerName) {
return server.getPlayer(playerName).isPresent();
}
@Override
public boolean doesPlayerExist(String playerName) {
return isPlayerOnline(playerName);
}
@Override
public List<UUID> getPlayerIdsByServer(String serverName) {
List<UUID> uuids = new ArrayList<>();
getServerNames().stream()
.filter(originServerName -> Storage.isServer(serverName, originServerName))
.forEach(originServerName -> {
Optional<RegisteredServer> optionalRegServerInfo = server.getServer(serverName);
if (optionalRegServerInfo.isEmpty())
return;
RegisteredServer regServerInfo = optionalRegServerInfo.get();
uuids.addAll(regServerInfo.getPlayersConnected().stream().map(Player::getUniqueId).toList());
});
return uuids;
}
@Override
public String getPlayerServerName(UUID uuid) {
final String cachedServerName = Storage.getCachedPlayerServername(uuid);
if (cachedServerName != null) {
return cachedServerName;
}
Optional<Player> optPlayer = server.getPlayer(uuid);
if (optPlayer.isEmpty())
return null;
Player player = optPlayer.get();
Optional<ServerConnection> optConnection = player.getCurrentServer();
if (optConnection.isEmpty()) {
return null;
}
ServerConnection connection = optConnection.get();
return connection.getServer().getServerInfo().getName();
}
@Override
public List<UUID> getPlayerIds() {
return server.getAllPlayers().stream().map(Player::getUniqueId).toList();
}
@Override
public List<String> getOnlinePlayerNames(String serverName) {
return server.getAllPlayers().stream()
.filter(player -> {
Optional<ServerConnection> optConnection = player.getCurrentServer();
if (optConnection.isEmpty())
return false;
ServerConnection connection = optConnection.get();
return connection.getServer().getServerInfo().getName().equalsIgnoreCase(serverName);
}).map(Player::getUsername).toList();
}
@Override
public List<String> getOnlinePlayerNames() {
return server.getAllPlayers().stream().map(Player::getUsername).toList();
}
@Override
public List<String> getOfflinePlayerNames() {
return server.getAllPlayers().stream().map(Player::getUsername).toList();
}
public List<String> getPlayerNames() {
return server.getAllPlayers().stream().map(Player::getUsername).toList();
}
@Override
public String getNameByUUID(UUID uuid) {
Player player = server.getPlayer(uuid).orElse(null);
return player != null ? player.getUsername() : "";
}
@Override
public UUID getUUIDByName(String playerName) {
Player player = server.getPlayer(playerName).orElse(null);
return player != null ? player.getUniqueId() : null;
}
@Override
public List<String> getServerNames() {
return new ArrayList<>(server.getAllServers().stream().map(registeredServer -> registeredServer.getServerInfo().getName()).toList());
}
@Override
public List<String> getPluginNames(String format) {
List<String> pluginNames = new ArrayList<>();
for (PluginContainer plugin : server.getPluginManager().getPlugins()) {
PluginDescription description = plugin.getDescription();
String pluginName = description.getName().orElse("/");
String version = description.getVersion().orElse("/");
pluginNames.add(
format.replace("%n", pluginName)
.replace("%v", version)
);
}
return pluginNames;
}
@Override
public List<String> getPluginCommands(String pluginName, boolean useColons) {
return List.of();
}
public void startUpdaterTask() {
if (!Storage.ConfigSections.Settings.UPDATE.ENABLED) return;
updaterTask = server.getScheduler().buildTask(this, () -> {
if (VersionComparer.get().computeComparison())
updaterTask.cancel();
}).delay(1, TimeUnit.SECONDS).repeat(Storage.ConfigSections.Settings.UPDATE.PERIOD, TimeUnit.SECONDS).schedule();
}
public static ProxyServer getServer() {
return server;
}
public static VelocityLoader getInstance() {
return instance;
}
}
package de.rayzs.pat.plugin;
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ServerConnection;
import com.velocitypowered.api.proxy.server.RegisteredServer;
import de.rayzs.pat.plugin.system.communication.cph.impl.VelocityCommunicationHandler;
import de.rayzs.pat.plugin.system.serverbrand.CustomServerBrand;
import de.rayzs.pat.plugin.system.communication.pmc.impl.VelocityPluginMessageClient;
import de.rayzs.pat.plugin.packetanalyzer.proxy.VelocityPacketAnalyzer;
import de.rayzs.pat.plugin.system.converter.StorageConverter;
import de.rayzs.pat.plugin.system.serverbrand.impl.VelocityServerBrand;
import de.rayzs.pat.plugin.command.CommandProcess;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.CommandsCache;
import de.rayzs.pat.plugin.metrics.impl.VelocityMetrics;
import com.velocitypowered.api.scheduler.ScheduledTask;
import de.rayzs.pat.utils.configuration.Configurator;
import de.rayzs.pat.utils.configuration.updater.ConfigUpdater;
import de.rayzs.pat.plugin.command.impl.VelocityCommand;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.plugin.system.communication.Communicator;
import de.rayzs.pat.utils.hooks.LuckPermsHook;
import com.velocitypowered.api.proxy.ProxyServer;
import de.rayzs.pat.plugin.listeners.velocity.*;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.VersionComparer;
import de.rayzs.pat.plugin.logger.Logger;
import com.velocitypowered.api.plugin.*;
import de.rayzs.pat.api.storage.Storage;
import com.velocitypowered.api.event.*;
import de.rayzs.pat.utils.Reflection;
import java.util.concurrent.TimeUnit;
import com.google.inject.Inject;
import de.rayzs.pat.utils.response.ResponseHandler;
import de.rayzs.pat.utils.response.action.ActionHandler;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.*;
@Plugin(name = "ProAntiTab",
id = "proantitab",
version = "2.4.3",
authors = "Rayzs_YT",
description = "Hides more than just your plugins.",
url = "https://www.rayzs.de/products/proantitab/page",
dependencies = {
@Dependency(id = "luckperms", optional = true),
@Dependency(id = "papiproxybridge", optional = true)
})
public class VelocityLoader implements PluginLoader {
private static VelocityLoader instance;
private static ProxyServer server;
private static org.slf4j.Logger logger;
private final EventManager manager;
private final VelocityMetrics.Factory metricsFactory;
private ScheduledTask updaterTask;
private static final HashMap<String, CommandsCache> commandsCacheMap = new HashMap<>();
@Inject
public VelocityLoader(ProxyServer server, org.slf4j.Logger logger, VelocityMetrics.Factory metricsFactory) {
VelocityLoader.instance = this;
VelocityLoader.server = server;
VelocityLoader.logger = logger;
this.manager = server.getEventManager();
this.metricsFactory = metricsFactory;
}
@Subscribe
public void onProxyInitialization(ProxyInitializeEvent event) {
PluginContainer pluginContainer = server.getPluginManager().getPlugin("proantitab").get();
Configurator.createResourcedFile("files\\proxy-config.yml", "config.yml", false);
Configurator.createResourcedFile("files\\proxy-storage.yml", "storage.yml", false);
Configurator.createResourcedFile("files\\proxy-placeholders.yml", "placeholders.yml", false);
Configurator.createResourcedFile("files\\proxy-custom-responses.yml", "custom-responses.yml", false);
Reflection.initialize(server);
CommandProcess.initialize();
ConfigUpdater.initialize();
Storage.initialize(this, pluginContainer.getDescription().getVersion().get());
VersionComparer.get().setCurrentVersion(Storage.CURRENT_VERSION);
Storage.loadAll(true);
MessageTranslator.initialize();
GroupManager.initialize();
metricsFactory.make(this, 21638);
server.getCommandManager().register("bpat", new VelocityCommand(), "bungeeproantitab");
server.getEventManager().register(this, new VelocityBlockCommandListener());
server.getEventManager().register(this, new VelocityAntiTabListener(server));
server.getEventManager().register(this, new VelocityConnectionListener(server, this));
server.getEventManager().register(this, new VelocityPingListener(server));
startUpdaterTask();
if (server.getPluginManager().getPlugin("luckperms").isPresent()) {
server.getEventManager().register(this, new VelocityLuckPermsWarning(server));
LuckPermsHook.initialize();
}
if (server.getPluginManager().getPlugin("papiproxybridge").isPresent()) {
Storage.USE_PAPIPROXYBRIDGE = true;
Logger.info("Successfully hooked into PAPIProxyBridge!");
}
Storage.broadcastPermissionsPluginNotice();
ConfigUpdater.broadcastMissingParts();
ActionHandler.initialize();
SubArgument.initialize();
ResponseHandler.update();
StorageConverter.initialize();
CustomServerBrand.initialize(new VelocityServerBrand());
Communicator.initialize(new VelocityPluginMessageClient(), new VelocityCommunicationHandler());
VelocityPacketAnalyzer.injectAll();
}
public static org.slf4j.Logger getPluginLogger() {
return logger;
}
@Override
public void addPermission(String permission) {}
@Override
public void removePermission(String permission) {}
@Override
public Object getPluginObj() {
return instance;
}
@Override
public void updateCommands() {
Communicator.Proxy2Backend.sendUpdateCommand();
}
@Override
public void updateCommands(CommandSender sender) {
Communicator.Proxy2Backend.sendUpdateCommand(sender.getUniqueId(), sender.getServerName());
}
@Override
public void handleReload() {}
@Override
public boolean doesCommandExist(String command) {
return false;
}
@Override
public List<String> getAllCommands(boolean useColons) {
return List.of();
}
@Override
public Object getConsoleSender() {
return server.getConsoleCommandSource();
}
@Override
public Object getPlayerObjByName(String name) {
return server.getPlayer(name).orElse(null);
}
@Override
public Object getPlayerObjByUUID(UUID uuid) {
return server.getPlayer(uuid).orElse(null);
}
@Override
public void resetCommandsCache() {
new ArrayList<>(commandsCacheMap.values()).forEach(CommandsCache::reset);
}
@Override
public HashMap<String, CommandsCache> getPerServerCommandsCacheMap() {
return commandsCacheMap;
}
@Override
public CommandsCache getBukkitCommandsCacheMap() {
return null;
}
@Override
public boolean isPlayerOnline(String playerName) {
return server.getPlayer(playerName).isPresent();
}
@Override
public boolean doesPlayerExist(String playerName) {
return isPlayerOnline(playerName);
}
@Override
public List<UUID> getPlayerIdsByServer(String serverName) {
List<UUID> uuids = new ArrayList<>();
getServerNames().stream()
.filter(originServerName -> Storage.isServer(serverName, originServerName))
.forEach(originServerName -> {
Optional<RegisteredServer> optionalRegServerInfo = server.getServer(serverName);
if (optionalRegServerInfo.isEmpty())
return;
RegisteredServer regServerInfo = optionalRegServerInfo.get();
uuids.addAll(regServerInfo.getPlayersConnected().stream().map(Player::getUniqueId).toList());
});
return uuids;
}
@Override
public String getPlayerServerName(UUID uuid) {
final String cachedServerName = Storage.getCachedPlayerServername(uuid);
if (cachedServerName != null) {
return cachedServerName;
}
Optional<Player> optPlayer = server.getPlayer(uuid);
if (optPlayer.isEmpty())
return null;
Player player = optPlayer.get();
Optional<ServerConnection> optConnection = player.getCurrentServer();
if (optConnection.isEmpty()) {
return null;
}
ServerConnection connection = optConnection.get();
return connection.getServer().getServerInfo().getName();
}
@Override
public List<UUID> getPlayerIds() {
return server.getAllPlayers().stream().map(Player::getUniqueId).toList();
}
@Override
public List<String> getOnlinePlayerNames(String serverName) {
return server.getAllPlayers().stream()
.filter(player -> {
Optional<ServerConnection> optConnection = player.getCurrentServer();
if (optConnection.isEmpty())
return false;
ServerConnection connection = optConnection.get();
return connection.getServer().getServerInfo().getName().equalsIgnoreCase(serverName);
}).map(Player::getUsername).toList();
}
@Override
public List<String> getOnlinePlayerNames() {
return server.getAllPlayers().stream().map(Player::getUsername).toList();
}
@Override
public List<String> getOfflinePlayerNames() {
return server.getAllPlayers().stream().map(Player::getUsername).toList();
}
public List<String> getPlayerNames() {
return server.getAllPlayers().stream().map(Player::getUsername).toList();
}
@Override
public String getNameByUUID(UUID uuid) {
Player player = server.getPlayer(uuid).orElse(null);
return player != null ? player.getUsername() : "";
}
@Override
public UUID getUUIDByName(String playerName) {
Player player = server.getPlayer(playerName).orElse(null);
return player != null ? player.getUniqueId() : null;
}
@Override
public List<String> getServerNames() {
return new ArrayList<>(server.getAllServers().stream().map(registeredServer -> registeredServer.getServerInfo().getName()).toList());
}
@Override
public List<String> getFormattedPluginNames(String format) {
List<String> pluginNames = new ArrayList<>();
for (PluginContainer plugin : server.getPluginManager().getPlugins()) {
PluginDescription description = plugin.getDescription();
String pluginName = description.getName().orElse("/");
String version = description.getVersion().orElse("/");
pluginNames.add(
format.replace("%n", pluginName)
.replace("%v", version)
);
}
return pluginNames;
}
@Override
public List<String> getPluginCommands(String pluginName, boolean useColons) {
return List.of();
}
public void startUpdaterTask() {
if (!Storage.ConfigSections.Settings.UPDATE.ENABLED) return;
updaterTask = server.getScheduler().buildTask(this, () -> {
if (VersionComparer.get().computeComparison())
updaterTask.cancel();
}).delay(1, TimeUnit.SECONDS).repeat(Storage.ConfigSections.Settings.UPDATE.PERIOD, TimeUnit.SECONDS).schedule();
}
public static ProxyServer getServer() {
return server;
}
public static VelocityLoader getInstance() {
return instance;
}
}
@@ -1,256 +1,263 @@
package de.rayzs.pat.plugin.process;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.process.impl.local.info.*;
import de.rayzs.pat.plugin.process.impl.local.modify.*;
import de.rayzs.pat.plugin.process.impl.local.modify.list.ListCommand;
import de.rayzs.pat.plugin.process.impl.local.modify.list.ListGroupsCommand;
import de.rayzs.pat.plugin.process.impl.local.modify.list.ListPrioritiesCommand;
import de.rayzs.pat.plugin.process.impl.local.system.NotifyCommand;
import de.rayzs.pat.plugin.process.impl.local.system.PostDebugCommand;
import de.rayzs.pat.plugin.process.impl.local.system.ReloadCommand;
import de.rayzs.pat.plugin.process.impl.local.system.UpdateCommand;
import de.rayzs.pat.plugin.process.impl.server.ServAddCommand;
import de.rayzs.pat.plugin.process.impl.server.ServClearCommand;
import de.rayzs.pat.plugin.process.impl.server.ServRemoveCommand;
import de.rayzs.pat.plugin.process.impl.server.list.ServListCommand;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.*;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import java.util.*;
public class CommandProcess {
private static final List<ProCommand> COMMANDS = new ArrayList<>();
public static void initialize() {
COMMANDS.add(new SetPriorityCommand());
COMMANDS.add(new NotifyCommand());
COMMANDS.add(new AddCommand());
COMMANDS.add(new RemoveCommand());
COMMANDS.add(new ClearCommand());
COMMANDS.add(new ConvertCommand());
if (!Reflection.isProxyServer()) {
COMMANDS.add(new ExtractCommand());
}
COMMANDS.add(new CreateGroupCommand());
COMMANDS.add(new DeleteGroupCommand());
COMMANDS.add(new ListCommand());
COMMANDS.add(new ListGroupsCommand());
COMMANDS.add(new ListPrioritiesCommand());
COMMANDS.add(new StatsCommand());
COMMANDS.add(new InfoCommand());
COMMANDS.add(new PermsCommand());
COMMANDS.add(new PostDebugCommand());
COMMANDS.add(new UpdateCommand());
COMMANDS.add(new ReloadCommand());
// PROXY
COMMANDS.add(new ServListCommand());
COMMANDS.add(new ServAddCommand());
COMMANDS.add(new ServRemoveCommand());
COMMANDS.add(new ServClearCommand());
}
public static void handleCommand(Object senderObj, String[] args, String label) {
CommandSender sender = CommandSenderHandler.from(senderObj);
if (!PermissionUtil.hasPermissionWithResponse(sender, "use"))
return;
if (args.length == 0) {
Storage.ConfigSections.Messages.HELP.MESSAGE.getLines().forEach(line -> {
sender.sendMessage(line.replace("%label%", label));
});
return;
}
String commandName = args[0];
String[] commandArgs = new String[] {};
if (commandName.equals("serv") || commandName.equals("server")) {
if (args.length < 2) {
sender.sendMessage(Storage.ConfigSections.Messages.COMMAND_FAILED.MESSAGE);
return;
}
String servCommandName = StringUtils.getFirstArg(args[1]);
if (args.length > 2) {
commandArgs = Arrays.copyOfRange(args, 2, args.length);
}
Optional<ProCommand> optCommand = COMMANDS.stream().filter(cmd -> {
if (Reflection.isProxyServer() && cmd.isServerCommand())
return cmd.isCommand(servCommandName);
return false;
}).findFirst();
if (optCommand.isEmpty()) {
sender.sendMessage(Storage.ConfigSections.Messages.COMMAND_FAILED.MESSAGE);
return;
}
ProCommand command = optCommand.get();
if (!PermissionUtil.hasPermissionWithResponse(sender, command.getName()))
return;
if (!command.execute(sender, commandArgs)) {
sender.sendMessage(Storage.ConfigSections.Messages.COMMAND_FAILED.MESSAGE);
}
return;
}
if (args.length > 1) {
commandArgs = Arrays.copyOfRange(args, 1, args.length);
}
Optional<ProCommand> optCommand = COMMANDS.stream().filter(cmd -> {
if (!Reflection.isProxyServer() && !cmd.isProxyOnly() || Reflection.isProxyServer() && !cmd.isServerCommand())
return cmd.isCommand(commandName);
return false;
}).findFirst();
if (optCommand.isEmpty()) {
sender.sendMessage(Storage.ConfigSections.Messages.COMMAND_FAILED.MESSAGE);
return;
}
ProCommand command = optCommand.get();
if (!PermissionUtil.hasPermissionWithResponse(sender, command.getName()))
return;
if (!command.execute(sender, commandArgs)) {
sender.sendMessage(Storage.ConfigSections.Messages.COMMAND_FAILED.MESSAGE);
}
}
public static List<String> handleTabComplete(Object senderObj, String[] args) {
CommandSender sender = CommandSenderHandler.from(senderObj);
List<String> result = new ArrayList<>();
if (!PermissionUtil.hasPermission(sender, "use"))
return result;
if (args.length <= 1) {
if (Reflection.isProxyServer())
result.addAll(Arrays.asList("serv", "server"));
COMMANDS.stream()
.filter(cmd -> {
if (!Reflection.isProxyServer() && cmd.isProxyOnly())
return false;
return PermissionUtil.hasPermission(sender, cmd.getName());
})
.forEach(cmd -> {
result.add(cmd.getName());
result.addAll(cmd.getAliases());
});
} else {
String commandName = StringUtils.getFirstArg(args[0]);
String[] commandArgs;
Optional<ProCommand> optCommand;
if (commandName.equals("serv") || commandName.equals("server")) {
if (args.length == 2) {
COMMANDS.stream()
.filter(cmd -> {
if (Reflection.isProxyServer() && cmd.isServerCommand())
return PermissionUtil.hasPermission(sender, cmd.getName());
return false;
})
.forEach(cmd -> {
result.add(cmd.getName());
result.addAll(cmd.getAliases());
});
return result;
}
String servCommandName = StringUtils.getFirstArg(args[1]);
commandArgs = Arrays.copyOfRange(args, 2, args.length);
if (commandArgs.length == 1 && commandArgs[0].isBlank())
commandArgs = new String[] {};
optCommand = COMMANDS.stream().filter(cmd -> {
if (Reflection.isProxyServer() && cmd.isServerCommand()) {
return cmd.isCommand(servCommandName) && PermissionUtil.hasPermission(sender, cmd.getName());
}
return false;
}).findFirst();
} else {
commandArgs = Arrays.copyOfRange(args, 1, args.length);
if (commandArgs.length == 1 && commandArgs[0].isBlank())
commandArgs = new String[]{};
optCommand = COMMANDS.stream().filter(cmd -> {
if (!Reflection.isProxyServer() && cmd.isProxyOnly() || cmd.isServerCommand()) {
return false;
}
return cmd.isCommand(commandName);
}).findFirst();
}
if (optCommand.isPresent()) {
ProCommand command = optCommand.get();
if (PermissionUtil.hasPermission(sender, command.getName())) {
List<String> cmdCompletions = command.tabComplete(sender, commandArgs);
result.addAll(cmdCompletions != null ? cmdCompletions : List.of());
}
}
}
return result.stream().filter(suggestion -> {
if (args.length == 0)
return true;
String command = args[Math.max(0, args.length-1)].toLowerCase();
suggestion = suggestion.toLowerCase();
if (command.startsWith("\"")) {
command = command.length() == 1 ? "" : command.substring(1);
}
return suggestion.startsWith(command);
}).toList();
}
}
package de.rayzs.pat.plugin.command;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.plugin.command.commands.local.info.InfoCommand;
import de.rayzs.pat.plugin.command.commands.local.info.PermsCommand;
import de.rayzs.pat.plugin.command.commands.local.info.StatsCommand;
import de.rayzs.pat.plugin.command.commands.local.modify.*;
import de.rayzs.pat.plugin.command.commands.local.modify.list.ListCommand;
import de.rayzs.pat.plugin.command.commands.local.modify.list.ListGroupsCommand;
import de.rayzs.pat.plugin.command.commands.local.modify.list.ListPrioritiesCommand;
import de.rayzs.pat.plugin.command.commands.local.system.NotifyCommand;
import de.rayzs.pat.plugin.command.commands.local.system.PostDebugCommand;
import de.rayzs.pat.plugin.command.commands.local.system.ReloadCommand;
import de.rayzs.pat.plugin.command.commands.local.system.UpdateCommand;
import de.rayzs.pat.plugin.command.commands.server.ServAddCommand;
import de.rayzs.pat.plugin.command.commands.server.ServClearCommand;
import de.rayzs.pat.plugin.command.commands.server.ServRemoveCommand;
import de.rayzs.pat.plugin.command.commands.server.list.ServListCommand;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.*;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.*;
public class CommandProcess {
private static final List<ProCommand> COMMANDS = new ArrayList<>();
public static void initialize() {
COMMANDS.add(new SetPriorityCommand());
COMMANDS.add(new NotifyCommand());
COMMANDS.add(new AddCommand());
COMMANDS.add(new RemoveCommand());
COMMANDS.add(new ClearCommand());
COMMANDS.add(new ConvertCommand());
if (!Reflection.isProxyServer()) {
COMMANDS.add(new ExtractCommand());
}
COMMANDS.add(new CreateGroupCommand());
COMMANDS.add(new DeleteGroupCommand());
COMMANDS.add(new ListCommand());
COMMANDS.add(new ListGroupsCommand());
COMMANDS.add(new ListPrioritiesCommand());
COMMANDS.add(new StatsCommand());
COMMANDS.add(new InfoCommand());
COMMANDS.add(new PermsCommand());
COMMANDS.add(new PostDebugCommand());
COMMANDS.add(new UpdateCommand());
COMMANDS.add(new ReloadCommand());
// PROXY
COMMANDS.add(new ServListCommand());
COMMANDS.add(new ServAddCommand());
COMMANDS.add(new ServRemoveCommand());
COMMANDS.add(new ServClearCommand());
}
public static void handleCommand(Object senderObj, String[] args, String label) {
final CommandSender sender = CommandSender.from(senderObj);
final boolean isOperator = sender.isOperator();
if (!PermissionUtil.hasPermissionWithResponse(sender, "use", isOperator))
return;
if (args.length == 0) {
Storage.ConfigSections.Messages.HELP.MESSAGE.getLines().forEach(line -> {
sender.sendMessage(line.replace("%label%", label));
});
return;
}
String commandName = args[0];
String[] commandArgs = new String[] {};
if (commandName.equals("serv") || commandName.equals("server")) {
if (args.length < 2) {
sender.sendMessage(Storage.ConfigSections.Messages.COMMAND_FAILED.MESSAGE);
return;
}
String servCommandName = StringUtils.getFirstArg(args[1]);
if (args.length > 2) {
commandArgs = Arrays.copyOfRange(args, 2, args.length);
}
Optional<ProCommand> optCommand = COMMANDS.stream().filter(cmd -> {
if (Reflection.isProxyServer() && cmd.isServerCommand())
return cmd.isCommand(servCommandName);
return false;
}).findFirst();
if (optCommand.isEmpty()) {
sender.sendMessage(Storage.ConfigSections.Messages.COMMAND_FAILED.MESSAGE);
return;
}
ProCommand command = optCommand.get();
if (!PermissionUtil.hasPermissionWithResponse(sender, command.getName(), isOperator))
return;
if (!command.execute(sender, commandArgs)) {
sender.sendMessage(Storage.ConfigSections.Messages.COMMAND_FAILED.MESSAGE);
}
return;
}
if (args.length > 1) {
commandArgs = Arrays.copyOfRange(args, 1, args.length);
}
Optional<ProCommand> optCommand = COMMANDS.stream().filter(cmd -> {
if (!Reflection.isProxyServer() && !cmd.isProxyOnly() || Reflection.isProxyServer() && !cmd.isServerCommand())
return cmd.isCommand(commandName);
return false;
}).findFirst();
if (optCommand.isEmpty()) {
sender.sendMessage(Storage.ConfigSections.Messages.COMMAND_FAILED.MESSAGE);
return;
}
ProCommand command = optCommand.get();
if (!PermissionUtil.hasPermissionWithResponse(sender, command.getName(), isOperator))
return;
if (!command.execute(sender, commandArgs)) {
sender.sendMessage(Storage.ConfigSections.Messages.COMMAND_FAILED.MESSAGE);
}
}
public static List<String> handleTabComplete(Object senderObj, String[] args) {
final CommandSender sender = CommandSender.from(senderObj);
final boolean isOperator = sender.isOperator();
final List<String> result = new ArrayList<>();
if (!PermissionUtil.hasPermission(sender, "use", isOperator))
return result;
if (args.length <= 1) {
if (Reflection.isProxyServer())
result.addAll(Arrays.asList("serv", "server"));
COMMANDS.stream()
.filter(cmd -> {
if (!Reflection.isProxyServer() && cmd.isProxyOnly())
return false;
return PermissionUtil.hasPermission(sender, cmd.getName(), isOperator);
})
.forEach(cmd -> {
result.add(cmd.getName());
result.addAll(cmd.getAliases());
});
} else {
String commandName = StringUtils.getFirstArg(args[0]);
String[] commandArgs;
Optional<ProCommand> optCommand;
if (commandName.equals("serv") || commandName.equals("server")) {
if (args.length == 2) {
COMMANDS.stream()
.filter(cmd -> {
if (Reflection.isProxyServer() && cmd.isServerCommand())
return PermissionUtil.hasPermission(sender, cmd.getName(), isOperator);
return false;
})
.forEach(cmd -> {
result.add(cmd.getName());
result.addAll(cmd.getAliases());
});
return result;
}
String servCommandName = StringUtils.getFirstArg(args[1]);
commandArgs = Arrays.copyOfRange(args, 2, args.length);
if (commandArgs.length == 1 && commandArgs[0].isBlank())
commandArgs = new String[] {};
optCommand = COMMANDS.stream().filter(cmd -> {
if (Reflection.isProxyServer() && cmd.isServerCommand()) {
return cmd.isCommand(servCommandName) && PermissionUtil.hasPermission(sender, cmd.getName(), isOperator);
}
return false;
}).findFirst();
} else {
commandArgs = Arrays.copyOfRange(args, 1, args.length);
if (commandArgs.length == 1 && commandArgs[0].isBlank())
commandArgs = new String[]{};
optCommand = COMMANDS.stream().filter(cmd -> {
if (!Reflection.isProxyServer() && cmd.isProxyOnly() || cmd.isServerCommand()) {
return false;
}
return cmd.isCommand(commandName);
}).findFirst();
}
if (optCommand.isPresent()) {
ProCommand command = optCommand.get();
if (PermissionUtil.hasPermission(sender, command.getName(), isOperator)) {
List<String> cmdCompletions = command.tabComplete(sender, commandArgs);
result.addAll(cmdCompletions != null ? cmdCompletions : List.of());
}
}
}
return result.stream().filter(suggestion -> {
if (args.length == 0)
return true;
String command = args[Math.max(0, args.length-1)].toLowerCase();
suggestion = suggestion.toLowerCase();
if (command.startsWith("\"")) {
command = command.length() == 1 ? "" : command.substring(1);
}
return suggestion.startsWith(command);
}).toList();
}
public static List<ProCommand> getCommands() {
return COMMANDS;
}
}
@@ -1,4 +1,4 @@
package de.rayzs.pat.api.command;
package de.rayzs.pat.plugin.command.commands;
import de.rayzs.pat.utils.*;
import de.rayzs.pat.utils.sender.CommandSender;
@@ -1,8 +1,8 @@
package de.rayzs.pat.plugin.process.impl.local.info;
package de.rayzs.pat.plugin.command.commands.local.info;
import de.rayzs.pat.api.communication.BackendUpdater;
import de.rayzs.pat.api.communication.Communicator;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.system.communication.BackendUpdater;
import de.rayzs.pat.plugin.system.communication.Communicator;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.*;
import de.rayzs.pat.utils.sender.CommandSender;
@@ -35,7 +35,7 @@ public class InfoCommand extends ProCommand {
if (!Reflection.isProxyServer()
&& !BackendUpdater.isConnected()
&& !BackendUpdater.get().isConnected()
&& Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED)
{
syncTime = Storage.ConfigSections.Messages.INFO.SYNC_WAITING;
@@ -1,7 +1,7 @@
package de.rayzs.pat.plugin.process.impl.local.info;
package de.rayzs.pat.plugin.command.commands.local.info;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.*;
@@ -1,8 +1,8 @@
package de.rayzs.pat.plugin.process.impl.local.info;
package de.rayzs.pat.plugin.command.commands.local.info;
import de.rayzs.pat.api.communication.client.ClientInfo;
import de.rayzs.pat.api.communication.Communicator;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.system.communication.client.Client;
import de.rayzs.pat.plugin.system.communication.Communicator;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.*;
import de.rayzs.pat.utils.sender.CommandSender;
@@ -31,14 +31,14 @@ public class StatsCommand extends ProCommand {
return true;
}
final Set<ClientInfo> clients = Communicator.get().getClients();
final Iterator<ClientInfo> iterator = clients.iterator();
final Set<Client> clients = Communicator.get().getClients();
final Iterator<Client> iterator = clients.iterator();
boolean tmpFound = false;
StringBuilder statsBuilder = new StringBuilder();
while (iterator.hasNext()) {
ClientInfo client = iterator.next();
Client client = iterator.next();
if (!tmpFound) {
tmpFound = true;
@@ -1,10 +1,11 @@
package de.rayzs.pat.plugin.process.impl.local.modify;
package de.rayzs.pat.plugin.command.commands.local.modify;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.api.storage.blacklist.impl.GroupBlacklist;
import de.rayzs.pat.plugin.BukkitLoader;
import de.rayzs.pat.utils.group.*;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.*;
import de.rayzs.pat.utils.sender.CommandSender;
@@ -1,9 +1,11 @@
package de.rayzs.pat.plugin.process.impl.local.modify;
package de.rayzs.pat.plugin.command.commands.local.modify;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import java.util.concurrent.TimeUnit;
import de.rayzs.pat.utils.group.*;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.*;
import de.rayzs.pat.utils.sender.CommandSender;
@@ -1,9 +1,9 @@
package de.rayzs.pat.plugin.process.impl.local.modify;
package de.rayzs.pat.plugin.command.commands.local.modify;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.converter.Converter;
import de.rayzs.pat.plugin.converter.StorageConverter;
import de.rayzs.pat.plugin.system.converter.Converter;
import de.rayzs.pat.plugin.system.converter.StorageConverter;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.sender.CommandSender;
@@ -25,7 +25,7 @@ public class ConvertCommand extends ProCommand {
return false;
String converterName = args[0];
Converter converter = StorageConverter.getConverter(converterName);
Converter converter = StorageConverter.get().getConverter(converterName);
if (converter == null) {
sender.sendMessage(StringUtils.replace(Storage.ConfigSections.Messages.CONVERT.INVALID_CONVERTER,
"%converter%", converterName)
@@ -46,6 +46,6 @@ public class ConvertCommand extends ProCommand {
@Override
public List<String> tabComplete(CommandSender sender, String[] args) {
return StorageConverter.getConverters().stream().toList();
return StorageConverter.get().getConverters().stream().toList();
}
}
@@ -1,6 +1,6 @@
package de.rayzs.pat.plugin.process.impl.local.modify;
package de.rayzs.pat.plugin.command.commands.local.modify;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.Reflection;
@@ -34,12 +34,13 @@ public class CreateGroupCommand extends ProCommand {
return true;
}
String groupName = args[0];
String groupName = args[0].toLowerCase();
Group group = GroupManager.getGroupByName(groupName);
boolean registered = group != null;
if (!registered) {
GroupManager.registerGroup(groupName);
Storage.getLoader().addPermission("group." + groupName);
} else groupName = group.getGroupName();
String message = registered ? Storage.ConfigSections.Messages.GROUP.ALREADY_EXIST : Storage.ConfigSections.Messages.GROUP.CREATE;
@@ -1,6 +1,6 @@
package de.rayzs.pat.plugin.process.impl.local.modify;
package de.rayzs.pat.plugin.command.commands.local.modify;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.ExpireCache;
@@ -58,6 +58,7 @@ public class DeleteGroupCommand extends ProCommand {
}
GroupManager.unregisterGroup(groupName);
Storage.getLoader().removePermission("group." + group.getGroupName());
CONFIRMATION.remove(sender.getUniqueId());
String message = registered ? Storage.ConfigSections.Messages.GROUP.DELETE : Storage.ConfigSections.Messages.GROUP.DOES_NOT_EXIST;
@@ -1,6 +1,6 @@
package de.rayzs.pat.plugin.process.impl.local.modify;
package de.rayzs.pat.plugin.command.commands.local.modify;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.api.storage.storages.BlacklistStorage;
import de.rayzs.pat.utils.StringUtils;
@@ -88,7 +88,7 @@ public class ExtractCommand extends ProCommand {
return true;
}
List<String> pluginNames = Storage.getLoader().getPluginNames("%n");
List<String> pluginNames = Storage.getLoader().getFormattedPluginNames("%n");
boolean pluginFound = false, all = pluginName.equalsIgnoreCase("*");
for (String name : pluginNames) {
@@ -136,7 +136,7 @@ public class ExtractCommand extends ProCommand {
final int length = args.length;
if (length <= 1) {
final List<String> suggestions = Storage.getLoader().getPluginNames("%n");
final List<String> suggestions = Storage.getLoader().getFormattedPluginNames("%n");
suggestions.add("*");
return suggestions;
@@ -1,9 +1,10 @@
package de.rayzs.pat.plugin.process.impl.local.modify;
package de.rayzs.pat.plugin.command.commands.local.modify;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.api.storage.blacklist.impl.GroupBlacklist;
import de.rayzs.pat.utils.group.*;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.*;
import de.rayzs.pat.utils.sender.CommandSender;
@@ -1,6 +1,6 @@
package de.rayzs.pat.plugin.process.impl.local.modify;
package de.rayzs.pat.plugin.command.commands.local.modify;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.Reflection;
@@ -1,10 +1,12 @@
package de.rayzs.pat.plugin.process.impl.local.modify.list;
package de.rayzs.pat.plugin.command.commands.local.modify.list;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.group.*;
import java.util.List;
public class ListCommand extends ProCommand {
@@ -1,7 +1,7 @@
package de.rayzs.pat.plugin.process.impl.local.modify.list;
package de.rayzs.pat.plugin.command.commands.local.modify.list;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.*;
import de.rayzs.pat.utils.sender.CommandSender;
@@ -1,6 +1,6 @@
package de.rayzs.pat.plugin.process.impl.local.modify.list;
package de.rayzs.pat.plugin.command.commands.local.modify.list;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.StringUtils;
@@ -1,6 +1,6 @@
package de.rayzs.pat.plugin.process.impl.local.system;
package de.rayzs.pat.plugin.command.commands.local.system;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.Reflection;
@@ -1,6 +1,6 @@
package de.rayzs.pat.plugin.process.impl.local.system;
package de.rayzs.pat.plugin.command.commands.local.system;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.api.storage.Storage;
@@ -1,14 +1,9 @@
package de.rayzs.pat.plugin.process.impl.local.system;
package de.rayzs.pat.plugin.command.commands.local.system;
import de.rayzs.pat.api.communication.BackendUpdater;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.api.storage.blacklist.impl.GeneralBlacklist;
import de.rayzs.pat.utils.configuration.updater.ConfigUpdater;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.Reflection;
import java.util.List;
public class ReloadCommand extends ProCommand {
@@ -1,13 +1,9 @@
package de.rayzs.pat.plugin.process.impl.local.system;
package de.rayzs.pat.plugin.command.commands.local.system;
import de.rayzs.pat.api.communication.Communicator;
import de.rayzs.pat.plugin.listeners.bukkit.BukkitAntiTabListener;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import java.util.*;
@@ -27,18 +23,14 @@ public class UpdateCommand extends ProCommand {
Object playerObj = Storage.getLoader().getPlayerObjByName(name);
if (playerObj != null) {
CommandSender s = CommandSenderHandler.from(playerObj);
CommandSender s = CommandSender.from(playerObj);
assert s != null;
Objects.requireNonNull(s);
PermissionUtil.reloadPermissions(s);
}
});
if (!Reflection.isProxyServer() && Reflection.isAtLeast(1, 13)) {
BukkitAntiTabListener.handleTabCompletion();
} else if (Reflection.isProxyServer()) {
Communicator.Proxy2Backend.sendUpdateCommand();
}
Storage.getLoader().updateCommands();
sender.sendMessage(Storage.ConfigSections.Messages.UPDATE_PERMISSIONS.UPDATE_ALL);
return true;
@@ -47,7 +39,7 @@ public class UpdateCommand extends ProCommand {
String name = args[0];
UUID uuid = Storage.getLoader().getUUIDByName(name);
Object playerObj = Storage.getLoader().getPlayerObjByUUID(uuid);
CommandSender targetSender = CommandSenderHandler.from(playerObj);
CommandSender targetSender = CommandSender.from(playerObj);
boolean exist = targetSender != null;
@@ -62,15 +54,8 @@ public class UpdateCommand extends ProCommand {
message = message.replace("%target%", name);
if (exist) {
PermissionUtil.reloadPermissions(targetSender);
if (!Reflection.isProxyServer() && Reflection.isAtLeast(1, 13)) {
BukkitAntiTabListener.handleTabCompletion(uuid);
} else if (Reflection.isProxyServer()) {
Communicator.Proxy2Backend.sendUpdateCommand(uuid, targetSender.getServerName());
}
Storage.getLoader().updateCommands(targetSender);
}
sender.sendMessage(message);
@@ -1,6 +1,6 @@
package de.rayzs.pat.plugin.process.impl.server;
package de.rayzs.pat.plugin.command.commands.server;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.api.storage.blacklist.impl.GeneralBlacklist;
import de.rayzs.pat.api.storage.blacklist.impl.GroupBlacklist;
@@ -1,6 +1,6 @@
package de.rayzs.pat.plugin.process.impl.server;
package de.rayzs.pat.plugin.command.commands.server;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.sender.CommandSender;
@@ -1,6 +1,6 @@
package de.rayzs.pat.plugin.process.impl.server;
package de.rayzs.pat.plugin.command.commands.server;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.api.storage.blacklist.impl.GeneralBlacklist;
import de.rayzs.pat.api.storage.blacklist.impl.GroupBlacklist;
@@ -1,6 +1,6 @@
package de.rayzs.pat.plugin.process.impl.server.list;
package de.rayzs.pat.plugin.command.commands.server.list;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.plugin.command.commands.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.api.storage.blacklist.impl.GeneralBlacklist;
import de.rayzs.pat.utils.sender.CommandSender;
@@ -1,27 +1,27 @@
package de.rayzs.pat.plugin.commands;
import de.rayzs.pat.plugin.process.CommandProcess;
import org.bukkit.entity.Player;
import org.bukkit.command.*;
import java.util.List;
public class BukkitCommand implements CommandExecutor, TabCompleter {
@Override
public boolean onCommand(CommandSender commandSender, Command command, String label, String[] strings) {
if(commandSender instanceof Player) {
Player player = (Player) commandSender;
CommandProcess.handleCommand(player, strings, label);
return true;
}
CommandProcess.handleCommand(commandSender, strings, label);
return true;
}
@Override
public List<String> onTabComplete(CommandSender commandSender, Command command, String label, String[] strings) {
return CommandProcess.handleTabComplete(commandSender, strings);
}
}
package de.rayzs.pat.plugin.command.impl;
import de.rayzs.pat.plugin.command.CommandProcess;
import org.bukkit.entity.Player;
import org.bukkit.command.*;
import java.util.List;
public class BukkitCommand implements CommandExecutor, TabCompleter {
@Override
public boolean onCommand(CommandSender commandSender, Command command, String label, String[] strings) {
if (commandSender instanceof Player) {
Player player = (Player) commandSender;
CommandProcess.handleCommand(player, strings, label);
return true;
}
CommandProcess.handleCommand(commandSender, strings, label);
return true;
}
@Override
public List<String> onTabComplete(CommandSender commandSender, Command command, String label, String[] strings) {
return CommandProcess.handleTabComplete(commandSender, strings);
}
}
@@ -1,22 +1,22 @@
package de.rayzs.pat.plugin.commands;
import de.rayzs.pat.plugin.process.CommandProcess;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.plugin.*;
public class BungeeCommand extends Command implements TabExecutor {
public BungeeCommand(String name) {
super(name);
}
@Override
public void execute(CommandSender commandSender, String[] strings) {
CommandProcess.handleCommand(commandSender, strings, "bpat");
}
@Override
public Iterable<String> onTabComplete(CommandSender commandSender, String[] strings) {
return CommandProcess.handleTabComplete(commandSender, strings);
}
}
package de.rayzs.pat.plugin.command.impl;
import de.rayzs.pat.plugin.command.CommandProcess;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.plugin.*;
public class BungeeCommand extends Command implements TabExecutor {
public BungeeCommand(String name, String permission, String... aliases) {
super(name, permission, aliases);
}
@Override
public void execute(CommandSender commandSender, String[] strings) {
CommandProcess.handleCommand(commandSender, strings, "bpat");
}
@Override
public Iterable<String> onTabComplete(CommandSender commandSender, String[] strings) {
return CommandProcess.handleTabComplete(commandSender, strings);
}
}
@@ -1,18 +1,23 @@
package de.rayzs.pat.plugin.commands;
import com.velocitypowered.api.command.SimpleCommand;
import de.rayzs.pat.plugin.process.CommandProcess;
import java.util.List;
public class VelocityCommand implements SimpleCommand {
@Override
public void execute(Invocation invocation) {
CommandProcess.handleCommand(invocation.source(), invocation.arguments(), "bpat");
}
@Override
public List<String> suggest(Invocation invocation) {
return CommandProcess.handleTabComplete(invocation.source(), invocation.arguments());
}
}
package de.rayzs.pat.plugin.command.impl;
import com.velocitypowered.api.command.SimpleCommand;
import de.rayzs.pat.plugin.command.CommandProcess;
import java.util.List;
public class VelocityCommand implements SimpleCommand {
@Override
public void execute(Invocation invocation) {
CommandProcess.handleCommand(invocation.source(), invocation.arguments(), "bpat");
}
@Override
public boolean hasPermission(Invocation invocation) {
return invocation.source().hasPermission("proantitab.use");
}
@Override
public List<String> suggest(Invocation invocation) {
return CommandProcess.handleTabComplete(invocation.source(), invocation.arguments());
}
}
@@ -1,40 +0,0 @@
package de.rayzs.pat.plugin.converter;
import de.rayzs.pat.plugin.converter.converters.*;
import org.jetbrains.annotations.NotNull;
import java.util.*;
public class StorageConverter {
private StorageConverter() {}
private static final Map<String, Converter> converters = new HashMap<>();
public static void initialize() {
if (!converters.isEmpty()) {
return;
}
registerConverter(new AdvancedPlHideConverter());
registerConverter(new CommandWhitelistConverter());
registerConverter(new PluginHiderPlus());
registerConverter(new PlHideFree());
registerConverter(new PlHidePro());
}
public static Set<String> getConverters() {
return converters.keySet();
}
public static Converter getConverter(@NotNull String name) {
return converters.get(name);
}
public static void registerConverter(@NotNull Converter converter) {
if (!converter.exists()) return;
converters.putIfAbsent(converter.getPluginName(), converter);
}
}
@@ -1,147 +1,98 @@
package de.rayzs.pat.plugin.listeners.bukkit;
import de.rayzs.pat.api.event.events.FilteredSuggestionEvent;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.scheduler.PATScheduler;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import org.bukkit.event.player.PlayerCommandSendEvent;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.adapter.ViaVersionAdapter;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.BukkitLoader;
import org.bukkit.entity.Player;
import de.rayzs.pat.utils.*;
import org.bukkit.event.*;
import org.bukkit.Bukkit;
import java.util.*;
public class BukkitAntiTabListener implements Listener {
private static final CommandsCache COMMANDS_CACHE = new CommandsCache();
private static final List<UUID> knownOperators = new ArrayList<>();
@EventHandler (priority = EventPriority.LOWEST)
public void onPlayerCommandSend(PlayerCommandSendEvent event) {
final Player player = event.getPlayer();
final CommandSender sender = CommandSenderHandler.from(player);
final UUID uuid = player.getUniqueId();
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
return;
}
if (player.isOp()) {
if (!knownOperators.contains(uuid)) {
knownOperators.add(uuid);
}
return;
}
if (event.getCommands().isEmpty()) {
return;
}
List<String> allCommands = getCommands();
COMMANDS_CACHE.handleCommands(allCommands);
if (!player.isOp() && knownOperators.contains(uuid)) {
knownOperators.remove(uuid);
if (Reflection.isCraftbukkit() && sender != null) {
PermissionUtil.reloadPermissions(sender);
} else {
PermissionUtil.reloadPermissions(uuid);
}
}
if (PermissionUtil.hasBypassPermission(sender)) {
return;
}
if (Reflection.isCraftbukkit() && !Bukkit.getOnlinePlayers().contains(player)) {
event.getCommands().clear();
PATScheduler.createScheduler(player::updateCommands, 10);
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<String> playerCommands = COMMANDS_CACHE.getPlayerCommands(new ArrayList<>(event.getCommands()), sender, groups);
final FilteredSuggestionEvent filteredSuggestionEvent = PATEventHandler.callFilteredSuggestionEvents(player, playerCommands);
event.getCommands().clear();
if (filteredSuggestionEvent.isCancelled()) {
return;
}
event.getCommands().addAll(filteredSuggestionEvent.getSuggestions());
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.ALWAYS_TAB_COMPLETABLE) {
event.getCommands().addAll(Storage.ConfigSections.Settings.CUSTOM_PLUGIN.COMMANDS.getLines());
}
if (Storage.ConfigSections.Settings.CUSTOM_VERSION.ALWAYS_TAB_COMPLETABLE) {
event.getCommands().addAll(Storage.ConfigSections.Settings.CUSTOM_VERSION.COMMANDS.getLines());
}
}
public static List<String> getCommands() {
return Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED
? Storage.Blacklist.getBlacklist().getCommands() : BukkitLoader.getAllCommands();
}
private static boolean notUpdatablePlayer(UUID uuid) {
return Storage.USE_VIAVERSION && Reflection.isAtLeast(1, 16) && ViaVersionAdapter.getPlayerProtocol(uuid) < 754;
}
// --------------- LUCKPERMS SECTIONS --------------- //
public static void updateCommands() {
Bukkit.getOnlinePlayers().forEach(BukkitAntiTabListener::updateCommands);
}
public static void updateCommands(Player player) {
if (!notUpdatablePlayer(player.getUniqueId()))
player.updateCommands();
}
// --------------- UPDATE SECTIONS --------------- //
public static void handleTabCompletion() {
COMMANDS_CACHE.reset();
Bukkit.getOnlinePlayers().forEach(BukkitAntiTabListener::handleTabCompletion);
}
public static void handleTabCompletion(UUID uuid) {
Player player = Bukkit.getPlayer(uuid);
if (player == null) {
return;
}
handleTabCompletion(player, getCommands());
}
public static void handleTabCompletion(Player player) {
handleTabCompletion(player, getCommands());
}
public static void handleTabCompletion(Player player, List<String> commands) {
if (notUpdatablePlayer(player.getUniqueId()))
return;
List<String> dummy = new ArrayList<>(commands);
PlayerCommandSendEvent event = new PlayerCommandSendEvent(player, dummy);
Bukkit.getPluginManager().callEvent(event);
updateCommands(player);
}
}
package de.rayzs.pat.plugin.listeners.bukkit;
import de.rayzs.pat.api.event.events.FilteredSuggestionEvent;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.scheduler.PATScheduler;
import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.event.player.PlayerCommandSendEvent;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.hooks.ViaVersionHook;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.BukkitLoader;
import org.bukkit.entity.Player;
import de.rayzs.pat.utils.*;
import org.bukkit.event.*;
import org.bukkit.Bukkit;
import java.util.*;
public class BukkitAntiTabListener implements Listener {
private final List<UUID> knownOperators = new ArrayList<>();
@EventHandler (priority = EventPriority.LOWEST)
public void onPlayerCommandSend(PlayerCommandSendEvent event) {
final Player player = event.getPlayer();
final CommandSender sender = CommandSender.from(player);
final UUID uuid = player.getUniqueId();
final boolean isOperator = player.isOp();
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
return;
}
if (player.isOp()) {
if (!knownOperators.contains(uuid)) {
knownOperators.add(uuid);
}
return;
}
if (event.getCommands().isEmpty()) {
return;
}
Storage.getLoader().getBukkitCommandsCacheMap().handleCommands(Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED
? Storage.Blacklist.getBlacklist().getCommands()
: BukkitLoader.getAllCommands()
);
if (!isOperator && knownOperators.contains(uuid)) {
knownOperators.remove(uuid);
PermissionUtil.reloadPermissions(sender);
}
if (PermissionUtil.hasBypassPermission(sender, isOperator)) {
return;
}
if (Reflection.isCraftbukkit() && !Bukkit.getOnlinePlayers().contains(player)) {
event.getCommands().clear();
PATScheduler.createScheduler(player::updateCommands, 10);
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender, isOperator);
final HashSet<String> playerCommands = Storage.getLoader().getBukkitCommandsCacheMap().getPlayerCommands(new ArrayList<>(event.getCommands()), sender, groups, isOperator);
final FilteredSuggestionEvent filteredSuggestionEvent = PATEventHandler.callFilteredSuggestionEvents(sender, playerCommands);
if (filteredSuggestionEvent.isCancelled()) {
event.getCommands().clear();
return;
}
event.getCommands().removeIf(command -> !filteredSuggestionEvent.getSuggestions().contains(command));
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.ALWAYS_TAB_COMPLETABLE) {
event.getCommands().addAll(Storage.ConfigSections.Settings.CUSTOM_PLUGIN.COMMANDS.getLines());
}
if (Storage.ConfigSections.Settings.CUSTOM_VERSION.ALWAYS_TAB_COMPLETABLE) {
event.getCommands().addAll(Storage.ConfigSections.Settings.CUSTOM_VERSION.COMMANDS.getLines());
}
}
private static boolean notUpdatablePlayer(UUID uuid) {
return Storage.USE_VIAVERSION && Reflection.isAtLeast(1, 16) && ViaVersionHook.getPlayerProtocol(uuid) < 754;
}
public void updateCommands(Player player) {
if (!notUpdatablePlayer(player.getUniqueId()))
player.updateCommands();
}
}
@@ -1,191 +1,232 @@
package de.rayzs.pat.plugin.listeners.bukkit;
import java.util.List;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.ExecuteCommandEvent;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.permission.PermissionUtil;
public class BukkitBlockCommandListener implements Listener {
@EventHandler (priority = EventPriority.HIGHEST)
public void onUnknownCommandRecognition(PlayerCommandPreprocessEvent event) {
final Player player = event.getPlayer();
final CommandSender sender = CommandSenderHandler.from(player);
final World world = player.getWorld();
String rawCommand = StringUtils.getFirstArg(event.getMessage()),
command = rawCommand.substring(1);
if (!Storage.ConfigSections.Settings.CUSTOM_UNKNOWN_COMMAND.ENABLED || event.isCancelled()) return;
if (PermissionUtil.hasBypassPermission(sender))
return;
if (Storage.getLoader().doesCommandExist(command))
return;
if (Bukkit.getHelpMap().getHelpTopic(rawCommand) != null)
return;
event.setCancelled(true);
MessageTranslator.send(player, Storage.ConfigSections.Settings.CUSTOM_UNKNOWN_COMMAND.MESSAGE, "%command%", command, "%world%", world.getName());
}
@EventHandler (priority = EventPriority.LOWEST)
public void onPlayerCommandProcess(PlayerCommandPreprocessEvent event) {
final Player player = event.getPlayer();
final CommandSender sender = CommandSenderHandler.from(player);
final String commandFirstArg = StringUtils.getFirstArg(event.getMessage());
if (Storage.ConfigSections.Settings.AUTO_LOWERCASE_COMMANDS.isCommand(commandFirstArg)) {
String command = event.getMessage();
if (command.contains(" ")) {
String[] args = command.split(" ");
args[0] = args[0].toLowerCase();
command = String.join(" ", args);
} else command = command.toLowerCase();
if (!commandFirstArg.equals(command)) {
player.chat(command);
event.setCancelled(true);
return;
}
}
World world = player.getWorld();
String command = event.getMessage(),
worldName = world.getName();
command = command.substring(1);
command = StringUtils.getFirstArg(command);
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
return;
}
if (PermissionUtil.hasBypassPermission(sender, command)) {
return;
}
final String displayCommand = StringUtils.replaceTriggers(command, "", "\\", "<", ">", "&");
List<String> notificationMessage = MessageTranslator.replaceMessageList(
Storage.ConfigSections.Messages.NOTIFICATION.ALERT,
"%player%", player.getName(),
"%command%", displayCommand,
"%world%", worldName);
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isCommand(command)) {
MessageTranslator.send(
player,
Storage.ConfigSections.Settings.CUSTOM_PLUGIN.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
event.setCancelled(true);
return;
}
if (Storage.ConfigSections.Settings.CUSTOM_VERSION.isCommand(command)) {
MessageTranslator.send(
player,
Storage.ConfigSections.Settings.CUSTOM_VERSION.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
event.setCancelled(true);
return;
}
final boolean cancelBlockedCommand = Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED;
final List<Group> groups = GroupManager.getPlayerGroups(sender);
boolean allowed = Storage.Blacklist.canPlayerAccessChat(sender, groups, command);
boolean blockedNamespace = false;
if (!Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender)) {
blockedNamespace = cancelBlockedCommand
? Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(command)
: Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesAlwaysBlock(command);
if (blockedNamespace) allowed = false;
}
if (!Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED && !blockedNamespace) {
return;
}
if (!allowed) {
ExecuteCommandEvent executeCommandEvent = PATEventHandler.callExecuteCommandEvents(
player,
event.getMessage(),
true,
!Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED
);
if (executeCommandEvent.isBlocked()) {
event.setCancelled(true);
if (!executeCommandEvent.doesNotify())
return;
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.stream().filter(uuid -> Bukkit.getServer().getPlayer(uuid) != null).forEach(uuid -> {
Player target = Bukkit.getServer().getPlayer(uuid);
MessageTranslator.send(target, notificationMessage);
});
}
if (executeCommandEvent.isCancelled())
return;
}
ExecuteCommandEvent executeCommandEvent = PATEventHandler.callExecuteCommandEvents(player, event.getMessage(), false, false);
if (executeCommandEvent.isBlocked())
event.setCancelled(true);
}
}
package de.rayzs.pat.plugin.listeners.bukkit;
import java.util.List;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.response.ResponseHandler;
import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.ExecuteCommandEvent;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.permission.PermissionUtil;
public class BukkitBlockCommandListener implements Listener {
@EventHandler (priority = EventPriority.HIGHEST)
public void onUnknownCommandRecognition(PlayerCommandPreprocessEvent event) {
final Player player = event.getPlayer();
final CommandSender sender = CommandSender.from(player);
final World world = player.getWorld();
final boolean isOperator = player.isOp();
String rawCommand = StringUtils.getFirstArg(event.getMessage()),
command = rawCommand.substring(1);
if (!Storage.ConfigSections.Settings.CUSTOM_UNKNOWN_COMMAND.ENABLED || event.isCancelled()) return;
if (PermissionUtil.hasBypassPermission(sender, isOperator))
return;
/* Removed since not necessary and only takes up unnecessary performance.
if (Storage.getLoader().doesCommandExist(command))
return;
*/
if (Bukkit.getHelpMap().getHelpTopic(rawCommand) != null)
return;
event.setCancelled(true);
MessageTranslator.send(player, Storage.ConfigSections.Settings.CUSTOM_UNKNOWN_COMMAND.MESSAGE, "%command%", command, "%world%", world.getName());
}
@EventHandler (priority = EventPriority.LOWEST)
public void onPlayerCommandProcess(PlayerCommandPreprocessEvent event) {
final Player player = event.getPlayer();
final CommandSender sender = CommandSender.from(player);
final boolean isOperator = player.isOp();
final String commandFirstArg = StringUtils.getFirstArg(event.getMessage());
if (Storage.ConfigSections.Settings.AUTO_LOWERCASE_COMMANDS.isCommand(commandFirstArg)) {
String command = event.getMessage();
if (command.contains(" ")) {
String[] args = command.split(" ");
args[0] = args[0].toLowerCase();
command = String.join(" ", args);
} else command = command.toLowerCase();
if (!commandFirstArg.equals(command)) {
player.chat(command);
event.setCancelled(true);
return;
}
}
World world = player.getWorld();
String command = event.getMessage(),
worldName = world.getName();
command = command.substring(1);
final String commandWithArguments = command;
command = StringUtils.getFirstArg(command);
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
return;
}
if (PermissionUtil.hasBypassPermission(sender, command, isOperator)) {
return;
}
final String displayCommand = StringUtils.replaceTriggers(command, "", "\\", "<", ">", "&");
List<String> notificationMessage = MessageTranslator.replaceMessageList(
Storage.ConfigSections.Messages.NOTIFICATION.ALERT,
"%player%", player.getName(),
"%command%", displayCommand,
"%world%", worldName);
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isCommand(command)) {
MessageTranslator.send(
player,
Storage.ConfigSections.Settings.CUSTOM_PLUGIN.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
event.setCancelled(true);
return;
}
if (Storage.ConfigSections.Settings.CUSTOM_VERSION.isCommand(command)) {
MessageTranslator.send(
player,
Storage.ConfigSections.Settings.CUSTOM_VERSION.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
event.setCancelled(true);
return;
}
final boolean cancelBlockedCommand = Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED;
final List<Group> groups = GroupManager.getPlayerGroups(sender, isOperator);
boolean allowed = Storage.Blacklist.canPlayerAccessChat(sender, groups, command, isOperator);
boolean blockedNamespace = false;
if (!Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender, isOperator)) {
blockedNamespace = cancelBlockedCommand
? Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(command)
: Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesAlwaysBlock(command);
if (blockedNamespace) allowed = false;
}
if (!Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED && !blockedNamespace) {
return;
}
if (!allowed) {
ExecuteCommandEvent executeCommandEvent = PATEventHandler.callExecuteCommandEvents(
sender,
event.getMessage(),
true,
!Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED
);
if (executeCommandEvent.isBlocked()) {
event.setCancelled(true);
MessageTranslator.send(
sender,
ResponseHandler.getResponse(
sender.getUniqueId(),
sender.getName(),
sender.getServerName(),
event.getMessage(),
Storage.ConfigSections.Settings.CANCEL_COMMAND.BASE_COMMAND_RESPONSE.getLines()
), "%command%", StringUtils.getFirstArg(displayCommand)
);
if (!executeCommandEvent.doesNotify())
return;
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.stream().filter(uuid -> Bukkit.getServer().getPlayer(uuid) != null).forEach(uuid -> {
Player target = Bukkit.getServer().getPlayer(uuid);
MessageTranslator.send(target, notificationMessage);
});
}
if (executeCommandEvent.isCancelled())
return;
}
ExecuteCommandEvent executeCommandEvent = PATEventHandler.callExecuteCommandEvents(
sender,
event.getMessage(),
SubArgument.get().getExecuteHandler().handleCommandExecution(sender, event.getMessage()),
false
);
if (executeCommandEvent.isBlocked()) {
event.setCancelled(true);
MessageTranslator.send(
sender,
ResponseHandler.getResponse(
sender.getUniqueId(),
sender.getName(),
sender.getServerName(),
event.getMessage()
),
"%command%",
StringUtils.replaceTriggers(
commandWithArguments, "",
"\\", "<", ">", "&"
)
);
}
}
}
@@ -0,0 +1,51 @@
package de.rayzs.pat.plugin.listeners.bukkit;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.LuckPermsWarning;
import de.rayzs.pat.utils.scheduler.PATScheduler;
import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.server.ServerCommandEvent;
public class BukkitLuckPermsWarning implements Listener {
@EventHandler
public void onConsoleCommandExecution(final ServerCommandEvent event) {
if (LuckPermsWarning.alreadyAnnounced()) return;
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_WORLD.ENABLED || Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
return;
}
final CommandSender sender = CommandSender.from(event.getSender());
final String command = event.getCommand();
if (LuckPermsWarning.shouldSendLuckPermsWarning(sender, command)) {
PATScheduler.createScheduler(() -> {
LuckPermsWarning.sendAnnouncement(sender);
}, 20);
}
}
@EventHandler
public void onPlayerCommandExecution(final PlayerCommandPreprocessEvent event) {
if (LuckPermsWarning.alreadyAnnounced()) return;
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_WORLD.ENABLED || Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
return;
}
final CommandSender sender = CommandSender.from(event.getPlayer());
final String command = event.getMessage();
if (LuckPermsWarning.shouldSendLuckPermsWarning(sender, command.substring(1))) {
PATScheduler.createScheduler(() -> {
LuckPermsWarning.sendAnnouncement(sender);
}, 20);
}
}
}
@@ -1,63 +1,55 @@
package de.rayzs.pat.plugin.listeners.bukkit;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.plugin.system.serverbrand.CustomServerBrand;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.ServerPlayersChangeEvent;
import de.rayzs.pat.api.netty.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.api.communication.BackendUpdater;
import de.rayzs.pat.plugin.packetanalyzer.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.plugin.system.communication.BackendUpdater;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.permission.PermissionPlugin;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.scheduler.PATScheduler;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import org.bukkit.event.player.*;
import org.bukkit.entity.Player;
import org.bukkit.event.*;
import java.util.UUID;
import java.util.Objects;
public class BukkitPlayerListener implements Listener {
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
final Player player = event.getPlayer();
final UUID uuid = player.getUniqueId();
final CommandSender sender = CommandSender.from(player);
final boolean isOperator = player.isOp();
final CommandSender sender = CommandSenderHandler.from(player);
sender.updateSenderObject(player);
PATEventHandler.callServerPlayersChangeEvents(player, ServerPlayersChangeEvent.Type.JOINED);
PATEventHandler.callServerPlayersChangeEvents(sender, ServerPlayersChangeEvent.Type.JOINED);
SubArgument.get().updateCachedPlayerNames();
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
BackendUpdater.handle();
BackendUpdater.get().handle();
}
CustomServerBrand.preparePlayer(player);
CustomServerBrand.get().preparePlayer(player);
PermissionUtil.reloadPermissions(sender);
if (CustomServerBrand.isEnabled()) {
CustomServerBrand.sendBrandToPlayer(player);
if (CustomServerBrand.get().isEnabled()) {
CustomServerBrand.get().sendBrandToPlayer(player);
}
if (!Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
if (Storage.getPermissionPlugin() != PermissionPlugin.LUCKPERMS) {
if (!Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED && Storage.getPermissionPlugin() != PermissionPlugin.LUCKPERMS) {
PATScheduler.createScheduler(() -> {
PATScheduler.createScheduler(() -> {
if (Storage.getPermissionPlugin() == PermissionPlugin.GROUPMANAGER) {
PermissionUtil.reloadPermissions(sender);
}
if (Storage.getPermissionPlugin() == PermissionPlugin.GROUPMANAGER) {
PermissionUtil.reloadPermissions(sender);
}
if (Reflection.isAtLeast(1, 13)) {
BukkitAntiTabListener.handleTabCompletion(player);
}
}, 20);
}
Storage.getLoader().updateCommands(sender);
}, 20);
}
if (!BukkitPacketAnalyzer.inject(player)) {
@@ -77,17 +69,13 @@ public class BukkitPlayerListener implements Listener {
Storage.ConfigSections.Settings.INJECTION_FAILED.KICK_MESSAGE
));
}
}
}
}, 10);
}
// Update sub arguments for <1.12.2 servers.
if (Reflection.isBefore(1, 13)) {
Storage.quickSubArgumentUpdate(uuid);
}
if (Storage.OUTDATED && PermissionUtil.hasPermission(sender, "joinupdate")) {
if (Storage.OUTDATED && PermissionUtil.hasPermission(sender, "joinupdate", isOperator)) {
PATScheduler.createScheduler(() -> {
if (player.isOnline()) {
MessageTranslator.send(player, Storage.ConfigSections.Settings.UPDATE.OUTDATED.getLines());
@@ -98,8 +86,11 @@ public class BukkitPlayerListener implements Listener {
@EventHandler (priority = EventPriority.LOWEST)
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
PATEventHandler.callServerPlayersChangeEvents(player, ServerPlayersChangeEvent.Type.LEFT);
final Player player = event.getPlayer();
final CommandSender sender = CommandSender.from(player);
PATEventHandler.callServerPlayersChangeEvents(sender, ServerPlayersChangeEvent.Type.LEFT);
SubArgument.get().updateCachedPlayerNames();
BukkitPacketAnalyzer.uninject(player.getUniqueId());
PermissionUtil.resetPermissions(player.getUniqueId());
@@ -110,18 +101,15 @@ public class BukkitPlayerListener implements Listener {
Player player = event.getPlayer();
if (Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY == -1) {
CustomServerBrand.sendBrandToPlayer(player);
CustomServerBrand.get().sendBrandToPlayer(player);
}
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_WORLD.ENABLED) {
CommandSender sender = CommandSenderHandler.from(player);
CommandSender sender = CommandSender.from(player);
assert sender != null;
Objects.requireNonNull(sender);
PermissionUtil.reloadPermissions(sender);
if (Reflection.isAtLeast(1, 13)) {
BukkitAntiTabListener.handleTabCompletion(player);
}
Storage.getLoader().updateCommands(sender);
}
}
}
@@ -13,7 +13,6 @@ import org.bukkit.profile.PlayerTextures;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.plaf.BorderUIResource;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
@@ -52,8 +51,9 @@ public class PaperServerListPing implements Listener {
} else {
Storage.ConfigSections.Settings.CUSTOM_PROTOCOL_PING.PLAYERLIST.getLines().forEach(line -> {
final List<String> lines = new ArrayList<>();
for (String line : Storage.ConfigSections.Settings.CUSTOM_PROTOCOL_PING.PLAYERLIST.getLines()) {
if (line.contains("%players%")) {
List<String> playerNames = Storage.getLoader().getOnlinePlayerNames();
@@ -66,7 +66,7 @@ public class PaperServerListPing implements Listener {
"%players%", currentPlayerName, "&", "§"
);
event.getPlayerSample().add(new ProtocolHoverLine(playerName, RANDOM_UUID));
lines.add(playerName);
}
} else {
@@ -78,14 +78,19 @@ public class PaperServerListPing implements Listener {
? Arrays.copyOfRange(nameSplit, 0, 30)
: nameSplit;
for (String name : nameSplit) {
event.getPlayerSample().add(new ProtocolHoverLine(name, RANDOM_UUID));
}
lines.addAll(Arrays.asList(nameSplit));
} else {
event.getPlayerSample().add(new ProtocolHoverLine(playerName, RANDOM_UUID));
lines.add(playerName);
}
}
}
if (Storage.ConfigSections.Settings.CUSTOM_PROTOCOL_PING.USE_CENTER_VARIABLE) {
StringUtils.centralize(lines);
}
lines.forEach(line -> {
event.getPlayerSample().add(new ProtocolHoverLine(line, RANDOM_UUID));
});
}
}
@@ -1,113 +1,112 @@
package de.rayzs.pat.plugin.listeners.bungee;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.FilteredTabCompletionEvent;
import de.rayzs.pat.api.netty.proxy.BungeePacketAnalyzer;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.TabCompleteEvent;
import net.md_5.bungee.api.event.TabCompleteResponseEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import java.util.ArrayList;
import java.util.List;
public class BungeeAntiTabListener implements Listener {
@EventHandler
public void onTabCompleteResponse(TabCompleteResponseEvent event) {
if(!(event.getReceiver() instanceof ProxiedPlayer)) return;
ProxiedPlayer player = (ProxiedPlayer) event.getReceiver();
CommandSender sender = CommandSenderHandler.from(player);
ServerInfo serverInfo = player.getServer().getInfo();
String serverName = serverInfo.getName();
String rawCursor = BungeePacketAnalyzer.getPlayerInput(player);
if (rawCursor == null) {
return;
}
if (!rawCursor.startsWith("/")) {
return;
}
String cursor = rawCursor.substring(1);
if (event.getSuggestions().isEmpty())
return;
if (Storage.Blacklist.isDisabledServer(serverName))
return;
if (PermissionUtil.hasBypassPermission(sender))
return;
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final boolean doesBypassNamespace = Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender);
final boolean spaces = cursor.contains(" ");
boolean cancelsBeforeHand = false;
if (Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(cursor) && !doesBypassNamespace) {
cancelsBeforeHand = true;
}
if (!cancelsBeforeHand && !cursor.isEmpty()) {
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, StringUtils.getFirstArg(cursor), serverName);
}
if (!cancelsBeforeHand) {
cancelsBeforeHand = Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isCommand(cursor) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isCommand(cursor);
}
if (spaces) {
if (cancelsBeforeHand) {
event.getSuggestions().clear();
return;
}
FilteredTabCompletionEvent filteredTabCompletionEvent = PATEventHandler.callFilteredTabCompletionEvents(player.getUniqueId(), rawCursor, new ArrayList<>(event.getSuggestions()));
if (filteredTabCompletionEvent.isCancelled()) {
event.getSuggestions().clear();
} else {
event.getSuggestions().removeIf(s -> !filteredTabCompletionEvent.getCompletion().contains(s));
}
return;
}
event.getSuggestions().removeIf(s -> {
String cpy = s;
if (cpy.startsWith("/")) {
cpy = cpy.substring(1);
}
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(cpy) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(cpy)) {
return false;
}
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, cpy, serverName);
});
}
@EventHandler
public void onTabComplete(TabCompleteEvent event) {
ProxiedPlayer player = (ProxiedPlayer) event.getSender();
BungeePacketAnalyzer.setPlayerInput(player, event.getCursor());
}
}
package de.rayzs.pat.plugin.listeners.bungee;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.FilteredTabCompletionEvent;
import de.rayzs.pat.plugin.packetanalyzer.proxy.BungeePacketAnalyzer;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.sender.CommandSender;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.TabCompleteEvent;
import net.md_5.bungee.api.event.TabCompleteResponseEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import java.util.ArrayList;
import java.util.List;
public class BungeeAntiTabListener implements Listener {
@EventHandler
public void onTabCompleteResponse(TabCompleteResponseEvent event) {
if(!(event.getReceiver() instanceof ProxiedPlayer)) return;
ProxiedPlayer player = (ProxiedPlayer) event.getReceiver();
CommandSender sender = CommandSender.from(player);
ServerInfo serverInfo = player.getServer().getInfo();
String serverName = serverInfo.getName();
String rawCursor = BungeePacketAnalyzer.getPlayerInput(player);
if (rawCursor == null) {
return;
}
if (!rawCursor.startsWith("/")) {
return;
}
String cursor = rawCursor.substring(1);
if (event.getSuggestions().isEmpty())
return;
if (Storage.Blacklist.isDisabledServer(serverName))
return;
if (PermissionUtil.hasBypassPermission(sender, false))
return;
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
final boolean doesBypassNamespace = Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender, false);
final boolean spaces = cursor.contains(" ");
boolean cancelsBeforeHand = false;
if (Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(cursor) && !doesBypassNamespace) {
cancelsBeforeHand = true;
}
if (!cancelsBeforeHand && !cursor.isEmpty()) {
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, StringUtils.getFirstArg(cursor), serverName, false);
}
if (!cancelsBeforeHand) {
cancelsBeforeHand = Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isCommand(cursor) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isCommand(cursor);
}
if (spaces) {
if (cancelsBeforeHand) {
event.getSuggestions().clear();
return;
}
FilteredTabCompletionEvent filteredTabCompletionEvent = PATEventHandler.callFilteredTabCompletionEvents(sender, rawCursor, new ArrayList<>(event.getSuggestions()));
if (filteredTabCompletionEvent.isCancelled()) {
event.getSuggestions().clear();
} else {
event.getSuggestions().removeIf(s -> !filteredTabCompletionEvent.getCompletion().contains(s));
}
return;
}
event.getSuggestions().removeIf(s -> {
String cpy = s;
if (cpy.startsWith("/")) {
cpy = cpy.substring(1);
}
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(cpy) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(cpy)) {
return false;
}
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, cpy, serverName, false);
});
}
@EventHandler
public void onTabComplete(TabCompleteEvent event) {
ProxiedPlayer player = (ProxiedPlayer) event.getSender();
BungeePacketAnalyzer.setPlayerInput(player, event.getCursor());
}
}
@@ -1,160 +1,195 @@
package de.rayzs.pat.plugin.listeners.bungee;
import de.rayzs.pat.api.communication.Communicator;
import de.rayzs.pat.api.event.events.ExecuteCommandEvent;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import net.md_5.bungee.api.event.ChatEvent;
import net.md_5.bungee.api.plugin.Listener;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.api.storage.Storage;
import net.md_5.bungee.api.connection.*;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.api.event.*;
import net.md_5.bungee.event.*;
import java.util.List;
public class BungeeBlockCommandListener implements Listener {
@EventHandler (priority = EventPriority.HIGHEST)
public void onChat(ChatEvent event) {
if (event.isCancelled()) return;
final Connection connection = event.getSender();
if (! (connection instanceof ProxiedPlayer) || !event.getMessage().startsWith("/"))
return;
final ProxiedPlayer player = (ProxiedPlayer) connection;
final CommandSender sender = CommandSenderHandler.from(player);
final String serverName = player.getServer().getInfo().getName();
String command = event.getMessage();
if (PermissionUtil.hasBypassPermission(sender, command) || Storage.Blacklist.isDisabledServer(serverName))
return;
command = command.startsWith("/") ? command.substring(1) : command;
command = StringUtils.getFirstArg(command);
if (Communicator.get().hasConnectedClients() && Storage.ConfigSections.Settings.AUTO_LOWERCASE_COMMANDS.isCommand(command)) {
command = command.toLowerCase();
}
final String displayCommand = StringUtils.replaceTriggers(command, "", "\\", "<", ">", "&");
final List<String> notificationMessage = MessageTranslator.replaceMessageList(
Storage.ConfigSections.Messages.NOTIFICATION.ALERT,
"%player%", player.getName(),
"%command%", displayCommand,
"%server%", serverName);
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isCommand(command)) {
Communicator.Proxy2Backend.sendNotification(player.getUniqueId(), serverName, displayCommand);
MessageTranslator.send(
player,
Storage.ConfigSections.Settings.CUSTOM_PLUGIN.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.stream().forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
event.setCancelled(true);
return;
}
if (Storage.ConfigSections.Settings.CUSTOM_VERSION.isCommand(command)) {
Communicator.Proxy2Backend.sendNotification(player.getUniqueId(), serverName, displayCommand);
MessageTranslator.send(
player,
Storage.ConfigSections.Settings.CUSTOM_VERSION.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
event.setCancelled(true);
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final boolean cancelBlockedCommand = Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED;
boolean allowed = Storage.Blacklist.canPlayerAccessChat(sender, groups, command, serverName);
boolean blockedNamespace = false;
if (!Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender)) {
blockedNamespace = cancelBlockedCommand
? Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(command)
: Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesAlwaysBlock(command);
if (blockedNamespace) allowed = false;
}
if (!Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED && !blockedNamespace) {
return;
}
if (!allowed) {
ExecuteCommandEvent executeCommandEvent = PATEventHandler.callExecuteCommandEvents(
player,
event.getMessage(),
true,
!Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED
);
if (executeCommandEvent.isBlocked()) {
event.setCancelled(true);
if (!executeCommandEvent.doesNotify())
return;
Communicator.Proxy2Backend.sendNotification(player.getUniqueId(), serverName, displayCommand);
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
}
if (executeCommandEvent.isCancelled())
return;
}
ExecuteCommandEvent executeCommandEvent = PATEventHandler.callExecuteCommandEvents(player, event.getMessage(), false, false);
if (executeCommandEvent.isBlocked())
event.setCancelled(true);
}
}
package de.rayzs.pat.plugin.listeners.bungee;
import de.rayzs.pat.plugin.system.communication.Communicator;
import de.rayzs.pat.api.event.events.ExecuteCommandEvent;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.response.ResponseHandler;
import de.rayzs.pat.utils.sender.CommandSender;
import net.md_5.bungee.api.event.ChatEvent;
import net.md_5.bungee.api.plugin.Listener;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.api.storage.Storage;
import net.md_5.bungee.api.connection.*;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.api.event.*;
import net.md_5.bungee.event.*;
import java.util.List;
public class BungeeBlockCommandListener implements Listener {
@EventHandler (priority = EventPriority.HIGHEST)
public void onChat(ChatEvent event) {
if (event.isCancelled()) return;
final Connection connection = event.getSender();
if (! (connection instanceof ProxiedPlayer) || !event.getMessage().startsWith("/"))
return;
final ProxiedPlayer player = (ProxiedPlayer) connection;
final CommandSender sender = CommandSender.from(player);
final String serverName = player.getServer().getInfo().getName();
String command = event.getMessage();
if (PermissionUtil.hasBypassPermission(sender, command, false) || Storage.Blacklist.isDisabledServer(serverName))
return;
command = command.startsWith("/") ? command.substring(1) : command;
final String commandWithArguments = command;
command = StringUtils.getFirstArg(command);
if (Communicator.get().hasConnectedClients() && Storage.ConfigSections.Settings.AUTO_LOWERCASE_COMMANDS.isCommand(command)) {
command = command.toLowerCase();
}
final String displayCommand = StringUtils.replaceTriggers(command, "", "\\", "<", ">", "&");
final List<String> notificationMessage = MessageTranslator.replaceMessageList(
Storage.ConfigSections.Messages.NOTIFICATION.ALERT,
"%player%", player.getName(),
"%command%", displayCommand,
"%server%", serverName);
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isCommand(command)) {
Communicator.Proxy2Backend.sendNotification(player.getUniqueId(), serverName, displayCommand);
MessageTranslator.send(
player,
Storage.ConfigSections.Settings.CUSTOM_PLUGIN.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.stream().forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
event.setCancelled(true);
return;
}
if (Storage.ConfigSections.Settings.CUSTOM_VERSION.isCommand(command)) {
Communicator.Proxy2Backend.sendNotification(player.getUniqueId(), serverName, displayCommand);
MessageTranslator.send(
player,
Storage.ConfigSections.Settings.CUSTOM_VERSION.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
event.setCancelled(true);
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
final boolean cancelBlockedCommand = Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED;
boolean allowed = Storage.Blacklist.canPlayerAccessChat(sender, groups, command, serverName, false);
boolean blockedNamespace = false;
if (!Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender, false)) {
blockedNamespace = cancelBlockedCommand
? Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(command)
: Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesAlwaysBlock(command);
if (blockedNamespace) allowed = false;
}
if (!Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED && !blockedNamespace) {
return;
}
if (!allowed) {
ExecuteCommandEvent executeCommandEvent = PATEventHandler.callExecuteCommandEvents(
sender,
event.getMessage(),
true,
!Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED
);
if (executeCommandEvent.isBlocked()) {
event.setCancelled(true);
MessageTranslator.send(
sender,
ResponseHandler.getResponse(
sender.getUniqueId(),
sender.getName(),
serverName,
event.getMessage(),
Storage.ConfigSections.Settings.CANCEL_COMMAND.BASE_COMMAND_RESPONSE.getLines()
), "%command%", StringUtils.getFirstArg(displayCommand)
);
if (!executeCommandEvent.doesNotify())
return;
Communicator.Proxy2Backend.sendNotification(player.getUniqueId(), serverName, displayCommand);
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
}
if (executeCommandEvent.isCancelled())
return;
}
ExecuteCommandEvent executeCommandEvent = PATEventHandler.callExecuteCommandEvents(
sender,
event.getMessage(),
SubArgument.get().getExecuteHandler().handleCommandExecution(sender, event.getMessage()),
false
);
if (executeCommandEvent.isBlocked()) {
event.setCancelled(true);
MessageTranslator.send(
sender,
ResponseHandler.getResponse(
sender.getUniqueId(),
sender.getName(),
serverName,
event.getMessage()
),
"%command%",
StringUtils.replaceTriggers(
commandWithArguments, "",
"\\", "<", ">", "&"
)
);
}
}
}
@@ -0,0 +1,40 @@
package de.rayzs.pat.plugin.listeners.bungee;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.BukkitLoader;
import de.rayzs.pat.plugin.BungeeLoader;
import de.rayzs.pat.utils.LuckPermsWarning;
import de.rayzs.pat.utils.sender.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.ChatEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import java.util.concurrent.TimeUnit;
public class BungeeLuckPermsWarning implements Listener {
@EventHandler
public void onPlayerCommandExecution(final ChatEvent event) {
if (LuckPermsWarning.alreadyAnnounced()) return;
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_WORLD.ENABLED || Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
return;
}
if (! (event.getSender() instanceof ProxiedPlayer player)) return;
final CommandSender sender = CommandSender.from(player);
final String command = event.getMessage();
if (LuckPermsWarning.shouldSendLuckPermsWarning(sender, command.substring(1))) {
ProxyServer.getInstance().getScheduler().schedule(
BungeeLoader.getPlugin(),
() -> LuckPermsWarning.sendAnnouncement(sender),
1, TimeUnit.SECONDS
);
}
}
}
@@ -1,6 +1,7 @@
package de.rayzs.pat.plugin.listeners.bungee;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.StringUtils;
import net.md_5.bungee.api.event.ProxyPingEvent;
import net.md_5.bungee.api.plugin.Listener;
import de.rayzs.pat.api.storage.Storage;
@@ -8,6 +9,7 @@ import de.rayzs.pat.plugin.*;
import net.md_5.bungee.event.*;
import net.md_5.bungee.api.*;
import java.util.ArrayList;
import java.util.List;
public class BungeePingListener implements Listener {
@@ -19,14 +21,16 @@ public class BungeePingListener implements Listener {
ProxyServer proxyServer = BungeeLoader.getPlugin().getProxy();
int online = proxyServer.getOnlineCount(),
onlineExtend = online + Storage.ConfigSections.Settings.CUSTOM_PROTOCOL_PING.EXTEND_COUNT,
max = -1;
tmpMax = -1;
try {
max = proxyServer.getConfigurationAdapter().getListeners().iterator().next().getMaxPlayers();
tmpMax = proxyServer.getConfigurationAdapter().getListeners().iterator().next().getMaxPlayers();
} catch (Throwable throwable) {
Logger.warning("Failed to read max-players count for %max% placeholder! Using -1 as default value instead.");
}
final int max = tmpMax;
ServerPing serverPing = event.getResponse();
int protocol = Storage.ConfigSections.Settings.CUSTOM_PROTOCOL_PING.ALWAYS_SHOW ? -1 : serverPing.getVersion().getProtocol();
@@ -44,8 +48,22 @@ public class BungeePingListener implements Listener {
List<String> lines = Storage.ConfigSections.Settings.CUSTOM_PROTOCOL_PING.PLAYERLIST.getLines();
ServerPing.PlayerInfo[] playerInfos = new ServerPing.PlayerInfo[lines.size()];
for (int i = 0; i < lines.size(); i++) {
playerInfos[i] = new ServerPing.PlayerInfo(replaceString(lines.get(i), online, onlineExtend, max), "");
if (!Storage.ConfigSections.Settings.CUSTOM_PROTOCOL_PING.USE_CENTER_VARIABLE) {
for (int i = 0; i < lines.size(); i++) {
String line = replaceString(lines.get(i), online, onlineExtend, max);
playerInfos[i] = new ServerPing.PlayerInfo(line, "");
}
} else {
List<String> cpyLines = new ArrayList<>(Storage.ConfigSections.Settings.CUSTOM_PROTOCOL_PING.PLAYERLIST.getLines());
cpyLines.replaceAll(string -> replaceString(string, online, onlineExtend, max));
StringUtils.centralize(cpyLines);
for (int i = 0; i < cpyLines.size(); i++) {
playerInfos[i] = new ServerPing.PlayerInfo(cpyLines.get(i), "");
}
}
serverPing.getPlayers().setSample(playerInfos);
@@ -1,80 +1,85 @@
package de.rayzs.pat.plugin.listeners.bungee;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.ServerPlayersChangeEvent;
import de.rayzs.pat.api.netty.proxy.BungeePacketAnalyzer;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Listener;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.BungeeLoader;
import net.md_5.bungee.api.ProxyServer;
import java.util.concurrent.TimeUnit;
import net.md_5.bungee.api.event.*;
import net.md_5.bungee.event.*;
public class BungeePlayerConnectionListener implements Listener {
@EventHandler (priority = EventPriority.LOWEST)
public void onPostLogin(PostLoginEvent event) {
final ProxiedPlayer player = event.getPlayer();
final CommandSender sender = CommandSenderHandler.from(player);
sender.updateSenderObject(player);
PATEventHandler.callServerPlayersChangeEvents(player, ServerPlayersChangeEvent.Type.JOINED);
if(CustomServerBrand.isEnabled())
ProxyServer.getInstance().getScheduler().schedule(BungeeLoader.getPlugin(), () -> {
if (player.isConnected()) CustomServerBrand.sendBrandToPlayer(player);
}, 500, TimeUnit.MILLISECONDS);
PermissionUtil.setPlayerPermissions(sender);
if (Storage.OUTDATED && PermissionUtil.hasPermission(sender, "joinupdate")) {
ProxyServer.getInstance().getScheduler().schedule(BungeeLoader.getPlugin(), () -> {
if (player.isConnected()) {
MessageTranslator.send(player, Storage.ConfigSections.Settings.UPDATE.OUTDATED, "%player%", player.getName());
}
}, 1, TimeUnit.SECONDS);
}
}
@EventHandler (priority = EventPriority.LOWEST)
public void onServerSwitch(ServerSwitchEvent event) {
ProxiedPlayer player = event.getPlayer();
BungeePacketAnalyzer.inject(player);
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
CommandSender sender = CommandSenderHandler.from(player);
assert sender != null;
PermissionUtil.reloadPermissions(sender);
}
if (Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY != -1) {
return;
}
CustomServerBrand.sendBrandToPlayer(player);
}
@EventHandler (priority = EventPriority.LOWEST)
public void onPlayerDisconnectEvent(PlayerDisconnectEvent event) {
ProxiedPlayer player = event.getPlayer();
PATEventHandler.callServerPlayersChangeEvents(player, ServerPlayersChangeEvent.Type.LEFT);
PermissionUtil.resetPermissions(player.getUniqueId());
BungeePacketAnalyzer.uninject(player);
if (Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY != -1) {
return;
}
CustomServerBrand.sendBrandToPlayer(player);
}
}
package de.rayzs.pat.plugin.listeners.bungee;
import de.rayzs.pat.plugin.system.serverbrand.CustomServerBrand;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.ServerPlayersChangeEvent;
import de.rayzs.pat.plugin.packetanalyzer.proxy.BungeePacketAnalyzer;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.sender.CommandSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.Objects;
import net.md_5.bungee.api.plugin.Listener;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.BungeeLoader;
import net.md_5.bungee.api.ProxyServer;
import java.util.concurrent.TimeUnit;
import net.md_5.bungee.api.event.*;
import net.md_5.bungee.event.*;
public class BungeePlayerConnectionListener implements Listener {
@EventHandler (priority = EventPriority.LOWEST)
public void onPostLogin(PostLoginEvent event) {
final ProxiedPlayer player = event.getPlayer();
final CommandSender sender = CommandSender.from(player);
PATEventHandler.callServerPlayersChangeEvents(sender, ServerPlayersChangeEvent.Type.JOINED);
SubArgument.get().updateCachedPlayerNames();
if(CustomServerBrand.get().isEnabled())
ProxyServer.getInstance().getScheduler().schedule(BungeeLoader.getPlugin(), () -> {
if (player.isConnected()) CustomServerBrand.get().sendBrandToPlayer(player);
}, 500, TimeUnit.MILLISECONDS);
PermissionUtil.setPlayerPermissions(sender);
if (Storage.OUTDATED && PermissionUtil.hasPermission(sender, "joinupdate", false)) {
ProxyServer.getInstance().getScheduler().schedule(BungeeLoader.getPlugin(), () -> {
if (player.isConnected()) {
MessageTranslator.send(player, Storage.ConfigSections.Settings.UPDATE.OUTDATED, "%player%", player.getName());
}
}, 1, TimeUnit.SECONDS);
}
}
@EventHandler (priority = EventPriority.LOWEST)
public void onServerSwitch(ServerSwitchEvent event) {
ProxiedPlayer player = event.getPlayer();
BungeePacketAnalyzer.inject(player);
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
CommandSender sender = CommandSender.from(player);
Objects.requireNonNull(sender);
PermissionUtil.reloadPermissions(sender);
}
if (Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY != -1) {
return;
}
CustomServerBrand.get().sendBrandToPlayer(player);
}
@EventHandler (priority = EventPriority.LOWEST)
public void onPlayerDisconnectEvent(PlayerDisconnectEvent event) {
final ProxiedPlayer player = event.getPlayer();
final CommandSender sender = CommandSender.from(player);
PATEventHandler.callServerPlayersChangeEvents(sender, ServerPlayersChangeEvent.Type.LEFT);
SubArgument.get().updateCachedPlayerNames();
PermissionUtil.resetPermissions(player.getUniqueId());
BungeePacketAnalyzer.uninject(player);
if (Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY != -1) {
return;
}
CustomServerBrand.get().sendBrandToPlayer(player);
}
}
@@ -1,74 +1,70 @@
package de.rayzs.pat.plugin.listeners.bungee;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.FilteredSuggestionEvent;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.CommandsCache;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import io.github.waterfallmc.waterfall.event.ProxyDefineCommandsEvent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Command;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import net.md_5.bungee.event.EventPriority;
public class WaterfallAntiTabListener implements Listener {
@EventHandler(priority = EventPriority.LOWEST)
public void onProxyDefineCommands(ProxyDefineCommandsEvent event) {
if (!(event.getReceiver() instanceof ProxiedPlayer) || event.getCommands().isEmpty()) {
return;
}
final ProxiedPlayer player = (ProxiedPlayer) event.getReceiver();
final CommandSender sender = CommandSenderHandler.from(player);
final String serverName = player.getServer().getInfo().getName();
if (Storage.Blacklist.isDisabledServer(serverName) || PermissionUtil.hasBypassPermission(sender)) {
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final Map<String, CommandsCache> cache = Storage.getLoader().getCommandsCacheMap();
if (!cache.containsKey(serverName)) {
cache.put(serverName, new CommandsCache());
}
final CommandsCache commandsCache = cache.get(serverName);
final List<String> commandsAsString = new ArrayList<>();
final HashMap<String, Command> commandsMap = new HashMap<>(event.getCommands());
event.getCommands().forEach((key, value) -> commandsAsString.add(key));
commandsCache.handleCommands(commandsAsString, serverName);
List<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName);
event.getCommands().entrySet().removeIf(command -> {
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(command.getKey()) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(command.getKey())) {
return false;
}
return playerCommands.contains(command.getKey());
});
FilteredSuggestionEvent filteredSuggestionEvent = PATEventHandler.callFilteredSuggestionEvents(player, new ArrayList<>(event.getCommands().keySet()));
if (filteredSuggestionEvent.isCancelled()) event.getCommands().clear();
for (String commandName : filteredSuggestionEvent.getSuggestions()) {
if (!event.getCommands().containsKey(commandName))
event.getCommands().put(commandName, commandsMap.get(commandName));
}
}
}
package de.rayzs.pat.plugin.listeners.bungee;
import java.util.*;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.FilteredSuggestionEvent;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.CommandsCache;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.sender.CommandSender;
import io.github.waterfallmc.waterfall.event.ProxyDefineCommandsEvent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Command;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import net.md_5.bungee.event.EventPriority;
public class WaterfallAntiTabListener implements Listener {
@EventHandler(priority = EventPriority.LOWEST)
public void onProxyDefineCommands(ProxyDefineCommandsEvent event) {
if (!(event.getReceiver() instanceof ProxiedPlayer) || event.getCommands().isEmpty()) {
return;
}
final ProxiedPlayer player = (ProxiedPlayer) event.getReceiver();
final CommandSender sender = CommandSender.from(player);
final String serverName = player.getServer().getInfo().getName();
if (Storage.Blacklist.isDisabledServer(serverName) || PermissionUtil.hasBypassPermission(sender, false)) {
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
final Map<String, CommandsCache> cache = Storage.getLoader().getPerServerCommandsCacheMap();
if (!cache.containsKey(serverName)) {
cache.put(serverName, new CommandsCache());
}
final CommandsCache commandsCache = cache.get(serverName);
final List<String> commandsAsString = new ArrayList<>();
final HashMap<String, Command> commandsMap = new HashMap<>(event.getCommands());
event.getCommands().forEach((key, value) -> commandsAsString.add(key));
commandsCache.handleCommands(commandsAsString, serverName);
HashSet<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName, false);
event.getCommands().entrySet().removeIf(command -> {
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(command.getKey()) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(command.getKey())) {
return false;
}
return playerCommands.contains(command.getKey());
});
FilteredSuggestionEvent filteredSuggestionEvent = PATEventHandler.callFilteredSuggestionEvents(sender, new HashSet<>(event.getCommands().keySet()));
if (filteredSuggestionEvent.isCancelled()) event.getCommands().clear();
for (String commandName : filteredSuggestionEvent.getSuggestions()) {
if (!event.getCommands().containsKey(commandName))
event.getCommands().put(commandName, commandsMap.get(commandName));
}
}
}
@@ -1,135 +1,135 @@
package de.rayzs.pat.plugin.listeners.velocity;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.velocitypowered.api.event.PostOrder;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.command.PlayerAvailableCommandsEvent;
import com.velocitypowered.api.event.player.TabCompleteEvent;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.FilteredSuggestionEvent;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.CommandsCache;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
public class VelocityAntiTabListener {
private static ProxyServer server;
public VelocityAntiTabListener(ProxyServer server) {
VelocityAntiTabListener.server = server;
}
@Subscribe (order = PostOrder.LAST)
public void onTabComplete(TabCompleteEvent event) {
final Player player = event.getPlayer();
if (!event.getPartialMessage().startsWith("/")) {
return;
}
final String serverName = player.getCurrentServer().isPresent() ? player.getCurrentServer().get().getServerInfo().getName() : "unknown";
if (Storage.Blacklist.isDisabledServer(serverName)) {
return;
}
final CommandSender sender = CommandSenderHandler.from(player);
if (PermissionUtil.hasBypassPermission(sender) || event.getSuggestions().isEmpty() || player.getCurrentServer().isEmpty()) {
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
event.getSuggestions().removeIf(command -> {
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(command) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(command)) {
return false;
}
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command, serverName);
});
FilteredSuggestionEvent filteredSuggestionEvent = PATEventHandler.callFilteredSuggestionEvents(player, event.getSuggestions());
if(filteredSuggestionEvent.isCancelled()) event.getSuggestions().clear();
}
@Subscribe (order = PostOrder.LAST)
public void onPlayerAvailableCommands(PlayerAvailableCommandsEvent event) {
try {
final Player player = event.getPlayer();
if (event.getRootNode().getChildren().isEmpty() || !player.getCurrentServer().isPresent()) {
return;
}
final CommandSender sender = CommandSenderHandler.from(player);
if (PermissionUtil.hasBypassPermission(sender)) {
return;
}
final String serverName = player.getCurrentServer().get().getServer().getServerInfo().getName();
if (Storage.Blacklist.isDisabledServer(serverName)) {
return;
}
Map<String, CommandsCache> cache = Storage.getLoader().getCommandsCacheMap();
if (!cache.containsKey(serverName)) {
cache.put(serverName, new CommandsCache());
}
final CommandsCache commandsCache = cache.get(serverName);
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<String> commandsAsString = new ArrayList<>();
event.getRootNode().getChildren().stream()
.filter(command -> command != null && command.getName() != null)
.forEach(command -> commandsAsString.add(command.getName()));
commandsCache.handleCommands(commandsAsString, serverName);
final boolean newer = player.getProtocolVersion().getProtocol() > 340, argsChildrenExist = event.getRootNode().getChild("args") != null;
final List<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName);
if (event.getRootNode().getChildren().size() == 1
&& newer && argsChildrenExist
&& event.getRootNode().getChild("args").getChildren().isEmpty()) {
return;
}
if (event.getRootNode().getChildren().size() == 1 && newer && argsChildrenExist) {
return;
}
event.getRootNode().getChildren().removeIf(command -> {
if (command == null || command.getName() == null)
return true;
if (command.getName().equals("args"))
return false;
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(command.getName()) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(command.getName())) {
return false;
}
return !playerCommands.contains(command.getName());
});
} catch (Exception exception) {
Logger.warning("An error occurred while processing commands in PAT: " + exception.getMessage());
exception.printStackTrace();
}
}
}
package de.rayzs.pat.plugin.listeners.velocity;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import com.velocitypowered.api.event.PostOrder;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.command.PlayerAvailableCommandsEvent;
import com.velocitypowered.api.event.player.TabCompleteEvent;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.FilteredSuggestionEvent;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.CommandsCache;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.sender.CommandSender;
public class VelocityAntiTabListener {
private final ProxyServer server;
public VelocityAntiTabListener(ProxyServer server) {
this.server = server;
}
@Subscribe (order = PostOrder.LAST)
public void onTabComplete(TabCompleteEvent event) {
final Player player = event.getPlayer();
if (!event.getPartialMessage().startsWith("/")) {
return;
}
final String serverName = player.getCurrentServer().isPresent() ? player.getCurrentServer().get().getServerInfo().getName() : "unknown";
if (Storage.Blacklist.isDisabledServer(serverName)) {
return;
}
final CommandSender sender = CommandSender.from(player);
if (PermissionUtil.hasBypassPermission(sender, false) || event.getSuggestions().isEmpty() || player.getCurrentServer().isEmpty()) {
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
event.getSuggestions().removeIf(command -> {
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(command) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(command)) {
return false;
}
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command, serverName, false);
});
FilteredSuggestionEvent filteredSuggestionEvent = PATEventHandler.callFilteredSuggestionEvents(sender, new HashSet<>(event.getSuggestions()));
if(filteredSuggestionEvent.isCancelled()) event.getSuggestions().clear();
}
@Subscribe (order = PostOrder.LAST)
public void onPlayerAvailableCommands(PlayerAvailableCommandsEvent event) {
try {
final Player player = event.getPlayer();
if (event.getRootNode().getChildren().isEmpty() || !player.getCurrentServer().isPresent()) {
return;
}
final CommandSender sender = CommandSender.from(player);
if (PermissionUtil.hasBypassPermission(sender, false)) {
return;
}
final String serverName = player.getCurrentServer().get().getServer().getServerInfo().getName();
if (Storage.Blacklist.isDisabledServer(serverName)) {
return;
}
Map<String, CommandsCache> cache = Storage.getLoader().getPerServerCommandsCacheMap();
if (!cache.containsKey(serverName)) {
cache.put(serverName, new CommandsCache());
}
final CommandsCache commandsCache = cache.get(serverName);
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
final List<String> commandsAsString = new ArrayList<>();
event.getRootNode().getChildren().stream()
.filter(command -> command != null && command.getName() != null)
.forEach(command -> commandsAsString.add(command.getName()));
commandsCache.handleCommands(commandsAsString, serverName);
final boolean newer = player.getProtocolVersion().getProtocol() > 340, argsChildrenExist = event.getRootNode().getChild("args") != null;
final HashSet<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName, false);
if (event.getRootNode().getChildren().size() == 1
&& newer && argsChildrenExist
&& event.getRootNode().getChild("args").getChildren().isEmpty()) {
return;
}
if (event.getRootNode().getChildren().size() == 1 && newer && argsChildrenExist) {
return;
}
event.getRootNode().getChildren().removeIf(command -> {
if (command == null || command.getName() == null)
return true;
if (command.getName().equals("args"))
return false;
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(command.getName()) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(command.getName())) {
return false;
}
return !playerCommands.contains(command.getName());
});
} catch (Exception exception) {
Logger.warning("An error occurred while processing commands in PAT: " + exception.getMessage());
exception.printStackTrace();
}
}
}
@@ -1,177 +1,214 @@
package de.rayzs.pat.plugin.listeners.velocity;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.command.CommandExecuteEvent;
import com.velocitypowered.api.command.CommandSource;
import de.rayzs.pat.api.communication.Communicator;
import de.rayzs.pat.api.event.events.ExecuteCommandEvent;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.permission.PermissionUtil;
import com.velocitypowered.api.proxy.Player;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.api.event.*;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import java.util.List;
public class VelocityBlockCommandListener {
@Subscribe
public void onCommandExecute(CommandExecuteEvent event) {
handleCommand(event);
}
public static CommandExecuteEvent handleCommand(Player player, String command) {
return handleCommand(new CommandExecuteEvent(player, command));
}
public static CommandExecuteEvent handleCommand(CommandExecuteEvent event) {
if (!event.getResult().isAllowed()) {
return event;
}
final CommandSource commandSource = event.getCommandSource();
final Object consoleSender = Storage.getLoader().getConsoleSender();
if(! (commandSource instanceof Player))
return event;
final Player player = (Player) commandSource;
final CommandSender sender = CommandSenderHandler.from(player);
final String serverName = player.getCurrentServer().isPresent()
? player.getCurrentServer().get().getServerInfo().getName()
: "unknown";
String tmpCommand = StringUtils.getFirstArg(event.getCommand());
if (Communicator.get().hasConnectedClients() && Storage.ConfigSections.Settings.AUTO_LOWERCASE_COMMANDS.isCommand(tmpCommand)) {
tmpCommand = tmpCommand.toLowerCase();
}
final String command = tmpCommand;
if (PermissionUtil.hasBypassPermission(sender, command) || Storage.Blacklist.isDisabledServer(serverName))
return event;
final String displayCommand = StringUtils.replaceTriggers(command, "", "\\", "<", ">", "&");
final List<String> notificationMessage = MessageTranslator.replaceMessageList(
Storage.ConfigSections.Messages.NOTIFICATION.ALERT,
"%player%", player.getUsername(),
"%command%", displayCommand,
"%server%", serverName
);
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isCommand(command)) {
Communicator.Proxy2Backend.sendNotification(player.getUniqueId(), serverName, displayCommand);
MessageTranslator.send(
player,
Storage.ConfigSections.Settings.CUSTOM_PLUGIN.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
MessageTranslator.send(consoleSender, notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
event.setResult(CommandExecuteEvent.CommandResult.denied());
return event;
}
if (Storage.ConfigSections.Settings.CUSTOM_VERSION.isCommand(command)) {
Communicator.Proxy2Backend.sendNotification(player.getUniqueId(), serverName, displayCommand);
MessageTranslator.send(
player,
Storage.ConfigSections.Settings.CUSTOM_VERSION.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
MessageTranslator.send(consoleSender, notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
event.setResult(CommandExecuteEvent.CommandResult.denied());
return event;
}
final boolean cancelBlockedCommand = Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED;
final List<Group> groups = GroupManager.getPlayerGroups(sender);
boolean allowed = Storage.Blacklist.canPlayerAccessChat(sender, groups, command, serverName);
boolean blockedNamespace = false;
if (!Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender)) {
blockedNamespace = cancelBlockedCommand
? Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(command)
: Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesAlwaysBlock(command);
if (blockedNamespace) allowed = false;
}
if (!Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED && !blockedNamespace) {
return event;
}
if (!allowed) {
ExecuteCommandEvent executeCommandEvent = PATEventHandler.callExecuteCommandEvents(
player,
event.getCommand(),
true,
!Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED);
if (executeCommandEvent.isBlocked()) {
event.setResult(CommandExecuteEvent.CommandResult.denied());
if (!executeCommandEvent.doesNotify())
return event;
Communicator.Proxy2Backend.sendNotification(player.getUniqueId(), serverName, displayCommand);
if (Storage.SEND_CONSOLE_NOTIFICATION)
MessageTranslator.send(consoleSender, notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
}
if (executeCommandEvent.isCancelled())
return event;
}
final ExecuteCommandEvent executeCommandEvent = PATEventHandler.callExecuteCommandEvents(player, event.getCommand(), false, false);
if (executeCommandEvent.isBlocked()) {
event.setResult(CommandExecuteEvent.CommandResult.denied());
}
return event;
}
package de.rayzs.pat.plugin.listeners.velocity;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.command.CommandExecuteEvent;
import com.velocitypowered.api.command.CommandSource;
import de.rayzs.pat.plugin.system.communication.Communicator;
import de.rayzs.pat.api.event.events.ExecuteCommandEvent;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.permission.PermissionUtil;
import com.velocitypowered.api.proxy.Player;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.api.event.*;
import de.rayzs.pat.utils.response.ResponseHandler;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.List;
public class VelocityBlockCommandListener {
@Subscribe
public void onCommandExecute(CommandExecuteEvent event) {
handleCommand(event);
}
public static CommandExecuteEvent handleCommand(Player player, String command) {
return handleCommand(new CommandExecuteEvent(player, command));
}
public static CommandExecuteEvent handleCommand(CommandExecuteEvent event) {
if (!event.getResult().isAllowed()) {
return event;
}
final CommandSource commandSource = event.getCommandSource();
final Object consoleSender = Storage.getLoader().getConsoleSender();
if(! (commandSource instanceof Player))
return event;
final Player player = (Player) commandSource;
final CommandSender sender = CommandSender.from(player);
final String serverName = player.getCurrentServer().isPresent()
? player.getCurrentServer().get().getServerInfo().getName()
: "unknown";
final String commandWithArguments = event.getCommand().startsWith("/") ? event.getCommand().substring(1) : event.getCommand();
String tmpCommand = StringUtils.getFirstArg(event.getCommand());
if (Communicator.get().hasConnectedClients() && Storage.ConfigSections.Settings.AUTO_LOWERCASE_COMMANDS.isCommand(tmpCommand)) {
tmpCommand = tmpCommand.toLowerCase();
}
final String command = tmpCommand;
if (PermissionUtil.hasBypassPermission(sender, command, false) || Storage.Blacklist.isDisabledServer(serverName))
return event;
final String displayCommand = StringUtils.replaceTriggers(command, "", "\\", "<", ">", "&");
final List<String> notificationMessage = MessageTranslator.replaceMessageList(
Storage.ConfigSections.Messages.NOTIFICATION.ALERT,
"%player%", player.getUsername(),
"%command%", displayCommand,
"%server%", serverName
);
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isCommand(command)) {
Communicator.Proxy2Backend.sendNotification(player.getUniqueId(), serverName, displayCommand);
MessageTranslator.send(
player,
Storage.ConfigSections.Settings.CUSTOM_PLUGIN.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
MessageTranslator.send(consoleSender, notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
event.setResult(CommandExecuteEvent.CommandResult.denied());
return event;
}
if (Storage.ConfigSections.Settings.CUSTOM_VERSION.isCommand(command)) {
Communicator.Proxy2Backend.sendNotification(player.getUniqueId(), serverName, displayCommand);
MessageTranslator.send(
player,
Storage.ConfigSections.Settings.CUSTOM_VERSION.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
MessageTranslator.send(consoleSender, notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
event.setResult(CommandExecuteEvent.CommandResult.denied());
return event;
}
final boolean cancelBlockedCommand = Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED;
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
boolean allowed = Storage.Blacklist.canPlayerAccessChat(sender, groups, command, serverName, false);
boolean blockedNamespace = false;
if (!Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender, false)) {
blockedNamespace = cancelBlockedCommand
? Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(command)
: Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesAlwaysBlock(command);
if (blockedNamespace) allowed = false;
}
if (!Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED && !blockedNamespace) {
return event;
}
if (!allowed) {
ExecuteCommandEvent executeCommandEvent = PATEventHandler.callExecuteCommandEvents(
sender,
event.getCommand(),
true,
!Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED
);
if (executeCommandEvent.isBlocked()) {
event.setResult(CommandExecuteEvent.CommandResult.denied());
MessageTranslator.send(
sender,
ResponseHandler.getResponse(
sender.getUniqueId(),
sender.getName(),
serverName,
event.getCommand(),
Storage.ConfigSections.Settings.CANCEL_COMMAND.BASE_COMMAND_RESPONSE.getLines()
), "%command%", StringUtils.getFirstArg(displayCommand)
);
if (!executeCommandEvent.doesNotify())
return event;
Communicator.Proxy2Backend.sendNotification(player.getUniqueId(), serverName, displayCommand);
if (Storage.SEND_CONSOLE_NOTIFICATION)
MessageTranslator.send(consoleSender, notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
Object p = Storage.getLoader().getPlayerObjByUUID(uuid);
if (p != null) {
MessageTranslator.send(p, notificationMessage);
}
});
}
if (executeCommandEvent.isCancelled())
return event;
}
final ExecuteCommandEvent executeCommandEvent = PATEventHandler.callExecuteCommandEvents(
sender,
event.getCommand(),
SubArgument.get().getExecuteHandler().handleCommandExecution(sender, event.getCommand()),
false
);
if (executeCommandEvent.isBlocked()) {
event.setResult(CommandExecuteEvent.CommandResult.denied());
MessageTranslator.send(
sender,
ResponseHandler.getResponse(
sender.getUniqueId(),
sender.getName(),
serverName,
event.getCommand()
),
"%command%",
StringUtils.replaceTriggers(
commandWithArguments, "",
"\\", "<", ">", "&"
)
);
}
return event;
}
}
@@ -1,116 +1,119 @@
package de.rayzs.pat.plugin.listeners.velocity;
import com.velocitypowered.api.event.connection.DisconnectEvent;
import com.velocitypowered.api.proxy.server.ServerInfo;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.ServerPlayersChangeEvent;
import de.rayzs.pat.api.netty.proxy.VelocityPacketAnalyzer;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.permission.PermissionUtil;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.player.*;
import de.rayzs.pat.plugin.VelocityLoader;
import de.rayzs.pat.api.storage.Storage;
import com.velocitypowered.api.proxy.*;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import net.kyori.adventure.text.Component;
import java.util.concurrent.TimeUnit;
public class VelocityConnectionListener {
private final ProxyServer server;
private final VelocityLoader loader;
public VelocityConnectionListener(ProxyServer server, VelocityLoader loader) {
this.server = server;
this.loader = loader;
}
@Subscribe
public void onServerPreConnect(ServerPreConnectEvent event) {
final Player player = event.getPlayer();
final CommandSender sender = CommandSenderHandler.from(player);
sender.updateSenderObject(player);
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
final ServerInfo serverInfo = event.getOriginalServer().getServerInfo();
if (serverInfo != null) Storage.tempCachePlayerToServer(player.getUniqueId(), serverInfo.getName());
}
PATEventHandler.callServerPlayersChangeEvents(player, ServerPlayersChangeEvent.Type.JOINED);
if(CustomServerBrand.isEnabled())
server.getScheduler().buildTask(loader, () -> {
if (player.isActive()) CustomServerBrand.sendBrandToPlayer(player);
}).delay(500, TimeUnit.MILLISECONDS).schedule();
PermissionUtil.setPlayerPermissions(sender);
if (Storage.OUTDATED && PermissionUtil.hasPermission(sender, "joinupdate")) {
server.getScheduler().buildTask(loader, () -> {
if (player.isActive())
MessageTranslator.send(player, Storage.ConfigSections.Settings.UPDATE.OUTDATED, "%player%", player.getUsername());
}).delay(1, TimeUnit.SECONDS).schedule();
}
}
@Subscribe
public void onServerSwitch(ServerConnectedEvent event) {
final Player player = event.getPlayer();
if (!VelocityPacketAnalyzer.isInjected(player)) {
if (!VelocityPacketAnalyzer.inject(player)) {
server.getScheduler().buildTask(loader, () -> {
if (!VelocityPacketAnalyzer.inject(player)) {
if (Storage.ConfigSections.Settings.INJECTION_FAILED.ENABLED) {
Logger.info(MessageTranslator.replaceMessage(
player,
Storage.ConfigSections.Settings.INJECTION_FAILED.CONSOLE_MESSAGE
));
player.disconnect(Component.text(
MessageTranslator.replaceMessage(
player,
Storage.ConfigSections.Settings.INJECTION_FAILED.KICK_MESSAGE
)
));
}
}
}).delay(1, TimeUnit.SECONDS).schedule();
}
}
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
final ServerInfo serverInfo = event.getServer().getServerInfo();
if (serverInfo != null) Storage.tempCachePlayerToServer(player.getUniqueId(), serverInfo.getName());
CommandSender sender = CommandSenderHandler.from(player);
assert sender != null;
PermissionUtil.reloadPermissions(sender);
}
if (Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY != -1) {
return;
}
CustomServerBrand.sendBrandToPlayer(player);
}
@Subscribe
public void onDisconnect(DisconnectEvent event) {
Player player = event.getPlayer();
PATEventHandler.callServerPlayersChangeEvents(player, ServerPlayersChangeEvent.Type.LEFT);
PermissionUtil.resetPermissions(player.getUniqueId());
VelocityPacketAnalyzer.uninject(player);
}
}
package de.rayzs.pat.plugin.listeners.velocity;
import com.velocitypowered.api.event.connection.DisconnectEvent;
import com.velocitypowered.api.proxy.server.ServerInfo;
import de.rayzs.pat.plugin.system.serverbrand.CustomServerBrand;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.ServerPlayersChangeEvent;
import de.rayzs.pat.plugin.packetanalyzer.proxy.VelocityPacketAnalyzer;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.permission.PermissionUtil;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.player.*;
import de.rayzs.pat.plugin.VelocityLoader;
import de.rayzs.pat.api.storage.Storage;
import com.velocitypowered.api.proxy.*;
import de.rayzs.pat.utils.sender.CommandSender;
import net.kyori.adventure.text.Component;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
public class VelocityConnectionListener {
private final ProxyServer server;
private final VelocityLoader loader;
public VelocityConnectionListener(ProxyServer server, VelocityLoader loader) {
this.server = server;
this.loader = loader;
}
@Subscribe
public void onServerPreConnect(ServerPreConnectEvent event) {
final Player player = event.getPlayer();
final CommandSender sender = CommandSender.from(player);
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
final ServerInfo serverInfo = event.getOriginalServer().getServerInfo();
if (serverInfo != null) Storage.tempCachePlayerToServer(player.getUniqueId(), serverInfo.getName());
}
PATEventHandler.callServerPlayersChangeEvents(sender, ServerPlayersChangeEvent.Type.JOINED);
SubArgument.get().updateCachedPlayerNames();
if(CustomServerBrand.get().isEnabled())
server.getScheduler().buildTask(loader, () -> {
if (player.isActive()) CustomServerBrand.get().sendBrandToPlayer(player);
}).delay(500, TimeUnit.MILLISECONDS).schedule();
PermissionUtil.setPlayerPermissions(sender);
if (Storage.OUTDATED && PermissionUtil.hasPermission(sender, "joinupdate", false)) {
server.getScheduler().buildTask(loader, () -> {
if (player.isActive())
MessageTranslator.send(player, Storage.ConfigSections.Settings.UPDATE.OUTDATED, "%player%", player.getUsername());
}).delay(1, TimeUnit.SECONDS).schedule();
}
}
@Subscribe
public void onServerSwitch(ServerConnectedEvent event) {
final Player player = event.getPlayer();
if (!VelocityPacketAnalyzer.isInjected(player)) {
if (!VelocityPacketAnalyzer.inject(player)) {
server.getScheduler().buildTask(loader, () -> {
if (!VelocityPacketAnalyzer.inject(player)) {
if (Storage.ConfigSections.Settings.INJECTION_FAILED.ENABLED) {
Logger.info(MessageTranslator.replaceMessage(
player,
Storage.ConfigSections.Settings.INJECTION_FAILED.CONSOLE_MESSAGE
));
player.disconnect(Component.text(
MessageTranslator.replaceMessage(
player,
Storage.ConfigSections.Settings.INJECTION_FAILED.KICK_MESSAGE
)
));
}
}
}).delay(1, TimeUnit.SECONDS).schedule();
}
}
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
final ServerInfo serverInfo = event.getServer().getServerInfo();
if (serverInfo != null) Storage.tempCachePlayerToServer(player.getUniqueId(), serverInfo.getName());
CommandSender sender = CommandSender.from(player);
Objects.requireNonNull(sender);
PermissionUtil.reloadPermissions(sender);
}
if (Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY != -1) {
return;
}
CustomServerBrand.get().sendBrandToPlayer(player);
}
@Subscribe
public void onDisconnect(DisconnectEvent event) {
final Player player = event.getPlayer();
final CommandSender sender = CommandSender.from(player);
PATEventHandler.callServerPlayersChangeEvents(sender, ServerPlayersChangeEvent.Type.LEFT);
SubArgument.get().updateCachedPlayerNames();
PermissionUtil.resetPermissions(player.getUniqueId());
VelocityPacketAnalyzer.uninject(player);
}
}
@@ -0,0 +1,45 @@
package de.rayzs.pat.plugin.listeners.velocity;
import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.command.CommandExecuteEvent;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.VelocityLoader;
import de.rayzs.pat.utils.LuckPermsWarning;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.concurrent.TimeUnit;
public class VelocityLuckPermsWarning {
private final ProxyServer server;
public VelocityLuckPermsWarning(ProxyServer server) {
this.server = server;
}
@Subscribe
public void onCommandExecute(final CommandExecuteEvent event) {
if (LuckPermsWarning.alreadyAnnounced()) return;
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_WORLD.ENABLED || Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
return;
}
final CommandSource commandSource = event.getCommandSource();
if(! (commandSource instanceof Player player)) return;
final CommandSender sender = CommandSender.from(player);
final String command = event.getCommand();
if (LuckPermsWarning.shouldSendLuckPermsWarning(sender, command)) {
server.getScheduler().buildTask(
VelocityLoader.getInstance(),
() -> LuckPermsWarning.sendAnnouncement(sender)
).delay(1, TimeUnit.SECONDS).schedule();
}
}
}
@@ -5,15 +5,19 @@ import com.velocitypowered.api.proxy.server.ServerPing;
import com.velocitypowered.api.proxy.ProxyServer;
import com.velocitypowered.api.event.Subscribe;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class VelocityPingListener {
private static ProxyServer server;
private static final UUID RANDOM_UUID = UUID.randomUUID();
private ProxyServer server;
public VelocityPingListener(ProxyServer server) {
VelocityPingListener.server = server;
this.server = server;
}
@Subscribe
@@ -40,9 +44,24 @@ public class VelocityPingListener {
builder.clearSamplePlayers();
else if (Storage.ConfigSections.Settings.CUSTOM_PROTOCOL_PING.USE_CUSTOM_PLAYERLIST) {
builder.clearSamplePlayers();
Storage.ConfigSections.Settings.CUSTOM_PROTOCOL_PING.PLAYERLIST.getLines().forEach(line ->
builder.samplePlayers(new ServerPing.SamplePlayer(replaceString(line, online, extend, max), RANDOM_UUID))
);
if (!Storage.ConfigSections.Settings.CUSTOM_PROTOCOL_PING.USE_CENTER_VARIABLE) {
Storage.ConfigSections.Settings.CUSTOM_PROTOCOL_PING.PLAYERLIST.getLines().forEach(line ->
builder.samplePlayers(new ServerPing.SamplePlayer(replaceString(line, online, extend, max), RANDOM_UUID))
);
} else {
List<String> cpyLines = new ArrayList<>(Storage.ConfigSections.Settings.CUSTOM_PROTOCOL_PING.PLAYERLIST.getLines());
cpyLines.replaceAll(string -> replaceString(string, online, extend, max));
StringUtils.centralize(cpyLines);
for (String line : cpyLines) {
builder.samplePlayers(new ServerPing.SamplePlayer(line, RANDOM_UUID));
}
}
}
event.setPing(builder.build());
@@ -1,188 +1,188 @@
package de.rayzs.pat.plugin.logger;
import de.rayzs.pat.api.communication.Communicator;
import de.rayzs.pat.api.communication.client.ClientInfo;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.api.storage.blacklist.impl.GeneralBlacklist;
import de.rayzs.pat.plugin.logger.impl.*;
import java.nio.charset.StandardCharsets;
import javax.net.ssl.HttpsURLConnection;
import de.rayzs.pat.utils.*;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.permission.PermissionPlugin;
import java.net.URL;
import java.util.*;
import java.io.*;
public class Logger {
private static final String LOG_HEADER;
static {
final String software = Reflection.getSoftware().isProxySoftware()
? Reflection.getSoftware().toString()
: Reflection.getVersionName();
final String version = Reflection.isProxyServer() ? "" : " " + Reflection.getRawVersionName().replace("_", ".");
LOG_HEADER = "> ProAntiTab v" + Storage.CURRENT_VERSION + " [" + software + version + "]";
}
private final static LoggerTemplate LOGGER =
Reflection.isVelocityServer() ? new VelocityLogger()
: Reflection.isProxyServer() ? new BungeeLogger()
: new BukkitLogger();
public static void info(List<String> messages) {
LOGGER.info(messages);
}
public static void warning(List<String> messages) {
LOGGER.warn(messages);
}
public static void info(String message) {
LOGGER.info(message);
}
public static void warning(String message) {
LOGGER.warn(message);
}
public static String post() throws IOException {
byte[] textInBytes = (LOG_HEADER + "\n\n" + createInfo()).getBytes(StandardCharsets.UTF_8);
int postDataLength = textInBytes.length;
URL url = new URL("https://haste.rayzs.de/documents");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
DataOutputStream outputStream;
String response;
connection.setDoOutput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("User-Agent", "ProAntiTab");
connection.setRequestProperty("Content-Length", Integer.toString(postDataLength));
connection.setUseCaches(false);
outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.write(textInBytes);
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
response = reader.readLine();
if (response == null || !response.contains("\"key\"")) return null;
response = response.substring(response.indexOf(":") + 2, response.length() - 2);
return "https://haste.rayzs.de/" + response + ".txt";
}
private static String createInfo() {
StringBuilder builder = new StringBuilder();
if (!Reflection.isProxyServer()) {
builder.append("Detected Software-API: ")
.append(Reflection.getSoftware().toString())
.append("\n\n");
}
builder.append("Updated: ")
.append(!Storage.OUTDATED)
.append("\n\n");
builder.append("Mode: ")
.append(Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED ? "WHITELIST" : "BLACKLIST")
.append("\n");
builder.append("Installed plugins: \n ")
.append(String.join("\n ", Storage.getLoader().getPluginNames("%n (%v)")))
.append("\n\n");
builder.append("Detected supported plugins:")
.append("\n");
builder.append(" LuckPerms: ")
.append(Storage.getPermissionPlugin() == PermissionPlugin.LUCKPERMS)
.append("\n");
if (!Reflection.isProxyServer()) {
builder.append(" GroupManager: ")
.append(Storage.getPermissionPlugin() == PermissionPlugin.GROUPMANAGER)
.append("\n");
}
builder.append(" PlaceholderAPI: ")
.append(Storage.USE_PLACEHOLDERAPI)
.append("\n");
builder.append(" ViaVersion: ")
.append(Storage.USE_VIAVERSION)
.append("\n\n");
if (!Reflection.isProxyServer()) {
builder.append("server-name: ")
.append(Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED ? Storage.SERVER_NAME : "Not connected to a proxy using PAT")
.append("\n");
builder.append("last-received-sync: ")
.append(Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED ? TimeConverter.calcAndGetTime(Communicator.get().getLastSync()) : "Deactivated")
.append("\n");
builder.append("last-received-alive-response-packet: ")
.append(Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED ? TimeConverter.calcAndGetTime(Communicator.get().getLastReceivedKeepAliveResponse()) : "Deactivated")
.append("\n");
}
builder.append("\ncommands: ")
.append(String.join(", ", Storage.Blacklist.getBlacklist().getCommands()))
.append("\n\n");
if (Reflection.isProxyServer()) {
builder.append("\nservers: ")
.append(String.join(", ", Storage.getServers()))
.append("\n");
builder.append("last-sent-sync: ")
.append(Storage.ConfigSections.Settings.DISABLE_SYNC.DISABLED ? "Deactivated" : (TimeConverter.calcAndGetTime(Communicator.get().getLastSync())))
.append("\n\n");
builder.append("synced-server: ");
Iterator<ClientInfo> iterator = Communicator.get().getClients().iterator();
while (iterator.hasNext()) {
ClientInfo clientInfo = iterator.next();
builder.append(clientInfo.getServerName())
.append(" (")
.append(clientInfo.getFormattedLastReceivedKeepAlivePacketTime() + " / " + clientInfo.getFormattedSyncTime())
.append(")");
if (iterator.hasNext()) {
builder.append(", ");
}
}
builder.append("\n\n");
}
if (Reflection.isProxyServer()) {
builder.append("server-commands:").append("\n");
for (Map.Entry<String, GeneralBlacklist> blacklist : Storage.Blacklist.getBlacklists()) {
builder.append(" ")
.append(blacklist.getKey()).append(": ")
.append(String.join(", ", blacklist.getValue().getCommands()))
.append("\n");
}
}
builder.append("\ngroups:");
for (Group group : GroupManager.getGroups()) {
builder.append("\n")
.append(group.getGroupInfo());
}
return builder.toString();
}
}
package de.rayzs.pat.plugin.logger;
import de.rayzs.pat.plugin.system.communication.Communicator;
import de.rayzs.pat.plugin.system.communication.client.Client;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.api.storage.blacklist.impl.GeneralBlacklist;
import de.rayzs.pat.plugin.logger.impl.*;
import java.nio.charset.StandardCharsets;
import javax.net.ssl.HttpsURLConnection;
import de.rayzs.pat.utils.*;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.permission.PermissionPlugin;
import java.net.URL;
import java.util.*;
import java.io.*;
public class Logger {
private static final String LOG_HEADER;
static {
final String software = Reflection.getSoftware().isProxySoftware()
? Reflection.getSoftware().toString()
: Reflection.getVersionName();
final String version = Reflection.isProxyServer() ? "" : " " + Reflection.getRawVersionName().replace("_", ".");
LOG_HEADER = "> ProAntiTab v" + Storage.CURRENT_VERSION + " [" + software + version + "]";
}
private final static LoggerTemplate LOGGER =
Reflection.isVelocityServer() ? new VelocityLogger()
: Reflection.isProxyServer() ? new BungeeLogger()
: new BukkitLogger();
public static void info(List<String> messages) {
LOGGER.info(messages);
}
public static void warning(List<String> messages) {
LOGGER.warn(messages);
}
public static void info(String message) {
LOGGER.info(message);
}
public static void warning(String message) {
LOGGER.warn(message);
}
public static String post() throws IOException {
byte[] textInBytes = (LOG_HEADER + "\n\n" + createInfo()).getBytes(StandardCharsets.UTF_8);
int postDataLength = textInBytes.length;
URL url = new URL("https://haste.rayzs.de/documents");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
DataOutputStream outputStream;
String response;
connection.setDoOutput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("User-Agent", "ProAntiTab");
connection.setRequestProperty("Content-Length", Integer.toString(postDataLength));
connection.setUseCaches(false);
outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.write(textInBytes);
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
response = reader.readLine();
if (response == null || !response.contains("\"key\"")) return null;
response = response.substring(response.indexOf(":") + 2, response.length() - 2);
return "https://haste.rayzs.de/" + response + ".txt";
}
private static String createInfo() {
StringBuilder builder = new StringBuilder();
if (!Reflection.isProxyServer()) {
builder.append("Detected Software-API: ")
.append(Reflection.getSoftware().toString())
.append("\n\n");
}
builder.append("Updated: ")
.append(!Storage.OUTDATED)
.append("\n\n");
builder.append("Mode: ")
.append(Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED ? "WHITELIST" : "BLACKLIST")
.append("\n");
builder.append("Installed plugins: \n ")
.append(String.join("\n ", Storage.getLoader().getFormattedPluginNames("%n (%v)")))
.append("\n\n");
builder.append("Detected supported plugins:")
.append("\n");
builder.append(" LuckPerms: ")
.append(Storage.getPermissionPlugin() == PermissionPlugin.LUCKPERMS)
.append("\n");
if (!Reflection.isProxyServer()) {
builder.append(" GroupManager: ")
.append(Storage.getPermissionPlugin() == PermissionPlugin.GROUPMANAGER)
.append("\n");
}
builder.append(" PlaceholderAPI: ")
.append(Storage.USE_PLACEHOLDERAPI)
.append("\n");
builder.append(" ViaVersion: ")
.append(Storage.USE_VIAVERSION)
.append("\n\n");
if (!Reflection.isProxyServer()) {
builder.append("server-name: ")
.append(Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED ? Storage.SERVER_NAME : "Not connected to a proxy using PAT")
.append("\n");
builder.append("last-received-sync: ")
.append(Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED ? TimeConverter.calcAndGetTime(Communicator.get().getLastSync()) : "Deactivated")
.append("\n");
builder.append("last-received-alive-response-packet: ")
.append(Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED ? TimeConverter.calcAndGetTime(Communicator.get().getLastReceivedKeepAliveResponse()) : "Deactivated")
.append("\n");
}
builder.append("\ncommands: ")
.append(String.join(", ", Storage.Blacklist.getBlacklist().getCommands()))
.append("\n\n");
if (Reflection.isProxyServer()) {
builder.append("\nservers: ")
.append(String.join(", ", Storage.getServers()))
.append("\n");
builder.append("last-sent-sync: ")
.append(Storage.ConfigSections.Settings.DISABLE_SYNC.ENABLED ? "Deactivated" : (TimeConverter.calcAndGetTime(Communicator.get().getLastSync())))
.append("\n\n");
builder.append("synced-server: ");
Iterator<Client> iterator = Communicator.get().getClients().iterator();
while (iterator.hasNext()) {
Client clientInfo = iterator.next();
builder.append(clientInfo.getServerName())
.append(" (")
.append(clientInfo.getFormattedLastReceivedKeepAlivePacketTime() + " / " + clientInfo.getFormattedSyncTime())
.append(")");
if (iterator.hasNext()) {
builder.append(", ");
}
}
builder.append("\n\n");
}
if (Reflection.isProxyServer()) {
builder.append("server-commands:").append("\n");
for (Map.Entry<String, GeneralBlacklist> blacklist : Storage.Blacklist.getBlacklists()) {
builder.append(" ")
.append(blacklist.getKey()).append(": ")
.append(String.join(", ", blacklist.getValue().getCommands()))
.append("\n");
}
}
builder.append("\ngroups:");
for (Group group : GroupManager.getGroups()) {
builder.append("\n")
.append(group.getGroupInfo());
}
return builder.toString();
}
}
@@ -1,12 +1,12 @@
package de.rayzs.pat.plugin.metrics;
import de.rayzs.pat.plugin.metrics.impl.*;
import de.rayzs.pat.utils.Reflection;
public class bStats {
public static void initialize(Object pluginObj) {
if(Reflection.isProxyServer()) new BungeeMetrics(pluginObj, 20090);
else new BukkitMetrics(pluginObj, 20089);
}
}
package de.rayzs.pat.plugin.metrics;
import de.rayzs.pat.plugin.metrics.impl.*;
import de.rayzs.pat.utils.Reflection;
public class bStats {
public static void initialize(Object pluginObj) {
if(Reflection.isProxyServer()) new BungeeMetrics(pluginObj, 20090);
else new BukkitMetrics(pluginObj, 20089);
}
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -1,8 +1,10 @@
package de.rayzs.pat.api.netty.bukkit;
package de.rayzs.pat.plugin.packetanalyzer.bukkit;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.plugin.packetanalyzer.bukkit.handlers.LegacyPacketHandler;
import de.rayzs.pat.plugin.packetanalyzer.bukkit.handlers.ModernCommandsNodeHandler;
import de.rayzs.pat.plugin.packetanalyzer.bukkit.handlers.ModernPacketHandler;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.api.netty.bukkit.handlers.*;
import java.util.concurrent.ConcurrentHashMap;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.ExpireCache;
@@ -10,7 +12,6 @@ import de.rayzs.pat.utils.Reflection;
import java.util.concurrent.TimeUnit;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import org.bukkit.entity.Player;
import io.netty.channel.*;
import org.bukkit.Bukkit;
@@ -63,9 +64,15 @@ public class BukkitPacketAnalyzer {
channel.pipeline().addBefore(BukkitPacketAnalyzer.PIPELINE_NAME, BukkitPacketAnalyzer.HANDLER_NAME, new PacketDecoder(player));
BukkitPacketAnalyzer.INJECTED_PLAYERS.put(player.getUniqueId(), channel);
} catch (IndexOutOfBoundsException indexOutOfBoundsException) {
// Switching injection method since some versions of Leaf
// seem to be using different logging variants.
// It's implemented this way since some Leaf forks might have
// changed the compilation and therefore the variables again.
Reflection.toggleInjectionMethod();
boolean success = inject(player);
final boolean success = inject(player);
if (!success) {
Logger.warning("Both injection methods failed! Please report this back to me on my Discord! (https://www.rayzs.de/discord)");
@@ -73,6 +80,13 @@ public class BukkitPacketAnalyzer {
return success;
} catch (NoSuchFieldException noSuchFieldException) {
Logger.warning("Failed to inject into " + player.getName() + " and kicked the player as result, to avoid any security risks.");
Logger.warning("You can read more about it here: https://www.rayzs.de/products/proantitab/pkafi");
Logger.warning("Error details: " + noSuchFieldException.getMessage());
return false;
} catch (Exception exception) {
if (!Storage.ConfigSections.Settings.INJECTION_FAILED.SUPPRESS_EXCEPTIONS) {
exception.printStackTrace();
@@ -124,9 +138,14 @@ public class BukkitPacketAnalyzer {
private final Player player;
private final CommandSender sender;
private long lastCheckedForOperatorPermission = System.currentTimeMillis();
private boolean operatorStatus;
private PacketDecoder(Player player) {
this.player = player;
this.sender = CommandSenderHandler.from(player);
this.sender = CommandSender.from(player);
this.operatorStatus = player.isOp();
}
@Override
@@ -144,15 +163,15 @@ public class BukkitPacketAnalyzer {
return;
}
if (!PermissionUtil.hasBypassPermission(sender)) {
if (!PACKET_HANDLER.handleIncomingPacket(player, sender, packetObj))
return;
if (!hasBypassPermission() && !PACKET_HANDLER.handleIncomingPacket(player, sender, packetObj, false)) {
return;
}
super.channelRead(channel, packetObj);
} catch (Throwable exception) { exception.printStackTrace(); }
} catch (Throwable exception) {
exception.printStackTrace();
}
}
@Override
@@ -168,20 +187,20 @@ public class BukkitPacketAnalyzer {
final boolean isCommandsPacket = packetName.equals("ClientboundCommandsPacket");
final boolean isTabCompletePacket = packetName.equals("PacketPlayOutTabComplete") || packetName.equals("ClientboundCommandSuggestionsPacket");
if (!isCommandsPacket && !isTabCompletePacket || PermissionUtil.hasBypassPermission(sender)) {
if (!isCommandsPacket && !isTabCompletePacket || hasBypassPermission()) {
super.write(channel, packetObj, promise);
return;
}
if (isCommandsPacket) {
COMMANDS_NODE_HANDLER.handleOutgoingPacket(player, sender, packetObj);
COMMANDS_NODE_HANDLER.handleOutgoingPacket(player, sender, packetObj, false);
super.write(channel, packetObj, promise);
return;
}
UUID uuid = player.getUniqueId();
Object sentPacketObj = SENT_PACKET.get(uuid);
final UUID uuid = sender.getUniqueId();
final Object sentPacketObj = SENT_PACKET.get(uuid);
if (sentPacketObj != null) {
if (sentPacketObj == packetObj) {
@@ -191,8 +210,9 @@ public class BukkitPacketAnalyzer {
}
}
if (!PACKET_HANDLER.handleOutgoingPacket(player, sender, packetObj))
if (!PACKET_HANDLER.handleOutgoingPacket(player, sender, packetObj, false)) {
return;
}
super.write(channel, packetObj, promise);
@@ -200,5 +220,19 @@ public class BukkitPacketAnalyzer {
exception.printStackTrace();
}
}
private boolean hasBypassPermission() {
if (PermissionUtil.hasBypassPermission(sender, false)) {
return true;
}
if (System.currentTimeMillis() - this.lastCheckedForOperatorPermission >= 2000) {
this.lastCheckedForOperatorPermission = System.currentTimeMillis();
this.operatorStatus = player.isOp();
return this.operatorStatus;
}
return this.operatorStatus;
}
}
}
@@ -0,0 +1,20 @@
package de.rayzs.pat.plugin.packetanalyzer.bukkit;
import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.entity.Player;
public interface BukkitPacketHandler {
boolean handleIncomingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) throws Exception;
boolean handleOutgoingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) throws Exception;
}
@@ -1,10 +1,11 @@
package de.rayzs.pat.api.netty.bukkit.handlers;
package de.rayzs.pat.plugin.packetanalyzer.bukkit.handlers;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
@@ -13,8 +14,8 @@ import org.bukkit.entity.Player;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.FilteredTabCompletionEvent;
import de.rayzs.pat.api.netty.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.api.netty.bukkit.BukkitPacketHandler;
import de.rayzs.pat.plugin.packetanalyzer.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.plugin.packetanalyzer.bukkit.BukkitPacketHandler;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.Reflection;
@@ -22,7 +23,12 @@ import de.rayzs.pat.utils.Reflection;
public class LegacyPacketHandler implements BukkitPacketHandler {
@Override
public boolean handleIncomingPacket(Player player, CommandSender sender, Object packetObj) throws Exception {
public boolean handleIncomingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) throws Exception {
Field stringField = Reflection.getFirstFieldByType(packetObj.getClass(), "String", Reflection.SearchOption.ENDS);
if(stringField == null) {
Logger.warning("Failed PacketAnalyze process! (#1)");
@@ -35,14 +41,19 @@ public class LegacyPacketHandler implements BukkitPacketHandler {
}
@Override
public boolean handleOutgoingPacket(Player player, CommandSender sender, Object packetObj) throws Exception {
public boolean handleOutgoingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) throws Exception {
final String rawInput = BukkitPacketAnalyzer.getPlayerInput(player);
if(rawInput == null) {
return false;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<Group> groups = GroupManager.getPlayerGroups(sender, isOperator);
String input = rawInput;
boolean cancelsBeforeHand = false;
@@ -53,7 +64,7 @@ public class LegacyPacketHandler implements BukkitPacketHandler {
input = input.substring(1);
final boolean doesBypassNamespace = Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender);
final boolean doesBypassNamespace = Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender, isOperator);
final boolean spaces = input.contains(" ");
if (Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(input) && !doesBypassNamespace) {
@@ -61,7 +72,7 @@ public class LegacyPacketHandler implements BukkitPacketHandler {
}
if (!cancelsBeforeHand && !input.isEmpty()) {
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, StringUtils.getFirstArg(input));
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, StringUtils.getFirstArg(input), isOperator);
}
if (!cancelsBeforeHand) {
@@ -87,7 +98,17 @@ public class LegacyPacketHandler implements BukkitPacketHandler {
return true;
}
FilteredTabCompletionEvent filteredTabCompletionEvent = PATEventHandler.callFilteredTabCompletionEvents(player.getUniqueId(), rawInput, new ArrayList<>(suggestions));
final List<String> tmpSuggestionsList = new ArrayList<>(suggestions);
FilteredTabCompletionEvent filteredTabCompletionEvent = PATEventHandler.callFilteredTabCompletionEvents(
sender,
rawInput,
SubArgument.get().getTabCompleteHandler().handleTabCompletion(
sender,
rawInput,
tmpSuggestionsList
)
);
if (filteredTabCompletionEvent.isCancelled()) {
suggestions.clear();
@@ -106,7 +127,7 @@ public class LegacyPacketHandler implements BukkitPacketHandler {
return false;
}
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, cpy);
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, cpy, isOperator);
});
}
@@ -0,0 +1,37 @@
package de.rayzs.pat.plugin.packetanalyzer.bukkit.handlers;
import de.rayzs.pat.plugin.packetanalyzer.bukkit.BukkitPacketHandler;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.node.BukkitCommandNodeHelper;
import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.entity.Player;
public class ModernCommandsNodeHandler implements BukkitPacketHandler {
public boolean handleIncomingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) {
// Ignored
return true;
}
@Override
public boolean handleOutgoingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) throws Exception {
final BukkitCommandNodeHelper helper = new BukkitCommandNodeHelper(packetObj);
SubArgument.get().getCommandNodeHandler().handleCommandNode(
helper,
SubArgument.get().getPlayerArgument(sender)
);
return true;
}
}
@@ -1,10 +1,11 @@
package de.rayzs.pat.api.netty.bukkit.handlers;
package de.rayzs.pat.plugin.packetanalyzer.bukkit.handlers;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.sender.CommandSender;
@@ -16,10 +17,9 @@ import com.mojang.brigadier.suggestion.Suggestions;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.FilteredTabCompletionEvent;
import de.rayzs.pat.api.netty.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.api.netty.bukkit.BukkitPacketHandler;
import de.rayzs.pat.plugin.packetanalyzer.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.plugin.packetanalyzer.bukkit.BukkitPacketHandler;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.BukkitLoader;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.StringUtils;
@@ -31,10 +31,15 @@ public class ModernPacketHandler implements BukkitPacketHandler {
private static boolean modifiable = true;
@Override
public boolean handleIncomingPacket(Player player, CommandSender sender, Object packetObj) throws Exception {
public boolean handleIncomingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) throws Exception {
Field stringField = Reflection.getFirstFieldByType(packetObj.getClass(), "String", Reflection.SearchOption.ENDS);
if(stringField == null) {
if (stringField == null) {
Logger.warning("Failed PacketAnalyze process! (#1)");
return false;
}
@@ -62,7 +67,12 @@ public class ModernPacketHandler implements BukkitPacketHandler {
}
@Override
public boolean handleOutgoingPacket(Player player, CommandSender sender, Object packetObj) throws Exception {
public boolean handleOutgoingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) throws Exception {
Object suggestionObj;
String rawInput = BukkitPacketAnalyzer.getPlayerInput(player), input = rawInput;
@@ -70,21 +80,22 @@ public class ModernPacketHandler implements BukkitPacketHandler {
return false;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final boolean is121Packet = packetObj.getClass().getSimpleName().equals("ClientboundCommandSuggestionsPacket");
final List<Group> groups = GroupManager.getPlayerGroups(sender, isOperator);
boolean is121Packet = packetObj.getClass().getSimpleName().equals("ClientboundCommandSuggestionsPacket"),
cancelsBeforeHand = false;
boolean cancelsBeforeHand = false;
int spaces = 0;
if(input.startsWith("/") || is121Packet) {
input = input.replace("/", "");
if(input.contains(" ")) {
input = input.substring(1);
if (input.contains(" ")) {
String[] split = input.split(" ");
spaces = split.length;
if(spaces > 0) input = split[0];
if (spaces > 0) input = split[0];
}
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, input);
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, input, isOperator);
if (!cancelsBeforeHand)
cancelsBeforeHand = Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(input) || Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(input);
@@ -113,7 +124,7 @@ public class ModernPacketHandler implements BukkitPacketHandler {
if (spaces == 0) {
suggestions.removeIf(suggestion -> {
String command = getSuggestionFromEntry(suggestion);
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command);
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command, isOperator);
});
return true;
@@ -123,7 +134,9 @@ public class ModernPacketHandler implements BukkitPacketHandler {
for (Object suggestion : suggestions)
suggestionsAsString.add(getSuggestionFromEntry(suggestion));
FilteredTabCompletionEvent filteredTabCompletionEvent = PATEventHandler.callFilteredTabCompletionEvents(player.getUniqueId(), rawInput, suggestionsAsString);
suggestionsAsString = SubArgument.get().getTabCompleteHandler().handleTabCompletion(sender, rawInput, suggestionsAsString);
FilteredTabCompletionEvent filteredTabCompletionEvent = PATEventHandler.callFilteredTabCompletionEvents(sender, rawInput, suggestionsAsString);
if (filteredTabCompletionEvent.isCancelled()) suggestions.clear();
for (int i = 0; i < suggestions.size(); i++) {
@@ -187,7 +200,7 @@ public class ModernPacketHandler implements BukkitPacketHandler {
suggestions.getList().removeIf(suggestion -> {
String command = suggestion.getText();
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command);
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command, isOperator);
});
return true;
@@ -197,7 +210,9 @@ public class ModernPacketHandler implements BukkitPacketHandler {
for (Suggestion suggestion : suggestions.getList())
suggestionsAsString.add(suggestion.getText());
FilteredTabCompletionEvent filteredTabCompletionEvent = PATEventHandler.callFilteredTabCompletionEvents(player.getUniqueId(), rawInput, suggestionsAsString);
suggestionsAsString = SubArgument.get().getTabCompleteHandler().handleTabCompletion(sender, rawInput, suggestionsAsString);
FilteredTabCompletionEvent filteredTabCompletionEvent = PATEventHandler.callFilteredTabCompletionEvents(sender, rawInput, suggestionsAsString);
if (modifiable) {
@@ -1,4 +1,4 @@
package de.rayzs.pat.api.netty.proxy;
package de.rayzs.pat.plugin.packetanalyzer.proxy;
import java.lang.reflect.Field;
import java.util.*;
@@ -8,11 +8,11 @@ import java.util.concurrent.TimeUnit;
import com.mojang.brigadier.tree.CommandNode;
import com.mojang.brigadier.tree.RootCommandNode;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.api.communication.Communicator;
import de.rayzs.pat.plugin.system.serverbrand.CustomServerBrand;
import de.rayzs.pat.plugin.system.communication.Communicator;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.plugin.subarguments.SubArguments;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.CommandsCache;
import de.rayzs.pat.utils.ExpireCache;
import de.rayzs.pat.utils.group.Group;
@@ -21,7 +21,6 @@ import de.rayzs.pat.utils.node.ProxyCommandNodeHelper;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline;
@@ -44,7 +43,6 @@ public class BungeePacketAnalyzer {
private static final List<String> PLUGIN_COMMANDS = new ArrayList<>();
private static Class<?> channelWrapperClass, serverConnectionClass;
private static List<String> PROXY_COMMANDS;
static {
@@ -146,19 +144,19 @@ public class BungeePacketAnalyzer {
private static void modifyCommands(ProxiedPlayer player, CommandSender sender, Commands commands) {
String serverName = sender.getServerName();
final boolean ignore = PermissionUtil.hasBypassPermission(sender) || Storage.Blacklist.isDisabledServer(serverName);
final boolean ignore = PermissionUtil.hasBypassPermission(sender, false) || Storage.Blacklist.isDisabledServer(serverName);
ProxyCommandNodeHelper helper = new ProxyCommandNodeHelper<CommandNode>(commands.getRoot());
List<String> commandsAsString = new ArrayList<>(PROXY_COMMANDS);
commandsAsString.addAll(helper.getChildrenNames());
List<String> playerCommands = new ArrayList<>();
HashSet<String> playerCommands = new HashSet<>();
if (!ignore) {
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
final Map<String, CommandsCache> cache = Storage.getLoader().getCommandsCacheMap();
final Map<String, CommandsCache> cache = Storage.getLoader().getPerServerCommandsCacheMap();
if (!cache.containsKey(serverName)) {
cache.put(serverName, new CommandsCache());
}
@@ -166,7 +164,7 @@ public class BungeePacketAnalyzer {
final CommandsCache commandsCache = cache.get(serverName);
commandsCache.handleCommands(commandsAsString, serverName);
final List<String> tmpPlayerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName);
final HashSet<String> tmpPlayerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName, false);
if (commands.getRoot().getChildren().size() != 0) {
helper.removeIf(str -> !tmpPlayerCommands.contains(str));
@@ -219,7 +217,7 @@ public class BungeePacketAnalyzer {
}
if (!ignore) {
SubArguments.handleCommandNode(player.getUniqueId(), helper);
SubArgument.get().getCommandNodeHandler().handleCommandNode(helper, SubArgument.get().getPlayerArgument(sender));
}
}
@@ -232,7 +230,7 @@ public class BungeePacketAnalyzer {
if (player.getPendingConnection().getVersion() < 754)
continue;
final CommandSender sender = CommandSenderHandler.from(player);
final CommandSender sender = CommandSender.from(player);
RootCommandNode root = new RootCommandNode();
Commands packet = new Commands(root);
@@ -249,7 +247,7 @@ public class BungeePacketAnalyzer {
private PacketDecoder(ProxiedPlayer player) {
this.player = player;
this.sender = CommandSenderHandler.from(player);
this.sender = CommandSender.from(player);
}
@Override
@@ -261,100 +259,16 @@ public class BungeePacketAnalyzer {
if (wrapper.packet instanceof PluginMessage) {
PluginMessage pluginMessage = (PluginMessage) wrapper.packet;
if(CustomServerBrand.isEnabled() && CustomServerBrand.isBrandTag(pluginMessage.getTag()))
if (CustomServerBrand.get().isEnabled() && CustomServerBrand.get().isBrandTag(pluginMessage.getTag())) {
return;
}
} else if (wrapper.packet instanceof Commands) {
Commands response = (Commands) wrapper.packet;
} else if (wrapper.packet instanceof Commands response) {
modifyCommands(player, sender, response);
player.unsafe().sendPacket(response);
return;
/*
} else if (wrapper.packet instanceof TabCompleteResponse) {
TabCompleteResponse response = (TabCompleteResponse) wrapper.packet;
String serverName = player.getServer().getInfo().getName();
System.out.println("damn");
if (!Storage.Blacklist.isDisabledServer(serverName) && player.getPendingConnection().getVersion() < 754) {
if (!PermissionUtil.hasBypassPermission(player)) {
System.out.println("Further!");
System.out.println("Got: " + PLAYER_INPUT_CACHE.get(player.getUniqueId()));
if (!PLAYER_INPUT_CACHE.contains(player.getUniqueId()))
return;
boolean cancelsBeforeHand = false;
String rawPlayerInput = PLAYER_INPUT_CACHE.get(player.getUniqueId());
int spaces = rawPlayerInput.contains(" ") ? rawPlayerInput.split(" ").length : 0;
String playerInput = StringUtils.getFirstArg(rawPlayerInput),
server = player.getServer().getInfo().getName();
System.out.println("NETTY -> " + playerInput);
if (!playerInput.equals("/")) {
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(player, StringUtils.replaceFirst(playerInput, "/", ""), server);
if (!cancelsBeforeHand)
cancelsBeforeHand = !Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(StringUtils.replaceFirst(playerInput, "/", "")) || Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(StringUtils.replaceFirst(playerInput, "/", ""));
}
final String cursor = playerInput;
if (cursor.startsWith("/")) {
if (spaces == 0) {
List<String> suggestions = new ArrayList<>(response.getCommands());
if (Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED) {
setPluginCommands();
Storage.Blacklist.getServerBlacklists(server).forEach(blacklist -> blacklist.getCommands().stream().filter(command -> !suggestions.contains("/" + command)).forEach(command -> {
if (BungeePacketAnalyzer.PLUGIN_COMMANDS.contains(command))
suggestions.add("/" + command);
}));
BungeePacketAnalyzer.PLUGIN_COMMANDS.stream().filter(command -> !suggestions.contains(command)).forEach(command -> {
if (command.startsWith("/"))
command = StringUtils.replaceFirst(command, "/", "");
if (Storage.Blacklist.canPlayerAccessTab(player, command, server)) {
suggestions.add("/" + command);
}
});
suggestions.stream().filter(suggestion -> suggestion.startsWith(cursor) && !response.getCommands().contains(suggestion)).forEach(command -> response.getCommands().add(command));
} else {
BungeePacketAnalyzer.PLUGIN_COMMANDS.stream().filter(command -> !suggestions.contains(command)).forEach(suggestions::add);
suggestions.removeIf(command -> {
if (command.startsWith("/"))
command = StringUtils.replaceFirst(command, "/", "");
return !Storage.Blacklist.canPlayerAccessTab(player, command, server);
});
response.getCommands().clear();
suggestions.forEach(command -> response.getCommands().add(command));
}
if (response.getCommands().isEmpty())
return;
} else {
if (cancelsBeforeHand)
return;
}
player.unsafe().sendPacket(new TabCompleteResponse(response.getCommands()));
}
}
}*/
}
list.add(wrapper);
@@ -1,4 +1,4 @@
package de.rayzs.pat.api.netty.proxy;
package de.rayzs.pat.plugin.packetanalyzer.proxy;
import java.lang.reflect.Field;
import java.util.*;
@@ -14,14 +14,14 @@ import com.velocitypowered.proxy.protocol.packet.TabCompleteRequestPacket;
import com.velocitypowered.proxy.protocol.packet.TabCompleteResponsePacket;
import com.velocitypowered.proxy.protocol.packet.chat.session.UnsignedPlayerCommandPacket;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.plugin.system.serverbrand.CustomServerBrand;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.FilteredTabCompletionEvent;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.VelocityLoader;
import de.rayzs.pat.plugin.listeners.velocity.VelocityBlockCommandListener;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.plugin.subarguments.SubArguments;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.CommandsCache;
import de.rayzs.pat.utils.PacketUtils;
import de.rayzs.pat.utils.Reflection;
@@ -32,7 +32,6 @@ import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.node.ProxyCommandNodeHelper;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import io.netty.channel.Channel;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext;
@@ -42,8 +41,6 @@ import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
public class VelocityPacketAnalyzer {
private static boolean FAILED = false;
static {
try {
final String name = "minecraft:ask_server";
@@ -63,7 +60,6 @@ public class VelocityPacketAnalyzer {
} catch (Exception exception) {
exception.printStackTrace();
FAILED = true;
}
}
@@ -89,32 +85,41 @@ public class VelocityPacketAnalyzer {
public static boolean inject(Player player) {
if(connectedPlayerConnectionClass == null)
if (connectedPlayerConnectionClass == null) {
connectedPlayerConnectionClass = Reflection.getClass("com.velocitypowered.proxy.connection.client.ConnectedPlayer");
}
if(minecraftConnectionClass == null)
if (minecraftConnectionClass == null) {
minecraftConnectionClass = Reflection.getClass("com.velocitypowered.proxy.connection.MinecraftConnection");
Channel channel;
}
try {
Object connectedPlayerObj = connectedPlayerConnectionClass.cast(player),
minecraftConnectionObj = Reflection.getMethodsByName(connectedPlayerConnectionClass, "getConnection").get(0).invoke(connectedPlayerObj);
final Object connectedPlayerObj = connectedPlayerConnectionClass.cast(player);
final Object minecraftConnectionObj = Reflection.getMethodsByName(connectedPlayerConnectionClass, "getConnection")
.get(0).invoke(connectedPlayerObj);
channel = (Channel) Reflection.getMethodsByName(minecraftConnectionClass, "getChannel").get(0).invoke(minecraftConnectionObj);
final Channel channel = (Channel) Reflection.getMethodsByName(minecraftConnectionClass, "getChannel").get(0).invoke(minecraftConnectionObj);
if (channel == null) {
Logger.warning("Failed to inject " + player.getUsername() + "! Channel is null.");
return false;
}
if (channel.pipeline().names().contains(VelocityPacketAnalyzer.PIPELINE_NAME))
if (channel.pipeline().names().contains(VelocityPacketAnalyzer.PIPELINE_NAME)) {
uninject(player);
}
channel.pipeline().addBefore(
VelocityPacketAnalyzer.HANDLER_NAME,
VelocityPacketAnalyzer.PIPELINE_NAME,
new PacketDecoder(player)
);
channel.pipeline().addBefore(VelocityPacketAnalyzer.HANDLER_NAME, VelocityPacketAnalyzer.PIPELINE_NAME, new PacketDecoder(player));
VelocityPacketAnalyzer.INJECTED_PLAYERS.put(player, channel);
} catch (NoSuchElementException e) {
} catch (NoSuchElementException noSuchElementException) {
Logger.warning("Failed to find 'handler' inside player pipeline! (name=" + player.getUsername() + ", uuid=" + player.getUniqueId() + ", version=" + player.getProtocolVersion() + ", brand=" + player.getClientBrand() + " )");
return false;
@@ -132,16 +137,21 @@ public class VelocityPacketAnalyzer {
public static void uninject(Player player) {
VelocityPacketAnalyzer.PLAYER_INPUT_CACHE.remove(player);
if(VelocityPacketAnalyzer.INJECTED_PLAYERS.containsKey(player)) {
Channel channel = VelocityPacketAnalyzer.INJECTED_PLAYERS.get(player);
if(channel != null) {
VelocityPacketAnalyzer.INJECTED_PLAYERS.remove(player);
channel.eventLoop().submit(() -> {
ChannelPipeline pipeline = channel.pipeline();
if (pipeline.names().contains(VelocityPacketAnalyzer.PIPELINE_NAME)) pipeline.remove(VelocityPacketAnalyzer.PIPELINE_NAME);
});
}
final Channel channel = VelocityPacketAnalyzer.INJECTED_PLAYERS.get(player);
if (channel == null) {
return;
}
VelocityPacketAnalyzer.INJECTED_PLAYERS.remove(player);
channel.eventLoop().submit(() -> {
final ChannelPipeline pipeline = channel.pipeline();
if (pipeline.names().contains(VelocityPacketAnalyzer.PIPELINE_NAME)) {
pipeline.remove(VelocityPacketAnalyzer.PIPELINE_NAME);
}
});
}
public static String getPlayerInput(Player player) {
@@ -165,9 +175,9 @@ public class VelocityPacketAnalyzer {
}
String serverName = sender.getServerName();
final String serverName = sender.getServerName();
final boolean ignore = PermissionUtil.hasBypassPermission(sender) || Storage.Blacklist.isDisabledServer(serverName);
final boolean ignore = PermissionUtil.hasBypassPermission(sender, false) || Storage.Blacklist.isDisabledServer(serverName);
final ProxyCommandNodeHelper<CommandSource> helper = new ProxyCommandNodeHelper<>(commands.getRootNode());
final List<String> commandsAsString = new ArrayList<>();
@@ -177,9 +187,9 @@ public class VelocityPacketAnalyzer {
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
final Map<String, CommandsCache> cache = Storage.getLoader().getCommandsCacheMap();
final Map<String, CommandsCache> cache = Storage.getLoader().getPerServerCommandsCacheMap();
if (!cache.containsKey(serverName)) {
cache.put(serverName, new CommandsCache());
}
@@ -187,7 +197,7 @@ public class VelocityPacketAnalyzer {
final CommandsCache commandsCache = cache.get(serverName);
commandsCache.handleCommands(commandsAsString, serverName);
final List<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName);
final HashSet<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName, false);
helper.removeIf(str -> {
if (str.equals("args")) {
return false;
@@ -204,7 +214,7 @@ public class VelocityPacketAnalyzer {
Storage.ConfigSections.Settings.CUSTOM_PLUGIN.COMMANDS.getLines().forEach(input -> helper.add(input, false));
}
SubArguments.handleCommandNode(player.getUniqueId(), helper);
SubArgument.get().getCommandNodeHandler().handleCommandNode(helper, SubArgument.get().getPlayerArgument(sender));
}
private static class PacketDecoder extends ChannelDuplexHandler {
@@ -214,23 +224,22 @@ public class VelocityPacketAnalyzer {
private PacketDecoder(Player player) {
this.player = player;
this.sender = CommandSenderHandler.from(player);
this.sender = CommandSender.from(player);
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
if (!(msg instanceof MinecraftPacket)) {
if (!(msg instanceof MinecraftPacket packet)) {
super.channelRead(ctx, msg);
return;
}
MinecraftPacket packet = (MinecraftPacket) msg;
if (packet.getClass().getSimpleName().equals("SignedChatCommand")) {
try {
if (signedChatCommandPacketClass == null)
if (signedChatCommandPacketClass == null) {
signedChatCommandPacketClass = Class.forName("com.velocitypowered.proxy.crypto.SignedChatCommand");
}
Object signedChatCommandPacket = signedChatCommandPacketClass.cast(packet);
Field commandField = signedChatCommandPacket.getClass().getField("command");
@@ -273,8 +282,9 @@ public class VelocityPacketAnalyzer {
MinecraftPacket packet = (MinecraftPacket) msg;
if (packet instanceof PluginMessagePacket pluginMessagePacket) {
if(CustomServerBrand.isEnabled() && CustomServerBrand.isBrandTag(pluginMessagePacket.getChannel()) && !player.getCurrentServer().isPresent()) {
PacketUtils.BrandManipulate brandManipulatePacket = CustomServerBrand.createBrandPacket(player);
if(CustomServerBrand.get().isEnabled() && CustomServerBrand.get().isBrandTag(pluginMessagePacket.getChannel()) && !player.getCurrentServer().isPresent()) {
final PacketUtils.BrandManipulate brandManipulatePacket = CustomServerBrand.get().createBrandPacket(player);
super.write(ctx, new PluginMessagePacket(pluginMessagePacket.getChannel(), brandManipulatePacket.getByteBuf()), promise);
return;
}
@@ -288,8 +298,8 @@ public class VelocityPacketAnalyzer {
return;
}
if (!PermissionUtil.hasBypassPermission(sender) && player.getCurrentServer().isPresent()) {
final List<Group> groups = GroupManager.getPlayerGroups(sender);
if (!PermissionUtil.hasBypassPermission(sender, false) && player.getCurrentServer().isPresent()) {
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
boolean cancelsBeforeHand = false;
String playerInput = getPlayerInput(player), rawPlayerInput = playerInput, server = player.getCurrentServer().get().getServerInfo().getName();
@@ -302,10 +312,11 @@ public class VelocityPacketAnalyzer {
}
if (!playerInput.equals("/")) {
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, StringUtils.replaceFirst(playerInput, "/", ""), server);
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, StringUtils.replaceFirst(playerInput, "/", ""), server, false);
if (!cancelsBeforeHand)
if (!cancelsBeforeHand) {
cancelsBeforeHand = Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(StringUtils.replaceFirst(playerInput, "/", "")) || Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(StringUtils.replaceFirst(playerInput, "/", ""));
}
}
final String cursor = playerInput;
@@ -315,6 +326,7 @@ public class VelocityPacketAnalyzer {
}
if (cursor.startsWith("/")) {
if (spaces == 0) {
response.getOffers().removeIf(offer -> {
String command = offer.getText();
@@ -324,23 +336,37 @@ public class VelocityPacketAnalyzer {
return false;
}
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command, player.getCurrentServer().get().getServerInfo().getName());
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command, player.getCurrentServer().get().getServerInfo().getName(), false);
});
} else {
if (cancelsBeforeHand) return;
List<String> suggestionsAsString = new ArrayList<>();
if (cancelsBeforeHand) {
return;
}
final List<String> suggestionsAsString = new ArrayList<>();
response.getOffers().forEach(offer -> suggestionsAsString.add(offer.getText()));
FilteredTabCompletionEvent filteredTabCompletionEvent = PATEventHandler.callFilteredTabCompletionEvents(player.getUniqueId(), rawPlayerInput, suggestionsAsString);
final FilteredTabCompletionEvent filteredTabCompletionEvent = PATEventHandler.callFilteredTabCompletionEvents(
sender,
rawPlayerInput,
SubArgument.get().getTabCompleteHandler().handleTabCompletion(
sender,
rawPlayerInput,
suggestionsAsString
)
);
if (filteredTabCompletionEvent.isCancelled()) {
return;
}
response.getOffers().removeIf(offer -> !filteredTabCompletionEvent.getCompletion().contains(offer.getText()));
if (response.getOffers().isEmpty()) return;
if (response.getOffers().isEmpty()) {
return;
}
}
}
}
@@ -348,69 +374,12 @@ public class VelocityPacketAnalyzer {
} else if (packet instanceof AvailableCommandsPacket commands) {
if (player.getCurrentServer().isPresent()) {
modifyCommands(player, sender, commands);
super.write(ctx, msg, promise);
if (!FAILED) {
modifyCommands(player, sender, commands);
super.write(ctx, msg, promise);
return;
}
if (!PermissionUtil.hasBypassPermission(player)) {
super.write(ctx, msg, promise);
return;
}
final String serverName = player.getCurrentServer().get().getServer().getServerInfo().getName();
if (Storage.Blacklist.isDisabledServer(serverName)) {
super.write(ctx, msg, promise);
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
if(!commands.getRootNode().getChildren().isEmpty()) {
Map<String, CommandsCache> cache = Storage.getLoader().getCommandsCacheMap();
if (!cache.containsKey(serverName))
cache.put(serverName, new CommandsCache());
CommandsCache commandsCache = cache.get(serverName);
List<String> commandsAsString = new ArrayList<>();
commands.getRootNode().getChildren().stream().filter(command -> command != null && command.getName() != null).forEach(command -> commandsAsString.add(command.getName()));
commandsCache.handleCommands(commandsAsString, serverName);
if (PermissionUtil.hasBypassPermission(player)) return;
final boolean newer = player.getProtocolVersion().getProtocol() > 340;
final List<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName);
if (commands.getRootNode().getChildren().size() == 1 && newer
&& commands.getRootNode().getChild("args") != null
&& commands.getRootNode().getChild("args").getChildren().isEmpty()) {
super.write(ctx, msg, promise);
return;
}
commands.getRootNode().getChildren().removeIf(command -> {
if (command == null || command.getName() == null)
return true;
if (command.getName().equals("args"))
return false;
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(command.getName()) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(command.getName())) {
return false;
}
return !playerCommands.contains(command.getName());
});
}
return;
}
}
super.write(ctx, msg, promise);
@@ -1,261 +0,0 @@
package de.rayzs.pat.plugin.subarguments;
import de.rayzs.pat.api.storage.blacklist.impl.GeneralBlacklist;
import de.rayzs.pat.plugin.subarguments.events.ExecuteCommand;
import de.rayzs.pat.plugin.subarguments.events.TabCompletion;
import de.rayzs.pat.plugin.subarguments.events.UpdateList;
import de.rayzs.pat.utils.node.BukkitCommandNodeHelper;
import de.rayzs.pat.utils.node.ProxyCommandNodeHelper;
import de.rayzs.pat.utils.permission.PermissionPlugin;
import de.rayzs.pat.utils.response.ResponseHandler;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import de.rayzs.pat.utils.subargs.*;
import java.util.stream.Collectors;
import de.rayzs.pat.utils.group.*;
import de.rayzs.pat.utils.*;
import java.util.*;
public class SubArguments {
public static List<String> GENERAL_LIST, BLOCKED_MESSAGE, PLAYER_NAMES, ONLINE_PLAYERS;
public static HashMap<UUID, Arguments> PLAYER_COMMANDS = new HashMap<>();
public static void initialize() {
updateList();
updateMessages();
updatePlayerNames();
PATEventHandler.register(new TabCompletion());
PATEventHandler.register(new ExecuteCommand());
PATEventHandler.register(UpdateList.UPDATE_PLUGIN_EVENT);
PATEventHandler.register(UpdateList.RECEIVE_SYNC_EVENT);
PATEventHandler.register(UpdateList.UPDATE_PLAYER_COMMANDS_EVENT);
PATEventHandler.register(UpdateList.SERVER_PLAYERS_CHANGE_EVENT);
}
public static void updatePlayerNames() {
PLAYER_NAMES = Storage.getLoader().getPlayerNames();
ONLINE_PLAYERS = Storage.getLoader().getOnlinePlayerNames();
}
public static List<String> getPlayerNames() {
return PLAYER_NAMES;
}
public static List<String> getOnlinePlayerNames() {
return ONLINE_PLAYERS;
}
public static void updateList() {
GENERAL_LIST = Storage.Blacklist.getBlacklist().getCommands().stream().filter(command -> command.contains(" ")).collect(Collectors.toList());
Arguments.ARGUMENTS.clearArguments();
GENERAL_LIST.forEach(command -> Arguments.ARGUMENTS.buildArgumentStacks(command));
SubArguments.PLAYER_COMMANDS = new HashMap<>();
}
public static void updateMessages() {
Storage.Files.CUSTOM_RESPONSES.reload();
ResponseHandler.update();
}
public static void handleCommandNode(UUID uuid, ProxyCommandNodeHelper helper) {
final boolean turn = Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED;
Arguments arguments = PLAYER_COMMANDS.get(uuid);
if (arguments == null) {
return;
}
ArgumentSource source = arguments.TAB_ARGUMENTS;
if (source == null) {
return;
}
final List<String> inputs = source.getAllInputs();
final List<String> actuallyExistingCommands = helper.getChildrenNames();
if (turn) {
List<String> allEntries = inputs.stream().map(StringUtils::getFirstArg).toList();
helper.removeIf(allEntries::contains);
}
final int length = inputs.size();
for (int i = 0; i < length; i++) {
String input;
try {
input = inputs.get(i);
} catch (IndexOutOfBoundsException indexOutOfBoundsException) {
break;
}
final boolean negated = Storage.Blacklist.BlockTypeFetcher.isNegated(input);
if (!negated) {
if (turn && actuallyExistingCommands.contains(StringUtils.getFirstArg(input))) {
helper.add(input, true);
} else helper.removeSubArguments(input);
continue;
}
final Storage.Blacklist.BlockType type = Storage.Blacklist.BlockTypeFetcher.getType(input);
if (type == Storage.Blacklist.BlockType.CHAT) {
continue;
}
input = Storage.Blacklist.BlockTypeFetcher.cleanse(input);
if (turn) helper.removeSubArguments(input);
else if (actuallyExistingCommands.contains(StringUtils.getFirstArg(input))) {
helper.add(input, true);
}
}
}
public static void handleCommandNode(UUID uuid, BukkitCommandNodeHelper helper) throws Exception {
final boolean turn = Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED;
Arguments arguments = PLAYER_COMMANDS.get(uuid);
if (arguments == null) {
return;
}
ArgumentSource source = arguments.TAB_ARGUMENTS;
if (source == null) {
return;
}
final List<String> inputs = new ArrayList<>(source.getAllInputs());
final List<String> argumentsList = new ArrayList<>();
final int length = inputs.size();
for (int i = 0; i < length; i++) {
String input;
try {
input = inputs.get(i);
} catch (IndexOutOfBoundsException indexOutOfBoundsException) {
break;
}
final Storage.Blacklist.BlockType type = Storage.Blacklist.BlockTypeFetcher.getType(input);
if (type == Storage.Blacklist.BlockType.CHAT) {
continue;
}
final boolean negated = Storage.Blacklist.BlockTypeFetcher.isNegated(input);
input = Storage.Blacklist.BlockTypeFetcher.cleanse(input);
if (!negated) {
if (turn) argumentsList.add(input);
else helper.removeSubArguments(input);
continue;
}
if (turn) helper.removeSubArguments(input);
else argumentsList.add(input);
}
if (argumentsList.isEmpty()) {
return;
}
helper.spareRecursively(argumentsList);
}
public static List<String> getServerCommands(UUID uuid) {
return getServerCommands(Storage.getLoader().getPlayerServerName(uuid));
}
public static List<String> getServerCommands(String serverName) {
List<String> commands = new ArrayList<>(Storage.Blacklist.getBlacklist().getCommands());
if (!Reflection.isProxyServer())
return commands;
if (serverName == null)
return commands;
List<GeneralBlacklist> blacklists = Storage.Blacklist.getServerBlacklists(serverName);
for (GeneralBlacklist blacklist : blacklists)
commands.addAll(blacklist.getCommands());
return commands;
}
public static List<String> getGroupCommands(UUID uuid) {
return getGroupCommands(uuid, null);
}
public static List<String> getGroupCommands(UUID uuid, String serverName) {
List<String> commands = new ArrayList<>();
List<Group> groups;
if (Storage.getPermissionPlugin() == PermissionPlugin.NONE) {
CommandSender sender = CommandSenderHandler.from(uuid);
groups = GroupManager.getPlayerGroups(sender);
} else {
groups = GroupManager.getPlayerGroups(uuid);
}
if (serverName == null) {
groups.forEach(group -> commands.addAll(group.getCommands()));
return commands;
}
groups.forEach(group -> {
commands.addAll(group.getCommands());
List<String> associatedServerNames = group.getBlacklistServerNames(serverName);
associatedServerNames.forEach(s -> {
commands.addAll(group.getCommands(s));
});
});
return commands;
}
public static String replacePlaceholders(String input) {
String[] split = input.split(" ");
for (int i = 0; i < split.length; i++) {
String s = split[i];
boolean number = NumberUtils.isDigit(split[i]),
online = Storage.getLoader().isPlayerOnline(s),
general = Storage.getLoader().doesPlayerExist(s);
if (online && general) {
split[i] = "%both_players%";
continue;
}
if (online) {
split[i] = "%online_players%";
continue;
}
if (general) {
split[i] = "%players%";
continue;
}
if (number) {
split[i] = "%numbers%";
}
}
return String.join(" ", split);
}
}
@@ -1,148 +0,0 @@
package de.rayzs.pat.plugin.subarguments.events;
import de.rayzs.pat.api.event.events.FilteredTabCompletionEvent;
import de.rayzs.pat.plugin.subarguments.SubArguments;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.*;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import de.rayzs.pat.utils.subargs.Arguments;
import java.util.*;
public class TabCompletion extends FilteredTabCompletionEvent {
@Override
public void handle(FilteredTabCompletionEvent event) {
final String cursor = event.getCursor().substring(1);
if (event.getCompletion().isEmpty()) return;
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isCommand(cursor) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isCommand(cursor)) {
event.setCompletion(List.of());
event.setCancelled(true);
return;
}
final boolean turn = Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED;
final UUID uuid = event.getSenderObj() instanceof UUID
? (UUID) event.getSenderObj()
: CommandSenderHandler.from(event.getSenderObj()).getUniqueId();
final Arguments arguments = SubArguments.PLAYER_COMMANDS.getOrDefault(uuid, Arguments.ARGUMENTS);
List<String> possibilities = event.getCompletion(), result = new ArrayList<>(arguments.getResultTab(cursor));
final List<String> negated = new ArrayList<>(arguments.getResultTab("!" + cursor));
final List<String> negatedInputs = new ArrayList<>(arguments.TAB_ARGUMENTS.INPUTS).stream().filter(s -> {
if (s.isEmpty())
return false;
boolean n = s.charAt(0) == '!';
if (!n && s.length() > 5)
n = s.charAt(5) == '!';
return n;
}).map(s -> s.substring(1 + (s.charAt(0) == '[' ? 5 : 0))).toList();
if (negatedInputs.stream().anyMatch(cursor::startsWith)) {
if (turn) {
event.setCompletion(new ArrayList<>());
}
return;
}
result.removeIf(s -> s.contains("-_"));
if (turn) {
possibilities = result;
if (possibilities.isEmpty() && !negated.isEmpty()) {
possibilities = event.getCompletion();
possibilities.removeAll(negated);
}
if (result.contains("%numbers%")) {
possibilities.remove("%numbers%");
possibilities.addAll(event.getCompletion().stream().filter(NumberUtils::isDigit).toList());
if (possibilities.isEmpty())
possibilities.add("///////////");
}
if (result.contains("%players%")) {
possibilities.remove("%players%");
possibilities.addAll(SubArguments.getPlayerNames());
}
if (result.contains("%online_players%")) {
possibilities.remove("%online_players%");
possibilities.addAll(SubArguments.getOnlinePlayerNames());
}
if (result.contains("%offline_players%")) {
possibilities.remove("%offline_players%");
possibilities.removeAll(SubArguments.getOnlinePlayerNames());
}
if (result.contains("%hidden_players%")) {
possibilities.remove("%hidden_players%");
possibilities.addAll(event.getCompletion().stream().filter(completion -> {
if (SubArguments.getPlayerNames().contains(completion))
return false;
return result.contains(completion);
}).toList());
if (possibilities.isEmpty())
possibilities.add("///////////");
}
if (result.contains("%hidden_online_players%")) {
possibilities.remove("%hidden_online_players%");
possibilities.addAll(event.getCompletion().stream().filter(completion -> {
if (SubArguments.getOnlinePlayerNames().contains(completion))
return false;
return result.contains(completion);
}).toList());
if (possibilities.isEmpty())
possibilities.add("///////////");
}
} else {
if (result.contains("%numbers%"))
possibilities.removeIf(NumberUtils::isDigit);
if (result.contains("%players%"))
possibilities.removeIf(possibility -> SubArguments.getPlayerNames().contains(possibility));
if (result.contains("%offline_players%"))
possibilities.removeIf(possibility -> !SubArguments.getPlayerNames().contains(possibility));
if (result.contains("%online_players%"))
possibilities.removeIf(possibility -> SubArguments.getOnlinePlayerNames().contains(possibility));
possibilities.removeIf(s -> {
if (negated.contains(s)) {
return false;
}
return result.contains(s);
});
}
String firstCursorArg = StringUtils.getFirstArg(cursor.toLowerCase());
if (possibilities.isEmpty() && !SubArguments.GENERAL_LIST.contains(firstCursorArg)) {
return;
}
event.setCompletion(possibilities);
}
}
@@ -1,94 +0,0 @@
package de.rayzs.pat.plugin.subarguments.events;
import de.rayzs.pat.plugin.subarguments.SubArguments;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import de.rayzs.pat.api.event.events.*;
import de.rayzs.pat.utils.subargs.Arguments;
import java.util.*;
public class UpdateList {
public static UpdatePluginEvent UPDATE_PLUGIN_EVENT = new UpdatePluginEvent() {
@Override
public void handle(UpdatePluginEvent event) {
SubArguments.updateMessages();
SubArguments.updateList();
}
};
public static ServerPlayersChangeEvent SERVER_PLAYERS_CHANGE_EVENT = new ServerPlayersChangeEvent() {
@Override
public void handle(ServerPlayersChangeEvent event) {
SubArguments.updatePlayerNames();
}
};
public static ReceiveSyncEvent RECEIVE_SYNC_EVENT = new ReceiveSyncEvent() {
@Override
public void handle(ReceiveSyncEvent event) {
SubArguments.updateList();
}
};
public static UpdatePlayerCommandsEvent UPDATE_PLAYER_COMMANDS_EVENT = new UpdatePlayerCommandsEvent() {
@Override
public void handle(UpdatePlayerCommandsEvent event) {
final UUID uuid = event.getSenderObj() instanceof UUID
? (UUID) event.getSenderObj()
: CommandSenderHandler.from(event.getSenderObj()).getUniqueId();
final Arguments argument = SubArguments.PLAYER_COMMANDS.getOrDefault(uuid, new Arguments());
final String serverName = Storage.getLoader().getPlayerServerName(uuid);
argument.clearArguments();
if (Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED) {
for (String command : event.getCommands()) {
argument.buildArgumentStacks(command);
}
for (String command : SubArguments.getGroupCommands(uuid, serverName)) {
argument.buildArgumentStacks(command);
}
for (String command : SubArguments.getServerCommands(uuid)) {
argument.buildArgumentStacks(command);
}
} else {
final List<String> groupCommands = SubArguments.getGroupCommands(uuid, serverName);
if (Reflection.isProxyServer()) {
final List<String> commands = SubArguments.getServerCommands(uuid);
commands.removeIf(groupCommands::contains);
for (String command : commands) {
argument.buildArgumentStacks(command);
}
} else {
for (String command : Arguments.ARGUMENTS.CHAT_ARGUMENTS.getGeneralArgument().getInputs()) {
if (groupCommands.contains(command)) continue;
argument.CHAT_ARGUMENTS.buildArguments(Storage.Blacklist.BlockTypeFetcher.modify(command));
}
for (String command : Arguments.ARGUMENTS.TAB_ARGUMENTS.getGeneralArgument().getInputs()) {
if (groupCommands.contains(command)) continue;
argument.TAB_ARGUMENTS.buildArguments(Storage.Blacklist.BlockTypeFetcher.modify(command));
}
}
}
SubArguments.PLAYER_COMMANDS.putIfAbsent(uuid, argument);
}
};
}
@@ -1,4 +1,4 @@
package de.rayzs.pat.api.communication;
package de.rayzs.pat.plugin.system.communication;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.logger.Logger;
@@ -7,16 +7,43 @@ import org.bukkit.Bukkit;
public class BackendUpdater {
/**
*
* I wasn't sure how to call this class, but this class is mainly only
* for managing whether PAT is still connected to the proxy or not.
* It sends a keep-alive packet and if it doesn't get a response once
* the next iteration of the scheduler starts, it will consider itself
* 'desynchronized' and sends an IdentityRequest packet to the proxy instead,
* restarting the whole process until it gets into a stable connection once more.
*
*/
public static BackendUpdater instance;
public static void initialize() {
if (instance != null) {
Logger.warning("BackendUpdater already initialized");
return;
}
instance = new BackendUpdater();
}
public static BackendUpdater get() {
return instance;
}
private BackendUpdater() {}
private static PATSchedulerTask TASK;
private static boolean CONNECTED = false,
private PATSchedulerTask TASK;
private boolean CONNECTED = false,
WAITING = false;
private static final long SCHEDULER_PERIOD_TIME = 20 * 10;
private final long SCHEDULER_PERIOD_TIME = 20 * 10;
public static void handle() {
public void handle() {
if (!Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
return;
}
@@ -29,21 +56,21 @@ public class BackendUpdater {
start();
}
public static void restart() {
public void restart() {
stop();
handle();
}
public static void receivedKeepAlivePacket() {
public void receivedKeepAlivePacket() {
WAITING = false;
CONNECTED = true;
}
public static boolean isConnected() {
public boolean isConnected() {
return CONNECTED;
}
private static void start() {
private void start() {
if (isRunning()) return;
TASK = PATScheduler.createScheduler(() -> {
@@ -72,7 +99,7 @@ public class BackendUpdater {
}, 20, SCHEDULER_PERIOD_TIME);
}
public static void stop() {
public void stop() {
disconnect();
if (isRunning()) {
@@ -81,16 +108,16 @@ public class BackendUpdater {
}
}
private static void disconnect() {
private void disconnect() {
CONNECTED = false;
WAITING = false;
}
private static boolean isRunning() {
private boolean isRunning() {
return TASK != null && TASK.isActive();
}
private static boolean canRun() {
private boolean canRun() {
if (!Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
return false;
}
Loaded 100 of 178 files, more files were not shown because too many files have changed in this diff. Show more