From 7784f65c7448967d1ae01fe2ce2db98f5b570234 Mon Sep 17 00:00:00 2001 From: J-onasJones Date: Sun, 12 Jun 2022 17:26:51 +0200 Subject: [PATCH] Added basic command structure with console feedback --- README.md | 24 ++ .../ConsoleMC.main/assets/consolemc/icon.png | Bin 453 -> 31982 bytes .../ConsoleMC.main/assets/modid/icon.png | Bin 453 -> 0 bytes production/ConsoleMC.main/fabric.mod.json | 2 +- .../me/jonasjones/consolemc/ConsoleMC.class | Bin 1817 -> 1956 bytes .../consolemc/command/RunCommand.class | Bin 6595 -> 12128 bytes .../consolemc/config/ConfigHandler.class | Bin 0 -> 326 bytes .../consolemc/config/ModConfigProvider.class | Bin 0 -> 2186 bytes .../consolemc/config/ModConfigs.class | Bin 0 -> 3105 bytes .../config/SimpleConfig$ConfigRequest.class | Bin 0 -> 2164 bytes .../config/SimpleConfig$DefaultConfig.class | Bin 0 -> 472 bytes .../consolemc/config/SimpleConfig.class | Bin 0 -> 6014 bytes production/ConsoleMC.main/modid.mixins.json | 14 - .../net/fabricmc/example/ExampleMod.class | Bin 719 -> 0 bytes .../fabricmc/example/mixin/ExampleMixin.class | Bin 1057 -> 0 bytes .../me/jonasjones/consolemc/ConsoleMC.java | 5 +- .../consolemc/command/RunCommand.java | 150 +++++++++-- .../consolemc/config/ModConfigProvider.java | 28 ++ .../consolemc/config/ModConfigs.java | 39 +++ .../consolemc/config/SimpleConfig.java | 253 ++++++++++++++++++ 20 files changed, 478 insertions(+), 37 deletions(-) delete mode 100644 production/ConsoleMC.main/assets/modid/icon.png create mode 100644 production/ConsoleMC.main/me/jonasjones/consolemc/config/ConfigHandler.class create mode 100644 production/ConsoleMC.main/me/jonasjones/consolemc/config/ModConfigProvider.class create mode 100644 production/ConsoleMC.main/me/jonasjones/consolemc/config/ModConfigs.class create mode 100644 production/ConsoleMC.main/me/jonasjones/consolemc/config/SimpleConfig$ConfigRequest.class create mode 100644 production/ConsoleMC.main/me/jonasjones/consolemc/config/SimpleConfig$DefaultConfig.class create mode 100644 production/ConsoleMC.main/me/jonasjones/consolemc/config/SimpleConfig.class delete mode 100644 production/ConsoleMC.main/modid.mixins.json delete mode 100644 production/ConsoleMC.main/net/fabricmc/example/ExampleMod.class delete mode 100644 production/ConsoleMC.main/net/fabricmc/example/mixin/ExampleMixin.class create mode 100644 src/main/java/me/jonasjones/consolemc/config/ModConfigProvider.java create mode 100644 src/main/java/me/jonasjones/consolemc/config/ModConfigs.java create mode 100644 src/main/java/me/jonasjones/consolemc/config/SimpleConfig.java diff --git a/README.md b/README.md index 37d6d85..ba1aa11 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,26 @@ # ConsoleMC A mod that allows console commands to be executed over the ingame Minecraft chat. + +## //TODO +- Readme +- proper terminal input chat +- config file + - running -> allow /cmd + - allow-commandblock -> allow the use of /cmd in command blocks + - require-op -> require op to run /cmd + - blacklist -> players that are not allowed to run /cmd even though match all criteria + - whitelist -> players that are allowed to run /cmd even though don't match the criteria +- command + - /cmd [command] -> run command + - /cmd reload -> reload config + - /cmd disable -> toggle cmd off + - /cmd enable -> toggle cmd on + - /cmd help -> print help + - /cmd whitelist + - /cmd whitelist add [player] + - /cmd whitelist remove [player] + - /cmd blacklist + - /cmd blacklist add [player] + - /cmd blacklist remove [player] + - /cmd allow-commandBlock [True/False] + - /cmd require-op [True/False] \ No newline at end of file diff --git a/production/ConsoleMC.main/assets/consolemc/icon.png b/production/ConsoleMC.main/assets/consolemc/icon.png index 047b91f2347de5cf95f23284476fddbe21ba23fe..41a0a240f768128d2675a79e193df79105db74d6 100644 GIT binary patch literal 31982 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 FV1k}KHtqlb literal 453 zcmV;$0XqJPP)QAFYGys`80vegN0XDFh0OXKz&i8?Le#x7{1X)R+00000NkvXXu0mjf73i~T diff --git a/production/ConsoleMC.main/assets/modid/icon.png b/production/ConsoleMC.main/assets/modid/icon.png deleted file mode 100644 index 047b91f2347de5cf95f23284476fddbe21ba23fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 453 zcmV;$0XqJPP)QAFYGys`80vegN0XDFh0OXKz&i8?Le#x7{1X)R+00000NkvXXu0mjf73i~T diff --git a/production/ConsoleMC.main/fabric.mod.json b/production/ConsoleMC.main/fabric.mod.json index cc15a60..d603c36 100644 --- a/production/ConsoleMC.main/fabric.mod.json +++ b/production/ConsoleMC.main/fabric.mod.json @@ -16,7 +16,7 @@ "license": "CC0-1.0", "icon": "assets/consolemc/icon.png", - "environment": "*", + "environment": "server", "entrypoints": { "main": [ "me.jonasjones.consolemc.ConsoleMC" diff --git a/production/ConsoleMC.main/me/jonasjones/consolemc/ConsoleMC.class b/production/ConsoleMC.main/me/jonasjones/consolemc/ConsoleMC.class index 4ae6c4952b3e7650f78dcdc8b390c96c22dbe922..28ecc87fbef0e8e6b90f1c6386f7d83cbc9dc735 100644 GIT binary patch delta 591 zcmYjNO-~b16g_u3)1l*J3L{^I7O8+h3yuPUP*9}B0=CqG?np?*GAXH@WJ=t^A8FXKqtC=M1PO8Oi;G{>(Gw?xxWDdI%RhDu3}8^l zkck%<78g`3Mlot4fg~ZAD`d0F8w5M&`L0v1?oRDFInQ;=ek#Q7<0f9hVO_qE*bYpp0s^5kj09QRTE*b zNkaahxK;<$9AQWt2D(I_)=KNb(Z;AKwzL&>laLhKT2fqTv2Rf*AiQFX$gz1_BP_?g4B(!BggE z9;|1Xl`eV{olW#Unp+4k-No3=;>dp?`h7?X-agnQZcPBo?r-9G10!~S17p&Skbca! m(88MvK&C2~LyD`Me4e>9mib#_#^$$A$fLlqpRs{2i;;hilvr>8 delta 490 zcmYjNxlRI66g_X4VPG6&iGrYvj)EfNzAK`*Au5f9y#%R5#)Mdt*!Tgjvew2DNt6)d z2WY`J_#?(Upx{gHzMOO4qx-&B`S@8ma!sZRmB?CYqvI$u>`*pAG}EgTiBM7 zQsG8|Ax=0UekSSS9z&FS#6VvrSGp(`%8{&TUfx{GIAGAM0)LZyEW?{pMm%OP_?Kw# zv^`u2Kmfx8NzfufM~LK0u#=voXqGG^E5%>Is^kcWleWr$69#Fu-GC`fQ=}l&8IDo6 z_0(s`4Y+_8coU}sK3gAHxyp)>hj4iZUh)Es(E~M2C^uq@KKUnb>)v9lGa}Bh}l^m zIDrJ5V2B|Jgd-dQ!cCk55^P~|&?`;Tw9U~wz0;&OX`3Eto8tW6o7qFVvzDbMzuNlE z%=_MZ-~GP#z3=Te-aYdb0PEy*1XZXGp~k=j)C#8THxHUEDKp*Q($%})io1f^waIkS zT`#C^Y}y${m>==MLfXle7_ zoo3qXw;Vwzm2@q~ObOZ>I|>wgTql|CZ*A(}yp}I|W0QwH>n2kzec5!}P1@;}?T(d5#!c61jbIw4 zhcLsyOw1B28wXuM*s*TQCLJpy*yc-9iQXuZm5LO`Y%1Hyro)&cnA~QkGj_^~`Pz)& z5?mTW%s>O?3YLzv07cQNH+?m=bXu7VwV$K0=>xQ2<92M9P_D& z94*120J8>LH8&^IQq0+CKG5x{JdvAIZ~{T2f!S#CtRHAlUw`C%0Tza^$iNk75iAcJ zob$R06e+cJ*otTAaN7KVIC2EXXny6LOAIW zc&}jbNZXZcgFSjz^jY$dO~f6zGlcgW_yFz_%p5sibFxFzud@3Divq%GY1q!sp}a?N z%)kfnA%T&x(upmWmFT501s6A#1pC6QJxx2Kn1tg7?!|rNXwW=hQ48EJcO~5cwFkLo z+NGz>4`ilnH;>>1?hoMs10TUh1 z;G1gE|CZV%1GG}`<9wc81`6YM1haRLA?B$YbUNTKEiWC2;M@342;VjEyUL<1Bg35^ zE(ttjI|o|4aJgOYY~G$lA8>7tdX$;|@hGA=9-$il(7+$*<4bN&@u@QZ_#Tzjt{L@YsT_fk;j;F(n`$KYucD7a?Pk+W?Oc!*K&5K%wEUaxS85%I!V>`fjpEYnFuZH zs1&*BNBR)XP2CSjJU2a6K@I+hLW1+wl{;*u`J#skl z%yc}FOW77|F2OWD>6tZk*u`dMjl?(gP3I}?+H*6~Q+@(yT~EpCdXoKVlNk$L?c3+8 z*>TY-;qTlkFBv>Otty|2mhWmjMfwY0IRg18ulQ964BWxSGJafY5*!T5fyTh*xX3D9 zQ7t-ZFze`Xd0OiW!dU4+>4Ys zD{a`p&OJV_p^0j}3J}Xj!Hc$XQcW8?{EN*9$1T+IU<;i)*AYBcA%dQJUNEhnvzekP zbFepI&hvIM%bB-i8MCDPxiAxwF4p1$!;F%G0$?l^m(5)n0AqEzY~1ny7L+S zLeg)@fFuQT3n40*K4>3c8B@CpXPA9v+_jw}Ovnd|Ti+~>bp9ldz%?wwr>xAp4%VTHVPim*00qCDYULee_a)}YGg z(}vt6`=;;@X9;r@EMv%C-O8%gK|}WF)?w8;V#sdYI;vXlHRML!x#04e8OX`&H`!L%MbAqpI~WL$24Yhg9q1hHTd@ zoqlR?o)+ZwJxI7V(Cs}Wirm>@6acGeHrk z)NWyUn%Q}`nP!1y#2sa9uFMU~vn&?tq+pF|FN|%oW0`DxAlApF60@CHg14vIxf{ar z9219FY_IHF6O*vKz?7U7fSANwJH{)pSiYDLmX`z3~-Rm-kq1uILl% z+8!&M`(pY$O|+WMrx_9Rbn>-_u&{JFb0m#?Co3E6>9pmvrOZsmV&G;4vn{Zml?xkw zz!~KXrYWk65vTN+6Ou1bqVw{Akh~$d57>E9VcUbM%@`!JaGzB z-^R3PJ=@WXhH>#QE<1zwD0uTJEaso;U9Ngp>M5&K*Xlyo8Vy~WgR0T%)aa`;d_xZI zBhpWea`f#z7eAa%10&3aUG~IO5;l9D5lFsor1kf8L(OzkX0M%1NE$a&c-ZUgv&4o z^Z9OKdkKADB`(E!#IS+yO>B2?#17131@1E3LVG39h!jWLd^>F4j%M7+%k+D&5clzY zKidz}d!EE%yhMzz^8FdM-@tNw87o+?U5>9~6~2Yl_%7ey!&-bF>+nOq-@(=RF)9B9 z8>O1J#kG9bVS^aFNS=mGEb(lXOL%MCgsrlW?-sU~626AzysL1XY(j^0vGUf<_YG{{ zNcgS1IJVFw`>|cJyuv-q_ffX*Ap98WAf$?1)T!$&&-Jl~c&Z4Wvfvc5Z{uk5Fy2>l3U}u%!22iFe*@RVPEC1+ zHy#bLm~hUNC6r1E^fY7{As)Tuq{p(BPcOsS3g4{eGqeE~4CBMi(T}}=x@LYpbh7Fs z`)ZWsSuU^Pb2sVlVYz=VW?)|t{aLcYr$4KVzJe(FD>=U!tnGP>TuDZFi{>#x<*MKT z9FxvrJj(U-ROefGcK2I&Zui1dc;PfYeHx$LCTnUIox*Fo*VKFs7c|$`kjXb*I{Txd zk#Bk<*G#CNP(JXTnv>foD1X1Srsj2gwZ7&}{8|-!RoB;0*VWWDg%&F1W;*PbeBsxt z5CoIZI2B;wV)W6;`{}F$bjba<1_#hX$KHoDXW1<0-^Lz?|1-FYSKD(ryBlH7+bFAK zHPsNqRkDUEtKr<4(n{C_&X^->HSAW*lXbFQITeoacT=8ek9n#k7k9~3ay2!VcPi?w zpyVb@co(q{UJT*ckZhRxQ%vR8w6heen(Yt{vJVo%mx@fmyD#4-?jc!a>xSk9XYiZA zHX1PqPzqR(neWCA=k20aYnstBCNVd z7S*?m%y@pX8Fi|h>@(Lv>D7FLTtt6cvr(g*REH;jaooZ8otnP4#~7LxiYO?^viuU< zLQmv{gHK@}DX1kel@#cQ-#UZe1A+41g}(}>@H8nrGe!!$_X<`vefO^` zDf@XU`-NgrkNig!0;;rm zy%h8MA{9>b{k4;0YUm={h>S<8ipc)C6j|pe$are2i0sFu$hMAxj0eJs$o``gS=%Vc zc-HihUBT6^);l-3|0>0@t_Vv_fU%rts)?3@vW$|zMs_BA1+rHy3d_R!g8&dbMM)E zpR>RH?Z-WS&CzcAh1aJK18?P@`|MpRHorfe%BIJY@&5G0gqs?%Ih~kAy~7#A^~-89 z*yym3CcVygM|q3GTWD4IGuu*%c&py!tJNugsN5z&n?<`r2WKjl=*4B#`j|hYkBGs5 ze^ao_VKHavz5eUOb_r)&EOj`CWr`NhHs!bU+K8=h4sI*!q1R%$BM{G1B=p*fgto(% zmR)Ak$4ZOy9r}5j9t-z|`nbU1LN3yK!rkia`gpibt=6Z)^`(QXwYbFLQigQ1y)tw$ z>m5pXhfdkC)&VXzn=2HN*45X$+uhEwbmvgg9Z6<-7m1evu5`GHtMz`nDb&L?4)0`> ze$`GdA7rz`Fhh#6(PVB_CX>#r%Vm=8ghf(r``=vyYgg?UPHxSOrBjvo7 zD!TNE1zqK(e8AyWZqp~N#if4kFy23?Sf)?ZH0$TX zPK7`oOO5uLOn=znPVUmzmXCMm`KZI)T&)O8Y(<+&0*r>ZSAk6rA2aDc&t{TOINZ-C z_y4ytZjil~0kit6VU9G=g2Y>x4=#djUP$M^T&SLatjeyFH!)eZHLC0EW5@?#Us zPaM9tt$bR8))Y~1mIl(V2er3q}wZ1cU)W>gix<0Xj-z!4#_*H6SPh5rg zqcA_@rlfn`)J5?|)u?a=QmJI7f85PxlM?!06#bIAm_AwAq8~V;u7tlTnswjlv9fH_ z>U4U`wyhR_SJWF(KC1{8g)|5>pY$wPD5>0_tPjYpQ=XC&R_5@%l3Tw#+Y^=66ya&+LxIQs5qQ; zVJJ07g%$EbqBa? zQ1t{l3T)WW6L^++iD*E;ZQT8zlXEQHqGeA>wB-K{U)xQ~U}BnUp(pS-*GB^f+3KUM z!1g2LC!>KW-sdl{bD!Y!v5`%T2xgPvrOcDHRip`N%ywcjcH^8WgSCr`WYBJ8nOJw@ zayDaPot3=b!nqztLxjY>k0*Fi*o{ln1z{^7=c+j%vJyG5fT_GEbZO)u(_S8T%E2P7 zJ7;M1$>=%6Qvzd_V52hxKP>=b1Yaj^F=#PhaX4~{h`jxas`D*I8s{)C^R>u4w~4EO z9Bs%a+NQZ328C~-W3pq04B@H6qiMDZ%#?y&fw!Dmi6<_3H075l-t-3S298Jo%G~Y+ z;1f-huZqk+Cjg_{i!VO|?`txOWhTtPyI)LAA@(OslYHnPA5p^2Js{{-OPLs?Z2`&I z9DSvJn5sGZ#1!`h_V^5y#a3G2mD*|2NKwIFCpnCvRcT6LK(N75KPuI(JA^dG{APFv#<~AbLOFl6Anxi@YQ+ ytx^%+7U2*05kK|bUg2lF!mD!aZ@l$)-uegrB-ZA8_h+fe*ZQKIK1~aKnewu6j=nRmb6s})?!nrriMX3-DYpoZ8y7}-J6b` z@vHyApP@4#BhEN{_D4CMyEknUHe;Af?#sFNobx>A(UJ@kORn$A6^3-F+{_@ufGl#DG+>%IgDHmF9bxYUK96V+k=+XX zDDXt5rB*v`+ujJATD;l}gG1L5A;XkDBC!;{j2Nu?spp0aUB6v5FwHO%i@VbG><3}U zkLqqDbI2pDFwB@Zi*pQ<+FGOziGwy3>nKTe66f*0feR)s;sf%1YEmntx#KXLEA>Ip zHA z9q04}GTpkD5WX9aJQd!$IBIgQD|GcNltu<1nYMD1!Q3CPGdt1@gF&J0Q1>wu2E%rA za2&dYQD&BsXeug0>mzv#*G!sIL!F;ocGXp(t;5&xviFgeQ zgMlrE%m06szCk)>n59QQ1p-H7N_~9jfwa^&fMg%jI)z&pqcwfYXtYVPhBU2!Lgf`$ z#WG$ZTlow5=dbYIOIW|hI=5+@qI*Dwv~%>E#wWBhwI=T1F6|gT#Xa(%tlG3wR>vzZ zVEsmm6qFI=6a?#3dAz5r!7b4FXZXBl;F| On-f`liw3^Oh5rCPZ${n# literal 0 HcmV?d00001 diff --git a/production/ConsoleMC.main/me/jonasjones/consolemc/config/ModConfigs.class b/production/ConsoleMC.main/me/jonasjones/consolemc/config/ModConfigs.class new file mode 100644 index 0000000000000000000000000000000000000000..69de50a34e1320adcd5d7977ab41744611d0f72f GIT binary patch literal 3105 zcmbVO=~ok16#qTIObCNu6s*)GC~BfLQCzBxZ9xJUO$apzTHDegd4z$A^a{rJs?DpX6Tk+BLM zhQ@JaQi*7ao{OYL#(BnO@Elcj)qa4XIv5(1;APmG=aF$kS1cO170DR7WoSH~5vx%( z7fBk~E@#zm8k1_4n?6XWu06_=S7* z8IvnEFIi{RVjY?!G|O0zyBJz;C7RfUgUK!eBbkZ~$72ls#3E8@+f?;j)K7@E$haFD z8P?~O385yV*h8v4CM4L3Zj%Q)f=f?^mXdtfj4cuZGFq{fVfU?U%akBbtNDWF`o&OX zj54H_RkQ**ZDcit^AtZ{h3~SVjbUDL1-OeLeABhCM4W%gN7n8T+05 zR4hx)=_N}o2?rUrWQ=?yZ;XqQ%qq4rs!nm!iWF^Ci}Wk1>BYSa4HJAiY*UoNlZsa4 z`@A^9(0rn3*#RXmKy=E_faRoVs}Bbd73F@EVP|=clnOptmWwVWH0TA@zo(SvqL@2m zbmAE4RkGQWe0oqQ6~-_e3MOu2aJd4va)bh^shhlL_n`;95{}D=;{?N+#fppTHqUWV zCprG6DBYWb@$xcqIig-9sB@{h?M2@b4f{PEzlSeV*}{iYNJ|(Hs!mt5!I)7T(Ktg> zFjg+VL?-b=1WeZ9@!~9*ku@$@gm&08vf;ck70xPoCC9xuN5=LU_89#Wwf(4!$1uzw z=eV6R-Lz&nTpkb?ow9%|;I)(_5>b&cA{trEKzDjTD9H*XWP9^6QsbexIFpkx29-)O zol15O$NL5tSlrXmEkF^lY(`!P(U%tz3&n(xf{gQ^Xw*4EVyV-|65S-n`De>03I)x{ z&NIWY&SYnA_i!vVl#ciH4xdU9%LPnHn3i!7PgDS(p0;eBr{Ebyx`mobE~`eQpPH>r zKyW2bwIksv8BgO9!)ij(Eu4gE(Gfq@vXe4Stq5AQ4$t6O3D3!R9xu?5%HM>XrCubw z=%$PN!SIsk<}ZubSLBu(1s`6;YZ6|U@dn;xSnCL@G>~Fm5aw!xU(+%{2n~|XE+b1i z8xpF{`-=GyZVo6;#`zOQM$rZpQx$ucSVI{^x5)0>wU`@suoWfQCeM-k+;s6_@THBS znc+RENbQD2=CE*r!f?zmY|A#4LXz8KM%HTZ;A0;?!KV^F6QF#~(B}B-JQY-Z(wN|p z5-y~JZoM8QV;kl)!bCv;Yf?DU&=f!nq!>xE-LYs=!T+JdxwNP7rF; zqdA43z67RwJxcg~g?D1bRYu|}_7Z+#*uDhe<$#m$3&ZCBW~ClgLYZC@b@bu`Jg617 zmQ&;O9;3NdG!JK{hTzOp)6PuwOLGks1icYye2aDwni=)h;G4s?IfQ1hXCC{6eCEh+ zCKG^0YD{ZTkG1q9X`<&yGwtbpM?Au`OSBT-5J|a?184n*{D-gNKL7o5cyNK#)!06d zZb3a+Moq3mY90>>@?aVHOk<#o`DSA_kQprqQBibYBL=aFjG@ciHD-!%6JKHmd&rQ7 z=kUlZ9v7Rg#$9vB%wkk*Nb~p{v{@KpM+%)^)(j>cD4zTiml>|%MPLrEELzawxEdfR zTFHj32x1!!VmnS^2deP_>8-+t_=x7!w7Nnzec_B>;Txj05KkL*_-`pV-_iVorxrir JXZ(r{{{o>qS``2Q literal 0 HcmV?d00001 diff --git a/production/ConsoleMC.main/me/jonasjones/consolemc/config/SimpleConfig$ConfigRequest.class b/production/ConsoleMC.main/me/jonasjones/consolemc/config/SimpleConfig$ConfigRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..0a2646646eca0bceabb83b73a92de48e5cd1bb8e GIT binary patch literal 2164 zcmcIl>r&G|6#h1phL!-eD2O)%QQM-%`z>6QBBEBjz@U!5mUat)Txyas@+Llp&d508 zj1S=WOpa%hAgy&6JC1*{dp75M-`R87^X>May&XrY?NKO;k-wF!Yu}O4HTnNH!!vuZBKk7`mi}!)?;aMp~g`i-Bi4t45YC zkk!zSgXG$(AjHXBzSNFGv!crDRuK6WG7o4N#9?BtdG4lJ5gvo_50EO3FpRh1QW`@z zCR1^oVJg=ab5nGU{Bk#jaZ<&IjL>MCnQ96Q!8_ zCPBBCs^)+(ylpSuO))asE4<&SRd2T`^!7^FU`SEvM|cbe$$GDW<33?XFS>QFEM$K% z9BAyx3sRfPeStc1-j!XMnQ`5~4?JFbEP^$+;`b$SJ&hZ1V1(v_LN9*@vT_8;86bxRt%`iQX-&|s6KCi#I!jVj&No^Q z7e0X%#5j_lH2O_m!uxfY(Mlk1bAqKlb)RHLm z1w*gs5=ZyolHre~5K4=bVkiYVF2(?pL?QwD3m?gukLdY~6AE^43iuuBWdl@y43)qo yGFEUISHg7&S82`C$u;t9f`T-GyF_rG?gbp7vo0E94=IGhv_49vP{IP9V(2HznoEcP literal 0 HcmV?d00001 diff --git a/production/ConsoleMC.main/me/jonasjones/consolemc/config/SimpleConfig$DefaultConfig.class b/production/ConsoleMC.main/me/jonasjones/consolemc/config/SimpleConfig$DefaultConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..6569443739eb0e0c9926d5a2e706955ddfcdbd98 GIT binary patch literal 472 zcmb7AO-sW-5Pj3MO(&&D+;G`sYDGMGRjekbdvdBz&dAunRTAVM-7eX_(PfQq$ zGsBZrKI7s+&9o@t*d|Ipsv@iUZ?R)k&Tgra+OTmGp*yv!BH^2?S~2?li?hm22qx^x zTkA?6JA{*e#6alX8N)@am2>O}{Xe-#Djr%AG|-TMeFVZfastS+gr7>4_~C{0TA8pV i*si5>^n~};WAw3I*)XVGLyYPgVpnQcJRU;qwL4!%i*-x@ literal 0 HcmV?d00001 diff --git a/production/ConsoleMC.main/me/jonasjones/consolemc/config/SimpleConfig.class b/production/ConsoleMC.main/me/jonasjones/consolemc/config/SimpleConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..1a221b47e4de5ad8836a0ca614a788328fbd2542 GIT binary patch literal 6014 zcmbVQd0-UP9sb^C$!<22kZb@2BMgF)gAk=!m4E^XNZJsPU?|vPhs`7z*qvEsCJ^db zMXO@9)p}8_M{VgriwA_O9z8s2Z?(1eq4ut=_7+k5y*IO)T?n=GkDcSq``zE~c>DC5 z`yK%>N1RxW2ufmzY8Zu5fvL9XH}@KATq~7HHK!e;$8?*Gtkt|wt#zmcf$~1nZ?`?) zuv4Z$U0r?0|3cRyg~c_LAt9iVMXO`?T77MnD=>~c)*2g(X4`U_d#$wDywvdfTVl`z z&diw2YaQG0crm@^lw*5N+N6GbB7Jk0mC2^ffZ5dGw#-~VV0wO%MpkMVjVgg-GR8W& zDP{O8EWe*mQh(nQIH@iWoi=PT^IgmCYYDX}Tq;KrH8G6QFc#wkl837+5OYoHwm~`N zh)j!3lx&aHFdh>GN_}S`Z5OD@xr5%2D=i6>qgKQ5n8;nTE!*k0i8m3^XK;u#PQkkRtDA3Yz6okb=Xep!aCux|5I)SK+tw3djn;WY!ksT?~m_m;pJI5UP>8d@-0pr)8e3Z|Gu$~6t&ly3sdLhl!c^ZdZF{NfSB zIjEIzXw}e$1p;OHOcEHA!%ZP@ zCB-=!7NMOyHcEa1V@JY#x7_(|4INm_ovF0raVK5d9m5iVYUPpv-%2-kr3~9P-2^&u zt_0;Wemw+>^<>tGbDfhzAeyiRk_@33qJuoEjZyhrLDxATiSR%tjN?3j_r0SVl^&^;r$v6DWytjSYSF4Y5||o#(Z^si|6Sjc z#o!43SQUpwsyUKsorW|rbc>fwTfQuMBWV;yzd(hSI2?h9u0*ewOjzxvjX+#K0nOWa*>?8y(lcn~9(wXgr9Kw>Cz{R*iqNP27 zD{)l}ACfObT0z(XVbYqbr0v&g*n;b5`x@6-XWER#Dp^df*Kh+qLiEUDVjCHvG+AIo zC@;xwQz?tWO&UI?s)adddA=tZ-=g7G+(yP7OU^lG0pUBj!*ToA>5Npr$-dXu$0i`} zr><@8;G5~TBvFFOa(oAH?9#eY`A=kR#~(RU5meTy^q_YO`kcOSuMYyo49MT$d%nMu{E=g&-C1F(pd$BKu{TjZ6hjTzwqS|fWq#qeI zmEL?kME6|hZI9zoI?i_oSSnWI%No8S)3u5%-AH@weYWG8t%k>sU&G@uJfY!9JXM6E zHfLastkC63QtqwDQ8{64Nt6bj{)UEcN>4{O8m=v2^KA{^QLyPT)2466@jXVbaMnoR zSv(iR_cihw^v(X!Zg4rJDt?s7xLBiZ4kjC8l*TJk+yjAq%W z*|`E0i~FI3LBGYu+jKPJ2Q4dAZH{0Y8?Y_zrreOoBcI%(X==*i!swT>!E@#hoQEooQDI+Oi0(Pm~{lcTWNBQQR!<=vKNF)s6L+wl!q(`nJT0^|(S zkg1&Cm$+?auQ8B5w67cybR%>HYSd#Ah9w(}^pW~J<1*3!u&RF5$RFD3+vq9&;+8i* z>>TmgDMne1&515&z)giyTy(YG3@jVvn z>|)dJcY3_hr6Q3Kz3N}np$z#`WU$yKFY<1x=ggh9dg+|JE

