From 0b21ea4b39303342b3118eb2e1bd4ae38823692d Mon Sep 17 00:00:00 2001 From: trouper Date: Sun, 23 Feb 2025 20:57:55 -0600 Subject: [PATCH] More of the plugin's language can be edited now --- .gradle/8.5/checksums/checksums.lock | Bin 17 -> 17 bytes .gradle/8.5/checksums/md5-checksums.bin | Bin 37047 -> 37897 bytes .gradle/8.5/checksums/sha1-checksums.bin | Bin 156725 -> 159479 bytes .../8.5/executionHistory/executionHistory.bin | Bin 792428 -> 838368 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/8.5/fileHashes/fileHashes.bin | Bin 159333 -> 162133 bytes .gradle/8.5/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.5/fileHashes/resourceHashesCache.bin | Bin 103705 -> 107071 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .gradle/file-system.probe | Bin 8 -> 8 bytes build.gradle | 4 + .../lang/LanguageFile$AutomatedActions.class | Bin 851 -> 851 bytes .../config/lang/LanguageFile$Cooldown.class | Bin 724 -> 724 bytes .../lang/LanguageFile$Permissions.class | Bin 1347 -> 1347 bytes .../lang/LanguageFile$PlayerInteraction.class | Bin 1163 -> 1163 bytes .../config/lang/LanguageFile$Reports.class | Bin 939 -> 939 bytes .../config/lang/LanguageFile$SocialSpy.class | Bin 1042 -> 1042 bytes ...nguageFile$Violations$Chat$Profanity.class | Bin 2071 -> 1731 bytes .../LanguageFile$Violations$Chat$Spam.class | Bin 1979 -> 1707 bytes .../lang/LanguageFile$Violations$Chat.class | Bin 1702 -> 1932 bytes ...uageFile$Violations$CommandBlockEdit.class | Bin 1276 -> 0 bytes ...eFile$Violations$CommandBlockExecute.class | Bin 1558 -> 0 bytes ...Violations$CommandBlockMinecartPlace.class | Bin 1501 -> 0 bytes ...e$Violations$CommandBlockMinecartUse.class | Bin 1484 -> 0 bytes ...ageFile$Violations$CommandBlockPlace.class | Bin 1624 -> 0 bytes ...guageFile$Violations$CommandBlockUse.class | Bin 1591 -> 0 bytes ...nguageFile$Violations$CommandExecute.class | Bin 1650 -> 0 bytes ...nguageFile$Violations$CreativeHotbar.class | Bin 1391 -> 0 bytes ...ageFile$Violations$ViolationMessages.class | Bin 1153 -> 0 bytes .../config/lang/LanguageFile$Violations.class | Bin 3224 -> 1140 bytes .../data/config/lang/LanguageFile.class | Bin 5584 -> 5168 bytes .../server/commands/CallbackCommand.class | Bin 4505 -> 4493 bytes .../server/commands/MessageCommand.class | Bin 4604 -> 4612 bytes .../server/commands/ReplyCommand.class | Bin 4032 -> 4040 bytes .../server/commands/SentinelCommand.class | Bin 16187 -> 16141 bytes .../sentinel/server/events/CBEditEvent.class | Bin 5192 -> 0 bytes .../server/events/CBExecuteEvent.class | Bin 6774 -> 0 bytes .../server/events/CBMCPlaceEvent.class | Bin 5258 -> 0 bytes .../sentinel/server/events/CBMCUseEvent.class | Bin 4626 -> 0 bytes .../sentinel/server/events/CBPlaceEvent.class | Bin 5423 -> 0 bytes .../sentinel/server/events/CBUseEvent.class | Bin 5504 -> 0 bytes .../server/events/CommandExecuteEvent.class | Bin 6416 -> 0 bytes .../server/events/CreativeHotbarEvent.class | Bin 4861 -> 0 bytes .../functions/CBWhitelistManager$1.class | Bin 825 -> 0 bytes .../server/functions/CBWhitelistManager.class | Bin 8400 -> 0 bytes .../sentinel/server/functions/Message.class | Bin 4715 -> 0 bytes .../server/functions/Randomizer.class | Bin 2457 -> 0 bytes .../functions/ViolationController.class | Bin 4727 -> 0 bytes .../chatfilter/FalsePositiveReporting.class | Bin 5003 -> 0 bytes .../functions/chatfilter/FilterHelpers.class | Bin 5593 -> 0 bytes .../server/functions/chatfilter/Report.class | Bin 1591 -> 0 bytes .../profanity/ProfanityAction.class | Bin 9661 -> 10283 bytes .../profanity/ProfanityResponse.class | Bin 7386 -> 7362 bytes .../chatfilter/spam/SpamAction.class | Bin 9301 -> 9926 bytes .../chatfilter/spam/SpamResponse.class | Bin 6476 -> 6455 bytes .../me/trouper/sentinel/startup/Load.class | Bin 8721 -> 8753 bytes .../me/trouper/sentinel/utils/FileUtils.class | Bin 4437 -> 4426 bytes .../me/trouper/sentinel/utils/ItemUtils.class | Bin 8817 -> 9036 bytes .../main/me/trouper/sentinel/utils/Text.class | Bin 4806 -> 4849 bytes .../utils/trees/ConsoleFormatter.class | Bin 2652 -> 2868 bytes .../sentinel/utils/trees/EmbedFormatter.class | Bin 6330 -> 6593 bytes .../trouper/sentinel/utils/trees/Node.class | Bin 1527 -> 1527 bytes .../compileJava/previous-compilation-data.bin | Bin 83037 -> 83814 bytes .../data/config/lang/LanguageFile.java | 245 ++++++----------- .../server/commands/CallbackCommand.java | 4 +- .../server/commands/MessageCommand.java | 2 +- .../server/commands/ReplyCommand.java | 2 +- .../server/commands/SentinelCommand.java | 4 +- .../sentinel/server/events/CBEditEvent.java | 69 ----- .../server/events/CBExecuteEvent.java | 85 ------ .../server/events/CBMCPlaceEvent.java | 66 ----- .../sentinel/server/events/CBMCUseEvent.java | 59 ---- .../sentinel/server/events/CBPlaceEvent.java | 75 ------ .../sentinel/server/events/CBUseEvent.java | 80 ------ .../server/events/CommandBlockEdit.java | 56 ++++ .../server/events/CommandBlockExecute.java | 46 ++++ .../events/CommandBlockMinecartPlace.java | 55 ++++ .../events/CommandBlockMinecartUse.java | 46 ++++ .../server/events/CommandBlockPlace.java | 53 ++++ .../server/events/CommandBlockUse.java | 58 ++++ .../server/events/CommandExecute.java | 101 +++++++ .../server/events/CommandExecuteEvent.java | 115 -------- .../server/events/CreativeHotbar.java | 52 ++++ .../server/events/CreativeHotbarEvent.java | 65 ----- .../server/functions/ViolationController.java | 50 ---- .../chatfilter/AbstractActionHandler.java | 5 +- .../functions/chatfilter/FilterResponse.java | 1 + .../chatfilter/profanity/ProfanityAction.java | 12 +- .../profanity/ProfanityResponse.java | 7 +- .../functions/chatfilter/spam/SpamAction.java | 10 +- .../chatfilter/spam/SpamResponse.java | 5 +- .../chatfilter/unicode/UnicodeAction.java | 14 +- .../chatfilter/unicode/UnicodeResponse.java | 4 +- .../functions/chatfilter/url/UrlAction.java | 14 +- .../functions/chatfilter/url/UrlResponse.java | 5 +- .../functions/helpers/AbstractViolation.java | 133 +++++++++ .../helpers/ActionConfiguration.java | 255 ++++++++++++++++++ .../{ => helpers}/CBWhitelistManager.java | 2 +- .../FalsePositiveReporting.java | 4 +- .../FilterHelpers.java | 2 +- .../functions/{ => helpers}/Message.java | 4 +- .../{chatfilter => helpers}/Report.java | 2 +- .../me/trouper/sentinel/startup/Load.java | 16 +- .../me/trouper/sentinel/utils/FileUtils.java | 1 - .../me/trouper/sentinel/utils/ItemUtils.java | 106 +------- .../functions => utils}/Randomizer.java | 2 +- .../java/me/trouper/sentinel/utils/Text.java | 2 +- .../utils/trees/ConsoleFormatter.java | 8 + .../sentinel/utils/trees/EmbedFormatter.java | 15 +- .../me/trouper/sentinel/utils/trees/Node.java | 10 +- 110 files changed, 1037 insertions(+), 994 deletions(-) delete mode 100644 build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CommandBlockEdit.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CommandBlockExecute.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CommandBlockMinecartPlace.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CommandBlockMinecartUse.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CommandBlockPlace.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CommandBlockUse.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CommandExecute.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CreativeHotbar.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$ViolationMessages.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/events/CBEditEvent.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/events/CBExecuteEvent.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/events/CBMCPlaceEvent.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/events/CBMCUseEvent.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/events/CBPlaceEvent.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/events/CBUseEvent.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/events/CommandExecuteEvent.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/events/CreativeHotbarEvent.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/functions/CBWhitelistManager$1.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/functions/CBWhitelistManager.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/functions/Message.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/functions/Randomizer.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/functions/ViolationController.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/FalsePositiveReporting.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/FilterHelpers.class delete mode 100644 build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/Report.class delete mode 100644 src/main/java/me/trouper/sentinel/server/events/CBEditEvent.java delete mode 100644 src/main/java/me/trouper/sentinel/server/events/CBExecuteEvent.java delete mode 100644 src/main/java/me/trouper/sentinel/server/events/CBMCPlaceEvent.java delete mode 100644 src/main/java/me/trouper/sentinel/server/events/CBMCUseEvent.java delete mode 100644 src/main/java/me/trouper/sentinel/server/events/CBPlaceEvent.java delete mode 100644 src/main/java/me/trouper/sentinel/server/events/CBUseEvent.java create mode 100644 src/main/java/me/trouper/sentinel/server/events/CommandBlockEdit.java create mode 100644 src/main/java/me/trouper/sentinel/server/events/CommandBlockExecute.java create mode 100644 src/main/java/me/trouper/sentinel/server/events/CommandBlockMinecartPlace.java create mode 100644 src/main/java/me/trouper/sentinel/server/events/CommandBlockMinecartUse.java create mode 100644 src/main/java/me/trouper/sentinel/server/events/CommandBlockPlace.java create mode 100644 src/main/java/me/trouper/sentinel/server/events/CommandBlockUse.java create mode 100644 src/main/java/me/trouper/sentinel/server/events/CommandExecute.java delete mode 100644 src/main/java/me/trouper/sentinel/server/events/CommandExecuteEvent.java create mode 100644 src/main/java/me/trouper/sentinel/server/events/CreativeHotbar.java delete mode 100644 src/main/java/me/trouper/sentinel/server/events/CreativeHotbarEvent.java delete mode 100644 src/main/java/me/trouper/sentinel/server/functions/ViolationController.java create mode 100644 src/main/java/me/trouper/sentinel/server/functions/helpers/AbstractViolation.java create mode 100644 src/main/java/me/trouper/sentinel/server/functions/helpers/ActionConfiguration.java rename src/main/java/me/trouper/sentinel/server/functions/{ => helpers}/CBWhitelistManager.java (99%) rename src/main/java/me/trouper/sentinel/server/functions/{chatfilter => helpers}/FalsePositiveReporting.java (94%) rename src/main/java/me/trouper/sentinel/server/functions/{chatfilter => helpers}/FilterHelpers.java (98%) rename src/main/java/me/trouper/sentinel/server/functions/{ => helpers}/Message.java (94%) rename src/main/java/me/trouper/sentinel/server/functions/{chatfilter => helpers}/Report.java (93%) rename src/main/java/me/trouper/sentinel/{server/functions => utils}/Randomizer.java (97%) diff --git a/.gradle/8.5/checksums/checksums.lock b/.gradle/8.5/checksums/checksums.lock index 8701160ad6f56a1c66a8ceb0ef8e9f843889e075..d435398593c920b1deb203f7b9044e942032ef34 100644 GIT binary patch literal 17 VcmZSfyWC&;{v_{G1~A~-0RTES1yuk5 literal 17 VcmZSfyWC&;{v_{G1~A~t0024W1qA>A diff --git a/.gradle/8.5/checksums/md5-checksums.bin b/.gradle/8.5/checksums/md5-checksums.bin index e86381d9e394fb53e7ce1f975c97299a0ad00a89..1327cc1314a80b244d8345ec0dbb9f25275c9f0f 100644 GIT binary patch delta 1179 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 S+bhUuHR0FQrI_*<>iGwb?6w;K diff --git a/.gradle/8.5/executionHistory/executionHistory.bin b/.gradle/8.5/executionHistory/executionHistory.bin index 15eb1610f2ddecd406d8307d26a4c7f36f0592e7..c7e119f4ada1231a749ab889149e8f3bdb778a49 100644 GIT binary patch delta 8802 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

