From 9742cafad93ea59cb14c9e397dce4301d38fbd94 Mon Sep 17 00:00:00 2001 From: Malasaur Date: Mon, 1 Dec 2025 22:42:36 +0100 Subject: [PATCH 1/2] Added .gitignore --- .gitignore | 1 + __pycache__/classes.cpython-313.pyc | Bin 906 -> 1190 bytes __pycache__/config.cpython-313.pyc | Bin 1509 -> 1396 bytes __pycache__/controllers.cpython-313.pyc | Bin 8753 -> 7886 bytes __pycache__/main.cpython-313.pyc | Bin 5673 -> 5801 bytes __pycache__/util.cpython-313.pyc | Bin 2810 -> 3060 bytes 6 files changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c18dd8d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ diff --git a/__pycache__/classes.cpython-313.pyc b/__pycache__/classes.cpython-313.pyc index 51dccecc3539ebbd1845708a416bac1aabf624b7..31e2a2ea315695303e36c4447b447544832527d5 100644 GIT binary patch literal 1190 zcmaKr&ubGw6vt7=ZJ{`@-+BAqyqS5QnHlEu8i95~m%aBAAwTiw zw57+!a0iS-ViHr@AnOv7=Fv`Vq}F97uTw_n$sD;sOu0l%T9@w0Nghkb-ZXfXI{oWa zVy_C`%o(rR%<9?z6Lm?@m7wG6DKTM$QO(`!c+72x>~^>9HY%PIIm!Hq!lvUkoQLj^ z)CrSJ!cwNhWHZI6DYLXmnPR4y+Dz$+$X8kDxSX4j9d-BsYcyC2bbvE`A$mq+EGw{m z*Rq6WS$^2)w9w93)?UYMjU$tmwd*k+wYzv{arx^gY?o_K!l>-S3J$Y( zqej_*ICuGSyUSF_ivmiY@W-_p zdX{0F+-4KguDpyf%J2ey^Vf0 z*IVmrg^&D`zQ2`Z;NXi9ynx7m5J2IkyacGvmS6veBR$5G8ON0vkIJ%58Lm+-!85*S zctmUt#1PbT!az_zj2c31C-mY1b?rhxbSDg3>?%$`QLdrH1TI2z9iu3?B3}YQG*i9J zzE(VNjw+vD9cv3GbRqsd)=DR|)X&d-y>k0Fzxa(VCde?~fEuU^FOlJu5lYl;dqFeV z0v4Ry!FV6>n&*#5WF96@=Mh6H__%l(K(&Pf1+Ucye`M&gy`}}TS&b^!!>1|RJN!e zh&absGYCS_6n+>)jBz|8rjg)rfw2hrQ`QuM`>nocqaZ6UNp-`(%?P@RsG#5mMs{vc zADQ;xU}VkQMtAP@A4=J` fq~MDZLf*lh7?k9n%n7J8v2{{@*!~8Ul0$v~B;XIIr)nCV>p7Db=iR`ID>hBqKv$gKQKx%^A!n94q!6j z2o@|7N@vy-ntXssW%4hkjf}#R*Dz;s-D1wnD=Fdz8a!EnMMUzJXncHeNn%N6a(rS* zNl|7}X-R5vd_2&MAQn%?i<9TDs7=1bvYt_Tau=(dtpLbv(jY~D12w*WHkE303^VA0Ix(rm;e9( delta 316 zcmeyu^^}|UGcPX}0}$A|=w!~C$eYh-H?j7@WML+;$?1&J{6#!595I~19O^(7F}zBX z1(_r!Z)8;C;ROnEAqg__Oparc0>o zZ!#Z~^yFA3*@+j#83jRFxrK^^f`yBO)0s6zCO0vuh;jsYy2QJA`nXnc6{i-Jr55QG zWTs4B%Cw15WO4*^mO>H8)wh^4^Gb?%Ko;_X2tKgYAVOgBU1n*Z(Lb3z8DCCzW>FIt zk(ll=(PKu`Wf6_*A{Hxr8az6ZFSA%o&S2TVC^K1-RZdC}q)`S$$O4I595%W6DWy57 Vc17}&16jp*xfqQ;F#rj$5&%gQM?3%k diff --git a/__pycache__/controllers.cpython-313.pyc b/__pycache__/controllers.cpython-313.pyc index 7c0c8f53a306d45c9f5138eebf43cef6f1fc03b3..e930446fc876d885823730abf8ce186904e2249f 100644 GIT binary patch delta 3276 zcmaJ@U2s#!72cJu{;z&)A?Zrizl}ky`HLaogrB;Y0Cu7fE3~0*5kk7QRb)xsd)*j@ z8Ixp&F_Sbdv&odqqyujq(n&KJ`jDqi=|dj+&_-i2a&F9|ou|(BAnaN^o8*vYNm`C*OBi>;j^FiN{bB=Tjce2i5Kl6*RYh=@KfCZ97A!(A6 zBP8eEV?v#Tu%O_1fahK1g_JBV^Z~PDm8pn@oxt<2^1_0*33!23USxu1g7;8%HbV_d zN&U&R$_HsGU@{y>)vC%0dW{*j=gT^DE4)gT;5`bfGbY1*g4K$ursed4KCSUz(ak&> zaM1nyMns_w{x2Hpb>wUj@?(kFb9UyKkTOoAqrK^Ht*WzHrJ}NXUQWBh-nT*MyJQS4 z!H*9r0au!gNv$E_C(HrE8@&Gmw z!^%{BnpLw!l(_O)p<{;sgSUBy(#<~!#Aly*g^&WQnV@5~m1QT%=<1nPc!Z3JNW}5u zUd}XN1_V&9_`tp93!UI1rYH4DHCb=@YvRy?%6N8<^3P+3fM` zQHIi(f&{^4VI)x?0-Pj^^J!c6p%5~51Gz;0;_}Wvd*#_T54`_EGrFr0-L>G_wJ3Lf z9f~f>zNQ>+$nhnA2!8i%lH#0`ekQXN-ye!l%75=jn@Tc2s3^3Df8if*sx75+O z)V;IWy|2-|@8{ATUvll_;{TguDNxA|g@W`Qel^(T+6qJb3VR7)+s_rJ&#^AUT!7&nX>K#uGY^#b$0hJCHk6)-HpWVxuMVH z=(3H-im)hSZtWFugkhC2F+?bvaq@Bb=|BPnqpdAv2qoLeZ_AOxH;E9y;>d!KXc5e3 zEe7N=`M1epaX$1oEY9ViY}t0r{g6QOC~C3nY3=Ob-*H#yKK`Nmp?ec-$vBt`<#_pT zJf}L=1~qaMT=B-~0N?8!wIY@*eQVzPS2{ZceZxFem@%YES<^ET6C9~rtW^zZs-~9= zTfI^^uQDwovxB%(1cc+rOi``t{^tE?O;qqpobM0p9bhT2ho?E|jKD?D`{FCsvRfIP~g`O1UTIll8ff*Dc)gbZlsiB@T>JG9Xe>=H-Z~UJKzE=Jb`c3?ov04be*+n_NG<`<9#;nb>v)`A z=6{Um^SBep| z%)W)Qm^|5xdqahyq=#|U01{C+(NTsxRRF#4FI0=FPynC+{2LnaChkRo`o!IPnS22^ zEB`|>c3Pw@PG-7T02;$p#Aj#`i?Sv_gwkEmCoAQ%B0mkMHhs4JYHB@ythh_k%TTG& zPli=LUoTfD7y`uyQ|Vb-5gwA7+ImGXtRjXLispEELOeZN7neAoh(v*zuz7u5G3@)N zYNhFldXQZM85I87_klolqx4H6-zBlTMEQ!O?~>qGWb@xi_%2EOgY1mlC6PzgUb^Q# Y0rF^+W@zv}A=sy+Z9sJS6Yv}b;Kj+O30K(v^u$e11f-JNuYvHmckcC%e2`-C( zEV?R7jtH69Rh+v&BUp}t_Wf}U7^k6`hF$ppzA3aLTdCf2^*D`ZefaNj*drsImlXMHm z*c#JRLaU(iF59(`5fr|2Pstn!W64WpB$;%OEMbaMSo?3A{;lo{&NI z9Z#4w_!8`&P3{JbkfHExUABQJyX0tY*om8frz8xLfjB!7N_20kONa^v47Du3kU?QZ zb?q`E^@VH$Nmg|wc8-t{a#`rl_^AWN(Et!jI(m42?%?5XAF!l~UdRpWMa^;;qebmB zG?k)mvUhBqhb)(F)cfpu$+X;5Qwup$J8fFN9Q5EwwWvcpd^o3byj0XnCorCdRvfnM z&~G5P6qd3-Hqi*2@lzn@$wDgq%C1-UUfMgCx@%H=-nX!6+aJBZ_r7(ow&PHB$Dz4R zhbP5%rRMq0Ezm1}==D$Unc7qHDpjvi^QNob^g?6!g~ElgnXy`ATQ#z6F48^MxP5Zp zygyX)w^jXZvm0vuj;g<7p|xYy_|*?y5MPvce;8=G;G6N)0`1j6`+I?oB`=XTTnBr= za;ll*wA7zp_B#p*#?TJ`>oI}-xoJxP`bLByl<;Se-QkJc;aqtgy2Y)AJ8QdFED1y2 z6`et0K!*5+*gLYTVJ%7q3Hwam6kCG^GSILxiV(KjnLuPstOQ#DOEUJep{%J=(@@M& zO{vuLpsPP)hXgYV<#Cg@8l{$}LN)EQmd_2BGG5CAkuz|hR-m{?ifE!}J{6H*Ea?U$ z2_#V{C`=!jI#QFBs;s;x zr=(f03lf5c-Kfw<=!AHfUpijU^!7ZDa`j#~&9_!J!Ii1!oSE zJ@!^IjA-ayb*j3OE6OR|9OauCff`m)pd=zZctrzn*z1{a7tBg!ARyq7$JDTdih*HM z6otb2prN3&^{XhktxoO%C8G<-d9oym?)X9=deP40$@}L+O$ZnEjVp57rwjhXbt1Uq z?}uVbc4$8{aQUa3ljJv^&GyT}W;>X|easWI0rMB2j3-2Y#>f68?V8vKJlzh&5|5Y5 zMUG*54+?vbV2;);4(G5In0h{^nkLnckDHp2%h9`00l`{N0W94V37&oiPVp@Hug&A= zyb+Tf_bequNBH9Y8w8pq*#>+DUZA}pIUF078k~;!Y-ou<^IFqQZ0a-PeEFGRn7!`K z3J2N$+&6r98fM%S3nmTx-1|syEq+kAkv-u}2@kL-?|_q=x9QD~ydMb@S?ILvW9n&3 zEb4{{nB)>shns^Xj+M=V<*F3bGa5BAGChLYP$X4z+_2mSPUp3Xsh3OiyLGubR)N#d zsa7glsbGmEbxflV;pz`#zsoG=M$NGzUx7XdqKvq|j*Lf8sXoc_Vu(t>$Z{pYek)qP z!Q8r1bkz+RU{5z(WeJ;Gcm-0in*{=1W|t#u7S4-Y$iqJN-*=dD2Z{73PUM2Um9)G` zRebXlbYoet0#q({!a-0OH&@Zh!K$+71IdX|7-#GTa-LwVbx*l#QoJg~-<4YCgW(JD znRqRjt_IVych3d4OgdL}5>+Yju9TYhhbMhJlmI@oi2JoaFAO zI>eqz#M$41x=?0ajgQq~B`)87*h`IV>)`6|jqO5(Ej1>EPSy~5d?WX?jTX@m%-EF! zuY?BiOAQ`)zYMht2K!4Wxr|0ErR?+2?&R9xNt|OXlG(#eo0XF|5vqar{h{e|Q|D^_ z_Nu>q&fjrG>flv*B9pQ8TUdAuoPyhe$INY$!MkN2VY8tYaYQrEuu^y{Yys_fE39{M zJJybGTW`E$yaac0E5WWbM&T9*{8Q{iWJ>{4EFHm(p&LMuoPAmP@YLhdY* z^#Y98qe#l^^T@q*?~StiqGyF?)(M#si>(u~!?8sAM=*tfl>{!8vBa+*dO7z}ZZ5WM zQv6vRnsn2f&&2}5y*~sMODsc1I=*CItkC9;Qha$tzgXd8&iDU|hAp)tVJj=DDgcNlgXrymuKwEq-c!ICL?=oWrN=^ zp%lYsUr|5KGt%-H{>EC;j9?rre5R+a{a5r zl`pD>p&8WAb)g0h>m&Rlho4xyitxSh-EeciRBbG&XRKTpFKXYQzk@jh_#58?0*9|4 z{Da7gB)Le!izM~|*_K`;kwudDgv1v~>jxzB329p-%{QHQ3h`?M$jv8&4k2=l0J%B9 L-bkfH^uzxFy4J=X diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc index 437c4ed48df6bc2cd37d9d8487efe44c28d132c4..eb6b7609d8dd2575cdb50e3af17988f19fbc365a 100644 GIT binary patch delta 2266 zcmb7F+ixOO7(WBU43tX;7}`Q%3-n4As4Y!44cVsK-EDV!i89t~R!l{}1{WA|W^j$k zhU#D7=Dcj;KA5-0_>?ZY_I&6vA-VbVQ0<4KNYxRw;`2@~%VCe#VjCt*xy$DJPSVH@wm7Vfa!B-32~ zUs>BToD}H^Gr4yuF^1l?zT|Pg2<2i~Q6#mXHWl=x^{(YpfPS%EwYg={CC0 zCeg>-DEf?Di*t}15`%A;ZqSP*=%A|H&i3}r?KL!QTV5O@Y61d&l}!x4f_?D29oYRk zAJX`c&c`%9*5=0_-`A(J+H|(fXA!c^S%+7G=yO|%tAib2rZBs74}ik!fGRK(eRA}y z{v(;cG}U0h)vF~^ZV>$-giwQXpf5OqaiJ)mLL47teCSVGs#Rxp7>OfWf9BM;!~!5O z5zujW>y_3PJQm`Gej*;UG_Vco;PDP{O} z873@-=X8d<3Z1>-Hdl6)J5*Lk;?XD!cKAt<5Pp>t45#xPis^wFEij`8(pn(h4!p3x zeaHtMMf6}w3#Qt9>U(GK(QA5SUW?4Po%3kZapM(nOc$p#aY`4HnwV^h>HV!^4!D93 zM|5ZWP#AeQ`)qLXnSJuu4*a8sLPQs0nh^VF>XUd|NOsE;Z6ST=kLvyj%|CJQqr=N= zxJkBF0v-&8qbN7)YDvCVhY=$4YNb||o9Yt_OcA3rhVDWQR#D{!B-ixv!4>BQv)M}s z=ZP1gf(r!5E;J`VcYFqmJ#;)QoRRV9K%fcTk)Q=}RdZ5{=yrGn9UC{%hrU&23Vr8W zYw^WuK~c(zd7U_ma$SXTwOWRXnIcz{OXaEpog|0@H?|?yi8(p%2HR9IB`t~$-dboh z;4E2j)7!}?8J@TrulG_HlcM3M5QPsq=+O{6BmhtC1mVXYOuZ0 z?7DDExNz#B)*PAx2W}__PEjQel@NabQmq_ZRto9?R8TLLf;gZYcyBg1-lndwv~OnK zoB6$&_vVdvFYZnU4mHis!SAh)r^_$YMj+1LYD{cweHbF4G?(u?$6ZA${K!ClV12^r zcgvjrD({SQNmYWkI^fD1L)1J&O_1@r3q>}gUi zlo#>|y3I#d2VBIV9>lPVcMu)L5#YHbFU+A#azUZ9>hTx@kTFVUOGu@*3$>m zAa#kXl#9E(q))tTb)#~LjvE%lSK_=`F*oGGojt+1Xu};ErfRX<=JX*|GmxtuZlqk& zolrXv!1xm%drS zKd(|%Dk=X}LdoFhPhy&RJ(5E7M=3@_fiQh0CaEYVu$634PtuIfhJ+VzkroPd^;PG^gz zWo(kmpm}HSdu5qlaRbQ=u0j-RH^g}=gRY#SHA1zZ@TS}oK{rx(7BTSZZ#-v$4kXX|9tvHB1z#)b*0 zw}@V-Le{6j(v@{vK|2%wEopIxB8F06ME~c9cOHibS?B&$bFmT(FAHSfcFEYFD*6dX^G(!HKS;ViCny z*xCw2=MEgoG2qEa48 n^l@Y*ndYSj~)fEZEI+(ljpxJ=Kj+a}d^DDN@cCbRAc6l~uj^ zEoGTl!95u>dfYIyRi7hnE+_7P^cy$BYCLZ!ZgTFzEcag=9+;8v{txkzOgU1Z85U zUv1|Gh>eMLF+H6~j3;i@(PFVw3R(&O1LEMp$%Bgrh4!*xcQVQ~eVslM_pTf|fz@rI zHUqVp$ZH_)>j&Ra@1ESeuDuAo37KlxP{XDgG1N#+9o`O`(WDVg*3=|jkpdU~lYgkm zLkUPNrl=aCYKneC^w-4hjmKsnW&~n2F-A9~(C`pz|MYraT!cIQFm6FRAcSf@*4dc7X^eC~ioggG< z_|y1D`$z|`Rr2=>`Nix?PS+on$t>|PF-(8jBhXDd<^Ct0rQ&iSPjYjW*};5?RTcE3 zk=pX*<+@e3q(aK2Qi15i&d(L}3aJZ4rt*O{j(rb^pYujvDYjIeT`d)^kr31P dh4c&yzXS;3J~+J(Iu3yU0KftILB5T+?=P|jzLEd{ delta 619 zcmYLG&ubGw6rS1L?Cj1a8ygkP6k`G|X|fHH5>1KKPz!BoX)j9;fj|iPQPV~vvk^TA ziU(1=7)Ed2Jb4rR1H{^T^0Ii?vXEnM9#X6xdU7Te`wriG-}`31c{6i#;rP7yD-ywg zM`d}s^F1^$FTzKIbk60OyRORk5R24F~gV@Eoqn4$2__ z3fPGdu%&E48g|SoE=W#Pa2nY}nTf$id+@U+J(u6FK?!fjj#_#HK)ucKN(x3i=y0y8RJtUge6_&uIm|{ zYV0w(8V_*Ct-1X=?YEkNvfb%+Ga;(;CF~12#{#sB2`A!R+$NjW_AiZ0V8mX}zp~%i zKFN6`=aX5F%=)C{krKP9r&Isv4^lePfOghL#6!eKmWM1Kr9G5pZ*}|H47YrCduj>7 zoh)3OQ+Dk67$;xLMUK1I;bK|YEzaXP>Bz-o18blk(32fx$_i_PX5`b*UygvfHPD+~Hku z-|_AbfL<2$*j}5v+iO1Pwr)}J%HmwN!eJys2!|j(1d|6KbpXf^Tp4L#16JUnoPg2& OaC9`z?6Z+qgxz0kPLmk` From a008bc27fab257cfe6eba7cda494838feed0c0d3 Mon Sep 17 00:00:00 2001 From: Malasaur Date: Mon, 1 Dec 2025 22:43:15 +0100 Subject: [PATCH 2/2] Changed ProcessController to handle Server as child subprocess --- classes.py | 7 +++++ config.py | 1 - controllers.py | 71 +++++++++++++++++++++----------------------------- main.py | 18 +++++++------ util.py | 8 +++--- 5 files changed, 52 insertions(+), 53 deletions(-) diff --git a/classes.py b/classes.py index ca48faf..ceca19f 100644 --- a/classes.py +++ b/classes.py @@ -1,6 +1,13 @@ +from enum import Enum from typing import NotRequired, TypedDict +class ProcessStatus(Enum): + RUNNING = None + STOPPED = 0 + CRASHED = 1 + + class ServerPlayersList(TypedDict): online: int max: int diff --git a/config.py b/config.py index f90de32..7d57f4e 100644 --- a/config.py +++ b/config.py @@ -4,7 +4,6 @@ from dotenv import dotenv_values class Config: data = dotenv_values() MINECRAFTD_PASSWORD: str | None = data.get("MINECRAFTD_PASSWORD") - PID_FILE: str = data.get("PID_FILE") or "server.pid" START_COMMAND: str = data.get("START_COMMAND") or "python proc.py" SERVER_HOST: str = data.get("SERVER_HOST") or "localhost" SERVER_PORT: int = int(data.get("SERVER_PORT") or 25565) diff --git a/controllers.py b/controllers.py index 24ddf33..ac87ddb 100644 --- a/controllers.py +++ b/controllers.py @@ -1,70 +1,56 @@ import shlex from collections import deque -from os import setsid from pathlib import Path from subprocess import PIPE, Popen from time import sleep -from typing import Generator +from typing import Generator, Literal from mcrcon import MCRcon from mcstatus import JavaServer -from psutil import NoSuchProcess, Process -from .classes import ServerStatus +from .classes import ProcessStatus, ServerStatus from .config import Config class ProcessController: def __init__(self): - self.pid_file: Path = Path(Config.PID_FILE) self.start_command: list[str] = shlex.split(Config.START_COMMAND) - self.process: Process | None = None - - if self.pid_file.is_file(): - pid = int(self.pid_file.read_text()) - if self._is_pid_alive(pid): - self.process = Process(pid) - else: - self.pid_file.unlink() + self.process: Popen | None = None + self.last_status: Literal[ProcessStatus.STOPPED, ProcessStatus.CRASHED] = ( + ProcessStatus.STOPPED + ) def start(self) -> None: - "Starts the process." - if self.is_started(): + "Start the process." + if self.status() == ProcessStatus.RUNNING: return - process = Popen( + self.process = Popen( self.start_command, stdout=PIPE, stderr=PIPE, - preexec_fn=setsid, ) - self.process = Process(process.pid) - self.pid_file.write_text(str(self.process.pid)) - def is_started(self) -> bool: - "Check if the process is running." - if self.process: - return self.process.is_running() - return False - - def is_crashed(self) -> bool: - "Check if the process has crashed." - return False # TODO + def status(self) -> ProcessStatus: + "Check the process' status." + if not self.process: + return self.last_status + match self.process.poll(): + case None: + return ProcessStatus.RUNNING + case 0: + self.last_status = ProcessStatus.STOPPED + return ProcessStatus.STOPPED + case _: + self.last_status = ProcessStatus.CRASHED + return ProcessStatus.CRASHED def kill(self) -> None: "Kill the process." if self.process: self.process.terminate() self.process = None - self.pid_file.unlink() - - def _is_pid_alive(self, pid: int) -> bool: - "Check if a process with the given PID is alive." - try: - p = Process(pid) - return p.is_running() - except NoSuchProcess: - return False + self.last_status = ProcessStatus.STOPPED class ServerController: @@ -102,10 +88,13 @@ class ServerController: } def command(self, command: str) -> str: - self.rcon.connect() - output = self.rcon.command(command) - self.rcon.disconnect() - return output + try: + self.rcon.connect() + output = self.rcon.command(command) + self.rcon.disconnect() + return output + except Exception: + return "" class MaintainanceController: diff --git a/main.py b/main.py index 5f74ce4..e8faa57 100644 --- a/main.py +++ b/main.py @@ -4,6 +4,7 @@ from typing import Annotated from fastapi import FastAPI, Header from fastapi.responses import StreamingResponse +from .classes import ProcessStatus from .controllers import Controllers from .models import Models from .responses import Responses @@ -16,7 +17,7 @@ app = FastAPI() async def start() -> Responses.StartResponse: "Starts the Server process." - if Controllers.process.is_started(): + if Controllers.process.status() == ProcessStatus.RUNNING: return {"status": "running"} Controllers.process.start() return {"status": "started"} @@ -26,9 +27,10 @@ async def start() -> Responses.StartResponse: async def status() -> Responses.StatusResponse: "Checks whether the Server is running and returns its information." - if not Controllers.process.is_started(): + process_status = Controllers.process.status() + if process_status != ProcessStatus.RUNNING: # Crashed - if Controllers.process.is_crashed(): + if process_status == ProcessStatus.CRASHED: return {"status": "crashed"} # Maintainance if Controllers.maintainance.is_set(): @@ -36,18 +38,18 @@ async def status() -> Responses.StatusResponse: # Offline return {"status": "offline"} - status = Controllers.server.status() + server_status = Controllers.server.status() # Starting - if not status["online"]: + if not server_status["online"]: return {"status": "starting"} # Online return { "status": "online", - "motd": status.get("motd", ""), - "icon": status.get("icon", None), - "players": status.get( + "motd": server_status.get("motd", ""), + "icon": server_status.get("icon", None), + "players": server_status.get( "players", { "online": 0, diff --git a/util.py b/util.py index 5c7d38a..7a1588f 100644 --- a/util.py +++ b/util.py @@ -3,6 +3,8 @@ from typing import Callable from fastapi import HTTPException +from minecraftd.classes import ProcessStatus + from .config import Config from .controllers import Controllers @@ -28,12 +30,12 @@ async def stop_server( await sleep(1) countdown -= 1 - # Controllers.server.command("stop") - while timeout > 0 and Controllers.process.is_started(): + Controllers.server.command("stop") + while timeout > 0 and Controllers.process.status() == ProcessStatus.RUNNING: await sleep(1) timeout -= 1 - if Controllers.process.is_started(): + if Controllers.process.status() == ProcessStatus.RUNNING: Controllers.process.kill() if then: