From bfb9d4dba01d9755e98a02dbc983830bdad9d15c Mon Sep 17 00:00:00 2001 From: "Claude (Chronicler #83 - The Compiler)" Date: Sun, 12 Apr 2026 15:44:27 -0500 Subject: [PATCH] =?UTF-8?q?WIP:=20Discord=20Rules=20mod=20fork=20=E2=80=94?= =?UTF-8?q?=202/3=20versions=20built,=201.21.1=20blocked=20on=20RAM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Source code complete for all 3 versions (1.21.1, 1.20.1, 1.16.5). 1.20.1 and 1.16.5 jars built successfully. 1.21.1 NeoForge decompiler needs >4GB RAM — this server only has ~4GB total. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../.gradle/7.6.4/checksums/checksums.lock | Bin 0 -> 17 bytes .../.gradle/7.6.4/checksums/md5-checksums.bin | Bin 0 -> 25947 bytes .../7.6.4/checksums/sha1-checksums.bin | Bin 0 -> 41825 bytes .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.bin | Bin 0 -> 72708 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../.gradle/7.6.4/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/7.6.4/fileHashes/fileHashes.bin | Bin 0 -> 19597 bytes .../.gradle/7.6.4/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../7.6.4/fileHashes/resourceHashesCache.bin | Bin 0 -> 18735 bytes .../1.16.5/.gradle/7.6.4/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../buildOutputCleanup/outputFiles.bin | Bin 0 -> 19073 bytes .../1.16.5/.gradle/file-system.probe | Bin 0 -> 8 bytes .../1.16.5/.gradle/vcs-1/gc.properties | 0 services/discord-rules/1.16.5/build.gradle | 45 ++++ .../discord-rules/1.16.5/gradle.properties | 2 + services/discord-rules/1.16.5/settings.gradle | 7 + .../com/discordrules/CooldownManager.java | 31 +++ .../java/com/discordrules/DiscordFetcher.java | 52 ++++ .../com/discordrules/DiscordFormatter.java | 45 ++++ .../java/com/discordrules/RulesCache.java | 26 ++ .../java/com/discordrules/RulesCommand.java | 44 ++++ .../java/com/discordrules/ServerRules.java | 34 +++ .../com/discordrules/ServerRulesConfig.java | 40 +++ .../src/main/resources/META-INF/mods.toml | 24 ++ .../.gradle/8.8/checksums/checksums.lock | Bin 0 -> 17 bytes .../.gradle/8.8/checksums/md5-checksums.bin | Bin 0 -> 26747 bytes .../.gradle/8.8/checksums/sha1-checksums.bin | Bin 0 -> 44471 bytes .../8.8/dependencies-accessors/gc.properties | 0 .../8.8/executionHistory/executionHistory.bin | Bin 0 -> 115641 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../1.20.1/.gradle/8.8/expanded/expanded.lock | Bin 0 -> 17 bytes .../.gradle/8.8/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/8.8/fileHashes/fileHashes.bin | Bin 0 -> 19597 bytes .../.gradle/8.8/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../8.8/fileHashes/resourceHashesCache.bin | Bin 0 -> 18735 bytes .../1.20.1/.gradle/8.8/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../buildOutputCleanup/outputFiles.bin | Bin 0 -> 19073 bytes .../1.20.1/.gradle/file-system.probe | Bin 0 -> 8 bytes .../1.20.1/.gradle/vcs-1/gc.properties | 0 services/discord-rules/1.20.1/build.gradle | 50 ++++ .../discord-rules/1.20.1/gradle.properties | 2 + services/discord-rules/1.20.1/settings.gradle | 8 + .../com/discordrules/CooldownManager.java | 31 +++ .../java/com/discordrules/DiscordFetcher.java | 45 ++++ .../com/discordrules/DiscordFormatter.java | 42 +++ .../java/com/discordrules/RulesCache.java | 26 ++ .../java/com/discordrules/RulesCommand.java | 44 ++++ .../java/com/discordrules/ServerRules.java | 40 +++ .../com/discordrules/ServerRulesConfig.java | 40 +++ .../src/main/resources/META-INF/mods.toml | 27 ++ .../.gradle/8.8/checksums/checksums.lock | Bin 0 -> 17 bytes .../.gradle/8.8/checksums/md5-checksums.bin | Bin 0 -> 30397 bytes .../.gradle/8.8/checksums/sha1-checksums.bin | Bin 0 -> 76271 bytes .../8.8/dependencies-accessors/gc.properties | 0 .../8.8/executionHistory/executionHistory.bin | Bin 0 -> 91119 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../.gradle/8.8/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/8.8/fileHashes/fileHashes.bin | Bin 0 -> 18697 bytes .../.gradle/8.8/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../1.21.1/.gradle/8.8/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../buildOutputCleanup/outputFiles.bin | Bin 0 -> 18731 bytes .../1.21.1/.gradle/file-system.probe | Bin 0 -> 8 bytes .../1.21.1/.gradle/vcs-1/gc.properties | 0 services/discord-rules/1.21.1/build.gradle | 35 +++ .../discord-rules/1.21.1/gradle.properties | 11 + .../1.21.1/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43453 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + services/discord-rules/1.21.1/gradlew | 249 ++++++++++++++++++ services/discord-rules/1.21.1/gradlew.bat | 92 +++++++ services/discord-rules/1.21.1/settings.gradle | 12 + .../com/discordrules/CooldownManager.java | 31 +++ .../java/com/discordrules/DiscordFetcher.java | 45 ++++ .../com/discordrules/DiscordFormatter.java | 42 +++ .../java/com/discordrules/RulesCache.java | 26 ++ .../java/com/discordrules/RulesCommand.java | 44 ++++ .../java/com/discordrules/ServerRules.java | 41 +++ .../com/discordrules/ServerRulesConfig.java | 40 +++ .../resources/META-INF/neoforge.mods.toml | 28 ++ 86 files changed, 1414 insertions(+) create mode 100644 services/discord-rules/1.16.5/.gradle/7.6.4/checksums/checksums.lock create mode 100644 services/discord-rules/1.16.5/.gradle/7.6.4/checksums/md5-checksums.bin create mode 100644 services/discord-rules/1.16.5/.gradle/7.6.4/checksums/sha1-checksums.bin create mode 100644 services/discord-rules/1.16.5/.gradle/7.6.4/dependencies-accessors/dependencies-accessors.lock create mode 100644 services/discord-rules/1.16.5/.gradle/7.6.4/dependencies-accessors/gc.properties create mode 100644 services/discord-rules/1.16.5/.gradle/7.6.4/executionHistory/executionHistory.bin create mode 100644 services/discord-rules/1.16.5/.gradle/7.6.4/executionHistory/executionHistory.lock create mode 100644 services/discord-rules/1.16.5/.gradle/7.6.4/fileChanges/last-build.bin create mode 100644 services/discord-rules/1.16.5/.gradle/7.6.4/fileHashes/fileHashes.bin create mode 100644 services/discord-rules/1.16.5/.gradle/7.6.4/fileHashes/fileHashes.lock create mode 100644 services/discord-rules/1.16.5/.gradle/7.6.4/fileHashes/resourceHashesCache.bin create mode 100644 services/discord-rules/1.16.5/.gradle/7.6.4/gc.properties create mode 100644 services/discord-rules/1.16.5/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 services/discord-rules/1.16.5/.gradle/buildOutputCleanup/cache.properties create mode 100644 services/discord-rules/1.16.5/.gradle/buildOutputCleanup/outputFiles.bin create mode 100644 services/discord-rules/1.16.5/.gradle/file-system.probe create mode 100644 services/discord-rules/1.16.5/.gradle/vcs-1/gc.properties create mode 100644 services/discord-rules/1.16.5/build.gradle create mode 100644 services/discord-rules/1.16.5/gradle.properties create mode 100644 services/discord-rules/1.16.5/settings.gradle create mode 100644 services/discord-rules/1.16.5/src/main/java/com/discordrules/CooldownManager.java create mode 100644 services/discord-rules/1.16.5/src/main/java/com/discordrules/DiscordFetcher.java create mode 100644 services/discord-rules/1.16.5/src/main/java/com/discordrules/DiscordFormatter.java create mode 100644 services/discord-rules/1.16.5/src/main/java/com/discordrules/RulesCache.java create mode 100644 services/discord-rules/1.16.5/src/main/java/com/discordrules/RulesCommand.java create mode 100644 services/discord-rules/1.16.5/src/main/java/com/discordrules/ServerRules.java create mode 100644 services/discord-rules/1.16.5/src/main/java/com/discordrules/ServerRulesConfig.java create mode 100644 services/discord-rules/1.16.5/src/main/resources/META-INF/mods.toml create mode 100644 services/discord-rules/1.20.1/.gradle/8.8/checksums/checksums.lock create mode 100644 services/discord-rules/1.20.1/.gradle/8.8/checksums/md5-checksums.bin create mode 100644 services/discord-rules/1.20.1/.gradle/8.8/checksums/sha1-checksums.bin create mode 100644 services/discord-rules/1.20.1/.gradle/8.8/dependencies-accessors/gc.properties create mode 100644 services/discord-rules/1.20.1/.gradle/8.8/executionHistory/executionHistory.bin create mode 100644 services/discord-rules/1.20.1/.gradle/8.8/executionHistory/executionHistory.lock create mode 100644 services/discord-rules/1.20.1/.gradle/8.8/expanded/expanded.lock create mode 100644 services/discord-rules/1.20.1/.gradle/8.8/fileChanges/last-build.bin create mode 100644 services/discord-rules/1.20.1/.gradle/8.8/fileHashes/fileHashes.bin create mode 100644 services/discord-rules/1.20.1/.gradle/8.8/fileHashes/fileHashes.lock create mode 100644 services/discord-rules/1.20.1/.gradle/8.8/fileHashes/resourceHashesCache.bin create mode 100644 services/discord-rules/1.20.1/.gradle/8.8/gc.properties create mode 100644 services/discord-rules/1.20.1/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 services/discord-rules/1.20.1/.gradle/buildOutputCleanup/cache.properties create mode 100644 services/discord-rules/1.20.1/.gradle/buildOutputCleanup/outputFiles.bin create mode 100644 services/discord-rules/1.20.1/.gradle/file-system.probe create mode 100644 services/discord-rules/1.20.1/.gradle/vcs-1/gc.properties create mode 100755 services/discord-rules/1.20.1/build.gradle create mode 100755 services/discord-rules/1.20.1/gradle.properties create mode 100755 services/discord-rules/1.20.1/settings.gradle create mode 100755 services/discord-rules/1.20.1/src/main/java/com/discordrules/CooldownManager.java create mode 100755 services/discord-rules/1.20.1/src/main/java/com/discordrules/DiscordFetcher.java create mode 100755 services/discord-rules/1.20.1/src/main/java/com/discordrules/DiscordFormatter.java create mode 100755 services/discord-rules/1.20.1/src/main/java/com/discordrules/RulesCache.java create mode 100755 services/discord-rules/1.20.1/src/main/java/com/discordrules/RulesCommand.java create mode 100755 services/discord-rules/1.20.1/src/main/java/com/discordrules/ServerRules.java create mode 100755 services/discord-rules/1.20.1/src/main/java/com/discordrules/ServerRulesConfig.java create mode 100755 services/discord-rules/1.20.1/src/main/resources/META-INF/mods.toml create mode 100644 services/discord-rules/1.21.1/.gradle/8.8/checksums/checksums.lock create mode 100644 services/discord-rules/1.21.1/.gradle/8.8/checksums/md5-checksums.bin create mode 100644 services/discord-rules/1.21.1/.gradle/8.8/checksums/sha1-checksums.bin create mode 100644 services/discord-rules/1.21.1/.gradle/8.8/dependencies-accessors/gc.properties create mode 100644 services/discord-rules/1.21.1/.gradle/8.8/executionHistory/executionHistory.bin create mode 100644 services/discord-rules/1.21.1/.gradle/8.8/executionHistory/executionHistory.lock create mode 100644 services/discord-rules/1.21.1/.gradle/8.8/fileChanges/last-build.bin create mode 100644 services/discord-rules/1.21.1/.gradle/8.8/fileHashes/fileHashes.bin create mode 100644 services/discord-rules/1.21.1/.gradle/8.8/fileHashes/fileHashes.lock create mode 100644 services/discord-rules/1.21.1/.gradle/8.8/gc.properties create mode 100644 services/discord-rules/1.21.1/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 services/discord-rules/1.21.1/.gradle/buildOutputCleanup/cache.properties create mode 100644 services/discord-rules/1.21.1/.gradle/buildOutputCleanup/outputFiles.bin create mode 100644 services/discord-rules/1.21.1/.gradle/file-system.probe create mode 100644 services/discord-rules/1.21.1/.gradle/vcs-1/gc.properties create mode 100644 services/discord-rules/1.21.1/build.gradle create mode 100644 services/discord-rules/1.21.1/gradle.properties create mode 100644 services/discord-rules/1.21.1/gradle/wrapper/gradle-wrapper.jar create mode 100644 services/discord-rules/1.21.1/gradle/wrapper/gradle-wrapper.properties create mode 100755 services/discord-rules/1.21.1/gradlew create mode 100644 services/discord-rules/1.21.1/gradlew.bat create mode 100644 services/discord-rules/1.21.1/settings.gradle create mode 100644 services/discord-rules/1.21.1/src/main/java/com/discordrules/CooldownManager.java create mode 100644 services/discord-rules/1.21.1/src/main/java/com/discordrules/DiscordFetcher.java create mode 100644 services/discord-rules/1.21.1/src/main/java/com/discordrules/DiscordFormatter.java create mode 100644 services/discord-rules/1.21.1/src/main/java/com/discordrules/RulesCache.java create mode 100644 services/discord-rules/1.21.1/src/main/java/com/discordrules/RulesCommand.java create mode 100644 services/discord-rules/1.21.1/src/main/java/com/discordrules/ServerRules.java create mode 100644 services/discord-rules/1.21.1/src/main/java/com/discordrules/ServerRulesConfig.java create mode 100644 services/discord-rules/1.21.1/src/main/resources/META-INF/neoforge.mods.toml diff --git a/services/discord-rules/1.16.5/.gradle/7.6.4/checksums/checksums.lock b/services/discord-rules/1.16.5/.gradle/7.6.4/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..5f6e62b3e19026d04d6c15ab4d5460dd5d1ad9c0 GIT binary patch literal 17 VcmZQ}`|vdPdCB!B3}C?I0{}%$1@Hg> literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.16.5/.gradle/7.6.4/checksums/md5-checksums.bin b/services/discord-rules/1.16.5/.gradle/7.6.4/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..09d116040bbb5cd8616cec2b8a309f894519a807 GIT binary patch literal 25947 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 literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.16.5/.gradle/7.6.4/checksums/sha1-checksums.bin b/services/discord-rules/1.16.5/.gradle/7.6.4/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..9ce5b8dcb6a6714951d7df4337b62f3e2bee5890 GIT binary patch literal 41825 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 literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.16.5/.gradle/7.6.4/dependencies-accessors/dependencies-accessors.lock b/services/discord-rules/1.16.5/.gradle/7.6.4/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000000000000000000000000000000000000..78b61fe68da845aceece2a5690aa6dc41c06bacc GIT binary patch literal 17 TcmZP;nr`^azGl^J1}FdkFE|7Q literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.16.5/.gradle/7.6.4/dependencies-accessors/gc.properties b/services/discord-rules/1.16.5/.gradle/7.6.4/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/services/discord-rules/1.16.5/.gradle/7.6.4/executionHistory/executionHistory.bin b/services/discord-rules/1.16.5/.gradle/7.6.4/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..f8997045e7512a9ebd026d9f4493e5d599e59f97 GIT binary patch literal 72708 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 literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.16.5/.gradle/7.6.4/executionHistory/executionHistory.lock b/services/discord-rules/1.16.5/.gradle/7.6.4/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..c352856d762e93997d0dac3379c10be1eb56d2d8 GIT binary patch literal 17 TcmZSPjBezWejYKM0RngcA>0D< literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.16.5/.gradle/7.6.4/fileChanges/last-build.bin b/services/discord-rules/1.16.5/.gradle/7.6.4/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.16.5/.gradle/7.6.4/fileHashes/fileHashes.bin b/services/discord-rules/1.16.5/.gradle/7.6.4/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..9ea7522fce08387fa6c316413f272aa4f3dd0f85 GIT binary patch literal 19597 zcmeI3ZA?>F7{@QA1m0UI)18`mi;p|m0lU(@p90)ZL`FwH75m{yru zHwLSOA!wOXH>jdS<2F>*j7S|eQ^q>x6q*e)V1mgICm3vZZ_ha~_U^+zF3WS0o}T<~ zf9E;pm-DUnBvX`F=)#S9(n6mMVFU)i02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq z00UqE4E$dVtfx2Pk2WJ-%3%g`bQBdINDoAMUaR~E)3^~mP8lHoAMBf*qo|vbPNH1F zC%Hj0OYOK`5rFd4$0To{6-dpe?QQxH{%sHX;o4eFmoSH_@HPsuEluw5=<&XC|4W zR<5ZP`ye72zj5#PE1S?$ecNv>jIGM4(XIZyLi_*`jSHCy6vcJXoktDT&5_}fR~l~a z*=n&B{$$f4;%#O%bo0xgI}hUOs@#mfcDDyFlFt-Q-VU|83GJxJ4N$`CY@+BwV9U8Y zo}a_o({$zAJ2Fg25D^s4CJJo=ximY|k@nfT?yqEjHX~wW5E1@I*@S7WWXEg{b>!mN zbWNT5^E_N55fS`RHesl4_hYoPT+k;`J2HldplLR-ynb2!Z=a6st(@+X zo+{U%lc;sl&gkYfUcx5s=}*TNbo7bB4!)!*eOON4qhL<^0(=jJ^TNL*w9XAo3HtWL zKM-XZb%7J<=ADwr5y$!OvM!>1I5#7LVos#TDbY%LZaBkNWIb5_Nz>3IuMrbDhdfay3=p6Q06l939{>OV literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.16.5/.gradle/7.6.4/fileHashes/resourceHashesCache.bin b/services/discord-rules/1.16.5/.gradle/7.6.4/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..ceaa296e346e9d079b040df8600c6d7d6fdcaefa GIT binary patch literal 18735 zcmeI%&nv@m9LMqRILH{I$(9Il5G~?hsAc(?NU^lEC=OWdKyu)sHWHe{)I@4gyEw>= zi;#nrtVvuD7mI^(kXFWb?fY%9|A6PGKHtx~*XP}*-jD0INf5N^FKG$!l@l+i5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0;ruLzjML6os!v=vFwB6CU*D$~Ux#pB6){A^ZS z#;)7W8g6AX>!~!uo@m7+*t2Q?AWR+t7$p38}E;=`xmT%=)=F> z7_tSfmy0q=L$7_B?Gl?ev18|K&gQs#+qYa5&!@I literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.16.5/.gradle/buildOutputCleanup/cache.properties b/services/discord-rules/1.16.5/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..39a80c1 --- /dev/null +++ b/services/discord-rules/1.16.5/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Sun Apr 12 15:36:24 CDT 2026 +gradle.version=7.6.4 diff --git a/services/discord-rules/1.16.5/.gradle/buildOutputCleanup/outputFiles.bin b/services/discord-rules/1.16.5/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..13da7c372050851ed1c75aad050691136642568a GIT binary patch literal 19073 zcmeI%T}V@59LMqFR#~nzkuzo>TZk=CNH8!jf?jp!XnK*6Z<7>OH{mkHMP7uImPvZC zffq$Vi7`VBFUqi75+i(TEDB;UM=F%Kh^Wk&y`0nY{FCk?7*zZoIA;&v^XzQThjVxK z34&qcH$H@wA+Ag@g8&2|009U<00Izz00bZa0SG_<0uX=z1Rwwb2teR}5jdo5B#v#y zkfBj02@XNXT(3+_Ew=upR^PVs?6PGyy+62Eu`HbOHR@QGI;mee-sp7=6qWHFqV9aZ zI;219Qtqn`sfc>#qTQU{`>2U^S)_hlykWRs>^jW4rImWmSaw@5t+ImmUh1Ab3%dgL z2i>eoL)0G@-hAxaT%X4KB=zx`=Y8ATU#ojmhMYtFNkel((-rS1@7kZ;W7YIcZ{kc+ z74=!okz~_}j!Cv&+DUzWs=ySVGN;liL$*>6i!D0sgrkRb=^gcjrx$|DZ%SYB?xz09 zS>qF5h7x#hrXJ~k5nJ6oTEMz&roNPF)J?52?q}WNq5icix8}6_a~JOisq3BBHUz&M zv-0ksZp^a{mSl{1d7q)4TD3MVF!1ay>$08tR`VIZUbn@-*ZZkwMLH(h14)&*xumi?^JjUFrB0uMpiN}gaE1T`AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_@b?R3 iDSvUDa>S^IdW!$0DB+(g(c8tJ-8p*S`kgyRdChl;th1y5 literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.16.5/.gradle/file-system.probe b/services/discord-rules/1.16.5/.gradle/file-system.probe new file mode 100644 index 0000000000000000000000000000000000000000..0c9517f3f7d97e65996ea21d954e15ff9edcce65 GIT binary patch literal 8 PcmZQzV4T~Wc{c$72!H~} literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.16.5/.gradle/vcs-1/gc.properties b/services/discord-rules/1.16.5/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/services/discord-rules/1.16.5/build.gradle b/services/discord-rules/1.16.5/build.gradle new file mode 100644 index 0000000..9b4ab00 --- /dev/null +++ b/services/discord-rules/1.16.5/build.gradle @@ -0,0 +1,45 @@ +buildscript { + repositories { + maven { url = 'https://maven.minecraftforge.net/' } + mavenCentral() + } + dependencies { + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+' + } +} + +apply plugin: 'net.minecraftforge.gradle' + +version = '1.0.0' +group = 'com.discordrules' +archivesBaseName = 'discordrules' + +java.toolchain.languageVersion = JavaLanguageVersion.of(8) + +minecraft { + mappings channel: 'official', version: '1.16.5' + runs { + server { + workingDirectory project.file('run') + mods { + discordrules { + source sourceSets.main + } + } + } + } +} + +dependencies { + minecraft 'net.minecraftforge:forge:1.16.5-36.2.39' +} + +jar { + manifest { + attributes(["Implementation-Title": "Discord Rules", "Implementation-Version": project.version]) + } +} + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' +} diff --git a/services/discord-rules/1.16.5/gradle.properties b/services/discord-rules/1.16.5/gradle.properties new file mode 100644 index 0000000..29b2ac4 --- /dev/null +++ b/services/discord-rules/1.16.5/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false diff --git a/services/discord-rules/1.16.5/settings.gradle b/services/discord-rules/1.16.5/settings.gradle new file mode 100644 index 0000000..c38c5e3 --- /dev/null +++ b/services/discord-rules/1.16.5/settings.gradle @@ -0,0 +1,7 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { url = 'https://maven.minecraftforge.net/' } + } +} +rootProject.name = 'discordrules' diff --git a/services/discord-rules/1.16.5/src/main/java/com/discordrules/CooldownManager.java b/services/discord-rules/1.16.5/src/main/java/com/discordrules/CooldownManager.java new file mode 100644 index 0000000..98918f3 --- /dev/null +++ b/services/discord-rules/1.16.5/src/main/java/com/discordrules/CooldownManager.java @@ -0,0 +1,31 @@ +package com.discordrules; + +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.entity.player.ServerPlayerEntity; +import java.time.Duration; +import java.time.Instant; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class CooldownManager { + private static final ConcurrentHashMap COOLDOWNS = new ConcurrentHashMap<>(); + + public static boolean checkAndUpdateCooldown(ServerPlayerEntity player) { + UUID playerId = player.getUUID(); + Instant now = Instant.now(); + int cooldownSeconds = ServerRulesConfig.COOLDOWN_SECONDS.get(); + Instant lastUsed = COOLDOWNS.get(playerId); + if (lastUsed != null) { + long secondsSinceLastUse = Duration.between(lastUsed, now).getSeconds(); + if (secondsSinceLastUse < cooldownSeconds) { + long remaining = cooldownSeconds - secondsSinceLastUse; + player.sendMessage(new StringTextComponent("\u00A7cPlease wait " + remaining + " seconds before checking the rules again."), player.getUUID()); + return false; + } + } + COOLDOWNS.put(playerId, now); + return true; + } + + public static void removePlayer(UUID playerId) { COOLDOWNS.remove(playerId); } +} diff --git a/services/discord-rules/1.16.5/src/main/java/com/discordrules/DiscordFetcher.java b/services/discord-rules/1.16.5/src/main/java/com/discordrules/DiscordFetcher.java new file mode 100644 index 0000000..d45c346 --- /dev/null +++ b/services/discord-rules/1.16.5/src/main/java/com/discordrules/DiscordFetcher.java @@ -0,0 +1,52 @@ +package com.discordrules; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.concurrent.CompletableFuture; + +public class DiscordFetcher { + private static final Logger LOGGER = LogManager.getLogger(DiscordFetcher.class); + + public static CompletableFuture fetchRulesAsync() { + if (!ServerRulesConfig.isMessageIdValid()) { + LOGGER.error("Invalid Discord Message ID in config."); + return CompletableFuture.completedFuture(null); + } + return CompletableFuture.supplyAsync(() -> { + try { + String token = ServerRulesConfig.BOT_TOKEN.get(); + String channelId = ServerRulesConfig.CHANNEL_ID.get(); + String messageId = ServerRulesConfig.MESSAGE_ID.get(); + URL url = new URL("https://discord.com/api/v10/channels/" + channelId + "/messages/" + messageId); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("GET"); + con.setRequestProperty("Authorization", "Bot " + token); + con.setRequestProperty("Accept", "application/json"); + con.setConnectTimeout(10000); + con.setReadTimeout(10000); + int status = con.getResponseCode(); + if (status == 200) { + BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); + StringBuilder content = new StringBuilder(); + String inputLine; + while ((inputLine = in.readLine()) != null) { content.append(inputLine); } + in.close(); + JsonObject json = new JsonParser().parse(content.toString()).getAsJsonObject(); + return json.get("content").getAsString(); + } else { + LOGGER.error("Discord API returned status: {}", status); + return null; + } + } catch (Exception ex) { + LOGGER.error("Network error while fetching Discord rules", ex); + return null; + } + }); + } +} diff --git a/services/discord-rules/1.16.5/src/main/java/com/discordrules/DiscordFormatter.java b/services/discord-rules/1.16.5/src/main/java/com/discordrules/DiscordFormatter.java new file mode 100644 index 0000000..13d71c1 --- /dev/null +++ b/services/discord-rules/1.16.5/src/main/java/com/discordrules/DiscordFormatter.java @@ -0,0 +1,45 @@ +package com.discordrules; + +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.text.IFormattableTextComponent; + +public class DiscordFormatter { + public static IFormattableTextComponent formatRules(String rawDiscordText) { + String processedText = ServerRulesConfig.STRIP_EMOJIS.get() + ? stripEmojis(rawDiscordText) : rawDiscordText; + TextFormatting headerColor = parseColor(ServerRulesConfig.HEADER_COLOR.get(), TextFormatting.GOLD); + TextFormatting bodyColor = parseColor(ServerRulesConfig.BODY_COLOR.get(), TextFormatting.YELLOW); + IFormattableTextComponent rootComponent = new StringTextComponent(""); + String[] lines = processedText.split("\n"); + for (String line : lines) { + IFormattableTextComponent lineComponent; + if (line.startsWith("**") && line.endsWith("**")) { + String cleanLine = line.replace("**", ""); + lineComponent = new StringTextComponent(cleanLine); + lineComponent.withStyle(headerColor, TextFormatting.BOLD); + } else if (line.trim().startsWith("-") || line.trim().startsWith("\u2022")) { + lineComponent = new StringTextComponent(" " + line.trim()); + lineComponent.withStyle(bodyColor); + } else { + lineComponent = new StringTextComponent(line); + lineComponent.withStyle(bodyColor); + } + rootComponent.append(lineComponent).append(new StringTextComponent("\n")); + } + return rootComponent; + } + + private static String stripEmojis(String text) { + if (text == null) return ""; + return text.replaceAll("[\\x{1F300}-\\x{1F9FF}]", ""); + } + + private static TextFormatting parseColor(String name, TextFormatting fallback) { + try { + return TextFormatting.valueOf(name.toUpperCase()); + } catch (IllegalArgumentException e) { + return fallback; + } + } +} diff --git a/services/discord-rules/1.16.5/src/main/java/com/discordrules/RulesCache.java b/services/discord-rules/1.16.5/src/main/java/com/discordrules/RulesCache.java new file mode 100644 index 0000000..6ffab0b --- /dev/null +++ b/services/discord-rules/1.16.5/src/main/java/com/discordrules/RulesCache.java @@ -0,0 +1,26 @@ +package com.discordrules; + +import java.time.Instant; + +public class RulesCache { + private static String cachedRules = null; + private static Instant lastFetchTime = Instant.MIN; + private static final String FALLBACK_RULES = + "Server Rules\n1. Be respectful to all players.\n2. No griefing or cheating.\n3. Follow staff instructions.\nPlease check Discord for the full rules list."; + + public static boolean isCacheValid() { + if (cachedRules == null) return false; + long cacheMinutes = ServerRulesConfig.CACHE_MINUTES.get(); + return Instant.now().isBefore(lastFetchTime.plusSeconds(cacheMinutes * 60)); + } + + public static void updateCache(String newRules) { + if (newRules != null && !newRules.trim().isEmpty()) { + cachedRules = newRules; + lastFetchTime = Instant.now(); + } + } + + public static String getRules() { return cachedRules != null ? cachedRules : FALLBACK_RULES; } + public static void invalidate() { cachedRules = null; lastFetchTime = Instant.MIN; } +} diff --git a/services/discord-rules/1.16.5/src/main/java/com/discordrules/RulesCommand.java b/services/discord-rules/1.16.5/src/main/java/com/discordrules/RulesCommand.java new file mode 100644 index 0000000..17fbaf5 --- /dev/null +++ b/services/discord-rules/1.16.5/src/main/java/com/discordrules/RulesCommand.java @@ -0,0 +1,44 @@ +package com.discordrules; + +import com.mojang.brigadier.CommandDispatcher; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.IFormattableTextComponent; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class RulesCommand { + private static final Logger LOGGER = LogManager.getLogger(RulesCommand.class); + + public static void register(CommandDispatcher dispatcher) { + dispatcher.register(Commands.literal("rules").executes(context -> { + CommandSource source = context.getSource(); + if (!(source.getEntity() instanceof ServerPlayerEntity)) { + source.sendSuccess(DiscordFormatter.formatRules(RulesCache.getRules()), false); + return 1; + } + ServerPlayerEntity player = (ServerPlayerEntity) source.getEntity(); + if (!CooldownManager.checkAndUpdateCooldown(player)) return 0; + if (RulesCache.isCacheValid()) { + player.sendMessage(DiscordFormatter.formatRules(RulesCache.getRules()), player.getUUID()); + return 1; + } + player.sendMessage(new StringTextComponent("\u00A77Fetching latest rules..."), player.getUUID()); + DiscordFetcher.fetchRulesAsync().thenAccept(fetchedRules -> { + String rulesText; + if (fetchedRules != null) { + RulesCache.updateCache(fetchedRules); + rulesText = fetchedRules; + } else { + LOGGER.warn("Discord fetch failed. Falling back to cache for {}", player.getName().getString()); + rulesText = RulesCache.getRules(); + } + IFormattableTextComponent formattedRules = DiscordFormatter.formatRules(rulesText); + source.getServer().execute(() -> player.sendMessage(formattedRules, player.getUUID())); + }); + return 1; + })); + } +} diff --git a/services/discord-rules/1.16.5/src/main/java/com/discordrules/ServerRules.java b/services/discord-rules/1.16.5/src/main/java/com/discordrules/ServerRules.java new file mode 100644 index 0000000..1a0dcc0 --- /dev/null +++ b/services/discord-rules/1.16.5/src/main/java/com/discordrules/ServerRules.java @@ -0,0 +1,34 @@ +package com.discordrules; + +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.RegisterCommandsEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +@Mod("discordrules") +public class ServerRules { + private static final Logger LOGGER = LogManager.getLogger(ServerRules.class); + + public ServerRules() { + ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, ServerRulesConfig.SPEC); + MinecraftForge.EVENT_BUS.register(this); + LOGGER.info("Discord Rules Mod Initialized."); + } + + @SubscribeEvent + public void onRegisterCommands(RegisterCommandsEvent event) { + RulesCommand.register(event.getDispatcher()); + LOGGER.info("Registered /rules command."); + } + + @SubscribeEvent + public void onPlayerLogout(PlayerEvent.PlayerLoggedOutEvent event) { + CooldownManager.removePlayer(event.getEntity().getUUID()); + } +} diff --git a/services/discord-rules/1.16.5/src/main/java/com/discordrules/ServerRulesConfig.java b/services/discord-rules/1.16.5/src/main/java/com/discordrules/ServerRulesConfig.java new file mode 100644 index 0000000..62b38fb --- /dev/null +++ b/services/discord-rules/1.16.5/src/main/java/com/discordrules/ServerRulesConfig.java @@ -0,0 +1,40 @@ +package com.discordrules; + +import net.minecraftforge.common.ForgeConfigSpec; +import org.apache.commons.lang3.StringUtils; + +public class ServerRulesConfig { + public static final ForgeConfigSpec SPEC; + public static final ForgeConfigSpec.ConfigValue BOT_TOKEN; + public static final ForgeConfigSpec.ConfigValue CHANNEL_ID; + public static final ForgeConfigSpec.ConfigValue MESSAGE_ID; + public static final ForgeConfigSpec.IntValue COOLDOWN_SECONDS; + public static final ForgeConfigSpec.IntValue CACHE_MINUTES; + public static final ForgeConfigSpec.ConfigValue HEADER_COLOR; + public static final ForgeConfigSpec.ConfigValue BODY_COLOR; + public static final ForgeConfigSpec.BooleanValue STRIP_EMOJIS; + + static { + ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder(); + builder.push("discord"); + BOT_TOKEN = builder.comment("Discord Bot Token").define("bot_token", "YOUR_TOKEN_HERE"); + CHANNEL_ID = builder.comment("Discord Channel ID").define("channel_id", "1234567890123456789"); + MESSAGE_ID = builder.comment("Discord Message ID").define("message_id", "1234567890123456789"); + builder.pop(); + builder.push("display"); + HEADER_COLOR = builder.comment("Header color (bold lines). Valid values: BLACK, DARK_BLUE, DARK_GREEN, DARK_AQUA, DARK_RED, DARK_PURPLE, GOLD, GRAY, DARK_GRAY, BLUE, GREEN, AQUA, RED, LIGHT_PURPLE, YELLOW, WHITE").define("header_color", "GOLD"); + BODY_COLOR = builder.comment("Body color (regular lines and bullet points)").define("body_color", "YELLOW"); + STRIP_EMOJIS = builder.comment("Strip emojis that Minecraft can't render (recommended: true)").define("strip_emojis", true); + builder.pop(); + builder.push("performance"); + COOLDOWN_SECONDS = builder.comment("Per-player cooldown in seconds").defineInRange("cooldown_seconds", 60, 0, 3600); + CACHE_MINUTES = builder.comment("Cache duration in minutes").defineInRange("cache_minutes", 30, 1, 1440); + builder.pop(); + SPEC = builder.build(); + } + + public static boolean isMessageIdValid() { + String id = MESSAGE_ID.get(); + return StringUtils.isNotBlank(id) && id.matches("^\\d{17,20}$"); + } +} diff --git a/services/discord-rules/1.16.5/src/main/resources/META-INF/mods.toml b/services/discord-rules/1.16.5/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..ae133ea --- /dev/null +++ b/services/discord-rules/1.16.5/src/main/resources/META-INF/mods.toml @@ -0,0 +1,24 @@ +modLoader="javafml" +loaderVersion="[36,)" +license="MIT" + +[[mods]] +modId="discordrules" +version="${file.jarVersion}" +displayName="Discord Rules" +authors="FirefrostGaming" +description='''Displays server rules in-game via /rules, fetched live from a Discord message. Fully configurable colors, cooldowns, and caching.''' + +[[dependencies.discordrules]] +modId="forge" +mandatory=true +versionRange="[36,)" +ordering="NONE" +side="SERVER" + +[[dependencies.discordrules]] +modId="minecraft" +mandatory=true +versionRange="[1.16.5,1.17)" +ordering="NONE" +side="SERVER" diff --git a/services/discord-rules/1.20.1/.gradle/8.8/checksums/checksums.lock b/services/discord-rules/1.20.1/.gradle/8.8/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..add07059012ea57276a48cb99a7679cc9e512899 GIT binary patch literal 17 VcmZQ}?(@$2eRK5!1~6di0suHQ1vLNw literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.20.1/.gradle/8.8/checksums/md5-checksums.bin b/services/discord-rules/1.20.1/.gradle/8.8/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..cd96c1933e36171d544096d99a241e1188a4bee9 GIT binary patch literal 26747 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 literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.20.1/.gradle/8.8/checksums/sha1-checksums.bin b/services/discord-rules/1.20.1/.gradle/8.8/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..23ce1a7a104cec087b06377ba999e5205b3b4e3c GIT binary patch literal 44471 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 W^^DI){CL=rjpKJ0_zDV^9`k=$$miey literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.20.1/.gradle/8.8/executionHistory/executionHistory.lock b/services/discord-rules/1.20.1/.gradle/8.8/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..8a6964c96144eb6d76eb7ae1df597b488202b7dd GIT binary patch literal 17 UcmZR+C;$bZ02F`% zPyh=2Ukao#C*p=q#wUzpU-2xUsCPY>m3O|4%TT22c$d&-Q6%~O;D_YW(TT%z`G^a3 zgdZy1`FmZ_*=jsqOSs`acWuMhw_oA$S%lX&O$=s;|9pbDU_0S-$PMUf^x$sXQ;kypM2m?o)pG`?g`cpT7tn40{z@y*_XT;)2_RyU4s> zeEyT?0Nzh7;WHJ(l7TTP)5X3B^n}l|Zt*krzV=64lu3B7CTDy8E7Atyj^ z1#v+F;p!9Coi%xX+(TR#O?Z)s&OhY0>J;A3bHaC;$bZ02F`%Pyh-*0Vn_kpa2wr0#E=7KmjNK1)u;F zfC5ke3P1rU00p1`6o3Ly01Euq3Pdpn6vDjhH+~0teK5NtY2nDr+SYq5h4R7A?ogD| zu@ZR&zSEwoV+KY1(>T!m<;~Gw9*4UhzcHqlxOXC>oy&}5mYHJaZHjR)m^L;vYpcrT zw%Yxnvx^-@hEuLXpj>>|#sx!Ad;!10UmD(dq$i-w3C;271u|S+*+$gl-qV{@H>HVm z(CXAGALfYw`*|4flMSx-*+$KS9~*4#UK+E^jeG9Q7tFo?cH`M6XbzWtwxLqi%eYEK z#|l$f*~N}kXOYqO6*64y|G+fm%&(Q!9T$ogbji3srz|PGKH)G_Rcd7LKVloEfzZ3c zh~EO*M2nWEUs>LZjorw2YnoPB<>T8-QC8#8lgjmD3#75w!2bv3kg~n=hxMe3zciJ5r^h@dk5P{tc9-iY$M_O#)0_GFdjeS zR=i8MZ-T?fDzrcALs7n!(|m&wdheCX&Y8bE_3_i>`5o&NXpW|IhmpK*A@e!q+BF36 eINLmW8|Poj8(O?H|5s!*=QxZ#smwJ%Mf?qx-ZoJH literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.20.1/.gradle/8.8/fileHashes/fileHashes.lock b/services/discord-rules/1.20.1/.gradle/8.8/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..af4794697e136091d95a9cf4dae1dd923fd30358 GIT binary patch literal 17 UcmZSPUNwDBv%lnA1_)3D04(7HwEzGB literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.20.1/.gradle/8.8/fileHashes/resourceHashesCache.bin b/services/discord-rules/1.20.1/.gradle/8.8/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..ce5797666302e381f178131b1155d8e451fe15c5 GIT binary patch literal 18735 zcmeI(&nv@m9LMo*E0p;$jMza|BT9bnAU~QP2lC@&Bq!!TD_4|+wJc?|8ZMF*mXexW z92^{!A7N3rXortK@m>3V6Z;Q%e(Ll6zI%P%htKWaqJ9nCxy1k ze>Pm-krVV3<~aiGW2t&E%>3D5TehrZwriEXSLMitW;+nsaopqIxwn_RRjt{gcRv)f zksT(p_hMR`kbU#epyrN2bcC aioN;B4rQ>mcv9&LLFar{;0VC literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.20.1/.gradle/8.8/gc.properties b/services/discord-rules/1.20.1/.gradle/8.8/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/services/discord-rules/1.20.1/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/services/discord-rules/1.20.1/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..7bd0c3667968c6902c91ebd7e0af65fabbdad018 GIT binary patch literal 17 TcmZS9Y`vAJZu?(`0Rof(D*ywJ literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.20.1/.gradle/buildOutputCleanup/cache.properties b/services/discord-rules/1.20.1/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..919adbd --- /dev/null +++ b/services/discord-rules/1.20.1/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Sun Apr 12 15:34:40 CDT 2026 +gradle.version=8.8 diff --git a/services/discord-rules/1.20.1/.gradle/buildOutputCleanup/outputFiles.bin b/services/discord-rules/1.20.1/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..05031ec79e7b63390aa887b021cb62ff8a06fd7f GIT binary patch literal 19073 zcmeI%Z%7jX7{~F;S+Q2FGV5B#8Mf5&#n2#H^QXP;H2nX8TduJiZw`;BeWQtBBUy|J`J?Hii8dp0*$%id$3XwPKsFI-<|pIs#nP`}E(J!@HT&pEA3 zdo0}Fmb9F*&Wc>1`LcMAxXe=V4HNaP+4BBZ)Gofe4q9ga4(x?*%5X-7ts6}?uWv@K4=<_zs0o?5S8%U<;wit9 zW^PdDZK>R=hC1}JA^#rr72Nq#5HvH@Yj}qM1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##An^AK COOLDOWNS = new ConcurrentHashMap<>(); + + public static boolean checkAndUpdateCooldown(ServerPlayer player) { + UUID playerId = player.getUUID(); + Instant now = Instant.now(); + int cooldownSeconds = ServerRulesConfig.COOLDOWN_SECONDS.get(); + Instant lastUsed = COOLDOWNS.get(playerId); + if (lastUsed != null) { + long secondsSinceLastUse = Duration.between(lastUsed, now).getSeconds(); + if (secondsSinceLastUse < cooldownSeconds) { + long remaining = cooldownSeconds - secondsSinceLastUse; + player.sendSystemMessage(Component.literal("\u00A7cPlease wait " + remaining + " seconds before checking the rules again.")); + return false; + } + } + COOLDOWNS.put(playerId, now); + return true; + } + + public static void removePlayer(UUID playerId) { COOLDOWNS.remove(playerId); } +} diff --git a/services/discord-rules/1.20.1/src/main/java/com/discordrules/DiscordFetcher.java b/services/discord-rules/1.20.1/src/main/java/com/discordrules/DiscordFetcher.java new file mode 100755 index 0000000..9f35c3a --- /dev/null +++ b/services/discord-rules/1.20.1/src/main/java/com/discordrules/DiscordFetcher.java @@ -0,0 +1,45 @@ +package com.discordrules; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; +import java.util.concurrent.CompletableFuture; + +public class DiscordFetcher { + private static final Logger LOGGER = LoggerFactory.getLogger(DiscordFetcher.class); + private static final HttpClient CLIENT = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build(); + + public static CompletableFuture fetchRulesAsync() { + if (!ServerRulesConfig.isMessageIdValid()) { + LOGGER.error("Invalid Discord Message ID in config."); + return CompletableFuture.completedFuture(null); + } + String token = ServerRulesConfig.BOT_TOKEN.get(); + String channelId = ServerRulesConfig.CHANNEL_ID.get(); + String messageId = ServerRulesConfig.MESSAGE_ID.get(); + URI uri = URI.create("https://discord.com/api/v10/channels/" + channelId + "/messages/" + messageId); + HttpRequest request = HttpRequest.newBuilder().uri(uri) + .header("Authorization", "Bot " + token) + .header("Accept", "application/json").GET().build(); + return CLIENT.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(response -> { + if (response.statusCode() == 200) { + JsonObject json = JsonParser.parseString(response.body()).getAsJsonObject(); + return json.get("content").getAsString(); + } else { + LOGGER.error("Discord API returned status: {}", response.statusCode()); + return null; + } + }) + .exceptionally(ex -> { + LOGGER.error("Network error while fetching Discord rules", ex); + return null; + }); + } +} diff --git a/services/discord-rules/1.20.1/src/main/java/com/discordrules/DiscordFormatter.java b/services/discord-rules/1.20.1/src/main/java/com/discordrules/DiscordFormatter.java new file mode 100755 index 0000000..d0ace99 --- /dev/null +++ b/services/discord-rules/1.20.1/src/main/java/com/discordrules/DiscordFormatter.java @@ -0,0 +1,42 @@ +package com.discordrules; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +public class DiscordFormatter { + public static MutableComponent formatRules(String rawDiscordText) { + String processedText = ServerRulesConfig.STRIP_EMOJIS.get() + ? stripEmojis(rawDiscordText) : rawDiscordText; + ChatFormatting headerColor = parseColor(ServerRulesConfig.HEADER_COLOR.get(), ChatFormatting.GOLD); + ChatFormatting bodyColor = parseColor(ServerRulesConfig.BODY_COLOR.get(), ChatFormatting.YELLOW); + MutableComponent rootComponent = Component.empty(); + String[] lines = processedText.split("\n"); + for (String line : lines) { + MutableComponent lineComponent; + if (line.startsWith("**") && line.endsWith("**")) { + String cleanLine = line.replace("**", ""); + lineComponent = Component.literal(cleanLine).withStyle(headerColor, ChatFormatting.BOLD); + } else if (line.trim().startsWith("-") || line.trim().startsWith("\u2022")) { + lineComponent = Component.literal(" " + line.trim()).withStyle(bodyColor); + } else { + lineComponent = Component.literal(line).withStyle(bodyColor); + } + rootComponent.append(lineComponent).append(Component.literal("\n")); + } + return rootComponent; + } + + private static String stripEmojis(String text) { + if (text == null) return ""; + return text.replaceAll("[\\x{1F300}-\\x{1F9FF}]", ""); + } + + private static ChatFormatting parseColor(String name, ChatFormatting fallback) { + try { + return ChatFormatting.valueOf(name.toUpperCase()); + } catch (IllegalArgumentException e) { + return fallback; + } + } +} diff --git a/services/discord-rules/1.20.1/src/main/java/com/discordrules/RulesCache.java b/services/discord-rules/1.20.1/src/main/java/com/discordrules/RulesCache.java new file mode 100755 index 0000000..6ffab0b --- /dev/null +++ b/services/discord-rules/1.20.1/src/main/java/com/discordrules/RulesCache.java @@ -0,0 +1,26 @@ +package com.discordrules; + +import java.time.Instant; + +public class RulesCache { + private static String cachedRules = null; + private static Instant lastFetchTime = Instant.MIN; + private static final String FALLBACK_RULES = + "Server Rules\n1. Be respectful to all players.\n2. No griefing or cheating.\n3. Follow staff instructions.\nPlease check Discord for the full rules list."; + + public static boolean isCacheValid() { + if (cachedRules == null) return false; + long cacheMinutes = ServerRulesConfig.CACHE_MINUTES.get(); + return Instant.now().isBefore(lastFetchTime.plusSeconds(cacheMinutes * 60)); + } + + public static void updateCache(String newRules) { + if (newRules != null && !newRules.trim().isEmpty()) { + cachedRules = newRules; + lastFetchTime = Instant.now(); + } + } + + public static String getRules() { return cachedRules != null ? cachedRules : FALLBACK_RULES; } + public static void invalidate() { cachedRules = null; lastFetchTime = Instant.MIN; } +} diff --git a/services/discord-rules/1.20.1/src/main/java/com/discordrules/RulesCommand.java b/services/discord-rules/1.20.1/src/main/java/com/discordrules/RulesCommand.java new file mode 100755 index 0000000..02907dc --- /dev/null +++ b/services/discord-rules/1.20.1/src/main/java/com/discordrules/RulesCommand.java @@ -0,0 +1,44 @@ +package com.discordrules; + +import com.mojang.brigadier.CommandDispatcher; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.server.level.ServerPlayer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RulesCommand { + private static final Logger LOGGER = LoggerFactory.getLogger(RulesCommand.class); + + public static void register(CommandDispatcher dispatcher) { + dispatcher.register(Commands.literal("rules").executes(context -> { + CommandSourceStack source = context.getSource(); + if (source.getEntity() == null || !(source.getEntity() instanceof ServerPlayer)) { + source.sendSystemMessage(DiscordFormatter.formatRules(RulesCache.getRules())); + return 1; + } + ServerPlayer player = (ServerPlayer) source.getEntity(); + if (!CooldownManager.checkAndUpdateCooldown(player)) return 0; + if (RulesCache.isCacheValid()) { + player.sendSystemMessage(DiscordFormatter.formatRules(RulesCache.getRules())); + return 1; + } + player.sendSystemMessage(Component.literal("\u00A77Fetching latest rules...")); + DiscordFetcher.fetchRulesAsync().thenAccept(fetchedRules -> { + String rulesText; + if (fetchedRules != null) { + RulesCache.updateCache(fetchedRules); + rulesText = fetchedRules; + } else { + LOGGER.warn("Discord fetch failed. Falling back to cached rules for {}", player.getName().getString()); + rulesText = RulesCache.getRules(); + } + MutableComponent formattedRules = DiscordFormatter.formatRules(rulesText); + source.getServer().execute(() -> player.sendSystemMessage(formattedRules)); + }); + return 1; + })); + } +} diff --git a/services/discord-rules/1.20.1/src/main/java/com/discordrules/ServerRules.java b/services/discord-rules/1.20.1/src/main/java/com/discordrules/ServerRules.java new file mode 100755 index 0000000..ce1f082 --- /dev/null +++ b/services/discord-rules/1.20.1/src/main/java/com/discordrules/ServerRules.java @@ -0,0 +1,40 @@ +package com.discordrules; + +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.RegisterCommandsEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.event.config.ModConfigEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Mod("discordrules") +public class ServerRules { + private static final Logger LOGGER = LoggerFactory.getLogger(ServerRules.class); + + public ServerRules() { + ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, ServerRulesConfig.SPEC); + MinecraftForge.EVENT_BUS.register(this); + LOGGER.info("Discord Rules Mod Initialized."); + } + + @SubscribeEvent + public void onRegisterCommands(RegisterCommandsEvent event) { + RulesCommand.register(event.getDispatcher()); + LOGGER.info("Registered /rules command."); + } + + @SubscribeEvent + public void onPlayerLogout(PlayerEvent.PlayerLoggedOutEvent event) { + CooldownManager.removePlayer(event.getEntity().getUUID()); + } + + @SubscribeEvent + public void onConfigReload(ModConfigEvent.Reloading event) { + LOGGER.info("Rules configuration reloaded! Invalidating cache."); + RulesCache.invalidate(); + } +} diff --git a/services/discord-rules/1.20.1/src/main/java/com/discordrules/ServerRulesConfig.java b/services/discord-rules/1.20.1/src/main/java/com/discordrules/ServerRulesConfig.java new file mode 100755 index 0000000..62b38fb --- /dev/null +++ b/services/discord-rules/1.20.1/src/main/java/com/discordrules/ServerRulesConfig.java @@ -0,0 +1,40 @@ +package com.discordrules; + +import net.minecraftforge.common.ForgeConfigSpec; +import org.apache.commons.lang3.StringUtils; + +public class ServerRulesConfig { + public static final ForgeConfigSpec SPEC; + public static final ForgeConfigSpec.ConfigValue BOT_TOKEN; + public static final ForgeConfigSpec.ConfigValue CHANNEL_ID; + public static final ForgeConfigSpec.ConfigValue MESSAGE_ID; + public static final ForgeConfigSpec.IntValue COOLDOWN_SECONDS; + public static final ForgeConfigSpec.IntValue CACHE_MINUTES; + public static final ForgeConfigSpec.ConfigValue HEADER_COLOR; + public static final ForgeConfigSpec.ConfigValue BODY_COLOR; + public static final ForgeConfigSpec.BooleanValue STRIP_EMOJIS; + + static { + ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder(); + builder.push("discord"); + BOT_TOKEN = builder.comment("Discord Bot Token").define("bot_token", "YOUR_TOKEN_HERE"); + CHANNEL_ID = builder.comment("Discord Channel ID").define("channel_id", "1234567890123456789"); + MESSAGE_ID = builder.comment("Discord Message ID").define("message_id", "1234567890123456789"); + builder.pop(); + builder.push("display"); + HEADER_COLOR = builder.comment("Header color (bold lines). Valid values: BLACK, DARK_BLUE, DARK_GREEN, DARK_AQUA, DARK_RED, DARK_PURPLE, GOLD, GRAY, DARK_GRAY, BLUE, GREEN, AQUA, RED, LIGHT_PURPLE, YELLOW, WHITE").define("header_color", "GOLD"); + BODY_COLOR = builder.comment("Body color (regular lines and bullet points)").define("body_color", "YELLOW"); + STRIP_EMOJIS = builder.comment("Strip emojis that Minecraft can't render (recommended: true)").define("strip_emojis", true); + builder.pop(); + builder.push("performance"); + COOLDOWN_SECONDS = builder.comment("Per-player cooldown in seconds").defineInRange("cooldown_seconds", 60, 0, 3600); + CACHE_MINUTES = builder.comment("Cache duration in minutes").defineInRange("cache_minutes", 30, 1, 1440); + builder.pop(); + SPEC = builder.build(); + } + + public static boolean isMessageIdValid() { + String id = MESSAGE_ID.get(); + return StringUtils.isNotBlank(id) && id.matches("^\\d{17,20}$"); + } +} diff --git a/services/discord-rules/1.20.1/src/main/resources/META-INF/mods.toml b/services/discord-rules/1.20.1/src/main/resources/META-INF/mods.toml new file mode 100755 index 0000000..3cec631 --- /dev/null +++ b/services/discord-rules/1.20.1/src/main/resources/META-INF/mods.toml @@ -0,0 +1,27 @@ +modLoader="javafml" +loaderVersion="[47,)" +license="MIT" + +[[mods]] +modId="discordrules" +version="${file.jarVersion}" +displayName="Discord Rules" +authors="FirefrostGaming" +description=''' +Displays server rules in-game via /rules, fetched live from a Discord message. +Fully configurable colors, cooldowns, and caching. +''' + +[[dependencies.discordrules]] +modId="forge" +mandatory=true +versionRange="[47,)" +ordering="NONE" +side="SERVER" + +[[dependencies.discordrules]] +modId="minecraft" +mandatory=true +versionRange="[1.20.1,1.21)" +ordering="NONE" +side="SERVER" diff --git a/services/discord-rules/1.21.1/.gradle/8.8/checksums/checksums.lock b/services/discord-rules/1.21.1/.gradle/8.8/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..08283897addb060ab828f7f09f2dc1b7274a52b6 GIT binary patch literal 17 VcmZQ(ey2CHCg)!%0~jzz001$H1abfX literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.21.1/.gradle/8.8/checksums/md5-checksums.bin b/services/discord-rules/1.21.1/.gradle/8.8/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..5e601fff290b078544779574d1227729a6fa54e0 GIT binary patch literal 30397 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 Fe*jxjFS`H$ literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.21.1/.gradle/8.8/checksums/sha1-checksums.bin b/services/discord-rules/1.21.1/.gradle/8.8/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..6440322df1fd292d9f9ae2ea0edaa25c657459b4 GIT binary patch literal 76271 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 JiG%6;{vXv2bZ`Iw literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.21.1/.gradle/8.8/executionHistory/executionHistory.lock b/services/discord-rules/1.21.1/.gradle/8.8/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..27c1f70836d3fb74458c33a0a2df66668666805b GIT binary patch literal 17 UcmZQp)bsjoU%ll$0|ZC_04-qz2><{9 literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.21.1/.gradle/8.8/fileChanges/last-build.bin b/services/discord-rules/1.21.1/.gradle/8.8/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.21.1/.gradle/8.8/fileHashes/fileHashes.bin b/services/discord-rules/1.21.1/.gradle/8.8/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..4d9002b95ff6e8c501a081d3351bff3fec8b9282 GIT binary patch literal 18697 zcmeI)J4nMo9LMof#KBh!B6QV38YrdKp^H?+41)N8XmId>i_W2nAn2eHHxVM}(ow`M zRB#g%9CQ!|Eka#X9DIP_R45g_a0x{^y2&?ixj+Bo$K^h2NOU10;cx#Em8-2%QXzl< z0tg_000IagfB*srAbbNbwm6Il8kuV literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.21.1/.gradle/8.8/fileHashes/fileHashes.lock b/services/discord-rules/1.21.1/.gradle/8.8/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..a68c06dd120b31316d8a087e6408afa5fc9937b2 GIT binary patch literal 17 TcmZRsW9;#mn^@$>00A5TCPV`r literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.21.1/.gradle/8.8/gc.properties b/services/discord-rules/1.21.1/.gradle/8.8/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/services/discord-rules/1.21.1/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/services/discord-rules/1.21.1/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..2322949afb53e969084d9f84029d3d8ace0cb8b9 GIT binary patch literal 17 UcmZRcmvdp+1^G)S7$86c06xD3H2?qr literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.21.1/.gradle/buildOutputCleanup/cache.properties b/services/discord-rules/1.21.1/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..22cb890 --- /dev/null +++ b/services/discord-rules/1.21.1/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Sun Apr 12 15:23:51 CDT 2026 +gradle.version=8.8 diff --git a/services/discord-rules/1.21.1/.gradle/buildOutputCleanup/outputFiles.bin b/services/discord-rules/1.21.1/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..31dbde66417f6cc4f6129872a0f4551b90977e0c GIT binary patch literal 18731 zcmeI%Pbh<79Ki8slEwV1WsTH(5Ty&mOXRS6zrCeN4N|aU( za!^_>JGc-LYRbi7i4^baeSR&uIZ*n(^*-;@_kG^p_xW7kex>}4@A^>Xqp3V)h5!Nx zAbaMjWb?d%p?6KtD zaBdIY%Kw9{d?bC@9-GiTC4D~_dh+(J?CIVo{cL%6dUWpQME8R9>#FBSvN#lQy6Ki) zOwX7tlM7RNeM$Ojo8h^tG@`mMNjC-(xv^mWSodw|fzHK(&(q=8eN}o-{Ow{V)Rl3% z*(^Q$l0D6wdt-WiLVEJyppd&;^XPskeKy{@Ie$NXr2DXRxhmx{oqLQ3AbBM literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.21.1/.gradle/file-system.probe b/services/discord-rules/1.21.1/.gradle/file-system.probe new file mode 100644 index 0000000000000000000000000000000000000000..bb043471803c4d8bd075d8be9551cf670df499d9 GIT binary patch literal 8 PcmZQzV4T|=_b(U#2$TZR literal 0 HcmV?d00001 diff --git a/services/discord-rules/1.21.1/.gradle/vcs-1/gc.properties b/services/discord-rules/1.21.1/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/services/discord-rules/1.21.1/build.gradle b/services/discord-rules/1.21.1/build.gradle new file mode 100644 index 0000000..a0334f7 --- /dev/null +++ b/services/discord-rules/1.21.1/build.gradle @@ -0,0 +1,35 @@ +plugins { + id 'java-library' + id 'net.neoforged.moddev' version '2.0.141' +} + +version = mod_version +group = mod_group_id + +repositories { + mavenCentral() +} + +dependencies { +} + +neoForge { + version = neo_version + + runs { + server { + server() + } + } + + mods { + "${mod_id}" { + sourceSet sourceSets.main + } + } +} + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' + options.release.set(21) +} diff --git a/services/discord-rules/1.21.1/gradle.properties b/services/discord-rules/1.21.1/gradle.properties new file mode 100644 index 0000000..ce7412d --- /dev/null +++ b/services/discord-rules/1.21.1/gradle.properties @@ -0,0 +1,11 @@ +org.gradle.jvmargs=-Xmx1G -XX:+UseG1GC +net.neoforged.moddev.decompiler.maxMemory=2G +org.gradle.daemon=false + +minecraft_version=1.21.1 +neo_version=21.1.65 + +mod_id=discordrules +mod_name=Discord Rules +mod_version=1.0.0 +mod_group_id=com.discordrules diff --git a/services/discord-rules/1.21.1/gradle/wrapper/gradle-wrapper.jar b/services/discord-rules/1.21.1/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e6441136f3d4ba8a0da8d277868979cfbc8ad796 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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
NnX)EH+Nua)3Y(c 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/services/discord-rules/1.21.1/gradlew.bat b/services/discord-rules/1.21.1/gradlew.bat new file mode 100644 index 0000000..7101f8e --- /dev/null +++ b/services/discord-rules/1.21.1/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/services/discord-rules/1.21.1/settings.gradle b/services/discord-rules/1.21.1/settings.gradle new file mode 100644 index 0000000..6035e27 --- /dev/null +++ b/services/discord-rules/1.21.1/settings.gradle @@ -0,0 +1,12 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { url = 'https://maven.neoforged.net/releases' } + } +} + +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' +} + +rootProject.name = 'discordrules' diff --git a/services/discord-rules/1.21.1/src/main/java/com/discordrules/CooldownManager.java b/services/discord-rules/1.21.1/src/main/java/com/discordrules/CooldownManager.java new file mode 100644 index 0000000..be1ba3a --- /dev/null +++ b/services/discord-rules/1.21.1/src/main/java/com/discordrules/CooldownManager.java @@ -0,0 +1,31 @@ +package com.discordrules; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import java.time.Duration; +import java.time.Instant; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class CooldownManager { + private static final ConcurrentHashMap COOLDOWNS = new ConcurrentHashMap<>(); + + public static boolean checkAndUpdateCooldown(ServerPlayer player) { + UUID playerId = player.getUUID(); + Instant now = Instant.now(); + int cooldownSeconds = ServerRulesConfig.COOLDOWN_SECONDS.get(); + Instant lastUsed = COOLDOWNS.get(playerId); + if (lastUsed != null) { + long secondsSinceLastUse = Duration.between(lastUsed, now).getSeconds(); + if (secondsSinceLastUse < cooldownSeconds) { + long remaining = cooldownSeconds - secondsSinceLastUse; + player.sendSystemMessage(Component.literal("\u00A7cPlease wait " + remaining + " seconds before checking the rules again.")); + return false; + } + } + COOLDOWNS.put(playerId, now); + return true; + } + + public static void removePlayer(UUID playerId) { COOLDOWNS.remove(playerId); } +} diff --git a/services/discord-rules/1.21.1/src/main/java/com/discordrules/DiscordFetcher.java b/services/discord-rules/1.21.1/src/main/java/com/discordrules/DiscordFetcher.java new file mode 100644 index 0000000..9f35c3a --- /dev/null +++ b/services/discord-rules/1.21.1/src/main/java/com/discordrules/DiscordFetcher.java @@ -0,0 +1,45 @@ +package com.discordrules; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; +import java.util.concurrent.CompletableFuture; + +public class DiscordFetcher { + private static final Logger LOGGER = LoggerFactory.getLogger(DiscordFetcher.class); + private static final HttpClient CLIENT = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build(); + + public static CompletableFuture fetchRulesAsync() { + if (!ServerRulesConfig.isMessageIdValid()) { + LOGGER.error("Invalid Discord Message ID in config."); + return CompletableFuture.completedFuture(null); + } + String token = ServerRulesConfig.BOT_TOKEN.get(); + String channelId = ServerRulesConfig.CHANNEL_ID.get(); + String messageId = ServerRulesConfig.MESSAGE_ID.get(); + URI uri = URI.create("https://discord.com/api/v10/channels/" + channelId + "/messages/" + messageId); + HttpRequest request = HttpRequest.newBuilder().uri(uri) + .header("Authorization", "Bot " + token) + .header("Accept", "application/json").GET().build(); + return CLIENT.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(response -> { + if (response.statusCode() == 200) { + JsonObject json = JsonParser.parseString(response.body()).getAsJsonObject(); + return json.get("content").getAsString(); + } else { + LOGGER.error("Discord API returned status: {}", response.statusCode()); + return null; + } + }) + .exceptionally(ex -> { + LOGGER.error("Network error while fetching Discord rules", ex); + return null; + }); + } +} diff --git a/services/discord-rules/1.21.1/src/main/java/com/discordrules/DiscordFormatter.java b/services/discord-rules/1.21.1/src/main/java/com/discordrules/DiscordFormatter.java new file mode 100644 index 0000000..d0ace99 --- /dev/null +++ b/services/discord-rules/1.21.1/src/main/java/com/discordrules/DiscordFormatter.java @@ -0,0 +1,42 @@ +package com.discordrules; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +public class DiscordFormatter { + public static MutableComponent formatRules(String rawDiscordText) { + String processedText = ServerRulesConfig.STRIP_EMOJIS.get() + ? stripEmojis(rawDiscordText) : rawDiscordText; + ChatFormatting headerColor = parseColor(ServerRulesConfig.HEADER_COLOR.get(), ChatFormatting.GOLD); + ChatFormatting bodyColor = parseColor(ServerRulesConfig.BODY_COLOR.get(), ChatFormatting.YELLOW); + MutableComponent rootComponent = Component.empty(); + String[] lines = processedText.split("\n"); + for (String line : lines) { + MutableComponent lineComponent; + if (line.startsWith("**") && line.endsWith("**")) { + String cleanLine = line.replace("**", ""); + lineComponent = Component.literal(cleanLine).withStyle(headerColor, ChatFormatting.BOLD); + } else if (line.trim().startsWith("-") || line.trim().startsWith("\u2022")) { + lineComponent = Component.literal(" " + line.trim()).withStyle(bodyColor); + } else { + lineComponent = Component.literal(line).withStyle(bodyColor); + } + rootComponent.append(lineComponent).append(Component.literal("\n")); + } + return rootComponent; + } + + private static String stripEmojis(String text) { + if (text == null) return ""; + return text.replaceAll("[\\x{1F300}-\\x{1F9FF}]", ""); + } + + private static ChatFormatting parseColor(String name, ChatFormatting fallback) { + try { + return ChatFormatting.valueOf(name.toUpperCase()); + } catch (IllegalArgumentException e) { + return fallback; + } + } +} diff --git a/services/discord-rules/1.21.1/src/main/java/com/discordrules/RulesCache.java b/services/discord-rules/1.21.1/src/main/java/com/discordrules/RulesCache.java new file mode 100644 index 0000000..6ffab0b --- /dev/null +++ b/services/discord-rules/1.21.1/src/main/java/com/discordrules/RulesCache.java @@ -0,0 +1,26 @@ +package com.discordrules; + +import java.time.Instant; + +public class RulesCache { + private static String cachedRules = null; + private static Instant lastFetchTime = Instant.MIN; + private static final String FALLBACK_RULES = + "Server Rules\n1. Be respectful to all players.\n2. No griefing or cheating.\n3. Follow staff instructions.\nPlease check Discord for the full rules list."; + + public static boolean isCacheValid() { + if (cachedRules == null) return false; + long cacheMinutes = ServerRulesConfig.CACHE_MINUTES.get(); + return Instant.now().isBefore(lastFetchTime.plusSeconds(cacheMinutes * 60)); + } + + public static void updateCache(String newRules) { + if (newRules != null && !newRules.trim().isEmpty()) { + cachedRules = newRules; + lastFetchTime = Instant.now(); + } + } + + public static String getRules() { return cachedRules != null ? cachedRules : FALLBACK_RULES; } + public static void invalidate() { cachedRules = null; lastFetchTime = Instant.MIN; } +} diff --git a/services/discord-rules/1.21.1/src/main/java/com/discordrules/RulesCommand.java b/services/discord-rules/1.21.1/src/main/java/com/discordrules/RulesCommand.java new file mode 100644 index 0000000..997562b --- /dev/null +++ b/services/discord-rules/1.21.1/src/main/java/com/discordrules/RulesCommand.java @@ -0,0 +1,44 @@ +package com.discordrules; + +import com.mojang.brigadier.CommandDispatcher; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.server.level.ServerPlayer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RulesCommand { + private static final Logger LOGGER = LoggerFactory.getLogger(RulesCommand.class); + + public static void register(CommandDispatcher dispatcher) { + dispatcher.register(Commands.literal("rules").executes(context -> { + CommandSourceStack source = context.getSource(); + if (!source.isPlayer()) { + source.sendSystemMessage(DiscordFormatter.formatRules(RulesCache.getRules())); + return 1; + } + ServerPlayer player = source.getPlayer(); + if (!CooldownManager.checkAndUpdateCooldown(player)) return 0; + if (RulesCache.isCacheValid()) { + player.sendSystemMessage(DiscordFormatter.formatRules(RulesCache.getRules())); + return 1; + } + player.sendSystemMessage(Component.literal("\u00A77Fetching latest rules...")); + DiscordFetcher.fetchRulesAsync().thenAccept(fetchedRules -> { + String rulesText; + if (fetchedRules != null) { + RulesCache.updateCache(fetchedRules); + rulesText = fetchedRules; + } else { + LOGGER.warn("Discord fetch failed. Falling back to cached rules for {}", player.getName().getString()); + rulesText = RulesCache.getRules(); + } + MutableComponent formattedRules = DiscordFormatter.formatRules(rulesText); + source.getServer().execute(() -> player.sendSystemMessage(formattedRules)); + }); + return 1; + })); + } +} diff --git a/services/discord-rules/1.21.1/src/main/java/com/discordrules/ServerRules.java b/services/discord-rules/1.21.1/src/main/java/com/discordrules/ServerRules.java new file mode 100644 index 0000000..a32ae1c --- /dev/null +++ b/services/discord-rules/1.21.1/src/main/java/com/discordrules/ServerRules.java @@ -0,0 +1,41 @@ +package com.discordrules; + +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.fml.event.config.ModConfigEvent; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.RegisterCommandsEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Mod("discordrules") +public class ServerRules { + private static final Logger LOGGER = LoggerFactory.getLogger(ServerRules.class); + + public ServerRules(IEventBus modEventBus, ModContainer modContainer) { + modContainer.registerConfig(ModConfig.Type.SERVER, ServerRulesConfig.SPEC); + modEventBus.addListener(this::onConfigReload); + NeoForge.EVENT_BUS.register(this); + LOGGER.info("Discord Rules Mod Initialized."); + } + + @SubscribeEvent + public void onRegisterCommands(RegisterCommandsEvent event) { + RulesCommand.register(event.getDispatcher()); + LOGGER.info("Registered /rules command."); + } + + @SubscribeEvent + public void onPlayerLogout(PlayerEvent.PlayerLoggedOutEvent event) { + CooldownManager.removePlayer(event.getEntity().getUUID()); + } + + private void onConfigReload(ModConfigEvent.Reloading event) { + LOGGER.info("Rules configuration reloaded! Invalidating cache."); + RulesCache.invalidate(); + } +} diff --git a/services/discord-rules/1.21.1/src/main/java/com/discordrules/ServerRulesConfig.java b/services/discord-rules/1.21.1/src/main/java/com/discordrules/ServerRulesConfig.java new file mode 100644 index 0000000..3a270f7 --- /dev/null +++ b/services/discord-rules/1.21.1/src/main/java/com/discordrules/ServerRulesConfig.java @@ -0,0 +1,40 @@ +package com.discordrules; + +import net.neoforged.neoforge.common.ModConfigSpec; +import org.apache.commons.lang3.StringUtils; + +public class ServerRulesConfig { + public static final ModConfigSpec SPEC; + public static final ModConfigSpec.ConfigValue BOT_TOKEN; + public static final ModConfigSpec.ConfigValue CHANNEL_ID; + public static final ModConfigSpec.ConfigValue MESSAGE_ID; + public static final ModConfigSpec.IntValue COOLDOWN_SECONDS; + public static final ModConfigSpec.IntValue CACHE_MINUTES; + public static final ModConfigSpec.ConfigValue HEADER_COLOR; + public static final ModConfigSpec.ConfigValue BODY_COLOR; + public static final ModConfigSpec.BooleanValue STRIP_EMOJIS; + + static { + ModConfigSpec.Builder builder = new ModConfigSpec.Builder(); + builder.push("discord"); + BOT_TOKEN = builder.comment("Discord Bot Token").define("bot_token", "YOUR_TOKEN_HERE"); + CHANNEL_ID = builder.comment("Discord Channel ID").define("channel_id", "1234567890123456789"); + MESSAGE_ID = builder.comment("Discord Message ID").define("message_id", "1234567890123456789"); + builder.pop(); + builder.push("display"); + HEADER_COLOR = builder.comment("Header color (bold lines). Valid values: BLACK, DARK_BLUE, DARK_GREEN, DARK_AQUA, DARK_RED, DARK_PURPLE, GOLD, GRAY, DARK_GRAY, BLUE, GREEN, AQUA, RED, LIGHT_PURPLE, YELLOW, WHITE").define("header_color", "GOLD"); + BODY_COLOR = builder.comment("Body color (regular lines and bullet points)").define("body_color", "YELLOW"); + STRIP_EMOJIS = builder.comment("Strip emojis that Minecraft can't render (recommended: true)").define("strip_emojis", true); + builder.pop(); + builder.push("performance"); + COOLDOWN_SECONDS = builder.comment("Per-player cooldown in seconds").defineInRange("cooldown_seconds", 60, 0, 3600); + CACHE_MINUTES = builder.comment("Cache duration in minutes").defineInRange("cache_minutes", 30, 1, 1440); + builder.pop(); + SPEC = builder.build(); + } + + public static boolean isMessageIdValid() { + String id = MESSAGE_ID.get(); + return StringUtils.isNotBlank(id) && id.matches("^\\d{17,20}$"); + } +} diff --git a/services/discord-rules/1.21.1/src/main/resources/META-INF/neoforge.mods.toml b/services/discord-rules/1.21.1/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..9e5a148 --- /dev/null +++ b/services/discord-rules/1.21.1/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,28 @@ +modLoader="javafml" +loaderVersion="[4,)" +license="MIT" +showAsResourcePack=false + +[[mods]] +modId="discordrules" +version="${file.jarVersion}" +displayName="Discord Rules" +authors="FirefrostGaming" +description=''' +Displays server rules in-game via /rules, fetched live from a Discord message. +Fully configurable colors, cooldowns, and caching. +''' + +[[dependencies.discordrules]] +modId="neoforge" +type="required" +versionRange="[21.1,)" +ordering="NONE" +side="SERVER" + +[[dependencies.discordrules]] +modId="minecraft" +type="required" +versionRange="[1.21.1,1.22)" +ordering="NONE" +side="SERVER"