yUVXB531Ez}% zyN46%)DFj4H;^st=!eImh;aF)tU1E=LL84!_Cpq}MmpWaak3>Yc)-%cjI8TqP1mPpJ_`mu*{jY+a_EE+)st7$P$8mp)BQiwhpFrU~8h^o-?s z?8MXcK9ln%L238tgp0%+8JII>%!rF)iF~2=8f4m|`%Z4FNxnQwR2P1djgZT=0`0@% z^o@q6yJp7OK>A+S$>?fMFnP9}tS=)HnA^JFZ|Z%VG^7BReN1U%>Xtu)hPTUMxHWBf zo;)N}1gyg&DBp_!5fhVhM-r8&MbRh@V@ymDn0Od8iXtvY7!`9&W)HrS=iMkK$k~QZ zNjW%jEc+p!Blr>Dc?49?9IAM);7R<)_z8FXlyB#gGQ#_mJrH|A(0A-d`O3zIecZ>U zULE1(7=eb}IPQMMt(4&iPB>n|3v{data>AvDn0z4D#4}q0&L; zo@zSiH~1~(kb9`jXdeB4hu>3+KX6q;AbR zw#MX|A@poTOJlNs)DYHoHa#-xZcJ*5&P>`v$d=5U6{X|6rjnWCqeIxZVjHUWDY`}gx4Zmt&BO93N#QHe`K7a+<7wo zgqM}m+C#Ib9{$X)LMj>>Ee+&)2@%~nj~*6qVv>46cpK0pOqa5m->AiY>iaP6Ry5^&uN4sb0Mu4Awp zFox%p@l2{IxSoGu+(4=uNp~wLZ$c|iALrs`timn009(oF4)VH(-0p7d z$fuHAo*YCaO`NODr0h3B+1XIGreyEIp6#8r+xZQIc3D1vmCB)ybL9#0eKN0u)az9Q z?mpaVnV+w#{FP9qvi!|Z`ameXCbXQ~o05+V;j!&hB4>P38T$+wJWJuvu`E2F zR{*HVJE11;gc^#yj;u?WG{a7aLmZUFf^nt;-U?M%&wa8yRD=%r>W*2_I;rJI9(aKs zc#%o@QeFZ1C$02=j9*1wm5RJ76?mPj0>I@xAOx#w5c_7{rL0jh(WK2mi4H*ZiV~v* z8$#wn9R^c?dVlswY%72f9r|RLHU)5m6!iS4v&VMX8V#aXK4f8H5udc_5<4G}r04s+sCZbG~@;<4wOz7eSF%{$g1Fm%#eEfgc5Pjn$wPPF7rY)s>HKC=XJ>Ux$l)?oy1<6o}qTDz3#@%S+t+p-{{uOZG zH#M()Kme9gLihuo;T0$&9C1-egb%kjt>VF7u66oED#n);+=@J$g}8hFp^0@ zSlCm!DxMK4ot=Ii9_lXq5CKBMMlOqJC)|?K`GwTlw0aYe)_Y@h+77UYB^S*Q%UEGj^PPmM%7=!q+KFd` zj|!{uth>|qaDz}An^dJfZercVtq`|yhp;w})DuZz><2m#@#p18Luif#wP;k_g=wR+ag*SS^m#DWM(zN7*hR zH2G{0!P`sp)G7bSoY_S7R5_+Gv*S@I7TWBg1HxT?)=M9G6DoY?1>kdovxp;ctnGdU zed3FQ7N6y7z-0h%)8qr($0lclt;^;o6L28-47YjhI~opV5aqgoUG=eY1tyrnczAFL b)1C|f>dn<}So;FE1feTD0?xL%=HTHUq#l`> diff --git a/production/ConsoleMC.main/net/fabricmc/example/mixin/ExampleMixin.class b/production/ConsoleMC.main/net/fabricmc/example/mixin/ExampleMixin.class deleted file mode 100644 index 28a4722e2888ecc7658d24c7969ab9e4d82fa67f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1057 zcmbtTQBM;=5dOB59+XO<2#SbYMWsbyUwo?=8bl;HB%w`TeA-^O$Ku^ybGJqOS^8r1 z!5`p{GR|JBB!-wK-owt$&CIvow=?_W=eO?w_VBET9Ht!POPEH1Vc|kt3LXj_@YC*v z^bJGdh0@BrWSFYeJF}Rk%eU7_7Epc}W* zl}TH4L;6Evd=Yj;qO3punKz__q3%tH-^j=+y5jxX=yC?J4&)&IAQRc+B8~Wnl+v~n zD%PA14ZFgB&kx3%V-icc820`PfnoJ*sEvwbN2Q7+HMNe7uxFB@-3hUeGoB&qK7Z2ptYiNzrrJ6Z1{YPX+=zTtkTq&7SlDxUg@l$y7d31utWH&DegJs z^$vNQEF(L;{RQk(7QRcX4TB!eDy^ka0`6fgi{HmOf!N{$vKDmiGn~q;uPEnm4Pl=v zFpnb28O+Kkbqr&{m+*j~Hz;eJtV{9gJFtB`ByTgtBRnQI#S;o_QBn>y)H6uxm`$Om HkEg!?MVlBR diff --git a/src/main/java/me/jonasjones/consolemc/ConsoleMC.java b/src/main/java/me/jonasjones/consolemc/ConsoleMC.java index 0bbb109..a54297c 100644 --- a/src/main/java/me/jonasjones/consolemc/ConsoleMC.java +++ b/src/main/java/me/jonasjones/consolemc/ConsoleMC.java @@ -1,6 +1,7 @@ package me.jonasjones.consolemc; import me.jonasjones.consolemc.command.RunCommand; +import me.jonasjones.consolemc.config.ModConfigs; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import org.slf4j.Logger; @@ -11,13 +12,15 @@ public class ConsoleMC implements ModInitializer { // It is considered best practice to use your mod id as the logger's name. // That way, it's clear which mod wrote info, warnings, and errors. public static final Logger LOGGER = LoggerFactory.getLogger("consolemc"); + public static String MOD_ID = "consolemc"; - private static void registerCommands() { + public static void registerCommands() { CommandRegistrationCallback.EVENT.register(RunCommand::register); } @Override public void onInitialize() { + ModConfigs.registerConfigs(); registerCommands(); } } diff --git a/src/main/java/me/jonasjones/consolemc/command/RunCommand.java b/src/main/java/me/jonasjones/consolemc/command/RunCommand.java index 9e1e312..d527bbe 100644 --- a/src/main/java/me/jonasjones/consolemc/command/RunCommand.java +++ b/src/main/java/me/jonasjones/consolemc/command/RunCommand.java @@ -1,63 +1,171 @@ package me.jonasjones.consolemc.command; import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import me.jonasjones.consolemc.ConsoleMC; import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.command.argument.EntityArgumentType; import net.minecraft.command.argument.MessageArgumentType; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; +import org.apache.logging.log4j.core.jmx.Server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import static me.jonasjones.consolemc.ConsoleMC.registerCommands; + public class RunCommand { public static void register(CommandDispatcher serverCommandSourceCommandDispatcher, CommandRegistryAccess commandRegistryAccess, CommandManager.RegistrationEnvironment registrationEnvironment) { - serverCommandSourceCommandDispatcher.register(CommandManager.literal("cmd") - .requires(source -> source.hasPermissionLevel(4)) //requires OP - .then(CommandManager.argument("Console Command", MessageArgumentType.message()) - .executes((ctx -> { + serverCommandSourceCommandDispatcher.register((((((((((((CommandManager.literal("cmd").requires(source -> source.hasPermissionLevel(4)) //requires OP //TODO: implement config "require-op:[True/False]" + .then(CommandManager.literal("run") + .then(CommandManager.argument("Console Command", MessageArgumentType.message()) + .executes((context -> run(MessageArgumentType.getMessage(context, "Console Command").getString(), context))))) + //Debug Command + ).then(CommandManager.literal("debug") + .then(CommandManager.literal("reloadCommand") + .executes(context -> reloadCommands(context)))) - Text broadcastText = Text.of("Ran Console Command \"" + MessageArgumentType.getMessage(ctx, "Console Command").getString() + "\""); - ctx.getSource().sendFeedback(broadcastText, true); + //reload Command + ).then(CommandManager.literal("reload") + .executes(context -> reload(context))) - if (MessageArgumentType.getMessage(ctx, "Console Command").getString() != "") { + //allow-commandBlocks Command + ).then(CommandManager.literal("allow-commandBlocks") + .then(CommandManager.literal("True") + .executes(context -> toggleAllow(context)))) + ).then(CommandManager.literal("allow-commandBlocks") + .then(CommandManager.literal("False") + .executes(context -> toggleAllow(context)))) - run(MessageArgumentType.getMessage(ctx, "Console Command").getString(), ctx); - return 1; - } else { - return -1; - } - })))); + //op-permissionLevel Command + ).then(CommandManager.literal("op-permissionLevel") + .then(CommandManager.argument("level", IntegerArgumentType.integer(1, 4)) + .executes(context -> setLevel(IntegerArgumentType.integer(IntegerArgumentType.getInteger(context, "level")), context)))) + + //enable command + ).then(CommandManager.literal("enable") + .executes(context -> toggle(context))) + + //disable command + ).then(CommandManager.literal("disable") + .executes(context -> toggle(context))) + + //help command + ).then(CommandManager.literal("help") + .executes(context -> help())) + + //whitelist [add /remove ] + ).then(CommandManager.literal("whitelist") + .then(CommandManager.literal("add") + .then(CommandManager.argument("target", EntityArgumentType.players()) + .executes(context -> whitelistAdd(EntityArgumentType.getPlayer(context, "Player"), context))))) + ).then(CommandManager.literal("whitelist") + .then(CommandManager.literal("remove") + .then((CommandManager.argument("target", EntityArgumentType.players()) + .executes(context -> whitelistRemove(EntityArgumentType.getPlayer(context, "Player"), context))))) + + //blacklist [add/remove] + ).then(CommandManager.literal("blacklist") + .then(CommandManager.literal("add") + .then(CommandManager.argument("target", EntityArgumentType.players()) + .executes(context -> blacklistAdd(EntityArgumentType.getPlayer(context, "Player"), context))))) + ).then(CommandManager.literal("blacklist") + .then(CommandManager.literal("remove") + .then(CommandManager.argument("targets", EntityArgumentType.players()) + .executes(context -> blacklistRemove(EntityArgumentType.getPlayer(context, "Player"), context))))) + ); } - public static void run(String command, CommandContext ctx) throws CommandSyntaxException { - runCommand(command, ctx); + public static void broadcastToOP(String message, CommandContext context) { + context.getSource().sendFeedback(Text.of(message), true); } - public static void runCommand(String cmd, CommandContext ctx) { + + public static int run(String command, CommandContext context) { + broadcastToOP("Ran Console Command \"" + command + "\"", context); + if (command != "") { + return runCommand(command, context); + } else { + return -1; + } + } + public static int runCommand(String cmd, CommandContext context) { Process process = null; try { process = Runtime.getRuntime().exec(cmd); BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream())); String s = null; - while ((s = stdInput.readLine()) != null) {returnCommandOutput(cmd, s, ctx); + while ((s = stdInput.readLine()) != null) { + returnCommandOutput(cmd, s, context); } BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream())); - while ((s = stdError.readLine()) != null) {returnCommandOutput(cmd, s, ctx); + while ((s = stdError.readLine()) != null) { + returnCommandOutput(cmd, s, context); } + return 1; } catch (IOException e) { //e.printStackTrace(); String errorLog = "Error: \"" + cmd + "\", No such file or directory!"; ConsoleMC.LOGGER.info(errorLog); - ctx.getSource().sendFeedback(Text.of(errorLog), false); + context.getSource().sendFeedback(Text.of(errorLog), false); + return -1; } } - public static void returnCommandOutput(String cmd, String commandFeedback, CommandContext ctx) { + public static void returnCommandOutput(String cmd, String commandFeedback, CommandContext context) { String consoleLog = " [" + cmd + "]: " + commandFeedback; - ctx.getSource().sendFeedback(Text.of(consoleLog), false); + context.getSource().sendFeedback(Text.of(consoleLog), false); ConsoleMC.LOGGER.info(consoleLog); } + public static int toggleAllow(CommandContext context) { + + ConsoleMC.LOGGER.info("Toggle Allow-CommandBlocks"); + return 1; + } + + public static int blacklistAdd(ServerPlayerEntity player, CommandContext context) { + ConsoleMC.LOGGER.info("Add " + player.toString() + " to the blacklist"); + return 1; + } + public static int blacklistRemove(ServerPlayerEntity player, CommandContext context) { + ConsoleMC.LOGGER.info("Remove " + player.toString() + " from the blacklist"); + return 1; + } + + public static int reloadCommands(CommandContext context) { + registerCommands(); + ConsoleMC.LOGGER.info("Reloaded Commands!"); + return 1; + } + + public static int setLevel(IntegerArgumentType level, CommandContext context) { + ConsoleMC.LOGGER.info("Set Command OP Permission Level to: " + level.toString()); + return 1; + } + public static int help() { + ConsoleMC.LOGGER.info("Print help"); + return 1; + } + public static int reload(CommandContext context) { + ConsoleMC.LOGGER.info("Reloading!"); + return 1; + } + + public static int toggle(CommandContext context) { + ConsoleMC.LOGGER.info("Toggle Enable"); + return 1; + } + + public static int whitelistAdd(ServerPlayerEntity player, CommandContext context) { + ConsoleMC.LOGGER.info("Add " + player.toString() + " to whitelist"); + return 1; + } + public static int whitelistRemove(ServerPlayerEntity player, CommandContext context) { + ConsoleMC.LOGGER.info("Remove " + player.toString() + " from whitelist"); + return 1; + } } diff --git a/src/main/java/me/jonasjones/consolemc/config/ModConfigProvider.java b/src/main/java/me/jonasjones/consolemc/config/ModConfigProvider.java new file mode 100644 index 0000000..118a746 --- /dev/null +++ b/src/main/java/me/jonasjones/consolemc/config/ModConfigProvider.java @@ -0,0 +1,28 @@ +package me.jonasjones.consolemc.config; + +import com.mojang.datafixers.util.Pair; + +import java.util.ArrayList; +import java.util.List; + +public class ModConfigProvider implements SimpleConfig.DefaultConfig { + + private String configContents = ""; + + public List getConfigsList() { + return configsList; + } + + private final List configsList = new ArrayList<>(); + + public void addKeyValuePair(Pair keyValuePair, String comment) { + configsList.add(keyValuePair); + configContents += keyValuePair.getFirst() + "=" + keyValuePair.getSecond() + " #" + + comment + " | default: " + keyValuePair.getSecond() + "\n"; + } + + @Override + public String get(String namespace) { + return configContents; + } +} diff --git a/src/main/java/me/jonasjones/consolemc/config/ModConfigs.java b/src/main/java/me/jonasjones/consolemc/config/ModConfigs.java new file mode 100644 index 0000000..11c2d86 --- /dev/null +++ b/src/main/java/me/jonasjones/consolemc/config/ModConfigs.java @@ -0,0 +1,39 @@ +package me.jonasjones.consolemc.config; + +import com.mojang.datafixers.util.Pair; +import me.jonasjones.consolemc.ConsoleMC; + +public class ModConfigs { + public static SimpleConfig CONFIG; + private static ModConfigProvider configs; + + public static String TEST; + public static int SOME_INT; + public static double SOME_DOUBLE; + public static int MAX_DAMAGE_DOWSING_ROD; + + public static void registerConfigs() { + configs = new ModConfigProvider(); + createConfigs(); + + CONFIG = SimpleConfig.of(ConsoleMC.MOD_ID + "config").provider(configs).request(); + + assignConfigs(); + } + + private static void createConfigs() { + configs.addKeyValuePair(new Pair<>("key.test.value1", "Just a Testing string!"), "String"); + configs.addKeyValuePair(new Pair<>("key.test.value2", 50), "int"); + configs.addKeyValuePair(new Pair<>("key.test.value3", 4142.5), "double"); + configs.addKeyValuePair(new Pair<>("dowsing.rod.max.damage", 32), "int"); + } + + private static void assignConfigs() { + TEST = CONFIG.getOrDefault("key.test.value1", "Nothing"); + SOME_INT = CONFIG.getOrDefault("key.test.value2", 42); + SOME_DOUBLE = CONFIG.getOrDefault("key.test.value3", 42.0d); + MAX_DAMAGE_DOWSING_ROD = CONFIG.getOrDefault("dowsing.rod.max.damage", 32); + + System.out.println("All " + configs.getConfigsList().size() + " have been set properly"); + } +} diff --git a/src/main/java/me/jonasjones/consolemc/config/SimpleConfig.java b/src/main/java/me/jonasjones/consolemc/config/SimpleConfig.java new file mode 100644 index 0000000..c7ef34d --- /dev/null +++ b/src/main/java/me/jonasjones/consolemc/config/SimpleConfig.java @@ -0,0 +1,253 @@ +package me.jonasjones.consolemc.config; +/* + * Copyright (c) 2021 magistermaks + * Slightly modified by Jonas_Jones 2022 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +import net.fabricmc.loader.api.FabricLoader; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Scanner; + +public class SimpleConfig { + + private static final Logger LOGGER = LogManager.getLogger("SimpleConfig"); + private final HashMap config = new HashMap<>(); + private final ConfigRequest request; + private boolean broken = false; + + public interface DefaultConfig { + String get( String namespace ); + + static String empty( String namespace ) { + return ""; + } + } + + public static class ConfigRequest { + + private final File file; + private final String filename; + private DefaultConfig provider; + + private ConfigRequest(File file, String filename ) { + this.file = file; + this.filename = filename; + this.provider = DefaultConfig::empty; + } + + /** + * Sets the default config provider, used to generate the + * config if it's missing. + * + * @param provider default config provider + * @return current config request object + * @see DefaultConfig + */ + public ConfigRequest provider( DefaultConfig provider ) { + this.provider = provider; + return this; + } + + /** + * Loads the config from the filesystem. + * + * @return config object + * @see SimpleConfig + */ + public SimpleConfig request() { + return new SimpleConfig( this ); + } + + private String getConfig() { + return provider.get( filename ) + "\n"; + } + + } + + /** + * Creates new config request object, ideally `namespace` + * should be the name of the mod id of the requesting mod + * + * @param filename - name of the config file + * @return new config request object + */ + public static ConfigRequest of( String filename ) { + Path path = FabricLoader.getInstance().getConfigDir(); + return new ConfigRequest( path.resolve( filename + ".properties" ).toFile(), filename ); + } + + private void createConfig() throws IOException { + + // try creating missing files + request.file.getParentFile().mkdirs(); + Files.createFile( request.file.toPath() ); + + // write default config data + PrintWriter writer = new PrintWriter(request.file, "UTF-8"); + writer.write( request.getConfig() ); + writer.close(); + + } + + private void loadConfig() throws IOException { + Scanner reader = new Scanner( request.file ); + for( int line = 1; reader.hasNextLine(); line ++ ) { + parseConfigEntry( reader.nextLine(), line ); + } + } + + private void parseConfigEntry( String entry, int line ) { + if( !entry.isEmpty() && !entry.startsWith( "#" ) ) { + String[] parts = entry.split("=", 2); + if( parts.length == 2 ) { + //Recognise comments after a value + String temp = parts[1].split(" #")[0]; + config.put( parts[0], temp); + }else{ + throw new RuntimeException("Syntax error in config file on line " + line + "!"); + } + } + } + + private SimpleConfig( ConfigRequest request ) { + this.request = request; + String identifier = "Config '" + request.filename + "'"; + + if( !request.file.exists() ) { + LOGGER.info( identifier + " is missing, generating default one..." ); + + try { + createConfig(); + } catch (IOException e) { + LOGGER.error( identifier + " failed to generate!" ); + LOGGER.trace( e ); + broken = true; + } + } + + if( !broken ) { + try { + loadConfig(); + } catch (Exception e) { + LOGGER.error( identifier + " failed to load!" ); + LOGGER.trace( e ); + broken = true; + } + } + + } + + /** + * Queries a value from config, returns `null` if the + * key does not exist. + * + * @return value corresponding to the given key + * @see SimpleConfig#getOrDefault + */ + @Deprecated + public String get( String key ) { + return config.get( key ); + } + + /** + * Returns string value from config corresponding to the given + * key, or the default string if the key is missing. + * + * @return value corresponding to the given key, or the default value + */ + public String getOrDefault( String key, String def ) { + String val = get(key); + return val == null ? def : val; + } + + /** + * Returns integer value from config corresponding to the given + * key, or the default integer if the key is missing or invalid. + * + * @return value corresponding to the given key, or the default value + */ + public int getOrDefault( String key, int def ) { + try { + return Integer.parseInt( get(key) ); + } catch (Exception e) { + return def; + } + } + + /** + * Returns boolean value from config corresponding to the given + * key, or the default boolean if the key is missing. + * + * @return value corresponding to the given key, or the default value + */ + public boolean getOrDefault( String key, boolean def ) { + String val = get(key); + if( val != null ) { + return val.equalsIgnoreCase("true"); + } + + return def; + } + + /** + * Returns double value from config corresponding to the given + * key, or the default string if the key is missing or invalid. + * + * @return value corresponding to the given key, or the default value + */ + public double getOrDefault( String key, double def ) { + try { + return Double.parseDouble( get(key) ); + } catch (Exception e) { + return def; + } + } + + /** + * If any error occurred during loading or reading from the config + * a 'broken' flag is set, indicating that the config's state + * is undefined and should be discarded using `delete()` + * + * @return the 'broken' flag of the configuration + */ + public boolean isBroken() { + return broken; + } + + /** + * deletes the config file from the filesystem + * + * @return true if the operation was successful + */ + public boolean delete() { + LOGGER.warn( "Config '" + request.filename + "' was removed from existence! Restart the game to regenerate it." ); + return request.file.delete(); + } + +}