u%459-mAW7EBH#awoHX?_iQB z^G7m|e^X>pahj58J6VyS&*_Vmvhp~+pw@LR{)`6)e8%?fn zaby-h^*5`>WoN~#y+=nb+`I7k6h72V5x8;Au3}F6d>PqIfBe_C(%UxgS9Q}}{(i$> z4^uBQ1;RmXkpt%e9=2$UdU9Ukpby`_6@g-5cG@-|OIZ)0P&!ZP;X>BeLU{GDEj5Qy_nupesz#q2Faku{A6b0za>uzT2dF)nago)iQzAdLqZ6nu6{joTbJJtsfa9 zpEn_9cDO>l$~Cp!;~08=7`)XJ`SZ`RE?T>&K%t30`@c|E$f}+S9k4e<9m9_Vg4VcCmPJBvL+Ti%C8phr>EYs zEKiN;pSi*R;-(!(-4|&U(sP>1Fw|AEyDLBGi$){!(A>he2XglOdh4jn?rcr@)8-sz Ow?9bbFuHJg)c*mNbfYf- delta 1218 zcmYk5c~FyA6vch-g(ZFnFCm(^kzks-)P+dJ(l$tH71ye*br>xQ6#~*3!sY^^$eISV z1R`G4qDU!4WYoBQK#N8ci`IpT3`CSgB9*dJmx>GhP^aS`zrW6zch5a@Uvrjw=P@^f z2+@p@7g4RLZ<06@NsOZ}|uUBdf1A_PXVq^F{7l^OHqabuWiKDy{ z`7?7~$otzY-=;_^d3sn8i{#*a8;ijFl%b#sBwMJ+C-0)nMzBvB)VVf5w>1q~D$rc8 z4$Yx4dE@nHEKY@h>8cWx|JcL@6jsXprV zG8+&i6FKbgLlfZO0K*5b1{_a64!EZA4a#vG*c~fARhGRC5;k(3^fus=6r~Ra*3S*F zTKc1+>d%&4fsCujD$MHl2s*pDEtf2cEcT(pN1!?|Y0wr9Q^FnVE&Jm)>zN&dK z50auUZ7JDcEf=BMcN{yKF$0g9ahh3gPftf z74H&0?Cy)Zv7N%f@~rF0oKypH>WJUC3BX~yW##z^vqwc7&96@+1YKlZ48~ED63kqOJ8qLeY8${ zMiB}vS!6u8bt4znp$A>Iff1QxF6fkG1sGx+9NB6+a-UDft!VR)S|Ze)dTH5Pk;qfC z+!iNw%rVdU_Ig|TB#6q2tH%es)$Qb@Q- zRIGL)KEz|6-zF#cf}MHa{iv$4`%s{s|EgnFiK_|z`~bVLosDD>U#D*;96Syi4qFa8 Q4ttIvZ8)oMXIiKI2WQO@YXATM diff --git a/.gradle/8.5/executionHistory/executionHistory.lock b/.gradle/8.5/executionHistory/executionHistory.lock index 0043e314d1cdcc3e71f0432191df8f9c3b65b1f7..4d01cad40a01fae7c05468a44885d53446a74078 100644 GIT binary patch literal 17 VcmZSnD(U&&^z=?{1~A|}2>>+N1mFMw literal 17 VcmZSnD(U&&^z=?{1~B0C001;t1YZCE diff --git a/.gradle/8.5/fileHashes/fileHashes.bin b/.gradle/8.5/fileHashes/fileHashes.bin index 1d28b80b90c39f050d1a84b5b238057609c7bf3c..90adcf03c66a27024c74837280b6a70206d2aa2d 100644 GIT binary patch delta 7518 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 U>e4%l=CbqU%r^53wp%&<1+z*y`~Uy| diff --git a/.gradle/8.5/fileHashes/fileHashes.lock b/.gradle/8.5/fileHashes/fileHashes.lock index 119178d96f5d660e60d86668aca0dcc9d99fd1ef..37407a231e9a1ef2546b14298ad13fb49c407296 100644 GIT binary patch literal 17 VcmZR+zH2oTgY?$~1~9M?1OPCq1N#5~ literal 17 VcmZR+zH2oTgY?$~1~4!+0{}3|1RVeX diff --git a/.gradle/8.5/fileHashes/resourceHashesCache.bin b/.gradle/8.5/fileHashes/resourceHashesCache.bin index 7d61c65e31b0464ee305817d559dc9f906b06b69..5db5d1b1b2c40c51bb26be879567c536959aa3bf 100644 GIT binary patch delta 5369 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 literal 17 VcmZSnKTT<6%cI}H3}C>e3;;ky1w{Y= diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe index 3ff40ffba1c57da5adba6ef5ad314eb6f8d04d49..c39cd17dcff7d50bd22c463d183d2cbc50e11ba7 100644 GIT binary patch literal 8 PcmZQzV4P|a>dFlO1zQ1d literal 8 PcmZQzV4NyuX*&}D1q}hb diff --git a/build.gradle b/build.gradle index b928711..04dbda4 100644 --- a/build.gradle +++ b/build.gradle @@ -141,4 +141,8 @@ task copyLibs { println "All JAR files have been extracted to: ${targetDir}" } +} + +test { + useJUnitPlatform() } \ No newline at end of file diff --git a/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$AutomatedActions.class b/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$AutomatedActions.class index 24bfef74c29cf5b3436d8d75015181daec27ae64..d0fab20499f107436fae82fe3704ebe9d5e28da6 100644 GIT binary patch delta 17 Ycmcc2cA0GhD>JJt0}F%QWG-e;04mf2*Z=?k delta 17 Ycmcc2cA0GhD>JJd0}F%wWG-e;04m}G+5i9m diff --git a/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Cooldown.class b/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Cooldown.class index 157f9fa64e4502ba34cd64fa68e6fa3bf76431f7..4d4db706264a4881b73ff17b6ed94a9cd78a584e 100644 GIT binary patch delta 17 Ycmcb@dWCgE8xyMn0}F%V diff --git a/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Permissions.class b/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Permissions.class index e49806fb38e506ddf7bfe475fd700e96af18f6aa..fb2c4427ebe82757e040456748282686abecc7ef 100644 GIT binary patch delta 45 zcmX@ib(m|zO%_EF1{MZU1}+9M1_1_fASuBh!yw6^#303>!640`#~?HL7mFtVto8=O delta 45 ycmX@ib(m|zO%_E_1{MY}1}+A11_1^MAWM=#hCzx!i9wn{1IW^2ke&RC#S;Lnvj)rn diff --git a/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$PlayerInteraction.class b/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$PlayerInteraction.class index ce52caad02629e2e310e84c85c6ec95d6d17bc6d..40830f95cb7c441d69c68bc07f99ce21c0bcf15e 100644 GIT binary patch delta 33 ocmeC??B?8{%Oa}7z`~%*z{Q})Ai$u{AjV+8Aj4od*@?vy09UUBr~m)} delta 33 ocmeC??B?8{%Oa}Fz`~%%z{Q}?Ai!Y2AjV+GAj4oZ*@?vy09XkGt^fc4 diff --git a/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Reports.class b/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Reports.class index b63b6e19d45820cc9d51b952ef6971dc039bdc90..f14191ce47e2a2828a22e3e18e8b2090b2894471 100644 GIT binary patch delta 25 gcmZ3@zM6eQC^N4r0}F#10~dojg8+lZ delta 29 kcmbQlF^OZt4rW0!1{MZ$1}+8*1_1_31~CS!$tRgT0b3dcr2qf` diff --git a/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$Chat$Profanity.class b/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$Chat$Profanity.class index d8a2596cc1e0e6e3afeffb5014d321472bf27833..e6503fe35c7693bb594824d02eabba8defdbe2bb 100644 GIT binary patch delta 419 zcmZWlyG{a85IuK!Et^$Wh!jeJ#A#JLbNnNTn&i3(q&P|2fI6%=C3Xf04R~-4FD@{ION^rlKUxUl3K4R8ey1Rc7-cjMOIQX&oVbkv jEeRH^P{Pr%SKF9Gim;#bbtJJ#=AJas3=sioY=iv(XsTM0 delta 763 zcmYjO%Wl&^6g}hG!UQ)>jYK7sMT(#lgDNTtln|gvnm}nvL(}knIgXo{CU&u%ssYiG z4`2~_!Gd341IR2`u<4EsTlfUN0SR$EjYJnS=RVH4kD1-!cZt~dzhA!r$YQ-8n_=Vq z@&|T2h_jzUX(IT|KGkC7mfkhpbn1k65HUkJ37hHp7G-+Mv9&4_VG=dr=gC5FSfmSe0_AHQj)+W*J9rC^y0YEgc# zl8oC7$->sGX>@#&lsmTNHQT1`r}9p_t=o0ptD;~vk`5bt!96iUaWY7W`Oj~M#+X=R znC|zcgJ0sPXfkB_y-c75GH5*Wf0as)~}3|*w~td zSTq(AO)O^VPlzAjFNixNBJnNmIrn_`o|~MK`@T|o{d|4_kib$wig=@zxoVlY)^Lk% znOeXy`wAlu-sb=6$BiRpnf#dD)rl!3W0XTen~Wf;7{m<{%Fxa)gvQAy0=M2Hu~zNpFdgVfr-Sn_vMTWv zAMt_Lg-cg1G%k$kMiYO48`u68jq%(mAujIy&iT%FUiW_N{gzOF{QdeJKn|;$>ImDv zS^30to?vgKi9!B>yx0c;GJ7`*Q9Ac1bweq-7 z9oBF}sN^uT>v0T|HE9`v2p!dMEDAM3uY5jZ$(`miZ!R%+!Nw`dR9{qIRgN*yM`~&hH zVmBTkiO1N7Cm6z04C5I_@EjSupwD@U5?)~nuQ3abD|kZ(loR#FJg$;QgD>D3uG0!P l$Ws`w(T^Bzk|R-QF+u|-;U41aFtAMG6|!tXm8@G}{{V2QoUs4^ diff --git a/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$Chat.class b/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$Chat.class index d928b82038545161ccfe5d6968e7d9057c8af49f..bf2f1057ecca80b0b9af64ca9c028ba3258c7647 100644 GIT binary patch delta 708 zcmYjPOK%ck6g}SnG7K|?PAiJGiquCLwLpCrv;wx!mya|tsSA^dB?C%n1vGI53zu%p zXiVI=b8pO~i6;I4e~rJuc)np4F1|VE-gEAqd%u~l#=C^}`|pom04liuUd!iHr~*^f z&i=C(&E3qP)y(WQ`+eJK#-Je{g|5TEgh0i86simb;=9f6o2{`$z}$Rpzqa!oyX)k) z2fcRJDXB;bBp>wJPP=P&GJ#cgGj&YKR*C&U3^Wx-IYOiDv^qQkj`3g7F&)Qck=dd) z9T);ViW34G9IWb&L~KGs8Z$Z~m=#!^cOQnTMk)7LzWKC{49>U<;%Rt}nyi@JKCt&R zWHBQR=XG4byg<0mtU!aswYYSYqOb(kSW$CFifZJ>{>wTRkas^SPejrEqpTZ+asH}~ zYq9vW$kI@Q!VeIIkXK8_?E~bhe#~io*Z+VeeBl9ea-TX%C=(^SjXT_G xnLHwZQ4%5CWuWk{t5PJXVTFlB9KkAigKmv%jhH4|CuWHo#2j&xSRige`~#c!c`N_` delta 470 zcmXAkIZpyn6ot=a1_p*1SyT`O#T{?~#1+s)h{UBdG0~V9E4P@KSXto@uz~5Utn7^; zCYo4U_$&MucEsP zK|v$a)@$KP_8%BCnSZe>~^x8xern1E>#4#YyZ`l=WxAl5Z z87c+_1v?DXor31K6J2}C!Z1dhE$v7~ohNPAPIvng7A7(E`l~&Pz9=X%S9HF-5q(8a zWl?qFzH-xshab@)>RlvJyIti_S2@I0;g6>2&ak>;LgkinZ;;#vj6*`81B)D0+}A-r zIiYx{gCsevc&vl*7Y04Z@{FPBrJQlvIrm>6iA&DELe9N(H(&;{thftvnCJWQWUm1C pVQ46@@SunVS4%X3?87ojSf$w}tx*k9nHr^5s0nIS_0xoP$UlCyJl+5R diff --git a/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CommandBlockEdit.class b/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CommandBlockEdit.class deleted file mode 100644 index efd1053da75a8a1d53a25bfdccd35a1b35c695b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1276 zcmbtUTT|0O6#ljp8fu^=DtJK+ShPeX;vI@;MIAd+E;B&ix6M+5X~HC1W_;4WVY=PKW!B+4O?e z+o@sXaV7^{#|TClRy)F$VbI+dp&bcdy1wvihf8j^0)NMCr|s*+q08Iiwd;ve!wozx z-N27ZD=G8~h5U-TF^r{Tswt1uXVi}mvMEE?Z&x%F8S)zm@kMhcQmhOeXBDMF3Q_ZS zf-P5iLc@86?Dlr;rOKMnaY1EeyIt4OaEU>y2d#vU3Qy{|qQV+cN}L+5F--J`nh8@= z(J~djs+iI-ttyOzqjU9jE-{RzHT_L)=(wp$Mv^N%ifEXnnbrJAglYi2ma4@q9k*3} z!R-ZmF@|cnewqPPW*c-9D}f^jyiT)Q>vozV+~Q4-JceTCHF)T%eb1SdyKcm=eyYCz z4ZcFsRKTTqhUHU16H;+i$lbu%;34k_DMF%~-we88E72cmtY40EN?SDVH4(`-K_qin zWSBqkr84L>-xuME$D>F@IXq=pIx$M$+aS)z4~5S3?^D4P2_r-AJ_iyKMrp;A{u4_I zPb^6}u_VyMlIjvmYDz4lAH^L)nWNo%vI@_(K7m{dmT@u0Wy`o4 z!?cX+F=i~I9K-rZB^lWCorXr=LuB!VsC`8d-!P8vn8Xi?{X`kRaF;U1(>9pLJ=#%2 p+{XhV|B%*$4ERvQ03OjMgU5K1*acL`8su5R0+uN`PpfBOe*qLGO??0W diff --git a/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CommandBlockExecute.class b/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CommandBlockExecute.class deleted file mode 100644 index cb0f2ffb4e5e36e3c8bb3f30a2423fe9c78ee51a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1558 zcmbtUNmJBN5dI#E6Cl741UJ;6s1TJA#0?N-6?9mHDLiMA#}LfqQAq~%=D+dmA!U^Z z@8Z7v9?O0&K{$A!sHvLH>+Y|+U+4R>`{(@!0Fx*+qYm{sH0Wr=F^2q>y<-=AJE#Fi7H)MC!ipoEUSKbx z;XG|UyN+vS4P}0>jtersou_wovzUfHa?bFGHu;KYFF^t>>$oBTZSG!74WVIxp>rkV zJG61iPkYfuCFZJ*YZ8;+PUHWA8U|@gt5ivZTxQV6K?6a zt=eY^SxCcO%A2!2zm^sn)iHK3FAHh7&(Kj6l?u%m3vOlqHcUOT<@}Xss-X%QCJfC|JgDf)UHOli;3Zj3=0QOQq^CP5;Bt z>Hi}duuE6^ggic@8(+|auk;!ChJJjpbf5m=1M#f}*mESSD+bX9bH`rQ~LMS_AtFR>qdy diff --git a/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CommandBlockMinecartPlace.class b/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CommandBlockMinecartPlace.class deleted file mode 100644 index 8aa1df6f9b013204d337808dc948b48cf172f8d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1501 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 I{Ivo49}OF)TmS$7 diff --git a/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CreativeHotbar.class b/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$CreativeHotbar.class deleted file mode 100644 index b89fb561a608937a362d5b589fe4f64c1abb7da9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1391 zcmbtUT~pIQ6g>-th8my*#V?c;+ERj0Q52)h>{s4cJANm=R$NYrn9qu;r z?`y~6Kr-~N*sd*C8G3Uw`x-Qc*`nEU_^I&CBOaJsO3`ddQ8%S$Hhf+)xod8(RZW}X zsR1N#Ee>7BAch#;HAP~wDyTZxWx#al+&posoozxY|-{uXmVLKwdZ+i}x zw&w=vk}qg=A~ro)<37WvTa(33`gI|xT0$`xl|N1FO5b)H1r14t#73u>5P z82O-*m>;9>r}Km<9g_+>bdKHd{3e$g(nMc9Z3#t~)iE6rs_Chqh8Zed&2z8ic)YGa zvpOCq&;a${iE5Z9w@iCX)rbN;)UlvIgNmuEyT=T3*;>}k1XxwqLz_5BHVq!{e33=qzceu}+Bu$@+P3(GY{~!`INu*oj^GdKJqHPh#O)rpf ztTQZJdZY|`*>#0qa(EDkAdWW-E0<>Jx^PtU#VJz*Lx0~tq(~S&^o$IERE8m1kwDHY zU7E49ktO{`mLwWkQdeXdy+cdH`i#6UWEFqG`UYkh@el)+F&tvVGOmXh zvy9sz?pntE5T<2Jg~(V&E`((nb0PAU@hHUNSK8i#=k&FxSg;Ain27{S(StCFF*b#9 zmc}H@Ajh(Fho-T}a#$w(SSK|KSRs#!zzeKWgD+{_$AHgC^x_pcJ@kyOMYe?3WDSaJ NpoC2VCumg$`weo6TIK)% diff --git a/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$ViolationMessages.class b/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations$ViolationMessages.class deleted file mode 100644 index 46b1f5f24c5c83d90db58219c41d5f549e1b6633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1153 zcmbtTT~8B16g{^Ty3`fQs;G!s1O--Lsb4P;5>hdml+py!_hCDh#qCbBGfRB*FZs}z z_}~xlM;Y&IDK+tl@UnOA*STl!ocaCd=Pv;JcvnUN6D1T~Ok#>qITsfqh(*#3j!w^I zXb4lgQ4*Ow!o=Eo+krzU?T02(iJnFow@Pqb+{O%{*^_}uRo0hjpk-pBM8-i!7!iaj z`5bkJunoq}L|1-@V!6_eR4j6=@$pb<&3Vmp#BdJ5Ym9jvn>0$gI}R#@nYu_q8Ou)f z;DRSwLY|8|md%W`kzt+-9NZ%;9(C->QT$iUUcy|pKYT@{ZWyFr-ZqN>UO!osOtMjhbryZjwKh* zY{zVzXHV2+j(A}Eg!2a4Rbx&E&n60Eh`#=)0EnL zRN9oVO{iUas|5E`lE}0k3$3Lt;Wc6R+9>12Sk7bNGv_O3Bz-KgGz$DcCqedY@rkUe zbIStFEh{azte@NxS1)td3VUDJ+Wuw#2gvtI15Eqg>;QAVcXxn!-+MT~Bj0;6K=nJ9 z74V$D3z*_L8z|By%CyDrE5JN$W07ij!TI?iBv!G;9)n{YJ`;P%=Sc#-RWN}Kb_&?U VR&E2-*m@j!g#d53xXh=wpuekMGKc^G diff --git a/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations.class b/build/classes/java/main/me/trouper/sentinel/data/config/lang/LanguageFile$Violations.class index e42fbd6b82cc1eef53d1feb0e00dd66c429e82bf..bb9b16f065144bc3fb1a550101296ee7c110696c 100644 GIT binary patch delta 296 zcmYj~Jx&5~5XFD9Kwx*lEEFIJD#{{41tvB|6FWntrLD%oh9$@Wyn^{R-oc92f&-X% z8w+D$d@O}D^XAR_nAiGOA^7-xUjmm57Qvm_l`H4Z2iLP?{%}8kOeRkO6#}0U)gm>v zjd1!e8e@0kk6xz5Xd`lFoc44-ai4|nY}Xj7bm)Hk_#)h}(N?Rc-yTLpS(~k1q-f-* zOKFJRl1+UrHx8S#MVi>r+#;hnk(wy~MpLZ1cG6;34B;O8>TPS!89YY{9f)`w(n&Gq UNZ8Q5L`+ZSytZRuMcBvw04$X)WdHyG literal 3224 zcmb`J-*VeT7{$*fZrrMBoTSj!P)Z7h{3+NiCFM^{Xe(0E)OJFfnzT@0EpHN~vel8~ z3^$$OmAKF_14FMFUV!1A7vKdLj#hTY4!tSTjnCQD`rG|!wflX)|MT-R05|a1z!=8! z$eB2X34y77c_1sU?Cw@JTKmcl1tzLa*9lhy#^)EBc^ntG(NUGq_j*s1UkOw2yCQW`jLRdctv0{JB;s@-3yh0VnXtoi3@mL;PePdGDzTVhA>G?@>~>XX2w(J z_isx-+;pW)s@a69Wa2HnEl?b$8W}3EogLdqWD?E`Y-LV(KOo;+!gtBUJ9t;%?DP0I zkZ(A9I>seiMWB%xTYuNe3DtWhuHt=x>0v58geM?79vzV+*95W)s&{88;rPhJ$5<99 z40GsRX=FMf89ouXlf`bV4z7i2f^gkre!3|z*+=L<=Y^UHK|dS;K1&VYE9SNXwdRE_ z=^L;TfX_{=;dTr#@;p7jNH_xANqZg+vvXYq0aJEhU_D`InApH3&%?nWfe(hHJ`ewy zl%MOh|4|FD0ASL#yf&|#LXCHEqt|IEe@nJp_RQ2gTe?l@J8`?;nG5%vKwu@+hs5Ph z#BoZO1+Kn$B>sJ>uEIU9y(xX!QK9m=B;%gf^KD%-@ud%!Q02HX6FA;bLAd4xVIJQI zTzTPxCt%+0c9n0rG6+;WY?>Rj8lh(+G&-Zh<^ub4oi>!>sSlJpN1*Yk^5S-J>B10?FvR0-qt-SEH z^1{^0TSqGouT~xat%CLH7mR+Ftv`{|^E_Sr31aaVt5T)G~F4xm4i zu}FHv{Fy6!L0^^MtD*=FD^zUIuo0UCl=5goHpeZr#TI2N*esAEJCz)}ijru-Rt;X1 z%4VftahZm4Y!fiKUF%m0*w$2dYCRc#JtNm2@Ugf;KpQKm2%u6yP=k&g(rIy70;tkZ zjT*VlvLwD1yA|xwuoQb`$l|l^!+r$^G#r#ptIOP=;Sd^SnRU6vk0Tn!Qit{V6CxY>OU*;f@OL% z-}>Ktfv(r&dn#FfUBG43%OAG!;}qPGowik`PJz6bsAxgIH*(TVf!vsAmJN2Z>6XCi zKf+i0jA?gy4;cYZuslQ9&A6}P0Uj!NWH^5uHYXH|TqSlj0&1aO4|pOr1>(n;X6mm$ z0n4ZrhNE4}*^arU4+67ggJXttCn#+ElRV&9U_AyKl8jrGLk_P~7+1|#XdDEex0&M! z&VItg2xyfHCN|Zlji97BZ2(*P;R#WV!%2=yVCSfEReLW1KhZ+rn2L2YC zV#OA2JlcLHn=*dWM&K_V#P(k7?8B};)D5E^7{K8$e1;JbF%sR=O8e)i#i1GJBfJ1f z&PDwsdbo(oxXQlU(2fptp_^Zqo6eRYn_lN3h3*siL~gUh!j13oe+N%E8^#psDtf3S zk|EMb_L3=Nn4CxUk(p#anN2<=myrW?4DuKZl5TQ{EFy==5^{vx$H!|FT%_`hyv*o1 ld6j%YwvaE$Hs)WE?TlWN9poFbi+oFVlkdp)_=wL)`VD*m`I!I! delta 1391 zcmZvbYitx%6vzLUE}h+By1RYY2Q;N2X@eEmAT=Q%1WG8hrlcW4L&VB-cdXNHcXW3t zAdiKjfC4S`T6tL!5i9cQOTmH_#3v8MuY4o%D~X@@L z+!!|$d@3OCXU*d@w1Nq#CTs=U*TkrO_Ozx}=nxyjdXVxFf!EU|OC55988L!-G@jby zn84a}P}y^W?7co0XiSF{JHj%3ej(714tT*C5HjNmz7$w$tG+A+U&-E_de_$ib+*%= zvnFB&tq{BZMxfUA7P`KDIvKyb>MbihE1(3zdZaZVeAzg!;sP!z7)-vKp^=B)bt0i= zh948i%`DPyLcqK1neitb6aCs}5%AfL^rX3u(~}yBK#|jzndyp{AyD!>$xh36YMGM$ zXS|%5?DNlZ-4Upe|NG125}(4c{Uaav=XnyyK}qTgyqFs-%7Wmhn9b)d-k=9?(E@tp z+1&2L5Uok*;&TDKd`_X7$IDcJLX=|$DliALsJ(((EW&Ekpc(aORjOhRwhwY#Tvy@(?0*h}5QRe=_#bHwho%;}rMf09nnUG~pn6&C)EPX0#rlfRQE$Un%FwEiSdk$;h=$^4r%258(OZ{u&=MadHclulg$ diff --git a/build/classes/java/main/me/trouper/sentinel/server/commands/CallbackCommand.class b/build/classes/java/main/me/trouper/sentinel/server/commands/CallbackCommand.class index 93e6a59545e15ac50cede56c0b8dcff894d52dfb..f599c1cc6fd09e66bb1b0c6a9cc99e7d6d130280 100644 GIT binary patch delta 99 zcmbQK+^f9d9xJ2sgvPv&FW!)S~l`it#8bC8D5#J>`gzp$&r V6mM4LIKaqc>VvL)vlv%1I{+6iBennl delta 111 zcmeBGo~gXy9xJ2UPz|4neGgvRQ`X03(xy4;D?Exwx9y0rv_hZ2$lO diff --git a/build/classes/java/main/me/trouper/sentinel/server/commands/MessageCommand.class b/build/classes/java/main/me/trouper/sentinel/server/commands/MessageCommand.class index 56a91138f8d1a793c8351e53131cd6b872036397..e1bacc4bdaa1abd6192fdd8a6dd7c1e7a223c3ab 100644 GIT binary patch delta 25 hcmeyP+@i8!84IJy<{9 delta 27 icmZos`J=pH84IJ%WPJ{4j(bjCcWt%n51$ diff --git a/build/classes/java/main/me/trouper/sentinel/server/commands/ReplyCommand.class b/build/classes/java/main/me/trouper/sentinel/server/commands/ReplyCommand.class index 780f89d5d6c684d50b185d011eb477e4c03a0763..7e969b9acc716549b4be94487ad819a169cff495 100644 GIT binary patch delta 29 kcmX>ge?oqP2pglxhe?WeN2pgl$Q@OJfcEbT!{dx$9Jat-qg z^kI^zG#*8I>ILDR8S?FdX z*+$iXSBZR0D|gV(v6(aey_x6go6T7G&~|@B1Rv9x{Umb0n&uNyImiYMv6WBR%VAqR z!WVqTNj~Q^M>%U>=lPO0bNgRf6~@=<%yGr?t@-?&wZaJv7 z(p;l!wmg&WX1h7I>(Xqln};sXYTbMssj70m?eJWkC5#~^BDRgpF#M9N6n}G8Lilsm z*q8ik3LePvRX=sRrFm|ay=$!fFr5MZB9_02;~#VAf`MH$huX+6?PKk%Jjq(!FgJ z!USt{BX(6?(^Yj%?tgU^SJaWA5*K0A+8L!OZnaxOh>;rQr)IYf?qPoQB%nlM)Qiqa zqN{q7sB0N!j%KM36YXl;sbpp-g<1{pvvMvBOrwj^>2F2M)?jiplyMrytya)tWim@6 XsJ6n^Dcdeou76iv@w=b7SGtXv)mHgnzcvy;|OEC!AvmZV!CoW zX-uRKcaX!KN})tIahI~VTO*jFLZ+&SdsM6w1hECWDwoF6D;z z0F!ypZyvNEZ4Ti^DuTK8pNHwmJbE#ozC1!d78v=;;PjlxklIJB>@h1_Oe{-CrpiF8 zNoOfvP|FFH(az(>{s}Jdq#Vl?!wMx)r+%!|5T4R-o>nQVG?Ue;V2x(8R`YpI%c$40 ztW!O{HqoFU>(xf1+S%YjdBH`n$;H(2qKjp->&iQVUWKO9+rTn4r@Hm_F5IB9U4v`1I+MgLbc<})m29zFg05!OZYho|EqA`{@LY`*l#vjf zaM>>o3{;6fJuoV=*~a~fstv)-0bjM-t;TZ;>{(?q34a>?UnKB1iCi*?E*sLnh6y7i z#+n#K^2`Gv%u*=(70wY8r%jP`C`wMz3RNe?sn-wz_Gdx~ob( zv`k4_HA%_xm2y>r@izU&>-y0et{<(z{eQHIYezFOr7qg2g&3t0x4}J6sF5o0FOO~? zoN8kACPHa+Q6J)UBi+rysp`ux^GU$^R&0H{PZ`WpCe<3~N9X@DFo$j$Ooq8APeaK! iC*5X-pQc<&6<~qPq{^d41?IFue^|j>W%{oa%>55OU;=pn diff --git a/build/classes/java/main/me/trouper/sentinel/server/events/CBEditEvent.class b/build/classes/java/main/me/trouper/sentinel/server/events/CBEditEvent.class deleted file mode 100644 index 80b31eb2dcebc961221f734aff345e741c1f8b3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5192 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 diff --git a/build/classes/java/main/me/trouper/sentinel/server/events/CBExecuteEvent.class b/build/classes/java/main/me/trouper/sentinel/server/events/CBExecuteEvent.class deleted file mode 100644 index aff8a1c2a39b50cb9d36f9f2667ade6b89aabf4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6774 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 diff --git a/build/classes/java/main/me/trouper/sentinel/server/events/CBMCPlaceEvent.class b/build/classes/java/main/me/trouper/sentinel/server/events/CBMCPlaceEvent.class deleted file mode 100644 index b3a788fca2d96753a3e9b76ef08e4f57f284cb4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5258 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 cJN^UzujZpQUD2`b|a{j*Sm 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 XDQ6Mp$*DZ!8eA!-@pnJ2(er-;u^vM0 diff --git a/build/classes/java/main/me/trouper/sentinel/server/events/CommandExecuteEvent.class b/build/classes/java/main/me/trouper/sentinel/server/events/CommandExecuteEvent.class deleted file mode 100644 index ba4fe91297db3a85403a48f66ac56753babf8c7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6416 zcmbtY33yc175+~$$;)zC64oFHnh4oo6ht7w2qu99LZD0%ByN3~c}X5jX2QHTD7Ln? z+S=8wR)gBs+ScwBO+#?2U983KwX4%#s2rrl9^;urF_XZ@4j>IIrl98IrrT6 z_{sYp2C!M$N|1+q13rZU6bfeVGY^{nuo)Tf@9f)W1zkbmMmu7=O@jRDnw}CAq1Zr) zLMfEs{Ag^z-xuG%-*)}hK`Y|=hr{L}E9T$jJ({CKLuMqjD`pMHqCv}XTJ;)1@qpzf zRtOeX*K}k`iMY0VD9PVgf|;0QV75XT$_3{PS$;PbjSq7Nhm!1w752wnJM1JGy7idy zZKo?1cU&tZSW-Q`_?ljA&s>Fhm@g=yRy(MqIbaFqQmqMJ1l*V%8K61~QDI<_!Wmec z<*dX4?(D?-9B;8;UUhp88AUi#Aj`Cthsb5tprs#$G~!h z6{r@h&E*xxiXEhvyr4M#WFT6vwt{ijN=9Ke?M+SuT+@xyah16=NGPD)>;$+PYkG^Z8fy%kudo&u z5DmF(2_!=;n03&OhE3OwMw+9MetST0UPmsDkm;I!Zp|hBo@|!JVywpo0}Tp|*eLLy zBEMi}FahhNHwBwcRfnqVcu=J#Tx4LA!e(47XgWoeCW)ihonb3z_uD~1`)TS{6-bJr zk}YU8uti}j+5}rqPsy}gfni0=zOc?!@$zw-!gh2BltX-)k)Rd!CVkbtH9bYxtkJ(y zVHaM)+C&IZW6KE=>Ca0ScrNxa|mgDb?hAjGEH3AA<=oa{Nl@zSW$(ad2 zubOsnah#Q9iyhWt_TUl&dlh%BNza6oar0>{HmU zkBf!VomxaRVcBU8S-Qv%DMS$E$tm>&+ICV#zat9P*I^PP1;}P2# z)Ff9Su1P8!9q5X-*iJAS3+aig6t2c0DxX+8#JZWZj3Akvknh#z4%=~gn!OA!H*l@O zEAUFe`dqF}9wYtnNKjW@C##zBC}wKLSe6HQ%7?8C_YGzi`{e1_+uJ++Q9N0>oFJN# zkGdedioR{x+_|-N_s;HsuB6v1+<@1R8e+~_Y!_(!ww&@Zvox)I;$)eGm8zDMEF$to zT?bz$Xv^iX|3_vKZqPV?qr#gs$Scx{PsXL*`+)v=i^5wq1biVYI;;t<{<*3M?<7(> zc5dC;+M-?YE`?igD@jDkfUdAxPuCBuwiHAs9M(>_P0)IpPDltW!Y$eZ?^bw^_Q3pv zzEjOV4A;Q>1Z5L_Mw{sjvM(vYoyaf32Y8D3b>7{r@F9Gdh0<}&nCtAZ-N8vcND`Jc zy+!yaxf(Rr$8{g`3Behe_-!6EV*%?x+~QfpmPNNb_b43E{Z76aV&)yjeF~#G^Vsir zEw59GF&s58u5b+ZvuBvlSLYrV+O8Ed-6*qXeyY{OF0?J~oTM$df)9v4*Q zis$6SE5es)LaHw-!Et<5Um(6VjfZ=5Y`>xKO�GMYqLrdCy>R(PF-(@NF%olz#1^ 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 QUSg@?KFNH-o0MYqHym}t(f|Me diff --git a/build/classes/java/main/me/trouper/sentinel/server/functions/CBWhitelistManager.class b/build/classes/java/main/me/trouper/sentinel/server/functions/CBWhitelistManager.class deleted file mode 100644 index 720aadcdcc0b83c2a42926e463a4cc396ce0ab1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8400 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 diff --git a/build/classes/java/main/me/trouper/sentinel/server/functions/Randomizer.class b/build/classes/java/main/me/trouper/sentinel/server/functions/Randomizer.class deleted file mode 100644 index f971501545038dfa4635d4509df79ac0992c9208..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2457 zcmb7_T~iZR7{~vIfE(flBq%~q3D%bclvLYVD-=c05)5h$rKR?TC0WACW;bp&D*Xbz z^Bc4`y=`aOnYLh=Y47`?I{lxsn-?%%n3?44p65Bw?|D7>_rJgX1~7+b8oC7fo*2)J zY~8o)?1JH&F$i?)=)naWb>23da<<@mmQ$Y2tV)f39mg<0;-<1Ca4uAB z`Zb+-{cH?_IIiJ@jv<_EM52u6U8gM2TQ$6z89aAnFU2r|ZVgF+V=d1fY&b2C)^Ju}u$A^XsV5~djN_cl)p>!D_5{qkwoR9aV7`vxBGMW%IwmmLh`MQA zpv&D9IG=vpmaib9Mhcs{)6&#s9aG4%=ry{nN}Y=_^eZ~9;yrGA42erRm&r->4|H6^ zhtw;ZzN~1jy)Gd~!$$&VTM5n4`?6urdF6VAsk`%{XjWw~QB1R?D#nXc(Qq8sPi>ef z+pN`6{+8jSu8hZU9eND2xT)cm&W^p^2v-$(+3>g6GSWe}qC8)a$_qN~;4WP*nwBj+ zU&t&(u_!PuNv@ZwSk4=OQ7j3h-{cUFnosM7o$_62gYL~DuVY!ldNys>Wzl;JR@pK9 zy2n(WI8^wVm6hpPMjR`fj_Gl5atq39GP~#95>NE!*;e=Kl?~HdF*a=OB=T<2uvZPw zlJDVW#BrY=>?=8j(sHRejsm9we8*v>Zaf$@-z>?)lGG|#IGgMxi?tVYaIn1{RTpPg z>9)UR)da5O-*PyJA37M=PPGx-wYN3aNbB%n7XyLxGtn+8m_DaSCc8C)a!=s+!JUTT zlZQ^X><)FDGTI*OFnvtdV|IXmmX@n@AzHPH+w#sJJKbTB*jMR{Iul`2vJyGgt>7EQ z?Pa4HHbYN3$I)aXu_f8OGb=aR3KmV#UNisoHQ_E~@H=9-de;Z1akcO&?3 zkdPN3*ZX|y!UNvcy?BUEx$}rS&k^B;1&r-OtnDIlZy(xPqIVZZ^OF;QqHp=q9ul|5 ze^G}E{2fy2{fP3$PhbGU{5_51SfOkJ-P}Kk&#=n31mgG{Ul24*=o-Ex{xrXj@fD%W z4Zh}^bYg>R7uVRtE`}#2|G?;Pe2YNx`nZDUx^ae%k15Vjpp9?vEoD3xhPck>mdubM zC40~ee?xJLA=jc+$sJJKeT=V7?&6&e`14e}z<@8d;Rl-d0pd$EyiQXAUdjTzl$lNZ zroxv)yvbGK<3ZSaxX=N8ndm9#$hM*5O>~^*w+^7CEI><{)kHtx(>Cl7y`m}rX8U)H z%I_;&VuP3V@a`+T--Tc4R*?TAJO}<~$olH)c{rr6AJ~!1pv5Yz6aRatD{K3Z{!0rZ z$sZ8k$Mv{^idU2B?_I#!Z&|RvT^v4qWO~m7eHR)}Myfci2TT zg;z&^gw`Z{A_=3(pF&_xz9vZ=O_sXXCH3CR^%gehuqF2EJ&sMjEzeisDKzaXCxmjM T2a#xRAF)BWHTZO(3-$j2#ugSW diff --git a/build/classes/java/main/me/trouper/sentinel/server/functions/ViolationController.class b/build/classes/java/main/me/trouper/sentinel/server/functions/ViolationController.class deleted file mode 100644 index 2d7136502ea06246173c801b33c0b7fd0fce9ffc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4727 zcmbtY33n6M75<*LvE%`aYX|}ZCfLR@gn`l}wJ9xeOmHgAs!*m7de(do!{mV;Mv_KAw4V=iTMq``u-<{GV%2 z12~R<#L<984NW?l(IU`(-kdWH+jO$V>FM(_9SF1>wHzxrCeYZQoYc@N(36)&;JL+u z^bB7*f#pcsC9|IFhQhEn^0zk#?OK zD;t@X;^v~6l_xA)4#m)p%^Es%JO`Zuhi_SeKzz<}Z8NZ3#}_zu>o)XEmicMUR@|Xs zn~nsw3mm;=bE8tzo++bgi8f9?C^q%yBpN1w87qnsmVhD|3eZChp(bH9$HVs0}t znF)CzND+>0*pCAm?$U7(2Dw753ZX{I@`>qIE0CTUxSqh){$!*yd_7vC54GVio~z-A zj_2X|0v#0zD_eN3oav8IW0)FKisOYk?#7D~u*}H=n(QyLz z5#^qw__RE3+X8pjaCHsmuO-DXikE44xsH_bdT%YTM73aCdUMh{tLg%y!$Of6cJq1D z$*6#i={T(dy1h_zEI*f5QH|dEBNt@47|4ur!Yg#V65|5Rz6?$m=-B?L2oPs=Ooo6c z`qDdHP{%D4WGMPoIv!B3HrZ}AD>D=By_TPLy$~#~*6|?D(bELWaL%$b0?GcG`4pX@ zQqP8xlW{zR*J?0zOd~CDaQ&l4Y$N$;nK|Klc{3oaSV?EXwZOT0Ri-T0$XY?JIBi(L zMawVDXIOI!nb}gg%|s_NN+%2zGNT@X)G-4V)R=O6NDf2(|A)^uLYo+c|@U&Wsz!BY3lhx9E5)-gd*Ri+okex|ropctxMdB(SqTwO$z+ zN>0V`4!l#tyL7x8?-AIwzB5#fB@POnoU!P(z8W|vML4W_r9#w(_u>5-KA_`+_>jPz zjtq?1dDpWHGowm+(c?@($pk{a;5wx6#~N;%&2T<*Lf75*6|s9mgPF9>?w(1 zw$&|V+%0-(m1gU5RNSL#?B{iS0gshRbZICM*mnbs6@E1leu<@}7F<}Ec>rT2Pkp02 zB{7pYKeB)Ic#*)0`R|ge5KNcl4m@gzVq>Xs%Nk6?Q@aF~$Cr zk#6BE4@5w*Ae4I;{l%%9jd1(=#&O-tRRoU}R|^M#d=^js(V zX!Km2{Kx3^4da2Co;_t2N|B6>TUp0cc`xwrZTi2a%K8qLoMiE}&HQx6?70pXJ%h1Nvj8xv3x4KW2BoCXm zJpyi*kx?Gj4hY3<0|$HY6-21)N=*bBc1h7SNSwYFxsZ2CRBH!IwK1(7B3uKZ%K! zgmwi}eAkv}S;T7=kr_y|Ttg06gnbDGMGdZCUU{G?^uP&h=DHJG_}7O!Fo12GDHE8& zcAUcwj+VPPA@0USbaN=#i^tGI|McNo*oW_P_tQ9pXZSIvJoq5JHcENlQiLQ|^(K#`i1uD%0{c+&#*92i){+ZXZP{fqc8 zZ%g=?Am2g*FQ03mH3~oqAsa)k{nUQ|z5GB{=j@Iol~30PWvfuq@gwp!gq9J2z1*mN qI%>d=8TZKi-;nlG{2af+A4u8Gr>z9wAIaXu)t`9(GyaOdBk@0l44tX~ diff --git a/build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/FalsePositiveReporting.class b/build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/FalsePositiveReporting.class deleted file mode 100644 index 1e9701f15764aa8b4bc29268d802e25417307a2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5003 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 G)BgY?&djR- diff --git a/build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/Report.class b/build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/Report.class deleted file mode 100644 index 4b331e2166832be33eca7f464052d15804f5ae87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1591 zcmbW1YflqF6o%hvw_AGSQlQ91s;JN|!hSO*5Dc0aZK@cHd|%2^29|BJyCw0HzsN)r ziHRTl0sbiCJG)DZv`x@#vU6t6nfE+%=JMDz7~UE87IU9f-Lb(?`~ zyS~{xv4Ugi1RQ*CciJ9B6Y@wv)Rf$K9ut@p7;Ag7C0)xADAxNJjlh#`YfD8I^O(kr zK-LfJj=yi6*{;BR6x$7?W7eg6W*@z>{F66UXGQ?nYKzq?XV(JNU*>Ah&hqkwG9XcE-*4s_XIj}sb`thI^oJe2bY5o6-O2X3L zvL8EF(jWc>{gwq$3rw}_;5B!WN2A7`AN90KO*wOP?)CO`rcxcO9)mciA2eGTj8Rer zN;R%+`r?(?&~4ux?Y-sNn2}u9GcLtsLlP>$=Of*>%&0`Njds^-+ApO#BDv_QY^s}p z`#k*#Uf3l6ym+({>e7TQuLJ~UL%W1D?G)zdzr&GFoRMNXYkY?=%9ltR83@rtr;V$hf-!xUV7;BmF zW!&RmL79Y8^Hat*q(9S0gb;c-SPYX!BB?m3;QCkM$vaG_QtIJq)DoiE>K%&~G8Zb8 z!oJ?a)?;je2YA>6;TyzR3Z(F*Cl!G#31|SOx*-o83GdRc9kLq)?<-(Y*h_(1$1q5qspujXl(>gbb|Vur}LRDQ9H`=nAS#E GoXtONc}4*M diff --git a/build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/profanity/ProfanityAction.class b/build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/profanity/ProfanityAction.class index 3055277c9d7bbcd2774f33b809c6aa8ab0ed411e..591af605af5c8776af0ddd76470f7578b3c63d82 100644 GIT binary patch delta 2439 zcmb7FS#Xn86h2>;{%Lx<&?YURbb%(cOnx7I#laQo9K@6gR zf*bs9Ad0x*j6ML(gu#VJ7ku);XC0r^Cm%ZKI4GX`CvAdLnQ`Wy|DJo6@0@#gktJo%pVFyL94Z^HoF$K)X(hAu-kHBMvekSz=B-R%CnZG zjx0II;t%c$c|txF)Hi|P%F=MIO3N844?;n{Kmi>FZD6RSQz?S1;edBkjYvyrR3tD> zT9`&g{5~s6U{hchDAjIHo1HUVz=0WBW$}`lnF1A3&m0{LMN|u_m~=&(T~RBIW0t^d z)M!VF+u|;PIa04MqUTJy+2oG})Lhz!I)Qp!7K-?X{6TMEof?gLhg2(B&>+xAYeB_B zYHa<##p8HDpcykbBVM1c$FBx_xpV*z3e1yuMd3(jkfBuHy8aAetH47Nv4jyh6={W( zTv{&>SSYP6QFXr>@yAB3Q~;Z-Nt?hDEag;r_4=g>uz8{Ywb^;?oYdeFw4*~or@+G! zwvS5?pIVi(lR=)$&T@fnX_)6zgQMxpNX!)iD9Iu?|yG{z#ANDUcYk>k3d`fmcksoXyssD5;%sZi*QC;R$fz}S@8;9Rq&d? z>v&@aFq!I{QPGz{{{BQe@X#+5#Sx-XdV?~ zm=2SX0!#&Uis)F{Qc@v=*>)f6+sJf>suY_4C)M7eX(@tboM0XOWaSw~cT_dRC3-7| zOmuV->1YZ`=S2|ZqXpSxO!pY$xJQ^W>3$ZG;Vw0iQGrJxi$ddMQm9?Qe*SQm3bG~U zj6|UU4ueZiMtRmRt4?z?8>?#vGSM8GjOI`}nnv>AAbU2@d|Ix@U?dMUVstVZg$xdk zqn)w2$K*jd;}w+42`Bip@2l%9pae__ST*ykDtCHQ*pQ^I8+06$L~#;jP1neqAT>dI z6BJIMyabh+XI4wRtg$JH>d$C=>%9uj>-5KBlf#tZqP8IkcM?t6Oo=s@`7KlM=W_^3 z5{uY-qr-Hs7a8T^1eUc+H)e-9%S~63{$k7R=csIwpH}Z-QKQ4mP>ol(kVZ~$_w3sE z51gIfsRPCQ;!LM5%;i*eQa1*u2Rmt{-jd5w`I;yIeCYyMc_0tz?XUtBC}7IS57K!Y zX3E4!t$2bdv)&lxgu4vNuS~izxHtHV%N8Nl=6fMkAKJtNAZN#Zjmi>Kk)WCcR-Grs zbeT-XPg0@tKQ%M!^Z-j!1``32J*)H0WGLxC(Q@{1gvU)zVGFBE54r9J?V>Yhp#=S} zLCj5o;z`yq^OP1*Q71Q3TtaDQoF$9;WH$eo^;R66w0`7%m%x<1x8W(>y2EK(`q=%f ztyz)h@^OnePCa^W#{b$K_d}S%zg1qF=|Y9M+(rg~O%$@^=_AkDu5} QytecDF0b$516(G@KN4)}(*OVf delta 2075 zcmaJ>TX2(A5Z*7h|IgpkHj-XQOD{AHEomx+)*>ZB3#Fx2N>KzsZlU?1fslkGr540+ z5k&BY#~1a*7snZ8RBR^<-bNpM;oWCv&>4O44QCu@wC?$v77B%#fBv)Q?Cy8I-Lt!& z4SzRi-1_h9?}?}f?_D?giqR#v6*tS_iXwToxB{KB4Q-P@75`=L90vq!bP80Oibp2Q z^g!ZJa(gTrH{CQ2hk#S*9Ajg#r~wVS2DgAA4|p3~LZBEW@{%{~_Xs?u?3|gAWZKl> zWigOh5y%*H2jv14sFc5Z*M@xpRn}c;GnGtd=iRkLpvKZA)3L*`L?ph&%w!^mO@nmQ z3DnDdW!0Sx0)CW$^hh+?7c=8g#WEnUOnG`z>EsAInbCV(n+2B3FUpqWS_DGMO3#=l z%ycX}VNeNl<-bCpO=*fEBiUFoF&F(Rfp+WsU_3c;w8v5^`zHiC)p_wq^4PIRB08%H z;z@xu=mNPivACJYg0R~_7*Aj(4h6J`^Goz=*60yvvj&1Vv;^nUA1h(V($!m*qfGI;& z9md_4oZMUWrwym%U`_R+(~8O~0>_c|;0&mySzdQkd6(}fb>Wq5eecaCKmxac(;Og;MEztLAcI>4LkYIYW@qn zp#C!k*oED^gNj5s%b)8ccFI_N(@JF(BnPdcMR<`;k)7f!?Xe`Ha|KT&?ZrO!-7kNv zuhuv{7S6BrR~ct)X-iJwbTB!hGjl#?W_+x(1Bh@C3C2EXVP~1)2ulv^XZ;$oO;amz z^kI#3jqZ>`qxBl1{9&3(?$tQ&YBbuzH2C4juA*vaxWa5cZ)ngLNtU! ze6x)@sn_CQry&aA@EjYBY`!7Bg|WFpRG^$&Ke;)zgd=jLzgefFQ$0b%A=_DD~e2!IaN@Xda+1;>Tk~#g6k==cajP7M1C_beACTtw zgdFy3Ger46(-B)NIu%wcmCw?l^4Yp(J15z^-SG4>UYwgr^;kQbtKM@5TYextkF^T* zVSVOi)EqY&jwvwiLJxU*xP%f90qaq@d=%INSp7&o1Zz`a0OT0*!3m(4JpeX{Q~|7m zb8lxy!-_JL$H1e;iE$5@o0H>VPb<=`%OP5=k;5fE*+4qO*Wz^^q(N%LWnSZS2rXAwI8Jd(F;2(v2JgRR#hbj|ra$mj Mw-0aQDkS;-2PlzjF8}}l diff --git a/build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/profanity/ProfanityResponse.class b/build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/profanity/ProfanityResponse.class index a017ed361b3e12e97264b90d93a35d5271e5eac7..9c33274d7e115f50a383959eaccb2dd51b7be392 100644 GIT binary patch delta 649 zcmY+=Pe@cz6bA6`oO#cwupycmr!uo5w3=`iw6NN>$f8ZO?93x0xo|(ukHfw9+>a%1N``|(MQSzW zyBn>;5v%pMT~Cut8`X0?Z;I4;t$?p-QE~2Q(j*w8LGxtrWZiRN>v^Rs6n4eK{3Dj?lbhY;zf=Z z`b`Qs-tIT_Qt>j!lj0R=@69swO5sfoS7w>C*=g?*-zvV%@sxOt<8uRsUMIdoyoz=? zmJr(`wm02te+o=;bU)mvMNA|f5fq&g|94KcJs z;S_G+42IBwQJh5z=kP&t0#STHC%)n$ej`R1xI}YsnR3uY2Ch&Au2QvRExM^LiXPgH zUTTJ-)3{EZxIuB;qy+lNMn8>7zD0uGVSwJ_Hcj9TeZyV)h5PKn1NPt{=i?CvC5ti0 uVLagtc*?bS#``eLO?bg=u=xT;xF4f@PjUz^c?7RGi6pyTW6Vxv&!#`eajD|~ delta 615 zcmXZYOGwmF6vy%Jxz68F(;=7{2Q^Cr?cZ~pfy_smE)tRqCQ67XDN+-~7inn^E3@c9 zWVa|QAsc$&q9*=ML{?M;t*S+fz=hB%2^Y1As7;rDaTmYK=bUrlo;T$)<%trJG98iP z(ar@5xyl#uwJZR=ol5*5>Z6-UF5YW`p{B zM!GIY{iZ5x{UbdZ`d`hUnHDdtne3-cC^c`F=ppY%sWP`x=VY3lDwR5x5p`yKgPy`1 zJmiv29zGV~C!ZV^v&5Vt3Rp>@?(>gGk^bXfFU$4oKu|XXY-=?ZYjh$M(xZW}M2uHi zYmJqkSWs~bY*|ybSe2eQz<1yEN8{clc z(e>(3Sa!HR9I~xl#&Y+gZ diff --git a/build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/spam/SpamAction.class b/build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/spam/SpamAction.class index fd94a3159c6beb6446d4183c2a08fbb58c9431b3..2e08c6fbeba66071835f95058bc3f2d17f80fbcf 100644 GIT binary patch delta 2508 zcmb7GYfzMB6h6;h_~7Fe78Z~N5mHuBmMGaY#R$U-YJ!AXLRl;ODH{vB?!}_AHM?jR zZ@t~@ezzKbWbSNsZ)(OLHB-|}O+OlE{OgaVsYbh*blz{-U1+SS8D`(}p7)&R+|S21 zohR1lpPhgALn2y&*N^Je!n&Ygj{I@ztlB{%7&ao&=4*^_C=zSc>3#Y@qYnjrL?44% zB=X(bxXiKV#96D$M`s27Lcf9v!;w(T7>ETzBT>*Qd9b2f{$OvYsb8Dpw-(Uv^oK_0 z1pP_pL7fa(rlhJSN`dkNBU?gUA-@6Y%>d1sC{n+2T%ff81Zc1bSSbwZ$so2}P#mO( zgT7HCqV$!jT_8{C+2ZklUq?O)H0T0_@^iBd@PXLO6%t>6j(&NLB*Scp@E^^jNT|$ z3X27{Sv}1{es{}ffGrgITB>q8xjpq!k3&es(0d2uD zf#piQ&~J>4j%Pq2cM7aj{Hkz#BoG}O=KOSohKGG4{^+t>je&T~;2c(AwZPR_1ImjA zf-J(N?wg{c8*4T62wa0+d0tyAuXXzKyRlwi1Fn^yI`81iMu9%`%N1q)e7Qkj6K<4m zlgjs@)uGT(Jgnic{Gz(a*-aK6Ya&71p_Iq75s*dGDrVozJie(H42{1N*%8Dr-=G3B zWmiw@zD~)Ol8t{I9-_}$$0I| zc_s~8V~Sc*wD29e4U~eGf@pe+HYBMpNjD|QNW$TS)BXYVY_!VunhJTUw!$SmO(~SW zN2fPV7In$uy7I)d#uRE(nBlTbeswdy;R5`|tN|9d_&Db6IZk_eH?p>tq$x>qCULpq zq-Y;|=W*HoX8TMMtw~(@HhsUy?y|pCnDrh@<eOj+qm{ubTAl#MIt#SW(IW?NJf z#uzj&+ZNmz=|47XQ!}3~4y~gE%sDBa5bLTZNwXa$oApTAP5w;}OsDB!MOq=_Adf(< z-R)#?w!^WMP25QqRex$>aW#nra~nS0zCMM5eK^hj!=2+C+IhJrU?feI@ zbt;oNu>XM7hr1?Wv7wA-*B$-8V4JXO9L&qrP+LGZqx7V3{l9_fxhNA+D7j$7?FE1{k{YB!S>?7{u!`2Zf|lNT=}xA{ZZhl6;MIeoki z%cuxXF-#Se;b}g7)Q^s5nAk!-^C8Gzyl44-lpmhs^IJNJ=i6QU?~)HMFeLHk_(eY3 O`Fx4bm+>lIBiCQrE&p-= delta 2235 zcmaJ>OK?3hDi?0Vh2_H1D&1wl#wz?E68pX(31Fb=)w_MW`<_0xyKjH9 z=7(nU+xuVK0I-N3UNk2v=e()aR()Q+RW_lxa6`B!7EjJM@g=SsxS{YBZW6OCW=+3z zPTg_Nj^Yo6KhZ;s>xqUAh2tx_J7XIo$!ItmQT(lNSKC~@y^#(R_wcWQ`wD~BEN_K} ziVixh9o_{MZbgsnw>KP0W-*I!2NHFGgoy!~iesp(Yu@>(9K~^VsJKn*;ZPi}=*`fG zhYv<#y@@s9L?YA`HqpR5#e6I!yj|gB%j4z&7Aj7llgJ8nbS#U6qa8w>MT!$OUQT;& zJRa^&3Y;3kD^V=9`g}!AWs2q6$xK8JM53X1BzZ{3t5mFFfEX+BT8Ax!b87WclT$d= zV6|cmYptJrRjFx;&)~Qua8ESWzJJ7DvzV?}uLFz;wI?I7?xDnTrecGwx6drHjoN>< z;vB6X+a5b`Ak^J4WGUiY#d(}hcoLDQT!-LRlZ{+x7<^8#iHoeA`5$LBa*5(nK5uyn zUX{&q#b&OsP8MvF%__y!Tw~oXIGWeUb&4%qA#gpt-I2uJEN-y+3adOD6*qD7rB4g@ zlbu$fzrh^oic8J@UmP{B68TeC?+YCa)kQC{*ngx&R{h}`(ML$WxxUXY< zn^PPru5j{+D>%{GCa6X~#`eRP>Ss`^(l{j~gMQbjWa=~-x8MCJnHg#PE*EY62!)TE zW{D~2cMDkXGby>#?$E{3agfTIs7DEAVx=^RwWhLaR}4)&Df9Xame_5$Fq7P&YVquY zYMDI2h}}CYrO^9Ca^gFD&HW;|q}AszDw5moqKV+3fO@2htXq|NDVYeF;$fq7p?+8S z!%67pv*%#A&co%rFw8ddo|xuo}zxCGsRs;$gZiq ziH0;6TtMo{&ony&%WgU0mIsoH+(puBu_u5n)(L&mlOGkUnLSuHI%lG zm{lLhORap`Y4f3LWlJ`6?d_|z2%XW{tbH2Z|Jjt}ntHT8D65`WdS(TJKCZvYR_oV5 zWl9e_)2>Ass!%>W;{0g(urRsaA1 diff --git a/build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/spam/SpamResponse.class b/build/classes/java/main/me/trouper/sentinel/server/functions/chatfilter/spam/SpamResponse.class index 3b062c7dbb4ee3b88323b19042f5ef31cf8fd3ba..3dc6682e9890fb52f28c657ac36dc99155925780 100644 GIT binary patch delta 522 zcmYkzO-NK>7{&2(#(SG&LNVvV(bQD#%q4BEjSgCknweuN_)&`zKLT}7P%2VvF-a0F zDpZtLK~Xn~Z3|}6wpq22T)1qN&^Az7y71uzHJ;t?{GYw(x9HbCGNvM)kb68i`7-%x zD*cHm7h9C$vCc@vj4HOPIhR+>7#HDZqtL}gmARBU4-@Vk*8KmP4qm>R#X42xvCpFP zkZ0Iny~^Z<&*?ZfLaPu4ija+K$U!mkQGy^!<*vg*87fhZTc}94<_)^uhTujRS8zj; zN(pbG0ukInH9Ap)N2o;~Vwgr9-k~0=xQ!iIf8j0;5yu}i;4d0+f+iN>9?Q{83-=j8 z3*&geezbBJ2`16T=Xl5kv~vR;+(svN(Z%mM=;jaf@F#kCfXB-5Zt;ma^83`G*EaiM zVnCJo11jWm_)PnR&o)QIN40+uAJhI%d_sIuJi!;*X8pD~B{r?wjNjpF@dh&`_C{Mr wAj&y48;JA0{@4%L<_B3n>NUT>;k@>z1-7{)zN~#yd`0_j@ip;v?N%^+3TtzLS^xk5 delta 490 zcmXxcPiWF%9LMp`_t)>Y6^13LKb`%X&U|1^ouoMbRJP{+=%}PaBZU?T9-4DtFh(&7 z1{HX)2M-w)IJ$KRJOrJ(b#YyG3>pk#w_x`e`})u>4}4$m56{;~FY;x9C@yRIrDoOA zeMxH?W#x+Q=Szn5QOe7rp6I6!x?9tlLVmOc<=#NP-;;wKiv1sVEyr!gw1kk$dZ0g_ zw=C*fQXGB!`_vfuJs$!NJn4@>dQ3rYYgj@98ire%9cjzYyw2ixR$o`)0$&AAxx9q|w!azyZ zT&A=+LiB(=Z9HNtD{He=)ON=qjK}Ot%6-ld)s$D9!l<)9QT~~IRrx;qQ}$=dqh^Gj r%Zizz4OPFH!g$5?wW|09@%#`v3p{ delta 232 zcmdn!GSOv22M?p}WJNw@PAAut%o5kK)V#^Nc)S=5Kw`2^t`(`tr6s8#;Sw%}bqvfP zVhuaPW=0063SZ}doWx|9icKIDn?NeIGcxFb%#e2Sbq+0t$!`P6Zv)BihRY-C-vyH2 z1(M&-$e;sp7fko$AU-cfQ=pip463t^fixWhX*$iw08*eliJzAh?B>n9{3^l#kFh^s diff --git a/build/classes/java/main/me/trouper/sentinel/utils/FileUtils.class b/build/classes/java/main/me/trouper/sentinel/utils/FileUtils.class index 9598d1a70c30166ec290665a9fd7c17080156f6b..ca347fe544b07af2c7e2f9da62738f6b061f902c 100644 GIT binary patch delta 292 zcmWlU+bTqH6vltsG{o#Z2TIPdo9w2sO_5NB#(BylX+{Ylhmdh7rXg;W+)Szeg-fq6 zwJ$t@3+_FLH}JVxt-iIs-?!F}`|Z{wa_Hch~iMuIJnMG2TtDW~yILG*q>mn&p_qE4y%6D%)<}`_ZZel*fP5 z6Q+d-K{_z#BuSLC=qz38)!&T7Xr~vQe(?Y77zgnGcOMMQIEsJ+gTpf5LZY5XT8;~r2<~xEQA#u7xN;&qM&bf2v_x|^O^WHn}do}6RogDk_ zZrTQ*gKAXf=p5#=w(v_rCh`H3& z#G^t5;hAaKZMBA=g#{9xgZz$%Z^<1 zgUC5^W8_ddZ^pZuhd)g9l}mCNkUz{^w~Lt)_i$#;x|_GLGF})+hFAWSD^Q3*iqyzo z{@q`czwfVODiCrDSu8XJL;Z!iMUCVpJEPjB)NaxZA#zo&F&cr6{*nP)I7I%Tu{h^$ z*zUp^B-hR4hEe<@-5TEF9-Ta65^MJWF37)DQ6!>DZnCDJ1-8j;?xA=B=RI*;7aTp6 z>t;o#m6Xi1=Pbx=EB`(iJ-EtIH;A(2A;iX;I>?X}g zyYtWlsio>hQn?tK*=T2IcFml$gR~IM!f0D)u1ep7!r~^bAbPZ5ENvz&UbDuu@w7zE zl4u3AmYOBgo};B`_9QKx*1Fbw#TC+ym`r@S7HMg;Xj+D5U1-6y?wVz$mdaIHPtCGv zCuupF^`lkO259yY&9{L#P{Sd_WwdH2aR$&PP0?;ZMXzXvZ}B znbv@I%5M(qDUma&p6F!=3MfT@v5JqKVf8iXhrXPTMG(dz6h3$`9!)TTZSZxp#zb_) zBs_~Zkb^gohsk&uzPC_i;=){s!-vug^CSiHB^3*#Gd_}@SSbCmNCsoE495}~jioXX%VZjs%N%?x zi%}{oeOMvu@QG~4r?M9-<$JzBPT(^+ht*PpHEdg-t3Z^g5R|JZtW}Lrp;}^{dJ2`Q z1J6P zj=x9pwP|E28@nZYE4dX~+=fR?Nr*M;CpgTw1X~Xk!~;qND?7iN!loi1%HbcK{;{5a dtnVMg{9^+Z&1@JO<{_R#jLoiMl~*Mo>OUXnNi+Ze delta 1814 zcmYk-dr(w$6bJC{`R%d`E6QVFSp?J)Bo-N&n5nVc#7ElX=wPE!_8_w`CT5taoNTmK z)1nMYy{3_xkD$dsiHC1Ri!>p8Obwc;rD>TDObP=MLFiJ&KJH|)WwnS!&{85`0jib?nm2??h(QYNTjAUn$lH0~4r%S|` z=}Z)hQRE!hFUX;6%5GP|p-5LD#&+ikYhOWawZ?;QZ@)< zgdAfGHIIYjCppfu5aeJQL|P1wYo;7E%3P@_y;+aT&vF8glgtc;r3+b>OkvIQm|@mj zcNMTEFE;f7f6X9Rkd8reN`8St0y5-RIc=`?tepA3PY{HC*d!M-%_fIpUuTnX{U4lo zr^%xTli%blg5bm$a|>3s&y{nuz-C;qbtBX+zl+>NydA;)95)c%$%+s>*>gdM`ggH! zQ{0^7JAHwRa^AlYB%?w8lndP4P}Ivs_EmDy$d4b$8&MQr#JbpojOqTmhj{a{Fhnll zGP~y>MlPe0HWv3vt6YJV7y5KhuS86hzvL<}9+(qYN!obqqy+N+W_}>+A9KZx38~%| zz}mzN3t)+>!E1Hc;BnXB!WOiapsxv6JU-P)YtyWqc8=De*$vte+O1v_&~~|N#G;vv zR!$3{d3zR-P~tLTn3fnxn@5Y*%tgzm#c4Kx_5|%N%@S#2X~~+oY3a1IUh_&iF`k&w zi*g?=m^NIq5gwnk(?)7Gns%D@ux5|YnrRa>n?&12o2=OsTB+MxBiR~GBQ9p*Gnzd| zn@gLaSuX7*TApV4v?;U#&0e8p(q?Hkn>Lg-$8X-iGnTiAF5-MGaUso0E7WX}$A_!5 zV$BxQPSOm`meUTw0qn&UTM^@nHa^y!=^d>|9<(w6Bl0!yVVD)rIN3cML5%BG+#?#F6@|x z2+T(u-bNA@U>Fu+INre+yo-q_L^j^Tbi9w3u?Vy90lX;USuqTJh}HNAULO{t8cVPf zOR*Oh{mlyH5 z6rfbzK$$GS7g7wLtU$S}!v?9qm$DfZvImvYh>h|iHpwYedF4F5;+UxBSgcV&s8wO8 zQ?b~r24jm#!&Y@awy9Crt|nlInu?t&2fI`rcB@xWuinHSRfxT63BFb<@r^1&gQ~)} zYCHC+2JBY{@trz`1L_PK)g?5kYxrK>MzbXZ2QA?^!Y@Kn?=--(6Yw3fRM&=ly=Ivuw_p<%&6~2z4a}Cr0K*QnS@!DK%KER5Jk*qztyQ z&04E<1iIPorN>|gJFQ-=)7Q-|gESdyMvJ%Kr3gCVrIE?8RK8j+PLBDxo84aa81&Mo zh*>|mqv3<*iK@aVo5!c-%)Y78RJo$)u(E1%EaPK9;m(d%az6GdT=87oPnP=(?q{F% zjh63tz|l?757>G(?&BeaC;rR(AH-X@k-Wh{4p|x3O@Uz^_VS3qqdaCEb#040LCVXM zidBD~GH+JBJY{|2+Bj6;h`~`Z3VqD1?lVsYC}0{KvniiYhet}YrjK!jmUdE27(C4( zS%0i(mPRW+j*FwT-_fQFra#@_UZdq^q|CPREYC@lUskNKqrvqpZoHDP&H7$X z)V5rpy-t_nGuj*YcE$eN>fE7tmmvXnD!wM0c1PS_kh7;yf9Rfz-0Q%>(0&KDzDFn- zabF}HYLj93Bi1ED4+>hzT|FlmhUy$v)Op-VQ)}coyPT(B?^(|Uqmp4otCz# z(#p%kc$+xy(8dC{aEW$)U^AEL;AcAdRib|vaxu^-c)g0T^ zJU!|(J8J4JcB->dQ6I8Psy?m0lva|Lt1gpMzp-2WL9e!+J}pMSb~6J`O;1Y|=jH44 zJe$PyC0^tOK^`$u7Q9J%W`Q%*IE7o1HC0L3RK-M7)oSadjb4)0aNFhYw1!-TAiG_p z8wJhFnKfP!+HR%B#;?l8jZFmcnrH_IMprEn_R_sXpO@?+!9}zsRts~5c`pSa<^Lzq f6@2$Ug%$}|ltXB|Zd>6EPRr~UHwA_{qqqD8>{AyY delta 1281 zcmb`GNo*5m9L0a%cs%1}NK%sqY*H{GY^GoW6pV4qzBQ}~W-CifV@!yf2I8cJmKwwr zB*dHmi5o;5fe7RtP!C9m_S$15BqS~zkXQ~Vih%!&9f?#`xuCJWd4B(y_ukCBZ@A%~ z`oN#>et!V0=G^T-K(o`@j9{FFCM_0=SZo)x*}gd6SS)3keNBtDELYSW&kkneg=}v= z-cdZ+-JAEZLZPRQ^{0KbDm>A2G(dut7OPlow|hEft##))nXh-|si=>Q3UBo3^&3$? zQ`l_rEp7H+p09#i*=DlcVh20z*PfPe2QiafiV3dkK(V_J@5mKRcH6D`-JN8J{naZFaDLeeeRs^a7H$Ui>?eh?;azcHHEJJ;6Wk<}-MUvR*^ zr$KaJBE9_R&VuxDLhcI46}8UY;5mbi3F?)7(41Qurn$@<#kTon7AUUJCSZx;4-!c| ztcQ}J)IHKJToYR7!p5tFVqyIr4WTAk_6$)U3vCeeG57w?ykRz#*`g@Z{*nI0G5w4q zS}L=rV&)C&W%gIF5%!K5dj(dFyKu#I1s1DIEGem5EL9Ils7EB#Guf#xNU4{!x?SueC_$2(6hmDs`{)LR!+(;8(4E%0jg}`CRB~!AyGY>AoRaFF7T(zc z72#h*xFRA*#9%vhkqM*tP2!`ZOcEp1ji8NEBg{Kw=VyeJ-&-R8%R34qOqnKLXGB-y QH%f92NSX{=IcxYo08HKShX4Qo diff --git a/build/classes/java/main/me/trouper/sentinel/utils/trees/EmbedFormatter.class b/build/classes/java/main/me/trouper/sentinel/utils/trees/EmbedFormatter.class index 1f9067eceb6023fc677cc33d031bd3b3355e3d98..e81db2896efc73f7cff7e32680b1e4adc3f5e2d5 100644 GIT binary patch delta 2364 zcmbtVd013c6#t#a%)B>`3k(B-gDfM8>4*~bl?JBaQs$DMp^}y*#t35r=*);{*0iYY znZ7o)G?&!ORKP~TG_ifP#dgaqTWv2(jihtmkfNXe^?ftjmcE24lT8&=Dpm9*>TJxLM#9+-kIFh4y)vui`d_ zGA^?BaOk)LcdEEc;BMSQ$Xr;LY%C*N${25Lh#&&q%IX^LplW}0AV}zDX!e}sLJbQD zF$`?SJS-Gg1jCqP&xm~h52|=b;9)E_R@?j7m*No>j|wa^4%)kDOYxY%3am5|ba$uK z1WUh)V1Es37|Pw>Ewf!G@C4Qy!}Q`w8%(>G?Hi@NpIgIb0&&C|)C)AojO_tmc}1wW zIuMdPo)(B;E5TM%>Yw3dvI!%mme!Q!%?SDYc_T}w6~>|wO)9nvJcAv^KYD)nS;==7 zA@1bDVsA*rZbH&Y75jD_QWXl!ibXS?7kB|HIZC-VG~8>dUJ`g&sx(%Old(0t%A5<_ zlQg`}2QbOprZ)xlnDqE){bfN7Z&QERJe~sGJxM0@uE1XN0+>k^1p?JGWmfMCd;o*N zudVR;%L3ji9a;ED;A4DZ9E$BspBix@&9-0Qa~v>wiJa_x_)_2?M)Or-J|n%sU}?Em z$Jh8q#kT_Av0q5^upAQj!B`>I(}ac*al>NLlXav~2SKqU5^R*JQ%7>ClqRSXr8m?& zdJ|K(=h%Ue{_?5rx z$iQ!`kCx>z)5r5$bVwl`f95YeNlM2HUH3e24bD*Ic z9O%v-J&*~HiR@+%u>3b#c-D}Oe{h_=9gI8%t&FVW5)74ifTb&MipH4*JnOEVt}{GCt8gW0Nz~ZtrVhLd}CQ4~JVHYY3tS&1rmy>gq^YIAQn&Okrr%aKr*D8P~OrWA<;H zk^SaV*@yoh{WG%foNFFnG=;ZLPoY=)6y6yilat4N=GCnuIFa{GKlbz!Im|QiQaYG- zcq4l9{p`)RF^_Nh*<2&}I0xrqG|oo=efa(8i@CS}3s3+9g;glRXwSg&9l z?L`Ug#})KF#?xU;prg1_NyS8^2-hfsQL1<`S*gagN&sbMan0tw5ny0&v09nJ?L;iu zn8+MbSW=nV{S-qMSUK3DsFg#`k6M|;GPZ`<%+NY>Z;_R(1kD=d?O;jPE#tEktyY%E zMk->6>y#^BX$xWJ5K%ZO>1-PX$2plT&{ZsL!4MUd$B=dmN(&NLa~yM3G_#U_;UnnU z&Tz*G!x8i_^%CM3vK_i?z0pp=@26t+tSnE@2tHhkprLOO3(2CK7J?LN^H?Ql>W#hX1W%j|^g%WI!^2C1o**W;Bx9 MW~a{7g>vBf7dw3+bpQYW delta 2272 zcmb7EYgANK6#mY;A1}2iF3@D4r#{$D7Q7e@UgYvaNxxy$8Ix`|-Ic8?> z!fyGB9$Ja1X*?Q*(zLA1tfYs%Q+sFcv@$YjpL-E;<&Ro3_uTL9ea`;Av(MRk&&BQ8 z(*D!!y8w(}iA~Z*gP5(%on2GsscC69#F^ELM5jxUF%$6&lBZnp20Sx8icdl%JOXCP zn2jp6S{#?`l~Ijr8O#Asph~e~9()4)G6H;M%8Dk3dR(+yYGf=xtr}*{x79Hi+-?c^ zxIxB^SgcO9=31BFCIL$+l)BEEo-1M*gOMg#u>{Ly+=|;cfl?drGuXz?Dyu2Wnji2~ zWsUXt1G!q>SpOeu^tb|Scz5YA<31vhQTzf(w`^d zL85Twx%iGAlJPJeQKQ0&hOX263i%)7{$VZ=PcSf2G7pV1Hu7CreV&TSKvA_X!1ZmC zu^C&`hA?N?R%{dSw2US+t9!$;9j#o~GYsKp6&EQ10o&CGIX)Odn~Zj>Vz5*wfvc2- zVF=+l89TX2BvWx&)qF+7^CTq4RVrc+Wv*1q$%``fVhb&#GpQ=~i+Gu^+npo1O1aQ| zGG5gVP7^x9=c``8mA)q90MDd2qta7VUg%T25>oJnj5l$Rw(VEE-nuJ^HyXP z1$-WFMQ(brfVUW;wQYE+v#uyCsGXtA4S1@(R)}~<#=AJAo{-a0JMg}Y4={l)4Q*hY z;`f(TC=x!x#{xc)@hJ|fx#8)iBQlPvmEoJ@Vmeo4&UA%{2dN#FK`liQk}=6DA%RIU z<()-Zm@Khy79p@mnb}xW%fhIE%oN9vrZz>TSp?=_NG6!9p0FneKcfqs1zJdNvwJ&O z69EH0r_rJr!|?@SS)YI}@fCep;l$Tu;fpV&*?e)NyBR_&!dnr&1CEljVI-OW*bsrJ zUZEoK4ZZ~=Emks*rLK(5pTK$TFwq!;IP`%FvB;#6YjA7!Y<(epXX6;+X=NM|==qLl zTtx9bet?mp{)nHnsOd4eK^`?0W*Yla_R~mAKU&cr$w=2CyJ!WE|1*A}w}@2yisQ7} zMv*7t1VxrG8e@1oz<8K4BT|w^x$TqeQ&Gi8*XRFF*!_axR+rKiaENUVK*vs%nq}C zwS8>}4H|sZzFvbwYR`0-d6>s}m_{U@WogC+vgzKS?(W(^L{GNiDTX$*oWr)dhb_b@ z+OR`sws8Ecjs=J1j0y|EZWR`XaKFf=umbbk#5M?DZBspttB(_-^<)o_})JBvQV==SYLyXPVTb zdP$Di?J#FLO{F_f(Aaf^SBpt2x|MW2fdO>k22#ajA%m{@Xk0=)cM$v-jKvs&r5K78 z$iWs2!#3nmFBy)bxQs6T2%JPdGvaa0Gf~#z zcS05-_Tmph0!dj;68?mlIF{*N)(}Lk?k4hj-A$n-bW*udQ5r^Rl+C(4!GT7x@Zd%Sb#0NkIK6Vvt@uVNNnTs5K=Z8i`~{qOWB7rS!BnD{Ra_=f~Soiq_N!5YihR zN4&imwEYS&j1kabgOPDz24-d!dQ+!nVPq4SNROQ?si~wq1`#Zp#0^J37DF0B*vk4? MtSpwrvjjN)0ZYvbJ^%m! diff --git a/build/classes/java/main/me/trouper/sentinel/utils/trees/Node.class b/build/classes/java/main/me/trouper/sentinel/utils/trees/Node.class index 57dde7e5149ff48e114cc59d0941863b994e2674..3b2a13c4414e163ce71317943dc16f3da253541d 100644 GIT binary patch delta 70 zcmey){hfQmHfBpk25tr(1_lO31|bGvAgK#vGco7^S&|G=aK1i}C5y`6{GOSE2>>%x B2OR(a delta 70 zcmey){hfQmHfBo(25tr(1`rTp5N2Rx&;_!X81#UoB!d*3uMgzQqVhMtXXao605YBj A7ytkO diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index 035d474cdc957bf482de06248f054075569a43b5..a89e01c5e52b2db3e141643fb455bf03e136a6d7 100644 GIT binary patch literal 83814 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⪙mi=u!#a~-;PNcPH_ zEVZd0(FduQt?Q}UrLvPe$nvT~ebZXF$L0^UQ1x4> z%C$f{0@Z%$HYb-Nzn%AQ9&}NaBYEBUkkV|O2XTFq#0CO)-dTND%Um#~ zAlIhnj_RE9ds2|H=gh01dIFN!N_zN4enKzhFw=B%$FoD-RK;TaMdZ>R$y1`JQu=+P z22^c(19v~9Xe`$$d?~3ncF^w3SY8NGvxlnpld9EA)teFNgAo8ki-3tS>4&z!wwSrX zNQe_LE&prq>BH-E{80QPwiNgO2VdT(JaUz_&NUuGZkvl{&8c@ZPa+z+<1lksWo{Z9*G*eAxRdM(6W zVMMR~MnHQ-8pUOpH4?Yo#NUg6kWZo0OPMzqZ+Tu{3%j@{`8QR0g31BDFDkV7D6hx* zWyO0w-7-wPeICnZlBzsK1yB7S=;@2*kYW$q^*bL8_QV*Wg~4&&op&D+O8-&~r>Q^& z>?IC+RNTqODt7bjnpKYvb}#6>nVg|=W~uUXRPA{xko8~|bgb8(9(NPWZ`(gS%|%Xm zWOY?+0i=|w+J-Dadp*GN=D=u$AQ*p(GIVgr@AtvvlbIjZS?^w^YPIl!p~&~bq=c#X zks7{jf023X^+%u6w5(~Gy}fShr~ zhmP>KH9qcd>M>p;AY){ax$Ef*nu;Aw*`6lvEePop!IY!A_@i9qY~VogS$v%6ubw6c z8mC6!B@K8n{>tf-`-uFy?{+sTI z6HV_GO}?2|6jssAj~u^;>V8yg*w>(B@sM8ZOf!59>W;O|D$eoIr$6O-8sxVCzM;lr4S}XV&3xr2=Xkw8Z&~uD>4gdXBqN;{{9M%*q_$}Ov(f)R=A`&f zpnPGmct&%V<&NzpAHrW`F@0z{h2ju8?dGE(f9lJIE&lg{EBrERRD5Ylel+=baYz-9 zSgcCVZy7u5Y*^NGD00KPQ~orqF=^;zj{MG`{OlmVwxjzQk8+)p18D3(8t7atd@u)^ zb@}})y`Qao&x|8BK9&&FZMhS#0q4u9My&7Z6Vaq!n;>Tu_uPjXr(iK#l`Lu-f78d;(27k*4~Y23a1W zsA*K#_7|=GYP|IlJJWTHVzCb|%98{_PSZ`Hu~TVan)^b76mb7*ioGpbiNZ2dxavkn zsotLDs3Mt@jc?63?LtVQ@h34gRC4!&AFHRQdbb3p(Uj9^>KQcEOqx~}js2Cz&Za@G z+Z-5OK;{laUY6h%uO}%aa)To%p?&8;KWC$^yKzFIlgL@ET$)NAO)a0sE}%i~ib5LB z?h=4xM3bb7XkY?|UA_qx;b}B|v{&HBgMs?!fu6*$sGTux*gZ5*ntxU=~i76LantmqoK&amY*LxYklBO}mT+=8q}?XoYfu_ef&`xxl}&|K%Dz zmQ6WL)eeEp&*n&vjocbOO=FubF3Yh~7At7_-)ImZ_Zu@sEVp-=qXyv}M*EDiN-Jb_ zDrrWLHirglDrESOE{{3X`+*#N?8C0$laHl&s%c7|BA~3+B;1|#);OcAU7h7{X^Wln zq98JF(t9FBb+NdmF2INMlbKZma!g~_(I8pl08c%9{)1b$w!#-2`f^gU);PuWN`CwA ziOg@m8)$}ZWB@gB$&AnHtv9}Ug@64cwnl^Xcba-5jq`)1mPeZdvNf<~+j_hUF>T(P zdfHK;eba%vj3%0PG6DQm`c_VgyVV8P2`_dHojX$8-b@1vY7Y_7orph`YZUrWhF55e zD6YztC5db?(VUh%AjbZ#-L`9kdw66EGy_No4Gf$u1krZrSTL`c0f`+FELr-37@k}Z z`C>xm?mF-K4w_akZzssIIb_qdL`Ivx{CdEDZDaifkJ`WO1nw>xyBq7I9(ct)fJ^?% z`Xsl7$jW&cUAFrD;7z}8ThsITkTZN6&I$WX3cV>`k~mXxhbMp+sl8|Ltn=FOUuhC| zS~S)<{P{^!>ZNJ-(UfMX*eV3gZEn0+@$kA}MyPqhfb8Uc;eML-08MF-rZz;=59e!> z%9R?1n%xCXpgSN2k1s^CV%@;#7q!Kr?_21lfID z*Z05c?v1An^1IS6QHl%~X+TYzDU0~9->-@yKazAG*e5;r*p9hG)2*Pw>QHa?^8I&r zR{HZGd2tyQ>(Mfe{hSU8t2G^G4>?;`Lf+LjUn<#sMb9PtS9snb`I@tRd`Q`qjal26 zE?{^QpZ@gd&>9;$1e?Sn$OFE&>J5Rly*u9xawM?U(mr#F+zd*pWL&DF6M53 z&~^v+qg%Fd3wCrpd%Cg%o&A!|cEUT-u`L-!(Fe4eE98vE@@J=<9X<*xb~TL+QKc-L z=xVPeflY03)4GbfqJLf+pF8~|-tSLBHZQX4MmCPwDm$B`AWr|)9Bc53t~bKxOvm;{ zH&=Y|I=y=QhOX#J zSF8iDs~a8myqC>P!3jDhDB6BpV0SuK?mapW{?hKZbd67Z?sP0Q30P8+TECVGl=E9W z;og3^R^+M7Bp=ejRo1m*l}2(!y!DOGW3BJsVQ=;LpBI`S!80#iUJj`5|0k}`+KF5nV4NCv5K^=nCjCWD_ z2C6@K)751uv-eFuuW2yg}L7PL<%cmL@W zu=;~*|DsCtr?b6y1E7h3py>vH&Jo%UH^CqQf&Djrhtr~%k@F12(4R(RZdTV8cRo?eyZ?Ebocr?4cD2T2SOjr6uKN><; z45jOb(N!lQCg}f4imY_z2Yv%j;(&O(mDricG_G*Eegs|qlMDthnw*t-+$+I)7US3= zb*$X-M^OgzfFyFw`^rwEt?q@2xfc&1bte<;TW4LF5kVD}RcVoY{FP z=Cfb=*OVB#ZY-TsipIfn|0b9NX%A^uLd;672JJkxg*1bHu8F5BCdn2^AbK4sT~`b; znj{p@nlINGzDuCXN6G?}zWs?~X7j9hugOnmo-wP)*+e=_>mbQR8;&3`O^S9%)WPQU zgQgar>DnWBP#=u1gmOoI@0Yz^(=;jnNSK*K2QM6WwqI#-tGl@(%VVuQCit_CCbN79 zG2glQ*|pU9hmTa#hIIUQB-8a$=z!OIE09VDbg&8Xh}7kI@c9B>Cafz(GylnhFLd2B zI`}L7c+=@%BLMo6Sm)orudmrbDQ|A`o8#p?%b=@g(&eKiMTaPeok&dS#_$J+pS7p8 z22E}b&H`97HV{|h{Y@s-uhASI?u%*9nWpQ<39GWXgxr2_zYdw5NraH_XiQA#20_;Z(+*_F1|@_+?-E zj6a{wSt3VCBZZ$o&5H?zx)?}kE_+-3wJV_Oj0hHj)Lej!lco@$m9>5UfwS`)1x62@ z&VO{+yz99L60|COWbf^@``V9{ezDrP)})B8RZNE%Gj=H*(#n+4!A%DFD(_lCvOrN6 z{$?JeDlGn#N}Is9y?4&MUZh%7m(w{Fbj~+AyOIv1l-_)zRajG*-AR{0_$$V8wraXg4P9#lKgV4QgV+*V+>GwtBtA@uk(DaWQ~N#Zz^bDkuBR*6(}qME z;5C+z7BKuHt8Qp)i%APp^i|cK!&2X&YM4B5evGavp3Iqx<3`JhE)=FW(hYymwM&Tk zm{YJp>4|;!^8=?euNX5oY)u+zg1XURU0R9szhzQfvb<`%{@b0on^rY1x?1Q*KT=v@ zDg+45%KVG?yz;H;Np-m8`h%o8GhiQRjYqz!qShY$PQSU|?2Hs#N;hnyYq!&Nhh>9F z9Uwcvb0w|Pz%jLT*`n6JHQO|{cP1X#7r2v4)#y@DZBH++{)%T;chWgsbiHo+;Yre{ z?a3VMg=%ENS(Uohh6%5}tLo-!HC^p2D)d55HcwLg9kuQJ$6^Bl$M(eDI>}VBr{Fee@*Vs8nDIWC7!_+D^JWUi8NIYPPfob=70Sfj@Np zzjW<9!AUF#V5fl6u4>13hn{fJ&+Q*RVm(b)o1q)d(%Ex#@YRCO)h9TQO-w5}v5~ZM zkre@ZgqM7d@_tQfat>LbbDV{MQVyT2u&!~V(D#Zgw^QGg<24rP%1d;`S^i~cAV>#% z1<2f=GXMj1cO_z|darRd-%IAkpMN{GwRaTOSTi8YIHorE>=-wt1#sO7&&@A;q`_^& zP=+|!7Yu_s;^PKxXu7bENqR1^OL;fcE>Q)pD|p&5)a)4?2ZpKx1yI>8S5H z{PNxG{9d-fpRipXctmSpPml}MHJ#Q~My_u^RP>T@G@0PY0KLZY&J_fAO(QH}(*9)a z)%(9TJ=H07Vz57Bb)oo}nOU&Q`1_)gDGheJqh2x8of)dH8Cot3*kt^>sX%s|ktZo8 z#SG6|th!D6Zk*jCiww2KnrYp4TU>?Xyt;a?nfZpH>dF8b2sZ|V&#r`eV5__WV!^&B zA@XTt_<;Uf_v}jLoVN^JcLwJj15#pQMjPM=FxaKNBwcOZ{KsqYQ;G8$QxAsndxpLz zL&=MA)DgdeoJ6E9+;h>XkJ&U>@@AW<5~AzP(Dq^I`ZCyl3~-FQ^NJ>8PBO~1Ox2?c zgVeQ=Gxh}q`}g=WH~|cmSyG`umk^S=U$08%YT(uVi6lj%G5!OA4DAmL&PRrR6CsEJ zP?8&_!O&KBz{m}1;?Al2GkS*zo41!u0Mhz(NCK>NEV$gNvpsxpI-|IC_RU_e-0Tr{-VBzr;Pa^k&4qu615{pQ}5G!9vpvhE^s+DT{IVD?@Ju?F(iMC(U+SX1wTP zo|?#0XOp|Z*$kB&hDsbEm+@~#c`&M*nj{jCSj`)2+R`p^UY>dv;Vc=dnaAMdGxQ4> z@|_gmB?Nf8ibJT;ju*mhci94mgyu=F3mNKmBCxyT%D=ujYX6ZrXI=3g%lBqJMGV#N z5US2Tl1)3lMn!V-{jQ>$j#ZzF8EWx-p!@1X>(T9(4$pt2H-{h7xNyFNakP{H!0$3> zS{cB4JIsiR={n@+n`<@2MfK2#c2^4b_(CrY8jkGLLCFcW`P!sD3|zu+quE( zl%h`E-t0>|?CTj?e?(x%8gu;2Wf>KzXmiaLR|iLnyatBhcZRknZzDWuj^(+9=y@)^ z%F4b!^Ggci!bMtKB2poEBvs*bjiOYm|Ajh*j#JI`hmu4QU1cv5(yQ~Emrgy5s{1y! z=LZA)#ZAyx|50Uvwwlm&M>j_0b(P{f_uQ-R!(y5ldMymSR)(%4zEteB1egK$Tc_4P zi27aiPQqvRvcrztHim|iq?Zs9qn%0Q-1uUq+_~@9v--P*?F{7(hFTr569%-oIc9h* zaO>zJaQ63I-o)ZhbgfMdARz*A7q1|<4esSMoAGA|$7y~kI(%P$ zm~r$MLv4hiJWP5i=q0cqi+q*adAFV%Pf zdqx@TF$Qe%SFCe{&Sss*L3aE0o)3PyGu7e+U6|m;f3V_(i;C5*dAH_K#`#~i+&3JzCBI>+xiS@< z1l-`0{^ff!H36KfVgB_`xAEa;ESn$SPV4_+nuZOSXFd^3u21EVNJK*Q_!u=n{=lEmshuw@f z7`zW;Ld1!iEK)nMZPl^I(fu#BU6E-Sz7R1bhA6GsQ!iyC^y*}2Vx3;C+Vc-gy^l;o z2ax~~pvepR6>#IJc+S*9;@2|v=SQqkVDX(Qn5P?*4P?|eWgTy~V@>fOa!qd9)_g~g zPHa8+IP_@4`5>lYFjM{$6G;C;m>|98moYf5b_UD;Q(yT%SF8h^3@)8W4Q1+8h@}Z3 z2f14VJ{uVmy6W`T)z9Qd5p2lvmE;HA9t_hz zfj=hFrCix@Ozl@pP*U;At4XjM)!RWxxZa-^QoQLuRG(J zYA#3u2$Pw)@f}24^XJU^>_?7*4Hv$BJ4sDUWGa7VYFo=D!41ZjuUpO-F)ryErim|NbR&1bU1Fq$p)xZ*}rCCA%F=d6;Cee4S5-8%kk&c>^acA7b zY##A?Ks3mS_`AEjW*dFD1P6BYn<|tswaS_5Exd``0Mu_i;;onJX=!P@D0Gr`kTX!h zg#BwL4Y4^$dM2qewnu+r$H~bmvG3oQFtIxDBdnpRI|;g%H&Tn<=~q-FyS$Rx8u6jmc?es{fB7 zRdNLqVu@$Em<_BJ8Z;fW?qDi)GUd}(V8>C)U)7(Ick7RgHSI~+csaU@sZ}J{jR_hg z+{GZ0G0dMfBA5O-5i+`3{?3Ju6Fp3WpG;jRfnKQiU5Nd82sQn_X;f|dPH%T-Mq++s zj=p#wlhaSZHc?V~nT4?%Hqzn^5_c9oYUyXHMnUGii%H>6iyp=tO9+h=PYp7-Fu>#t zGUbPf7|z(bZkfEJe$myyMSX<-#`EWqkn-c3tWx8MOcqo3myaxw+hK^Q*DMaGN%4@0 zY#)u{ZYL3yJ@&kP8N+Y`6Cmy*Oo)0n9)X^-aH-$`ect z8~h}+&B_?OX!=4D;K2rJ7NxpHK5l&a`?E?*rkDof5@5;Uzw(E&%fy?$E&u)Kx!`Gy zKTP&tCZw#a#ITa1tc(EnvMtiz{Upbq&hv(~KucX#I%+L*tmE*rgd-c`j<1@uCyHA&YiBx5-qm%?ad-Q8e8rk|VI{d-;Jq&vd>hxRJ5LahGB)D($pOU%uAHHrI z#%pBeM`oBRvrIi7q*oYRXQ5jY2M7G6(d_!CCY6eYCUZR%P>}^=Owk+LG0#U>lER3}pY(}?{(OqTVs`Dm;Za2nr zXKvYh$&RIG&jKt%pcr`Kw{KtlDRC!{#{P~cJaqgmO$V0VOV(jWmaYROna7C*o3?ux z7maI;l~IeS(^Ju*RoxltROweNwlfPrBCp|ZE@4wBhE_XhT^T-UY%mymV%eCMF_G-T zVo&kH`GD3V49Q{{>s=dpq|)dfE^kN}+3cIn+v3KF-L4#EEQ2r{)M%Nc4 z@gnZjx&A%j9Ft2j8)Dn|b^32!+YCl>AnL(M2i z4m>Z{=|%eQ{+M`L+nWVuWgoZ<`JhaZyGPZmtmIFpANoMLEq_rm&zA+@RzDW(7;XWW z3VL2YID$+0rq;n$Z}-}>f!Fc=ELc{Zg^`JEMfB5KbJ8tt8Xu`X@g^&PrCq^*;H_Ri z!{pcE!X4k6qu0A=u3H<(Qu@GB`pDA!EAB&C$&6&M%kaqYHzoPmD$lGZeYY+EvmxNU zph7oIZ#+aqrq5;HEg=oAA`vY&B&UjhVyT9(fLJPl52&S{k5U^rB&~zzRJBEpO`ZP| z%2M)Rz+#e4P#8P=^W^?jJ$p301#R`hSQ-_KNhY$}Z{z`$>Lq8kHKB*OzcM+T1r(r_ zDAFDu>b$?j*g9!vm}%4Fk6{rk-CzMAXBd5|+w?1_^z(Y(o#T%;iR47G)LMDLZZGCz z$TfO$mX|j!D`>aB!-gmpXO`pyyRvMD(+|$O+})scRm}aKAzvdel6|sgW`KEC%wUgv zwEGZh!H}cK37mQ$qFuFLsdC zUwp6PNnvT1OM~jtqr1`hko^fIAof+?PRYNV%2LfHDIm$#M^BrVX~mV_dWbH{e9oQ0 zBmVDouD`+u@4IRyA%5$UPa)g{1ZypS>LY;NbCbJ9Dp@u<9(9Y7t%m zQFQD&f9&w=Ii>gNwpE&UyT7v3vsp?xEahAlJC6mB$2l%hItO<35lX5@A{sceufK-f zbj@oo%4g{ousEamI692KJ*&O$x&&|F>N#mE?S5JR%@-MDcLi+dyZJGuRvZs{r!O1BzwKzWlt|Jf*b(Jjp z=^2*~*Be+G-&sb!z}NtaVvo~n`?%3x+vbZt)-BV%`8Bc(f3Va_h#&dEf-aL1JpTL1 z(4;wEnf9JidQ}q(a2(CpR0rVQ6$L@&?rzb`AM8R&h{!u3^;^R&tfQ^0qdy?61Z;5~ z8-MqXhwrp`agX^e-?Le_jRpHf7!G@X3F*WRNv)gTCbHRr^Rum;r5`E-lU~G9K%?Q- z+NLumX0eKoEId0{>`oT!f4f*fY56}nhE|Z28*4IW(1gCg^VuGID+ITdbh9`;EbUg> zmUbFqDx*-4cs`DY-&F6si=U;EZyW0Ieduy1b<0t7zM&v19CFHcV(1GIXt$+HxKmB5< ze&AC;F8v|_pRwWh zH$R#2X^CsL6Gyx@HYJFDC{@>23|8HwbSq+#r8>pZ@{*dMgT+1ZDpkdIi;M4q=ecjw zflCMfupqP0U#JfNM^-xe6z{b>M#YccW-7L)Ps!@Fl^_WJw1@iVs<)qSUito*e{;6= zG`0}V{O>{t%(ExsR-0CzE<5A8`Sq&LWtlf;S&B8{5S@#@7g+KY!lHiSi!7Wya7Kfxiq)adC%@iYlJaZm+i)k}_9Yf)nWZ>M3g-p4iL#D| z%E{+zc1b?VT3^xX>C;0(Ms^ym>OEJZ{#4o3s!vSw=W{uAYdQJ1B#Z+}dSCM4b!_5~ zRVnh9=sUMn*~oEh<+UHss82RW6Oa{9@zc!S#2zRNa! zC~V_~jaTYJlB+lLy+M(b@cRZ!OdZ%PK%IP`DslAeuca~GK28@enir{NG z7+H6KWEwDj$oG4m)m?z=#UaVU>FdcZ|a&xRNH(AOIk#N3N|k|P=F)4cEfUDr2q zs^b#CUL*HUnTFE?O`iA>**5w5feu$W-AOD4EN0^4>LaUNHp%{Y&0;(#S#Xonek*s_ znb?ShUI*NN*s``}?WetsHg)EN`#J7%y8goN*Bi2e3qgq5War{uc>3{Z~y*Yvh)P_TjF8`kIP`PjV_Da^T`j2e%gzn5;y8thZz} zv#aBk<&|4ap>hyy5+(<+L*NrZa^1tPI@Uh0*ME-;O?X=W3YXK5kW-D6(~6Q~N6P`C zD~${DxWH$Q=xN6GP6^JiC$H{F^rlh0MUcD)BA#iw@)-orQ-UW?R5jZYqX}F%u57R~ z^Ksz_J$MJXB+&w1Cq5fKFHu|)c5Ofcmjxxy8*xv9KNXjQ9ao9xF@F+p1=#gUUR(3!% zJjjvK`E)yK9j~`wBkx;kD{r~o!f#SIAr--uV*j^9 z!PP=Z=%q}v-m)^7>BKfdHv!j(T}#5_+MpyaP?jm}GE4j(NT*DLY#}lr)lCRNQ&1bJ zNvSvVcl0_|FXi87lcie76~s334NqN@3uFu%nf?g=0tQ z#CCC96dVy|#Ac+^i7%yV2^IXE{J0o6$7PMjC1Pa~KQ05i+mn#RkITc(%n@-FPzp~< zb;^YE4^aQ-S*$Z6$esKZL}=0`?3o!th6Jt?yVpmmRmPec&i{Yzt>Et_R1l-E=I_Sd znk0%F#Gb*#2sZ&oJV8>?lrkyYU+n4(KW+(164o_u=*yIMbgUDxe{3U1kyB9Ia{+iZ zfij23y}*v98Fhj<2khtz`b!+=0!Lh~0=Rcr8HM6}urf&;=LexIy(k?0gR_OtV|HVWnpEu0Imp19(!_$@Gt{ci5++2|L{O}SHm$r zU1*f5mfcWfGA&p+u1>$suYFsR@~*&G7qD=a@G1pY&+S1(J=Jr+5|X z1!<8UB$O=s107&kOX7aPd&SCSCK>*W5uzh0iqs;JCE$b3;5)_38Gb}(TB@+0T%uH! zByJR|3Dk80O2IxtDLD$wMxCT8nLW%v5qIe*nItjXU%18{BpuDdEx-|PA?p)=9d8aF z&X)K;-{%BJTrXsBu2>0e_7*E`DL4j`BJKxv*T3@zR+o45I3jje1=IxYYR2wr zq~lt#as-e2iIte(LkWYWi61wNoq-k{fs)ThVnjAZVvM*XiTi`yv4mt1a5LB)P}8OV zN^3#5QqS;!1bT49DL%vii5x)(d=~#4;=vds zhcV{xo`goy3o%ccFAW!qz1^9aPK{zEN#oMt7gwerE(a@9@wi+ldF*78M4yv!1=u+l z)>T+pEr_dzlD8ILCAf0+6AW^YiEex#3ZtL~y9avQ70-ne`Npi|jhFaNN}v^s#PelH z1j^>{1xaCRjkh$s&x;oq_y0FE|BX1jZ+d}keEY`#GbS71?a|y>gchDsLL*_0;K(1y zpU6MK?$6!OxK5C6XjEB(Mdw zSE5hC3p(CLz)3PivP!Z=GE;a^G7rBXxg?b5a~_A+3ptIPPOc?)kq5~m5Pw|8?Bbjl`7Lq60#q49c!L;bl z3Sfn@!dT&~C{`nHG|NsVo|VA*i%(${vU+(N#79^qh=ZKFoUfd>2(AMY-Uu;V7nD4| zrCsHI^Wu82bD*jWL&^J^`j(I-*(!jW!p{B`#LZ$Q4E}j2`MO0gwI~liPRBhb!TIkb zoDEjObvr0|qQyIqMIf!j&cX10jg_Fxz5VZ=cTf@%nT>)oNCRa~I$riUOa<7rW*W{H zD?wKX#maCJE($ASNw@?kxl^TJz$L*EkE4VG3~^ivb`{QLK*`&U&%@X8!qCjZ?(L#R z^5XKaqXC(0Fu~vv6j$7$Cbe^u5uEt0y{f`|0)wMmqx>V$L?OyK^ozR$4@F0 z#uKgyj`2ZKEu?OI1#KA*!?_F2aP^RIz5icjZvqx&cIOM9+F6R)i&`j(THcpT?vs@H zGSgY_our#q+oU_`v`upFtm(;g=Vp@W&X?rgWWFSKkVOz>wb=v;*-;Te5fwy)21P(X z5D^hnHgRJU5ownD`&Siqx+n8|k3Nsj@4RPwPo4Li|M_p{50xCTj!7?BPwG5xo}v=W z!hN7@w|UHXFrZyg6jm98BlIEiBvHx@#Z}2b@ZlgfLv_JV%>%t}efm7LN@eJ0gRn)) zVuDa-R+WVS{zwT{!&nL-=069hIIBnxtadyx9<-;cM;(JE+RJUW`@ywp%v?bbYx;A< z$M?sx-=k>Szs0>hmoLLbe`n`Y#Hfhgh0)Z4)CtR_of1~&%Q;NAsAiSGfG+I;bG@$H zJgX{H=jvxH4;&cpNt6h)6`dfwzBUb%6QxIgO_Y;nWtV*=R|vtdUdFE$oipyWRXEuQ z@s@Acm)TT(oRtVAODq&3kTca9o*+vkHQg};Zfqu7C zph;lc`@x$Ii!igx#KEE641@*2jF|04E$`adL+!A(k_eAkSTazQ=Z`-Kiwj_xj+tYF7gfcU3yMS9e#NuETe@iZ z9bKIKkuKGE)-tQ!r%Y6y(q2$MaSVh0_WIxRU$aih$JO!HSnG^GD69NJ$iXliS_kO8 ziF#HDl%)DsOER$Hll@sS<(DYfVW6~IdP#jrnQA^S0Z(3y98sdZAp}SHDWt`V>hpnv zvT{4yB^I!+^lK`tPlMJ%TBN(QtIO-SANe9JrE>!DA!j`1f>J4dwE=qPKa4zgtV3I6Py=>0LUAei?W|bQ!L!G`e zWLVD{@P6T0MROo)K}zr;SWFt-u;q*rU!a}xz%q3a9Tx>J?h8$k(NFPsMIg&qZId4=wpD|;;XKJ0TCAkHyW1%uwSn$SoNRV0sr>Szy8AY z>-XRJ`MZ?*)RMnR9TiB~C?Pr?BU}$)Q-t>vY$%YO`g2|W%e%k9wauTs|7+JL0@klT z)$w^XMA-UJg8tzRQIU`->8{VbB4hX_7PIj4~^$# z9eSS#e-SyL=d}>Lm*wmdoBajS+&XP6A;f?-ZYx zwbwrLlZd22wD49h$LH4UA%E?bIr!S7aR zw|JkmQI;xA2qjTGE##)S#sNVY(ovt5R$RV(0H1@TB22(Ov=y8-uneH2-?3^LFqM*2 zkVX0Nc2)os4miM_7g7#*{4&B~3#%jqnLI`a>Et*e7E3KqOcFwh0W!i#%7w0^fzTbu zZsHf{i2%ncTBX^FW)l&jh%2`cwl}%+*yq2@Ar`LK#5i81FD) zr;-(8MkFM8MLSkyeKvNBYPLvo0@)bVm{75Mz7~%NXH{&TYSgO7{MZ6gqDd@VEc`{J z#S@mEkTYP;*kvjKNhS7ViRxENzlm_R^r!-Uc?qD1_$~4E6r3?iAupvw3)p}i3 zZAjZf+Z~S#vyM2e8;tc)StlK5-R4iV#*pWvzNv0Ss%^#DpeG<6 z(W%ao^=WVVPx=qZyKGD9QU7>NjekK{mbEt|&%i3FFRbesB63ho9mBII&M~GK31i2p z3=IIvez7}nMb;$7 zckiTku7aE#pvs7PjM4& zOnOaz!RD65Ii3W!>T?WiiQcqeW~+oza<&c>W{5|`ELwvc{DKOMA*fOtC+`6&cKs(1%6TI-;V z?5t1NDMMQ@iq(=9X@!hc;7PhqJSlxF`53EjL(C4*JB~})QJ|jqAFG-6p(eW)oC0r6IwLG-*UL*gYyM3}%lBq4QY= z23Gi8lppa3V&wA*%hjTdD!sbE-jwHb;SV16V`&TmC!gXD}_yfc1Hqog@tCk zV=vV^W@jmsgELOX(kN%x#HvyEi^HN7S%IlgOIrWOk~LGmnA8sqx-({?nI!b5`VZ@G zglt+0GK1^v#g-;08-}H1At-@RU2E911PnP+Lfo=NP(qwbAJQA$vSOT+^hS(5hY;%7 ze4yyGA

