Compare commits

..
155 Commits
Author SHA1 Message Date
rayzsyt 11ee68fa3f Register proantitab.bypass permission for LuckPerms to recognise 2026-10-15 23:16:13 +02:00
rayzsyt 2c3d3fac92 Removed unused space 2026-10-15 23:11:01 +02:00
rayzsyt e524f898da Changed approach how MiniMessage API is accessed and interacted with 2026-10-15 23:00:03 +02:00
Alihan c181cfbbc4 Merge pull request #42 from RVSkeLe/fix/communications
refactor: improve proxy-backend packet communication
2026-10-15 14:02:02 +02:00
RV_SkeLe 1110466235 refactor: improve proxy-backend packet communication
- Replace Java object serialization and XOR obfuscation with explicit binary packet encoding and AES-256-GCM encryption.
- Derive packet encryption keys from the shared token using HKDF-SHA-256, with backend-specific key separation.
- Remove legacy hashed-token authentication, introduce secure default token generation, and enforce packet size limits.
- Add JUnit tests for packet round-trips, authentication, tampering, malformed payloads, and boundary conditions.
2026-10-09 11:47:16 +02:00
rayzsyt a965dd231b Switched injection-return value to better work with and handle exceptions / rare cases 2026-10-03 18:04:10 +02:00
rayzsyt 6418e4f42a Switched to using hashed token instead of raw token 2026-09-30 16:24:09 +02:00
Alihan e71909fcd7 Merge pull request #41 from RVSkeLe/perf-improve
Plugin message refactor
2026-09-30 17:11:57 +03:00
RV_SkeLe c6f9fc8d3e refactor: plugin message handling 2026-09-30 12:16:29 +02:00
RV_SkeLe 88cb03c82e Add gitignore 2026-09-30 12:02:18 +02:00
rayzsyt b53678764a Update version 2026-09-20 03:14:07 +02:00
rayzsyt 1f7743d089 Removed debug messages 2026-09-20 03:13:04 +02:00
rayzsyt a60b6896f7 Fixed that KICK_ON_FAILURE wasn't listened at anymore 2026-08-31 06:17:26 +02:00
rayzsyt 34c33df136 Add sanity check just in case 2026-08-25 22:37:13 +02:00
rayzsyt ef63674b0c Changed approach to detect commands for tab-completion 2026-08-21 19:11:06 +02:00
rayzsyt 130af1547d Ignore IgnoreStarPermission feature and instead made PAT able to recognise negated PAT permissions 2026-08-20 19:47:52 +02:00
rayzsyt cdb17c1ea8 Add option for PAT to ignore the Star permission 2026-08-19 22:32:55 +02:00
rayzsyt 8f4f4b6438 Remove debug message 2026-08-19 20:44:55 +02:00
rayzsyt 3a0fc6e579 Add feature to show non-existing commands in tab-completion when whitelisted, no matter if they exist or not. (Only for proxies in PAT groups) 2026-08-19 20:44:42 +02:00
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
rayzsyt 57ada83bfe Corrected wrong information 2026-02-17 03:23:46 +01:00
rayzsyt 8a86f05133 Fixed that proxies would create non-existing command tab-completions 2026-02-17 03:10:57 +01:00
rayzsyt f447cf69d3 Renamed "allow-p2b-packets" -> "allow-p2b-actions" 2026-02-15 00:44:11 +01:00
rayzsyt d06b723adc Reimplemented "Detected Software-API" 2026-02-14 23:46:26 +01:00
rayzsyt f8617cf1b9 Display software name 2026-02-14 23:46:00 +01:00
rayzsyt 8630a6f74c Removed debug message and shorten error message to something more informative 2026-02-14 23:25:30 +01:00
rayzsyt 424d892091 Changed to reveal first and last 2 characters of censored token 2026-02-14 23:18:37 +01:00
rayzsyt 9aaef6e297 Only display censored token instead 2026-02-14 23:10:33 +01:00
rayzsyt e749760136 Added CENSORED_TOKEN 2026-02-14 23:10:25 +01:00
rayzsyt 7f2f3c54ba Fixed color-code overlapping on Bukkit consoles 2026-02-14 22:54:03 +01:00
rayzsyt 24f2c867c6 Added method to reload Client to (un)register the plugin-channels accordingly 2026-02-14 22:28:10 +01:00
rayzsyt e7f3288fb7 Added method to reload Client to (un)register the plugin-channels accordingly 2026-02-14 22:28:05 +01:00
rayzsyt 2221062e98 Fix exception on Craftbukkit servers 2026-02-14 22:26:36 +01:00
rayzsyt 430f5ee9e6 Removed debug message 2026-02-14 22:26:20 +01:00
rayzsyt cd1a7cf312 Removed "Detected Software-API" since it's already in the title 2026-02-14 22:08:00 +01:00
rayzsyt 002cdc64ef Small code cleanup 2026-02-14 22:04:28 +01:00
rayzsyt 3d59686ba4 Small code cleanup 2026-02-14 22:02:01 +01:00
rayzsyt f6c72b9d0e Improved visual representation 2026-02-14 21:21:36 +01:00
rayzsyt d72d419044 Removed unrequired methods 2026-02-14 21:21:24 +01:00
rayzsyt c71a3a4002 Applied changes for new PAT sync-network 2026-02-14 21:21:05 +01:00
rayzsyt 02b70ed324 Applied changes for new PAT sync-network 2026-02-14 21:20:59 +01:00
rayzsyt 01d0a53049 Improved logic & implemented new PAT sync-network 2026-02-14 21:19:10 +01:00
rayzsyt c700ca6abb Removed unused method 2026-02-14 21:17:15 +01:00
rayzsyt d9cba6c010 Added option to toggle P2B packets 2026-02-14 21:16:49 +01:00
rayzsyt a6ed66cf1e Reimplemented PAT sync-network 2026-02-14 21:16:18 +01:00
rayzsyt 4f5b7ad3fb Recoded PAT sync-network 2026-02-14 21:12:03 +01:00
rayzsyt 962ea8b719 Small adjustment 2026-02-14 21:07:17 +01:00
rayzsyt 35e4d0b5aa Add AutoLowerCase for proxy 2026-02-14 20:05:48 +01:00
rayzsyt 497fe5ef98 Added last received alive packet 2026-02-14 20:02:48 +01:00
rayzsyt 0508387db1 Modified 'pat info' message 2026-02-14 19:49:20 +01:00
rayzsyt 1ff7c419ef Add last_alive_response 2026-02-14 19:24:03 +01:00
rayzsyt 612eda685c Modified bpat stats message 2026-02-14 19:17:50 +01:00
rayzsyt 7fc7b571a3 Add AutoLowerCase & Modified bpat stats message 2026-02-14 19:16:00 +01:00
rayzsyt 5cce86bf8d Check if token matches 2026-02-13 18:32:13 +01:00
Alihan Olgun 7621d815ac Code cleanup & Removed unnecessary data sync packets 2026-02-11 21:01:12 +01:00
rayzsyt 81495e3478 Removed unnecessary method implementation for Bukkit-Scheduler 2026-02-08 14:04:12 +01:00
rayzsyt 5c591d3a5b Fixed P2BExecute action in Folia 2026-02-08 13:54:23 +01:00
rayzsyt f1c225b718 Force command execution in main thread 2026-02-08 12:42:15 +01:00
rayzsyt ca7a098cfa Made warning a bit more visual present 2026-02-07 23:53:36 +01:00
rayzsyt b2fbba8455 Made warning a bit more visual present 2026-02-07 23:50:53 +01:00
rayzsyt ae6300c43c Changed parameters for Communicator#sendNotificationPacket method 2026-02-07 23:47:52 +01:00
rayzsyt cb62734da5 Implemented "alert" action and simplified the description 2026-02-07 23:47:18 +01:00
rayzsyt 04a2e4ea54 Add alert action for custom-responses 2026-02-07 23:46:32 +01:00
rayzsyt 2969469605 Replace %server% by server-name from Storage automatically 2026-02-07 23:08:28 +01:00
rayzsyt 25a0f7a742 Implemented P2B packets 2026-02-07 23:08:12 +01:00
rayzsyt d2f6c3336e Updated version 2026-02-07 21:44:01 +01:00
rayzsyt d2c7e00639 Fixed that only Bungeecord commands show up after "bpat reload" 2026-02-07 21:42:13 +01:00
rayzsyt e23fb19c98 Fixed custom-responses actions: execute & console 2026-02-07 21:40:25 +01:00
rayzsyt 1f8d5b78a7 Force command-update on Bungeecord 2026-01-25 01:24:50 +01:00
rayzsyt fee0362c69 Ensure packet not being sent if sync is disabled 2026-01-25 01:22:46 +01:00
rayzsyt 428d944933 Minor changes 2026-01-25 00:20:03 +01:00
rayzsyt 180d23fb1a Fixed wrong usage of sub-arguments in CommandWhitelist conversion 2026-01-23 12:35:04 +01:00
rayzsyt f54dc0f028 Implement Craftbukkit support 2026-01-21 22:05:38 +01:00
rayzsyt ef141a6e7f Disable MiniMessage for Craftbukkit 2026-01-21 21:45:25 +01:00
rayzsyt 55b0b5df75 Add Craftbukkit check 2026-01-21 21:37:10 +01:00
rayzsyt bc78304e97 Small adjustment 2026-01-21 20:18:48 +01:00
rayzsyt 42d8ea3526 Implement TEMP_PLAYER_SERVER_CACHE usage 2026-01-21 19:42:51 +01:00
rayzsyt dfc0066c17 Implement context check 2026-01-21 19:42:21 +01:00
rayzsyt 9e3e61e9a2 Reimplemented update-groups-per-server 2026-01-21 19:41:19 +01:00
rayzsyt 6551bffcdb Implement TEMP_PLAYER_SERVER_CACHE cache 2026-01-21 19:13:22 +01:00
rayzsyt 44f3b4d6d5 Return world name in getPlayerSerName(UUID) method 2026-01-21 18:12:27 +01:00
rayzsyt c672eaaf81 Cancelled event 2026-01-19 16:18:14 +01:00
rayzsyt 460013d22a Added default slash if not there 2026-01-19 16:17:06 +01:00
rayzsyt af89f082aa Always clear sub-arguments for custom-plugins & custom-version feature 2026-01-19 15:50:25 +01:00
rayzsyt e0c3c8a343 Made always executable if it's the console 2026-01-18 19:49:31 +01:00
rayzsyt 83480db4c6 Small adjustments 2026-01-18 19:44:46 +01:00
rayzsyt 04d441cfd6 Add missing interface 2026-01-18 19:44:29 +01:00
rayzsyt 842c2654c6 Add server placeholder to forwarded notification alert 2026-01-18 19:44:01 +01:00
rayzsyt 01d825da86 Implement NotificationPacket call 2026-01-18 18:50:21 +01:00
rayzsyt d61dd872eb Check if option is actually enabled 2026-01-18 17:49:01 +01:00
rayzsyt 3c417c6a8e Add displayCommand to NotificationPacket implementation 2026-01-18 17:40:01 +01:00
rayzsyt f0772a0969 Implement NotificationPacket 2026-01-18 17:39:47 +01:00
rayzsyt 2a83c1c548 Implement NotificationPacket and simplified logic 2026-01-18 17:35:23 +01:00
rayzsyt 12114c63bf Implement ForwardNotificationPacket 2026-01-18 17:30:37 +01:00
rayzsyt 8123ff2f27 Add Forward-Console-Notification-Alerts option 2026-01-18 17:29:29 +01:00
rayzsyt b56ebb3fcb Add NotificationPacket 2026-01-18 17:16:36 +01:00
rayzsyt 7adcce2361 Updated reference url 2026-01-18 17:10:08 +01:00
rayzsyt 6444ec153c Removed unused methods 2026-01-18 17:08:48 +01:00
rayzsyt 841253708d Changed version name 2026-01-18 16:31:46 +01:00
rayzsyt 467308be62 Implemented %offline_players% 2026-01-17 17:53:05 +01:00
rayzsyt d2f8305727 Added new commands to default config 2026-01-17 16:57:48 +01:00
rayzsyt 1a19435b96 Added checks to ensure the list hasn't been modified during the for-loop 2026-01-15 20:07:58 +01:00
rayzsyt eb4b2b1e17 Removed unnecessary computation 2026-01-15 19:53:32 +01:00
rayzsyt 8bca4bc091 Fixed sub-argument disappearing on Spigot servers 2026-01-15 19:48:02 +01:00
rayzsyt dfef20fb87 Fixed subargument blocking in BLACKLIST mode 2026-01-15 19:10:38 +01:00
rayzsyt f4e1dbf385 Fixed subargument blocking in BLACKLIST mode 2026-01-15 19:07:25 +01:00
rayzsyt 93a84f668a Fixed subargument blocking in BLACKLIST mode 2026-01-15 16:55:10 +01:00
rayzsyt f8463c9927 Fix command being blocked entirely if used in BLACKLIST mode 2026-01-15 16:22:46 +01:00
rayzsyt 34b5cd89e5 Ensures that the parent isn't null 2026-01-15 16:15:41 +01:00
rayzsyt 6aae96ab87 Removed old comment 2026-01-15 15:58:05 +01:00
226 changed files with 13945 additions and 11339 deletions

