Compare commits

..
46 Commits
Author SHA1 Message Date
rayzsyt e0747a5101 Fixed incompatibility issue with Skript commands 2026-08-15 23:48:46 +02:00
rayzsyt 5741dab763 Small logical change to improve performance by a tiny bit 2026-08-15 23:34:17 +02:00
rayzsyt 5d7a8bb4c5 Improved implementation of cached commands 2026-08-15 23:34:04 +02:00
rayzsyt 786b2fa560 Fixed logic when to send warning message 2026-08-15 23:33:51 +02:00
rayzsyt 5cf51052d2 Fixed exception when loading or reading list 2026-08-15 23:33:40 +02:00
rayzsyt 22eaecb17f Update version 2026-08-15 15:46:39 +02:00
rayzsyt 816354bb92 Implemented warning message when trying to use 'custom-unknown-command' feature while PAT is running in WHITELIST mode anyway 2026-08-15 15:43:27 +02:00
rayzsyt 2fc6d96bd9 Small adjustments 2026-08-15 15:43:00 +02:00
rayzsyt 3f472b0bf5 Moved REGISTER_CHANNELS to appropriate config section instead 2026-08-15 15:21:16 +02:00
rayzsyt 41417893be Implement hide-plugin-channels feature for Bungeecord 2026-08-15 15:20:54 +02:00
rayzsyt 64a7b80ec5 Implement hide-plugin-channels feature for Velocity 2026-08-15 15:04:05 +02:00
rayzsyt 65f136f2b8 Just moved a line bit further down lol 2026-08-15 15:03:15 +02:00
rayzsyt 618bee5e9b Implement plugin-spoofing fix via plugin-channels 2026-08-15 04:29:06 +02:00
rayzsyt ea377e4841 Update version 2026-08-13 17:00:58 +02:00
rayzsyt 6e1aa252c2 Switched List -> HashSet for better performance 2026-08-13 17:00:14 +02:00
rayzsyt 733f73a9b2 Register LuckPermsWarning Listener 2026-08-13 16:59:32 +02:00
rayzsyt 89b3fb65a2 Small logic changes 2026-08-12 15:29:49 +02:00
rayzsyt 148f24f516 Implemented notice message when trying to apply permissions using contexts 2026-08-12 00:00:10 +02:00
rayzsyt b80ad195ca Improved performance 2026-08-11 15:49:42 +02:00
rayzsyt 6e33bed086 Fixed BLACKLIST sub-argument filtering 2026-08-11 15:49:34 +02:00
rayzsyt 245e433ab9 Removed debug message 2026-08-10 22:21:56 +02:00
rayzsyt 2c0da8670c Update version 2026-08-10 22:17:31 +02:00
rayzsyt fb509c2404 Fixed that sub-arguments were only partially recognising letter casing 2026-08-10 22:16:59 +02:00
rayzsyt c425891587 Fixed sub-argument system when using PAT in blacklist mode 2026-08-10 22:15:23 +02:00
rayzsyt d57a43710e Add an improved variation of the standard startsWith method 2026-08-10 22:13:27 +02:00
rayzsyt 8ba07fdbb2 Just removed the commented code since it's not going to be used anyway 2026-08-10 20:54:07 +02:00
rayzsyt 405210a98c Reverted back change to avoid any misunderstandings 2026-08-05 16:32:46 +02:00
rayzsyt be3a3f0a79 Changes to always check for contexts 2026-08-05 16:22:44 +02:00
rayzsyt 50c8a46411 Merged with backend-recode branch 2026-08-05 03:42:15 +02:00
rayzsyt 428ddfb78d Update MiniMessage API 2026-04-28 00:26:07 +02:00
rayzsyt 56bd8be247 Update Version 2026-04-27 23:54:32 +02:00
rayzsyt f7b2aa281e Small change 2026-04-27 23:18:48 +02:00
rayzsyt 0599d504af Fixed that messages were not set automatically in auto-config-updater 2026-04-27 23:18:29 +02:00
rayzsyt 471e0b100f Removed Version enum & simplified some code parts 2026-04-27 22:59:57 +02:00
rayzsyt 52d842b27a Small visual changes to make code more readable 2026-04-27 22:49:28 +02:00
Alihan dfc6ba91eb Merge pull request #26 from gaboss44/feat/mc-26.1-reflection
Reflection class changes
2026-04-27 21:22:51 +02:00
gaboss44 54d59d7b03 Reflection class changes 2026-04-27 13:01:04 -05:00
Alihan a4931199af Merge pull request #24 from MasivoSMP/main
Fix global-thread lag in Folia
2026-03-23 20:23:21 +01:00
Chesvin1 02469e977c Fix globa-thread lag in Folia
Replace backend plugin-message dispatch in BukkitClient from Server.sendPluginMessage(...) (broadcast/fan-out behavior) to single carrier-player dispatch via PATScheduler.execute(..., player).
This keeps plugin messaging on a player/entity scheduler for Folia, reducing redundant per-player sends and feedback amplification that were loading the global scheduler thread under high player counts.
2026-03-22 17:36:04 -03:00
rayzsyt f9386fd3f1 Merge remote-tracking branch 'origin/main' 2026-03-19 19:50:31 +01:00
rayzsyt 242590f3e8 Add 'suppress-exceptions' option 2026-03-19 19:50:12 +01:00
rayzsyt 65c383491e Changed order to filter number last 2026-03-06 19:26:16 +01:00
rayzsyt 0356c2f606 Implemented injection-failed settings 2026-02-27 22:32:49 +01:00
rayzsyt 60067f75d3 Added injection-failed option setting 2026-02-27 22:32:38 +01:00
rayzsyt e896ccb72d Added injection-failed option setting 2026-02-27 22:32:27 +01:00
rayzsyt 6c3dc58cd6 Updated Bungeecord API 2026-02-27 22:32:04 +01:00
182 changed files with 11196 additions and 9783 deletions

No files matched your search

+25 -20
View File
@@ -6,7 +6,7 @@
<groupId>de.rayzs.pat</groupId>
<artifactId>ProAntiTab</artifactId>
<version>2.3.1</version>
<version>2.5.0</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>
@@ -100,7 +112,7 @@
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.20-R0.3-SNAPSHOT</version>
<version>1.21-R0.5-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
@@ -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.25.0</version>
<version>5.2.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-api</artifactId>
<version>4.25.0</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.getMinor() < 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.getMinor() >= 22 || (Reflection.getMinor() == 21 && Reflection.getRelease() >= 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,201 +0,0 @@
package de.rayzs.pat.api.netty.bukkit;
import de.rayzs.pat.plugin.logger.Logger;
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;
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;
import java.util.*;
public class BukkitPacketAnalyzer {
public static final ConcurrentHashMap<UUID, Channel> INJECTED_PLAYERS = new ConcurrentHashMap<>();
private static final ExpireCache<UUID, Object> SENT_PACKET = new ExpireCache<>(2, TimeUnit.SECONDS);
private static final String HANDLER_NAME = "pat-bukkit-handler", PIPELINE_NAME = "packet_handler";
private static final BukkitPacketHandler PACKET_HANDLER = Reflection.getMinor() >= 16 ? new ModernPacketHandler() : new LegacyPacketHandler();
private static final BukkitPacketHandler COMMANDS_NODE_HANDLER = new ModernCommandsNodeHandler();
private static final HashMap<Player, String> PLAYER_INPUT_CACHE = new HashMap<>();
public static void injectAll() {
Bukkit.getOnlinePlayers().forEach(BukkitPacketAnalyzer::inject);
}
public static void uninjectAll() {
BukkitPacketAnalyzer.INJECTED_PLAYERS.keySet().forEach(BukkitPacketAnalyzer::uninject);
BukkitPacketAnalyzer.INJECTED_PLAYERS.clear();
}
public static void sendPacket(UUID uuid, Object object) {
Channel channel = INJECTED_PLAYERS.get(uuid);
if (channel == null)
return;
SENT_PACKET.put(uuid, object);
channel.pipeline().writeAndFlush(object);
}
public static boolean inject(Player player) {
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED)
return true;
try {
Channel channel = Reflection.getPlayerChannel(player);
if (channel == null) {
return false;
}
if (channel.pipeline().names().contains(BukkitPacketAnalyzer.HANDLER_NAME))
uninject(channel);
channel.pipeline().addBefore(BukkitPacketAnalyzer.PIPELINE_NAME, BukkitPacketAnalyzer.HANDLER_NAME, new PacketDecoder(player));
BukkitPacketAnalyzer.INJECTED_PLAYERS.put(player.getUniqueId(), channel);
} catch (IndexOutOfBoundsException indexOutOfBoundsException) {
Reflection.toggleInjectionMethod();
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)");
}
return success;
} catch (Exception exception) {
exception.printStackTrace();
return false;
}
return true;
}
public static void uninject(UUID uuid) {
if (Storage.SEND_CONSOLE_NOTIFICATION)
return;
if (BukkitPacketAnalyzer.INJECTED_PLAYERS.containsKey(uuid)) {
Channel channel = BukkitPacketAnalyzer.INJECTED_PLAYERS.get(uuid);
uninject(channel);
}
}
public static void uninject(Channel channel) {
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED)
return;
if (channel != null) {
channel.eventLoop().submit(() -> {
ChannelPipeline pipeline = channel.pipeline();
if (pipeline.names().contains(BukkitPacketAnalyzer.HANDLER_NAME))
pipeline.remove(BukkitPacketAnalyzer.HANDLER_NAME);
});
}
}
public static String getPlayerInput(Player player) {
String input = PLAYER_INPUT_CACHE.get(player);
PLAYER_INPUT_CACHE.remove(player);
return input;
}
public static void insertPlayerInput(Player player, String text) {
PLAYER_INPUT_CACHE.put(player, text);
}
private static class PacketDecoder extends ChannelDuplexHandler {
private final Player player;
private final CommandSender sender;
private PacketDecoder(Player player) {
this.player = player;
this.sender = CommandSenderHandler.from(player);
}
@Override
public void channelRead(ChannelHandlerContext channel, Object packetObj) {
try {
if (packetObj.getClass() == null || Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
super.channelRead(channel, packetObj);
return;
}
String packetName = packetObj.getClass().getSimpleName();
if (!packetName.equals("PacketPlayInTabComplete") && !packetName.equals("ServerboundCommandSuggestionPacket")) {
super.channelRead(channel, packetObj);
return;
}
if (!PermissionUtil.hasBypassPermission(sender)) {
if (!PACKET_HANDLER.handleIncomingPacket(player, sender, packetObj))
return;
}
super.channelRead(channel, packetObj);
} catch (Throwable exception) { exception.printStackTrace(); }
}
@Override
public void write(ChannelHandlerContext channel, Object packetObj, ChannelPromise promise) {
try {
if(packetObj.getClass() == null || Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
super.write(channel, packetObj, promise);
return;
}
final String packetName = packetObj.getClass().getSimpleName();
final boolean isCommandsPacket = packetName.equals("ClientboundCommandsPacket");
final boolean isTabCompletePacket = packetName.equals("PacketPlayOutTabComplete") || packetName.equals("ClientboundCommandSuggestionsPacket");
if (!isCommandsPacket && !isTabCompletePacket || PermissionUtil.hasBypassPermission(sender)) {
super.write(channel, packetObj, promise);
return;
}
if (isCommandsPacket) {
COMMANDS_NODE_HANDLER.handleOutgoingPacket(player, sender, packetObj);
super.write(channel, packetObj, promise);
return;
}
UUID uuid = player.getUniqueId();
Object sentPacketObj = SENT_PACKET.get(uuid);
if (sentPacketObj != null) {
if (sentPacketObj == packetObj) {
SENT_PACKET.remove(uuid);
super.write(channel, sentPacketObj, promise);
return;
}
}
if (!PACKET_HANDLER.handleOutgoingPacket(player, sender, packetObj))
return;
super.write(channel, packetObj, promise);
} catch (Throwable exception) {
exception.printStackTrace();
}
}
}
}
@@ -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.getMinor() < 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,23 +333,26 @@ 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 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 TurnBlacklistToWhitelistSection TURN_BLACKLIST_TO_WHITELIST = new TurnBlacklistToWhitelistSection();
public static final BlockNamespaceCommandsSection BLOCK_NAMESPACE_COMMANDS = new BlockNamespaceCommandsSection();
public static final HandleThroughProxySection HANDLE_THROUGH_PROXY = new HandleThroughProxySection();
public static final HidePluginChannelsSection HIDE_PLUGIN_CHANNELS = new HidePluginChannelsSection();
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 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();
@@ -463,7 +440,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()) {
@@ -506,7 +538,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();
@@ -576,28 +608,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);
@@ -612,7 +679,7 @@ public class Storage {
}
if (Storage.getPermissionPlugin() != PermissionPlugin.NONE) {
if (PermissionUtil.hasBypassPermission(sender, command)) {
if (PermissionUtil.hasBypassPermission(sender, command, isOperator)) {
return true;
}
}
@@ -626,7 +693,7 @@ public class Storage {
}
if (Storage.getPermissionPlugin() != PermissionPlugin.NONE) {
if (PermissionUtil.hasBypassPermission(sender, command)) {
if (PermissionUtil.hasBypassPermission(sender, command, isOperator)) {
return true;
}
}
@@ -687,7 +754,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) {
@@ -708,7 +775,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;
@@ -25,7 +25,7 @@ public class CustomProtocolPingSection extends ConfigStorage {
public void load() {
super.load();
if (!Reflection.isProxyServer() && (!Reflection.isPaper() || Reflection.getMinor() < 12))
if (!Reflection.isProxyServer() && (!Reflection.isPaper() || Reflection.isBefore(1, 12)))
return;
ENABLED = new ConfigSectionHelper<Boolean>(this, "enabled", true).getOrSet();
@@ -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) {
@@ -1,6 +1,7 @@
package de.rayzs.pat.api.storage.config.settings;
import de.rayzs.pat.api.storage.storages.ConfigStorage;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.configuration.helper.*;
import de.rayzs.pat.api.storage.Storage;
import java.util.Collections;
@@ -18,8 +19,15 @@ public class CustomUnknownCommandSection extends ConfigStorage {
public void load() {
super.load();
if(Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) return;
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) return;
ENABLED = new ConfigSectionHelper<Boolean>(this, "enabled", true).getOrSet();
MESSAGE = new MultipleMessagesHelper(this, "message", Collections.singletonList("&cThis command does not exist!"));
if (ENABLED && Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED) {
Logger.warning("It's not recommended to use the 'custom-unknown-command' feature when you are already using ProAntiTab in WHITELIST mode! Since in this mode, all commands except the once you specifically allow, are blocked anyway. So instead, change the 'blocked' message to your desired message. It has the same effect.");
}
}
}
@@ -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();
}
}
@@ -0,0 +1,37 @@
package de.rayzs.pat.api.storage.config.settings;
import de.rayzs.pat.api.storage.storages.ConfigStorage;
import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
import de.rayzs.pat.utils.configuration.helper.MultipleMessagesHelper;
import java.util.Arrays;
import java.util.HashSet;
public class HidePluginChannelsSection extends ConfigStorage {
public boolean ENABLED;
public MultipleMessagesHelper WHITELISTED_CHANNELS;
private final HashSet<String> REGISTER_CHANNELS = new HashSet<>(
Arrays.asList("register", "unregister", "minecraft:register", "minecraft:unregister")
);
public HidePluginChannelsSection() {
super("plugin-channels-hider");
}
@Override
public void load() {
super.load();
ENABLED = new ConfigSectionHelper<Boolean>(this, "enabled", false).getOrSet();
WHITELISTED_CHANNELS = new MultipleMessagesHelper(this, "whitelisted-channels", Arrays.asList(
"minecraft:brand",
"bungeecord:main",
"velocity:main"
));
}
public boolean isRegisterChannel(final String channelId) {
return REGISTER_CHANNELS.contains(channelId);
}
}
@@ -0,0 +1,23 @@
package de.rayzs.pat.api.storage.config.settings;
import de.rayzs.pat.api.storage.storages.ConfigStorage;
import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
public class InjectionFailedSection extends ConfigStorage {
public boolean ENABLED, SUPPRESS_EXCEPTIONS;
public String KICK_MESSAGE, CONSOLE_MESSAGE;
public InjectionFailedSection() {
super("injection-failed");
}
@Override
public void load() {
super.load();
ENABLED = new ConfigSectionHelper<Boolean>(this, "kick-on-failure", true).getOrSet();
SUPPRESS_EXCEPTIONS = new ConfigSectionHelper<Boolean>(this, "suppress-exceptions", false).getOrSet();
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);
}
}
@@ -1,505 +1,492 @@
package de.rayzs.pat.plugin;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.api.communication.impl.BukkitClient;
import de.rayzs.pat.api.event.PATEventHandler;
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.api.netty.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.api.communication.BackendUpdater;
import de.rayzs.pat.utils.adapter.GroupManagerAdapter;
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.permission.PermissionUtil;
import de.rayzs.pat.utils.adapter.ViaVersionAdapter;
import de.rayzs.pat.api.communication.Communicator;
import de.rayzs.pat.utils.adapter.LuckPermsAdapter;
import de.rayzs.pat.plugin.commands.BukkitCommand;
import de.rayzs.pat.utils.hooks.PlaceholderHook;
import de.rayzs.pat.plugin.listeners.bukkit.*;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.plugin.metrics.bStats;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.response.action.ActionHandler;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Entity;
import org.bukkit.plugin.java.JavaPlugin;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.scheduler.*;
import org.bukkit.entity.Player;
import java.lang.reflect.Field;
import de.rayzs.pat.utils.*;
import org.bukkit.command.*;
import org.bukkit.plugin.*;
import org.bukkit.Bukkit;
import java.util.*;
import java.util.stream.Collectors;
public class BukkitLoader extends JavaPlugin implements PluginLoader {
private static List<String> commands = new ArrayList<>(),
allowedCommands = new ArrayList<>(),
disallowedCommands = new ArrayList<>();
private static Plugin plugin;
private static java.util.logging.Logger logger;
private static Map<String, Command> commandsMap = null;
private PATSchedulerTask updaterTask;
private final List<String> offlinePlayerNames = new ArrayList<>();
private long lastCommandsLoad = -1;
@Override
public void onLoad() {
Configurator.createResourcedFile("files\\bukkit-config.yml", "config.yml", false);
Configurator.createResourcedFile("files\\bukkit-storage.yml", "storage.yml", false);
Configurator.createResourcedFile("files\\bukkit-placeholders.yml", "placeholders.yml", false);
Configurator.createResourcedFile("files\\bukkit-custom-responses.yml", "custom-responses.yml", false);
}
@Override
public void onEnable() {
plugin = this;
logger = getLogger();
for (OfflinePlayer offlinePlayerName : Bukkit.getOfflinePlayers()) {
offlinePlayerNames.add(offlinePlayerName.getName());
}
loadCommandMap();
Reflection.initialize(getServer());
CommandProcess.initialize();
ConfigUpdater.initialize();
Storage.initialize(this, getDescription().getVersion());
VersionComparer.get().setCurrentVersion(Storage.CURRENT_VERSION);
Storage.loadAll(true);
if (Bukkit.getServer().getPluginManager().getPlugin("PlaceholderAPI") != null)
new PlaceholderHook().register();
MessageTranslator.initialize();
CustomServerBrand.initialize();
bStats.initialize(this);
PluginManager manager = getServer().getPluginManager();
if (!Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
GroupManager.initialize();
BukkitPacketAnalyzer.injectAll();
} else BackendUpdater.handle();
manager.registerEvents(new BukkitPlayerListener(), this);
manager.registerEvents(new BukkitBlockCommandListener(), this);
if (Reflection.getMinor() >= 13) {
manager.registerEvents(new BukkitAntiTabListener(), this);
}
if (Reflection.isPaper() && Reflection.getMinor() >= 12)
manager.registerEvents(new PaperServerListPing(), this);
registerCommand("proantitab", "pat");
startUpdaterTask();
Storage.PLUGIN_OBJECT = this;
if (getServer().getPluginManager().getPlugin("LuckPerms") != null) {
LuckPermsAdapter.initialize();
Bukkit.getOnlinePlayers().forEach(player -> PermissionUtil.setPlayerPermissions(player.getUniqueId()));
} else {
final Plugin groupManagerPlugin = getServer().getPluginManager().getPlugin("GroupManager");
if (groupManagerPlugin != null) {
GroupManagerAdapter.initialize(groupManagerPlugin);
Bukkit.getOnlinePlayers().forEach(player -> PermissionUtil.setPlayerPermissions(player.getUniqueId()));
}
}
if (getServer().getPluginManager().getPlugin("ViaVersion") != null) {
ViaVersionAdapter.initialize();
}
Storage.broadcastPermissionsPluginNotice();
ConfigUpdater.broadcastMissingParts();
ActionHandler.initialize();
SubArguments.initialize();
StorageConverter.initialize();
Communicator.initialize(new BukkitClient());
PATScheduler.createScheduler(() -> {
Storage.reload();
loadAllCommands();
});
}
@Override
public void onDisable() {
BackendUpdater.stop();
BukkitPacketAnalyzer.uninjectAll();
MessageTranslator.closeAudiences();
}
public void registerCommand(String... commands) {
BukkitCommand command = new BukkitCommand();
for (String commandName : commands) {
PluginCommand pluginCommand = getCommand(commandName);
pluginCommand.setExecutor(command);
pluginCommand.setTabCompleter(command);
}
}
@Override
public void handleReload() {
loadAllCommands();
}
@Override
public boolean doesCommandExist(String command) {
if (commandsMap == null)
return false;
loadAllCommands();
return getAllCommands().contains(command);
}
@Override
public Object getConsoleSender() {
return Bukkit.getConsoleSender();
}
@Override
public Object getPlayerObjByName(String name) {
return Bukkit.getPlayer(name);
}
@Override
public Object getPlayerObjByUUID(UUID uuid) {
return Bukkit.getPlayer(uuid);
}
@Override
public void updateCommandCache() {}
@Override
public HashMap<String, CommandsCache> getCommandsCacheMap() {
return null;
}
@Override
public boolean isPlayerOnline(String playerName) {
return Bukkit.getPlayer(playerName) != null;
}
@Override
public boolean doesPlayerExist(String playerName) {
return isPlayerOnline(playerName) || ArrayUtils.containsIgnoreCase(getPlayerNames(), playerName);
}
@Override
public String getPlayerServerName(UUID uuid) {
final Player player = Bukkit.getPlayer(uuid);
if (player == null) { return null; }
return player.getWorld().getName();
}
@Override
public List<UUID> getPlayerIdsByServer(String server) {
return null;
}
@Override
public List<String> getOnlinePlayerNames(String serverName) {
return getOnlinePlayerNames();
}
@Override
public List<UUID> getPlayerIds() {
return Bukkit.getOnlinePlayers().stream().map(Entity::getUniqueId).collect(Collectors.toList());
}
@Override
public List<String> getOnlinePlayerNames() {
return new ArrayList<>(Bukkit.getServer().getOnlinePlayers().stream().map(Player::getName).toList());
}
@Override
public List<String> getOfflinePlayerNames() {
return offlinePlayerNames;
}
@Override
public List<String> getPlayerNames() {
List<String> playerNames = new ArrayList<>(offlinePlayerNames);
playerNames.addAll(getOnlinePlayerNames());
return playerNames;
}
@Override
public String getNameByUUID(UUID uuid) {
Player player = Bukkit.getPlayer(uuid);
return player != null ? player.getName() : "";
}
@Override
public UUID getUUIDByName(String playerName) {
Player player = Bukkit.getPlayer(playerName);
return player != null ? player.getUniqueId() : null;
}
@Override
public List<String> getServerNames() {
return List.of();
}
@Override
public void delayedPermissionsReload() {
PATScheduler.createScheduler(PermissionUtil::reloadPermissions, 40);
}
public void startUpdaterTask() {
if (!Storage.ConfigSections.Settings.UPDATE.ENABLED)
return;
updaterTask = PATScheduler.createAsyncScheduler(() -> {
if (VersionComparer.get().computeComparison())
updaterTask.cancelTask();
}, 20L, 20L * Storage.ConfigSections.Settings.UPDATE.PERIOD);
}
public static void handleNotificationPacket(CommunicationPackets.Proxy2Backend.NotificationPacket packet) {
if (!Storage.SEND_CONSOLE_NOTIFICATION) { return; }
final Player player = Bukkit.getPlayer(packet.playerId());
if (player == null) {
return;
}
final List<String> notificationMessage = MessageTranslator.replaceMessageList(
Storage.ConfigSections.Messages.NOTIFICATION.ALERT,
"%player%", player.getName(),
"%command%", packet.command(),
"%server%", Storage.SERVER_NAME,
"%world%", player.getWorld().getName());
Logger.info(notificationMessage);
}
public static void handleUpdateCommandsPacket(CommunicationPackets.Proxy2Backend.UpdatePacket packet) {
if (Reflection.getMinor() < 13) {
return;
}
PATScheduler.createScheduler(() -> {
if (packet.forEveryone()) {
BukkitAntiTabListener.updateCommands();
return;
}
Player player = Bukkit.getPlayer(packet.playerId());
if (player != null) {
BukkitAntiTabListener.updateCommands(player);
}
});
}
public static void handlePlayerExecuteCommandPacket(CommunicationPackets.Proxy2Backend.ExecutePlayerCommandPacket packet) {
if (isP2BDisabled()) return;
final Player player = Bukkit.getPlayer(packet.playerId());
if (player == null) return;
PATScheduler.execute(() -> Bukkit.dispatchCommand(player, packet.command()), player);
}
public static void handleConsoleExecuteCommandPacket(CommunicationPackets.Proxy2Backend.ExecuteConsoleCommandPacket packet) {
if (isP2BDisabled()) return;
PATScheduler.execute(() -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), packet.command()), null);
}
public static void handleConsoleMessagePacket(CommunicationPackets.Proxy2Backend.ConsoleMessagePacket packet) {
if (isP2BDisabled()) return;
Logger.info(packet.message());
}
private static boolean isP2BDisabled() {
if (!Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ALLOW_P2B_ACTIONS) {
Logger.warning("P2B actions are currently disabled! You need to enable them manually.");
Logger.warning("For that, go to your 'plugins/ProAntiTab/config.yml' file and enable 'handle-through-proxy -> allow-p2b-actions'.");
return true;
}
return false;
}
public static void handleDataSyncPacket(CommunicationPackets.Proxy2Backend.DataSyncPacket packet) {
Storage.ConfigSections.Messages.PREFIX.PREFIX = packet.messages().prefix();
Storage.ConfigSections.Settings.AUTO_LOWERCASE_COMMANDS.ENABLED = packet.autoLowerCase().enabled();
Storage.ConfigSections.Settings.CUSTOM_UNKNOWN_COMMAND.ENABLED = packet.unknownCommand().enabled();
Storage.ConfigSections.Settings.CUSTOM_UNKNOWN_COMMAND.MESSAGE = packet.unknownCommand().message();
PATEventHandler.callReceiveSyncEvents(packet);
}
public static List<String> getAllCommands() {
return new ArrayList<>(commands);
}
public static List<String> getAllowedCommands() {
return new ArrayList<>(allowedCommands);
}
public static List<String> getDisallowedCommands() {
return disallowedCommands;
}
@Override
public List<String> getPluginNames(String format) {
List<String> pluginNames = new ArrayList<>();
for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
PluginDescriptionFile description = plugin.getDescription();
pluginNames.add(
format.replace("%n", description.getName())
.replace("%v", description.getVersion())
);
}
return pluginNames;
}
@Override
public List<String> getAllCommands(boolean useColons) {
List<String> commands = new ArrayList<>();
for (Map.Entry<String, Command> entry : BukkitLoader.getCommandsMap().entrySet()) {
if (entry.getKey().toLowerCase().contains(":")) {
String command = entry.getKey().substring(entry.getKey().lastIndexOf(":") + 1);
commands.add(command);
if (useColons) {
commands.add(entry.getKey());
}
}
}
return commands;
}
@Override
public List<String> getPluginCommands(String pluginName, boolean useColons) {
List<String> commands = new ArrayList<>();
if (pluginName.isBlank()) return commands;
pluginName = pluginName.toLowerCase();
for (Map.Entry<String, Command> entry : BukkitLoader.getCommandsMap().entrySet()) {
if (entry.getKey().toLowerCase().startsWith(pluginName + ":")) {
String command = entry.getKey().substring(pluginName.length() + 1);
commands.add(command);
if (useColons) {
commands.add(entry.getKey());
}
}
}
return commands;
}
private void loadCommandMap() {
try {
if (Bukkit.getPluginManager() instanceof SimplePluginManager) {
Field commandMapField = SimplePluginManager.class.getDeclaredField("commandMap");
commandMapField.setAccessible(true);
SimpleCommandMap simpleCommandMap = (SimpleCommandMap) commandMapField.get(Bukkit.getPluginManager());
Field knownCommandsField = SimpleCommandMap.class.getDeclaredField("knownCommands");
knownCommandsField.setAccessible(true);
commandsMap = (Map<String, Command>) knownCommandsField.get(simpleCommandMap);
}
} catch (Throwable ignored) { }
if (commandsMap == null) {
Logger.warning("Failed to get server commands!");
}
}
private void loadAllCommands() {
if (lastCommandsLoad != -1 && System.currentTimeMillis() - lastCommandsLoad < 1000)
return;
List<String> result = new ArrayList<>();
if (commandsMap == null) {
result.addAll(
Bukkit.getHelpMap().getHelpTopics().stream()
.map(topic -> {
String name = topic.getName();
if (name.startsWith("/"))
name = name.substring(1);
return name;
}).toList()
);
return;
}
commandsMap.entrySet().forEach(entry -> {
String key = entry.getKey();
Command command = entry.getValue();
result.add(key);
if (!command.getAliases().isEmpty()) {
result.addAll(command.getAliases());
}
});
boolean turn = Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED;
List<String> allowedCommands = new ArrayList<>(result).stream().filter(command -> {
boolean contains = Storage.Blacklist.getBlacklist().getCommands().contains(command);
return turn == contains;
}).toList();
lastCommandsLoad = System.currentTimeMillis();
BukkitLoader.commands = result;
BukkitLoader.allowedCommands = allowedCommands;
BukkitLoader.disallowedCommands = commands.stream().filter(command -> !allowedCommands.contains(command)).toList();
}
public static Map<String, Command> getCommandsMap() {
return commandsMap;
}
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.command.commands.ProCommand;
import de.rayzs.pat.plugin.system.communication.cph.impl.BukkitCommunicationHandler;
import de.rayzs.pat.plugin.system.serverbrand.CustomServerBrand;
import de.rayzs.pat.plugin.system.communication.pmc.impl.BukkitPluginMessageClient;
import de.rayzs.pat.plugin.system.converter.StorageConverter;
import de.rayzs.pat.plugin.system.serverbrand.impl.BukkitServerBrand;
import de.rayzs.pat.plugin.command.CommandProcess;
import de.rayzs.pat.plugin.packetanalyzer.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.plugin.system.communication.BackendUpdater;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.hooks.GroupManagerHook;
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.permission.PermissionUtil;
import de.rayzs.pat.utils.hooks.ViaVersionHook;
import de.rayzs.pat.plugin.system.communication.Communicator;
import de.rayzs.pat.utils.hooks.LuckPermsHook;
import de.rayzs.pat.plugin.command.impl.BukkitCommand;
import de.rayzs.pat.utils.hooks.PlaceholderHook;
import de.rayzs.pat.plugin.listeners.bukkit.*;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.plugin.metrics.bStats;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.response.ResponseHandler;
import de.rayzs.pat.utils.response.action.ActionHandler;
import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Entity;
import org.bukkit.permissions.Permission;
import org.bukkit.plugin.java.JavaPlugin;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.scheduler.*;
import org.bukkit.entity.Player;
import java.lang.reflect.Field;
import de.rayzs.pat.utils.*;
import org.bukkit.command.*;
import org.bukkit.plugin.*;
import org.bukkit.Bukkit;
import java.util.*;
import java.util.stream.Collectors;
public class BukkitLoader extends JavaPlugin implements PluginLoader {
private static List<String> allCommands = new ArrayList<>(),
allowedCommands = new ArrayList<>(),
disallowedCommands = new ArrayList<>();
private static Plugin plugin;
private static java.util.logging.Logger logger;
private final CommandsCache commandsCache = new CommandsCache();
private final List<String> offlinePlayerNames = new ArrayList<>();
private HashSet<String> registeredCommands = new HashSet<>();
private Map<String, Command> commandsMap = null;
private BukkitAntiTabListener bukkitAntiTabListener = null;
private PATSchedulerTask updaterTask;
private long lastCommandsLoad = -1;
@Override
public void onLoad() {
Configurator.createResourcedFile("files\\bukkit-config.yml", "config.yml", false);
Configurator.createResourcedFile("files\\bukkit-storage.yml", "storage.yml", false);
Configurator.createResourcedFile("files\\bukkit-placeholders.yml", "placeholders.yml", false);
Configurator.createResourcedFile("files\\bukkit-custom-responses.yml", "custom-responses.yml", false);
}
@Override
public void onEnable() {
plugin = this;
logger = getLogger();
for (OfflinePlayer offlinePlayerName : Bukkit.getOfflinePlayers()) {
offlinePlayerNames.add(offlinePlayerName.getName());
}
loadCommandMap();
Reflection.initialize(getServer());
CommandProcess.initialize();
ConfigUpdater.initialize();
Storage.initialize(this, getDescription().getVersion());
VersionComparer.get().setCurrentVersion(Storage.CURRENT_VERSION);
Storage.loadAll(true);
if (Bukkit.getServer().getPluginManager().getPlugin("PlaceholderAPI") != null)
new PlaceholderHook().register();
MessageTranslator.initialize();
Communicator.initialize(new BukkitPluginMessageClient(), new BukkitCommunicationHandler());
BackendUpdater.initialize();
bStats.initialize(this);
PluginManager manager = getServer().getPluginManager();
if (!Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
GroupManager.initialize();
BukkitPacketAnalyzer.injectAll();
} else BackendUpdater.get().handle();
manager.registerEvents(new BukkitPlayerListener(), this);
manager.registerEvents(new BukkitBlockCommandListener(), this);
if (Reflection.isAtLeast(1, 13)) {
bukkitAntiTabListener = new BukkitAntiTabListener();
manager.registerEvents(bukkitAntiTabListener, this);
}
if (Reflection.isPaper() && Reflection.isAtLeast(1, 12)) {
manager.registerEvents(new PaperServerListPing(), this);
}
registerCommand("proantitab", "pat");
startUpdaterTask();
if (getServer().getPluginManager().getPlugin("LuckPerms") != null) {
manager.registerEvents(new BukkitLuckPermsWarning(), this);
LuckPermsHook.initialize();
Bukkit.getOnlinePlayers().forEach(player -> PermissionUtil.setPlayerPermissions(player.getUniqueId()));
} else {
final Plugin groupManagerPlugin = getServer().getPluginManager().getPlugin("GroupManager");
if (groupManagerPlugin != null) {
GroupManagerHook.initialize(groupManagerPlugin);
Bukkit.getOnlinePlayers().forEach(player -> PermissionUtil.setPlayerPermissions(player.getUniqueId()));
}
}
if (getServer().getPluginManager().getPlugin("ViaVersion") != null) {
ViaVersionHook.initialize();
}
Storage.broadcastPermissionsPluginNotice();
ConfigUpdater.broadcastMissingParts();
ActionHandler.initialize();
SubArgument.initialize();
ResponseHandler.update();
StorageConverter.initialize();
CustomServerBrand.initialize(new BukkitServerBrand());
PATScheduler.createScheduler(() -> {
Storage.reload();
loadAllCommands();
});
for (final ProCommand command : CommandProcess.getCommands()) {
addPermission(command.getName());
}
for (final Group group : GroupManager.getGroups()) {
addPermission("group." + group.getGroupName());
}
}
@Override
public void addPermission(String permission) {
permission = "proantitab." + permission;
final PluginManager manager = getServer().getPluginManager();
if (manager.getPermission(permission) == null) {
manager.addPermission(new Permission(permission));
}
}
@Override
public void removePermission(String permission) {
final PluginManager manager = getServer().getPluginManager();
final Permission perm = manager.getPermission("proantitab." + permission);
if (perm != null) manager.removePermission(perm);
}
@Override
public void onDisable() {
BackendUpdater.get().stop();
BukkitPacketAnalyzer.uninjectAll();
MessageTranslator.closeAudiences();
}
public void registerCommand(String... commands) {
BukkitCommand command = new BukkitCommand();
for (String commandName : commands) {
PluginCommand pluginCommand = getCommand(commandName);
pluginCommand.setExecutor(command);
pluginCommand.setTabCompleter(command);
}
}
@Override
public Object getPluginObj() {
return plugin;
}
@Override
public void updateCommands() {
if (bukkitAntiTabListener == null) return;
Bukkit.getOnlinePlayers().forEach(player -> {
bukkitAntiTabListener.updateCommands(player);
});
}
@Override
public void updateCommands(CommandSender sender) {
final Player player = Bukkit.getPlayer(sender.getUniqueId());
if (bukkitAntiTabListener != null) {
Objects.requireNonNull(player);
bukkitAntiTabListener.updateCommands(player);
}
}
@Override
public void handleReload() {
loadAllCommands();
}
@Override
public boolean doesCommandExist(String command) {
if (commandsMap == null)
return false;
return registeredCommands.contains(command);
}
@Override
public Object getConsoleSender() {
return Bukkit.getConsoleSender();
}
@Override
public Object getPlayerObjByName(String name) {
return Bukkit.getPlayer(name);
}
@Override
public Object getPlayerObjByUUID(UUID uuid) {
return Bukkit.getPlayer(uuid);
}
@Override
public void resetCommandsCache() {
commandsCache.reset();
}
@Override
public HashMap<String, CommandsCache> getPerServerCommandsCacheMap() {
return null;
}
@Override
public CommandsCache getBukkitCommandsCacheMap() {
return commandsCache;
}
@Override
public boolean isPlayerOnline(String playerName) {
return Bukkit.getPlayer(playerName) != null;
}
@Override
public boolean doesPlayerExist(String playerName) {
return isPlayerOnline(playerName) || ArrayUtils.containsIgnoreCase(getPlayerNames(), playerName);
}
@Override
public String getPlayerServerName(UUID uuid) {
final Player player = Bukkit.getPlayer(uuid);
if (player == null) { return null; }
return player.getWorld().getName();
}
@Override
public List<UUID> getPlayerIdsByServer(String server) {
return null;
}
@Override
public List<String> getOnlinePlayerNames(String serverName) {
return getOnlinePlayerNames();
}
@Override
public List<UUID> getPlayerIds() {
return Bukkit.getOnlinePlayers().stream().map(Entity::getUniqueId).collect(Collectors.toList());
}
@Override
public List<String> getOnlinePlayerNames() {
return new ArrayList<>(Bukkit.getServer().getOnlinePlayers().stream().map(Player::getName).toList());
}
@Override
public List<String> getOfflinePlayerNames() {
return offlinePlayerNames;
}
@Override
public List<String> getPlayerNames() {
List<String> playerNames = new ArrayList<>(offlinePlayerNames);
playerNames.addAll(getOnlinePlayerNames());
return playerNames;
}
@Override
public String getNameByUUID(UUID uuid) {
Player player = Bukkit.getPlayer(uuid);
return player != null ? player.getName() : "";
}
@Override
public UUID getUUIDByName(String playerName) {
Player player = Bukkit.getPlayer(playerName);
return player != null ? player.getUniqueId() : null;
}
@Override
public List<String> getServerNames() {
return List.of();
}
public void startUpdaterTask() {
if (!Storage.ConfigSections.Settings.UPDATE.ENABLED)
return;
final long second = Reflection.isFoliaServer() ? 1000 : 20;
updaterTask = PATScheduler.createAsyncScheduler(() -> {
if (VersionComparer.get().computeComparison())
updaterTask.cancelTask();
}, second, second * Storage.ConfigSections.Settings.UPDATE.PERIOD);
}
public static List<String> getAllCommands() {
return allCommands;
}
public static List<String> getAllowedCommands() { return allowedCommands; }
public static List<String> getDisallowedCommands() {
return disallowedCommands;
}
@Override
public List<String> getFormattedPluginNames(String format) {
List<String> pluginNames = new ArrayList<>();
for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
PluginDescriptionFile description = plugin.getDescription();
pluginNames.add(
format.replace("%n", description.getName())
.replace("%v", description.getVersion())
);
}
return pluginNames;
}
@Override
public List<String> getAllCommands(boolean useColons) {
List<String> commands = new ArrayList<>();
for (Map.Entry<String, Command> entry : commandsMap.entrySet()) {
if (entry.getKey().toLowerCase().contains(":")) {
String command = entry.getKey().substring(entry.getKey().lastIndexOf(":") + 1);
commands.add(command);
if (useColons) {
commands.add(entry.getKey());
}
}
}
return commands;
}
@Override
public List<String> getPluginCommands(String pluginName, boolean useColons) {
List<String> commands = new ArrayList<>();
if (pluginName.isBlank()) return commands;
pluginName = pluginName.toLowerCase();
for (Map.Entry<String, Command> entry : commandsMap.entrySet()) {
if (entry.getKey().toLowerCase().startsWith(pluginName + ":")) {
String command = entry.getKey().substring(pluginName.length() + 1);
commands.add(command);
if (useColons) {
commands.add(entry.getKey());
}
}
}
return commands;
}
private void loadCommandMap() {
try {
if (Bukkit.getPluginManager() instanceof SimplePluginManager) {
Field commandMapField = SimplePluginManager.class.getDeclaredField("commandMap");
commandMapField.setAccessible(true);
SimpleCommandMap simpleCommandMap = (SimpleCommandMap) commandMapField.get(Bukkit.getPluginManager());
Field knownCommandsField = SimpleCommandMap.class.getDeclaredField("knownCommands");
knownCommandsField.setAccessible(true);
commandsMap = (Map<String, Command>) knownCommandsField.get(simpleCommandMap);
}
} catch (Throwable ignored) { }
if (commandsMap == null) {
Logger.warning("Failed to get server commands!");
}
}
private void loadAllCommands() {
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) return;
if (lastCommandsLoad != -1 && System.currentTimeMillis() - lastCommandsLoad < 1000)
return;
final HashSet<String> tmpCommands = new HashSet<>(Bukkit.getHelpMap().getHelpTopics().stream()
.map(topic -> {
String name = topic.getName();
if (name.startsWith("/"))
name = name.substring(1);
return name;
}).toList());
commandsMap.entrySet().forEach(entry -> {
final String key = entry.getKey();
final Command command = entry.getValue();
tmpCommands.add(key);
if (!command.getAliases().isEmpty()) {
tmpCommands.addAll(command.getAliases());
}
});
final boolean turn = Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED;
final List<String> tmpAllowedCommands = tmpCommands.stream().filter(command -> {
final boolean contains = Storage.Blacklist.getBlacklist().getCommands().contains(command);
return turn == contains;
}).toList();
final List<String> tmpDisallowedCommands = tmpCommands.stream().filter(command ->
!allowedCommands.contains(command)
).toList();
lastCommandsLoad = System.currentTimeMillis();
registeredCommands = tmpCommands;
allowedCommands = tmpAllowedCommands;
disallowedCommands = tmpDisallowedCommands;
}
public static Plugin getPlugin() {
return plugin;
}
public static java.util.logging.Logger getPluginLogger() {
return logger;
}
}
@@ -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.1",
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.5.0",
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.getMinor() >= 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.getMinor() >= 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,99 @@
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.getMinor() >= 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) {
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
return;
}
final Player player = event.getPlayer();
final CommandSender sender = CommandSender.from(player);
final UUID uuid = player.getUniqueId();
final boolean isOperator = player.isOp();
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,226 @@
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;
if (Storage.getLoader().doesCommandExist(command))
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,81 +1,81 @@
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.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.getMinor() >= 13) {
BukkitAntiTabListener.handleTabCompletion(player);
}
}, 20);
}
Storage.getLoader().updateCommands(sender);
}, 20);
}
if (!BukkitPacketAnalyzer.inject(player)) {
PATScheduler.createScheduler(() -> {
if (player.isOnline()) {
if (!BukkitPacketAnalyzer.inject(player)) {
Logger.warning("Failed to inject into player! (" + player.getName() + ")" );
player.kickPlayer("Failed to inject player!");
if (Storage.ConfigSections.Settings.INJECTION_FAILED.ENABLED) {
Logger.info(MessageTranslator.replaceMessage(
sender,
Storage.ConfigSections.Settings.INJECTION_FAILED.CONSOLE_MESSAGE
));
player.kickPlayer(MessageTranslator.replaceMessage(
sender,
Storage.ConfigSections.Settings.INJECTION_FAILED.KICK_MESSAGE
));
}
}
}
}, 10);
}
// Update sub arguments for <1.12.2 servers.
if (Reflection.getMinor() < 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());
@@ -86,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());
@@ -98,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.getMinor() >= 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,105 +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)) {
Logger.warning("Attempting delayed injection for " + player.getUsername());
server.getScheduler().buildTask(loader, () -> {
if (!VelocityPacketAnalyzer.inject(player)) {
Logger.warning("Second injection for " + player.getUsername() + " failed as well!");
player.disconnect(Component.text("Failed to inject player!"));
}
}).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
@@ -0,0 +1,341 @@
package de.rayzs.pat.plugin.packetanalyzer.bukkit;
import com.mojang.datafixers.kinds.Const;
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 java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ConcurrentHashMap;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.ExpireCache;
import de.rayzs.pat.utils.Reflection;
import java.util.concurrent.TimeUnit;
import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.entity.Player;
import io.netty.channel.*;
import org.bukkit.Bukkit;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
public class BukkitPacketAnalyzer {
public static final ConcurrentHashMap<UUID, Channel> INJECTED_PLAYERS = new ConcurrentHashMap<>();
private static final ExpireCache<UUID, Object> SENT_PACKET = new ExpireCache<>(2, TimeUnit.SECONDS);
private static final String HANDLER_NAME = "pat-bukkit-handler", PIPELINE_NAME = "packet_handler";
private static final BukkitPacketHandler PACKET_HANDLER = Reflection.isAtLeast(1, 16) ? new ModernPacketHandler() : new LegacyPacketHandler();
private static final BukkitPacketHandler COMMANDS_NODE_HANDLER = new ModernCommandsNodeHandler();
private static final HashMap<Player, String> PLAYER_INPUT_CACHE = new HashMap<>();
public static void injectAll() {
Bukkit.getOnlinePlayers().forEach(BukkitPacketAnalyzer::inject);
}
public static void uninjectAll() {
BukkitPacketAnalyzer.INJECTED_PLAYERS.keySet().forEach(BukkitPacketAnalyzer::uninject);
BukkitPacketAnalyzer.INJECTED_PLAYERS.clear();
}
public static void sendPacket(UUID uuid, Object object) {
Channel channel = INJECTED_PLAYERS.get(uuid);
if (channel == null)
return;
SENT_PACKET.put(uuid, object);
channel.pipeline().writeAndFlush(object);
}
public static boolean inject(Player player) {
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED && !Storage.ConfigSections.Settings.HIDE_PLUGIN_CHANNELS.ENABLED)
return true;
try {
Channel channel = Reflection.getPlayerChannel(player);
if (channel == null) {
return false;
}
if (channel.pipeline().names().contains(BukkitPacketAnalyzer.HANDLER_NAME))
uninject(channel);
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();
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)");
}
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();
}
return false;
}
return true;
}
public static void uninject(UUID uuid) {
if (Storage.SEND_CONSOLE_NOTIFICATION)
return;
if (BukkitPacketAnalyzer.INJECTED_PLAYERS.containsKey(uuid)) {
Channel channel = BukkitPacketAnalyzer.INJECTED_PLAYERS.get(uuid);
uninject(channel);
}
}
public static void uninject(Channel channel) {
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED && !Storage.ConfigSections.Settings.HIDE_PLUGIN_CHANNELS.ENABLED)
return;
if (channel != null) {
channel.eventLoop().submit(() -> {
ChannelPipeline pipeline = channel.pipeline();
if (pipeline.names().contains(BukkitPacketAnalyzer.HANDLER_NAME))
pipeline.remove(BukkitPacketAnalyzer.HANDLER_NAME);
});
}
}
public static String getPlayerInput(Player player) {
String input = PLAYER_INPUT_CACHE.get(player);
PLAYER_INPUT_CACHE.remove(player);
return input;
}
public static void insertPlayerInput(Player player, String text) {
PLAYER_INPUT_CACHE.put(player, text);
}
private static class PacketDecoder extends ChannelDuplexHandler {
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 = CommandSender.from(player);
this.operatorStatus = player.isOp();
}
@Override
public void channelRead(ChannelHandlerContext channel, Object packetObj) {
try {
if (packetObj.getClass() == null) {
super.channelRead(channel, packetObj);
return;
}
String packetName = packetObj.getClass().getSimpleName();
if (Storage.ConfigSections.Settings.HIDE_PLUGIN_CHANNELS.ENABLED && packetName.equalsIgnoreCase("ServerboundCustomPayloadPacket")) {
final Object newPacketObj = handlePluginChannelPacket(packetObj);
if (newPacketObj != null)
super.channelRead(channel, newPacketObj);
return;
}
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
super.channelRead(channel, packetObj);
return;
}
if (!packetName.equals("PacketPlayInTabComplete") && !packetName.equals("ServerboundCommandSuggestionPacket")) {
super.channelRead(channel, packetObj);
return;
}
if (!hasBypassPermission() && !PACKET_HANDLER.handleIncomingPacket(player, sender, packetObj, false)) {
return;
}
super.channelRead(channel, packetObj);
} catch (Throwable exception) {
exception.printStackTrace();
}
}
@Override
public void write(ChannelHandlerContext channel, Object packetObj, ChannelPromise promise) {
try {
if(packetObj.getClass() == null) {
super.write(channel, packetObj, promise);
return;
}
final String packetName = packetObj.getClass().getSimpleName();
if (Storage.ConfigSections.Settings.HIDE_PLUGIN_CHANNELS.ENABLED && packetName.equalsIgnoreCase("ClientboundCustomPayloadPacket")) {
final Object newPacketObj = handlePluginChannelPacket(packetObj);
if (newPacketObj != null)
super.write(channel, newPacketObj, promise);
return;
}
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
super.write(channel, packetObj, promise);
return;
}
final boolean isCommandsPacket = packetName.equals("ClientboundCommandsPacket");
final boolean isTabCompletePacket = packetName.equals("PacketPlayOutTabComplete") || packetName.equals("ClientboundCommandSuggestionsPacket");
if (!isCommandsPacket && !isTabCompletePacket || hasBypassPermission()) {
super.write(channel, packetObj, promise);
return;
}
if (isCommandsPacket) {
COMMANDS_NODE_HANDLER.handleOutgoingPacket(player, sender, packetObj, false);
super.write(channel, packetObj, promise);
return;
}
final UUID uuid = sender.getUniqueId();
final Object sentPacketObj = SENT_PACKET.get(uuid);
if (sentPacketObj != null) {
if (sentPacketObj == packetObj) {
SENT_PACKET.remove(uuid);
super.write(channel, sentPacketObj, promise);
return;
}
}
if (!PACKET_HANDLER.handleOutgoingPacket(player, sender, packetObj, false)) {
return;
}
super.write(channel, packetObj, promise);
} catch (Throwable exception) {
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;
}
private Object handlePluginChannelPacket(Object packet) throws NoSuchFieldException, IllegalAccessException {
final Field payloadField = packet.getClass().getDeclaredField("payload");
payloadField.setAccessible(true);
final Object payloadObj = payloadField.get(packet);
final Field channelField = payloadObj.getClass().getDeclaredField("id");
channelField.setAccessible(true);
final Object channelIdObj = channelField.get(payloadObj);
final String channelId = channelIdObj.toString();
channelField.setAccessible(false);
if (!Storage.ConfigSections.Settings.HIDE_PLUGIN_CHANNELS.isRegisterChannel(channelId)) {
return packet;
}
final Field dataField = payloadObj.getClass().getDeclaredField("data");
dataField.setAccessible(true);
final byte[] data = (byte[]) dataField.get(payloadObj);
dataField.setAccessible(true);
final String dataStr = new String(data, StandardCharsets.UTF_8);
final String[] channels = dataStr.split("\u0000");
final List<String> filteredChannels = new ArrayList<>(Arrays.asList(channels));
final AtomicBoolean changedAnything = new AtomicBoolean(false);
filteredChannels.removeIf(channel -> {
if (!Storage.ConfigSections.Settings.HIDE_PLUGIN_CHANNELS.WHITELISTED_CHANNELS.getLines().contains(channel)) {
changedAnything.set(true);
return true;
}
return false;
});
if (!changedAnything.get()) {
return packet;
}
try {
final Class<?> customPayloadClass = packet.getClass().getConstructors()[0].getParameterTypes()[0];
final Class<?> discardPayloadClass = payloadObj.getClass();
final Constructor<?> discardPayloadConstr = discardPayloadClass.getConstructor(channelIdObj.getClass(), byte[].class);
final Object newDiscardPayloadObj = discardPayloadConstr.newInstance(
channelIdObj,
String.join("\u0000", filteredChannels).getBytes()
);
final Constructor<?> newPacketConstr = packet.getClass().getConstructor(customPayloadClass);
return newPacketConstr.newInstance(newDiscardPayloadObj);
} catch (Exception exception) {
exception.printStackTrace();
}
return packet;
}
}
}
@@ -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++) {
@@ -156,7 +169,7 @@ public class ModernPacketHandler implements BukkitPacketHandler {
}
if (Reflection.getMinor() < 17) {
if (Reflection.isBefore(1, 17)) {
Field suggestionsField = Reflection.getFieldsByType(packetObj.getClass(), "Suggestions", Reflection.SearchOption.ENDS).get(0);
if (suggestionsField == null) return false;
suggestionObj = suggestionsField.get(packetObj);
@@ -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,18 +1,20 @@
package de.rayzs.pat.api.netty.proxy;
package de.rayzs.pat.plugin.packetanalyzer.proxy;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
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 +23,8 @@ 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.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline;
@@ -44,7 +47,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 {
@@ -103,8 +105,11 @@ public class BungeePacketAnalyzer {
channel.pipeline().addAfter(BungeePacketAnalyzer.PIPELINE_NAME, BungeePacketAnalyzer.HANDLER_NAME, new PacketDecoder(player));
BungeePacketAnalyzer.INJECTED_PLAYERS.put(player, channel);
} catch (Throwable throwable) {
throwable.printStackTrace();
} catch (Exception exception) {
if (!Storage.ConfigSections.Settings.INJECTION_FAILED.SUPPRESS_EXCEPTIONS) {
exception.printStackTrace();
}
return false;
}
@@ -143,19 +148,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());
}
@@ -163,7 +168,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));
@@ -216,7 +221,7 @@ public class BungeePacketAnalyzer {
}
if (!ignore) {
SubArguments.handleCommandNode(player.getUniqueId(), helper);
SubArgument.get().getCommandNodeHandler().handleCommandNode(helper, SubArgument.get().getPlayerArgument(sender));
}
}
@@ -229,7 +234,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);
@@ -239,6 +244,7 @@ public class BungeePacketAnalyzer {
}
}
private static class PacketDecoder extends MessageToMessageDecoder<PacketWrapper> {
private final ProxiedPlayer player;
@@ -246,7 +252,7 @@ public class BungeePacketAnalyzer {
private PacketDecoder(ProxiedPlayer player) {
this.player = player;
this.sender = CommandSenderHandler.from(player);
this.sender = CommandSender.from(player);
}
@Override
@@ -258,100 +264,41 @@ 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 (Storage.ConfigSections.Settings.HIDE_PLUGIN_CHANNELS.ENABLED) {
final String channelId = pluginMessage.getTag();
} else if (wrapper.packet instanceof Commands) {
Commands response = (Commands) wrapper.packet;
modifyCommands(player, sender, response);
if (Storage.ConfigSections.Settings.HIDE_PLUGIN_CHANNELS.isRegisterChannel(channelId)) {
final String dataStr = new String(pluginMessage.getData(), StandardCharsets.UTF_8);
final String[] channels = dataStr.split("\u0000");
player.unsafe().sendPacket(response);
return;
final List<String> filteredChannels = new ArrayList<>(Arrays.asList(channels));
final AtomicBoolean changedAnything = new AtomicBoolean(false);
/*
} 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;
filteredChannels.removeIf(channel -> {
if (!Storage.ConfigSections.Settings.HIDE_PLUGIN_CHANNELS.WHITELISTED_CHANNELS.getLines().contains(channel)) {
changedAnything.set(true);
return true;
}
player.unsafe().sendPacket(new TabCompleteResponse(response.getCommands()));
return false;
});
if (changedAnything.get()) {
pluginMessage.setData(String.join("\u0000", filteredChannels).getBytes());
player.unsafe().sendPacket(pluginMessage);
return;
}
}
}*/
}
} else if (wrapper.packet instanceof Commands response) {
modifyCommands(player, sender, response);
player.unsafe().sendPacket(response);
return;
}
list.add(wrapper);
@@ -1,27 +1,26 @@
package de.rayzs.pat.api.netty.proxy;
package de.rayzs.pat.plugin.packetanalyzer.proxy;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import com.mojang.brigadier.suggestion.SuggestionProvider;
import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.proxy.protocol.MinecraftPacket;
import com.velocitypowered.proxy.protocol.packet.AvailableCommandsPacket;
import com.velocitypowered.proxy.protocol.packet.PluginMessagePacket;
import com.velocitypowered.proxy.protocol.packet.TabCompleteRequestPacket;
import com.velocitypowered.proxy.protocol.packet.TabCompleteResponsePacket;
import com.velocitypowered.proxy.protocol.packet.*;
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 +31,8 @@ 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.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext;
@@ -42,8 +42,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 +61,6 @@ public class VelocityPacketAnalyzer {
} catch (Exception exception) {
exception.printStackTrace();
FAILED = true;
}
}
@@ -89,37 +86,49 @@ 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;
} catch (Throwable throwable) {
throwable.printStackTrace();
} catch (Exception exception) {
if (!Storage.ConfigSections.Settings.INJECTION_FAILED.SUPPRESS_EXCEPTIONS) {
exception.printStackTrace();
}
return false;
}
@@ -129,16 +138,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) {
@@ -162,9 +176,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<>();
@@ -174,9 +188,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());
}
@@ -184,7 +198,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;
@@ -201,9 +215,40 @@ 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 void handlePluginMessageChannelsPacket(final PluginMessagePacket packet) {
final String channelId = packet.getChannel();
if (Storage.ConfigSections.Settings.HIDE_PLUGIN_CHANNELS.isRegisterChannel(channelId)) {
final ByteBuf buf = packet.content();
final byte[] data = new byte[buf.readableBytes()];
buf.getBytes(buf.readerIndex(), data);
final String dataStr = new String(data, StandardCharsets.UTF_8);
final String[] channels = dataStr.split("\u0000");
final List<String> filteredChannels = new ArrayList<>(Arrays.asList(channels));
final AtomicBoolean changedAnything = new AtomicBoolean(false);
filteredChannels.removeIf(channel -> {
if (!Storage.ConfigSections.Settings.HIDE_PLUGIN_CHANNELS.WHITELISTED_CHANNELS.getLines().contains(channel)) {
changedAnything.set(true);
return true;
}
return false;
});
if (changedAnything.get()) {
final ByteBuf newBuf = Unpooled.wrappedBuffer(String.join("\u0000", filteredChannels).getBytes());
packet.replace(newBuf);
}
}
}
private static class PacketDecoder extends ChannelDuplexHandler {
private final Player player;
@@ -211,23 +256,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");
@@ -241,6 +285,10 @@ public class VelocityPacketAnalyzer {
}
}
if (packet instanceof PluginMessagePacket pluginMessagePacket && Storage.ConfigSections.Settings.HIDE_PLUGIN_CHANNELS.ENABLED) {
handlePluginMessageChannelsPacket(pluginMessagePacket);
}
if (packet instanceof UnsignedPlayerCommandPacket unsignedPlayerCommandPacket) {
if (!VelocityBlockCommandListener.handleCommand(player, unsignedPlayerCommandPacket.getCommand()).getResult().isAllowed())
return;
@@ -270,10 +318,13 @@ 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;
} else if (Storage.ConfigSections.Settings.HIDE_PLUGIN_CHANNELS.ENABLED) {
handlePluginMessageChannelsPacket(pluginMessagePacket);
}
} else if (packet instanceof TabCompleteResponsePacket response) {
@@ -285,8 +336,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();
@@ -299,10 +350,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;
@@ -312,6 +364,7 @@ public class VelocityPacketAnalyzer {
}
if (cursor.startsWith("/")) {
if (spaces == 0) {
response.getOffers().removeIf(offer -> {
String command = offer.getText();
@@ -321,23 +374,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;
}
}
}
}
@@ -345,69 +412,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,260 +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 (number) {
split[i] = "%numbers%";
continue;
}
if (online && general) {
split[i] = "%both_players%";
continue;
}
if (online) {
split[i] = "%online_players%";
continue;
}
if (general)
split[i] = "%players%";
}
return String.join(" ", split);
}
}
Loaded 100 of 182 files, more files were not shown because too many files have changed in this diff. Show more