7!Q519(gGpqJjN5asP;0^M;rszN>#048KNc5g$;--dfLs)0hQ|YfHg&- zYR=jt84TO2kFhL;x@Bjlf&y!l#gujVcOt!U*r#=MvT?t(#XcfVH?b>J3OdvWgm$b? zm1g#y#dwy{X+5C5s9H1E1aw%~Al2QR=V4kKLx6QGX~l?jR+q^(zQF?#IR`Jtob!<10*1jV#%umQ5oim=v@7 zK(SX(3?1+%9}v}_NaFsi*e_6TPX z*Duacka(GIk5$|bYYbgbO^Um8yJfem*L6do9riB!FsoWd3 z-#M+V(zl0{OUpDz!AG!UdfRa=OQZfhtFRO2A6VZHjU!^PzFAZbLH7U4}uMdR|I$%Yb=YJreG`K2|lmXy<+Nc&*>jgq6ulk4=a?4m3p0Tb-EycQ# z7U$UFjM-|O1btMqQp@&ZWSDIdd(O+)HOgJoui@L+lxdRk;+sc9_NNS$+ye@^04SS&Xz_3G0z-HFSWBu=1>*STHYw8+nqNP-_N710WWW5sj(6CFK5pc+IDwuSf zleRcrrG+#D7wnT}HcS13;aLJIpIDw*b{Vb)COdNdjyhH~iMB*Tr)4s@E%+n5+sd9% z-8+FSN)N<1=4pYZI?ovH1g^sI6}jGzcK~A&7E5l6STqSWu(l5dL6p)wb)mlk`O2WYt2UNP*llKRDqGZgmPjem!UZ!lPZd-O zy-+0~#x+WU12MagtvCHKmsOO%pkg(IctaiGQYbr3xZlF+3Bj_o0znQ-)U-@+?6*-q zu$>TFuLCIEB&I}4S&jE_1*z|%I(T;v;T1jWBZOY_I^m+4m5@#V^E`}akz00L3)yxA zX|PBWux(PRTa3JMs*iroqQ01P1n{MX48VQP2<*~(j%n60ug5YirgALDQYt68 zg&jdkbi$G?9k;RLNK2Zn*Q`yp7AZLOlXzBs+LB0~4CJZM72vZcov{;iLW&+E@*?P!C!Ou2@(v&?{FBAf;GFY`I0z zBsjfn=|hmWs}h)lpl4VP#h3=E4P>n$!n;;BN^KWJ(867z8L2(7zOLK?pWppyI_Mm-)7#FY2RHd%7=f50&Jq0V?p{ z#xqt@Oyq!-u7DFwy{S?=XT51^3Lv3r&2$0^iDL78Sh9B6qHVVV_d*r1Xzqg5@uICn z->j++snFM|M{RBT%kq(+d3};1DmWYV$D-il!N)8EijLrwfF}x%OO9n!odUJVm4F;W zw>T!WP}OM|@HpXIR?Rv_)UemcDx45Sk})|sg|XxE^>VUo5sij(FA^&>}$exE8|Tcgi0R@v(Kp8kXkK<1#)vt4~Zo*#h z@q{j|>3+YI4N%UUnT-NL;z_z<fz1I$)4C_d^guRGd1nmlG6%W-8jykCY?*6pdD2etm7x7npBgwIe3C( z`pA*5Ww}%XD=-fjkYK(jCTS@@q*PyKIc)maR1?PBD8ab_W}|@W;zTK-91l-hN;z37 zRzW$9;sq%?jFdlV$f_lqG`$;JoMqul|IbF*Jxz>uMMjPRS$+s|9n`2l?nlP?7C$%S z`*u^6Y|u2U15xph3u_XSezpm&4a;zD@XGAv=Bcm--BXXA^NDEAOpXI9p`_)kz?eZ? zpzFM@xu@R;Q#qN*3t?3uBYC%CC7{-ibe&i9W72(r*DQS=ji=Y3731*?NeYcKc0hMX zgr?a4oP%5))>T(w2q&Wg)`yu4`ip9EE%14k95KEyi8)GBRSlIXJ3*5NB2Y&;vpNv? z2Fke~%+3-*_-F*egJMj&7BonT;}T3Fd3v2gzKEXSr1Ur}9EZeH zk~{DeW9Lx@{-)XFvDCNWi4MFAgiHSH6bUIH1D*5?#mpcf7RwFa(L9W2QJ3ChSG!5+ z1HrpOk6?2nt=K#c$&Kg}rzYP)cmo6>u**K6dFaTs*NPh*1*Z0pTh`6RHcjW(5c~Q6}_MWGM|E4m;#Hh{)b}7A%@sGEkUi zE(&ESl+&eW>4XrIKP1H5W&lN{MsjarIY>+Bv?>Z-2M@|}sm`LB6##|9(v%Q(kaA}H zS&@m=|K|t$yT5zqU-9Q=$W_yYTgmX@`_v&{LY)kn*bSUG(#p^=X|=}{0WU1063ESm zfuO+CM(pM)%ELgb3HRt&Eif=eTjrS1w1uV{TXeN@(x^QStqx-+sSYOg6k(m7odybb z8$sjhkpj1J(}cGS5e>x8YNT3KTGm8m7nP*dV$Dd)?)ep4ygJk+>nSyBL!Q{{*#_%N zJJp5-%Z{F^XnB{z@QXY_9*lZGP@bePHh`4I>phzRCfw^an-aFU_%_*axN8nle{f3D zL5dzG!4cB=F!k4`VmAqKy59y03&HHOJCwR%&6cwUI_07DAEP?sCiV~u2Ha~Jo$Aw+ zml41oQEd<1o1vUJ6I&p>05KLQCT9tDS08Gq4zzFt#-e)s$?sjDT~&~e1V z$pgCWG%6jivi-hV8HBJC9so*i*$dT2A!HY***a~>1~E$|aJS<2l0T4wG?n97up(oJ2&Y5Y5yD-e>?jbL zB8>SMQlbe@ix8XYe`H6B7H#T9Fc8 zwv`6cmS&fzpQaGjO$gmd4^Tv=V4OyiP)Cw)b|3Pf-?(aK*~G$TDi_SXR#?h!Q2yu_Zcoem}@3nt?clq)yS2Xa&26-u>^1xyE%an@tNzGY^I|J-8R z{M(J6qHuT6p&(nv#%TySR(!)r%2^3z_kdihW?oOOf;pBP6NwVF(8!UEs@+81p?UsK z?PF51o0dCbLXYZdRdl|m7*4BKRI>qBL+3#4F53!aSupQYukZ++1&SV9M@fk@M|rTk zEfALK*&-ph+9g8J&t;(4EsMwP0B}*WbfjW`Jwq<60#KN&Q90?h;Xr9&8`KK*Qix_^ zA;g3LcSFP?#DS0oL~mnWJ8>a)hU9?xPGEt0K?$BTood0-kO2f;%nD%zBsbiIcGg!? zh-dFzfqbfyXG}1&0xC<>u~J~*fB0;;XMj&ujxyDPvczMT$Th-~RhCkQd$$b?7MQla;c$nrNkXR#G#j69hNc z$WGI%;TwMjsF^bl+cV5Ceyfh^8f*iG2A$ginNz%?Dh+NmHwAYqAQ?8GX87%pvmgNp z_Q#q;`x7IXze-HU><$w>-iJK2+7Hq#wHqNdMIlqoV2kvppbSpyFfWuxOosO zq>1|d&SG;n%x)k$?I;nE!X8c^omA_ThV}SrAE(b*XTz_#4uhEJ8a&G2&C*LPR#YuE z5c)x+{mv>5+Tlk7uRrgvVb^`_Zvefz(Gkk2SF_td@Fy827>~z&wTgY7b9eFlN{6Q0 zN^*WPB>fyXF<-N~#Z|It)4DcUmxik`scJG~R|SrQ6`P-ijhpt`lH^UcE_p>reMlSJ z3-;Le*>_tGEAoTO>~MgFiJN5lZpibOl<|&LWs#xDzYOjj=N$ELEl5!hIY{w8>mb(x zx9prT1@0p7N>I>(| zK|-_vwRuq&vtl$A$H8LSA_eDBh9@s&DX098CC6-Jjbeu=-{YWLi4^_pV?Zdj?+0ar zC&kg057|1XUz`h@@-_9esn|Fd=9U))X9N^!GRfXuP3>@=*OH$->0XZe-O;isTKZYC z2@RHh4ZVXt6gxq6j|8(iLTs$lgir&W1#0M)$#_V-u{h|4x>COsn5B)C7X>Zq$K^Aj zIo25S8Ami+fJygoNrrn{JSOd~fIgO1zYuY?SOG85!=& zSvQqqBd?=B_zjIoS7nPLaJHkM-oiQa2(0$hvNiBH%I=Vbu@BFp9td_2@dl6yNocl%D2)3`Cww>w z)Wpe~P2QVr6^_FWvSpKVPn`Rbz)w|YmYzr9ZK6|A936J~JUw`oar%v@Ma`KHc76#wbu&4AE z@Q$lM?QYfPEjh2soel#cub-&hhvDbN)=}3>+%~+e=xp=euG?fvNJBe~6V9un^^oXY zp&0qHA;ECdNLnEB7h^HVBi*YRYcLLJL9&h|0OhgP5$y2MTGE2C;^I!E#y(cDk%?Nx{44h?HD2EIuneS zAVbM&eED^R=(V1(Dv&i2LV4Rnm~3TjK=1>x8Wx2$h?VtB)FWjVk*l0G4rvq22h2xt zTFIw+)28Fi9DrZXQb5u%|m28v%Mh<}KG16M)P11E6|zWC_( zkb4SL!_(+AknRrNHqw&n@*6hO9YfEex=$~}N1O5C98fq6;e=(==&N;b5t&CGoQudn z46^VTPkvsNUZY>Hsm`Aidu)l?jjCF!|!22Y)9iSXIndAaR)mo2oJ|AfbIdRMyj{7|_uofaDs9QvJ_la2}7B)CY z$WEomfzu_nTREjX>iP<#a5RxaUS79+Ab{#^1HEZ>UHPL-unz``docwP`hHr zQWHw|8jfn%5!4l&)Ul(4uohPnV*Az*;`pltiYg!&VEc^XKv9vyUAA-tM_{#X38Z&H z)GBq$=E5FJhV}h{5NXe#g^=!|ux6xW*Q_f6#m0WPcje3Rn=bkK?W9^B*WfOs@NGS- zr<+Rg_FkYk15#U`8J^s0;DBIXxeR_8#BG4;KoN2c2xndhUq>7x2PPhFdso^7k5j$LWx^p6O@ZJc9#&pcm^mYht+EqxEjsT(+ZTgP2{Zf z7*BA#!Tc{$?QtkgD92;FNyay}60bfJvQPC`bJ|etNK&0N_XOtSl3+FXb>hZ}0~|Ev z7|Ebog8O6(>RNS;9%}m)>JxLc=EHSDa8l7>-uyVAaEMk~BIRIZ?i0@wx zpiA||<^jVwaQ+$6A;+A#1YCcLhCL&7TedVw22I3C>Kh|I?ZXDbN{qal z(Z>7kk0@si*EfOcczX*J|0EBVF1@tAauOwYHeg@*!-Q;mzDa)kKJQ$W!kjfb`sftKNj z%`u_p`&16bY{pk_7AU-oJDF?_DS0yP<`lsYNh}@tJiyJ-;g-Qm;xW|+llp`Zdhe%% zQ2MPBLe;TGi1$X@fapJt5ak*8CB&K}&@-sYUZ9sUjgtZrG$e&`8s$)}rTgk+0L5hv z@7cw2C>N4WKGpLmg9|7p3O*@>SZgad!Gsf5q{@*4mvqmsZu7W)!ikY;9kH=vKnW?G z+x3I~FnjibqSJ`0sT^!}El}gtiIGNZ1xoBVZDL>^T;F4~`Juf^(u;YtVs+G_z>l3G zydTU`$&02%nhvuf<=|H~07axja9dat;|53qjHH{X-AM2?02$JLaYckPHlgjLSPGX zjTr$2M$%P68FYur&nVeAPU-yrJUQf;PPI=M(Y?mFiJchCuq=;{h zC&UL$Ae>jRM4(@sk*>*$*jQ+QckmyT|(b*v7|i%I==`_ zf#ze$F8d>Whb%_#22WY7>-OJ3jEy*HwZ!W*IF0ZPtcc#>xq47WJq?RkIU&@m6;$Fm zr4CaLCg>O;_V6&)fM5znBYK9~^7xBSMIAMTdZYmuOe(+47$#(&C+{MX&JF}q6q5?S zV*y?Zy(j)jBeld7G!a4v&`fyS!deIs?InxUKI9L?S}CVS&MpvQ6=XoV5%y>yCUhW2 zF`&62c6C1SMUJ1yCuMpW9K(f1E{3j23 zhJi3NK#|+hU^}H?wQEa@Hfnu6PQ3iEfD$fNiB) zA_<|yDvyNqs=T*EitNQk?;Vk~z#B@sCvrUaYA6MJA;K1gdnpTk8eTas{p3OT)MPr zOwVz!+CL|_ewx{%u$G_V^m5Swb)8Qgd7N_GNWqj@tt*G~jQ3Pw1;~S3;CW>c)m%X& z1Xe;Rj|5bPl-O-d3TyC#+ekT{1fvF40hHuBIzyU*Ypsx34pA*~@F!y}JB%k)ho%LJ zkaRn_DB|LTs@aq-zlU4GGyZf*54QOusO3HF2eJ5^iRKgN{mdoo(2(S3f2#l+rbaE0#Kadcd5vNOJ-5GPK{7G_oQCh2E&d zr8E`?t65NvZAQ^3Zw@@=*sa)aA(HJS*zf?Wrcn%<;L}ip6e(ts$S?!Sb%LHjOqPf; z!(p+GYI;uZQ%H%4pUFgjY?;cTW;~5tQJQwem~3Kas4eEco^Twp5@D;9og-|5Yy=e6 zDUXJ+)8tct3xUCPM%G59Fu$||16E`mnqo_%!7KBx;#9@2>7p7KV-F$v?*~5jJSCgR zXAR!8{JbV_7`!Jj&(N1FNFV9h09uM~sYp#l{3-PZ{&a{Cv}PEXC2o|tB@|R-1(9X; z_+|QKA*@IPthft)QU0<1J@CaW^n@7c#~q1DTtt89KjR5Dav&fBp+;%~TEWg=@`W6E z5bz{m9lklMo(CrBM`)5U#hM}mca`dtXOvCKi^@)fC+SlTDd!NRBv#ce zPEZvhOi8V(!565c7okdu{coujJpoJB5wK)7V7Dw2hMhchrTQ2Gmz+}9t1qZ8sXM{U zj6V-w60bR^Dbkz`tk9Hc&f`|*faaR!w&!l<2K<&vCEk!GIa;@NBdAbYjQd1Y+Dcz| zlQRf#(x<(uy@NXs6WVF*9D<#AL!BJZxpm9(qqwVe5d(xvOu;kJg( z8vq3Yu8u6<-Y_V8^`-hs{iuHx=wrLS#=i?eQM@5hmOMdGTBWhUnZbFUz$kllO~I#v zXVs|+3Xd}C3y+d)NQd^W#Bf`A7@-L$OiGKP6B<1Vmh#Z>2=>oKPtcS-#&iTuaX$~8 z(rDZeHyJ5($_@1m@q)3y7e3{*soobth3u-sx?u!TxovtVd1P8MMVU8D`^>54JWp7a za!+8Ddh?`~R1kN};|Q)YY4(O!S@H!~+3mgTmEJOidI)6!XsHyBHTCmc(r z(i@N^#n2UcHFPL+B=lD39?eYX$6{}ImZi|;&?p31pb#w;@@(sbD%YBCZNV1x25T7& z>huI`>9wu}4p zFqjfwIGDq}fH2-*Fw4?L1cd3LkT8xx$AESzFb=|EyK2R;?iiO}HK&9mBS=gZ!o(b; zKry2r8nW9V8Kxff4fCM(E`t5AF(N2Xp-h0%zF@S1`)KO#mOPf6)m4PFN{Iy{28<2B z`@nD0xYA)E=Z~vewgfhSDB=TpVJ?Dw5xQ{;0Vt!Zb4B(Pzk~vt)&^3jzkvdxne?pN#QFIf3brstKE5R3O~Yu&Xfti%RvRn`7~mhjFKn zRT0{sJ@kxARmni1$4xT@DG@oi%eeOD^6Ci5fuy@+jrG zX6L5yU``HFPAv`_R!BLxzFR_w-%{qQQ9*dl$Z|+KldbHvLQ0n~#vbzj>x*p}`(6*v zNSu}C-a0?yC;0JKN8Z`}?e>oK_rLa|Bd6ZK`s441j`gIcX3pddNo7@z(GkPn7ccza zz~3c&W$D}P8{2~RSBQW4J*VPd`hNDk&;JisYJRZ#r3dC$GLl0Z{{2_A13xJ`u=eWD z8h`MMAAadf*y4X5`Qq9BznMyU>D$)V4pkTbP4ugA$wSM}{#diU_rHxKhTbdutEVoN z;MDh)-QW0e%f^=y|N5&R{+FqDzBQ?R@Xkif@ekhl?$@+0zt-^nt)DaCopx>yZV&%IAH4EMqcMJJn>pw2-u}TK++X z-v81sf0}vr%d)l})t7o>-&)@Ko3wj^uLk_}uW~w0{!NRi@=*Gg2iK13-rh2>ddX?s zulD;O^*3pIzWB=cTM~WYm;dQ=KUn{VpT2S7!1izSXSr&aX9(E?riS<$J3=Bd^9`um81FNcb;tV4{kZk)qH*Ld#;;DP96E<+_|9QZ!b?3 z7!UpJyE}jPf&AQGo_GECg!Ya^#rf86J^AC=g}|I2B*@bLN`CjhoY`0@)?L)U8-LAN zbRr}A=L*qpUwXhN#K*q=t)(Qn%^C8+hqwJi`|h3lt8Z6^2;NiW|Do#NVoQJjIcHYe zmwHc>{r%;r*D`XXWhLkTdf*r5z9JD#{GXrQT>ARMjJ<;wp1%71Ul$0tl<#&`Yj^(L z*WZ??ztvav!Taj|xZZt1_v(JHulxOX{(Zi&slGMa@0G5Rwwk|uKj8hjlrIN<{zsqt zs_mEk|8U;+wT$HSkl>i}H?LQHVdrmtYu~Q9_^+ks284XZzVo~DPT2pypq48BrSCub zVMfwlO?_cwHN|iHK*P<4?8m3ijlXjA3)UZ5zw`U8iW6u3gPJ~g7Mb+9KJyO?*JD0k z(%)nJ`Iie=^_G3+>i=23XJzoNWg$N`Kk@%Peke9l|9io5Z&gm(OAkK(9r0jU)?e&A zSZRuR`TdN&KY6dcLtnL#{lncaJ+O*1a(*w}7G9s8uKxJUSHC%8m;SGso{{F4)80FE zGkH|ASQ#b2uKl~CPFIz4+c9TkwR202bIWn(mJ`k`wazUkom=XhTjW6s%m4GWOo3V- zd|!;}f?VM#r|YzH#~Ej2y>okm^Ubr)R~nrW=bT%boLkO2w=_Gqv{3thRQ>oJ{OzaD z;lH=xdmlMntE&0{5wCj7|LaYsYs9&2)cNKu=a$}SU1QG3ap#T+ zYO5|3r3$?b3q+Gn*OYU|U1#L9bNf9S^xMzJoGZHTbUkoxedyf!h(;EcAn=XnnsCPH znsr9ZIp3OhZdsrKhpJ13Vct%Qg^!)CMdywu&d4R__NUH>WtvE}_Ibzg!e>s`igU-u z&d62g_BCh3I!(4(_q@UrA^xCw6t`m+7a7fMkKta8<=%+nB6f4H#&cT|ID8)jqOTC5 z{_`d!qCK1|k=wSHdwn0bC5hXT%xy{GFilF;_tkIyz%w%QcYkqJI3Q>ib&J*oJGulN zf;v%*s9U&oNO(ecSy(1a6C{gjM2`gjJR`g!Ix0%#Txs0abPm5==lkV3g8iK9LvCvZ z7m>-mdDU4ZIJP+{b;2ypmCbF<;oj_Ze$H3_p5OrI%H`gka9;JTlYUVi=gQ~ac5_<_ zXne^6^=V(xDbYdBRmi#uk>=S zUg6&8<0AUGEmvs_2m_6OJBxfH$rlcAu4~*I4cwQ#^XVGoT-Uj`hPa(KxGlragdp&J>Puu5oV11Q$8UZJ**I?{X2-+#6>x zEuW09QFM=U-RHKQ;C!3%yzl|%ddR*0$n&X$k9>o>FP!0Av)qn3E^?mRzQBF&G57Mi zb4)P)2`RZLSmaz!xL23BSKM5RAk{nZf<(bn&b7>Kea5}ELMygb@K3%qI4Jm-bFFfb zYuwHW=j8K`KQ3J7TpQf?hMWz)l~yl`;$6G=9npMb48J{=-xkM5?&i0|^Vprg1=)Q5 zlM4k2ylW31naFROaQ_^o};w|xU15M}bNEPltb^QLcFhK1R@D~FFbz`vc#zmms)FQ3N- zr_ZYOe#0!0n|BrPkq7xVC!8mrFQgNqLf%!xM-=mK&pWF{J_1!GD&bwFd_)<)GoMco z`MTIGD(77l{A-8!mk;wVw>fKsKRNDueUjWQBORvZm_+F7KILW)}_#LPC$kY7xGyJRd{2L8?#999J zcy5npm2Ms}7etM`>m0wci3f>LAN9TKi10k`YUW?>=Wh7sZ%EX_yFTJycXKPgI?sfy zysM3mxWK z`S~f{b(fEr=5gFueLu-?k9XbYUmoIq;;qvoc)+_J@;e^!ku&`ES^niY{zbEv5df{E+lyHN0 zMTPI!6&@KKzC9-V&AZ$uEXA5IHry2#zIAu_n|;p@4_kb=DM z-#Wqhh|^#04R`Gef2(NoxkZo^?n(~-p_^;-HE9*4gu7D1BhtcmribH~M+tXr4s?Hb z#E0QKGs1V8Jeir{uB`Bg?C>}8d5w3_ev%skkz24Tm=LfwK~A{qK={kYHcz2BL2kG! zFZ|66uG&X|jtKI@UGDI$1>xAs&v}K*f`j3%!tjWq@HdOYx8?KCx9lH@XOonKN0f%Y zUKajVd3a<+_-lv4U5CS6_r=2!^^tHE`4LvxtW_icU1V$w&00nK(82!&UbVzd diff --git a/src/main/java/me/trouper/sentinel/data/config/lang/LanguageFile.java b/src/main/java/me/trouper/sentinel/data/config/lang/LanguageFile.java index eda4f39..c00f162 100644 --- a/src/main/java/me/trouper/sentinel/data/config/lang/LanguageFile.java +++ b/src/main/java/me/trouper/sentinel/data/config/lang/LanguageFile.java @@ -2,7 +2,6 @@ package me.trouper.sentinel.data.config.lang; import io.github.itzispyder.pdk.utils.misc.config.JsonSerializable; import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.utils.Text; import java.io.File; @@ -97,213 +96,143 @@ public class LanguageFile implements JsonSerializable { public String removeSuccess = "Successfully removed %1$s from the false positive list!"; } + public Generic generic = new Generic(); + public class Generic { + public String yes = "Yes"; + public String no = "No"; + public String success = "Success"; + public String failure = "Failure"; + public String t = "True"; + public String f = "False"; + } + public Violations violations = new Violations(); public class Violations { public Chat chat = new Chat(); public class Chat { - public Profanity profanity = new Profanity(); - public Spam spam = new Spam(); - public Unicode unicode = new Unicode(); - public URL url = new URL(); + public String denyMessage = "Blocked the message"; + public String originalMessage = "Original Message"; + public String highlightedMessage = "Highlighted Message"; + public Profanity profanity = new Profanity(); public class Profanity { - public String preventNotification = "has been prevented from swearing."; - public String autoPunishNotification = "has been auto-punished for swearing."; + public String preventNotification = "§b§n%1$s§r §7has been prevented from swearing."; + public String autoPunishNotification = "§b§n%1$s§r §7has been auto-punished for swearing."; public String preventWarning = "Do not use profanity in chat. Any attempt to bypass this filter will be detected, and you will be punished."; - public String autoPunishWarning = "&cYou have been auto-punished for attempting to bypass the profanity filter!"; + public String autoPunishWarning = "§cYou have been auto-punished for attempting to bypass the profanity filter!"; public String treeTitle = "The Profanity Filter has been triggered."; - public String playerInfoTitle = "Player: %s"; - public String uuid = "UUID"; public String score = "Score"; public String reportInfoTitle = "Profanity Filter Detection"; - public String originalMessage = "Original Message"; - public String processedMessage = "Processed Message"; + public String processedMessage = "Processed Message"; public String severity = "Severity"; - - public String actionTitle = "Actions"; - public String blockAction = "Blocked the message"; - public String commandAction = "Executed Punishment Commands"; } + public Spam spam = new Spam(); public class Spam { - public String autoPunishNotification = "has been auto-punished for spamming."; - public String preventNotification = "might be spamming!"; + public String autoPunishNotification = "§b§n%1$s§r §7has been auto-punished for spamming."; + public String preventNotification = "§b§n%1$s§r §7might be spamming!"; public String preventWarning = "Do not spam in chat! Please wait before sending another message."; - public String autoPunishWarning = "&cYou have been auto-punished for violating the anti-spam repetitively!"; + public String autoPunishWarning = "§cYou have been auto-punished for violating the anti-spam repetitively!"; public String treeTitle = "The Anti-Spam has been triggered."; - public String playerInfoTitle = "Player: %s"; - public String uuid = "UUID"; public String heat = "Heat"; public String reportInfoTitle = "Spam Filter Detection"; public String previousMessage = "Previous Message"; public String currentMessage = "Current Message"; public String similarity = "Similarity"; - - public String actionTitle = "Actions"; - public String blockAction = "Blocked the message"; - public String commandAction = "Executed Punishment Commands"; } + public Unicode unicode = new Unicode(); public class Unicode { - public String autoPunishNotification = "has been punished for triggering the Unicode filter."; - public String preventNotification = "has been prevented from using invalid Unicode characters."; + public String autoPunishNotification = "§b§n%1$s§r §7has been punished for triggering the Unicode filter."; + public String preventNotification = "§b§n%1$s§r §7has been prevented from using invalid Unicode characters."; public String autoPunishWarning = "You have been punished for triggered the Unicode filter."; public String preventWarning = "You may only use unicode from the QWERTY keyboard."; public String treeTitle = "The Unicode Filter has been triggered."; - public String playerInfoTitle = "Player: %s"; - public String uuid = "UUID"; - public String reportInfoTitle = "Unicode Filter Detection"; - public String originalMessage = "Original Message"; - public String highlightedMessage = "Highlighted Message"; - - public String actionTitle = "Actions"; - public String blockAction = "Blocked the message"; - public String commandAction = "Executed Punishment Commands"; } + public URL url = new URL(); public class URL { - public String autoPunishNotification = "has been punished for triggering the URL filter."; - public String preventNotification = "has been prevented from sending a URL."; + public String autoPunishNotification = "§b§n%1$s§r §7has been punished for triggering the URL filter."; + public String preventNotification = "§b§n%1$s§r §7has been prevented from sending a URL."; public String autoPunishWarning = "You have been punished for triggered the URL filter."; public String preventWarning = "You may not send links in chat."; public String treeTitle = "The URL Filter has been triggered."; - public String playerInfoTitle = "Player: %s"; - public String uuid = "UUID"; - public String reportInfoTitle = "URL Filter Detection"; - public String originalMessage = "Original Message"; - public String highlightedMessage = "Highlighted Message"; - - public String actionTitle = "Actions"; - public String blockAction = "Blocked the message"; - public String commandAction = "Executed Punishment Commands"; } } - public CommandBlockEdit commandBlockEdit = new CommandBlockEdit(); - public class CommandBlockEdit { - public String playerAttemptEdit = "A player has attempted to edit a command block!"; - public String playerInfoTitle = "Player: %s"; - public String uuid = "UUID"; - public String location = "Location"; - public String violationInfoTitle = "Command Block Edit Info"; - public String blockLocation = "Block Location"; - public String insertedCommand = "Inserted Command"; - } - public CommandBlockExecute commandBlockExecute = new CommandBlockExecute(); - public class CommandBlockExecute { - public String commandBlockWhitelistTripped = "Command block whitelist has been tripped."; - public String actionsTitle = "Actions"; - public String commandBlockInfoTitle = "Command Block Info"; - public String blockLocation = "Block Location"; - public String executedCommand = "Executed Command"; - public String destroyedBlock = "Destroyed block"; - public String preventExecution = "Prevented Execution"; - public String restore = "Restore"; - public String restoreSuccess = "Success"; - public String restoreFailure = "Failure"; - public String loggedToDiscord = "Logged to Discord"; - } + public Protections protections = new Protections(); + public class Protections { + public RootName rootName = new RootName(); + public class RootName { + // Headers + public String rootNameFormat = "The §e§n%1$s§r §7has been triggered!"; + public String rootNameFormatPlayer = "§b§n%1$s§r §7has attempted to §e%2$s§r §7a §b%3$s§r§7!"; - public CommandBlockMinecartPlace commandBlockMinecartPlace = new CommandBlockMinecartPlace(); - public class CommandBlockMinecartPlace { - public String detectionChat = "&b&n%s&r &7has attempted to place a command block minecart."; - public String detectionTree = "A player has attempted to place a command block minecart!"; - public String playerInfoTitle = "Player: %s"; - public String uuid = "UUID"; - public String location = "Location"; - public String blockLocation = "Block Location"; - public String minecartPlaceInfoTitle = "Minecart Place Info"; - public String locationFormat = "X: %s Y: %s Z: %s"; - public String blockLocationFormat = "World: %s X: %s Y: %s Z: %s"; - } + // Triggers + public String use = "use"; + public String edit = "edit"; + public String place = "place"; + public String run = "run"; + public String grab = "grab"; - public CommandBlockMinecartUse commandBlockMinecartUse = new CommandBlockMinecartUse(); - public class CommandBlockMinecartUse { - public String detectionChat = "&b&n%s&r &7has attempted to use a command block minecart."; - public String detectionTree = "A player has attempted to use a command block minecart!"; - public String playerInfoTitle = "Player: %s"; - public String uuid = "UUID"; - public String location = "Location"; - public String cartLocation = "Cart Location"; - public String minecartUseInfoTitle = "Minecart Use Info"; - public String locationFormat = "X: %s Y: %s Z: %s"; - public String cartLocationFormat = "World: %s X: %s Y: %s Z: %s"; - } + // Types + public String commandBlock = "Command Block"; + public String minecartCommandBlock = "Minecart Command Block"; + public String commandBlockWhitelist = "Command Block Whitelist"; + public String specificCommand = "Specific Command"; + public String loggedCommand = "Logged Command"; + public String dangerousCommand = "Dangerous Command"; + public String nbtItem = "NBT item"; + } - public CommandBlockPlace commandBlockPlace = new CommandBlockPlace(); - public class CommandBlockPlace { - public String detectionChat = "&b&n%s&r &7has attempted to place a command block."; - public String detectionTree = "A player has attempted to place a command block!"; - public String playerInfoTitle = "Player: %s"; - public String uuid = "UUID"; - public String location = "Location"; - public String blockLocation = "Block Location"; - public String commandBlockEditInfoTitle = "Command Block Edit Info"; - public String locationFormat = "X: %s Y: %s Z: %s"; - public String blockLocationFormat = "World: %s X: %s Y: %s Z: %s"; - public String insertedCommand = "Inserted Command"; - public String insertedCommandUploadedTo = "Inserted Command Uploaded to"; - } + public InfoNode infoNode = new InfoNode(); + public class InfoNode { + public String playerInfo = "Player Info"; + public String commandInfo = "Command Info"; + public String blockInfo = "Block Info"; + public String itemInfo = "Item Info"; + public String minecartInfo = "Minecart Info"; - public CommandBlockUse commandBlockUse = new CommandBlockUse(); - public class CommandBlockUse { - public String detectionChat = "&b&n%s&r &7has attempted to use a command block."; - public String detectionTree = "A player has attempted to use a command block!"; - public String playerInfoTitle = "Player: %s"; - public String uuid = "UUID"; - public String location = "Location"; - public String blockLocation = "Block Location"; - public String commandBlockUseInfoTitle = "Command Block Use Info"; - public String locationFormat = "X: %s Y: %s Z: %s"; - public String blockLocationFormat = "World: %s X: %s Y: %s Z: %s"; - public String commandInside = "Command Inside"; - public String commandUploadedTo = "Command Uploaded to"; - } + public String uuid = "UUID"; + public String name = "Name"; + public String permissionRequired = "Permission Required"; + public String permissionSatisfied = "Permission Satisfied"; + public String operator = "Operator"; + public String hasMeta = "Has Meta"; + public String hasName = "Has Name"; + public String hasLore = "Has Lore"; + public String hasEnchants = "Has Enchants"; + public String hasAttributes = "Has Attributes"; - public CommandExecute commandExecute = new CommandExecute(); - public class CommandExecute { - public String specificCommandDetection = "A player has attempted to run a %s command."; - public String playerInfoTitle = "Player: %s"; - public String uuid = "UUID"; - public String location = "Location"; - public String commandField = "Command"; - public String commandUploadedTo = "Command Uploaded to"; - public String violationInfoTitle = "Violation Info"; - public String locationFormat = "X: %s Y: %s Z: %s"; - public String specificCommandViolation = "&b&n%s&r &7has attempted to run a specific command."; - public String dangerousCommandViolation = "&b&n%s&r &7has attempted to run a dangerous command."; - public String loggedCommandViolation = "&b&n%s&r &7has ran a logged command."; - } + public String locationField = "Location"; + public String worldField = "World"; + public String commandField = "Command"; + public String commandTooLargeField = "Command Too Large (Uploaded)"; + public String nbtStored = "NBT Stored"; + public String blockLocationField = "Block Location"; + public String cartLocationField = "Cart Location"; + public String locationFormat = "X: %s Y: %s Z: %s"; + } - public CreativeHotbar creativeHotbar = new CreativeHotbar(); - public class CreativeHotbar { - public String nbtAttemptDetection = "A player has attempted to grab an NBT item!"; - public String playerInfoTitle = "Player: %s"; - public String uuid = "UUID"; - public String location = "Location"; - public String locationFormat = "X: %s Y: %s Z: %s"; - public String itemType = "Type"; - public String nbtUpload = "NBT Upload"; - public String itemInfoTitle = "Item Info"; - public String nbtAttemptViolation = "&b&n%s&r &7has attempted to grab an NBT item."; + public ActionNode actionNode = new ActionNode(); + public class ActionNode { + public String actionNodeTitle = "Actions"; + public String eventCancelled = "Canceled Event"; + public String destroyedBlock = "Destroyed Block"; + public String restore = "Restored Original Block"; + public String restoreFailed = "Failed to Restore Original Block"; + public String punishmentCommandsExecuted = "Executed Punishment Commands"; + public String userDeoped = "De-OP'd Player"; + public String loggedToDiscord = "Logged to Discord"; + } } - - public ViolationMessages violationMessages = new ViolationMessages(); - public class ViolationMessages { - public String actions = "Actions"; - public String eventCancelled = "Canceled Event"; - public String punishmentCommandsExecuted = "Executed Punishment Commands"; - public String userOpStripped = "Stripped user's OP"; - public String loggedToDiscord = "Logged to Discord"; - } - } } \ No newline at end of file diff --git a/src/main/java/me/trouper/sentinel/server/commands/CallbackCommand.java b/src/main/java/me/trouper/sentinel/server/commands/CallbackCommand.java index b4c8751..d2f822f 100644 --- a/src/main/java/me/trouper/sentinel/server/commands/CallbackCommand.java +++ b/src/main/java/me/trouper/sentinel/server/commands/CallbackCommand.java @@ -7,8 +7,8 @@ import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; import io.github.itzispyder.pdk.utils.misc.Cooldown; import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.server.functions.chatfilter.FalsePositiveReporting; -import me.trouper.sentinel.server.functions.chatfilter.Report; +import me.trouper.sentinel.server.functions.helpers.FalsePositiveReporting; +import me.trouper.sentinel.server.functions.helpers.Report; import me.trouper.sentinel.utils.PlayerUtils; import me.trouper.sentinel.utils.Text; import org.bukkit.command.Command; diff --git a/src/main/java/me/trouper/sentinel/server/commands/MessageCommand.java b/src/main/java/me/trouper/sentinel/server/commands/MessageCommand.java index 3d6d63f..9b79f42 100644 --- a/src/main/java/me/trouper/sentinel/server/commands/MessageCommand.java +++ b/src/main/java/me/trouper/sentinel/server/commands/MessageCommand.java @@ -6,7 +6,7 @@ import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.server.functions.Message; +import me.trouper.sentinel.server.functions.helpers.Message; import me.trouper.sentinel.utils.PlayerUtils; import me.trouper.sentinel.utils.Text; import org.bukkit.Bukkit; diff --git a/src/main/java/me/trouper/sentinel/server/commands/ReplyCommand.java b/src/main/java/me/trouper/sentinel/server/commands/ReplyCommand.java index 7866ee9..8eeaf32 100644 --- a/src/main/java/me/trouper/sentinel/server/commands/ReplyCommand.java +++ b/src/main/java/me/trouper/sentinel/server/commands/ReplyCommand.java @@ -6,7 +6,7 @@ import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.server.functions.Message; +import me.trouper.sentinel.server.functions.helpers.Message; import me.trouper.sentinel.utils.PlayerUtils; import me.trouper.sentinel.utils.Text; import org.bukkit.command.Command; diff --git a/src/main/java/me/trouper/sentinel/server/commands/SentinelCommand.java b/src/main/java/me/trouper/sentinel/server/commands/SentinelCommand.java index 8423971..e31c13a 100644 --- a/src/main/java/me/trouper/sentinel/server/commands/SentinelCommand.java +++ b/src/main/java/me/trouper/sentinel/server/commands/SentinelCommand.java @@ -8,9 +8,8 @@ import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; import io.papermc.paper.chat.ChatRenderer; import io.papermc.paper.event.player.AsyncChatEvent; import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.data.config.MainConfig; import me.trouper.sentinel.data.types.WhitelistedBlock; -import me.trouper.sentinel.server.functions.CBWhitelistManager; +import me.trouper.sentinel.server.functions.helpers.CBWhitelistManager; import me.trouper.sentinel.server.functions.chatfilter.profanity.ProfanityFilter; import me.trouper.sentinel.server.functions.chatfilter.spam.SpamFilter; import me.trouper.sentinel.server.functions.chatfilter.unicode.UnicodeFilter; @@ -208,7 +207,6 @@ public class SentinelCommand implements CustomCommand { switch (sub) { case "lang" -> sender.sendMessage(Sentinel.lang.brokenLang); case "toggle" -> { - Sentinel.mainConfig.debugMode = !Sentinel.mainConfig.debugMode; Sentinel.mainConfig.debugMode = !Sentinel.mainConfig.debugMode; String message = Sentinel.mainConfig.debugMode ? Sentinel.lang.debug.debugEnabled diff --git a/src/main/java/me/trouper/sentinel/server/events/CBEditEvent.java b/src/main/java/me/trouper/sentinel/server/events/CBEditEvent.java deleted file mode 100644 index 4769fd6..0000000 --- a/src/main/java/me/trouper/sentinel/server/events/CBEditEvent.java +++ /dev/null @@ -1,69 +0,0 @@ -package me.trouper.sentinel.server.events; - -import io.github.itzispyder.pdk.events.CustomListener; -import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.server.functions.CBWhitelistManager; -import me.trouper.sentinel.server.functions.ViolationController; -import me.trouper.sentinel.utils.PlayerUtils; -import me.trouper.sentinel.utils.ServerUtils; -import me.trouper.sentinel.utils.trees.Node; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockState; -import org.bukkit.block.CommandBlock; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.EntityChangeBlockEvent; - -public class CBEditEvent implements CustomListener { - - @EventHandler - private void onCMDBlockChange(EntityChangeBlockEvent e) { - //ServerUtils.verbose("CommandBlockChange: Detected the event"); - if (!Sentinel.violationConfig.commandBlockEdit.enabled) return; - //ServerUtils.verbose("CommandBlockChange: Enabled"); - if (!(e.getEntity() instanceof Player p)) return; - //ServerUtils.verbose("CommandBlockChange: Changer is a player"); - Block b = e.getBlock(); - if (!(b.getType() == Material.COMMAND_BLOCK || b.getType() == Material.REPEATING_COMMAND_BLOCK || b.getType() == Material.CHAIN_COMMAND_BLOCK)) - return; - ServerUtils.verbose("CommandBlockChange: Block is a command block"); - BlockState state = b.getState(); - CommandBlock cb = (CommandBlock) state; - if (PlayerUtils.isTrusted(p)) { - if (!CBWhitelistManager.autoWhitelist.contains(p.getUniqueId())) return; - CBWhitelistManager.add(cb, p.getUniqueId()); - return; - } - ServerUtils.verbose("CommandBlockChange: Not trusted, performing action"); - e.setCancelled(true); - - Node root = getLog(p, cb); - - ViolationController.handleViolation( - "&b&n%s&r &7%s".formatted(p.getName(), Sentinel.lang.violations.commandBlockEdit.playerAttemptEdit), - Sentinel.violationConfig.commandBlockEdit.punish, - Sentinel.violationConfig.commandBlockEdit.deop, - Sentinel.violationConfig.commandBlockEdit.logToDiscord, - p, - Sentinel.violationConfig.commandBlockEdit.punishmentCommands, - root - ); - } - - private static Node getLog(Player p, CommandBlock cb) { - Node root = new Node("Sentinel"); - root.addTextLine(Sentinel.lang.violations.commandBlockEdit.playerAttemptEdit); - - Node playerInfo = new Node(Sentinel.lang.violations.commandBlockEdit.playerInfoTitle.formatted(p.getName())); - playerInfo.addKeyValue(Sentinel.lang.violations.commandBlockEdit.uuid, p.getUniqueId().toString()); - playerInfo.addField(Sentinel.lang.violations.commandBlockEdit.location, "X: %s Y: %s Z: %s".formatted(Math.round(p.getX()), Math.round(p.getY()), Math.round(p.getZ()))); - root.addChild(playerInfo); - - Node violationInfo = new Node(Sentinel.lang.violations.commandBlockEdit.violationInfoTitle); - violationInfo.addField(Sentinel.lang.violations.commandBlockEdit.blockLocation,"World: %s X: %s Y: %s Z: %s".formatted(cb.getWorld().getName(), cb.getX(), cb.getY(), cb.getZ())); - violationInfo.addField(Sentinel.lang.violations.commandBlockEdit.insertedCommand, cb.getCommand()); - root.addChild(violationInfo); - return root; - } -} diff --git a/src/main/java/me/trouper/sentinel/server/events/CBExecuteEvent.java b/src/main/java/me/trouper/sentinel/server/events/CBExecuteEvent.java deleted file mode 100644 index bb93ce3..0000000 --- a/src/main/java/me/trouper/sentinel/server/events/CBExecuteEvent.java +++ /dev/null @@ -1,85 +0,0 @@ -package me.trouper.sentinel.server.events; - -import io.github.itzispyder.pdk.events.CustomListener; -import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.server.functions.CBWhitelistManager; -import me.trouper.sentinel.utils.FileUtils; -import me.trouper.sentinel.utils.PlayerUtils; -import me.trouper.sentinel.utils.ServerUtils; -import me.trouper.sentinel.utils.Text; -import me.trouper.sentinel.utils.trees.ConsoleFormatter; -import me.trouper.sentinel.utils.trees.EmbedFormatter; -import me.trouper.sentinel.utils.trees.HoverFormatter; -import me.trouper.sentinel.utils.trees.Node; -import net.kyori.adventure.text.Component; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.CommandBlock; -import org.bukkit.command.BlockCommandSender; -import org.bukkit.event.EventHandler; -import org.bukkit.event.server.ServerCommandEvent; - -public class CBExecuteEvent implements CustomListener { - @EventHandler - private void commandBlockExecute(ServerCommandEvent e) { - - //ServerUtils.verbose("Handling command block event: " + e.getCommand()); - if (!Sentinel.violationConfig.commandBlockExecute.enabled) return; - //ServerUtils.verbose("Whitelist not disabled "); - if (!(e.getSender() instanceof BlockCommandSender s)) return; - //ServerUtils.verbose("Sender is command block"); - Block cmdBlock = s.getBlock(); - if (CBWhitelistManager.canRun(cmdBlock)) return; - ServerUtils.verbose("Command block can't run."); - - CommandBlock cb = (CommandBlock) cmdBlock.getState(); - - Node log = getLog(cb); - Node actions = new Node(Sentinel.lang.violations.commandBlockExecute.actionsTitle); - - e.setCancelled(true); - actions.addTextLine(Sentinel.lang.violations.commandBlockExecute.preventExecution); - - if (Sentinel.violationConfig.commandBlockExecute.destroyBlock) { - cmdBlock.setType(Material.AIR); - actions.addTextLine(Sentinel.lang.violations.commandBlockExecute.destroyedBlock); - } - - if (Sentinel.violationConfig.commandBlockExecute.attemptRestore) { - boolean restored = CBWhitelistManager.restore(cmdBlock.getLocation()); - actions.addKeyValue(Sentinel.lang.violations.commandBlockExecute.restore, restored ? Sentinel.lang.violations.commandBlockExecute.restoreSuccess : Sentinel.lang.violations.commandBlockExecute.restoreFailure); - } - - if (Sentinel.violationConfig.commandBlockExecute.logToDiscord) actions.addTextLine(Sentinel.lang.violations.commandBlockExecute.loggedToDiscord); - log.addChild(actions); - - if (Sentinel.violationConfig.commandBlockExecute.logToDiscord) { - EmbedFormatter.sendEmbed(EmbedFormatter.format(log)); - } - - ServerUtils.forEachPlayer(trusted -> { - if (PlayerUtils.isTrusted(trusted)) { - trusted.sendMessage(Component.text(Text.prefix("The command block whitelist has been tripped!")).hoverEvent(Component.text(HoverFormatter.format(log)).asHoverEvent())); - } - }); - - Sentinel.log.info(ConsoleFormatter.format(log)); - } - - private static Node getLog(CommandBlock cb) { - Node root = new Node("Sentinel"); - root.addTextLine(Sentinel.lang.violations.commandBlockExecute.commandBlockWhitelistTripped); - - Node violationInfo = new Node(Sentinel.lang.violations.commandBlockExecute.commandBlockInfoTitle); - violationInfo.addField(Sentinel.lang.violations.commandBlockExecute.blockLocation,"World: %s X: %s Y: %s Z: %s".formatted(cb.getWorld().getName(), cb.getX(), cb.getY(), cb.getZ())); - String command = cb.getCommand(); - if (command.length() <= 128) { - violationInfo.addField(Sentinel.lang.violations.commandBlockExecute.executedCommand, command); - } else { - violationInfo.addKeyValue(Sentinel.lang.violations.commandBlockExecute.executedCommand, FileUtils.createCommandLog(command)); - } - root.addChild(violationInfo); - - return root; - } -} diff --git a/src/main/java/me/trouper/sentinel/server/events/CBMCPlaceEvent.java b/src/main/java/me/trouper/sentinel/server/events/CBMCPlaceEvent.java deleted file mode 100644 index 986ed10..0000000 --- a/src/main/java/me/trouper/sentinel/server/events/CBMCPlaceEvent.java +++ /dev/null @@ -1,66 +0,0 @@ -package me.trouper.sentinel.server.events; - -import io.github.itzispyder.pdk.events.CustomListener; -import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.server.functions.ViolationController; -import me.trouper.sentinel.utils.PlayerUtils; -import me.trouper.sentinel.utils.ServerUtils; -import me.trouper.sentinel.utils.trees.Node; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerInteractEvent; - -public class CBMCPlaceEvent implements CustomListener { - - @EventHandler - private void onCMDMinecartPlace(PlayerInteractEvent e) { - //ServerUtils.verbose("MinecartCommandPlace: Detected interaction"); - if (!Sentinel.violationConfig.commandBlockMinecartPlace.enabled) return; - //ServerUtils.verbose("MinecartCommandPlace: Check is enabled"); - if (!e.getPlayer().isOp()) return; - //ServerUtils.verbose("MinecartCommandPlace: Player is op"); - if (e.getItem() == null) return; - ServerUtils.verbose("MinecartCommandPlace: Item isn't null"); - if (e.getClickedBlock() == null) return; - ServerUtils.verbose("MinecartCommandPlace: Clicked block isn't null"); - if (!e.getItem().getType().equals(Material.COMMAND_BLOCK_MINECART)) return; - ServerUtils.verbose("MinecartCommandPlace: Item is a minecart command"); - if (!(e.getClickedBlock().getType() == Material.RAIL || e.getClickedBlock().getType() == Material.POWERED_RAIL || e.getClickedBlock().getType() == Material.ACTIVATOR_RAIL || e.getClickedBlock().getType() == Material.DETECTOR_RAIL)) return; - ServerUtils.verbose("MinecartCommandPlace: Clicked block is a rail"); - Player p = e.getPlayer(); - if (PlayerUtils.isTrusted(p)) return; - ServerUtils.verbose("MinecartCommandPlace: Not trusted, preforming action"); - - e.setCancelled(true); - p.getInventory().remove(Material.COMMAND_BLOCK_MINECART); - - Node log = getLog(p, e.getClickedBlock()); - - ViolationController.handleViolation( - Sentinel.lang.violations.commandBlockMinecartPlace.detectionChat.formatted(p.getName()), - Sentinel.violationConfig.commandBlockMinecartPlace.punish, - Sentinel.violationConfig.commandBlockMinecartPlace.deop, - Sentinel.violationConfig.commandBlockMinecartPlace.logToDiscord, - p, - Sentinel.violationConfig.commandBlockMinecartPlace.punishmentCommands, - log - ); - } - - private static Node getLog(Player p, Block cb) { - Node root = new Node("Sentinel"); - root.addTextLine(Sentinel.lang.violations.commandBlockMinecartPlace.detectionTree); - - Node playerInfo = new Node(Sentinel.lang.violations.commandBlockMinecartPlace.playerInfoTitle.formatted(p.getName())); - playerInfo.addKeyValue(Sentinel.lang.violations.commandBlockMinecartPlace.uuid, p.getUniqueId().toString()); - playerInfo.addField(Sentinel.lang.violations.commandBlockMinecartPlace.location, Sentinel.lang.violations.commandBlockMinecartPlace.locationFormat.formatted(Math.round(p.getX()), Math.round(p.getY()), Math.round(p.getZ()))); - root.addChild(playerInfo); - - Node violationInfo = new Node(Sentinel.lang.violations.commandBlockMinecartPlace.minecartPlaceInfoTitle); - violationInfo.addField(Sentinel.lang.violations.commandBlockMinecartPlace.blockLocation, Sentinel.lang.violations.commandBlockMinecartPlace.blockLocationFormat.formatted(cb.getWorld().getName(), cb.getX(), cb.getY(), cb.getZ())); - root.addChild(violationInfo); - return root; - } -} diff --git a/src/main/java/me/trouper/sentinel/server/events/CBMCUseEvent.java b/src/main/java/me/trouper/sentinel/server/events/CBMCUseEvent.java deleted file mode 100644 index dc39976..0000000 --- a/src/main/java/me/trouper/sentinel/server/events/CBMCUseEvent.java +++ /dev/null @@ -1,59 +0,0 @@ -package me.trouper.sentinel.server.events; - -import io.github.itzispyder.pdk.events.CustomListener; -import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.server.functions.ViolationController; -import me.trouper.sentinel.utils.PlayerUtils; -import me.trouper.sentinel.utils.ServerUtils; -import me.trouper.sentinel.utils.trees.Node; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerInteractEntityEvent; - -public class CBMCUseEvent implements CustomListener { - - @EventHandler - private void onCMDBlockMinecartUse(PlayerInteractEntityEvent e) { - //ServerUtils.verbose("MinecartCommandUse: Detected Interaction with entity"); - if (!Sentinel.violationConfig.commandBlockMinecartUse.enabled) return; - //ServerUtils.verbose("MinecartCommandUse: Enabled"); - if (!e.getPlayer().isOp()) return; - ServerUtils.verbose("MinecartCommandUse: Player op"); - if (e.getRightClicked().getType() != EntityType.COMMAND_BLOCK_MINECART) return; - ServerUtils.verbose("MinecartCommandUse: Entity is minecart command"); - Player p = e.getPlayer(); - if (PlayerUtils.isTrusted(p)) return; - ServerUtils.verbose("MinecartCommandUse: Not trusted, performing action"); - e.setCancelled(true); - - Node log = getLog(p, e.getRightClicked()); - - ViolationController.handleViolation( - Sentinel.lang.violations.commandBlockMinecartUse.detectionChat.formatted(p.getName()), - Sentinel.violationConfig.commandBlockMinecartUse.punish, - Sentinel.violationConfig.commandBlockMinecartUse.deop, - Sentinel.violationConfig.commandBlockMinecartUse.logToDiscord, - p, - Sentinel.violationConfig.commandBlockMinecartUse.punishmentCommands, - log - ); - } - - private static Node getLog(Player p, Entity e) { - Node root = new Node("Sentinel"); - root.addTextLine(Sentinel.lang.violations.commandBlockMinecartUse.detectionTree); - - Node playerInfo = new Node(Sentinel.lang.violations.commandBlockMinecartUse.playerInfoTitle.formatted(p.getName())); - playerInfo.addKeyValue(Sentinel.lang.violations.commandBlockMinecartUse.uuid, p.getUniqueId().toString()); - playerInfo.addField(Sentinel.lang.violations.commandBlockMinecartUse.location, Sentinel.lang.violations.commandBlockMinecartUse.locationFormat.formatted(Math.round(p.getX()), Math.round(p.getY()), Math.round(p.getZ()))); - root.addChild(playerInfo); - - Node violationInfo = new Node(Sentinel.lang.violations.commandBlockMinecartUse.minecartUseInfoTitle); - violationInfo.addField(Sentinel.lang.violations.commandBlockMinecartUse.cartLocation, Sentinel.lang.violations.commandBlockMinecartUse.cartLocationFormat.formatted(e.getWorld().getName(), e.getX(), e.getY(), e.getZ())); - root.addChild(violationInfo); - - return root; - } -} diff --git a/src/main/java/me/trouper/sentinel/server/events/CBPlaceEvent.java b/src/main/java/me/trouper/sentinel/server/events/CBPlaceEvent.java deleted file mode 100644 index f9056ba..0000000 --- a/src/main/java/me/trouper/sentinel/server/events/CBPlaceEvent.java +++ /dev/null @@ -1,75 +0,0 @@ -package me.trouper.sentinel.server.events; - -import io.github.itzispyder.pdk.events.CustomListener; -import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.server.functions.CBWhitelistManager; -import me.trouper.sentinel.server.functions.ViolationController; -import me.trouper.sentinel.utils.FileUtils; -import me.trouper.sentinel.utils.PlayerUtils; -import me.trouper.sentinel.utils.ServerUtils; -import me.trouper.sentinel.utils.trees.Node; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.CommandBlock; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.block.BlockPlaceEvent; - -public class CBPlaceEvent implements CustomListener { - - @EventHandler - private void onCMDBlockPlace(BlockPlaceEvent e) { - //ServerUtils.verbose("CommandBlockPlace: Detected block place"); - if (!Sentinel.violationConfig.commandBlockPlace.enabled) return; - //ServerUtils.verbose("CommandBlockPlace: Enabled"); - if (!e.getPlayer().isOp()) return; - //ServerUtils.verbose("CommandBlockPlace: Player is operator"); - Block b = e.getBlockPlaced(); - if (!(b.getType().equals(Material.COMMAND_BLOCK) || - b.getType().equals(Material.REPEATING_COMMAND_BLOCK) || - b.getType().equals(Material.CHAIN_COMMAND_BLOCK))) return; - ServerUtils.verbose("CommandBlockPlace: Block is a command block"); - Player p = e.getPlayer(); - if (PlayerUtils.isTrusted(p)) { - if (!CBWhitelistManager.autoWhitelist.contains(p.getUniqueId())) return; - CBWhitelistManager.add((CommandBlock) b.getState(), p.getUniqueId()); - return; - } - ServerUtils.verbose("CommandBlockPlace: Not trusted, performing action"); - e.setCancelled(true); - - Node log = getLog(p, (CommandBlock) b.getState()); - - ViolationController.handleViolation( - Sentinel.lang.violations.commandBlockPlace.detectionChat.formatted(p.getName()), - Sentinel.violationConfig.commandBlockPlace.punish, - Sentinel.violationConfig.commandBlockPlace.deop, - Sentinel.violationConfig.commandBlockPlace.logToDiscord, - p, - Sentinel.violationConfig.commandBlockPlace.punishmentCommands, - log - ); - } - - private static Node getLog(Player p, CommandBlock cb) { - Node root = new Node("Sentinel"); - root.addTextLine(Sentinel.lang.violations.commandBlockPlace.detectionTree); - - Node playerInfo = new Node(Sentinel.lang.violations.commandBlockPlace.playerInfoTitle.formatted(p.getName())); - playerInfo.addKeyValue(Sentinel.lang.violations.commandBlockPlace.uuid, p.getUniqueId().toString()); - playerInfo.addField(Sentinel.lang.violations.commandBlockPlace.location, Sentinel.lang.violations.commandBlockPlace.locationFormat.formatted(Math.round(p.getX()), Math.round(p.getY()), Math.round(p.getZ()))); - root.addChild(playerInfo); - - Node violationInfo = new Node(Sentinel.lang.violations.commandBlockPlace.commandBlockEditInfoTitle); - violationInfo.addField(Sentinel.lang.violations.commandBlockPlace.blockLocation, Sentinel.lang.violations.commandBlockPlace.blockLocationFormat.formatted(cb.getWorld().getName(), cb.getX(), cb.getY(), cb.getZ())); - String command = cb.getCommand(); - if (command.length() <= 128) { - violationInfo.addField(Sentinel.lang.violations.commandBlockPlace.insertedCommand, command); - } else { - violationInfo.addKeyValue(Sentinel.lang.violations.commandBlockPlace.insertedCommandUploadedTo, FileUtils.createCommandLog(command)); - } - root.addChild(violationInfo); - - return root; - } -} diff --git a/src/main/java/me/trouper/sentinel/server/events/CBUseEvent.java b/src/main/java/me/trouper/sentinel/server/events/CBUseEvent.java deleted file mode 100644 index 395a9be..0000000 --- a/src/main/java/me/trouper/sentinel/server/events/CBUseEvent.java +++ /dev/null @@ -1,80 +0,0 @@ -package me.trouper.sentinel.server.events; - -import io.github.itzispyder.pdk.events.CustomListener; -import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.server.functions.CBWhitelistManager; -import me.trouper.sentinel.server.functions.ViolationController; -import me.trouper.sentinel.utils.FileUtils; -import me.trouper.sentinel.utils.PlayerUtils; -import me.trouper.sentinel.utils.ServerUtils; -import me.trouper.sentinel.utils.trees.Node; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.CommandBlock; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerInteractEvent; - -public class CBUseEvent implements CustomListener { - - @EventHandler - private void onCMDBlockUse(PlayerInteractEvent e) { - //ServerUtils.verbose("CommandBlockUse: Detected Interaction"); - if (!Sentinel.violationConfig.commandBlockUse.enabled) return; - //ServerUtils.verbose("CommandBlockUse: Enabled"); - if (!e.getPlayer().isOp()) return; - //ServerUtils.verbose("CommandBlockUse: Player is op"); - if (e.getClickedBlock() == null) return; - //ServerUtils.verbose("CommandBlockUse: Block isn't null"); - Block b = e.getClickedBlock(); - if (!(b.getType() == Material.COMMAND_BLOCK || b.getType() == Material.REPEATING_COMMAND_BLOCK || b.getType() == Material.CHAIN_COMMAND_BLOCK)) return; - CommandBlock cb = (CommandBlock) b.getState(); - ServerUtils.verbose("CommandBlockUse: Block is a command block"); - Player p = e.getPlayer(); - if (PlayerUtils.isTrusted(p)) { - if (!CBWhitelistManager.autoWhitelist.contains(p.getUniqueId())) return; - if (CBWhitelistManager.canRun(cb.getBlock())) return; - e.setCancelled(true); - CBWhitelistManager.add(cb, p.getUniqueId()); - return; - } - ServerUtils.verbose("CommandBlockUse: Not trusted, performing action"); - e.setCancelled(true); - - Node log = getLog(p, (CommandBlock) b.getState()); - - ViolationController.handleViolation( - Sentinel.lang.violations.commandBlockUse.detectionChat.formatted(p.getName()), - Sentinel.violationConfig.commandBlockUse.punish, - Sentinel.violationConfig.commandBlockUse.deop, - Sentinel.violationConfig.commandBlockUse.logToDiscord, - p, - Sentinel.violationConfig.commandBlockUse.punishmentCommands, - log - ); - } - - private static Node getLog(Player p, CommandBlock cb) { - Node root = new Node("Sentinel"); - root.addTextLine(Sentinel.lang.violations.commandBlockUse.detectionTree); - - Node playerInfo = new Node(Sentinel.lang.violations.commandBlockUse.playerInfoTitle.formatted(p.getName())); - playerInfo.addKeyValue(Sentinel.lang.violations.commandBlockUse.uuid, p.getUniqueId().toString()); - playerInfo.addField(Sentinel.lang.violations.commandBlockUse.location, Sentinel.lang.violations.commandBlockUse.locationFormat.formatted(Math.round(p.getX()), Math.round(p.getY()), Math.round(p.getZ()))); - root.addChild(playerInfo); - - Node violationInfo = new Node(Sentinel.lang.violations.commandBlockUse.commandBlockUseInfoTitle); - violationInfo.addField(Sentinel.lang.violations.commandBlockUse.blockLocation, Sentinel.lang.violations.commandBlockUse.blockLocationFormat.formatted(cb.getWorld().getName(), cb.getX(), cb.getY(), cb.getZ())); - String command = cb.getCommand(); - if (command.length() <= 128) { - violationInfo.addField(Sentinel.lang.violations.commandBlockUse.commandInside, command); - } else { - violationInfo.addKeyValue(Sentinel.lang.violations.commandBlockUse.commandUploadedTo, FileUtils.createCommandLog(command)); - } - root.addChild(violationInfo); - - return root; - } - - -} diff --git a/src/main/java/me/trouper/sentinel/server/events/CommandBlockEdit.java b/src/main/java/me/trouper/sentinel/server/events/CommandBlockEdit.java new file mode 100644 index 0000000..d30bb1a --- /dev/null +++ b/src/main/java/me/trouper/sentinel/server/events/CommandBlockEdit.java @@ -0,0 +1,56 @@ +package me.trouper.sentinel.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.sentinel.Sentinel; +import me.trouper.sentinel.server.functions.helpers.AbstractViolation; +import me.trouper.sentinel.server.functions.helpers.ActionConfiguration; +import me.trouper.sentinel.server.functions.helpers.CBWhitelistManager; +import me.trouper.sentinel.utils.PlayerUtils; +import me.trouper.sentinel.utils.ServerUtils; +import me.trouper.sentinel.utils.trees.Node; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.block.CommandBlock; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityChangeBlockEvent; + +public class CommandBlockEdit extends AbstractViolation { + + @EventHandler + private void onCMDBlockChange(EntityChangeBlockEvent e) { + //ServerUtils.verbose("CommandBlockChange: Detected the event"); + if (!Sentinel.violationConfig.commandBlockEdit.enabled) return; + //ServerUtils.verbose("CommandBlockChange: Enabled"); + if (!(e.getEntity() instanceof Player p)) return; + //ServerUtils.verbose("CommandBlockChange: Changer is a player"); + Block b = e.getBlock(); + if (!(b.getType() == Material.COMMAND_BLOCK || b.getType() == Material.REPEATING_COMMAND_BLOCK || b.getType() == Material.CHAIN_COMMAND_BLOCK)) + return; + ServerUtils.verbose("CommandBlockChange: Block is a command block"); + CommandBlock cb = (CommandBlock) b.getState(); + if (PlayerUtils.isTrusted(p)) { + if (!CBWhitelistManager.autoWhitelist.contains(p.getUniqueId())) return; + CBWhitelistManager.add(cb, p.getUniqueId()); + return; + } + ServerUtils.verbose("CommandBlockChange: Not trusted, performing action"); + + ActionConfiguration.Builder config = new ActionConfiguration.Builder() + .setEvent(e) + .setPlayer(p) + .deop(Sentinel.violationConfig.commandBlockEdit.deop) + .cancel(true) + .punish(Sentinel.violationConfig.commandBlockEdit.punish) + .setPunishmentCommands(Sentinel.violationConfig.commandBlockEdit.punishmentCommands) + .logToDiscord(Sentinel.violationConfig.commandBlockEdit.logToDiscord); + + runActions( + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.edit, Sentinel.lang.violations.protections.rootName.commandBlock), + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.edit, Sentinel.lang.violations.protections.rootName.commandBlock), + generateCommandBlockInfo(cb), + config + ); + } +} diff --git a/src/main/java/me/trouper/sentinel/server/events/CommandBlockExecute.java b/src/main/java/me/trouper/sentinel/server/events/CommandBlockExecute.java new file mode 100644 index 0000000..5d4a391 --- /dev/null +++ b/src/main/java/me/trouper/sentinel/server/events/CommandBlockExecute.java @@ -0,0 +1,46 @@ +package me.trouper.sentinel.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.sentinel.Sentinel; +import me.trouper.sentinel.server.functions.helpers.AbstractViolation; +import me.trouper.sentinel.server.functions.helpers.ActionConfiguration; +import me.trouper.sentinel.server.functions.helpers.CBWhitelistManager; +import me.trouper.sentinel.utils.PlayerUtils; +import me.trouper.sentinel.utils.ServerUtils; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.CommandBlock; +import org.bukkit.command.BlockCommandSender; +import org.bukkit.event.EventHandler; +import org.bukkit.event.server.ServerCommandEvent; + +public class CommandBlockExecute extends AbstractViolation { + + @EventHandler + private void commandBlockExecute(ServerCommandEvent e) { + //ServerUtils.verbose("Handling command block event: " + e.getCommand()); + if (!Sentinel.violationConfig.commandBlockExecute.enabled) return; + //ServerUtils.verbose("Whitelist not disabled "); + if (!(e.getSender() instanceof BlockCommandSender s)) return; + //ServerUtils.verbose("Sender is command block"); + Block cmdBlock = s.getBlock(); + if (CBWhitelistManager.canRun(cmdBlock)) return; + ServerUtils.verbose("Command block can't run."); + + CommandBlock cb = (CommandBlock) cmdBlock.getState(); + + ActionConfiguration.Builder config = new ActionConfiguration.Builder() + .setBlock(cmdBlock) + .cancel(true) + .destroyBlock(Sentinel.violationConfig.commandBlockExecute.destroyBlock) + .restoreBlock(Sentinel.violationConfig.commandBlockExecute.attemptRestore) + .logToDiscord(Sentinel.violationConfig.commandBlockExecute.logToDiscord); + + runActions( + Sentinel.lang.violations.protections.rootName.rootNameFormat.formatted(Sentinel.lang.violations.protections.rootName.commandBlockWhitelist), + Sentinel.lang.violations.protections.rootName.rootNameFormat.formatted( Sentinel.lang.violations.protections.rootName.commandBlockWhitelist), + generateCommandBlockInfo(cb), + config + ); + } +} \ No newline at end of file diff --git a/src/main/java/me/trouper/sentinel/server/events/CommandBlockMinecartPlace.java b/src/main/java/me/trouper/sentinel/server/events/CommandBlockMinecartPlace.java new file mode 100644 index 0000000..35dc6f9 --- /dev/null +++ b/src/main/java/me/trouper/sentinel/server/events/CommandBlockMinecartPlace.java @@ -0,0 +1,55 @@ +package me.trouper.sentinel.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.sentinel.Sentinel; +import me.trouper.sentinel.server.functions.helpers.AbstractViolation; +import me.trouper.sentinel.server.functions.helpers.ActionConfiguration; +import me.trouper.sentinel.utils.PlayerUtils; +import me.trouper.sentinel.utils.ServerUtils; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEvent; + +public class CommandBlockMinecartPlace extends AbstractViolation { + + @EventHandler + private void onCMDMinecartPlace(PlayerInteractEvent e) { + //ServerUtils.verbose("MinecartCommandPlace: Detected interaction"); + if (!Sentinel.violationConfig.commandBlockMinecartPlace.enabled) return; + //ServerUtils.verbose("MinecartCommandPlace: Check is enabled"); + Player p = e.getPlayer(); + if (!p.isOp()) return; + //ServerUtils.verbose("MinecartCommandPlace: Player is op"); + if (e.getItem() == null) return; + ServerUtils.verbose("MinecartCommandPlace: Item isn't null"); + if (e.getClickedBlock() == null) return; + ServerUtils.verbose("MinecartCommandPlace: Clicked block isn't null"); + if (!e.getItem().getType().equals(Material.COMMAND_BLOCK_MINECART)) return; + ServerUtils.verbose("MinecartCommandPlace: Item is a minecart command"); + if (!(e.getClickedBlock().getType() == Material.RAIL || e.getClickedBlock().getType() == Material.POWERED_RAIL || e.getClickedBlock().getType() == Material.ACTIVATOR_RAIL || e.getClickedBlock().getType() == Material.DETECTOR_RAIL)) return; + ServerUtils.verbose("MinecartCommandPlace: Clicked block is a rail"); + if (PlayerUtils.isTrusted(p)) return; + ServerUtils.verbose("MinecartCommandPlace: Not trusted, performing action"); + + ActionConfiguration.Builder config = new ActionConfiguration.Builder() + .setEvent(e) + .setPlayer(p) + .cancel(true) + .punish(Sentinel.violationConfig.commandBlockMinecartPlace.punish) + .deop(Sentinel.violationConfig.commandBlockMinecartPlace.deop) + .setPunishmentCommands(Sentinel.violationConfig.commandBlockMinecartPlace.punishmentCommands) + .logToDiscord(Sentinel.violationConfig.commandBlockMinecartPlace.logToDiscord); + + // Remove the command block minecart from the player's inventory + p.getInventory().remove(Material.COMMAND_BLOCK_MINECART); + + runActions( + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.place, Sentinel.lang.violations.protections.rootName.minecartCommandBlock), + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.place, Sentinel.lang.violations.protections.rootName.minecartCommandBlock), + generateBlockInfo(e.getClickedBlock()), + config + ); + } +} \ No newline at end of file diff --git a/src/main/java/me/trouper/sentinel/server/events/CommandBlockMinecartUse.java b/src/main/java/me/trouper/sentinel/server/events/CommandBlockMinecartUse.java new file mode 100644 index 0000000..182f596 --- /dev/null +++ b/src/main/java/me/trouper/sentinel/server/events/CommandBlockMinecartUse.java @@ -0,0 +1,46 @@ +package me.trouper.sentinel.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.sentinel.Sentinel; +import me.trouper.sentinel.server.functions.helpers.AbstractViolation; +import me.trouper.sentinel.server.functions.helpers.ActionConfiguration; +import me.trouper.sentinel.utils.PlayerUtils; +import me.trouper.sentinel.utils.ServerUtils; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEntityEvent; + +public class CommandBlockMinecartUse extends AbstractViolation { + + @EventHandler + private void onCMDBlockMinecartUse(PlayerInteractEntityEvent e) { + //ServerUtils.verbose("MinecartCommandUse: Detected Interaction with entity"); + if (!Sentinel.violationConfig.commandBlockMinecartUse.enabled) return; + //ServerUtils.verbose("MinecartCommandUse: Enabled"); + Player p = e.getPlayer(); + if (!p.isOp()) return; + ServerUtils.verbose("MinecartCommandUse: Player op"); + if (e.getRightClicked().getType() != EntityType.COMMAND_BLOCK_MINECART) return; + ServerUtils.verbose("MinecartCommandUse: Entity is minecart command"); + if (PlayerUtils.isTrusted(p)) return; + ServerUtils.verbose("MinecartCommandUse: Not trusted, performing action"); + + ActionConfiguration.Builder config = new ActionConfiguration.Builder() + .setEvent(e) + .setPlayer(p) + .cancel(true) + .punish(Sentinel.violationConfig.commandBlockMinecartUse.punish) + .deop(Sentinel.violationConfig.commandBlockMinecartUse.deop) + .setPunishmentCommands(Sentinel.violationConfig.commandBlockMinecartUse.punishmentCommands) + .logToDiscord(Sentinel.violationConfig.commandBlockMinecartUse.logToDiscord); + + runActions( + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.use, Sentinel.lang.violations.protections.rootName.minecartCommandBlock), + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.use, Sentinel.lang.violations.protections.rootName.minecartCommandBlock), + generateMinecartInfo(e.getRightClicked()), + config + ); + } +} \ No newline at end of file diff --git a/src/main/java/me/trouper/sentinel/server/events/CommandBlockPlace.java b/src/main/java/me/trouper/sentinel/server/events/CommandBlockPlace.java new file mode 100644 index 0000000..12a2f1c --- /dev/null +++ b/src/main/java/me/trouper/sentinel/server/events/CommandBlockPlace.java @@ -0,0 +1,53 @@ +package me.trouper.sentinel.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.sentinel.Sentinel; +import me.trouper.sentinel.server.functions.helpers.AbstractViolation; +import me.trouper.sentinel.server.functions.helpers.ActionConfiguration; +import me.trouper.sentinel.utils.PlayerUtils; +import me.trouper.sentinel.utils.ServerUtils; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.CommandBlock; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.BlockPlaceEvent; + +public class CommandBlockPlace extends AbstractViolation { + + @EventHandler + public void listen(BlockPlaceEvent e) { + //ServerUtils.verbose("CommandBlockPlace: Detected block place"); + if (!Sentinel.violationConfig.commandBlockPlace.enabled) return; + //ServerUtils.verbose("CommandBlockPlace: Enabled"); + Player p = e.getPlayer(); + if (!p.isOp()) return; + //ServerUtils.verbose("CommandBlockPlace: Player is operator"); + Block b = e.getBlockPlaced(); + if (!(b.getType().equals(Material.COMMAND_BLOCK) || + b.getType().equals(Material.REPEATING_COMMAND_BLOCK) || + b.getType().equals(Material.CHAIN_COMMAND_BLOCK))) return; + ServerUtils.verbose("CommandBlockPlace: Block is a command block"); + CommandBlock cb = (CommandBlock) b.getState(); + if (PlayerUtils.isTrusted(p)) return; + ServerUtils.verbose("CommandBlockPlace: Not trusted, performing action"); + + + ActionConfiguration.Builder config = new ActionConfiguration.Builder() + .setEvent(e) + .setPlayer(p) + .deop(Sentinel.violationConfig.commandBlockPlace.deop) + .cancel(true) + .setEvent(e) + .punish(true) + .setPunishmentCommands(Sentinel.violationConfig.commandBlockPlace.punishmentCommands) + .logToDiscord(Sentinel.violationConfig.commandBlockPlace.logToDiscord); + + runActions( + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.place, Sentinel.lang.violations.protections.rootName.commandBlock), + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.place, Sentinel.lang.violations.protections.rootName.commandBlock), + generateCommandBlockInfo(cb), + config + ); + } +} diff --git a/src/main/java/me/trouper/sentinel/server/events/CommandBlockUse.java b/src/main/java/me/trouper/sentinel/server/events/CommandBlockUse.java new file mode 100644 index 0000000..978e3fe --- /dev/null +++ b/src/main/java/me/trouper/sentinel/server/events/CommandBlockUse.java @@ -0,0 +1,58 @@ +package me.trouper.sentinel.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.sentinel.Sentinel; +import me.trouper.sentinel.server.functions.helpers.AbstractViolation; +import me.trouper.sentinel.server.functions.helpers.ActionConfiguration; +import me.trouper.sentinel.server.functions.helpers.CBWhitelistManager; +import me.trouper.sentinel.utils.PlayerUtils; +import me.trouper.sentinel.utils.ServerUtils; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.CommandBlock; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEvent; + +public class CommandBlockUse extends AbstractViolation { + + @EventHandler + private void onCMDBlockUse(PlayerInteractEvent e) { + //ServerUtils.verbose("CommandBlockUse: Detected Interaction"); + if (!Sentinel.violationConfig.commandBlockUse.enabled) return; + //ServerUtils.verbose("CommandBlockUse: Enabled"); + Player p = e.getPlayer(); + if (!p.isOp()) return; + //ServerUtils.verbose("CommandBlockUse: Player is op"); + if (e.getClickedBlock() == null) return; + //ServerUtils.verbose("CommandBlockUse: Block isn't null"); + Block b = e.getClickedBlock(); + if (!(b.getType() == Material.COMMAND_BLOCK || b.getType() == Material.REPEATING_COMMAND_BLOCK || b.getType() == Material.CHAIN_COMMAND_BLOCK)) return; + CommandBlock cb = (CommandBlock) b.getState(); + ServerUtils.verbose("CommandBlockUse: Block is a command block"); + if (PlayerUtils.isTrusted(p)) { + if (!CBWhitelistManager.autoWhitelist.contains(p.getUniqueId())) return; + if (CBWhitelistManager.canRun(cb.getBlock())) return; + e.setCancelled(true); + CBWhitelistManager.add(cb, p.getUniqueId()); + return; + } + ServerUtils.verbose("CommandBlockUse: Not trusted, performing action"); + + ActionConfiguration.Builder config = new ActionConfiguration.Builder() + .setEvent(e) + .setPlayer(p) + .deop(Sentinel.violationConfig.commandBlockUse.deop) + .cancel(true) + .punish(Sentinel.violationConfig.commandBlockUse.punish) + .setPunishmentCommands(Sentinel.violationConfig.commandBlockUse.punishmentCommands) + .logToDiscord(Sentinel.violationConfig.commandBlockUse.logToDiscord); + + runActions( + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.use, Sentinel.lang.violations.protections.rootName.commandBlock), + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.use, Sentinel.lang.violations.protections.rootName.commandBlock), + generateCommandBlockInfo(cb), + config + ); + } +} \ No newline at end of file diff --git a/src/main/java/me/trouper/sentinel/server/events/CommandExecute.java b/src/main/java/me/trouper/sentinel/server/events/CommandExecute.java new file mode 100644 index 0000000..c7ac7ad --- /dev/null +++ b/src/main/java/me/trouper/sentinel/server/events/CommandExecute.java @@ -0,0 +1,101 @@ +package me.trouper.sentinel.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.sentinel.Sentinel; +import me.trouper.sentinel.server.functions.helpers.AbstractViolation; +import me.trouper.sentinel.server.functions.helpers.ActionConfiguration; +import me.trouper.sentinel.utils.PlayerUtils; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; + +import java.util.HashSet; +import java.util.Set; + +public class CommandExecute extends AbstractViolation { + + @EventHandler + private void onCommand(PlayerCommandPreprocessEvent e) { + Player p = e.getPlayer(); + if (PlayerUtils.isTrusted(p)) return; + String label = e.getMessage().substring(1).split(" ")[0]; + String args = e.getMessage(); + + Set status = getCommandStatus(label); + + if (status.contains("SPECIFIC") && Sentinel.violationConfig.commandExecute.specific.enabled) { + e.setCancelled(true); + ActionConfiguration.Builder config = new ActionConfiguration.Builder() + .setEvent(e) + .setPlayer(p) + .cancel(true) + .punish(Sentinel.violationConfig.commandExecute.specific.punish) + .setPunishmentCommands(Sentinel.violationConfig.commandExecute.specific.punishmentCommands) + .logToDiscord(Sentinel.violationConfig.commandExecute.specific.logToDiscord); + + runActions( + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.run, Sentinel.lang.violations.protections.rootName.specificCommand), + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.run, Sentinel.lang.violations.protections.rootName.specificCommand), + generateCommandInfo(args, p), + config + ); + return; + } + + if (status.contains("DANGEROUS") && Sentinel.violationConfig.commandExecute.dangerous.enabled) { + e.setCancelled(true); + ActionConfiguration.Builder config = new ActionConfiguration.Builder() + .setEvent(e) + .setPlayer(p) + .deop(Sentinel.violationConfig.commandExecute.dangerous.deop) + .cancel(true) + .punish(Sentinel.violationConfig.commandExecute.dangerous.punish) + .setPunishmentCommands(Sentinel.violationConfig.commandExecute.dangerous.punishmentCommands) + .logToDiscord(Sentinel.violationConfig.commandExecute.dangerous.logToDiscord); + + runActions( + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.run, Sentinel.lang.violations.protections.rootName.dangerousCommand), + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.run, Sentinel.lang.violations.protections.rootName.dangerousCommand), + generateCommandInfo(args, p), + config + ); + return; + } + + if (status.contains("LOGGED") && Sentinel.violationConfig.commandExecute.logged.enabled) { + ActionConfiguration.Builder config = new ActionConfiguration.Builder() + .setPlayer(p) + .logToDiscord(Sentinel.violationConfig.commandExecute.logged.logToDiscord); + + runActions( + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.run, Sentinel.lang.violations.protections.rootName.loggedCommand), + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.run, Sentinel.lang.violations.protections.rootName.loggedCommand), + generateCommandInfo(args, p), + config + ); + return; + } + } + + public static Set getCommandStatus(String label) { + Set commandTypes = new HashSet<>(); + + if (label.startsWith("/")) { + label = label.substring(1); + } + + if (label.contains(":")) { + commandTypes.add("SPECIFIC"); + } + + for (String loggedCommand : Sentinel.violationConfig.commandExecute.logged.commands) { + if (loggedCommand.equals(label)) commandTypes.add("LOGGED"); + } + + for (String dangerousCommand : Sentinel.violationConfig.commandExecute.dangerous.commands) { + if (dangerousCommand.equals(label)) commandTypes.add("DANGEROUS"); + } + + return commandTypes; + } +} \ No newline at end of file diff --git a/src/main/java/me/trouper/sentinel/server/events/CommandExecuteEvent.java b/src/main/java/me/trouper/sentinel/server/events/CommandExecuteEvent.java deleted file mode 100644 index 2b44c69..0000000 --- a/src/main/java/me/trouper/sentinel/server/events/CommandExecuteEvent.java +++ /dev/null @@ -1,115 +0,0 @@ -package me.trouper.sentinel.server.events; - -import io.github.itzispyder.pdk.events.CustomListener; -import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.server.functions.ViolationController; -import me.trouper.sentinel.utils.FileUtils; -import me.trouper.sentinel.utils.PlayerUtils; -import me.trouper.sentinel.utils.trees.Node; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; - -import java.util.HashSet; -import java.util.Set; - -public class CommandExecuteEvent implements CustomListener { - @EventHandler - private void onCommand(PlayerCommandPreprocessEvent e) { - Player p = e.getPlayer(); - if (PlayerUtils.isTrusted(p)) return; - String label = e.getMessage().substring(1).split(" ")[0]; - String args = e.getMessage(); - - Set status = getCommandStatus(label); - - if (status.contains("SPECIFIC") && Sentinel.violationConfig.commandExecute.specific.enabled) { - e.setCancelled(true); - Node log = getLog(p, args, "specific"); - ViolationController.handleViolation( - Sentinel.lang.violations.commandExecute.specificCommandViolation.formatted(p.getName()), - Sentinel.violationConfig.commandExecute.specific.punish, - false, - Sentinel.violationConfig.commandExecute.specific.logToDiscord, - p, - Sentinel.violationConfig.commandExecute.specific.punishmentCommands, - log - ); - return; - } - - if (status.contains("DANGEROUS") && Sentinel.violationConfig.commandExecute.dangerous.enabled) { - e.setCancelled(true); - Node log = getLog(p, args, "dangerous"); - ViolationController.handleViolation( - Sentinel.lang.violations.commandExecute.dangerousCommandViolation.formatted(p.getName()), - Sentinel.violationConfig.commandExecute.dangerous.punish, - Sentinel.violationConfig.commandExecute.dangerous.deop, - Sentinel.violationConfig.commandExecute.dangerous.logToDiscord, - p, - Sentinel.violationConfig.commandExecute.dangerous.punishmentCommands, - log - ); - return; - } - - if (status.contains("LOGGED") && Sentinel.violationConfig.commandExecute.logged.enabled) { - Node log = getLog(p, args, "logged"); - ViolationController.handleViolation( - Sentinel.lang.violations.commandExecute.loggedCommandViolation.formatted(p.getName()), - false, - false, - Sentinel.violationConfig.commandExecute.logged.logToDiscord, - p, - null, - log - ); - return; - } - } - - public static Set getCommandStatus(String label) { - Set commandTypes = new HashSet<>(); - - if (label.startsWith("/")) { - label = label.substring(1); - } - - if (label.contains(":")) { - commandTypes.add("SPECIFIC"); - } - - for (String loggedCommand : Sentinel.violationConfig.commandExecute.logged.commands) { - if (loggedCommand.equals(label)) commandTypes.add("LOGGED"); - } - - for (String dangerousCommand : Sentinel.violationConfig.commandExecute.dangerous.commands) { - if (dangerousCommand.equals(label)) commandTypes.add("DANGEROUS"); - } - - return commandTypes; - } - - private Node getLog(Player p, String command, String status) { - Node root = new Node("Sentinel"); - root.addTextLine(Sentinel.lang.violations.commandExecute.specificCommandDetection.formatted(status)); - - Node playerInfo = new Node(Sentinel.lang.violations.commandExecute.playerInfoTitle.formatted(p.getName())); - playerInfo.addKeyValue(Sentinel.lang.violations.commandExecute.uuid, p.getUniqueId().toString()); - playerInfo.addField(Sentinel.lang.violations.commandExecute.location, Sentinel.lang.violations.commandExecute.locationFormat.formatted(Math.round(p.getX()), Math.round(p.getY()), Math.round(p.getZ()))); - root.addChild(playerInfo); - - Node violationInfo = new Node(Sentinel.lang.violations.commandExecute.violationInfoTitle); - if (command.length() <= 128) { - violationInfo.addField(Sentinel.lang.violations.commandExecute.commandField, command); - } else { - violationInfo.addKeyValue(Sentinel.lang.violations.commandExecute.commandUploadedTo, FileUtils.createCommandLog(command)); - } - root.addChild(violationInfo); - - return root; - } - - - -} diff --git a/src/main/java/me/trouper/sentinel/server/events/CreativeHotbar.java b/src/main/java/me/trouper/sentinel/server/events/CreativeHotbar.java new file mode 100644 index 0000000..edfd979 --- /dev/null +++ b/src/main/java/me/trouper/sentinel/server/events/CreativeHotbar.java @@ -0,0 +1,52 @@ +package me.trouper.sentinel.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.sentinel.Sentinel; +import me.trouper.sentinel.server.functions.helpers.AbstractViolation; +import me.trouper.sentinel.server.functions.helpers.ActionConfiguration; +import me.trouper.sentinel.utils.ItemUtils; +import me.trouper.sentinel.utils.PlayerUtils; +import me.trouper.sentinel.utils.ServerUtils; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.inventory.InventoryCreativeEvent; +import org.bukkit.inventory.ItemStack; + +public class CreativeHotbar extends AbstractViolation { + + @EventHandler + private void onNBTPull(InventoryCreativeEvent e) { + //ServerUtils.verbose("NBT: Detected creative mode action"); + if (!Sentinel.violationConfig.creativeHotbarAction.enabled) return; + ServerUtils.verbose("NBT: Enabled"); + if (!(e.getWhoClicked() instanceof Player p)) return; + ServerUtils.verbose("NBT: Clicker is a player"); + if (e.getCursor() == null) return; // Well it threw an exception during testing, so it isn't always false! + ServerUtils.verbose("NBT: Cursor isn't null"); + ItemStack i = e.getCursor(); + if (PlayerUtils.isTrusted(p)) return; + ServerUtils.verbose("NBT: Not trusted"); + if (e.getCursor().getItemMeta() == null) return; + ServerUtils.verbose("NBT: Cursor has meta"); + if (!(i.hasItemMeta() && i.getItemMeta() != null)) return; + ServerUtils.verbose("NBT: Item has meta"); + if (ItemUtils.itemPasses(i)) return; + ServerUtils.verbose("NBT: Item doesn't pass, performing action"); + + ActionConfiguration.Builder config = new ActionConfiguration.Builder() + .setEvent(e) + .setPlayer(p) + .cancel(true) + .punish(Sentinel.violationConfig.creativeHotbarAction.punish) + .deop(Sentinel.violationConfig.creativeHotbarAction.deop) + .setPunishmentCommands(Sentinel.violationConfig.creativeHotbarAction.punishmentCommands) + .logToDiscord(Sentinel.violationConfig.creativeHotbarAction.logToDiscord); + + runActions( + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.grab, Sentinel.lang.violations.protections.rootName.nbtItem), + Sentinel.lang.violations.protections.rootName.rootNameFormatPlayer.formatted(p.getName(), Sentinel.lang.violations.protections.rootName.grab, Sentinel.lang.violations.protections.rootName.nbtItem), + generateItemInfo(i), + config + ); + } +} \ No newline at end of file diff --git a/src/main/java/me/trouper/sentinel/server/events/CreativeHotbarEvent.java b/src/main/java/me/trouper/sentinel/server/events/CreativeHotbarEvent.java deleted file mode 100644 index aa942da..0000000 --- a/src/main/java/me/trouper/sentinel/server/events/CreativeHotbarEvent.java +++ /dev/null @@ -1,65 +0,0 @@ -package me.trouper.sentinel.server.events; - -import io.github.itzispyder.pdk.events.CustomListener; -import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.server.functions.ViolationController; -import me.trouper.sentinel.utils.FileUtils; -import me.trouper.sentinel.utils.ItemUtils; -import me.trouper.sentinel.utils.PlayerUtils; -import me.trouper.sentinel.utils.ServerUtils; -import me.trouper.sentinel.utils.trees.Node; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.inventory.InventoryCreativeEvent; -import org.bukkit.inventory.ItemStack; - -public class CreativeHotbarEvent implements CustomListener { - - @EventHandler - private void onNBTPull(InventoryCreativeEvent e) { - //ServerUtils.verbose("NBT: Detected creative mode action"); - if (!Sentinel.violationConfig.creativeHotbarAction.enabled) return; - ServerUtils.verbose("NBT: Enabled"); - if (!(e.getWhoClicked() instanceof Player p)) return; - ServerUtils.verbose("NBT: Clicker is a player"); - if (e.getCursor() == null) return; // Well it through an exception during testing, so it isn't always false! - ServerUtils.verbose("NBT: Cursor isn't null"); - ItemStack i = e.getCursor(); - if (PlayerUtils.isTrusted(p)) return; - ServerUtils.verbose("NBT: Not trusted"); - if (e.getCursor().getItemMeta() == null) return; - ServerUtils.verbose("NBT: Cursor has meta"); - if (!(i.hasItemMeta() && i.getItemMeta() != null)) return; - ServerUtils.verbose("NBT: Item has meta"); - if (ItemUtils.itemPasses(i)) return; - ServerUtils.verbose("NBT: Item doesn't pass, performing action"); - e.setCancelled(true); - Node root = getLog(p, i); - - ViolationController.handleViolation( - Sentinel.lang.violations.creativeHotbar.nbtAttemptViolation.formatted(p.getName()), - Sentinel.violationConfig.creativeHotbarAction.punish, - Sentinel.violationConfig.creativeHotbarAction.deop, - Sentinel.violationConfig.creativeHotbarAction.logToDiscord, - p, - Sentinel.violationConfig.creativeHotbarAction.punishmentCommands, - root - ); - } - - private static Node getLog(Player p, ItemStack item) { - Node root = new Node("Sentinel"); - root.addTextLine(Sentinel.lang.violations.creativeHotbar.nbtAttemptDetection); - - Node playerInfo = new Node(Sentinel.lang.violations.creativeHotbar.playerInfoTitle.formatted(p.getName())); - playerInfo.addKeyValue(Sentinel.lang.violations.creativeHotbar.uuid, p.getUniqueId().toString()); - playerInfo.addField(Sentinel.lang.violations.creativeHotbar.location, Sentinel.lang.violations.creativeHotbar.locationFormat.formatted(Math.round(p.getX()), Math.round(p.getY()), Math.round(p.getZ()))); - root.addChild(playerInfo); - - Node violationInfo = new Node(Sentinel.lang.violations.creativeHotbar.itemInfoTitle); - violationInfo.addKeyValue(Sentinel.lang.violations.creativeHotbar.itemType, item.getType().toString()); - violationInfo.addField(Sentinel.lang.violations.creativeHotbar.nbtUpload, FileUtils.createNBTLog(item)); - root.addChild(violationInfo); - return root; - } -} diff --git a/src/main/java/me/trouper/sentinel/server/functions/ViolationController.java b/src/main/java/me/trouper/sentinel/server/functions/ViolationController.java deleted file mode 100644 index 444110e..0000000 --- a/src/main/java/me/trouper/sentinel/server/functions/ViolationController.java +++ /dev/null @@ -1,50 +0,0 @@ -package me.trouper.sentinel.server.functions; - -import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.utils.PlayerUtils; -import me.trouper.sentinel.utils.ServerUtils; -import me.trouper.sentinel.utils.Text; -import me.trouper.sentinel.utils.trees.ConsoleFormatter; -import me.trouper.sentinel.utils.trees.EmbedFormatter; -import me.trouper.sentinel.utils.trees.HoverFormatter; -import me.trouper.sentinel.utils.trees.Node; -import net.kyori.adventure.text.Component; -import org.bukkit.entity.Player; - -import java.util.List; - -public class ViolationController { - - - public static void handleViolation(String message, boolean punish, boolean deopUser, boolean logToDiscord, Player perp, List punishCommands, Node tree) { - Node actions = new Node(Sentinel.lang.violations.violationMessages.actions); - actions.addTextLine(Sentinel.lang.violations.violationMessages.eventCancelled); - - if (punish) { - for (String punishCommand : punishCommands) { - ServerUtils.sendCommand(punishCommand.replaceAll("%player%", perp.getName())); - } - actions.addTextLine(Sentinel.lang.violations.violationMessages.punishmentCommandsExecuted); - } - - if (deopUser) { - perp.setOp(false); - actions.addTextLine(Sentinel.lang.violations.violationMessages.userOpStripped); - } - - if (logToDiscord) actions.addTextLine(Sentinel.lang.violations.violationMessages.loggedToDiscord); - tree.addChild(actions); - - if (logToDiscord) { - EmbedFormatter.sendEmbed(EmbedFormatter.format(tree)); - } - - ServerUtils.forEachPlayer(trusted -> { - if (PlayerUtils.isTrusted(trusted)) { - trusted.sendMessage(Component.text(Text.prefix(message)).hoverEvent(Component.text(HoverFormatter.format(tree)).asHoverEvent())); - } - }); - - Sentinel.log.info(ConsoleFormatter.format(tree)); - } -} diff --git a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/AbstractActionHandler.java b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/AbstractActionHandler.java index d0a76d2..8c70761 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/AbstractActionHandler.java +++ b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/AbstractActionHandler.java @@ -2,6 +2,8 @@ package me.trouper.sentinel.server.functions.chatfilter; import io.github.itzispyder.pdk.utils.discord.DiscordEmbed; import me.trouper.sentinel.Sentinel; +import me.trouper.sentinel.server.functions.helpers.FalsePositiveReporting; +import me.trouper.sentinel.server.functions.helpers.FilterHelpers; import me.trouper.sentinel.utils.trees.ConsoleFormatter; import me.trouper.sentinel.utils.trees.EmbedFormatter; import me.trouper.sentinel.utils.trees.Node; @@ -19,10 +21,11 @@ public abstract class AbstractActionHandler { punish(response); discordNotification(tree); } - staffWarning(response, tree); if (shouldWarnPlayer(response)) { playerWarning(response); } + + staffWarning(response, tree); consoleLog(tree); } diff --git a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/FilterResponse.java b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/FilterResponse.java index ee5d572..ef075f8 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/FilterResponse.java +++ b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/FilterResponse.java @@ -1,6 +1,7 @@ package me.trouper.sentinel.server.functions.chatfilter; import io.papermc.paper.event.player.AsyncChatEvent; +import me.trouper.sentinel.server.functions.helpers.Report; import org.bukkit.entity.Player; public interface FilterResponse { diff --git a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/profanity/ProfanityAction.java b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/profanity/ProfanityAction.java index 8809b29..1c803de 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/profanity/ProfanityAction.java +++ b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/profanity/ProfanityAction.java @@ -53,20 +53,20 @@ public class ProfanityAction extends AbstractActionHandler { Node root = new Node("Sentinel"); root.addTextLine(Sentinel.lang.violations.chat.profanity.treeTitle); - Node playerInfo = new Node(Sentinel.lang.violations.chat.profanity.playerInfoTitle.formatted(response.getPlayer().getName())); - playerInfo.addKeyValue(Sentinel.lang.violations.chat.profanity.uuid, response.getPlayer().getUniqueId().toString()); + Node playerInfo = new Node(Sentinel.lang.violations.protections.infoNode.playerInfo.formatted(response.getPlayer().getName())); + playerInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.uuid, response.getPlayer().getUniqueId().toString()); playerInfo.addKeyValue(Sentinel.lang.violations.chat.profanity.score, "%s/%s".formatted(ProfanityFilter.scoreMap.getOrDefault(response.getPlayer().getUniqueId(),0),Sentinel.mainConfig.chat.profanityFilter.punishScore)); root.addChild(playerInfo); Node reportInfo = new Node(Sentinel.lang.violations.chat.profanity.reportInfoTitle); - reportInfo.addField(Sentinel.lang.violations.chat.profanity.originalMessage, response.getOriginalMessage()); + reportInfo.addField(Sentinel.lang.violations.chat.originalMessage, response.getOriginalMessage()); reportInfo.addField(Sentinel.lang.violations.chat.profanity.processedMessage, response.getProcessedMessage()); reportInfo.addKeyValue(Sentinel.lang.violations.chat.profanity.severity, response.getSeverity().toString()); root.addChild(reportInfo); - Node actions = new Node(Sentinel.lang.violations.chat.profanity.actionTitle); - actions.addTextLine(Sentinel.lang.violations.chat.profanity.blockAction); - if (response.isPunished()) actions.addTextLine(Sentinel.lang.violations.chat.profanity.commandAction); + Node actions = new Node(Sentinel.lang.violations.protections.actionNode.actionNodeTitle); + actions.addTextLine(Sentinel.lang.violations.chat.denyMessage); + if (response.isPunished()) actions.addTextLine(Sentinel.lang.violations.protections.actionNode.punishmentCommandsExecuted); root.addChild(actions); return root; diff --git a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/profanity/ProfanityResponse.java b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/profanity/ProfanityResponse.java index 1775d53..b40737e 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/profanity/ProfanityResponse.java +++ b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/profanity/ProfanityResponse.java @@ -2,15 +2,14 @@ package me.trouper.sentinel.server.functions.chatfilter.profanity; import io.papermc.paper.event.player.AsyncChatEvent; import me.trouper.sentinel.data.Emojis; -import me.trouper.sentinel.server.functions.chatfilter.FalsePositiveReporting; -import me.trouper.sentinel.server.functions.chatfilter.FilterHelpers; +import me.trouper.sentinel.server.functions.helpers.FalsePositiveReporting; +import me.trouper.sentinel.server.functions.helpers.FilterHelpers; import me.trouper.sentinel.server.functions.chatfilter.FilterResponse; -import me.trouper.sentinel.server.functions.chatfilter.Report; +import me.trouper.sentinel.server.functions.helpers.Report; import me.trouper.sentinel.utils.ServerUtils; import me.trouper.sentinel.utils.Text; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.entity.Player; -import org.bukkit.event.player.AsyncPlayerChatEvent; public class ProfanityResponse implements FilterResponse { diff --git a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/spam/SpamAction.java b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/spam/SpamAction.java index 6cb9398..c6a4792 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/spam/SpamAction.java +++ b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/spam/SpamAction.java @@ -48,8 +48,8 @@ public class SpamAction extends AbstractActionHandler { Node root = new Node("Sentinel"); root.addTextLine(Sentinel.lang.violations.chat.spam.treeTitle); - Node playerInfo = new Node(Sentinel.lang.violations.chat.spam.playerInfoTitle.formatted(response.getEvent().getPlayer().getName())); - playerInfo.addKeyValue(Sentinel.lang.violations.chat.spam.uuid, response.getEvent().getPlayer().getUniqueId().toString()); + Node playerInfo = new Node(Sentinel.lang.violations.protections.infoNode.playerInfo.formatted(response.getEvent().getPlayer().getName())); + playerInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.uuid, response.getEvent().getPlayer().getUniqueId().toString()); playerInfo.addKeyValue(Sentinel.lang.violations.chat.spam.heat, "%s/%s".formatted(SpamFilter.heatMap.get(response.getEvent().getPlayer().getUniqueId()),Sentinel.mainConfig.chat.spamFilter.punishHeat)); root.addChild(playerInfo); @@ -59,9 +59,9 @@ public class SpamAction extends AbstractActionHandler { reportInfo.addKeyValue(Sentinel.lang.violations.chat.spam.similarity, "%s/%s".formatted((int) Math.round(response.getSimilarity()),Sentinel.mainConfig.chat.spamFilter.blockSimilarity)); root.addChild(reportInfo); - Node actions = new Node(Sentinel.lang.violations.chat.spam.actionTitle); - actions.addTextLine(Sentinel.lang.violations.chat.spam.blockAction); - if (response.isPunished()) actions.addTextLine(Sentinel.lang.violations.chat.spam.commandAction); + Node actions = new Node(Sentinel.lang.violations.protections.actionNode.actionNodeTitle); + actions.addTextLine(Sentinel.lang.violations.chat.denyMessage); + if (response.isPunished()) actions.addTextLine(Sentinel.lang.violations.protections.actionNode.punishmentCommandsExecuted); root.addChild(actions); return root; diff --git a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/spam/SpamResponse.java b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/spam/SpamResponse.java index 45d6ec1..96098e3 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/spam/SpamResponse.java +++ b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/spam/SpamResponse.java @@ -3,14 +3,13 @@ package me.trouper.sentinel.server.functions.chatfilter.spam; import io.github.retrooper.packetevents.adventure.serializer.legacy.LegacyComponentSerializer; import io.papermc.paper.event.player.AsyncChatEvent; import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.server.functions.chatfilter.FalsePositiveReporting; +import me.trouper.sentinel.server.functions.helpers.FalsePositiveReporting; import me.trouper.sentinel.server.functions.chatfilter.FilterResponse; -import me.trouper.sentinel.server.functions.chatfilter.Report; +import me.trouper.sentinel.server.functions.helpers.Report; import me.trouper.sentinel.utils.MathUtils; import me.trouper.sentinel.utils.ServerUtils; import me.trouper.sentinel.utils.Text; import org.bukkit.entity.Player; -import org.bukkit.event.player.AsyncPlayerChatEvent; import static me.trouper.sentinel.server.functions.chatfilter.spam.SpamFilter.lastMessageMap; diff --git a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/unicode/UnicodeAction.java b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/unicode/UnicodeAction.java index b80bc88..a5c5243 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/unicode/UnicodeAction.java +++ b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/unicode/UnicodeAction.java @@ -45,18 +45,18 @@ public class UnicodeAction extends AbstractActionHandler { Node root = new Node("Sentinel"); root.addTextLine(Sentinel.lang.violations.chat.unicode.treeTitle); - Node playerInfo = new Node(Sentinel.lang.violations.chat.unicode.playerInfoTitle.formatted(response.getPlayer().getName())); - playerInfo.addKeyValue(Sentinel.lang.violations.chat.unicode.uuid, response.getPlayer().getUniqueId().toString()); + Node playerInfo = new Node(Sentinel.lang.violations.protections.infoNode.playerInfo.formatted(response.getPlayer().getName())); + playerInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.uuid, response.getPlayer().getUniqueId().toString()); root.addChild(playerInfo); Node reportInfo = new Node(Sentinel.lang.violations.chat.unicode.reportInfoTitle); - reportInfo.addField(Sentinel.lang.violations.chat.unicode.originalMessage, response.getOriginalMessage()); - reportInfo.addField(Sentinel.lang.violations.chat.unicode.highlightedMessage, response.getHighlightedMessage()); + reportInfo.addField(Sentinel.lang.violations.chat.originalMessage, response.getOriginalMessage()); + reportInfo.addField(Sentinel.lang.violations.chat.highlightedMessage, response.getHighlightedMessage()); root.addChild(reportInfo); - Node actions = new Node(Sentinel.lang.violations.chat.unicode.actionTitle); - actions.addTextLine(Sentinel.lang.violations.chat.unicode.blockAction); - if (response.isPunished()) actions.addTextLine(Sentinel.lang.violations.chat.unicode.commandAction); + Node actions = new Node(Sentinel.lang.violations.protections.actionNode.actionNodeTitle); + actions.addTextLine(Sentinel.lang.violations.chat.denyMessage); + if (response.isPunished()) actions.addTextLine(Sentinel.lang.violations.protections.actionNode.punishmentCommandsExecuted); root.addChild(actions); return root; diff --git a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/unicode/UnicodeResponse.java b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/unicode/UnicodeResponse.java index fec2e61..419350d 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/unicode/UnicodeResponse.java +++ b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/unicode/UnicodeResponse.java @@ -4,9 +4,9 @@ import io.github.retrooper.packetevents.adventure.serializer.legacy.LegacyCompon import io.papermc.paper.event.player.AsyncChatEvent; import me.trouper.sentinel.Sentinel; import me.trouper.sentinel.data.Emojis; -import me.trouper.sentinel.server.functions.chatfilter.FalsePositiveReporting; +import me.trouper.sentinel.server.functions.helpers.FalsePositiveReporting; import me.trouper.sentinel.server.functions.chatfilter.FilterResponse; -import me.trouper.sentinel.server.functions.chatfilter.Report; +import me.trouper.sentinel.server.functions.helpers.Report; import me.trouper.sentinel.utils.ServerUtils; import me.trouper.sentinel.utils.Text; import org.bukkit.entity.Player; diff --git a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/url/UrlAction.java b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/url/UrlAction.java index 7b2fcdb..9d71d10 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/url/UrlAction.java +++ b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/url/UrlAction.java @@ -45,18 +45,18 @@ public class UrlAction extends AbstractActionHandler { Node root = new Node("Sentinel"); root.addTextLine(Sentinel.lang.violations.chat.url.treeTitle); - Node playerInfo = new Node(Sentinel.lang.violations.chat.url.playerInfoTitle.formatted(response.getPlayer().getName())); - playerInfo.addKeyValue(Sentinel.lang.violations.chat.url.uuid, response.getPlayer().getUniqueId().toString()); + Node playerInfo = new Node(Sentinel.lang.violations.protections.infoNode.playerInfo.formatted(response.getPlayer().getName())); + playerInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.uuid, response.getPlayer().getUniqueId().toString()); root.addChild(playerInfo); Node reportInfo = new Node(Sentinel.lang.violations.chat.url.reportInfoTitle); - reportInfo.addField(Sentinel.lang.violations.chat.url.originalMessage, response.getOriginalMessage()); - reportInfo.addField(Sentinel.lang.violations.chat.url.highlightedMessage, response.getHighlightedMessage()); + reportInfo.addField(Sentinel.lang.violations.chat.originalMessage, response.getOriginalMessage()); + reportInfo.addField(Sentinel.lang.violations.chat.highlightedMessage, response.getHighlightedMessage()); root.addChild(reportInfo); - Node actions = new Node(Sentinel.lang.violations.chat.url.actionTitle); - actions.addTextLine(Sentinel.lang.violations.chat.url.blockAction); - if (response.isPunished()) actions.addTextLine(Sentinel.lang.violations.chat.url.commandAction); + Node actions = new Node(Sentinel.lang.violations.protections.actionNode.actionNodeTitle); + actions.addTextLine(Sentinel.lang.violations.chat.denyMessage); + if (response.isPunished()) actions.addTextLine(Sentinel.lang.violations.protections.actionNode.punishmentCommandsExecuted); root.addChild(actions); return root; diff --git a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/url/UrlResponse.java b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/url/UrlResponse.java index 82b8269..10c4c64 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/url/UrlResponse.java +++ b/src/main/java/me/trouper/sentinel/server/functions/chatfilter/url/UrlResponse.java @@ -4,10 +4,9 @@ import io.github.retrooper.packetevents.adventure.serializer.legacy.LegacyCompon import io.papermc.paper.event.player.AsyncChatEvent; import me.trouper.sentinel.Sentinel; import me.trouper.sentinel.data.Emojis; -import me.trouper.sentinel.server.functions.chatfilter.FalsePositiveReporting; +import me.trouper.sentinel.server.functions.helpers.FalsePositiveReporting; import me.trouper.sentinel.server.functions.chatfilter.FilterResponse; -import me.trouper.sentinel.server.functions.chatfilter.Report; -import me.trouper.sentinel.server.functions.chatfilter.unicode.UnicodeResponse; +import me.trouper.sentinel.server.functions.helpers.Report; import me.trouper.sentinel.utils.ServerUtils; import me.trouper.sentinel.utils.Text; import org.bukkit.entity.Player; diff --git a/src/main/java/me/trouper/sentinel/server/functions/helpers/AbstractViolation.java b/src/main/java/me/trouper/sentinel/server/functions/helpers/AbstractViolation.java new file mode 100644 index 0000000..65979a4 --- /dev/null +++ b/src/main/java/me/trouper/sentinel/server/functions/helpers/AbstractViolation.java @@ -0,0 +1,133 @@ +package me.trouper.sentinel.server.functions.helpers; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.sentinel.Sentinel; +import me.trouper.sentinel.utils.FileUtils; +import me.trouper.sentinel.utils.PlayerUtils; +import me.trouper.sentinel.utils.ServerUtils; +import me.trouper.sentinel.utils.Text; +import me.trouper.sentinel.utils.trees.ConsoleFormatter; +import me.trouper.sentinel.utils.trees.EmbedFormatter; +import me.trouper.sentinel.utils.trees.HoverFormatter; +import me.trouper.sentinel.utils.trees.Node; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.block.Block; +import org.bukkit.block.CommandBlock; +import org.bukkit.command.Command; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.concurrent.atomic.AtomicReference; + +public abstract class AbstractViolation implements CustomListener { + + public void runActions(String rootName, String rootNamePlayer, Node violationInfo, ActionConfiguration.Builder configuration) { + ActionConfiguration config = configuration.build(); + + Node root = new Node("Sentinel"); + root.addTextLine(rootName); + + if (config.getPlayer() != null) root.addChild(generatePlayerInfo(config.getPlayer())); + + root.addChild(violationInfo); + + root.addChild(configuration.getActionNode()); + + notifyTrusted(root,(rootNamePlayer == null || rootNamePlayer.isBlank()) ? rootName : rootNamePlayer); + if (configuration.isLoggedToDiscord()) EmbedFormatter.sendEmbed(EmbedFormatter.format(root)); + Sentinel.log.info(ConsoleFormatter.format(root)); + } + + public void notifyTrusted(Node root, String rootNamePlayer) { + ServerUtils.forEachPlayer(trusted -> { + if (PlayerUtils.isTrusted(trusted)) { + trusted.sendMessage(Component.text(Text.prefix(rootNamePlayer)).hoverEvent(Component.text(HoverFormatter.format(root)).asHoverEvent())); + } + }); + } + + public Node generatePlayerInfo(Player p) { + Node playerInfo = new Node(Sentinel.lang.violations.protections.infoNode.playerInfo); + playerInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.name, p.getName()); + playerInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.uuid, p.getUniqueId().toString()); + playerInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.operator, p.isOp() ? Sentinel.lang.generic.yes : Sentinel.lang.generic.no); + playerInfo.addField(Sentinel.lang.violations.protections.infoNode.locationField, Sentinel.lang.violations.protections.infoNode.locationFormat.formatted(Math.round(p.getX()), Math.round(p.getY()), Math.round(p.getZ()))); + + return playerInfo; + } + + public static Node generateBlockInfo(Block block) { + Node blockInfo = new Node(Sentinel.lang.violations.protections.infoNode.blockInfo); + blockInfo.addTextLine(Text.cleanName(block.getType().toString())); + blockInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.worldField,block.getWorld().getName()); + blockInfo.addField(Sentinel.lang.violations.protections.infoNode.blockLocationField,Sentinel.lang.violations.protections.infoNode.locationFormat.formatted(block.getX(), block.getY(), block.getZ())); + + return blockInfo; + } + + public Node generateCommandBlockInfo(CommandBlock commandBlock) { + Node commandBlockInfo = new Node(Sentinel.lang.violations.protections.infoNode.blockInfo); + commandBlockInfo.addTextLine(Text.cleanName(commandBlock.getType().toString())); + commandBlockInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.worldField,commandBlock.getWorld().getName()); + commandBlockInfo.addField(Sentinel.lang.violations.protections.infoNode.blockLocationField,Sentinel.lang.violations.protections.infoNode.locationFormat.formatted(commandBlock.getX(), commandBlock.getY(), commandBlock.getZ())); + + String command = commandBlock.getCommand(); + if (command == null || command.isBlank()) { + return commandBlockInfo; + } else if (command.length() <= 128) { + commandBlockInfo.addField(Sentinel.lang.violations.protections.infoNode.commandField, command); + } else { + commandBlockInfo.addField(Sentinel.lang.violations.protections.infoNode.commandTooLargeField, FileUtils.createCommandLog(command)); + } + + return commandBlockInfo; + } + + public Node generateMinecartInfo(Entity entity) { + Node minecartInfo = new Node(Sentinel.lang.violations.protections.infoNode.minecartInfo); + minecartInfo.addTextLine(Text.cleanName(entity.getType().toString())); + minecartInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.worldField,entity.getWorld().getName()); + minecartInfo.addField(Sentinel.lang.violations.protections.infoNode.cartLocationField,Sentinel.lang.violations.protections.infoNode.locationFormat.formatted(Math.round(entity.getX()), Math.round(entity.getY()), Math.round(entity.getZ()))); + + return minecartInfo; + } + + public Node generateItemInfo(ItemStack item) { + Node itemInfo = new Node(Sentinel.lang.violations.protections.infoNode.itemInfo); + itemInfo.addTextLine(Text.cleanName(item.getType().toString())); + itemInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.hasMeta,item.hasItemMeta() ? Sentinel.lang.generic.yes : Sentinel.lang.generic.no); + if (item.hasItemMeta()) { + itemInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.hasName,item.getItemMeta().hasCustomName() ? Sentinel.lang.generic.yes : Sentinel.lang.generic.no); + itemInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.hasLore,item.getItemMeta().hasLore() ? Sentinel.lang.generic.yes : Sentinel.lang.generic.no); + itemInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.hasAttributes,item.getItemMeta().hasAttributeModifiers() ? Sentinel.lang.generic.yes : Sentinel.lang.generic.no); + itemInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.hasEnchants,item.getItemMeta().hasEnchants() ? Sentinel.lang.generic.yes : Sentinel.lang.generic.no); + itemInfo.addField(Sentinel.lang.violations.protections.infoNode.nbtStored, FileUtils.createNBTLog(item)); + } + + return itemInfo; + } + + public Node generateCommandInfo(String command, Player executor) { + Node commandInfo = new Node(Sentinel.lang.violations.protections.infoNode.commandInfo); + String name = command.split(" ")[0].substring(1); + ServerUtils.verbose("Command Name: " + name); + Command executed = Bukkit.getServer().getCommandMap().getCommand(name); + + commandInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.name,name); + if (command.length() <= 128) { + commandInfo.addField(Sentinel.lang.violations.protections.infoNode.commandField, command); + } else { + commandInfo.addField(Sentinel.lang.violations.protections.infoNode.commandTooLargeField, FileUtils.createCommandLog(command)); + } + if (executed == null || executed.getPermission() == null) return commandInfo; + commandInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.permissionRequired,executed.getPermission()); + commandInfo.addKeyValue(Sentinel.lang.violations.protections.infoNode.permissionSatisfied,executor.hasPermission(executed.getPermission()) ? Sentinel.lang.generic.yes : Sentinel.lang.generic.no); + + return commandInfo; + } +} diff --git a/src/main/java/me/trouper/sentinel/server/functions/helpers/ActionConfiguration.java b/src/main/java/me/trouper/sentinel/server/functions/helpers/ActionConfiguration.java new file mode 100644 index 0000000..5408505 --- /dev/null +++ b/src/main/java/me/trouper/sentinel/server/functions/helpers/ActionConfiguration.java @@ -0,0 +1,255 @@ +package me.trouper.sentinel.server.functions.helpers; + +import me.trouper.sentinel.Sentinel; +import me.trouper.sentinel.utils.ServerUtils; +import me.trouper.sentinel.utils.trees.Node; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +public class ActionConfiguration { + private Player player; + private boolean deop; + private Cancellable event; + private boolean cancel; + private Block block; + private boolean destroyBlock; + private boolean restoreBlock; + private boolean punish; + private List punishmentCommands; + private boolean logToDiscord; + private Node actionNode; + + public ActionConfiguration(Builder builder) { + this.player = builder.player; + this.deop = builder.deop; + this.event = builder.event; + this.cancel = builder.cancel; + this.block = builder.block; + this.destroyBlock = builder.destroyBlock; + this.restoreBlock = builder.restoreBlock; + this.punish = builder.punish; + this.punishmentCommands = builder.punishmentCommands; + this.logToDiscord = builder.logToDiscord; + this.actionNode = builder.actionNode; + // Removed the actions being run here to prevent double execution + } + + public Player getPlayer() { + return player; + } + + public void setPlayer(Player player) { + this.player = player; + } + + public boolean isDeop() { + return deop; + } + + public void setDeop(boolean deop) { + this.deop = deop; + } + + public Cancellable getEvent() { + return event; + } + + public void setEvent(Cancellable event) { + this.event = event; + } + + public boolean isCancel() { + return cancel; + } + + public void setCancel(boolean cancel) { + this.cancel = cancel; + } + + public Block getBlock() { + return block; + } + + public void setBlock(Block block) { + this.block = block; + } + + public boolean isDestroyBlock() { + return destroyBlock; + } + + public void setDestroyBlock(boolean destroyBlock) { + this.destroyBlock = destroyBlock; + } + + public boolean isRestoreBlock() { + return restoreBlock; + } + + public void setRestoreBlock(boolean restoreBlock) { + this.restoreBlock = restoreBlock; + } + + public boolean isPunish() { + return punish; + } + + public void setPunish(boolean punish) { + this.punish = punish; + } + + public List getPunishmentCommands() { + return punishmentCommands; + } + + public void setPunishmentCommands(List punishmentCommands) { + this.punishmentCommands = punishmentCommands; + } + + public boolean isLogToDiscord() { + return logToDiscord; + } + + public void setLogToDiscord(boolean logToDiscord) { + this.logToDiscord = logToDiscord; + } + + public Node getActionNode() { + return actionNode; + } + + public void setActionNode(Node actionNode) { + this.actionNode = actionNode; + } + + public static class Builder { + private Player player; + private boolean deop; + private Cancellable event; + private boolean cancel; + private Block block; + private boolean destroyBlock; + private boolean restoreBlock; + private boolean punish; + private List punishmentCommands = new ArrayList<>(); + private boolean logToDiscord; + private Node actionNode = new Node(Sentinel.lang.violations.protections.actionNode.actionNodeTitle); + + private List> actions = new ArrayList<>(); + + public Builder setPlayer(Player player) { + this.player = player; + actions.add(config -> config.player = player); + return this; + } + + public Builder deop(boolean deop) { + this.deop = deop; + actions.add(config -> { + config.deop = deop; + if (config.player != null) { + config.player.setOp(false); + } + config.actionNode.addTextLine(Sentinel.lang.violations.protections.actionNode.userDeoped); + }); + return this; + } + + public Builder setEvent(Cancellable event) { + this.event = event; + actions.add(config -> config.event = event); + return this; + } + + public Builder cancel(boolean cancel) { + this.cancel = cancel; + actions.add(config -> { + config.cancel = cancel; + if (config.event != null) { + config.event.setCancelled(true); + } + config.actionNode.addTextLine(Sentinel.lang.violations.protections.actionNode.eventCancelled); + }); + return this; + } + + public Builder setBlock(Block block) { + this.block = block; + actions.add(config -> config.block = block); + return this; + } + + public Builder destroyBlock(boolean destroyBlock) { + this.destroyBlock = destroyBlock; + actions.add(config -> { + config.destroyBlock = destroyBlock; + if (config.block != null) { + config.block.setType(Material.AIR); + config.actionNode.addTextLine(Sentinel.lang.violations.protections.actionNode.destroyedBlock); + } + }); + return this; + } + + public Builder restoreBlock(boolean restoreBlock) { + this.restoreBlock = restoreBlock; + actions.add(config -> { + config.restoreBlock = restoreBlock; + if (config.block != null) { + if (CBWhitelistManager.restore(config.block.getLocation())) { + config.actionNode.addTextLine(Sentinel.lang.violations.protections.actionNode.restore); + } else { + config.actionNode.addTextLine(Sentinel.lang.violations.protections.actionNode.restoreFailed); + } + } + }); + return this; + } + + public Builder punish(boolean punish) { + this.punish = punish; + actions.add(config -> config.punish = punish); + return this; + } + + public Builder setPunishmentCommands(List punishmentCommands) { + this.punishmentCommands = punishmentCommands; + actions.add(config -> { + config.punishmentCommands = punishmentCommands; + if (config.punish && config.player != null) { + for (String cmd : punishmentCommands) { + ServerUtils.sendCommand(cmd.replaceAll("%player%", config.player.getName())); + } + config.actionNode.addTextLine(Sentinel.lang.violations.protections.actionNode.punishmentCommandsExecuted); + } + }); + return this; + } + + public Builder logToDiscord(boolean logToDiscord) { + this.logToDiscord = logToDiscord; + actions.add(config -> config.logToDiscord = logToDiscord); + return this; + } + + public boolean isLoggedToDiscord() { + return this.logToDiscord; + } + + public Node getActionNode() { + return this.actionNode; + } + + public ActionConfiguration build() { + ActionConfiguration config = new ActionConfiguration(this); + actions.forEach(action -> action.accept(config)); + return config; + } + } +} \ No newline at end of file diff --git a/src/main/java/me/trouper/sentinel/server/functions/CBWhitelistManager.java b/src/main/java/me/trouper/sentinel/server/functions/helpers/CBWhitelistManager.java similarity index 99% rename from src/main/java/me/trouper/sentinel/server/functions/CBWhitelistManager.java rename to src/main/java/me/trouper/sentinel/server/functions/helpers/CBWhitelistManager.java index ed90aa4..3a7d125 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/CBWhitelistManager.java +++ b/src/main/java/me/trouper/sentinel/server/functions/helpers/CBWhitelistManager.java @@ -1,4 +1,4 @@ -package me.trouper.sentinel.server.functions; +package me.trouper.sentinel.server.functions.helpers; import me.trouper.sentinel.Sentinel; import me.trouper.sentinel.data.types.WhitelistedBlock; diff --git a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/FalsePositiveReporting.java b/src/main/java/me/trouper/sentinel/server/functions/helpers/FalsePositiveReporting.java similarity index 94% rename from src/main/java/me/trouper/sentinel/server/functions/chatfilter/FalsePositiveReporting.java rename to src/main/java/me/trouper/sentinel/server/functions/helpers/FalsePositiveReporting.java index b0ad5d0..329874f 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/FalsePositiveReporting.java +++ b/src/main/java/me/trouper/sentinel/server/functions/helpers/FalsePositiveReporting.java @@ -1,9 +1,9 @@ -package me.trouper.sentinel.server.functions.chatfilter; +package me.trouper.sentinel.server.functions.helpers; import io.github.itzispyder.pdk.utils.SchedulerUtils; import io.github.itzispyder.pdk.utils.discord.DiscordEmbed; import me.trouper.sentinel.data.Emojis; -import me.trouper.sentinel.server.functions.Randomizer; +import me.trouper.sentinel.utils.Randomizer; import me.trouper.sentinel.utils.trees.EmbedFormatter; import org.bukkit.entity.Player; diff --git a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/FilterHelpers.java b/src/main/java/me/trouper/sentinel/server/functions/helpers/FilterHelpers.java similarity index 98% rename from src/main/java/me/trouper/sentinel/server/functions/chatfilter/FilterHelpers.java rename to src/main/java/me/trouper/sentinel/server/functions/helpers/FilterHelpers.java index b3f7866..f5ae2ff 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/FilterHelpers.java +++ b/src/main/java/me/trouper/sentinel/server/functions/helpers/FilterHelpers.java @@ -1,4 +1,4 @@ -package me.trouper.sentinel.server.functions.chatfilter; +package me.trouper.sentinel.server.functions.helpers; import io.papermc.paper.event.player.AsyncChatEvent; import me.trouper.sentinel.Sentinel; diff --git a/src/main/java/me/trouper/sentinel/server/functions/Message.java b/src/main/java/me/trouper/sentinel/server/functions/helpers/Message.java similarity index 94% rename from src/main/java/me/trouper/sentinel/server/functions/Message.java rename to src/main/java/me/trouper/sentinel/server/functions/helpers/Message.java index 812b516..a4896f4 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/Message.java +++ b/src/main/java/me/trouper/sentinel/server/functions/helpers/Message.java @@ -1,4 +1,4 @@ -package me.trouper.sentinel.server.functions; +package me.trouper.sentinel.server.functions.helpers; import io.github.itzispyder.pdk.utils.ServerUtils; import io.papermc.paper.chat.ChatRenderer; @@ -6,14 +6,12 @@ import io.papermc.paper.event.player.AsyncChatEvent; import me.trouper.sentinel.Sentinel; import me.trouper.sentinel.server.commands.SentinelCommand; import me.trouper.sentinel.server.events.ChatEvent; -import net.kyori.adventure.audience.Audience; import net.kyori.adventure.chat.SignedMessage; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import org.bukkit.entity.Player; import java.util.*; -import java.util.stream.Collectors; public class Message { public static final Map replyMap = new HashMap<>(); diff --git a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/Report.java b/src/main/java/me/trouper/sentinel/server/functions/helpers/Report.java similarity index 93% rename from src/main/java/me/trouper/sentinel/server/functions/chatfilter/Report.java rename to src/main/java/me/trouper/sentinel/server/functions/helpers/Report.java index a938b84..7f70aa3 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/chatfilter/Report.java +++ b/src/main/java/me/trouper/sentinel/server/functions/helpers/Report.java @@ -1,4 +1,4 @@ -package me.trouper.sentinel.server.functions.chatfilter; +package me.trouper.sentinel.server.functions.helpers; import java.util.LinkedHashMap; diff --git a/src/main/java/me/trouper/sentinel/startup/Load.java b/src/main/java/me/trouper/sentinel/startup/Load.java index f0f7d69..3e850ac 100644 --- a/src/main/java/me/trouper/sentinel/startup/Load.java +++ b/src/main/java/me/trouper/sentinel/startup/Load.java @@ -126,15 +126,15 @@ public class Load { new CallbackCommand().register(); // Events - new CBEditEvent().register(); - new CBExecuteEvent().register(); - new CBMCPlaceEvent().register(); - new CBMCUseEvent().register(); - new CBPlaceEvent().register(); - new CBUseEvent().register(); + new CommandBlockEdit().register(); + new CommandBlockExecute().register(); + new CommandBlockMinecartPlace().register(); + new CommandBlockMinecartUse().register(); + new CommandBlockPlace().register(); + new CommandBlockUse().register(); new ChatEvent().register(); - new CommandExecuteEvent().register(); - new CreativeHotbarEvent().register(); + new CommandExecute().register(); + new CreativeHotbar().register(); new TrapCommand().register(); new PluginCloakingEvent().register(); diff --git a/src/main/java/me/trouper/sentinel/utils/FileUtils.java b/src/main/java/me/trouper/sentinel/utils/FileUtils.java index 68a3b22..1451fc1 100644 --- a/src/main/java/me/trouper/sentinel/utils/FileUtils.java +++ b/src/main/java/me/trouper/sentinel/utils/FileUtils.java @@ -2,7 +2,6 @@ package me.trouper.sentinel.utils; import io.github.itzispyder.pdk.utils.FileValidationUtils; import me.trouper.sentinel.Sentinel; -import me.trouper.sentinel.server.functions.Randomizer; import org.bukkit.inventory.ItemStack; import java.io.BufferedWriter; diff --git a/src/main/java/me/trouper/sentinel/utils/ItemUtils.java b/src/main/java/me/trouper/sentinel/utils/ItemUtils.java index 655b6eb..854944b 100644 --- a/src/main/java/me/trouper/sentinel/utils/ItemUtils.java +++ b/src/main/java/me/trouper/sentinel/utils/ItemUtils.java @@ -121,10 +121,8 @@ public class ItemUtils { } public static boolean isOverLimit(Enchantment enchantment, int level) { - int maxLevel = Sentinel.nbtConfig.globalMaxEnchant; // Default to global max enchant + int maxLevel = Sentinel.nbtConfig.globalMaxEnchant; - - // Old code here if (enchantment.equals(MENDING)) { maxLevel = Sentinel.nbtConfig.maxMending; } else if (enchantment.equals(Enchantment.UNBREAKING)) { @@ -203,104 +201,14 @@ public class ItemUtils { maxLevel = Sentinel.nbtConfig.maxLure; } else if (enchantment.equals(Enchantment.SILK_TOUCH)) { maxLevel = Sentinel.nbtConfig.maxSilkTouch; + } else if (enchantment.equals(Enchantment.BREACH)) { + maxLevel = Sentinel.nbtConfig.maxBreach; + } else if (enchantment.equals(Enchantment.DENSITY)) { + maxLevel = Sentinel.nbtConfig.maxDensity; + } else if (enchantment.equals(Enchantment.WIND_BURST)) { + maxLevel = Sentinel.nbtConfig.maxWindBurst; } return level > maxLevel; } - - /* - public static boolean isOverLimit(Enchantment enchantment, int level) { - int maxLevel = Sentinel.nbtConfig.globalMaxEnchant; // Default to global max enchant - - // New code here - switch (enchantment.getKey().getKey()) { - case "mending" -> maxLevel = Sentinel.nbtConfig.maxMending; - case "unbreaking" -> maxLevel = Sentinel.nbtConfig.maxUnbreaking; - } - - - // Old code here - if (enchantment.equals(MENDING)) { - maxLevel = Sentinel.nbtConfig.maxMending; - } else if (enchantment.equals(Enchantment.UNBREAKING)) { - maxLevel = Sentinel.nbtConfig.maxUnbreaking; - } else if (enchantment.equals(Enchantment.VANISHING_CURSE)) { - maxLevel = Sentinel.nbtConfig.maxVanishing; - } else if (enchantment.equals(Enchantment.BINDING_CURSE)) { - maxLevel = Sentinel.nbtConfig.maxCurseOfBinding; - } else if (enchantment.equals(Enchantment.AQUA_AFFINITY)) { - maxLevel = Sentinel.nbtConfig.maxAquaAffinity; - } else if (enchantment.equals(Enchantment.PROTECTION)) { - maxLevel = Sentinel.nbtConfig.maxProtection; - } else if (enchantment.equals(Enchantment.BLAST_PROTECTION)) { - maxLevel = Sentinel.nbtConfig.maxBlastProtection; - } else if (enchantment.equals(Enchantment.DEPTH_STRIDER)) { - maxLevel = Sentinel.nbtConfig.maxDepthStrider; - } else if (enchantment.equals(Enchantment.FEATHER_FALLING)) { - maxLevel = Sentinel.nbtConfig.maxFeatherFalling; - } else if (enchantment.equals(Enchantment.FIRE_PROTECTION)) { - maxLevel = Sentinel.nbtConfig.maxFireProtection; - } else if (enchantment.equals(Enchantment.FROST_WALKER)) { - maxLevel = Sentinel.nbtConfig.maxFrostWalker; - } else if (enchantment.equals(Enchantment.PROJECTILE_PROTECTION)) { - maxLevel = Sentinel.nbtConfig.maxProjectileProtection; - } else if (enchantment.equals(Enchantment.RESPIRATION)) { - maxLevel = Sentinel.nbtConfig.maxRespiration; - } else if (enchantment.equals(Enchantment.SOUL_SPEED)) { - maxLevel = Sentinel.nbtConfig.maxSoulSpeed; - } else if (enchantment.equals(Enchantment.THORNS)) { - maxLevel = Sentinel.nbtConfig.maxThorns; - } else if (enchantment.equals(Enchantment.SWEEPING_EDGE)) { - maxLevel = Sentinel.nbtConfig.maxSweepingEdge; - } else if (enchantment.equals(Enchantment.SWIFT_SNEAK)) { - maxLevel = Sentinel.nbtConfig.maxSwiftSneak; - } else if (enchantment.equals(Enchantment.BANE_OF_ARTHROPODS)) { - maxLevel = Sentinel.nbtConfig.maxBaneOfArthropods; - } else if (enchantment.equals(Enchantment.FIRE_ASPECT)) { - maxLevel = Sentinel.nbtConfig.maxFireAspect; - } else if (enchantment.equals(Enchantment.LOOTING)) { - maxLevel = Sentinel.nbtConfig.maxLooting; - } else if (enchantment.equals(Enchantment.IMPALING)) { - maxLevel = Sentinel.nbtConfig.maxImpaling; - } else if (enchantment.equals(Enchantment.KNOCKBACK)) { - maxLevel = Sentinel.nbtConfig.maxKnockback; - } else if (enchantment.equals(Enchantment.SHARPNESS)) { - maxLevel = Sentinel.nbtConfig.maxSharpness; - } else if (enchantment.equals(Enchantment.SMITE)) { - maxLevel = Sentinel.nbtConfig.maxSmite; - } else if (enchantment.equals(Enchantment.CHANNELING)) { - maxLevel = Sentinel.nbtConfig.maxChanneling; - } else if (enchantment.equals(Enchantment.FLAME)) { - maxLevel = Sentinel.nbtConfig.maxFlame; - } else if (enchantment.equals(Enchantment.INFINITY)) { - maxLevel = Sentinel.nbtConfig.maxInfinity; - } else if (enchantment.equals(Enchantment.LOYALTY)) { - maxLevel = Sentinel.nbtConfig.maxLoyalty; - } else if (enchantment.equals(Enchantment.RIPTIDE)) { - maxLevel = Sentinel.nbtConfig.maxRiptide; - } else if (enchantment.equals(Enchantment.MULTISHOT)) { - maxLevel = Sentinel.nbtConfig.maxMultishot; - } else if (enchantment.equals(Enchantment.PIERCING)) { - maxLevel = Sentinel.nbtConfig.maxPiercing; - } else if (enchantment.equals(Enchantment.POWER)) { - maxLevel = Sentinel.nbtConfig.maxPower; - } else if (enchantment.equals(Enchantment.PUNCH)) { - maxLevel = Sentinel.nbtConfig.maxPunch; - } else if (enchantment.equals(Enchantment.QUICK_CHARGE)) { - maxLevel = Sentinel.nbtConfig.maxQuickCharge; - } else if (enchantment.equals(Enchantment.EFFICIENCY)) { - maxLevel = Sentinel.nbtConfig.maxEfficiency; - } else if (enchantment.equals(Enchantment.FORTUNE)) { - maxLevel = Sentinel.nbtConfig.maxFortune; - } else if (enchantment.equals(Enchantment.LUCK_OF_THE_SEA)) { - maxLevel = Sentinel.nbtConfig.maxLuckOfTheSea; - } else if (enchantment.equals(Enchantment.LURE)) { - maxLevel = Sentinel.nbtConfig.maxLure; - } else if (enchantment.equals(Enchantment.SILK_TOUCH)) { - maxLevel = Sentinel.nbtConfig.maxSilkTouch; - } - - return level > maxLevel; - } - */ } diff --git a/src/main/java/me/trouper/sentinel/server/functions/Randomizer.java b/src/main/java/me/trouper/sentinel/utils/Randomizer.java similarity index 97% rename from src/main/java/me/trouper/sentinel/server/functions/Randomizer.java rename to src/main/java/me/trouper/sentinel/utils/Randomizer.java index 2dddf25..99a5ea8 100644 --- a/src/main/java/me/trouper/sentinel/server/functions/Randomizer.java +++ b/src/main/java/me/trouper/sentinel/utils/Randomizer.java @@ -1,4 +1,4 @@ -package me.trouper.sentinel.server.functions; +package me.trouper.sentinel.utils; import java.text.SimpleDateFormat; import java.util.ArrayList; diff --git a/src/main/java/me/trouper/sentinel/utils/Text.java b/src/main/java/me/trouper/sentinel/utils/Text.java index 51b9256..12de151 100644 --- a/src/main/java/me/trouper/sentinel/utils/Text.java +++ b/src/main/java/me/trouper/sentinel/utils/Text.java @@ -11,7 +11,7 @@ import java.util.regex.PatternSyntaxException; public class Text { public static String removeColors(String input) { - return input.replaceAll("§[0-9a-frn]", ""); + return input.replaceAll("((§|&)[0-9a-fklmnor])|((§|&)#(?:[0-9a-fA-F]{3}){1,2})", ""); } public static String regexHighlighter(String input, String regex, String startString, String endString) { diff --git a/src/main/java/me/trouper/sentinel/utils/trees/ConsoleFormatter.java b/src/main/java/me/trouper/sentinel/utils/trees/ConsoleFormatter.java index 8f7e3d4..6c3f09e 100644 --- a/src/main/java/me/trouper/sentinel/utils/trees/ConsoleFormatter.java +++ b/src/main/java/me/trouper/sentinel/utils/trees/ConsoleFormatter.java @@ -1,5 +1,7 @@ package me.trouper.sentinel.utils.trees; +import me.trouper.sentinel.utils.Text; + import java.util.Map; public class ConsoleFormatter { @@ -17,7 +19,9 @@ public class ConsoleFormatter { sb.append(node.title).append("\n"); } + node.texts = node.texts.reversed(); for (String text : node.texts) { + text = Text.removeColors(text); text = text.replace(""," > "); text = text.replace(""," < "); if (level == 0) { @@ -30,6 +34,8 @@ public class ConsoleFormatter { for (Map.Entry entry : node.values.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); + key = Text.removeColors(key); + value = Text.removeColors(value); key = key.replace(""," > "); key = key.replace(""," < "); value = value.replace(""," > "); @@ -44,6 +50,8 @@ public class ConsoleFormatter { for (Map.Entry entry : node.fields.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); + key = Text.removeColors(key); + value = Text.removeColors(value); key = key.replace(""," > "); key = key.replace(""," < "); value = value.replace(""," > "); diff --git a/src/main/java/me/trouper/sentinel/utils/trees/EmbedFormatter.java b/src/main/java/me/trouper/sentinel/utils/trees/EmbedFormatter.java index 26da1fd..ff3a3e2 100644 --- a/src/main/java/me/trouper/sentinel/utils/trees/EmbedFormatter.java +++ b/src/main/java/me/trouper/sentinel/utils/trees/EmbedFormatter.java @@ -5,6 +5,7 @@ import io.github.itzispyder.pdk.utils.discord.DiscordEmbed; import io.github.itzispyder.pdk.utils.discord.DiscordWebhook; import me.trouper.sentinel.Sentinel; import me.trouper.sentinel.data.Emojis; +import me.trouper.sentinel.utils.Text; import java.io.IOException; import java.util.Map; @@ -12,12 +13,12 @@ import java.util.concurrent.atomic.AtomicBoolean; public class EmbedFormatter { - public static void sendEmbed(DiscordEmbed embed) { - sendEmbed(embed,Sentinel.mainConfig.plugin.webhook); + public static boolean sendEmbed(DiscordEmbed embed) { + return sendEmbed(embed,Sentinel.mainConfig.plugin.webhook); } public static boolean sendEmbed(DiscordEmbed embed, String spec) { - DiscordWebhook webhook = new DiscordWebhook("Sentinel Anti-Nuke Webhook Logger", "https://r2.e-z.host/d440b58a-ba90-4839-8df6-8bba298cf817/1epkvziv.png","", false, embed); + DiscordWebhook webhook = new DiscordWebhook("Sentinel Anti-Nuke Webhook Logger", "https://r2.e-z.host/d440b58a-ba90-4839-8df6-8bba298cf817/i9vsvqjg.png","", false, embed); AtomicBoolean success = new AtomicBoolean(false); SchedulerUtils.later(0,()->{ try { @@ -43,13 +44,15 @@ public class EmbedFormatter { private static void formatNode(DiscordEmbed.Builder eb, Node node, StringBuilder desc, int level) { eb.author("Sentinel | Anti-Nuke","https://trouper.me/sentinel",null); + eb.thumbnail("https://r2.e-z.host/d440b58a-ba90-4839-8df6-8bba298cf817/v5rxlx0d.png"); if (level == 0) { eb.title("Incoming from server: %s".formatted(Sentinel.mainConfig.plugin.identifier)); } else { - desc.repeat(Emojis.space,level - 1).append("**").append(node.title).append("**\n"); + desc.repeat(Emojis.space,level - 1).append("**").append(Text.removeColors(node.title)).append("**\n"); } for (String text : node.texts) { + text = Text.removeColors(text); text = text.replace(""," > "); text = text.replace(""," < "); if (level == 0) { @@ -62,6 +65,8 @@ public class EmbedFormatter { for (Map.Entry entry : node.values.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); + key = Text.removeColors(key); + value = Text.removeColors(value); key = key.replace(""," > "); key = key.replace(""," < "); value = value.replace(""," > "); @@ -76,6 +81,8 @@ public class EmbedFormatter { for (Map.Entry entry : node.fields.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); + key = Text.removeColors(key); + value = Text.removeColors(value); key = key.replace(""," > "); key = key.replace(""," < "); value = value.replace(""," > "); diff --git a/src/main/java/me/trouper/sentinel/utils/trees/Node.java b/src/main/java/me/trouper/sentinel/utils/trees/Node.java index 116c10e..f6bd5a8 100644 --- a/src/main/java/me/trouper/sentinel/utils/trees/Node.java +++ b/src/main/java/me/trouper/sentinel/utils/trees/Node.java @@ -6,11 +6,11 @@ import java.util.List; import java.util.Map; public class Node { - String title; - List texts; - Map values; - Map fields; - List children; + public String title; + public List texts; + public Map values; + public Map fields; + public List children; public Node(String title) { this.title = title;