No files matched your search

+29
View File
@@ -0,0 +1,29 @@
# Maven
/target/
# IntelliJ IDEA
/.idea/
*.iml
*.iws
*.ipr
# Eclipse
/.classpath
/.project
/.settings/
# VS Code
/.vscode/
# Local environment and logs
.env
.env.*
*.log
*.tmp
# OS files
.DS_Store
Thumbs.db
# Maven Shade Plugin
dependency-reduced-pom.xml
+2 -2
View File
@@ -122,7 +122,7 @@ enabled: false
######
# **C**USTOM PLUGINS LIST
Just blocking the /plugins command is pretty boring after some time. This feature here allows you to make it more interesting by faking a /plugins message with, for example, fake plugins! ^^
Just blocking the /plugins command is pretty boring. This feature here allows you to make it more interesting by displaying for example fake plugins.
![https://www.rayzs.de/proantitab/assets/fakeplugins2.PNG](https://www.rayzs.de/proantitab/assets/fakeplugins2.PNG)
<details>
@@ -146,7 +146,7 @@ message:
######
# **C**USTOM VERSION COMMAND
Who wouldn't like to pretend to own a custom server-jar? Have fun customizing your very own /version command to your personal liking. ^^
Who wouldn't like to pretend to own a custom server-jar? Have fun customizing your very own /version command to your personal liking.
![https://www.rayzs.de/proantitab/assets/custom-version.png](https://www.rayzs.de/proantitab/assets/custom-version.png)
<details>
+85 -203
View File
@@ -6,7 +6,7 @@
<groupId>de.rayzs.pat</groupId>
<artifactId>ProAntiTab</artifactId>
<version>2.2.0</version>
<version>2.5.1</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
@@ -14,6 +14,11 @@
</properties>
<repositories>
<repository>
<id>papermc</id>
<url>https://repo.papermc.io/repository/maven-public/</url>
</repository>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
@@ -25,13 +30,19 @@
</repository>
<repository>
<id>papermc</id>
<url>https://repo.papermc.io/repository/maven-public/</url>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
<id>placeholderapi</id>
<url>https://repo.helpch.at/releases/</url>
</repository>
<repository>
@@ -50,11 +61,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,106 +78,30 @@
<url>https://repo.william278.net/papiproxybridge</url>
</repository>
<repository>
<id>central-snapshots</id>
<url>https://central.sonatype.com/repository/maven-snapshots/</url>
</repository>
<repository>
<id>AlessioDP</id>
<url>https://repo.alessiodp.com/releases/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>dev.folia</groupId>
<artifactId>folia-api</artifactId>
<version>1.20.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.19-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.2.0.Final</version>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.21.11-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.20-R0.3-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-protocol</artifactId>
<version>1.16-R0.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mojang</groupId>
<artifactId>authlib</artifactId>
<version>4.0.43</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.ElgarL</groupId>
<artifactId>groupmanager</artifactId>
<version>3.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mojang</groupId>
<artifactId>brigadier</artifactId>
<version>1.1.8</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mojang</groupId>
<artifactId>datafixerupper</artifactId>
<version>6.0.8</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mojang</groupId>
<artifactId>logging</artifactId>
<version>1.1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-resolver-provider</artifactId>
<version>3.8.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-connector-basic</artifactId>
<version>1.7.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-transport-http</artifactId>
<version>1.7.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.18.0</version>
<version>1.21-R0.5-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
@@ -182,24 +112,17 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.william278</groupId>
<artifactId>papiproxybridge</artifactId>
<version>1.4</version>
<scope>provided</scope>
</dependency>
<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>
@@ -209,70 +132,81 @@
</exclusions>
</dependency>
<dependency>
<groupId>org.sonatype.sisu</groupId>
<artifactId>sisu-guice</artifactId>
<version>2.1.7</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.spongepowered</groupId>
<artifactId>configurate-hocon</artifactId>
<version>4.1.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-text-minimessage</artifactId>
<version>4.25.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-api</artifactId>
<version>4.25.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-platform-api</artifactId>
<version>4.4.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-platform-bungeecord</artifactId>
<version>4.4.1</version>
<scope>compile</scope>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-platform-bukkit</artifactId>
<version>4.4.1</version>
<scope>compile</scope>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.11.5</version>
<groupId>net.kyori</groupId>
<artifactId>adventure-text-serializer-legacy</artifactId>
<version>5.2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.2.0.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
<!-- PLUGIN COMPATIBILITIES -->
<!-- Permission plugins -->
<dependency>
<groupId>net.luckperms</groupId>
<artifactId>api</artifactId>
<version>5.4</version>
<version>5.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.ElgarL</groupId>
<artifactId>groupmanager</artifactId>
<version>3.2</version>
<scope>provided</scope>
</dependency>
<!-- PAPI -->
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.12.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.william278</groupId>
<artifactId>papiproxybridge</artifactId>
<version>1.4</version>
<scope>provided</scope>
</dependency>
<!-- Extras -->
<dependency>
<groupId>com.viaversion</groupId>
<artifactId>viaversion-api</artifactId>
@@ -280,59 +214,7 @@
<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>
<finalName>IgnoreThisJar</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>*.txt</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>ProAntiTab</finalName>
<shadedArtifactAttached>false</shadedArtifactAttached>
<shadedClassifierName>shaded</shadedClassifierName>
<artifactSet>
<excludes/>
</artifactSet>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
@@ -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,41 +0,0 @@
package de.rayzs.pat.api.communication;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.scheduler.*;
import org.bukkit.Bukkit;
public class BackendUpdater {
private static PATSchedulerTask TASK;
public static void handle() {
if(isRunning() || !shouldRun() || !Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) return;
start();
}
public static boolean isRunning() {
return TASK != null && TASK.isActive();
}
public static void start() {
if(isRunning() || !Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) return;
TASK = PATScheduler.createScheduler(() -> {
if (shouldRun())
Communicator.sendRequest();
else
stop();
}, 5, 20);
}
public static void stop() {
if(TASK == null || !TASK.isActive()) return;
TASK.cancelTask();
TASK = null;
}
private static boolean shouldRun() {
int onlinePlayerSize = Bukkit.getOnlinePlayers().size();
return onlinePlayerSize >= 1;
}
}
@@ -1,6 +0,0 @@
package de.rayzs.pat.api.communication;
public interface Client {
String CHANNEL_NAME = "pat:channel";
void send(Object packet);
}
@@ -1,253 +0,0 @@
package de.rayzs.pat.api.communication;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import de.rayzs.pat.api.communication.client.ClientInfo;
import de.rayzs.pat.api.communication.client.impl.BungeeClientInfo;
import de.rayzs.pat.api.communication.client.impl.VelocityClientInfo;
import de.rayzs.pat.api.communication.impl.BukkitClient;
import de.rayzs.pat.api.communication.impl.BungeeClient;
import de.rayzs.pat.api.communication.impl.VelocityClient;
import de.rayzs.pat.api.event.PATEventHandler;
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;
import de.rayzs.pat.plugin.BukkitLoader;
import de.rayzs.pat.utils.CommunicationPackets;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.group.TinyGroup;
import de.rayzs.pat.utils.permission.PermissionUtil;
public class Communicator {
private static final Client CLIENT =
Reflection.isVelocityServer() ? new VelocityClient()
: Reflection.isProxyServer() ? new BungeeClient()
: new BukkitClient();
private static final UUID SERVER_ID = UUID.randomUUID();
public static final List<ClientInfo> CLIENTS = new ArrayList<>();
public static int SERVER_DATA_SYNC_COUNT = 0;
public static long LAST_DATA_UPDATE = System.currentTimeMillis(),
LAST_SENT_REQUEST = 0,
LAST_BUKKIT_SYNC = System.currentTimeMillis();
public static void sendPacket(Object packet) {
CLIENT.send(packet);
}
public static void sendPacket(ClientInfo clientInfo, Object packet) {
clientInfo.sendBytes(CommunicationPackets.convertToBytes(packet));
}
public static void receiveInformation(String serverName, Object packet) {
ClientInfo client = getClientByName(serverName);
if (packet instanceof CommunicationPackets.RequestPacket) {
CommunicationPackets.RequestPacket requestPacket = (CommunicationPackets.RequestPacket) packet;
if (!requestPacket.isToken(Storage.TOKEN))
return;
if (client == null) {
client = Reflection.isVelocityServer()
? new VelocityClientInfo(requestPacket.getServerId(), serverName)
: new BungeeClientInfo(requestPacket.getServerId(), serverName);
CLIENTS.add(client);
}
if (!client.compareId(requestPacket.getServerId()))
client.setId(requestPacket.getServerId());
syncData(client.getId());
return;
}
if (packet instanceof CommunicationPackets.UpdateCommandsPacket) {
if (Reflection.isProxyServer())
return;
CommunicationPackets.UpdateCommandsPacket updateCommandsPacket = (CommunicationPackets.UpdateCommandsPacket) packet;
BukkitLoader.handleUpdateCommandsPacket(updateCommandsPacket);
}
if (packet instanceof CommunicationPackets.ForcePermissionResetPacket) {
if (Reflection.isProxyServer())
return;
CommunicationPackets.ForcePermissionResetPacket permissionResetPacket = (CommunicationPackets.ForcePermissionResetPacket) packet;
if (!permissionResetPacket.isToken(Storage.TOKEN))
return;
if (permissionResetPacket.hasTarget())
PermissionUtil.setPlayerPermissions(permissionResetPacket.getTargetUUID());
else
PermissionUtil.reloadPermissions();
return;
}
if (packet instanceof CommunicationPackets.BackendDataPacket) {
CommunicationPackets.BackendDataPacket backendDataPacket = (CommunicationPackets.BackendDataPacket) packet;
if (!backendDataPacket.isToken(Storage.TOKEN))
return;
Storage.SERVER_NAME = backendDataPacket.getServerName();
return;
}
if (packet instanceof CommunicationPackets.FeedbackPacket) {
CommunicationPackets.FeedbackPacket feedbackPacket = (CommunicationPackets.FeedbackPacket) packet;
if (!feedbackPacket.isToken(Storage.TOKEN))
return;
String serverId = feedbackPacket.getServerId();
if (client == null) {
client = Reflection.isVelocityServer()
? new VelocityClientInfo(feedbackPacket.getServerId(), serverName)
: new BungeeClientInfo(feedbackPacket.getServerId(), serverName);
CLIENTS.add(client);
}
if (!client.compareId(feedbackPacket.getServerId()))
client.setId(feedbackPacket.getServerId());
if (client.hasSentFeedback())
return;
client.setFeedback(true);
client.syncTime();
SERVER_DATA_SYNC_COUNT++;
CommunicationPackets.BackendDataPacket backendDataPacket = new CommunicationPackets.BackendDataPacket(Storage.TOKEN, serverId, serverName);
sendPacket(client, backendDataPacket);
return;
}
if (packet instanceof CommunicationPackets.PacketBundle) {
CommunicationPackets.PacketBundle packetBundle = (CommunicationPackets.PacketBundle) packet;
if (!packetBundle.isToken(Storage.TOKEN) || !packetBundle.isId(SERVER_ID.toString()))
return;
Storage.USE_VELOCITY = packetBundle.isVelocity();
LAST_BUKKIT_SYNC = System.currentTimeMillis();
BukkitLoader.synchronize(packetBundle);
}
}
public static void syncData() {
syncData(null);
}
public static void syncData(String serverId) {
if (!Reflection.isProxyServer() || Storage.ConfigSections.Settings.DISABLE_SYNC.DISABLED)
return;
LAST_DATA_UPDATE = System.currentTimeMillis();
ClientInfo clientInfo;
if(serverId == null) {
SERVER_DATA_SYNC_COUNT = 0;
CLIENTS.forEach(currentClient -> syncData(currentClient.getId()));
return;
} else {
clientInfo = getClientById(serverId);
if (clientInfo != null)
clientInfo.setFeedback(false);
SERVER_DATA_SYNC_COUNT = Math.max(0, SERVER_DATA_SYNC_COUNT -1);
}
CommunicationPackets.CommandsPacket commandsPacket = new CommunicationPackets.CommandsPacket();
CommunicationPackets.GroupsPacket groupsPacket;
CommunicationPackets.PacketBundle bundle;
List<String> commands = new ArrayList<>();
String tempServerName = "";
if (clientInfo != null && clientInfo.getName() != null) {
tempServerName = clientInfo.getName();
if (!Storage.Blacklist.isIgnoredServer(tempServerName))
commands.addAll(Storage.Blacklist.getBlacklist().getCommands());
List<GeneralBlacklist> serverBlacklists = Storage.Blacklist.getServerBlacklists(clientInfo.getName());
serverBlacklists.stream().filter(serverBlacklist ->
serverBlacklist != null && serverBlacklist.getCommands() != null
).forEach(serverBlacklist ->
commands.addAll(serverBlacklist.getCommands())
);
}
final String serverName = tempServerName;
List<TinyGroup> groups = new ArrayList<>();
TinyGroup tinyGroup;
for (Group group : GroupManager.getGroups()) {
if (groups.stream().anyMatch(cTG -> cTG.getGroupName().equals(group.getGroupName())))
continue;
tinyGroup = new TinyGroup(group.getGroupName(), group.getPriority(), group.getAllCommands(serverName));
for (GroupBlacklist groupBlacklist : group.getAllServerGroupBlacklist(serverName))
tinyGroup.addAll(groupBlacklist.getCommands());
groups.add(tinyGroup);
}
groupsPacket = new CommunicationPackets.GroupsPacket(groups);
commandsPacket.setTurnBlacklistToWhitelist(Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED);
commandsPacket.setCommands(commands);
bundle = new CommunicationPackets.PacketBundle(Storage.TOKEN, serverId, commandsPacket, groupsPacket);
clientInfo.sendBytes(CommunicationPackets.convertToBytes(bundle));
PATEventHandler.callSentSyncEvents(bundle, serverName);
}
public static void sendRequest() {
if(System.currentTimeMillis() - LAST_SENT_REQUEST >= 5000) {
LAST_SENT_REQUEST = System.currentTimeMillis();
sendPacket(new CommunicationPackets.RequestPacket(Storage.TOKEN, SERVER_ID.toString()));
}
}
public static void sendPermissionReset() {
if(Reflection.isProxyServer())
sendPacket(new CommunicationPackets.ForcePermissionResetPacket(Storage.TOKEN));
}
public static void sendUpdateCommand() {
sendPacket(new CommunicationPackets.UpdateCommandsPacket(Storage.TOKEN));
}
public static void sendUpdateCommand(UUID targetUUID) {
sendPacket(new CommunicationPackets.UpdateCommandsPacket(Storage.TOKEN, targetUUID));
}
public static void sendFeedback() {
sendPacket(new CommunicationPackets.FeedbackPacket(Storage.TOKEN, SERVER_ID.toString()));
}
public static Client getClient() {
return CLIENT;
}
public static ClientInfo getClientById(String id) {
return CLIENTS.isEmpty() ? null : CLIENTS.stream().filter(client -> client != null && client.compareId(id)).findFirst().orElse(null);
}
public static ClientInfo getClientByName(String name) {
return CLIENTS.isEmpty() ? null : CLIENTS.stream().filter(client -> client != null && client.getName().equalsIgnoreCase(name)).findFirst().orElse(null);
}
}
@@ -1,58 +0,0 @@
package de.rayzs.pat.api.communication.client;
import de.rayzs.pat.utils.TimeConverter;
public abstract class ClientInfo {
private String id, name;
private boolean sentFeedback = false;
private long syncTime = System.currentTimeMillis();
public ClientInfo(String serverId) {
this.id = serverId;
}
public ClientInfo(String serverId, String name) {
this.id = serverId;
this.name = name;
}
public abstract void sendBytes(byte[] bytes);
public void setName(String name) {
this.name = name;
}
public void setId(String serverId) {
this.id = serverId;
}
public String getName() {
return name;
}
public boolean compareId(String id) {
return this.id.equals(id);
}
public void syncTime() {
syncTime = System.currentTimeMillis();
}
public String getSyncTime() {
return TimeConverter.calcAndGetTime(syncTime);
}
public void setFeedback(boolean state) {
this.sentFeedback = state;
}
public boolean hasSentFeedback() {
return sentFeedback;
}
public String getId() {
return id;
}
}
@@ -1,35 +0,0 @@
package de.rayzs.pat.api.communication.client.impl;
import de.rayzs.pat.api.communication.client.ClientInfo;
import de.rayzs.pat.api.communication.Client;
import de.rayzs.pat.plugin.BungeeLoader;
import de.rayzs.pat.plugin.logger.Logger;
import net.md_5.bungee.api.ProxyServer;
public class BungeeClientInfo extends ClientInfo {
public BungeeClientInfo(String serverId) {
super(serverId);
}
public BungeeClientInfo(String serverId, String name) {
super(serverId, name);
}
@Override
public void sendBytes(byte[] bytes) {
try {
ProxyServer server = BungeeLoader.getPlugin().getProxy();
server.getServers().entrySet().stream().filter(entry ->
entry.getKey().equalsIgnoreCase(getName())
).forEach(entry ->
entry.getValue().sendData(Client.CHANNEL_NAME, bytes)
);
} catch (NoClassDefFoundError exception) {
Logger.warning("Failed to send data to backend servers! :c");
}
}
}
@@ -1,25 +0,0 @@
package de.rayzs.pat.api.communication.client.impl;
import de.rayzs.pat.api.communication.impl.VelocityClient;
import de.rayzs.pat.api.communication.client.ClientInfo;
import de.rayzs.pat.plugin.VelocityLoader;
public class VelocityClientInfo extends ClientInfo {
public VelocityClientInfo(String serverId) {
super(serverId);
}
public VelocityClientInfo(String serverId, String name) {
super(serverId, name);
}
@Override
public void sendBytes(byte[] bytes) {
VelocityLoader.getServer().getAllServers().stream().filter(server ->
server.getServerInfo().getName().equalsIgnoreCase(getName())
).forEach(server ->
server.sendPluginMessage(VelocityClient.getIdentifier(), bytes)
);
}
}
@@ -1,55 +0,0 @@
package de.rayzs.pat.api.communication.impl;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.scheduler.PATScheduler;
import org.bukkit.plugin.messaging.PluginMessageListener;
import de.rayzs.pat.utils.CommunicationPackets;
import de.rayzs.pat.plugin.BukkitLoader;
import de.rayzs.pat.api.communication.*;
import org.bukkit.entity.Player;
import org.bukkit.*;
public class BukkitClient implements Client, PluginMessageListener {
private static final Server SERVER = Bukkit.getServer();
public BukkitClient() {
if (!Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
return;
}
SERVER.getMessenger().registerIncomingPluginChannel(BukkitLoader.getPlugin(), CHANNEL_NAME, this);
SERVER.getMessenger().registerOutgoingPluginChannel(BukkitLoader.getPlugin(), CHANNEL_NAME);
}
@Override
public void send(Object packet) {
try {
SERVER.sendPluginMessage(BukkitLoader.getPlugin(), CHANNEL_NAME, CommunicationPackets.convertToBytes(packet));
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
@Override
public void onPluginMessageReceived(String channel, Player player, byte[] bytes) {
if (!channel.equals(CHANNEL_NAME))
return;
try {
Object packetObj = CommunicationPackets.buildFromBytes(bytes);
if (!CommunicationPackets.isPacket(packetObj))
return;
PATScheduler.createScheduler(() -> Communicator.receiveInformation("proxy", packetObj));
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
@@ -1,63 +0,0 @@
package de.rayzs.pat.api.communication.impl;
import de.rayzs.pat.api.storage.Storage;
import net.md_5.bungee.api.event.PluginMessageEvent;
import de.rayzs.pat.utils.CommunicationPackets;
import net.md_5.bungee.api.connection.Server;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import de.rayzs.pat.plugin.BungeeLoader;
import de.rayzs.pat.api.communication.*;
import net.md_5.bungee.api.ProxyServer;
public class BungeeClient implements Client, Listener {
private static final ProxyServer SERVER = ProxyServer.getInstance();
public BungeeClient() {
if (Storage.ConfigSections.Settings.DISABLE_SYNC.DISABLED) {
return;
}
SERVER.registerChannel(CHANNEL_NAME);
SERVER.getPluginManager().registerListener(BungeeLoader.getPlugin(), this);
}
@Override
public void send(Object packet) {
for (ServerInfo serverInfo : ProxyServer.getInstance().getServers().values()) {
try {
serverInfo.sendData(CHANNEL_NAME, CommunicationPackets.convertToBytes(packet));
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
@EventHandler
public void onQueryReceive(PluginMessageEvent event) {
if (!event.getTag().equalsIgnoreCase(CHANNEL_NAME))
return;
try {
Object packetObj = CommunicationPackets.buildFromBytes(event.getData());
if (!CommunicationPackets.isPacket(packetObj))
return;
Server server = (Server) event.getSender();
Communicator.receiveInformation(server.getInfo().getName(), packetObj);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
@@ -1,60 +0,0 @@
package de.rayzs.pat.api.communication.impl;
import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier;
import com.velocitypowered.api.event.connection.PluginMessageEvent;
import com.velocitypowered.api.proxy.server.RegisteredServer;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.CommunicationPackets;
import com.velocitypowered.api.event.Subscribe;
import de.rayzs.pat.plugin.VelocityLoader;
import de.rayzs.pat.api.communication.*;
import com.velocitypowered.api.proxy.*;
public class VelocityClient implements Client {
private static final ProxyServer SERVER = VelocityLoader.getServer();
private static final MinecraftChannelIdentifier IDENTIFIER = MinecraftChannelIdentifier.from(CHANNEL_NAME);
public VelocityClient() {
if (Storage.ConfigSections.Settings.DISABLE_SYNC.DISABLED) {
return;
}
SERVER.getChannelRegistrar().register(IDENTIFIER);
SERVER.getEventManager().register(VelocityLoader.getInstance(), this);
}
@Override
public void send(Object packet) {
for (RegisteredServer registeredServer : SERVER.getAllServers()) {
try {
registeredServer.sendPluginMessage(IDENTIFIER, CommunicationPackets.convertToBytes(packet));
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
@Subscribe
public void onQueryReceive(PluginMessageEvent event) {
if (event.getIdentifier() != IDENTIFIER)
return;
Object packetObj = CommunicationPackets.buildFromBytes(event.getData());
if (!CommunicationPackets.isPacket(packetObj))
return;
ServerConnection server = (ServerConnection) event.getSource();
Communicator.receiveInformation(server.getServerInfo().getName(), packetObj);
}
public static MinecraftChannelIdentifier getIdentifier() {
return IDENTIFIER;
}
}
@@ -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);
}
}
@@ -88,12 +82,11 @@ public class PATEventHandler {
return event;
}
public static SentSyncEvent callSentSyncEvents(CommunicationPackets.PacketBundle packetBundle, String serverName) {
SentSyncEvent event = EmptyEvent.createEmptySentSyncEvent(packetBundle, serverName);
public static SentSyncEvent callSentSyncEvents(CommunicationPackets.Proxy2Backend.DataSyncPacket dataSyncPacket, String serverName) {
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);
}
}
@@ -101,13 +94,12 @@ public class PATEventHandler {
return event;
}
public static ReceiveSyncEvent callReceiveSyncEvents(CommunicationPackets.PacketBundle packetBundle) {
ReceiveSyncEvent event = EmptyEvent.createEmptyReceiveSyncEvent(packetBundle);
public static ReceiveSyncEvent callReceiveSyncEvents(CommunicationPackets.Proxy2Backend.DataSyncPacket dataSyncPacket) {
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) {
@@ -133,8 +125,8 @@ public class PATEventHandler {
};
}
public static SentSyncEvent createEmptySentSyncEvent(CommunicationPackets.PacketBundle packetBundle, String serverName) {
return new SentSyncEvent(null, packetBundle, serverName) {
public static SentSyncEvent createEmptySentSyncEvent(CommunicationPackets.Proxy2Backend.DataSyncPacket dataSyncPacket, String serverName) {
return new SentSyncEvent(null, dataSyncPacket, serverName) {
@Override
public void handle(SentSyncEvent event) {
@@ -142,8 +134,8 @@ public class PATEventHandler {
};
}
public static ReceiveSyncEvent createEmptyReceiveSyncEvent(CommunicationPackets.PacketBundle packetBundle) {
return new ReceiveSyncEvent(null, packetBundle) {
public static ReceiveSyncEvent createEmptyReceiveSyncEvent(CommunicationPackets.Proxy2Backend.DataSyncPacket dataSyncPacket) {
return new ReceiveSyncEvent(null, dataSyncPacket) {
@Override
public void handle(ReceiveSyncEvent 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,22 +2,24 @@ 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> {
private final CommunicationPackets.PacketBundle packetBundle;
private final CommunicationPackets.Proxy2Backend.DataSyncPacket dataSyncPacket;
public ReceiveSyncEvent() {
super(null);
this.packetBundle = null;
this.dataSyncPacket = null;
}
public ReceiveSyncEvent(Object senderObj, CommunicationPackets.PacketBundle packetBundle) {
super(senderObj);
this.packetBundle = packetBundle;
public ReceiveSyncEvent(CommandSender player, CommunicationPackets.Proxy2Backend.DataSyncPacket dataSyncPacket) {
super(player);
this.dataSyncPacket = dataSyncPacket;
}
public CommunicationPackets.PacketBundle getPacketBundle() {
return packetBundle;
public CommunicationPackets.Proxy2Backend.DataSyncPacket getDataSyncPacket() {
return dataSyncPacket;
}
}
@@ -2,21 +2,24 @@ 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> {
private final CommunicationPackets.PacketBundle packetBundle;
private final CommunicationPackets.Proxy2Backend.DataSyncPacket dataSyncPacket;
private final String serverName;
public SentSyncEvent() {
super(null);
this.packetBundle = null;
this.dataSyncPacket = null;
this.serverName = null;
}
public SentSyncEvent(Object senderObj, CommunicationPackets.PacketBundle packetBundle, String serverName) {
super(senderObj);
this.packetBundle = packetBundle;
public SentSyncEvent(CommandSender player, CommunicationPackets.Proxy2Backend.DataSyncPacket dataSyncPacket, String serverName) {
super(player);
this.dataSyncPacket = dataSyncPacket;
this.serverName = serverName;
}
@@ -24,7 +27,7 @@ public abstract class SentSyncEvent extends PATEvent<SentSyncEvent> {
return serverName;
}
public CommunicationPackets.PacketBundle getPacketBundle() {
return packetBundle;
public CommunicationPackets.Proxy2Backend.DataSyncPacket getDataSyncPacket() {
return dataSyncPacket;
}
}
@@ -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,205 +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();
Logger.info("Injection failed. Switching to secondary injection method.");
boolean success = inject(player);
if (success) {
Logger.info("Secondary injection method was successful.");
} else {
Logger.warning("Secondary injection method failed!");
}
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;
}
}
@@ -1,20 +1,22 @@
package de.rayzs.pat.api.storage;
import java.security.SecureRandom;
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,12 +62,11 @@ public class Storage {
public static final List<UUID> NOTIFY_PLAYERS = new ArrayList<>();
public static String TOKEN = "", SERVER_NAME = null, CURRENT_VERSION = "", NEWER_VERSION = "";
public static String 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, USE_VELOCITY = false, USE_SIMPLECLOUD;
public static long LAST_SYNC = System.currentTimeMillis();
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);
private static PermissionPlugin PERMISSION_PLUGIN = PermissionPlugin.NONE;
public static void initialize(PluginLoader loader, String currentVersion) {
@@ -81,6 +82,7 @@ public class Storage {
PERMISSION_PLUGIN = permissionPlugin;
}
public static void broadcastPermissionsPluginNotice() {
if (Storage.getPermissionPlugin() != PermissionPlugin.NONE) {
return;
@@ -90,6 +92,12 @@ public class Storage {
Logger.warning("Read more about it here: https://rayzs.de/products/proantitab/nkppf");
}
private static String generateToken() {
byte[] bytes = new byte[32];
new SecureRandom().nextBytes(bytes);
return Base64.getUrlEncoder().withoutPadding().encodeToString(bytes);
}
public static PermissionPlugin getPermissionPlugin() {
return PERMISSION_PLUGIN;
}
@@ -99,9 +107,9 @@ public class Storage {
loadToken();
if (TOKEN != null && !TOKEN.isEmpty()) {
int tokenLength = TOKEN.length(), cutIndex = Math.max(1, tokenLength - 3);
String censoredTokenDisplay = "*".repeat(cutIndex) + TOKEN.substring(cutIndex);
Logger.info("Token found! (" + censoredTokenDisplay + ")");
int tokenLength = TOKEN.length(), cutIndex = Math.max(1, tokenLength - 2);
CENSORED_TOKEN = TOKEN.charAt(0) + "*".repeat(cutIndex) + TOKEN.substring(cutIndex);
Logger.info("Token found! (" + CENSORED_TOKEN + ")");
}
if (loadBlacklist) Blacklist.loadAll();
@@ -110,51 +118,38 @@ 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 (invalidEnv)
Logger.warning("Environment variable not found! Using default Token from the config.yml instead.");
if (useDefaultToken) {
TOKEN = Reflection.isProxyServer()
? (String) Files.TOKEN.getOrSet("token", generateToken())
: ConfigSections.Settings.HANDLE_THROUGH_PROXY.TOKEN;
}
}
public static void loadConfig() {
@@ -168,24 +163,32 @@ 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) {
BackendUpdater.stop();
BackendUpdater.start();
Communicator.get().reload();
BackendUpdater.get().restart();
}
if (!backend) {
Storage.handleChange();
}
if (proxy) {
Communicator.Proxy2Backend.sendDataSync();
}
Files.CUSTOM_RESPONSES.reload();
ResponseHandler.update();
ConfigUpdater.broadcastMissingParts();
Storage.getLoader().handleReload();
}
@@ -198,93 +201,86 @@ 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();
Communicator.syncData();
Storage.getLoader().updateCommandCache();
Communicator.sendPermissionReset();
Storage.getLoader().resetCommandsCache();
if (!Reflection.isVelocityServer()) {
BungeePacketAnalyzer.sendCommandsPacket();
}
Communicator.Proxy2Backend.sendUpdateCommand();
return;
}
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();
}
// Quickly updates all player subarguments.
public static void quickSubArgumentUpdate(UUID uuid) {
List<String> playerCommands = new ArrayList<>(SubArguments.getServerCommands(uuid));
playerCommands.addAll(SubArguments.getGroupCommands(uuid));
public static void tempCachePlayerToServer(UUID playerId, String server) {
TEMP_PLAYER_SERVER_CACHE.put(playerId, server);
}
PATEventHandler.callUpdatePlayerCommandsEvents(uuid, playerCommands, false);
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);
}
public static PluginLoader getLoader() {
@@ -313,13 +309,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);
@@ -343,22 +338,27 @@ 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 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 TabCompletionForNotExistingCommandsSection TAB_COMPLETION_FOR_NOT_EXISTING_COMMANDS = new TabCompletionForNotExistingCommandsSection();
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();
@@ -419,7 +419,7 @@ public class Storage {
public static String findAndReplace(Player player, String request) {
String result = null, param = "";
if(USE_PLACEHOLDERAPI) {
if (USE_PLACEHOLDERAPI) {
for (PlaceholderStorage storage : PLACEHOLDERS) {
if (!storage.getRequest().startsWith(request)) continue;
@@ -435,7 +435,7 @@ public class Storage {
// Second time because of nested placeholders
if (result != null && result.contains("%")) {
result = PlaceholderReplacer.replace(player, result);
result = PlaceholderReplacer.applyPlaceholders(CommandSender.from(player), result);
}
}
@@ -446,7 +446,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()) {
@@ -489,7 +544,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();
@@ -559,28 +614,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);
@@ -595,7 +685,7 @@ public class Storage {
}
if (Storage.getPermissionPlugin() != PermissionPlugin.NONE) {
if (PermissionUtil.hasBypassPermission(sender, command)) {
if (PermissionUtil.hasBypassPermission(sender, command, isOperator)) {
return true;
}
}
@@ -609,7 +699,7 @@ public class Storage {
}
if (Storage.getPermissionPlugin() != PermissionPlugin.NONE) {
if (PermissionUtil.hasBypassPermission(sender, command)) {
if (PermissionUtil.hasBypassPermission(sender, command, isOperator)) {
return true;
}
}
@@ -656,7 +746,7 @@ public class Storage {
return !turn;
}
return turn != listed; // Shorter version of above's code
return turn != listed;
}
@@ -670,7 +760,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) {
@@ -691,7 +781,7 @@ public class Storage {
break;
}
listed = blacklist.isListed(command, false);
listed = blacklist.isListed(command);
}
if (!listed && type != BlockType.BOTH) {
@@ -1,12 +1,13 @@
package de.rayzs.pat.api.storage.config.messages;
import de.rayzs.pat.api.storage.storages.ConfigStorage;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.configuration.helper.*;
import java.util.Arrays;
public class InfoSection extends ConfigStorage {
public String VERSION_OUTDATED, VERSION_UPDATED, SYNC_TIME, SYNC_DISABLED;
public String VERSION_OUTDATED, VERSION_UPDATED, SYNC_TIME, SYNC_DISABLED, SYNC_WAITING;
public MultipleMessagesHelper MESSAGE;
public InfoSection() {
@@ -20,6 +21,11 @@ public class InfoSection extends ConfigStorage {
VERSION_UPDATED = new ConfigSectionHelper<String>(this, "version.updated", "&aLatest version").getOrSet();
VERSION_OUTDATED = new ConfigSectionHelper<String>(this, "version.outdated", "&cOutdated (%newest_version%)").getOrSet();
SYNC_TIME = new ConfigSectionHelper<String>(this, "proxy-sync.time", "&e%time%").getOrSet();
if (!Reflection.isProxyServer()) {
SYNC_WAITING = new ConfigSectionHelper<String>(this, "proxy-sync.waiting", "&cWaiting to establish connection...").getOrSet();
}
SYNC_DISABLED = new ConfigSectionHelper<String>(this, "proxy-sync.disabled", "&cDisabled").getOrSet();
MESSAGE = new MultipleMessagesHelper(this, "message",
@@ -28,6 +34,7 @@ public class InfoSection extends ConfigStorage {
, "&7 Version: &e%current_version%"
, "&7 Status: %version_status%"
, "&7 Last sync with proxy: &e%sync_time%"
, "&7 Last received alive packet: %last_alive_response%"
, "&7 Proxy sync-token: &e%token%"
, "&7 Proxy-received server name: &e%sync_server_name%"
)
@@ -18,12 +18,17 @@ public class StatsSection extends ConfigStorage {
@Override
public void load() {
super.load();
if(!Reflection.isProxyServer()) return;
if (!Reflection.isProxyServer()) {
return;
}
NO_SERVER = new ConfigSectionHelper<String>(this, "no-server", "&cNone!").getOrSet();
SPLITTER = new ConfigSectionHelper<String>(this, "message.splitter", "&7, ").getOrSet();
SERVER = new ConfigSectionHelper<String>(this, "message.server", "&f%servername% &8(%updated%)").getOrSet();
SERVER = new ConfigSectionHelper<String>(this, "message.server", "&f%servername% &8(&a%last_alive_response% &8/ &2%updated%&8)").getOrSet();
STATISTIC = new MultipleMessagesHelper(this, "message.statistic", Arrays.asList(
"&7Last sync sent to &f%server_count% &7servers. &8&o(%last_sync_time% ago)",
"&7Format: &eserver (last alive packet / last sync packet)",
"&7Last sync sent to &f%server_count% &7server(s) &e%last_sync_time% &7ago:",
"&7Sent to servers: &f%servers%"
));
}
@@ -17,9 +17,6 @@ public class AutoLowercaseCommandsSection extends ConfigStorage {
public void load() {
super.load();
if (Reflection.isProxyServer())
return;
ENABLED = new ConfigSectionHelper<Boolean>(this, "enabled", true).getOrSet();
}
@@ -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 ForwardConsoleNotificationAlertsSection extends ConfigStorage {
public boolean ENABLED;
public ForwardConsoleNotificationAlertsSection() {
super("forward-console-notification-alerts");
}
@Override
public void load() {
super.load();
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();
}
}
@@ -6,7 +6,7 @@ import de.rayzs.pat.utils.Reflection;
public class HandleThroughProxySection extends ConfigStorage {
public boolean ENABLED;
public boolean ENABLED, ALLOW_P2B_ACTIONS;
public boolean LOAD_FROM_ENV;
public String ENV_NAME;
@@ -20,11 +20,13 @@ public class HandleThroughProxySection extends ConfigStorage {
@Override
public void load() {
super.load();
if(Reflection.isProxyServer()) return;
if (Reflection.isProxyServer()) return;
ENABLED = new ConfigSectionHelper<Boolean>(this, "enabled", false).getOrSet();
TOKEN = new ConfigSectionHelper<String>(this, "token", "insert-token-of-proxy-here").getOrSet();
ALLOW_P2B_ACTIONS = new ConfigSectionHelper<Boolean>(this, "allow-p2b-actions", false).getOrSet();
LOAD_FROM_ENV = new ConfigSectionHelper<Boolean>(this, "load-from-env.enabled", false).getOrSet();
ENV_NAME = new ConfigSectionHelper<String>(this, "load-from-env.name", "PAT_TOKEN").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();
}
}
@@ -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 TabCompletionForNotExistingCommandsSection extends ConfigStorage {
public boolean ENABLED;
public TabCompletionForNotExistingCommandsSection() {
super("tab-completion-for-not-existing-commands");
}
@Override
public void load() {
super.load();
if (!Reflection.isProxyServer()) return;
ENABLED = new ConfigSectionHelper<Boolean>(this, null, false).getOrSet();
}
}
@@ -6,7 +6,6 @@ import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
public class UpdateGroupsPerServerSection extends ConfigStorage {
// Disabled for now
public boolean ENABLED = false;
public UpdateGroupsPerServerSection() {
@@ -17,11 +16,9 @@ public class UpdateGroupsPerServerSection extends ConfigStorage {
public void load() {
super.load();
/*
if (!Reflection.isProxyServer())
return;
ENABLED = new ConfigSectionHelper<Boolean>(this, null, false).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,52 +9,32 @@ 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;
if (commands == null || command.isEmpty()) {
return false;
}
boolean isNegated = Storage.Blacklist.BlockTypeFetcher.isNegated(command);
final boolean isNegated = Storage.Blacklist.BlockTypeFetcher.isNegated(command);
final boolean takeFirstArgument = !isNegated == turn;
if (!isNegated) {
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) {
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) {
@@ -85,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);
@@ -98,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;
@@ -127,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());
}
}
@@ -140,11 +120,36 @@ public class BlacklistStorage extends StorageTemplate implements Serializable {
final String negated = Storage.Blacklist.BlockType.NEGATE + pluginCommand;
if (!commands.contains(negated) && !tmpCommands.contains(negated)) {
tmpCommands.add(pluginCommand);
tmpCommands.add(caseSensitive ? pluginCommand : pluginCommand.toLowerCase());
}
}
}
hiddenCommands = tmpCommands;
if (!Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED) {
hiddenCommands = new HashSet<>(tmpCommands);
return;
}
final List<String> finalisedCommands = new ArrayList<>();
for (String command : tmpCommands) {
if (Storage.Blacklist.BlockTypeFetcher.isNegated(command)) {
finalisedCommands.add(caseSensitive ? command : StringUtils.lowercaseFirstArgument(command));
continue;
}
if (command.contains(" ")) {
final String firstArgument = StringUtils.getFirstArg(command);
if (!finalisedCommands.contains(firstArgument)) {
finalisedCommands.add(caseSensitive ? firstArgument : firstArgument.toLowerCase());
}
}
finalisedCommands.add(caseSensitive ? command : StringUtils.lowercaseFirstArgument(command));
}
hiddenCommands = new HashSet<>(finalisedCommands);
}
}
File diff suppressed because it is too large. Load diff
@@ -1,319 +1,339 @@
package de.rayzs.pat.plugin;
import de.rayzs.pat.api.brand.CustomServerBrand;
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();
CommandProcess.initialize();
Reflection.initialize(getProxy());
ConfigUpdater.initialize();
Storage.USE_SIMPLECLOUD = Reflection.doesClassExist("eu.thesimplecloud.plugin.startup.CloudPlugin");
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();
if (!Storage.ConfigSections.Settings.DISABLE_SYNC.DISABLED)
ProxyServer.getInstance().getScheduler().schedule(this, Communicator::syncData, 5, TimeUnit.SECONDS);
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!");
}
if(Storage.USE_SIMPLECLOUD)
Logger.warning("Detected SimpleCloud and therefore MiniMessages by Kyori are disabled!");
BungeePacketAnalyzer.injectAll();
Storage.broadcastPermissionsPluginNotice();
ConfigUpdater.broadcastMissingParts();
ActionHandler.initialize();
SubArguments.initialize();
StorageConverter.initialize();
// 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.sendRequest();
}, 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) {
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.MessageHelper;
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);
MessageHelper.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();
MessageHelper.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,331 +1,335 @@
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.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.2.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);
CommandProcess.initialize();
Reflection.initialize(server);
ConfigUpdater.initialize();
Storage.USE_SIMPLECLOUD = Reflection.doesClassExist("eu.thesimplecloud.plugin.startup.CloudPlugin");
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();
if (!Storage.ConfigSections.Settings.DISABLE_SYNC.DISABLED)
server.getScheduler().buildTask(this, () -> Communicator.syncData()).delay(5, TimeUnit.SECONDS).schedule();
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!");
}
if (Storage.USE_SIMPLECLOUD)
Logger.warning("Detected SimpleCloud and therefore MiniMessages by Kyori are disabled!");
Storage.broadcastPermissionsPluginNotice();
ConfigUpdater.broadcastMissingParts();
ActionHandler.initialize();
SubArguments.initialize();
StorageConverter.initialize();
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) {
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.MessageHelper;
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.*;
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);
MessageHelper.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;
@@ -0,0 +1,64 @@
package de.rayzs.pat.plugin.command.commands.local.info;
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;
import java.util.List;
public class InfoCommand extends ProCommand {
public InfoCommand() {
super(
"info",
""
);
}
@Override
public boolean execute(CommandSender sender, String[] args) {
String message = StringUtils.getStringList(Storage.ConfigSections.Messages.INFO.MESSAGE.getLines(), "\n");
String syncTime = Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED ||
Reflection.isProxyServer()
? Storage.ConfigSections.Messages.INFO.SYNC_TIME.replace("%time%", TimeConverter.calcAndGetTime(Communicator.get().getLastSync()))
: Storage.ConfigSections.Messages.INFO.SYNC_DISABLED;
String lastAlivePacketTime = Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED ||
Reflection.isProxyServer()
? Storage.ConfigSections.Messages.INFO.SYNC_TIME.replace("%time%", TimeConverter.calcAndGetTime(Communicator.get().getLastReceivedKeepAliveResponse()))
: Storage.ConfigSections.Messages.INFO.SYNC_DISABLED;
if (!Reflection.isProxyServer()
&& !BackendUpdater.get().isConnected()
&& Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED)
{
syncTime = Storage.ConfigSections.Messages.INFO.SYNC_WAITING;
lastAlivePacketTime = Storage.ConfigSections.Messages.INFO.SYNC_WAITING;
}
final String versionStatus = Storage.OUTDATED
? Storage.ConfigSections.Messages.INFO.VERSION_OUTDATED
: Storage.ConfigSections.Messages.INFO.VERSION_UPDATED;
message = StringUtils.replace(message,
"%sync_time%", syncTime,
"%last_alive_response%", lastAlivePacketTime,
"%version_status%", versionStatus
);
sender.sendMessage(message);
return true;
}
@Override
public List<String> tabComplete(CommandSender sender, String[] args) {
return List.of();
}
}
@@ -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,13 +1,15 @@
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;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class StatsCommand extends ProCommand {
@@ -29,26 +31,28 @@ public class StatsCommand extends ProCommand {
return true;
}
final int length = Communicator.CLIENTS.size() - 1;
boolean tmpFound = false;
final Set<Client> clients = Communicator.get().getClients();
final Iterator<Client> iterator = clients.iterator();
boolean tmpFound = false;
StringBuilder statsBuilder = new StringBuilder();
for (int i = 0; i < Communicator.CLIENTS.size(); i++) {
ClientInfo client = Communicator.CLIENTS.get(i);
while (iterator.hasNext()) {
Client client = iterator.next();
if (!client.hasSentFeedback())
continue;
if (!tmpFound)
if (!tmpFound) {
tmpFound = true;
}
statsBuilder.append(StringUtils.replace(Storage.ConfigSections.Messages.STATS.SERVER,
"%updated%", client.getSyncTime(), "%servername%", client.getName()
"%updated%", client.getFormattedSyncTime(),
"%servername%", client.getServerName(),
"%last_alive_response%", client.getFormattedLastReceivedKeepAlivePacketTime()
));
if (i <= length)
if (iterator.hasNext()) {
statsBuilder.append(Storage.ConfigSections.Messages.STATS.SPLITTER);
}
}
final boolean found = tmpFound;
@@ -56,8 +60,9 @@ public class StatsCommand extends ProCommand {
Storage.ConfigSections.Messages.STATS.STATISTIC.getLines().forEach(message -> {
message = StringUtils.replace(message,
"%server_count%", String.valueOf(Communicator.SERVER_DATA_SYNC_COUNT),
"%last_sync_time%", TimeConverter.calcAndGetTime(Communicator.LAST_DATA_UPDATE),
"%server_count%", String.valueOf(Communicator.get().getClients().size()),
"%last_sync_time%", TimeConverter.calcAndGetTime(Communicator.get().getLastSync()),
"%last_alive_response_time%", TimeConverter.calcAndGetTime(Communicator.get().getLastReceivedKeepAliveResponse()),
"%servers%", found ? statsBuilder.toString() : Storage.ConfigSections.Messages.STATS.NO_SERVER
);
@@ -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;
@@ -18,20 +18,20 @@ public class NotifyCommand extends ProCommand {
@Override
public boolean execute(CommandSender sender, String[] args) {
boolean backend = Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED && !Reflection.isProxyServer();
if (backend) {
sender.sendMessage(Storage.ConfigSections.Messages.NO_PROXY.MESSAGE);
return true;
}
boolean enabled = false;
boolean enabled;
if (sender.isConsole()) {
enabled = Storage.SEND_CONSOLE_NOTIFICATION;
Storage.SEND_CONSOLE_NOTIFICATION = !Storage.SEND_CONSOLE_NOTIFICATION;
} else {
boolean backend = Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED && !Reflection.isProxyServer();
if (backend) {
sender.sendMessage(Storage.ConfigSections.Messages.NO_PROXY.MESSAGE);
return true;
}
enabled = Storage.NOTIFY_PLAYERS.contains(sender.getUniqueId());
if (enabled)
@@ -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,12 +1,9 @@
package de.rayzs.pat.plugin.process.impl.local.system;
package de.rayzs.pat.plugin.command.commands.local.system;
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.*;
@@ -26,16 +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();
}
Storage.getLoader().updateCommands();
sender.sendMessage(Storage.ConfigSections.Messages.UPDATE_PERMISSIONS.UPDATE_ALL);
return true;
@@ -44,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;
@@ -59,13 +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);
}
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,143 +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.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.USE_VELOCITY) {
return;
}
if (player.isOp()) {
if (!knownOperators.contains(uuid)) {
knownOperators.add(uuid);
}
return;
}
if (!BukkitLoader.isLoaded()) {
event.getCommands().clear();
return;
}
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
return;
}
if (event.getCommands().isEmpty()) {
return;
}
List<String> allCommands = getCommands();
COMMANDS_CACHE.handleCommands(allCommands);
if (!player.isOp() && knownOperators.contains(uuid)) {
knownOperators.remove(uuid);
PermissionUtil.reloadPermissions(player.getUniqueId());
}
if (PermissionUtil.hasBypassPermission(sender)) {
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 (Reflection.getMinor() >= 13 && !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.isBukkit() && !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.MessageHelper;
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);
MessageHelper.sendMessage(sender, 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, "", "\\", "<", ">", "&");
final String notificationMessage = StringUtils.replace(
Storage.ConfigSections.Messages.NOTIFICATION.ALERT.getLines(),
"%player%", player.getName(),
"%command%", displayCommand,
"%world%", worldName);
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isCommand(command)) {
MessageHelper.sendMessage(
sender,
Storage.ConfigSections.Settings.CUSTOM_PLUGIN.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
final CommandSender otherSender = CommandSender.from(uuid);
if (otherSender != null) {
MessageHelper.sendMessage(otherSender, notificationMessage);
}
});
event.setCancelled(true);
return;
}
if (Storage.ConfigSections.Settings.CUSTOM_VERSION.isCommand(command)) {
MessageHelper.sendMessage(
sender,
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) {
MessageHelper.sendMessage(sender, 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);
MessageHelper.sendMessage(
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 -> {
final CommandSender otherSender = CommandSender.from(uuid);
MessageHelper.sendMessage(otherSender, 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);
MessageHelper.sendMessage(
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,84 +1,91 @@
package de.rayzs.pat.plugin.listeners.bukkit;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.plugin.system.serverbrand.CustomServerBrand;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.ServerPlayersChangeEvent;
import de.rayzs.pat.api.netty.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.api.communication.BackendUpdater;
import de.rayzs.pat.plugin.packetanalyzer.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.plugin.system.communication.BackendUpdater;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.message.MessageHelper;
import de.rayzs.pat.utils.message.replacer.PlaceholderReplacer;
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)) {
final BukkitPacketAnalyzer.InjectionState injectionState = BukkitPacketAnalyzer.inject(player);
if (injectionState == BukkitPacketAnalyzer.InjectionState.FAILED) {
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 (BukkitPacketAnalyzer.inject(player) == BukkitPacketAnalyzer.InjectionState.FAILED) {
if (Storage.ConfigSections.Settings.INJECTION_FAILED.ENABLED) {
Logger.info(PlaceholderReplacer.applyPlaceholders(
sender,
Storage.ConfigSections.Settings.INJECTION_FAILED.CONSOLE_MESSAGE
));
player.kickPlayer(PlaceholderReplacer.applyPlaceholders(
sender,
Storage.ConfigSections.Settings.INJECTION_FAILED.KICK_MESSAGE
));
}
}
}
}, 10);
} else if (injectionState == BukkitPacketAnalyzer.InjectionState.SKIPPED) {
Logger.warning("Skipped injection for " + player.getName() + ". Player seems to have a corrupted pipeline. (A fake player?)");
}
// 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());
MessageHelper.sendMessage(sender, Storage.ConfigSections.Settings.UPDATE.OUTDATED.getLines());
}
}, 20);
}
@@ -86,8 +93,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 +108,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);
}
}
}
@@ -7,13 +7,13 @@ import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.ExpireCache;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.message.replacer.PlaceholderReplacer;
import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.event.*;
import org.bukkit.Bukkit;
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 +52,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 +67,7 @@ public class PaperServerListPing implements Listener {
"%players%", currentPlayerName, "&", "§"
);
event.getPlayerSample().add(new ProtocolHoverLine(playerName, RANDOM_UUID));
lines.add(playerName);
}
} else {
@@ -78,14 +79,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));
});
}
}
@@ -100,7 +106,9 @@ public class PaperServerListPing implements Listener {
.replace("%online%", String.valueOf(online))
.replace("%max%", String.valueOf(max));
return replaced.contains("%") ? PlaceholderReplacer.replace(null, replaced) : replaced;
return replaced.contains("%")
? PlaceholderReplacer.applyPlaceholders(CommandSender.from(Bukkit.getConsoleSender()), replaced)
: replaced;
}
private static class ProtocolHoverLine implements PlayerProfile {
@@ -213,7 +221,7 @@ public class PaperServerListPing implements Listener {
}
@Override
public org.bukkit.profile.@NotNull PlayerProfile clone() {
public PlayerProfile clone() {
return null;
}
@@ -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,149 +1,197 @@
package de.rayzs.pat.plugin.listeners.bungee;
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);
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)) {
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)) {
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;
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.MessageHelper;
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 String notificationMessage = StringUtils.replace(
Storage.ConfigSections.Messages.NOTIFICATION.ALERT.getLines(),
"%player%", player.getName(),
"%command%", displayCommand,
"%server%", serverName);
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isCommand(command)) {
Communicator.Proxy2Backend.sendNotification(player.getUniqueId(), serverName, displayCommand);
MessageHelper.sendMessage(
sender,
Storage.ConfigSections.Settings.CUSTOM_PLUGIN.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.stream().forEach(uuid -> {
final CommandSender otherSender = CommandSender.from(uuid);
if (otherSender != null) {
MessageHelper.sendMessage(otherSender, notificationMessage);
}
});
event.setCancelled(true);
return;
}
if (Storage.ConfigSections.Settings.CUSTOM_VERSION.isCommand(command)) {
Communicator.Proxy2Backend.sendNotification(player.getUniqueId(), serverName, displayCommand);
MessageHelper.sendMessage(
sender,
Storage.ConfigSections.Settings.CUSTOM_VERSION.MESSAGE,
"%command%", StringUtils.getFirstArg(displayCommand)
);
if (Storage.SEND_CONSOLE_NOTIFICATION)
Logger.info(notificationMessage);
Storage.NOTIFY_PLAYERS.forEach(uuid -> {
final CommandSender otherSender = CommandSender.from(uuid);
if (otherSender != null) {
MessageHelper.sendMessage(otherSender, 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);
MessageHelper.sendMessage(
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 -> {
final CommandSender otherSender = CommandSender.from(uuid);
if (otherSender != null) {
MessageHelper.sendMessage(otherSender, 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);
MessageHelper.sendMessage(
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.MessageHelper;
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()) {
MessageHelper.sendMessage(sender, 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));
}
}
}
Loaded 100 of 226 files, more files were not shown because too many files have changed in this diff. Show more