From bb0dd55c95187c97911046040922a6d1393cf700 Mon Sep 17 00:00:00 2001 From: ME1312 Date: Fri, 12 Jun 2020 01:45:49 -0400 Subject: [PATCH] #50 #46 Selecting Multiple Servers This commit includes the following major changes and additions: -> New Command & Permission Formatting -> RemotePlayer API -> SubData with Blocks --- .gitignore | 1 + Artifacts/ServerContainer.class | Bin 0 -> 13870 bytes README.md | 2 +- SubServers.Bungee/pom.xml | 8 +- .../Bungee/Event/SubEditServerEvent.java | 2 +- .../Bungee/Host/External/ExternalHost.java | 76 +- .../Host/External/ExternalSubCreator.java | 8 +- .../Host/External/ExternalSubLogger.java | 12 +- .../Host/External/ExternalSubServer.java | 47 +- .../ME1312/SubServers/Bungee/Host/Host.java | 27 + .../Bungee/Host/Internal/InternalHost.java | 36 +- .../Host/Internal/InternalSubCreator.java | 22 +- .../Host/Internal/InternalSubLogger.java | 12 +- .../Host/Internal/InternalSubServer.java | 45 +- .../ME1312/SubServers/Bungee/Host/Proxy.java | 37 +- .../SubServers/Bungee/Host/RemotePlayer.java | 148 ++ .../ME1312/SubServers/Bungee/Host/Server.java | 6 +- .../{ServerContainer.java => ServerImpl.java} | 72 +- .../Bungee/Host/SubServerController.java | 234 +-- ...erverContainer.java => SubServerImpl.java} | 29 +- .../net/ME1312/SubServers/Bungee/Launch.java | 35 +- .../Library/Compatibility/CommandX.java | 2 +- .../Compatibility/LegacyServerMap.java | 104 ++ .../Compatibility/mc1_13/CommandX.java | 2 +- .../Bungee/Library/ConfigUpdater.java | 512 ++++++ .../Bungee/Library/Updates/ConfigUpdater.java | 485 ------ .../Packet/PacketDownloadGroupInfo.java | 27 +- .../Packet/PacketDownloadHostInfo.java | 20 +- .../Packet/PacketDownloadPlayerInfo.java | 90 + .../Packet/PacketDownloadPlayerList.java | 76 - .../Packet/PacketDownloadProxyInfo.java | 22 +- .../Packet/PacketDownloadServerInfo.java | 20 +- .../Network/Packet/PacketLinkExHost.java | 22 +- .../Network/Packet/PacketLinkProxy.java | 24 +- .../Network/Packet/PacketLinkServer.java | 38 +- .../Bungee/Network/SubProtocol.java | 22 +- .../net/ME1312/SubServers/Bungee/SubAPI.java | 84 +- .../ME1312/SubServers/Bungee/SubCommand.java | 961 ++++++----- .../ME1312/SubServers/Bungee/SubProxy.java | 57 +- SubServers.Client/Bukkit/pom.xml | 6 +- .../Bukkit/Event/SubEditServerEvent.java | 2 +- .../Bukkit/Graphic/DefaultUIHandler.java | 117 +- .../Bukkit/Graphic/DefaultUIRenderer.java | 72 +- .../Client/Bukkit/Graphic/UIRenderer.java | 8 +- .../Library/Compatibility/BungeeChat.java | 8 +- .../Library/{Updates => }/ConfigUpdater.java | 2 +- .../Client/Bukkit/Network/API/Host.java | 121 +- .../Client/Bukkit/Network/API/Proxy.java | 83 +- .../Bukkit/Network/API/RemotePlayer.java | 167 ++ .../Client/Bukkit/Network/API/Server.java | 92 +- .../Client/Bukkit/Network/API/SubServer.java | 52 +- .../Packet/PacketDownloadGroupInfo.java | 11 +- .../Packet/PacketDownloadHostInfo.java | 12 +- .../Network/Packet/PacketDownloadLang.java | 3 +- ...ist.java => PacketDownloadPlayerInfo.java} | 37 +- .../Packet/PacketDownloadProxyInfo.java | 28 +- .../Packet/PacketDownloadServerInfo.java | 11 +- .../Network/Packet/PacketInExRunEvent.java | 2 +- .../Network/Packet/PacketLinkServer.java | 6 +- .../Client/Bukkit/Network/SubProtocol.java | 14 +- .../SubServers/Client/Bukkit/SubAPI.java | 109 +- .../SubServers/Client/Bukkit/SubCommand.java | 936 +++++++---- .../SubServers/Client/Bukkit/SubPlugin.java | 37 +- SubServers.Client/Bukkit/src/plugin.yml | 70 +- SubServers.Client/Sponge/pom.xml | 5 +- .../Sponge/Event/SubEditServerEvent.java | 2 +- .../Client/Sponge/Graphic/UIRenderer.java | 10 +- .../{ => Compatibility}/ChatColor.java | 2 +- .../Library/Compatibility/ListArgument.java | 49 + .../Library/{Updates => }/ConfigUpdater.java | 2 +- .../Client/Sponge/Network/API/Host.java | 126 +- .../Client/Sponge/Network/API/Proxy.java | 83 +- .../Sponge/Network/API/RemotePlayer.java | 169 ++ .../Client/Sponge/Network/API/Server.java | 92 +- .../Client/Sponge/Network/API/SubServer.java | 57 +- .../Packet/PacketDownloadGroupInfo.java | 11 +- .../Packet/PacketDownloadHostInfo.java | 11 +- .../Network/Packet/PacketDownloadLang.java | 3 +- ...ist.java => PacketDownloadPlayerInfo.java} | 37 +- .../Packet/PacketDownloadProxyInfo.java | 27 +- .../Packet/PacketDownloadServerInfo.java | 11 +- .../Network/Packet/PacketInExRunEvent.java | 2 +- .../Network/Packet/PacketLinkServer.java | 8 +- .../Client/Sponge/Network/SubProtocol.java | 15 +- .../SubServers/Client/Sponge/SubAPI.java | 109 +- .../SubServers/Client/Sponge/SubCommand.java | 979 +++++++---- .../SubServers/Client/Sponge/SubPlugin.java | 32 +- SubServers.Console/src/bungee.yml | 2 +- .../SubServers/Console/ConsoleWindow.java | 8 +- .../SubServers/Console/Library/HTMLogger.java | 2 +- SubServers.Creator/src/Forge/build.sh | 2 +- .../src/Forge/config/sponge/global.conf | 122 +- .../src/Forge/server.properties | 37 +- .../src/Paper/server.properties | 37 +- SubServers.Creator/src/Paper/spigot.yml | 133 +- SubServers.Creator/src/Paper/template.yml | 2 +- .../src/Spigot/server.properties | 37 +- SubServers.Creator/src/Spigot/spigot.yml | 133 +- SubServers.Creator/src/Sponge/build.sh | 2 +- .../src/Sponge/config/sponge/global.conf | 122 +- .../src/Sponge/server.properties | 37 +- SubServers.Creator/src/Vanilla/build.sh | 2 +- .../src/Vanilla/server.properties | 37 +- SubServers.Host/pom.xml | 6 +- .../Host/Event/SubEditServerEvent.java | 2 +- .../net/ME1312/SubServers/Host/ExHost.java | 51 +- .../Host/Executable/SubCreatorImpl.java | 23 +- .../Host/Executable/SubLoggerImpl.java | 22 +- .../Host/Executable/SubServerImpl.java | 2 +- .../Library/{Updates => }/ConfigUpdater.java | 4 +- .../SubServers/Host/Network/API/Host.java | 102 +- .../SubServers/Host/Network/API/Proxy.java | 59 +- .../Host/Network/API/RemotePlayer.java | 169 ++ .../SubServers/Host/Network/API/Server.java | 53 +- .../Host/Network/API/SubServer.java | 57 +- .../Packet/PacketDownloadGroupInfo.java | 11 +- .../Packet/PacketDownloadHostInfo.java | 11 +- .../Network/Packet/PacketDownloadLang.java | 2 +- ...ist.java => PacketDownloadPlayerInfo.java} | 37 +- .../Packet/PacketDownloadProxyInfo.java | 27 +- .../Packet/PacketDownloadServerInfo.java | 11 +- .../Network/Packet/PacketExRemoveServer.java | 7 +- .../Network/Packet/PacketInExRunEvent.java | 2 +- .../SubServers/Host/Network/SubProtocol.java | 26 +- .../net/ME1312/SubServers/Host/SubAPI.java | 109 +- .../ME1312/SubServers/Host/SubCommand.java | 1461 +++++++++++------ SubServers.Sync/pom.xml | 8 +- .../Sync/Event/SubEditServerEvent.java | 2 +- .../net/ME1312/SubServers/Sync/ExProxy.java | 26 +- .../net/ME1312/SubServers/Sync/Launch.java | 35 +- .../Sync/Library/Compatibility/CommandX.java | 2 +- .../Compatibility/mc1_13/CommandX.java | 2 +- .../Library/{Updates => }/ConfigUpdater.java | 2 +- .../SubServers/Sync/Network/API/Host.java | 102 +- .../SubServers/Sync/Network/API/Proxy.java | 59 +- .../Sync/Network/API/RemotePlayer.java | 169 ++ .../SubServers/Sync/Network/API/Server.java | 53 +- .../Sync/Network/API/SubServer.java | 57 +- .../Packet/PacketDownloadGroupInfo.java | 11 +- .../Packet/PacketDownloadHostInfo.java | 11 +- .../Network/Packet/PacketDownloadLang.java | 2 +- ...ist.java => PacketDownloadPlayerInfo.java} | 37 +- .../Packet/PacketDownloadProxyInfo.java | 27 +- .../Packet/PacketDownloadServerInfo.java | 11 +- .../Network/Packet/PacketInExRunEvent.java | 2 +- .../SubServers/Sync/Network/SubProtocol.java | 12 +- .../SubServers/Sync/Server/ServerImpl.java | 29 +- .../SubServers/Sync/Server/SubServerImpl.java | 22 +- .../net/ME1312/SubServers/Sync/SubAPI.java | 109 +- .../ME1312/SubServers/Sync/SubCommand.java | 1352 ++++++++++----- 150 files changed, 7996 insertions(+), 4390 deletions(-) create mode 100644 Artifacts/ServerContainer.class create mode 100644 SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/RemotePlayer.java rename SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/{ServerContainer.java => ServerImpl.java} (79%) rename SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/{SubServerContainer.java => SubServerImpl.java} (82%) create mode 100644 SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/LegacyServerMap.java create mode 100644 SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/ConfigUpdater.java delete mode 100644 SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Updates/ConfigUpdater.java create mode 100644 SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadPlayerInfo.java delete mode 100644 SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadPlayerList.java rename SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/{Updates => }/ConfigUpdater.java (98%) create mode 100644 SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/RemotePlayer.java rename SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/{PacketDownloadPlayerList.java => PacketDownloadPlayerInfo.java} (57%) rename SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Library/{ => Compatibility}/ChatColor.java (98%) create mode 100644 SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Library/Compatibility/ListArgument.java rename SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Library/{Updates => }/ConfigUpdater.java (98%) create mode 100644 SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/RemotePlayer.java rename SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/Packet/{PacketDownloadPlayerList.java => PacketDownloadPlayerInfo.java} (56%) rename SubServers.Host/src/net/ME1312/SubServers/Host/Library/{Updates => }/ConfigUpdater.java (97%) create mode 100644 SubServers.Host/src/net/ME1312/SubServers/Host/Network/API/RemotePlayer.java rename SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/{PacketDownloadPlayerList.java => PacketDownloadPlayerInfo.java} (56%) rename SubServers.Sync/src/net/ME1312/SubServers/Sync/Library/{Updates => }/ConfigUpdater.java (98%) create mode 100644 SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/API/RemotePlayer.java rename SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/{PacketDownloadPlayerList.java => PacketDownloadPlayerInfo.java} (56%) diff --git a/.gitignore b/.gitignore index b3aa7c5a..6d768083 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,7 @@ crashlytics-build.properties /Artifacts/-Icon/ /Artifacts/-Lite/ /Artifacts/*.jar +/BungeeCord/ /Javadoc/ /SubServers.Test/ /build.ant diff --git a/Artifacts/ServerContainer.class b/Artifacts/ServerContainer.class new file mode 100644 index 0000000000000000000000000000000000000000..7d56883579141fd634d51d97d7752e903817bbdc GIT binary patch literal 13870 zcmcIr34B~t)jwx4lQ*5bE=ik0XxgR=ZIWr5E>LK?K%1s*AW1{h#T0=~lGkMDWG2i~ zTBw4EisFL1t>A_jQAAKWX{6?4+ zyZ79){?EC0lJCCpjr)k`EYD74W1VugXfRKNVUN=0Sf3& zt&9W>UJ#%OdSs!DEDCTPFP6s==`IyY%Y@Qd2A>_^<$O+n&*c>c*9Yhfp6}rDe z4?D}4Dg5e!@|!;0+is7`e{h43ia*fj~V>&0KJ7jAwnIL$02!qQXV(^`4&Ha z%1?)dgHQYUGxGUaKc&TZpA$pfDy`4U@NIs&T|U1cj{$jnQ63oUNbTEy)B{sl}zK>!#&YZ zG8MO&E*d^#l^%+OqCIs@(WKR5#aA{*tz=zGQ69DatYfUP9(wW+`OR?$d9|SH=ML0Si>~C@DiouZQGjG zD}IW5!`LHP&f)pGI<+f-LU+`X7pQAeVtZ(Yp64Vk+SAk zS17VQ6c0<^9%Q_j?%KRH)}HF>ZLyNQvF^rrJfAr;j8BcJGTNyO{zI z3fAjNTIh^#Plmeoz!B7*fL6S3+}CCGC&N${47e&B4JX$yt^MCBY&#f8_J%=oncLyU zth>fh8EAsp#$YutQJGcH@I~NJ-qN%#(;yj++VJK}o24RV=-cU4ZMH~dk z31-mWW9^3yrfM#f=fWHISlxD1`0e#-PL5OT@6R|!u;5~M{A9pGFk$Tov&W7rNLU8n z0i`5dN~x_Ln@XB$#PXqd4-te5~aakG5Ah+ecbAc?X_G69vf{DWdb~7eK^q{3GHuHu{Wig&Gj?7B`3aiRWj9RM||=hlh2 z!dAB?ij|%)(8Z1V3ZD@lnj*IKrV@fc*do;v23*h2vq2uD!dMxXSeN6`iR7x$S1K^x z0*fato4qwF4gRXZccH*wx?lwH{|8i|_i$p9oqmd{Yg7WVl9>^2^-i(20k>#TP+abE z90zrwyz!W^#f8!)jJ6}225U#;I9qc#>2O?ED7v<*3yBONq+>SUj195AzEHHg-HLW2 zO$pa?3Yt529@q>g9InKalWq6T=3}8%U=&IyNkv_WT?BNMM&iAVx{{e+AY@!x(}m1R zQEM@Pw_7Jur3Mv__IntnHIW0{lywDm%}M#A)l}Ohm|?{r%;W;u(UxHL zd1IeFLd@HNZi^7u9g8~vx7f|d2!NXtAu18>jxnuquN+MTH&fa4gHsGnRY)D}u~fXv z+7K24P06c_7Ky!>mbjEP0*`qMO}dxvW15z=_plm?=?wK&Xb;Qxvi>+8d^c06nx7(pJa zGWkBfpQ+Ks{BXr)&IQg&=n45K3_OrihBM4`T6RaBYSyK~5kLmhEIqeMs?kIh5GNW- zR`rJVT2+bu5U{5ntQ_OxCO;su-b>Gz{4IVE2yF7V`Gm<2@x$`?j=|qG`Fr%V!HO-QRfp~%{JPpS{cHJ4iF!6tUq zSJkvWqrFb6Dgw~1N&?oZuCn4WF(w#wdmDdHx&If|0d{<;hrA zEK=8ogNBvdoI-VdUhed~U0bc>m9h99dqH+xoI6x1X+9^0gF29r9) zUc2f)T8jeCE_2j!akCdpevw}?`S1J>)Db4X%>Oj$hxC}qub{=R@@q_Ik8P92?r>6z zZ!@>lwJr~6oRego6rSBq7ZpXfE=YyB=j8D(gHM|LI=>-ihXb6V=WHY8=YCr@lzX`) z97;YHCs1Xck%kpj*w#a)hxu=&$3u_fOpA1?>#fA*s9v3eYZ^i@*;9m4A{*E37VJAA z+m}j4WC~;uRfVuCeyW5~w_N%VuD5K8?#AWTou z54Wkqg;V>8=;KUJ03gIqcuGu<$>mVIXFRfK62~^gjb_HA-_g@3_tmY4Nq;0n;xW$z z(=$>0=9p)a=_!@KDx&91PZ^MlPRir2=<;MPXR02RVb`q#)SuO06Y@eR83Rt&jfPyq zBNb)I#4Lg}L_$(Tx=bS(jp@u$nS$#m1YtVAKvAVjIU(?GPw!IWp{B-j&cEAmZ5xh& zCGfu{T=;~dU9iCX-12I;Lt_NXAn|0mGFlsrMfdl`QVE@XnbwcW{IJTR(4~>EuB!~? z!RunNh!w)Y$55xg&AV|cfCGZ7xV2}1rx`AZ^H5M5>dPDJc>xz^GHL2RaIMm;dlK|5~_cZ%#>1Hpd1^|=(WK0h+Nj)z`U_2U% zU_)G>xXZ|b%2!STDkX_jXTO~@n3j&duGJ1vP|SEQNXX@leR&7fVQ=NbqQc>Javgs& z6YQlRq^pg*aYO*FY8G=c4qQmkBAgPzbpcJuvC~M#RMid8EEp06 z!bE${CUuMiSmvGI;A8G$OIKO;WC&S|7*ftIw`2~D1*6@P<&qF>7VEnj&4@%q*n$Ca z4XJPKT?rEdSgAk+lU)^Z){0OEbgS>Hiol=X;c%4>9}%8>SlP552_?t8_I1u`HyM>6 za=x(0!zys<`szW5Ls`*oT^S`O!-y5_N%o>(0r@s{L)8+BhVX?9>L@5e*mRd1avP>Evg&eX z!!hD+j+EN+gv^5rR~8>lmrnVYR}HRIcTB2K7z=~Abi_9g5xe@_Q22t#mP}1rIjZn_ zitWFd3&tgdsg6{7Dzi%V-WClbFEt^^eQ^sVF4M(sce7Jcj?d&d+=xnYW3PihV(ax* zS0sepHiWIn7;<3T+AX)Gb!xgmojs6O?c`1y?vletBseDa<4d-r`i5p}9LMN9Y_#Ry z>2hb~Ub0le{X+FkL(Wx}1E;Pq%TrlSjH;M`SiY`EEQ^>9!=28{afy;WDL+fcZZHA;7dBF?aPsgxES|YD#s!ho&Qno31Manj13a@I3yuLgc zkB=nd)c+qD8%L3G17zGd1{ohvmK>Xm9=Z9mWqcV{6+0gA-%F=;6b0KmybIbpd<)w< zip#x6==AmuqueK-N2uZ;l^mrrV906r2g@qcH2omWI7%}*j?zpFR+Y_4)9fJrr)kb0 z&Anfl_sn}}UTvD@r>QzkHEF7?E%zR#VC_9LuILCYz-{Eh9b$9s%V#KFE~G`&Ok1dh zda0G7u-DaekxK^$96KLy?0mqn^8v@s2OK*eP=4)Ge(fdCqB$;$v)nboS0oId1RoMF z7agTV9l~Rp>IP|Xvvdb(NlWkuEro>3S{Dw{S&XQii3aYQkJ0ja?*ds+;Z4&yX*zeu zz^SJe6x~ZJ(o}zpRtj;ia_gyTgKadCw$o{}gQn4&sF6C9c(s^w76SPMJ%kq6umzn+ z>*!(n4wyU*uK!)MJoG)hpNdcY?h)tR_c12nTS}fcsLG%psGmn)L+r5J8fi&AE65MX zAucOgQ+YFuKT4}Q%2p53n)`zfkx_YwF0-Ytgpr2mJP%~8!0`6q2`ZIWG7d=}qV?W2 znSSsXoiFypoJG*m+7mRPRzB0T?hsYVTX;gl0F`E!q-p&QxY7HSuQU$P28N|JGSz!4 zytazt(o#C!RPU?srKzcC=?Q|o z19eh6by1RbBTe+sb#ys=ZVw%&2t7i5^fUPEGx*J-33NG^(iM*99*0N&2+5-uz`u)r zOpl8za9PHi(fSGf6!wv^6QJTD4^N_>D{K~Xn|P;b+zJ|Epb}+TTYgB|(prIqAwU!sA=}l?s7&!I&Y|IBhk|;%s zp-aK?Dv+EDM3f*9v|f_Y4_aD3B6$gUPEsl4dJU<8<)X{x=mLBS@J|Lu;~%1cxW)h( z(i4U?&LFp;eU;izw2JBWEr$fZ-OOZGz_;Xhga=92=4}MG%r3# zbsFr_^yZ^k?!l?w-`rr_M5dtwktGpiwuiq|6C--htN z4q$LSyzd=A$9E|S1O~vEqo*)EtFoWS;-jLe!80KPZvQY%R8WVWi0p$-Cdq)#w^}DR zx^&{RDeBVaPgwM4M;$l9?6T`>#FNS!dHDef`V`HU9fCvD<)K4VZg;vpv_qPJ(yWLY z6+Z|OKSZ_kVLF>Wg4F*pmw2lk@m9OU0~1q4y1zJ##cjrF3NvOiVHIMcOu6zW!Nkp| zF>ax16n^57TE8_812rxNiioFTf83dB?ebml6G^BK+c^WdL)AVl+Ul+FiQV}Sx7dNW zo_b&KDD`$!pcV=bk?3kcg>MKz0$h~dz^O+T-a~s%P zA;KZu1)|HH9j>VNDT>M_mCj~y*JgU36F|m#Z%_)(U4Wej0X7;I*C6K*-HHVAdBEar z$Vp$Ib5ZMVqAwz+-Hu%LC9JpuCYMV0PNe9sqTIL}G`@zQzDKE43eLK`>6tYSq)vTqX%5h+2A;51Dx{?Fd|xj zb5;-|)-xb>1e^(`HWv<#LTshnz*M%kES07!Yf%U78z6rRN`U=$W3zLR6F0y?G`h}^ z$^xdI3Ism~#YzLR;s%s08)3E!>HCUpLHUhvsIP-P!I5T1fM!>8`GH2?m-#C`<>OI2}AVK>cgaR@nB zB-G%g+}Bk^IyK0OObxQB6%~l8ALr=Cv1~#3mJWeXFLd)(T?syzAAB#sqhG|?vk#gZ_bK)$J`p-uzptW*UQmpGz6YKs~lRa8k={}<8~jUwGE zknUCFz1L8&{>zcB(Is8nkuL6%ZajIXo}_6R;Y!(bYB6`EF(u!nPpLifP?X1`YStbl z=|*%q*XKH!=2jW7y%_`sHD@iQZbJ|hXRwdvAS^Og0v(6@xjfOn9hghcqQcfG13`EO zT)Gs+w`RZs0}@MfM>LI@rfcAPI2~o9NR_iN?^G^Po9p6X_~te~qj?*+H7d@uwZFv?#VI$hp7V_I9 zHRuS}r#V@rdrVwkmv5wL;JOlj&N6+hoS)7%=bj{XM3KcC>{DQKuF*fLhA7xp>-1y zhUz5I`JnFDe6(QXL#n!SZU|;)ZU}mDLm;;UA5POpvaMVA;pSgKYw>Foj$? z(&X(OIRex8kE%@rk_VW;-y!Bp>n>J)9(h`ul&3Q;U^cX zH{mAdCA2)at4N^={~TOh$~~zV^sHN*S#tfVX7Mz<6(`?G#c$9doPX61PKWbfr%K&E qg##pxzc>-=mw4h=ygbt7%2VKO_{$>w(%|W@g4?X`&%jO|p84M~ojAV$ literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 9265dd06..60307668 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ SubServers 2 is a rewrite of SubServers, the Server Management Platform.
These are some quick links for common resources of SubServers 2. ### How to Install -> [https://github.com/ME1312/SubServers-2/wiki/Install](https://github.com/ME1312/SubServers-2/wiki/Install) +> [https://github.com/ME1312/SubServers-2/wiki/Install](https://github.com/ME1312/SubServers-2/wiki/Installation) ### Snapshot Downloads > [https://dev.me1312.net/jenkins/job/SubServers Platform](https://dev.me1312.net/jenkins/job/SubServers%20Platform) diff --git a/SubServers.Bungee/pom.xml b/SubServers.Bungee/pom.xml index 05a77f00..91f4dae8 100644 --- a/SubServers.Bungee/pom.xml +++ b/SubServers.Bungee/pom.xml @@ -30,20 +30,20 @@ net.ME1312.Galaxi GalaxiUtil - 20w08c + 20w15a compile true net.ME1312.Galaxi GalaxiEngine - 20w08c + 20w15a provided net.ME1312.SubData Server - 20w07d + 20w15a compile true @@ -162,7 +162,7 @@ SubServers.Bungee Javadoc SubServers.Bungee Javadoc - public + protected ./ ${basedir}/../Javadoc/SubServers.Bungee ${basedir}/../Javadoc/SubServers.Bungee diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubEditServerEvent.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubEditServerEvent.java index 93f49ebd..a61121e7 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubEditServerEvent.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubEditServerEvent.java @@ -3,7 +3,7 @@ package net.ME1312.SubServers.Bungee.Event; import net.ME1312.SubServers.Bungee.Host.Server; import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Map.ObjectMapValue; -import net.ME1312.Galaxi.Library.NamedContainer; +import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.ME1312.SubServers.Bungee.Library.SubEvent; import net.ME1312.Galaxi.Library.Util; import net.md_5.bungee.api.plugin.Cancellable; diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java index 0f3d2e1f..0d5c05a5 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java @@ -31,14 +31,14 @@ public class ExternalHost extends Host implements ClientHandler { private HashMap subdata = new HashMap(); private HashMap servers = new HashMap(); private String name; - protected boolean available; + boolean available; private boolean enabled; private InetAddress address; private SubCreator creator; private String directory; private LinkedList queue; private boolean clean; - protected SubProxy plugin; + SubProxy plugin; /** * Creates an External Host @@ -93,7 +93,7 @@ public class ExternalHost extends Host implements ClientHandler { for (Integer channel : Util.getBackwards(subdata, (SubDataClient) client)) setSubData(null, channel); } - protected void queue(PacketOut... packet) { + void queue(PacketOut... packet) { for (PacketOut p : packet) if (getSubData()[0] == null || !available) { queue.add(p); } else { @@ -167,7 +167,7 @@ public class ExternalHost extends Host implements ClientHandler { @Override public SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { if (plugin.api.getServers().keySet().contains(name.toLowerCase())) throw new InvalidServerException("A Server already exists with this name!"); - ExternalSubServer server = new ExternalSubServer(this, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted); + ExternalSubServer server = ExternalSubServer.construct(this, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted); SubAddServerEvent event = new SubAddServerEvent(player, this, server); plugin.getPluginManager().callEvent(event); if (!event.isCancelled()) { @@ -184,18 +184,18 @@ public class ExternalHost extends Host implements ClientHandler { @Override public boolean removeSubServer(UUID player, String name) throws InterruptedException { if (Util.isNull(name)) throw new NullPointerException(); - String server = servers.get(name.toLowerCase()).getName(); + SubServer server = servers.get(name.toLowerCase()); - SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server)); + SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, server); plugin.getPluginManager().callEvent(event); if (!event.isCancelled()) { - if (getSubServer(server).isRunning()) { - getSubServer(server).stop(); - getSubServer(server).waitFor(); + if (server.isRunning()) { + server.stop(); + server.waitFor(); } - queue(new PacketExRemoveServer(server, data -> { + queue(new PacketExRemoveServer(name.toLowerCase(), data -> { if (data.getInt(0x0001) == 0 || data.getInt(0x0001) == 1) { - servers.remove(server.toLowerCase()); + servers.remove(name.toLowerCase()); } })); return true; @@ -205,17 +205,17 @@ public class ExternalHost extends Host implements ClientHandler { @Override public boolean forceRemoveSubServer(UUID player, String name) throws InterruptedException { if (Util.isNull(name)) throw new NullPointerException(); - String server = servers.get(name.toLowerCase()).getName(); + SubServer server = servers.get(name.toLowerCase()); - SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server)); + SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, server); plugin.getPluginManager().callEvent(event); - if (getSubServer(server).isRunning()) { - getSubServer(server).stop(); - getSubServer(server).waitFor(); + if (server.isRunning()) { + server.stop(); + server.waitFor(); } - queue(new PacketExRemoveServer(server, data -> { + queue(new PacketExRemoveServer(name.toLowerCase(), data -> { if (data.getInt(0x0001) == 0 || data.getInt(0x0001) == 1) { - servers.remove(server.toLowerCase()); + servers.remove(name.toLowerCase()); } })); return true; @@ -224,14 +224,15 @@ public class ExternalHost extends Host implements ClientHandler { @Override public boolean recycleSubServer(UUID player, String name) throws InterruptedException { if (Util.isNull(name)) throw new NullPointerException(); - String server = servers.get(name.toLowerCase()).getName(); + SubServer s = servers.get(name.toLowerCase()); + String server = s.getName(); - SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server)); + SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, s); plugin.getPluginManager().callEvent(event); if (!event.isCancelled()) { - if (getSubServer(server).isRunning()) { - getSubServer(server).stop(); - getSubServer(server).waitFor(); + if (s.isRunning()) { + s.stop(); + s.waitFor(); } Logger.get("SubServers").info("Saving..."); @@ -263,12 +264,14 @@ public class ExternalHost extends Host implements ClientHandler { @Override public boolean forceRecycleSubServer(UUID player, String name) throws InterruptedException { if (Util.isNull(name)) throw new NullPointerException(); - String server = servers.get(name.toLowerCase()).getName(); + SubServer s = servers.get(name.toLowerCase()); + String server = s.getName(); - SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server)); + SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, s); plugin.getPluginManager().callEvent(event); - if (getSubServer(server).isRunning()) { - getSubServer(server).terminate(); + if (s.isRunning()) { + s.stop(); + s.waitFor(); } Logger.get("SubServers").info("Saving..."); @@ -287,7 +290,6 @@ public class ExternalHost extends Host implements ClientHandler { Logger.get("SubServers").info("Moving Files..."); queue(new PacketExDeleteServer(server, info, true, data -> { if (data.getInt(0x0001) == 0 || data.getInt(0x0001) == 1) { - for (String group : getSubServer(server).getGroups()) getSubServer(server).removeGroup(group); servers.remove(server.toLowerCase()); Logger.get("SubServers").info("Deleted SubServer: " + server); } else { @@ -300,14 +302,15 @@ public class ExternalHost extends Host implements ClientHandler { @Override public boolean deleteSubServer(UUID player, String name) throws InterruptedException { if (Util.isNull(name)) throw new NullPointerException(); - String server = servers.get(name.toLowerCase()).getName(); + SubServer s = servers.get(name.toLowerCase()); + String server = s.getName(); SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server)); plugin.getPluginManager().callEvent(event); if (!event.isCancelled()) { - if (getSubServer(server).isRunning()) { - getSubServer(server).stop(); - getSubServer(server).waitFor(); + if (s.isRunning()) { + s.stop(); + s.waitFor(); } Logger.get("SubServers").info("Saving..."); @@ -339,12 +342,14 @@ public class ExternalHost extends Host implements ClientHandler { @Override public boolean forceDeleteSubServer(UUID player, String name) throws InterruptedException { if (Util.isNull(name)) throw new NullPointerException(); - String server = servers.get(name.toLowerCase()).getName(); + SubServer s = servers.get(name.toLowerCase()); + String server = s.getName(); SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server)); plugin.getPluginManager().callEvent(event); - if (getSubServer(server).isRunning()) { - getSubServer(server).terminate(); + if (s.isRunning()) { + s.stop(); + s.waitFor(); } Logger.get("SubServers").info("Saving..."); @@ -363,7 +368,6 @@ public class ExternalHost extends Host implements ClientHandler { Logger.get("SubServers").info("Removing Files..."); queue(new PacketExDeleteServer(server, info, false, data -> { if (data.getInt(0x0001) == 0 || data.getInt(0x0001) == 1) { - for (String group : getSubServer(server).getGroups()) getSubServer(server).removeGroup(group); servers.remove(server.toLowerCase()); Logger.get("SubServers").info("Deleted SubServer: " + server); } else { diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java index ee0de72c..ace31faa 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java @@ -4,6 +4,8 @@ import com.google.common.collect.Range; import net.ME1312.Galaxi.Library.*; import net.ME1312.Galaxi.Library.Callback.Callback; import net.ME1312.Galaxi.Library.Callback.ReturnCallback; +import net.ME1312.Galaxi.Library.Container.Container; +import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.ME1312.SubData.Server.SubDataClient; import net.ME1312.SubServers.Bungee.Event.SubCreateEvent; import net.ME1312.SubServers.Bungee.Event.SubCreatedEvent; @@ -103,7 +105,7 @@ public class ExternalSubCreator extends SubCreator { if (!event.isCancelled()) { Container address = new Container<>("$address$"); ReturnCallback conversion = obj -> convert(obj, new NamedContainer<>("$player$", (player == null)?"":player.toString()), new NamedContainer<>("$name$", name), - new NamedContainer<>("$template$", template.getName()), new NamedContainer<>("$type$", template.getType().toString()), new NamedContainer<>("$version$", (version != null)?version.toString().replace(" ", "@"):""), + new NamedContainer<>("$host$", host.getName()), new NamedContainer<>("$template$", template.getName()), new NamedContainer<>("$type$", template.getType().toString()), new NamedContainer<>("$version$", (version != null)?version.toString():""), new NamedContainer<>("$address$", address.get()), new NamedContainer<>("$port$", Integer.toString(fport))); logger.start(); @@ -212,7 +214,7 @@ public class ExternalSubCreator extends SubCreator { String name = server.getName(); String prefix = name + File.separator + "Updater"; - Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("updating"), server, true)); + Util.isException(() -> Util.reflect(SubServerImpl.class.getDeclaredField("updating"), server, true)); ExternalSubLogger logger = new ExternalSubLogger(this, prefix, log, null); thread.put(name.toLowerCase(), new NamedContainer<>(server.getAddress().getPort(), logger)); @@ -221,7 +223,7 @@ public class ExternalSubCreator extends SubCreator { if (!event.isCancelled()) { logger.start(); host.queue(new PacketExCreateServer(server, version, logger.getExternalAddress(), data -> { - Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("updating"), server, false)); + Util.isException(() -> Util.reflect(SubServerImpl.class.getDeclaredField("updating"), server, false)); if (data.getInt(0x0001) == 0) { Logger.get(prefix).info("Saving..."); } else { diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubLogger.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubLogger.java index 875e951d..36e5b872 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubLogger.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubLogger.java @@ -2,7 +2,7 @@ package net.ME1312.SubServers.Bungee.Host.External; import net.ME1312.SubServers.Bungee.Host.SubLogFilter; import net.ME1312.SubServers.Bungee.Host.SubLogger; -import net.ME1312.Galaxi.Library.Container; +import net.ME1312.Galaxi.Library.Container.Container; import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; import net.ME1312.SubServers.Bungee.Network.Packet.PacketInExLogMessage; @@ -27,11 +27,11 @@ import java.util.regex.Pattern; */ public class ExternalSubLogger extends SubLogger { private Object handle; - protected UUID id = null; - protected String name; - protected Container log; + UUID id = null; + String name; + Container log; private List filters = new CopyOnWriteArrayList<>(); - protected File file; + File file; private PrintWriter writer = null; private boolean started = false; @@ -43,7 +43,7 @@ public class ExternalSubLogger extends SubLogger { * @param log Console Logging Status * @param file File to log to (or null for disabled) */ - protected ExternalSubLogger(Object user, String name, Container log, File file) { + ExternalSubLogger(Object user, String name, Container log, File file) { this.handle = user; this.name = name; this.log = log; diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java index 2779c561..7f4cd049 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java @@ -5,10 +5,10 @@ import net.ME1312.SubServers.Bungee.Event.*; import net.ME1312.SubServers.Bungee.Host.*; import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Map.ObjectMapValue; -import net.ME1312.Galaxi.Library.Container; +import net.ME1312.Galaxi.Library.Container.Container; import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException; -import net.ME1312.Galaxi.Library.NamedContainer; +import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubServers.Bungee.Network.Packet.PacketExEditServer; import net.md_5.bungee.BungeeServerInfo; @@ -24,12 +24,12 @@ import java.util.UUID; /** * External SubServer Class */ -public class ExternalSubServer extends SubServerContainer { +public class ExternalSubServer extends SubServerImpl { private ExternalHost host; private boolean enabled; private Container log; private String dir; - protected String exec; + String exec; private String stopcmd; private StopAction stopaction; private LinkedList history; @@ -53,8 +53,33 @@ public class ExternalSubServer extends SubServerContainer { * @param restricted Restricted Status * @throws InvalidServerException */ - public ExternalSubServer(ExternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { + public static ExternalSubServer construct(ExternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { + try { + return new ExternalSubServer(host, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted); + } catch (NoSuchMethodError e) { + return new ExternalSubServer(host, name, enabled, (Integer) port, motd, log, directory, executable, stopcmd, hidden, restricted); + } + } + + /** + * Super Method 2 (newest) + * @see #construct(ExternalHost, String, boolean, int, String, boolean, String, String, String, boolean, boolean) for method details + */ + protected ExternalSubServer(ExternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { super(host, name, port, motd, hidden, restricted); + init(host, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted); + } + + /** + * Super Method 1 (oldest) + * @see #construct(ExternalHost, String, boolean, int, String, boolean, String, String, String, boolean, boolean) for method details + */ + protected ExternalSubServer(ExternalHost host, String name, boolean enabled, Integer port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { + super(host, name, port, motd, hidden, restricted); + init(host, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted); + } + + private void init(ExternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { if (Util.isNull(host, name, enabled, port, motd, log, stopcmd, hidden, restricted)) throw new NullPointerException(); this.host = host; this.enabled = enabled; @@ -226,7 +251,7 @@ public class ExternalSubServer extends SubServerContainer { break; case "display": if (value.isString()) { - Field f = ServerContainer.class.getDeclaredField("nick"); + Field f = ServerImpl.class.getDeclaredField("nick"); f.setAccessible(true); if (value.isNull() || value.asString().length() == 0 || getName().equals(value.asString())) { f.set(this, null); @@ -259,7 +284,7 @@ public class ExternalSubServer extends SubServerContainer { break; case "group": if (value.isList()) { - Util.reflect(ServerContainer.class.getDeclaredField("groups"), this, value.asStringList()); + Util.reflect(ServerImpl.class.getDeclaredField("groups"), this, value.asStringList()); if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Group", value.asStringList()); this.host.plugin.servers.save(); @@ -283,7 +308,7 @@ public class ExternalSubServer extends SubServerContainer { break; case "template": if (value.isString()) { - Util.reflect(SubServerContainer.class.getDeclaredField("template"), this, value.asString()); + Util.reflect(SubServerImpl.class.getDeclaredField("template"), this, value.asString()); if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Template", value.asString()); this.host.plugin.servers.save(); @@ -422,7 +447,7 @@ public class ExternalSubServer extends SubServerContainer { break; case "hidden": if (value.isBoolean()) { - Util.reflect(ServerContainer.class.getDeclaredField("hidden"), this, value.asBoolean()); + Util.reflect(ServerImpl.class.getDeclaredField("hidden"), this, value.asBoolean()); if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Hidden", isHidden()); this.host.plugin.servers.save(); @@ -432,7 +457,7 @@ public class ExternalSubServer extends SubServerContainer { break; case "whitelist": if (value.isList()) { - Util.reflect(ServerContainer.class.getDeclaredField("whitelist"), this, value.asUUIDList()); + Util.reflect(ServerImpl.class.getDeclaredField("whitelist"), this, value.asUUIDList()); c++; } break; @@ -441,7 +466,7 @@ public class ExternalSubServer extends SubServerContainer { forward.setStopAction(getStopAction()); if (!getName().equals(getDisplayName())) forward.setDisplayName(getDisplayName()); List groups = new ArrayList(); - Util.reflect(SubServerContainer.class.getDeclaredField("template"), forward, Util.reflect(SubServerContainer.class.getDeclaredField("template"), this)); + Util.reflect(SubServerImpl.class.getDeclaredField("template"), forward, Util.reflect(SubServerImpl.class.getDeclaredField("template"), this)); groups.addAll(getGroups()); for (String group : groups) { removeGroup(group); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java index 43c62452..2ccc916a 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java @@ -9,6 +9,7 @@ import net.ME1312.Galaxi.Library.ExtraDataHandler; import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubServers.Bungee.SubAPI; import net.ME1312.SubServers.Bungee.SubProxy; +import net.md_5.bungee.api.connection.ProxiedPlayer; import java.net.InetAddress; import java.util.*; @@ -108,6 +109,32 @@ public abstract class Host implements ExtraDataHandler { } } + /** + * Get players on servers provided by this host + * + * @return Local Player Collection + */ + public Collection getPlayers() { + LinkedList players = new LinkedList(); + for (SubServer server : getSubServers().values()) { + players.addAll(server.getPlayers()); + } + return players; + } + + /** + * Get players on servers provided by this host across all known proxies + * + * @return Remote Player Collection + */ + public Collection getGlobalPlayers() { + LinkedList players = new LinkedList(); + for (SubServer server : getSubServers().values()) { + players.addAll(server.getGlobalPlayers()); + } + return players; + } + /** * Starts the Servers Specified * diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java index 5fa57cb3..741dd1da 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java @@ -31,7 +31,7 @@ public class InternalHost extends Host { private InetAddress address; private SubCreator creator; private String directory; - protected SubProxy plugin; + SubProxy plugin; /** * Creates an Internal Host @@ -100,7 +100,7 @@ public class InternalHost extends Host { @Override public SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { if (plugin.api.getServers().keySet().contains(name.toLowerCase())) throw new InvalidServerException("A Server already exists with this name!"); - SubServer server = new InternalSubServer(this, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted); + SubServer server = InternalSubServer.construct(this, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted); SubAddServerEvent event = new SubAddServerEvent(player, this, server); plugin.getPluginManager().callEvent(event); if (!event.isCancelled()) { @@ -115,17 +115,17 @@ public class InternalHost extends Host { @Override public boolean removeSubServer(UUID player, String name) throws InterruptedException { if (Util.isNull(name)) throw new NullPointerException(); - String server = servers.get(name.toLowerCase()).getName(); - SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server)); + SubServer server = servers.get(name.toLowerCase()); + SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, server); plugin.getPluginManager().callEvent(event); if (!event.isCancelled()) { - if (getSubServer(server).isRunning()) { - getSubServer(server).stop(); - getSubServer(server).waitFor(); + if (server.isRunning()) { + server.stop(); + server.waitFor(); } - if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(getSubServer(server).getAddress().getPort())) - UPnP.closePortTCP(getSubServer(server).getAddress().getPort()); - servers.remove(server.toLowerCase()); + if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(server.getAddress().getPort())) + UPnP.closePortTCP(server.getAddress().getPort()); + servers.remove(name.toLowerCase()); return true; } else return false; } @@ -133,16 +133,16 @@ public class InternalHost extends Host { @Override public boolean forceRemoveSubServer(UUID player, String name) throws InterruptedException { if (Util.isNull(name)) throw new NullPointerException(); - String server = servers.get(name.toLowerCase()).getName(); - SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server)); + SubServer server = servers.get(name.toLowerCase()); + SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, server); plugin.getPluginManager().callEvent(event); - if (getSubServer(server).isRunning()) { - getSubServer(server).stop(); - getSubServer(server).waitFor(); + if (server.isRunning()) { + server.stop(); + server.waitFor(); } - if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(getSubServer(server).getAddress().getPort())) - UPnP.closePortTCP(getSubServer(server).getAddress().getPort()); - servers.remove(server.toLowerCase()); + if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(server.getAddress().getPort())) + UPnP.closePortTCP(server.getAddress().getPort()); + servers.remove(name.toLowerCase()); return true; } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java index eed8603f..d5888f3f 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java @@ -6,6 +6,8 @@ import net.ME1312.Galaxi.Library.*; import net.ME1312.Galaxi.Library.Callback.Callback; import net.ME1312.Galaxi.Library.Callback.ReturnCallback; import net.ME1312.Galaxi.Library.Config.YAMLSection; +import net.ME1312.Galaxi.Library.Container.Container; +import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.ME1312.SubServers.Bungee.Event.SubCreateEvent; import net.ME1312.SubServers.Bungee.Event.SubCreatedEvent; import net.ME1312.SubServers.Bungee.Host.*; @@ -202,7 +204,7 @@ public class InternalSubCreator extends SubCreator { public void run() { ReturnCallback conversion = obj -> convert(obj, new NamedContainer<>("$player$", (player == null)?"":player.toString()), new NamedContainer<>("$name$", name), - new NamedContainer<>("$template$", template.getName()), new NamedContainer<>("$type$", template.getType().toString()), new NamedContainer<>("$version$", (version != null)?version.toString().replace(" ", "@"):""), + new NamedContainer<>("$host$", host.getName()), new NamedContainer<>("$template$", template.getName()), new NamedContainer<>("$type$", template.getType().toString()), new NamedContainer<>("$version$", (version != null)?version.toString():""), new NamedContainer<>("$address$", host.getAddress().getHostAddress()), new NamedContainer<>("$port$", Integer.toString(port))); File dir = (update != null)?new File(update.getFullPath()):new File(host.getPath(), @@ -391,10 +393,10 @@ public class InternalSubCreator extends SubCreator { if (host.isAvailable() && host.isEnabled() && host == server.getHost() && server.isAvailable() && !server.isRunning() && server.getTemplate() != null && server.getTemplate().isEnabled() && server.getTemplate().canUpdate() && (version != null || !server.getTemplate().requiresVersion())) { StackTraceElement[] origin = new Exception().getStackTrace(); - Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("updating"), server, true)); + Util.isException(() -> Util.reflect(SubServerImpl.class.getDeclaredField("updating"), server, true)); CreatorTask task = new CreatorTask(player, server, version, x -> { - Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("updating"), server, false)); + Util.isException(() -> Util.reflect(SubServerImpl.class.getDeclaredField("updating"), server, false)); if (callback != null) try { callback.run(x != null); } catch (Throwable e) { @@ -525,6 +527,17 @@ public class InternalSubCreator extends SubCreator { return getTemplates().get(name.toLowerCase()); } + private static NamedContainer> subdata = null; + private Map getSubDataConfig() { + if (subdata == null || host.plugin.config.get() != subdata.name()) { + Map map = new HashMap(); + map.put("Address", host.plugin.config.get().getMap("Settings").getMap("SubData").getRawString("Address", "127.0.0.1").replace("0.0.0.0", "127.0.0.1")); + if (host.plugin.config.get().getMap("Settings").getMap("SubData").getRawString("Password", "").length() > 0) map.put("Password", host.plugin.config.get().getMap("Settings").getMap("SubData").getRawString("Password")); + subdata = new NamedContainer<>(host.plugin.config.get(), map); + } + return subdata.get(); + } + private void generateClient(File dir, ServerType type, String name) throws IOException { if (new UniversalFile(dir, "subservers.client").exists()) { Files.delete(new UniversalFile(dir, "subservers.client").toPath()); @@ -540,8 +553,7 @@ public class InternalSubCreator extends SubCreator { YAMLSection config = new YAMLSection(); FileWriter writer = new FileWriter(new UniversalFile(dir, "subdata.json"), false); config.set("Name", name); - config.set("Address", host.plugin.config.get().getMap("Settings").getMap("SubData").getRawString("Address", "127.0.0.1").replace("0.0.0.0", "127.0.0.1")); - if (host.plugin.config.get().getMap("Settings").getMap("SubData").getRawString("Password", "").length() > 0) config.set("Password", host.plugin.config.get().getMap("Settings").getMap("SubData").getRawString("Password")); + config.setAll(getSubDataConfig()); writer.write(config.toJSON().toString()); writer.close(); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubLogger.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubLogger.java index 07b19d87..592d98a1 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubLogger.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubLogger.java @@ -2,7 +2,7 @@ package net.ME1312.SubServers.Bungee.Host.Internal; import net.ME1312.SubServers.Bungee.Host.SubLogFilter; import net.ME1312.SubServers.Bungee.Host.SubLogger; -import net.ME1312.Galaxi.Library.Container; +import net.ME1312.Galaxi.Library.Container.Container; import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; import net.ME1312.SubServers.Bungee.SubAPI; @@ -21,12 +21,12 @@ import java.util.regex.Pattern; * Internal Process Logger Class */ public class InternalSubLogger extends SubLogger { - protected Process process; + Process process; private Object handle; - protected String name; - protected Container log; + String name; + Container log; private List filters = new CopyOnWriteArrayList<>(); - protected File file; + File file; private PrintWriter writer = null; private boolean started = false; private Thread out = null; @@ -41,7 +41,7 @@ public class InternalSubLogger extends SubLogger { * @param log Console Logging Status * @param file File to log to (or null for disabled) */ - protected InternalSubLogger(Process process, Object user, String name, Container log, File file) { + InternalSubLogger(Process process, Object user, String name, Container log, File file) { this.process = process; this.handle = user; this.name = name; diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java index 6769d140..ccf66734 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java @@ -4,10 +4,10 @@ import net.ME1312.SubServers.Bungee.Event.*; import net.ME1312.SubServers.Bungee.Host.*; import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Map.ObjectMapValue; -import net.ME1312.Galaxi.Library.Container; +import net.ME1312.Galaxi.Library.Container.Container; import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException; -import net.ME1312.Galaxi.Library.NamedContainer; +import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.ME1312.Galaxi.Library.UniversalFile; import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Version.Version; @@ -27,7 +27,7 @@ import java.util.jar.JarInputStream; /** * Internal SubServer Class */ -public class InternalSubServer extends SubServerContainer { +public class InternalSubServer extends SubServerImpl { private InternalHost host; private boolean enabled; private Container log; @@ -60,8 +60,33 @@ public class InternalSubServer extends SubServerContainer { * @param restricted Restricted Status * @throws InvalidServerException */ - public InternalSubServer(InternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { + public static InternalSubServer construct(InternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { + try { + return new InternalSubServer(host, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted); + } catch (NoSuchMethodError e) { + return new InternalSubServer(host, name, enabled, (Integer) port, motd, log, directory, executable, stopcmd, hidden, restricted); + } + } + + /** + * Super Method 2 (newest) + * @see #construct(InternalHost, String, boolean, int, String, boolean, String, String, String, boolean, boolean) for method details + */ + protected InternalSubServer(InternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { super(host, name, port, motd, hidden, restricted); + init(host, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted); + } + + /** + * Super Method 1 (oldest) + * @see #construct(InternalHost, String, boolean, int, String, boolean, String, String, String, boolean, boolean) for method details + */ + protected InternalSubServer(InternalHost host, String name, boolean enabled, Integer port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { + super(host, name, port, motd, hidden, restricted); + init(host, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted); + } + + private void init(InternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { if (Util.isNull(host, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted)) throw new NullPointerException(); this.host = host; this.enabled = enabled; @@ -302,7 +327,7 @@ public class InternalSubServer extends SubServerContainer { break; case "display": if (value.isString()) { - Field f = ServerContainer.class.getDeclaredField("nick"); + Field f = ServerImpl.class.getDeclaredField("nick"); f.setAccessible(true); if (value.isNull() || value.asString().length() == 0 || getName().equals(value.asString())) { f.set(this, null); @@ -334,7 +359,7 @@ public class InternalSubServer extends SubServerContainer { break; case "group": if (value.isList()) { - Util.reflect(ServerContainer.class.getDeclaredField("groups"), this, value.asRawStringList()); + Util.reflect(ServerImpl.class.getDeclaredField("groups"), this, value.asRawStringList()); if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Group", value.asRawStringList()); this.host.plugin.servers.save(); @@ -357,7 +382,7 @@ public class InternalSubServer extends SubServerContainer { break; case "template": if (value.isString()) { - Util.reflect(SubServerContainer.class.getDeclaredField("template"), this, value.asRawString()); + Util.reflect(SubServerImpl.class.getDeclaredField("template"), this, value.asRawString()); if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Template", value.asRawString()); this.host.plugin.servers.save(); @@ -494,7 +519,7 @@ public class InternalSubServer extends SubServerContainer { break; case "hidden": if (value.isBoolean()) { - Util.reflect(ServerContainer.class.getDeclaredField("hidden"), this, value.asBoolean()); + Util.reflect(ServerImpl.class.getDeclaredField("hidden"), this, value.asBoolean()); if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Hidden", isHidden()); this.host.plugin.servers.save(); @@ -504,7 +529,7 @@ public class InternalSubServer extends SubServerContainer { break; case "whitelist": if (value.isList()) { - Util.reflect(ServerContainer.class.getDeclaredField("whitelist"), this, value.asUUIDList()); + Util.reflect(ServerImpl.class.getDeclaredField("whitelist"), this, value.asUUIDList()); c++; } break; @@ -512,7 +537,7 @@ public class InternalSubServer extends SubServerContainer { if (forward != null) { forward.setStopAction(getStopAction()); if (!getName().equals(getDisplayName())) forward.setDisplayName(getDisplayName()); - Util.reflect(SubServerContainer.class.getDeclaredField("template"), forward, Util.reflect(SubServerContainer.class.getDeclaredField("template"), this)); + Util.reflect(SubServerImpl.class.getDeclaredField("template"), forward, Util.reflect(SubServerImpl.class.getDeclaredField("template"), this)); List groups = new ArrayList(); groups.addAll(getGroups()); for (String group : groups) { diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Proxy.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Proxy.java index c8f21820..5665edc5 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Proxy.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Proxy.java @@ -6,12 +6,13 @@ import net.ME1312.SubServers.Bungee.Event.SubRemoveProxyEvent; import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Map.ObjectMapValue; import net.ME1312.Galaxi.Library.ExtraDataHandler; -import net.ME1312.Galaxi.Library.NamedContainer; +import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubData.Server.ClientHandler; import net.ME1312.SubServers.Bungee.SubAPI; import net.ME1312.SubServers.Bungee.SubProxy; import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.ProxiedPlayer; import java.util.*; @@ -108,7 +109,7 @@ public class Proxy implements ClientHandler, ExtraDataHandler { } /** - * Test if the proxy is connected to RedisBungee's server + * Determine if the proxy is connected to RedisBungee's server * * @return Redis Status */ @@ -118,19 +119,33 @@ public class Proxy implements ClientHandler, ExtraDataHandler { return plugin.redis != null && Util.getDespiteException(() -> plugin.redis("getPlayersOnProxy", new NamedContainer<>(String.class, getName())) != null, false); } + /** + * Determine if the proxy is the Master Proxy + * + * @return Master Proxy Status + */ + public boolean isMaster() { + return SubAPI.getInstance().getMasterProxy() == this; + } + /** * Get the players on this proxy (via RedisBungee) * - * @return Player Collection + * @return Remote Player Collection */ @SuppressWarnings({"deprecation", "unchecked"}) - public Collection> getPlayers() { - List> players = new ArrayList>(); + public Collection getPlayers() { + List players = new LinkedList(); + //List used = new ArrayList(); SubProxy plugin = SubAPI.getInstance().getInternals(); if (plugin.redis != null) { try { - for (UUID player : (Set) plugin.redis("getPlayersOnProxy", new NamedContainer<>(String.class, getName()))) - players.add(new NamedContainer<>((String) plugin.redis("getNameFromUuid", new NamedContainer<>(UUID.class, player)), player)); + for (UUID id : (Set) plugin.redis("getPlayersOnProxy", new NamedContainer<>(String.class, getName()))) { + //if (!used.contains(id)) { + players.add(new RemotePlayer(id)); + // used.add(id); + //} + } } catch (Exception e) {} } return players; @@ -181,13 +196,11 @@ public class Proxy implements ClientHandler, ExtraDataHandler { info.set("name", getName()); info.set("display", getDisplayName()); ObjectMap players = new ObjectMap(); - for (NamedContainer player : getPlayers()) { - ObjectMap pinfo = new ObjectMap(); - pinfo.set("name", player.name()); - players.set(player.get().toString(), pinfo); - } + for (RemotePlayer player : getPlayers()) + players.set(player.getUniqueId().toString(), player.getName()); info.set("players", players); info.set("redis", isRedis()); + info.set("master", isMaster()); ObjectMap subdata = new ObjectMap(); for (int channel : this.subdata.keySet()) subdata.set(channel, (this.subdata.get(channel) == null)?null:this.subdata.get(channel).getID()); info.set("subdata", subdata); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/RemotePlayer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/RemotePlayer.java new file mode 100644 index 00000000..138f597c --- /dev/null +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/RemotePlayer.java @@ -0,0 +1,148 @@ +package net.ME1312.SubServers.Bungee.Host; + +import net.ME1312.Galaxi.Library.Container.NamedContainer; +import net.ME1312.Galaxi.Library.Map.ObjectMap; +import net.ME1312.Galaxi.Library.Util; +import net.ME1312.SubData.Server.SubDataSerializable; +import net.ME1312.SubServers.Bungee.SubAPI; +import net.ME1312.SubServers.Bungee.SubProxy; +import net.md_5.bungee.api.connection.ProxiedPlayer; + +import java.net.InetAddress; +import java.util.UUID; + +/** + * Remote Player Class + */ +public class RemotePlayer implements SubDataSerializable { + private ProxiedPlayer local; + private UUID id; + private String name; + private InetAddress ip; + private Proxy proxy; + private Server server; + + /** + * Translate a Local Player to a Remote Player + * + * @param player Local Player + */ + public RemotePlayer(ProxiedPlayer player) { + if (Util.isNull(player)) throw new NullPointerException(); + this.local = player; + this.id = player.getUniqueId(); + } + + /** + * Search for a Remote Player using their ID + * + * @param player Remote Player ID + */ + public RemotePlayer(UUID player) { + if (Util.isNull(player)) throw new NullPointerException(); + + id = player; + refresh(); + } + + /** + * Download a new copy of the data + */ + @SuppressWarnings({"deprecation", "unchecked"}) + public void refresh() { + SubProxy plugin = SubAPI.getInstance().getInternals(); + UUID player = id; + + this.local = plugin.getPlayer(player); + if (local == null) { + if (plugin.redis != null && Util.getDespiteException(() -> (boolean) plugin.redis("isPlayerOnline", new NamedContainer<>(UUID.class, player)), false)) { + server = Util.getDespiteException(() -> (Server) plugin.redis("getServerFor", new NamedContainer<>(UUID.class, player)), null); + proxy = Util.getDespiteException(() -> plugin.api.getProxy((String) plugin.redis("getProxy", new NamedContainer<>(UUID.class, player))), null); + ip = Util.getDespiteException(() -> (InetAddress) plugin.redis("getPlayerIp", new NamedContainer<>(UUID.class, player)), null); + name = Util.getDespiteException(() -> (String) plugin.redis("getNameFromUuid", new NamedContainer<>(UUID.class, player), new NamedContainer<>(boolean.class, false)), null); + } + + if (name == null) throw new IllegalStateException("Player " + id.toString() + " not found!"); + } + } + + /** + * Get Local Player + * + * @return Local Player (or null when not local) + */ + public ProxiedPlayer get() { + return local; + } + + /** + * Get this connection's UUID, if set. + * + * @return the UUID + */ + public UUID getUniqueId() { + if (local != null) { + return local.getUniqueId(); + } else return id; + } + + /** + * Get the unique name of this player. + * + * @return the players username + */ + public String getName() { + if (local != null) { + return local.getName(); + } else return name; + } + + /** + * Gets the remote address of this connection. + * + * @return the remote address + */ + @SuppressWarnings("deprecation") + public InetAddress getAddress() { + if (local != null) { + return local.getAddress().getAddress(); + } else return ip; + } + + /** + * Gets the proxy this player is connected to. + * + * @return the proxy this player is connected to + */ + public Proxy getProxy() { + if (local != null) { + return SubAPI.getInstance().getMasterProxy(); + } else return proxy; + } + + /** + * Gets the server this player is connected to. + * + * @return the server this player is connected to + */ + public Server getServer() { + if (local != null) { + return (Server) local.getServer().getInfo(); + } else return server; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof RemotePlayer && getUniqueId().equals(((RemotePlayer) obj).getUniqueId()); + } + + @Override + public ObjectMap forSubData() { + ObjectMap pinfo = new ObjectMap(); + pinfo.set("name", getName()); + pinfo.set("id", getUniqueId()); + if (getServer() != null) pinfo.set("server", getServer().getName()); + if (getProxy() != null) pinfo.set("proxy", getProxy().getName()); + return pinfo; + } +} diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Server.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Server.java index c5c1db2b..b1507f90 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Server.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Server.java @@ -1,7 +1,7 @@ package net.ME1312.SubServers.Bungee.Host; import net.ME1312.Galaxi.Library.ExtraDataHandler; -import net.ME1312.Galaxi.Library.NamedContainer; +import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.ME1312.SubData.Server.ClientHandler; import net.ME1312.SubData.Server.DataClient; import net.md_5.bungee.api.config.ServerInfo; @@ -61,9 +61,9 @@ public interface Server extends ServerInfo, ClientHandler, ExtraDataHandler { /** * Get players on this server across all known proxies * - * @return Player Collection + * @return Remote Player Collection */ - Collection> getGlobalPlayers(); + Collection getGlobalPlayers(); /** * If the server is hidden from players diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerImpl.java similarity index 79% rename from SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java rename to SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerImpl.java index b0b46f63..92853b6c 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerImpl.java @@ -8,7 +8,7 @@ import net.ME1312.SubServers.Bungee.Event.SubNetworkDisconnectEvent; import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Map.ObjectMapValue; import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException; -import net.ME1312.Galaxi.Library.NamedContainer; +import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubServers.Bungee.Network.Packet.PacketOutExRunEvent; import net.ME1312.SubServers.Bungee.Network.Packet.PacketOutExUpdateWhitelist; @@ -19,26 +19,61 @@ import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.connection.ProxiedPlayer; import java.net.InetSocketAddress; +import java.net.SocketAddress; import java.util.*; /** * Server Class */ -public class ServerContainer extends BungeeServerInfo implements Server { +public class ServerImpl extends BungeeServerInfo implements Server { private HashMap subdata = new HashMap(); private ObjectMap extra = new ObjectMap(); private String nick = null; private List groups = new ArrayList(); private List whitelist = new ArrayList(); private boolean hidden; - private final String signature; + private final String signature = SubAPI.getInstance().signAnonymousObject(); + + /** + * Construct a new Server data type + * + * @param name Server name + * @param address Server Address + * @param motd Server MOTD + * @param hidden Hidden Status + * @param restricted Restricted Status + * @return + */ + public static ServerImpl construct(String name, SocketAddress address, String motd, boolean hidden, boolean restricted) throws InvalidServerException { + try { + return new ServerImpl(name, address, motd, hidden, restricted); + } catch (NoSuchMethodError e) { + return new ServerImpl(name, (InetSocketAddress) address, motd, hidden, restricted); + } + } + + /** + * Super Method 2 (newest) + * @see #construct(String, SocketAddress, String, boolean, boolean) for method details + */ + protected ServerImpl(String name, SocketAddress address, String motd, boolean hidden, boolean restricted) throws InvalidServerException { + super(name, address, motd, restricted); + init(name, address, motd, hidden, restricted); + } + + /** + * Super Method 1 (oldest) + * @see #construct(String, SocketAddress, String, boolean, boolean) for method details + */ + protected ServerImpl(String name, InetSocketAddress address, String motd, boolean hidden, boolean restricted) throws InvalidServerException { + super(name, address, motd, restricted); + init(name, address, motd, hidden, restricted); + } @SuppressWarnings("deprecation") - public ServerContainer(String name, InetSocketAddress address, String motd, boolean hidden, boolean restricted) throws InvalidServerException { - super(name, address, motd, restricted); + private void init(String name, SocketAddress address, String motd, boolean hidden, boolean restricted) throws InvalidServerException { if (Util.isNull(name, address, motd, hidden, restricted)) throw new NullPointerException(); if (name.contains(" ")) throw new InvalidServerException("Server names cannot have spaces: " + name); - signature = SubAPI.getInstance().signAnonymousObject(); SubAPI.getInstance().getInternals().subprotocol.whitelist(getAddress().getAddress().getHostAddress()); this.hidden = hidden; @@ -124,15 +159,23 @@ public class ServerContainer extends BungeeServerInfo implements Server { @SuppressWarnings({"deprecation", "unchecked"}) @Override - public Collection> getGlobalPlayers() { - List> players = new ArrayList>(); + public Collection getGlobalPlayers() { + List players = new LinkedList(); + List used = new ArrayList(); SubProxy plugin = SubAPI.getInstance().getInternals(); + for (ProxiedPlayer player : getPlayers()) { + players.add(new RemotePlayer(player)); + used.add(player.getUniqueId()); + } if (plugin.redis != null) { try { - for (UUID player : (Set) plugin.redis("getPlayersOnServer", new NamedContainer<>(String.class, getName()))) players.add(new NamedContainer<>((String) plugin.redis("getNameFromUuid", new NamedContainer<>(UUID.class, player)), player)); + for (UUID id : (Set) plugin.redis("getPlayersOnServer", new NamedContainer<>(String.class, getName()))) { + if (!used.contains(id)) { + players.add(new RemotePlayer(id)); + used.add(id); + } + } } catch (Exception e) {} - } else { - for (ProxiedPlayer player : getPlayers()) players.add(new NamedContainer<>(player.getName(), player.getUniqueId())); } return players; } @@ -254,11 +297,8 @@ public class ServerContainer extends BungeeServerInfo implements Server { info.set("restricted", isRestricted()); info.set("hidden", isHidden()); ObjectMap players = new ObjectMap(); - for (NamedContainer player : getGlobalPlayers()) { - ObjectMap pinfo = new ObjectMap(); - pinfo.set("name", player.name()); - players.set(player.get().toString(), pinfo); - } + for (RemotePlayer player : getGlobalPlayers()) + players.set(player.getUniqueId().toString(), player.getName()); info.set("players", players); ObjectMap subdata = new ObjectMap(); for (int channel : this.subdata.keySet()) subdata.set(channel, (this.subdata.get(channel) == null)?null:this.subdata.get(channel).getID()); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java index af60b46f..38375706 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java @@ -9,7 +9,7 @@ import java.util.*; * API-Safe SubServer Layout Class */ public abstract class SubServerController { - private final SubServerContainer control; + private final SubServerImpl control; /** * Creates a SubServer @@ -22,138 +22,154 @@ public abstract class SubServerController { * @throws InvalidServerException */ public SubServerController(Host host, String name, int port, String motd, boolean hidden, boolean restricted) throws InvalidServerException { - control = new SubServerContainer(host, name, port, motd, hidden, restricted) { - @Override - public boolean start() { - if (SubServerController.this.start()) { - started = false; - return true; - } else return false; - } + SubServerImpl control; + try { + control = new ControlledSubServer(host, name, port, motd, hidden, restricted); + } catch (NoSuchMethodError e) { + control = new ControlledSubServer(host, name, (Integer) port, motd, hidden, restricted); + } + this.control = control; + } - @Override - public boolean start(UUID player) { - if (SubServerController.this.start(player)) { - started = false; - return true; - } else return false; - } + private final class ControlledSubServer extends SubServerImpl { + public ControlledSubServer(Host host, String name, int port, String motd, boolean hidden, boolean restricted) throws InvalidServerException { + super(host, name, port, motd, hidden, restricted); + } - @Override - public boolean stop() { - return SubServerController.this.stop(); - } + public ControlledSubServer(Host host, String name, Integer port, String motd, boolean hidden, boolean restricted) throws InvalidServerException { + super(host, name, port, motd, hidden, restricted); + } - @Override - public boolean stop(UUID player) { - return SubServerController.this.stop(player); - } + @Override + public boolean start() { + if (SubServerController.this.start()) { + started = false; + return true; + } else return false; + } - @Override - public boolean terminate() { - return SubServerController.this.terminate(); - } + @Override + public boolean start(UUID player) { + if (SubServerController.this.start(player)) { + started = false; + return true; + } else return false; + } - @Override - public boolean terminate(UUID player) { - return SubServerController.this.terminate(player); - } + @Override + public boolean stop() { + return SubServerController.this.stop(); + } - @Override - public boolean command(String command) { - return SubServerController.this.command(command); - } + @Override + public boolean stop(UUID player) { + return SubServerController.this.stop(player); + } - @Override - public boolean command(UUID player, String command) { - return SubServerController.this.command(player, command); - } + @Override + public boolean terminate() { + return SubServerController.this.terminate(); + } - @Override - public int permaEdit(ObjectMap edit) { - return SubServerController.this.edit(edit); - } + @Override + public boolean terminate(UUID player) { + return SubServerController.this.terminate(player); + } - @Override - public int permaEdit(UUID player, ObjectMap edit) { - return SubServerController.this.edit(player, edit); - } + @Override + public boolean command(String command) { + return SubServerController.this.command(command); + } - @Override - public void waitFor() throws InterruptedException { - SubServerController.this.waitFor(); - } + @Override + public boolean command(UUID player, String command) { + return SubServerController.this.command(player, command); + } - @Override - public boolean isRunning() { - return SubServerController.this.isRunning(); - } + @Override + public int permaEdit(ObjectMap edit) { + return SubServerController.this.edit(edit); + } - @Override - public Host getHost() { - return SubServerController.this.getHost(); - } + @Override + public int permaEdit(UUID player, ObjectMap edit) { + return SubServerController.this.edit(player, edit); + } - @Override - public boolean isEnabled() { - return SubServerController.this.isEnabled(); - } + @Override + public void waitFor() throws InterruptedException { + SubServerController.this.waitFor(); + } - @Override - public void setEnabled(boolean value) { - SubServerController.this.setEnabled(value); - } + @Override + public boolean isRunning() { + return SubServerController.this.isRunning(); + } - @Override - public boolean isLogging() { - return SubServerController.this.isLogging(); - } + @Override + public Host getHost() { + return SubServerController.this.getHost(); + } - @Override - public void setLogging(boolean value) { - SubServerController.this.setLogging(value); - } + @Override + public boolean isEnabled() { + return SubServerController.this.isEnabled(); + } - @Override - public SubLogger getLogger() { - return SubServerController.this.getLogger(); - } + @Override + public void setEnabled(boolean value) { + SubServerController.this.setEnabled(value); + } - @Override - public LinkedList getCommandHistory() { - return SubServerController.this.getCommandHistory(); - } + @Override + public boolean isLogging() { + return SubServerController.this.isLogging(); + } - @Override - public String getPath() { - return SubServerController.this.getPath(); - } + @Override + public void setLogging(boolean value) { + SubServerController.this.setLogging(value); + } - @Override - public String getExecutable() { - return SubServerController.this.getExecutable(); - } + @Override + public SubLogger getLogger() { + return SubServerController.this.getLogger(); + } - @Override - public String getStopCommand() { - return SubServerController.this.getStopCommand(); - } + @Override + public LinkedList getCommandHistory() { + return SubServerController.this.getCommandHistory(); + } - @Override - public void setStopCommand(String value) { - SubServerController.this.setStopCommand(value); - } + @Override + public String getPath() { + return SubServerController.this.getPath(); + } - @Override - public StopAction getStopAction() { - return SubServerController.this.getStopAction(); - } + @Override + public String getExecutable() { + return SubServerController.this.getExecutable(); + } - @Override - public void setStopAction(StopAction action) { - SubServerController.this.setStopAction(action); - } - }; + @Override + public String getStopCommand() { + return SubServerController.this.getStopCommand(); + } + + @Override + public void setStopCommand(String value) { + SubServerController.this.setStopCommand(value); + } + + @Override + public StopAction getStopAction() { + return SubServerController.this.getStopAction(); + } + + @Override + public void setStopAction(StopAction action) { + SubServerController.this.setStopAction(action); + } } /** diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerImpl.java similarity index 82% rename from SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java rename to SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerImpl.java index 85efc917..59b3edaa 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerImpl.java @@ -3,17 +3,18 @@ package net.ME1312.SubServers.Bungee.Host; import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.SubServers.Bungee.Event.SubEditServerEvent; import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException; -import net.ME1312.Galaxi.Library.NamedContainer; +import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.ME1312.SubServers.Bungee.SubAPI; import java.io.File; import java.net.InetSocketAddress; +import java.net.SocketAddress; import java.util.*; /** * SubServer Layout Class */ -public abstract class SubServerContainer extends ServerContainer implements SubServer { +public abstract class SubServerImpl extends ServerImpl implements SubServer { private List> incompatibilities = new ArrayList>(); private String template = null; protected boolean started; @@ -26,10 +27,30 @@ public abstract class SubServerContainer extends ServerContainer implements SubS * @param name Server Name * @param port Port Number * @param motd Server MOTD - * @param restricted Players will need a permission to join if true + * @param hidden Hidden Status + * @param restricted Restricted Status + * + * @see ServerImpl#ServerImpl(String, SocketAddress, String, boolean, boolean) Super Method 2 * @throws InvalidServerException */ - public SubServerContainer(Host host, String name, int port, String motd, boolean hidden, boolean restricted) throws InvalidServerException { + protected SubServerImpl(Host host, String name, int port, String motd, boolean hidden, boolean restricted) throws InvalidServerException { + super(name, (SocketAddress) new InetSocketAddress(host.getAddress().getHostAddress(), port), motd, hidden, restricted); + } + + /** + * Creates a SubServer + * + * @param host Host + * @param name Server Name + * @param port Port Number + * @param motd Server MOTD + * @param hidden Hidden Status + * @param restricted Restricted Status + * + * @see ServerImpl#ServerImpl(String, InetSocketAddress, String, boolean, boolean) Super Method 1 + * @throws InvalidServerException + */ + protected SubServerImpl(Host host, String name, Integer port, String motd, boolean hidden, boolean restricted) throws InvalidServerException { super(name, new InetSocketAddress(host.getAddress().getHostAddress(), port), motd, hidden, restricted); } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Launch.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Launch.java index bd280d04..0b024c57 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Launch.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Launch.java @@ -1,5 +1,6 @@ package net.ME1312.SubServers.Bungee; +import net.ME1312.Galaxi.Library.Platform; import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.SubServers.Bungee.Library.Compatibility.Galaxi.GalaxiInfo; @@ -48,41 +49,13 @@ public final class Launch { parser.accepts("noconsole"); joptsimple.OptionSet options = parser.parse(args); if(options.has("version") || options.has("v")) { - String osarch; - if (System.getProperty("os.name").toLowerCase().startsWith("windows")) { - String arch = System.getenv("PROCESSOR_ARCHITECTURE"); - String wow64Arch = System.getenv("PROCESSOR_ARCHITEW6432"); - - osarch = arch != null && arch.endsWith("64") || wow64Arch != null && wow64Arch.endsWith("64")?"x64":"x86"; - } else if (System.getProperty("os.arch").endsWith("86")) { - osarch = "x86"; - } else if (System.getProperty("os.arch").endsWith("64")) { - osarch = "x64"; - } else { - osarch = System.getProperty("os.arch"); - } - - String javaarch = null; - switch (System.getProperty("sun.arch.data.model")) { - case "32": - javaarch = "x86"; - break; - case "64": - javaarch = "x64"; - break; - default: - if (!System.getProperty("sun.arch.data.model").equalsIgnoreCase("unknown")) - javaarch = System.getProperty("sun.arch.data.model"); - } - Version galaxi = GalaxiInfo.getVersion(); Version galaxibuild = GalaxiInfo.getSignature(); System.out.println(""); - System.out.println(System.getProperty("os.name") + ((!System.getProperty("os.name").toLowerCase().startsWith("windows"))?' ' + System.getProperty("os.version"):"") + ((osarch != null)?" [" + osarch + ']':"") + ','); - System.out.println("Java " + System.getProperty("java.version") + ((javaarch != null)?" [" + javaarch + ']':"") + ','); - if (galaxi != null) - System.out.println("GalaxiEngine v" + galaxi.toExtendedString() + ((galaxibuild != null)?" (" + galaxibuild + ')':"") + ','); + System.out.println(Platform.getSystemName() + ' ' + Platform.getSystemVersion() + ((!Platform.getSystemArchitecture().equals("unknown"))?" [" + Platform.getSystemArchitecture() + ']':"") + ','); + System.out.println("Java " + Platform.getJavaVersion() + ((!Platform.getJavaArchitecture().equals("unknown"))?" [" + Platform.getJavaArchitecture() + ']':"") + ','); + if (galaxi != null) System.out.println("GalaxiEngine v" + galaxi.toExtendedString() + ((galaxibuild != null)?" (" + galaxibuild + ')':"") + ','); System.out.println("BungeeCord" + net.md_5.bungee.Bootstrap.class.getPackage().getImplementationVersion() + ((patched)?" [Patched]":"") + ','); System.out.println("SubServers.Bungee v" + SubProxy.version.toExtendedString() + ((SubProxy.class.getPackage().getSpecificationTitle() != null)?" (" + SubProxy.class.getPackage().getSpecificationTitle() + ')':"")); System.out.println(""); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/CommandX.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/CommandX.java index 145493da..8f3ae08e 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/CommandX.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/CommandX.java @@ -1,6 +1,6 @@ package net.ME1312.SubServers.Bungee.Library.Compatibility; -import net.ME1312.Galaxi.Library.NamedContainer; +import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.plugin.Command; import net.md_5.bungee.api.plugin.TabExecutor; diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/LegacyServerMap.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/LegacyServerMap.java new file mode 100644 index 00000000..3dd82921 --- /dev/null +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/LegacyServerMap.java @@ -0,0 +1,104 @@ +package net.ME1312.SubServers.Bungee.Library.Compatibility; + +import net.ME1312.SubServers.Bungee.SubAPI; +import net.md_5.bungee.api.config.ServerInfo; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +/** + * Legacy Server Map Translation Class + */ +public class LegacyServerMap implements Map { + private final Map m; + + /** + * Translate Legacy Server Map Modifications + * + * @param map Legacy Server Map + */ + public LegacyServerMap(Map map) { + this.m = map; + } + + @Override + public ServerInfo get(Object key) { + return m.get(key); + } + + @SuppressWarnings("deprecation") + @Override + public ServerInfo put(String key, ServerInfo value) { + if (value == null) throw new NullPointerException(); + ServerInfo n = SubAPI.getInstance().addServer(value.getName(), value.getAddress().getAddress(), value.getAddress().getPort(), value.getMotd(), false, value.isRestricted()), + s = getOrDefault(key, null); + + if (n != null) + m.put(n.getName(), n); + return s; + } + + @Override + public ServerInfo remove(Object key) { + if (key instanceof String) { + ServerInfo s = getOrDefault(key, null); + if (s != null) { + if (SubAPI.getInstance().removeServer((String) key)) + m.remove(key); + return s; + } else return null; + } else return null; + } + + @Override + public void putAll(Map m) { + if (m.size() > 0) { + for (Map.Entry e : m.entrySet()) { + put(e.getKey(), e.getValue()); + } + } + } + + @Override + public void clear() { + // Disallow removing all servers + } + + @Override + public int size() { + return m.size(); + } + + @Override + public boolean isEmpty() { + return m.isEmpty(); + } + + @Override + public boolean containsKey(Object key) { + return m.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return m.containsValue(value); + } + + @Override + public Set keySet() { + return m.keySet(); + } + + @Override + public Collection values() { + return m.values(); + } + + @Override + public Set> entrySet() { + return m.entrySet(); + } + + +} diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/mc1_13/CommandX.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/mc1_13/CommandX.java index 8f80d3bc..649b20b0 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/mc1_13/CommandX.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/mc1_13/CommandX.java @@ -1,6 +1,6 @@ package net.ME1312.SubServers.Bungee.Library.Compatibility.mc1_13; -import net.ME1312.Galaxi.Library.NamedContainer; +import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.md_5.bungee.api.CommandSender; import java.util.LinkedList; diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/ConfigUpdater.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/ConfigUpdater.java new file mode 100644 index 00000000..e27be951 --- /dev/null +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/ConfigUpdater.java @@ -0,0 +1,512 @@ +package net.ME1312.SubServers.Bungee.Library; + +import net.ME1312.Galaxi.Library.Config.YAMLConfig; +import net.ME1312.Galaxi.Library.Config.YAMLSection; +import net.ME1312.Galaxi.Library.Map.ObjectMap; +import net.ME1312.Galaxi.Library.Version.Version; +import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; +import net.ME1312.SubServers.Bungee.SubAPI; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * SubServers Configuration Updater + */ +public class ConfigUpdater { + private static final Version UNSIGNED = new Version(new SimpleDateFormat("yy'w'ww'zz'").format(Calendar.getInstance().getTime())); + + /** + * Update SubServers' config.yml + * + * @param file File to bring up-to-date + */ + public static void updateConfig(File file) throws IOException { + YAMLConfig config = new YAMLConfig(file); + YAMLSection existing = config.get().clone(); + YAMLSection updated = existing.clone(); + YAMLSection rewritten = new YAMLSection(); + + Version was = existing.getMap("Settings", new ObjectMap<>()).getVersion("Version", new Version(0)); + Version now = SubAPI.getInstance().getWrapperBuild(); + + int i = 0; + if (now == null) now = UNSIGNED; + if (!existing.contains("Settings") || !existing.getMap("Settings").contains("Version")) { + YAMLSection hosts = new YAMLSection(); + YAMLSection host = new YAMLSection(); + host.set("Enabled", true); + host.set("Display", "Default"); + hosts.set("~", host); + updated.set("Hosts", hosts); + + i++; + Logger.get("SubServers").info("Created ./SubServers/config.yml"); + } else { + if (was.compareTo(new Version("19w17a")) <= 0) { + if (existing.getMap("Settings", new YAMLSection()).contains("Log-Creator")) for (String name : existing.getMap("Hosts", new YAMLSection()).getKeys()) + updated.getMap("Hosts").getMap(name).safeSet("Log-Creator", existing.getMap("Settings").getBoolean("Log-Creator")); + + if (existing.getMap("Settings", new YAMLSection()).contains("SubData") && !existing.getMap("Settings", new YAMLSection()).getMap("SubData").contains("Encryption")) + updated.getMap("Settings").getMap("SubData").set("Encryption", "NONE"); + + if (existing.contains("Servers")) { + YAMLConfig sc = new YAMLConfig(new File(file.getParentFile(), "servers.yml")); + YAMLSection settings = new YAMLSection(); + settings.set("Version", was.toString()); + settings.set("Run-On-Launch-Timeout", (existing.getMap("Settings", new YAMLSection()).contains("Run-On-Launch-Timeout"))?existing.getMap("Settings").getInt("Run-On-Launch-Timeout"):0); + sc.get().safeSet("Settings", settings); + + sc.get().safeSet("Servers", new YAMLSection()); + sc.get().getMap("Servers").safeSetAll(existing.getMap("Servers")); + Logger.get("SubServers").info("Created ./SubServers/servers.yml (using existing data)"); + sc.save(); + } + + existing = updated.clone(); + i++; + } if (was.compareTo(new Version("19w35c")) <= 0) { + if (existing.getMap("Settings", new YAMLSection()).contains("SubData")) { + LinkedList whitelist = new LinkedList<>(); + LinkedList newWhitelist = new LinkedList<>(); + whitelist.addAll(existing.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).getStringList("Allowed-Connections", Collections.emptyList())); + whitelist.addAll(existing.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).getStringList("Whitelist", Collections.emptyList())); + + boolean warnPls = false; + for (String address : whitelist) { + Matcher regAddress = Pattern.compile("^(\\d{1,3}|%)\\.(\\d{1,3}|%)\\.(\\d{1,3}|%)\\.(\\d{1,3}|%)$").matcher(address); + if (regAddress.find()) { + StringBuilder newAddress = new StringBuilder(); + int subnet = -1; + boolean warn = false; + for (int o = 1; o <= 4; o++) { + if (o > 1) newAddress.append('.'); + if (subnet == -1) { + if (!regAddress.group(o).equals("%")) { + newAddress.append(regAddress.group(o)); + } else { + subnet = 8 * (o - 1); + newAddress.append('0'); + } + } else { + if (!regAddress.group(o).equals("%")) warn = warnPls = true; + newAddress.append('0'); + } + } + if (subnet < 0) subnet = 32; + if (warn) Logger.get("SubServers").warning("Updating non-standard mask: " + address); + newAddress.append('/'); + newAddress.append(subnet); + newWhitelist.add(newAddress.toString()); + } + } + updated.getMap("Settings").getMap("SubData").set("Whitelist", newWhitelist); + if (warnPls) Logger.get("SubServers").warning("Non-standard masks have been updated. This may expose SubData to unintended networks!"); + } + + existing = updated.clone(); + i++; + } if (was.compareTo(new Version("20w08d")) <= 0) { + if (existing.contains("Hosts")) { + for (String name : existing.getMap("Hosts", new YAMLSection()).getKeys()) { + if (existing.getMap("Hosts").getMap(name).getRawString("Driver", "BUILT_IN").replace('-', '_').replace(' ', '_').equalsIgnoreCase("BUILT_IN")) + updated.getMap("Hosts").getMap(name).set("Driver", "VIRTUAL"); + } + } + + existing = updated.clone(); + i++; + }// if (was.compareTo(new Version("99w99a")) <= 0) { + // // do something + // existing = updated.clone(); + // i++ + //} + + if (i > 0) Logger.get("SubServers").info("Updated ./SubServers/config.yml (" + i + " pass" + ((i != 1)?"es":"") + ")"); + } + + if (i > 0) { + YAMLSection settings = new YAMLSection(); + settings.set("Version", ((now.compareTo(was) <= 0)?was:now).toString()); + settings.set("Smart-Fallback", updated.getMap("Settings", new YAMLSection()).getBoolean("Smart-Fallback", true)); + settings.set("Override-Bungee-Commands", updated.getMap("Settings", new YAMLSection()).getBoolean("Override-Bungee-Commands", true)); + + YAMLSection upnp = new YAMLSection(); + upnp.set("Forward-Proxy", updated.getMap("Settings", new YAMLSection()).getMap("UPnP", new YAMLSection()).getBoolean("Forward-Proxy", true)); + upnp.set("Forward-SubData", updated.getMap("Settings", new YAMLSection()).getMap("UPnP", new YAMLSection()).getBoolean("Forward-SubData", false)); + upnp.set("Forward-Servers", updated.getMap("Settings", new YAMLSection()).getMap("UPnP", new YAMLSection()).getBoolean("Forward-Servers", false)); + settings.set("UPnP", upnp); + + YAMLSection subdata = new YAMLSection(); + subdata.set("Address", updated.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).getRawString("Address", "127.0.0.1:4391")); + if (updated.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).contains("Password")) subdata.set("Password", updated.getMap("Settings").getMap("SubData").getRawString("Password")); + subdata.set("Encryption", updated.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).getRawString("Encryption", "RSA/AES")); + subdata.set("Whitelist", updated.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).getRawStringList("Whitelist", Collections.emptyList())); + settings.set("SubData", subdata); + + rewritten.set("Settings", settings); + + + YAMLSection hosts = new YAMLSection(); + for (String name : updated.getMap("Hosts", new YAMLSection()).getKeys()) { + YAMLSection host = new YAMLSection(); + host.set("Enabled", updated.getMap("Hosts").getMap(name).getBoolean("Enabled", false)); + host.set("Display", updated.getMap("Hosts").getMap(name).getRawString("Display", "")); + host.set("Driver", updated.getMap("Hosts").getMap(name).getRawString("Driver", "VIRTUAL")); + host.set("Address", updated.getMap("Hosts").getMap(name).getRawString("Address", "127.0.0.1")); + host.set("Port-Range", updated.getMap("Hosts").getMap(name).getRawString("Port-Range", "25500-25559")); + host.set("Directory", updated.getMap("Hosts").getMap(name).getRawString("Directory", (host.getRawString("Driver").equalsIgnoreCase("VIRTUAL"))?"./SubServers/Servers":"./Servers")); + host.set("Git-Bash", updated.getMap("Hosts").getMap(name).getRawString("Git-Bash", "%ProgramFiles%\\Git")); + host.set("Log-Creator", updated.getMap("Hosts").getMap(name).getBoolean("Log-Creator", true)); + if (updated.getMap("Hosts").getMap(name).contains("Extra")) host.set("Extra", updated.getMap("Hosts").getMap(name).getMap("Extra")); + hosts.set(name, host); + } + rewritten.set("Hosts", hosts); + + config.set(rewritten); + config.save(); + } + } + + /** + * Update SubServers' servers.yml + * + * @param file File to bring up-to-date + */ + public static void updateServers(File file) throws IOException { + YAMLConfig config = new YAMLConfig(file); + YAMLSection existing = config.get().clone(); + YAMLSection updated = existing.clone(); + YAMLSection rewritten = new YAMLSection(); + + Version was = existing.getMap("Settings", new ObjectMap<>()).getVersion("Version", new Version(0)); + Version now = SubAPI.getInstance().getWrapperBuild(); + + int i = 0; + if (now == null) now = UNSIGNED; + if (!existing.contains("Settings") || !existing.getMap("Settings").contains("Version")) { + YAMLSection servers = new YAMLSection(); + servers.set("Example", new YAMLSection()); + updated.set("Servers", servers); + + i++; + Logger.get("SubServers").info("Created ./SubServers/servers.yml"); + } else { + if (was.compareTo(new Version("19w17a")) <= 0) { + if (existing.contains("Servers")) { + for (String name : existing.getMap("Servers", new YAMLSection()).getKeys()) { + if (existing.getMap("Servers").getMap(name).getBoolean("Auto-Restart", true)) + updated.getMap("Servers").getMap(name).safeSet("Stop-Action", "RESTART"); + + if (existing.getMap("Servers").getMap(name).getRawString("Stop-Action", "NONE").equalsIgnoreCase("DELETE_SERVER")) + updated.getMap("Servers").getMap(name).set("Stop-Action", "RECYCLE_SERVER"); + } + } + + existing = updated.clone(); + i++; + }// if (was.compareTo(new Version("99w99a")) <= 0) { + // // do something + // i++ + //} + + if (i > 0) Logger.get("SubServers").info("Updated ./SubServers/servers.yml (" + i + " pass" + ((i != 1)?"es":"") + ")"); + } + + if (i > 0) { + YAMLSection settings = new YAMLSection(); + settings.set("Version", ((now.compareTo(was) <= 0)?was:now).toString()); + settings.set("Run-On-Launch-Timeout", updated.getMap("Settings", new YAMLSection()).getInt("Run-On-Launch-Timeout", 0)); + + rewritten.set("Settings", settings); + + + YAMLSection servers = new YAMLSection(); + for (String name : updated.getMap("Servers", new YAMLSection()).getKeys()) { + YAMLSection server = new YAMLSection(); + server.set("Enabled", updated.getMap("Servers").getMap(name).getBoolean("Enabled", false)); + server.set("Display", updated.getMap("Servers").getMap(name).getRawString("Display", "")); + server.set("Host", updated.getMap("Servers").getMap(name).getRawString("Host", "~")); + if (updated.getMap("Servers").getMap(name).contains("Template")) server.set("Template", updated.getMap("Servers").getMap(name).getRawString("Template")); + server.set("Group", updated.getMap("Servers").getMap(name).getRawStringList("Groups", Collections.emptyList())); + server.set("Port", updated.getMap("Servers").getMap(name).getInt("Port", 25567)); + server.set("Motd", updated.getMap("Servers").getMap(name).getRawString("Motd", "Some SubServer")); + server.set("Log", updated.getMap("Servers").getMap(name).getBoolean("Log", true)); + server.set("Directory", updated.getMap("Servers").getMap(name).getRawString("Directory", "." + File.separatorChar)); + server.set("Executable", updated.getMap("Servers").getMap(name).getRawString("Executable", "java -Xmx1024M -Djline.terminal=jline.UnsupportedTerminal -jar Spigot.jar")); + server.set("Stop-Command", updated.getMap("Servers").getMap(name).getRawString("Stop-Command", "stop")); + server.set("Stop-Action", updated.getMap("Servers").getMap(name).getRawString("Stop-Action", "NONE")); + server.set("Run-On-Launch", updated.getMap("Servers").getMap(name).getBoolean("Run-On-Launch", false)); + server.set("Restricted", updated.getMap("Servers").getMap(name).getBoolean("Restricted", false)); + server.set("Incompatible", updated.getMap("Servers").getMap(name).getRawStringList("Incompatible", Collections.emptyList())); + server.set("Hidden", updated.getMap("Servers").getMap(name).getBoolean("Hidden", false)); + if (updated.getMap("Servers").getMap(name).contains("Extra")) server.set("Extra", updated.getMap("Servers").getMap(name).getMap("Extra")); + servers.set(name, server); + } + rewritten.set("Servers", servers); + + config.set(rewritten); + config.save(); + } + } + + /** + * Update SubServers' lang.yml + * + * @param file File to bring up-to-date + */ + public static void updateLang(File file) throws IOException { + YAMLConfig config = new YAMLConfig(file); + YAMLSection existing = config.get().clone(); + YAMLSection updated = existing.clone(); + YAMLSection rewritten = new YAMLSection(); + + Version was = existing.getMap("Settings", new ObjectMap<>()).getVersion("Version", new Version(0)); + Version now = SubAPI.getInstance().getWrapperBuild(); + + int i = 0; + if (now == null) now = UNSIGNED; + if (!existing.contains("Settings") || !existing.getMap("Settings").contains("Version")) { + + i++; + Logger.get("SubServers").info("Created ./SubServers/lang.yml"); + } else { + if (was.compareTo(new Version("19w22b")) <= 0) { + if (existing.contains("Lang")) { + updated.getMap("Lang").remove("Interface.Host-Admin.SubServers"); + updated.getMap("Lang").remove("Interface.SubServer-Admin.Command"); + } + + existing = updated.clone(); + i++; + } if (was.compareTo(new Version("20w08d")) <= 0) { + if (existing.contains("Lang")) { + LinkedList keys = new LinkedList<>(existing.getMap("Lang").getKeys()); + for (String key : keys) if (key.startsWith("Command.")) { + updated.getMap("Lang").remove(key); + } + } + + existing = updated.clone(); + i++; + }// if (was.compareTo(new Version("99w99a")) <= 0) { + // // do something + // i++ + //} + + if (i > 0) Logger.get("SubServers").info("Updated ./SubServers/lang.yml (" + i + " pass" + ((i != 1)?"es":"") + ")"); + } + + if (i > 0) { + YAMLSection settings = new YAMLSection(); + settings.set("Version", ((now.compareTo(was) <= 0)?was:now).toString()); + + rewritten.set("Settings", settings); + + LinkedHashMap def = new LinkedHashMap(); + def.put("Bungee.Feature.Smart-Fallback", "&6Returning from $str$: &r$msg$"); + def.put("Bungee.Feature.Smart-Fallback.Result", "&6You are now on $str$."); + def.put("Bungee.Ping.Offline", "&6&l[&e&lWarning&6&l] &7Backend server(s) are not running"); + def.put("Bungee.Server.Current", "&6You are currently connected to $str$"); + def.put("Bungee.Server.Available", "&6You may connect to the following servers at this time:"); + def.put("Bungee.Server.List", "&6$str$"); + def.put("Bungee.Server.Hover", "$int$ player(s)\\n&oClick to connect to the server"); + def.put("Bungee.Server.Divider", "&6, "); + def.put("Bungee.Server.Offline", "&cThe specified server is not currently running."); + def.put("Bungee.Server.Invalid", "&cThe specified server does not exist."); + def.put("Bungee.List.Format", "&a[$str$] &e($int$)&r: "); + def.put("Bungee.List.List", "&f$str$"); + def.put("Bungee.List.Divider", "&f, "); + def.put("Bungee.List.Total", "Total players online: $int$"); + def.put("Command.Generic.Player-Only", "&cSubServers &4&l\\u00BB&c The console cannot perform this command"); + def.put("Command.Generic.Console-Only", "&cSubServers &4&l\\u00BB&c This command is for console use only"); + def.put("Command.Generic.Usage", "&7SubServers &8&l\\u00BB&7 Usage: &f$str$"); + def.put("Command.Generic.Exception", "&cSubServers &4&l\\u00BB&c An unexpected exception has occurred while parsing this command"); + def.put("Command.Generic.Invalid-Subcommand", "&cSubServers &4&l\\u00BB&c Unknown sub-command: $str$"); + def.put("Command.Generic.Invalid-Permission", "&cSubServers &4&l\\u00BB&c You need &4&n$str$&c to use this command"); + def.put("Command.Generic.Invalid-Select-Permission", "&cSubServers &4&l\\u00BB&c You don't have permission to select &4$str$"); + def.put("Command.Generic.Unknown-Proxy", "&cSubServers &4&l\\u00BB&c There is no proxy with name &4$str$"); + def.put("Command.Generic.Unknown-Host", "&cSubServers &4&l\\u00BB&c There is no host with name &4$str$"); + def.put("Command.Generic.Unknown-Group", "&cSubServers &4&l\\u00BB&c There is no group with name &4$str$"); + def.put("Command.Generic.Unknown-Server", "&cSubServers &4&l\\u00BB&c There is no server with name &4$str$"); + def.put("Command.Generic.Unknown-SubServer", "&cSubServers &4&l\\u00BB&c There is no subserver with name &4$str$"); + def.put("Command.Generic.Unknown-Player", "&cSubServers &4&l\\u00BB&c There is no player with name &4$str$"); + def.put("Command.Generic.No-Servers-On-Host", "&7SubServers &8&l\\u00BB&7 There are no servers on host &f$str$"); + def.put("Command.Generic.No-SubServers-On-Host", "&7SubServers &8&l\\u00BB&7 There are no subservers on host &f$str$"); + def.put("Command.Generic.No-Servers-In-Group", "&7SubServers &8&l\\u00BB&7 There are no servers in group &f$str$"); + def.put("Command.Generic.No-SubServers-In-Group", "&7SubServers &8&l\\u00BB&7 There are no subservers in group &f$str$"); + def.put("Command.Generic.No-Servers-Selected", "&cSubServers &4&l\\u00BB&c No servers were selected"); + def.put("Command.Generic.No-SubServers-Selected", "&cSubServers &4&l\\u00BB&c No subservers were selected"); + def.put("Command.Help.Header", "&7SubServers &8&l\\u00BB&7 Command Help:"); + def.put("Command.Help.Help", " &7Help:&f $str$"); + def.put("Command.Help.List", " &7List:&f $str$"); + def.put("Command.Help.Version", " &7Version:&f $str$"); + def.put("Command.Help.Info", " &7Info:&f $str$"); + def.put("Command.Help.Host.Create", " &7Create Server:&f $str$"); + def.put("Command.Help.SubServer.Start", " &7Start Server:&f $str$"); + def.put("Command.Help.SubServer.Restart", " &7Restart Server:&f $str$"); + def.put("Command.Help.SubServer.Stop", " &7Stop Server:&f $str$"); + def.put("Command.Help.SubServer.Terminate", " &7Terminate Server:&f $str$"); + def.put("Command.Help.SubServer.Command", " &7Command Server:&f $str$"); + def.put("Command.Help.SubServer.Update", " &7Update Server:&f $str$"); + def.put("Command.Version", "&7SubServers &8&l\\u00BB&7 These are the platforms and versions that are running &f$str$&7:"); + def.put("Command.Version.Outdated", "&7$name$ &f$str$ &7is available. You are $int$ version(s) behind."); + def.put("Command.Version.Latest", "&7You are on the latest version."); + def.put("Command.List.Group-Header", "&7SubServers &8&l\\u00BB&7 Group/Server List:"); + def.put("Command.List.Host-Header", "&7SubServers &8&l\\u00BB&7 Host/SubServer List:"); + def.put("Command.List.Server-Header", "&7SubServers &8&l\\u00BB&7 Server List:"); + def.put("Command.List.Proxy-Header", "&7SubServers &8&l\\u00BB&7 Proxy List:"); + def.put("Command.List.Header", "&7: "); + def.put("Command.List.Divider", "&7, "); + def.put("Command.List.Empty", "&7(none)"); + def.put("Command.Info", "&7SubServers &8&l\\u00BB&7 Info on $str$&7: &r"); + def.put("Command.Info.Unknown", "&cSubServers &4&l\\u00BB&c There is no object with that name"); + def.put("Command.Info.Unknown-Type", "&cSubServers &4&l\\u00BB&c There is no object type with that name"); + def.put("Command.Info.Unknown-Proxy", "&cSubServers &4&l\\u00BB&c There is no proxy with that name"); + def.put("Command.Info.Unknown-Host", "&cSubServers &4&l\\u00BB&c There is no host with that name"); + def.put("Command.Info.Unknown-Group", "&cSubServers &4&l\\u00BB&c There is no group with that name"); + def.put("Command.Info.Unknown-Server", "&cSubServers &4&l\\u00BB&c There is no server with that name"); + def.put("Command.Info.Unknown-Player", "&cSubServers &4&l\\u00BB&c There is no player with that name"); + def.put("Command.Info.Format", " -> &7$str$&7: &r"); + def.put("Command.Info.List", " - "); + def.put("Command.Start", "&aSubServers &2&l\\u00BB&a Started &2$int$&a subserver(s)"); + def.put("Command.Start.Disappeared", "&cSubServers &4&l\\u00BB&c Subserver &4$str$&c has disappeared"); + def.put("Command.Start.Host-Unavailable", "&cSubServers &4&l\\u00BB&c The host for &4$str$&c is not available"); + def.put("Command.Start.Host-Disabled", "&cSubServers &4&l\\u00BB&c The host for &4$str$&c is not enabled"); + def.put("Command.Start.Server-Unavailable", "&cSubServers &4&l\\u00BB&c Subserver &4$str$&c is not available"); + def.put("Command.Start.Server-Disabled", "&cSubServers &4&l\\u00BB&c Subserver &4$str$&c is not enabled"); + def.put("Command.Start.Server-Incompatible", "&cSubServers &4&l\\u00BB&c Subserver &4$str$&c cannot start while incompatible server(s) are running"); + def.put("Command.Start.Running", "&7SubServers &8&l\\u00BB&7 &f$int$&7 subserver(s) were already running"); + def.put("Command.Restart", "&aSubServers &2&l\\u00BB&a Restarting &2$int$&a subserver(s)"); + def.put("Command.Restart.Disappeared", "&cSubServers &4&l\\u00BB&c Could not restart server: Subserver &4$str$&c has disappeared"); + def.put("Command.Restart.Host-Unavailable", "&cSubServers &4&l\\u00BB&c Could not restart server: The host for &4$str$&c is no longer available"); + def.put("Command.Restart.Host-Disabled", "&cSubServers &4&l\\u00BB&c Could not restart server: The host for &4$str$&c is no longer enabled"); + def.put("Command.Restart.Server-Unavailable", "&cSubServers &4&l\\u00BB&c Could not restart server: Subserver &4$str$&c is no longer available"); + def.put("Command.Restart.Server-Disabled", "&cSubServers &4&l\\u00BB&c Could not restart server: Subserver &4$str$&c is no longer enabled"); + def.put("Command.Restart.Server-Incompatible", "&cSubServers &4&l\\u00BB&c Could not restart server: Subserver &4$str$&c cannot start while incompatible server(s) are running"); + def.put("Command.Stop", "&aSubServers &2&l\\u00BB&a Stopping &2$int$&a subserver(s)"); + def.put("Command.Stop.Disappeared", "&cSubServers &4&l\\u00BB&c Subserver &4$str$&c has disappeared"); + def.put("Command.Stop.Not-Running", "&7SubServers &8&l\\u00BB&7 &f$int$&7 subserver(s) were already offline"); + def.put("Command.Terminate", "&aSubServers &2&l\\u00BB&a Terminated &2$int$&a subserver(s)"); + def.put("Command.Terminate.Disappeared", "&cSubServers &4&l\\u00BB&c Subserver &4$str$&c has disappeared"); + def.put("Command.Terminate.Not-Running", "&7SubServers &8&l\\u00BB&7 &f$int$&7 subserver(s) were already offline"); + def.put("Command.Command", "&aSubServers &2&l\\u00BB&a Sent command to &2$int$&a subserver(s)"); + def.put("Command.Command.No-Command", "&cSubServers &4&l\\u00BB&c No command was entered"); + def.put("Command.Command.Not-Running", "&7SubServers &8&l\\u00BB&7 &f$int$&7 subserver(s) were offline"); + def.put("Command.Creator", "&aSubServers &2&l\\u00BB&a Creating subserver &2$str$&a"); + def.put("Command.Creator.Exists", "&cSubServers &4&l\\u00BB&c There is already a subserver with that name"); + def.put("Command.Creator.Unknown-Host", "&cSubServers &4&l\\u00BB&c There is no host with that name"); + def.put("Command.Creator.Host-Unavailable", "&cSubServers &4&l\\u00BB&c That host is not available"); + def.put("Command.Creator.Host-Disabled", "&cSubServers &4&l\\u00BB&c That host is not enabled"); + def.put("Command.Creator.Unknown-Template", "&cSubServers &4&l\\u00BB&c There is no template with that name"); + def.put("Command.Creator.Template-Disabled", "&cSubServers &4&l\\u00BB&c That template is not enabled"); + def.put("Command.Creator.Version-Required", "&cSubServers &4&l\\u00BB&c That template requires a Minecraft version to be specified"); + def.put("Command.Creator.Invalid-Port", "&cSubServers &4&l\\u00BB&c Invalid port number"); + def.put("Command.Update", "&aSubServers &2&l\\u00BB&a Updating &2$int$&a subserver(s)"); + def.put("Command.Update.Disappeared", "&cSubServers &4&l\\u00BB&c Subserver &4$str$&c has disappeared"); + def.put("Command.Update.Host-Unavailable", "&cSubServers &4&l\\u00BB&c The host for &4$str$&c is not available"); + def.put("Command.Update.Host-Disabled", "&cSubServers &4&l\\u00BB&c The host for &4$str$&c is not enabled"); + def.put("Command.Update.Server-Unavailable", "&cSubServers &4&l\\u00BB&c Subserver &4$str$&c is not available"); + def.put("Command.Update.Running", "&cSubServers &4&l\\u00BB&c Cannot update &4$str$&c while it is still running"); + def.put("Command.Update.Unknown-Template", "&cSubServers &4&l\\u00BB&c We don't know which template created &4$str$"); + def.put("Command.Update.Template-Disabled", "&cSubServers &4&l\\u00BB&c The template that created &4$str$&c is not enabled"); + def.put("Command.Update.Template-Invalid", "&cSubServers &4&l\\u00BB&c The template that created &4$str$&c does not support subserver updating"); + def.put("Command.Update.Version-Required", "&cSubServers &4&l\\u00BB&c The template that created &4$str$&c requires a Minecraft version to be specified"); + def.put("Command.Teleport", "&aSubServers &2&l\\u00BB&a Teleporting &2$str$&a to server"); + def.put("Command.Teleport.Not-Running", "&cSubServers &4&l\\u00BB&c Subserver &4$str$&c is not running"); + def.put("Interface.Generic.Back", "&cBack"); + def.put("Interface.Generic.Back-Arrow", "&e&l<--"); + def.put("Interface.Generic.Next-Arrow", "&e&l-->"); + def.put("Interface.Generic.Undo", "&6Undo"); + def.put("Interface.Generic.Downloading", "&7SubServers &8&l\\u00BB&7 Downloading:&f $str$"); + def.put("Interface.Generic.Downloading.Title", "Downloading..."); + def.put("Interface.Generic.Downloading.Title-Color", "&b"); + def.put("Interface.Generic.Downloading.Title-Color-Alt", "&3"); + def.put("Interface.Generic.Downloading.Response", "&eWaiting for response"); + def.put("Interface.Generic.Invalid-Permission", "&4You need &n$str$"); + def.put("Interface.Proxy-Menu.Proxy-Player-Count", "&2$int$ Player(s) Online"); + def.put("Interface.Proxy-Menu.Proxy-Master", "&8Master Proxy"); + def.put("Interface.Proxy-Menu.Proxy-SubData", "&9SubData Only"); + def.put("Interface.Proxy-Menu.Proxy-Redis", "&7Redis Only"); + def.put("Interface.Proxy-Menu.Proxy-Disconnected", "&4Disconnected"); + def.put("Interface.Host-Menu.Title", "Host Menu"); + def.put("Interface.Host-Menu.Host-Unavailable", "&4Unavailable"); + def.put("Interface.Host-Menu.Host-Disabled", "&4Disabled"); + def.put("Interface.Host-Menu.Host-Server-Count", "&9$int$ Server(s)"); + def.put("Interface.Host-Menu.No-Hosts", "&c&oThere are No Hosts"); + def.put("Interface.Host-Menu.Group-Menu", "&6&lView Servers by Group"); + def.put("Interface.Host-Menu.Server-Menu", "&a&lView Servers"); + def.put("Interface.Host-Admin.Title", "Host/$str$"); + def.put("Interface.Host-Admin.Creator", "&eCreate a SubServer"); + def.put("Interface.Host-Admin.SubServers", "&bView SubServers"); + def.put("Interface.Host-Admin.Plugins", "&bPlugins..."); + def.put("Interface.Host-Creator.Title", "Host/$str$/Create"); + def.put("Interface.Host-Creator.Edit-Name", "Change Name"); + def.put("Interface.Host-Creator.Edit-Name.Title", "&eSubCreator\\n&6Enter a Name for this Server"); + def.put("Interface.Host-Creator.Edit-Name.Message", "&eSubCreator &6&l\\u00BB&e Enter a Name for this Server via Chat"); + def.put("Interface.Host-Creator.Edit-Name.Exists", "&cSubCreator &4&l\\u00BB&c There is already a SubServer with that name"); + def.put("Interface.Host-Creator.Edit-Name.Exists-Title", "&eSubCreator\\n&cThere is already a SubServer with that name"); + def.put("Interface.Host-Creator.Edit-Name.Invalid", "&cSubCreator &4&l\\u00BB&c Invalid Server Name"); + def.put("Interface.Host-Creator.Edit-Name.Invalid-Title", "&eSubCreator\\n&cInvalid Server Name"); + def.put("Interface.Host-Creator.Edit-Template", "Change Server Template"); + def.put("Interface.Host-Creator.Edit-Template.Title", "Host/$str$/Templates"); + def.put("Interface.Host-Creator.Edit-Template.No-Templates", "&c&oThere are No Templates"); + def.put("Interface.Host-Creator.Edit-Version", "Change Server Version"); + def.put("Interface.Host-Creator.Edit-Version.Title", "&eSubCreator\\n&6Enter a Server Version"); + def.put("Interface.Host-Creator.Edit-Version.Message", "&eSubCreator &6&l\\u00BB&e Enter a Server Version via Chat"); + def.put("Interface.Host-Creator.Edit-Port", "Change Server Port"); + def.put("Interface.Host-Creator.Edit-Port.Title", "&eSubCreator\\n&6Enter a Port Number"); + def.put("Interface.Host-Creator.Edit-Port.Message", "&eSubCreator &6&l\\u00BB&e Enter a Port Number via Chat"); + def.put("Interface.Host-Creator.Edit-Port.Invalid", "&cSubCreator &4&l\\u00BB&c Invalid Port Number"); + def.put("Interface.Host-Creator.Edit-Port.Invalid-Title", "&eSubCreator\\n&cInvalid Port Number"); + def.put("Interface.Host-Creator.Submit", "&eCreate SubServer"); + def.put("Interface.Host-Creator.Form-Incomplete", "&4Buttons above must be green"); + def.put("Interface.Host-Plugin.Title", "Host/$str$/Plugins"); + def.put("Interface.Host-Plugin.No-Plugins", "&c&oThere are No Plugins Available"); + def.put("Interface.Host-SubServer.Title", "Host/$str$/SubServers"); + def.put("Interface.Group-Menu.Title", "Group Menu"); + def.put("Interface.Group-Menu.Group-Server-Count", "&9$int$ Server(s)"); + def.put("Interface.Group-Menu.No-Groups", "&c&oThere are No Groups"); + def.put("Interface.Group-Menu.Server-Menu", "&a&lView All Servers"); + def.put("Interface.Group-SubServer.Title", "Group/$str$/Servers"); + def.put("Interface.Server-Menu.Title", "Server Menu"); + def.put("Interface.Server-Menu.Server-Player-Count", "&2$int$ Player(s) Online"); + def.put("Interface.Server-Menu.Server-External", "&7External Server"); + def.put("Interface.Server-Menu.SubServer-Temporary", "&9Temporary"); + def.put("Interface.Server-Menu.SubServer-Offline", "&6Offline"); + def.put("Interface.Server-Menu.SubServer-Incompatible", "&4Incompatible with $str$"); + def.put("Interface.Server-Menu.SubServer-Unavailable", "&4Unavailable"); + def.put("Interface.Server-Menu.SubServer-Disabled", "&4Disabled"); + def.put("Interface.Server-Menu.SubServer-Invalid", "&4Cannot be managed by SubServers"); + def.put("Interface.Server-Menu.No-Servers", "&c&oThere are No Servers"); + def.put("Interface.Server-Menu.Host-Menu", "&b&lView Hosts"); + def.put("Interface.SubServer-Admin.Title", "SubServer/$str$"); + def.put("Interface.SubServer-Admin.Start", "&aStart SubServer"); + def.put("Interface.SubServer-Admin.Start.Title", "&aStarting SubServer"); + def.put("Interface.SubServer-Admin.Stop", "&cStop SubServer"); + def.put("Interface.SubServer-Admin.Stop.Title", "&cStopping $str$"); + def.put("Interface.SubServer-Admin.Terminate", "&4Terminate SubServer"); + def.put("Interface.SubServer-Admin.Terminate.Title", "&cTerminating $str$"); + def.put("Interface.SubServer-Admin.Command", "&bSend a Command to the SubServer"); + def.put("Interface.SubServer-Admin.Command.Title", "&eSubServers\\n&6Enter a Command to send via Chat"); + def.put("Interface.SubServer-Admin.Command.Message", "&eSubServers &6&l\\u00BB&e Enter a Command to send via Chat"); + def.put("Interface.SubServer-Admin.Update", "&eUpdate SubServer"); + def.put("Interface.SubServer-Admin.Update.Title", "&eSubServers\\n&6Enter a Server Version to update to"); + def.put("Interface.SubServer-Admin.Update.Message", "&eSubServers &6&l\\u00BB&e Enter a Server Version to update to via Chat"); + def.put("Interface.SubServer-Admin.Plugins", "&bPlugins..."); + def.put("Interface.SubServer-Plugin.Title", "SubServer/$str$/Plugins"); + def.put("Interface.SubServer-Plugin.No-Plugins", "&c&oThere are No Plugins Available"); + + YAMLSection lang = new YAMLSection(); + for (String key : def.keySet()) lang.set(key, updated.getMap("Lang", new YAMLSection()).getRawString(key, def.get(key))); + rewritten.set("Lang", lang); + + config.set(rewritten); + config.save(); + } + } +} diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Updates/ConfigUpdater.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Updates/ConfigUpdater.java deleted file mode 100644 index c3925ed6..00000000 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Updates/ConfigUpdater.java +++ /dev/null @@ -1,485 +0,0 @@ -package net.ME1312.SubServers.Bungee.Library.Updates; - -import net.ME1312.Galaxi.Library.Config.YAMLConfig; -import net.ME1312.Galaxi.Library.Config.YAMLSection; -import net.ME1312.Galaxi.Library.Map.ObjectMap; -import net.ME1312.Galaxi.Library.Version.Version; -import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; -import net.ME1312.SubServers.Bungee.SubAPI; - -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collections; -import java.util.LinkedList; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * SubServers Configuration Updater - */ -public class ConfigUpdater { - private static final Version UNSIGNED = new Version(new SimpleDateFormat("yy'w'ww'zz'").format(Calendar.getInstance().getTime())); - - /** - * Update SubServers' config.yml - * - * @param file File to bring up-to-date - */ - public static void updateConfig(File file) throws IOException { - YAMLConfig config = new YAMLConfig(file); - YAMLSection existing = config.get().clone(); - YAMLSection updated = existing.clone(); - YAMLSection rewritten = new YAMLSection(); - - Version was = existing.getMap("Settings", new ObjectMap<>()).getVersion("Version", new Version(0)); - Version now = SubAPI.getInstance().getWrapperBuild(); - - int i = 0; - if (now == null) now = UNSIGNED; - if (!existing.contains("Settings") || !existing.getMap("Settings").contains("Version")) { - YAMLSection hosts = new YAMLSection(); - YAMLSection host = new YAMLSection(); - host.set("Enabled", true); - host.set("Display", "Default"); - hosts.set("~", host); - updated.set("Hosts", hosts); - - i++; - Logger.get("SubServers").info("Created ./SubServers/config.yml"); - } else { - if (was.compareTo(new Version("19w17a")) <= 0) { - if (existing.getMap("Settings", new YAMLSection()).contains("Log-Creator")) for (String name : existing.getMap("Hosts", new YAMLSection()).getKeys()) - updated.getMap("Hosts").getMap(name).safeSet("Log-Creator", existing.getMap("Settings").getBoolean("Log-Creator")); - - if (existing.getMap("Settings", new YAMLSection()).contains("SubData") && !existing.getMap("Settings", new YAMLSection()).getMap("SubData").contains("Encryption")) - updated.getMap("Settings").getMap("SubData").set("Encryption", "NONE"); - - if (existing.contains("Servers")) { - YAMLConfig sc = new YAMLConfig(new File(file.getParentFile(), "servers.yml")); - YAMLSection settings = new YAMLSection(); - settings.set("Version", was.toString()); - settings.set("Run-On-Launch-Timeout", (existing.getMap("Settings", new YAMLSection()).contains("Run-On-Launch-Timeout"))?existing.getMap("Settings").getInt("Run-On-Launch-Timeout"):0); - sc.get().safeSet("Settings", settings); - - sc.get().safeSet("Servers", new YAMLSection()); - sc.get().getMap("Servers").safeSetAll(existing.getMap("Servers")); - Logger.get("SubServers").info("Created ./SubServers/servers.yml (using existing data)"); - sc.save(); - } - - existing = updated.clone(); - i++; - } if (was.compareTo(new Version("19w35c")) <= 0) { - if (existing.getMap("Settings", new YAMLSection()).contains("SubData")) { - LinkedList whitelist = new LinkedList<>(); - LinkedList newWhitelist = new LinkedList<>(); - whitelist.addAll(existing.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).getStringList("Allowed-Connections", Collections.emptyList())); - whitelist.addAll(existing.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).getStringList("Whitelist", Collections.emptyList())); - - boolean warnPls = false; - for (String address : whitelist) { - Matcher regAddress = Pattern.compile("^(\\d{1,3}|%)\\.(\\d{1,3}|%)\\.(\\d{1,3}|%)\\.(\\d{1,3}|%)$").matcher(address); - if (regAddress.find()) { - StringBuilder newAddress = new StringBuilder(); - int subnet = -1; - boolean warn = false; - for (int o = 1; o <= 4; o++) { - if (o > 1) newAddress.append('.'); - if (subnet == -1) { - if (!regAddress.group(o).equals("%")) { - newAddress.append(regAddress.group(o)); - } else { - subnet = 8 * (o - 1); - newAddress.append('0'); - } - } else { - if (!regAddress.group(o).equals("%")) warn = warnPls = true; - newAddress.append('0'); - } - } - if (subnet < 0) subnet = 32; - if (warn) Logger.get("SubServers").warning("Updating non-standard mask: " + address); - newAddress.append('/'); - newAddress.append(subnet); - newWhitelist.add(newAddress.toString()); - } - } - updated.getMap("Settings").getMap("SubData").set("Whitelist", newWhitelist); - if (warnPls) Logger.get("SubServers").warning("Non-standard masks have been updated. This may expose SubData to unintended networks!"); - } - - existing = updated.clone(); - i++; - }// if (was.compareTo(new Version("99w99a")) <= 0) { - // // do something - // existing = updated.clone(); - // i++ - //} - - if (i > 0) Logger.get("SubServers").info("Updated ./SubServers/config.yml (" + i + " pass" + ((i != 1)?"es":"") + ")"); - } - - if (i > 0) { - YAMLSection settings = new YAMLSection(); - settings.set("Version", ((now.compareTo(was) <= 0)?was:now).toString()); - settings.set("Smart-Fallback", updated.getMap("Settings", new YAMLSection()).getBoolean("Smart-Fallback", true)); - settings.set("Override-Bungee-Commands", updated.getMap("Settings", new YAMLSection()).getBoolean("Override-Bungee-Commands", true)); - - YAMLSection upnp = new YAMLSection(); - upnp.set("Forward-Proxy", updated.getMap("Settings", new YAMLSection()).getMap("UPnP", new YAMLSection()).getBoolean("Forward-Proxy", true)); - upnp.set("Forward-SubData", updated.getMap("Settings", new YAMLSection()).getMap("UPnP", new YAMLSection()).getBoolean("Forward-SubData", false)); - upnp.set("Forward-Servers", updated.getMap("Settings", new YAMLSection()).getMap("UPnP", new YAMLSection()).getBoolean("Forward-Servers", false)); - settings.set("UPnP", upnp); - - YAMLSection subdata = new YAMLSection(); - subdata.set("Address", updated.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).getRawString("Address", "127.0.0.1:4391")); - if (updated.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).contains("Password")) subdata.set("Password", updated.getMap("Settings").getMap("SubData").getRawString("Password")); - subdata.set("Encryption", updated.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).getRawString("Encryption", "RSA/AES")); - subdata.set("Whitelist", updated.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).getRawStringList("Whitelist", Collections.emptyList())); - settings.set("SubData", subdata); - - rewritten.set("Settings", settings); - - - YAMLSection hosts = new YAMLSection(); - for (String name : updated.getMap("Hosts", new YAMLSection()).getKeys()) { - YAMLSection host = new YAMLSection(); - host.set("Enabled", updated.getMap("Hosts").getMap(name).getBoolean("Enabled", false)); - host.set("Display", updated.getMap("Hosts").getMap(name).getRawString("Display", "")); - host.set("Driver", updated.getMap("Hosts").getMap(name).getRawString("Driver", "BUILT-IN")); - host.set("Address", updated.getMap("Hosts").getMap(name).getRawString("Address", "127.0.0.1")); - host.set("Port-Range", updated.getMap("Hosts").getMap(name).getRawString("Port-Range", "25500-25559")); - host.set("Directory", updated.getMap("Hosts").getMap(name).getRawString("Directory", (host.getRawString("Driver").equalsIgnoreCase("BUILT-IN"))?"./SubServers/Servers":"./Servers")); - host.set("Git-Bash", updated.getMap("Hosts").getMap(name).getRawString("Git-Bash", "%ProgramFiles%\\Git")); - host.set("Log-Creator", updated.getMap("Hosts").getMap(name).getBoolean("Log-Creator", true)); - if (updated.getMap("Hosts").getMap(name).contains("Extra")) host.set("Extra", updated.getMap("Hosts").getMap(name).getMap("Extra")); - hosts.set(name, host); - } - rewritten.set("Hosts", hosts); - - config.set(rewritten); - config.save(); - } - } - - /** - * Update SubServers' servers.yml - * - * @param file File to bring up-to-date - */ - public static void updateServers(File file) throws IOException { - YAMLConfig config = new YAMLConfig(file); - YAMLSection existing = config.get().clone(); - YAMLSection updated = existing.clone(); - YAMLSection rewritten = new YAMLSection(); - - Version was = existing.getMap("Settings", new ObjectMap<>()).getVersion("Version", new Version(0)); - Version now = SubAPI.getInstance().getWrapperBuild(); - - int i = 0; - if (now == null) now = UNSIGNED; - if (!existing.contains("Settings") || !existing.getMap("Settings").contains("Version")) { - YAMLSection servers = new YAMLSection(); - servers.set("Example", new YAMLSection()); - updated.set("Servers", servers); - - i++; - Logger.get("SubServers").info("Created ./SubServers/servers.yml"); - } else { - if (was.compareTo(new Version("19w17a")) <= 0) { - for (String name : existing.getMap("Servers", new YAMLSection()).getKeys()) { - if (existing.getMap("Servers").getMap(name).getBoolean("Auto-Restart", true)) - updated.getMap("Servers").getMap(name).safeSet("Stop-Action", "RESTART"); - - if (existing.getMap("Servers").getMap(name).getRawString("Stop-Action", "NONE").equalsIgnoreCase("DELETE_SERVER")) - updated.getMap("Servers").getMap(name).set("Stop-Action", "RECYCLE_SERVER"); - } - - existing = updated.clone(); - i++; - }// if (was.compareTo(new Version("99w99a")) <= 0) { - // // do something - // i++ - //} - - if (i > 0) Logger.get("SubServers").info("Updated ./SubServers/servers.yml (" + i + " pass" + ((i != 1)?"es":"") + ")"); - } - - if (i > 0) { - YAMLSection settings = new YAMLSection(); - settings.set("Version", ((now.compareTo(was) <= 0)?was:now).toString()); - settings.set("Run-On-Launch-Timeout", updated.getMap("Settings", new YAMLSection()).getInt("Run-On-Launch-Timeout", 0)); - - rewritten.set("Settings", settings); - - - YAMLSection servers = new YAMLSection(); - for (String name : updated.getMap("Servers", new YAMLSection()).getKeys()) { - YAMLSection server = new YAMLSection(); - server.set("Enabled", updated.getMap("Servers").getMap(name).getBoolean("Enabled", false)); - server.set("Display", updated.getMap("Servers").getMap(name).getRawString("Display", "")); - server.set("Host", updated.getMap("Servers").getMap(name).getRawString("Host", "~")); - if (updated.getMap("Servers").getMap(name).contains("Template")) server.set("Template", updated.getMap("Servers").getMap(name).getRawString("Template")); - server.set("Group", updated.getMap("Servers").getMap(name).getRawStringList("Groups", Collections.emptyList())); - server.set("Port", updated.getMap("Servers").getMap(name).getInt("Port", 25567)); - server.set("Motd", updated.getMap("Servers").getMap(name).getRawString("Motd", "Some SubServer")); - server.set("Log", updated.getMap("Servers").getMap(name).getBoolean("Log", true)); - server.set("Directory", updated.getMap("Servers").getMap(name).getRawString("Directory", "." + File.separatorChar)); - server.set("Executable", updated.getMap("Servers").getMap(name).getRawString("Executable", "java -Xmx1024M -Djline.terminal=jline.UnsupportedTerminal -jar Spigot.jar")); - server.set("Stop-Command", updated.getMap("Servers").getMap(name).getRawString("Stop-Command", "stop")); - server.set("Stop-Action", updated.getMap("Servers").getMap(name).getRawString("Stop-Action", "NONE")); - server.set("Run-On-Launch", updated.getMap("Servers").getMap(name).getBoolean("Run-On-Launch", false)); - server.set("Restricted", updated.getMap("Servers").getMap(name).getBoolean("Restricted", false)); - server.set("Incompatible", updated.getMap("Servers").getMap(name).getRawStringList("Incompatible", Collections.emptyList())); - server.set("Hidden", updated.getMap("Servers").getMap(name).getBoolean("Hidden", false)); - if (updated.getMap("Servers").getMap(name).contains("Extra")) server.set("Extra", updated.getMap("Servers").getMap(name).getMap("Extra")); - servers.set(name, server); - } - rewritten.set("Servers", servers); - - config.set(rewritten); - config.save(); - } - } - - /** - * Update SubServers' lang.yml - * - * @param file File to bring up-to-date - */ - public static void updateLang(File file) throws IOException { - YAMLConfig config = new YAMLConfig(file); - YAMLSection existing = config.get().clone(); - YAMLSection updated = existing.clone(); - YAMLSection rewritten = new YAMLSection(); - - Version was = existing.getMap("Settings", new ObjectMap<>()).getVersion("Version", new Version(0)); - Version now = SubAPI.getInstance().getWrapperBuild(); - - int i = 0; - if (now == null) now = UNSIGNED; - if (!existing.contains("Settings") || !existing.getMap("Settings").contains("Version")) { - - i++; - Logger.get("SubServers").info("Created ./SubServers/lang.yml"); - } else { - if (was.compareTo(new Version("19w22b")) <= 0) { - updated.getMap("Lang").remove("Interface.Host-Admin.SubServers"); - updated.getMap("Lang").remove("Interface.SubServer-Admin.Command"); - i++; - }// if (was.compareTo(new Version("99w99a")) <= 0) { - // // do something - // i++ - //} - - if (i > 0) Logger.get("SubServers").info("Updated ./SubServers/lang.yml (" + i + " pass" + ((i != 1)?"es":"") + ")"); - } - - if (i > 0) { - YAMLSection settings = new YAMLSection(); - settings.set("Version", ((now.compareTo(was) <= 0)?was:now).toString()); - - rewritten.set("Settings", settings); - - - YAMLSection lang = new YAMLSection(); - lang.set("Bungee.Feature.Smart-Fallback", updated.getMap("Lang", new YAMLSection()).getRawString("Bungee.Feature.Smart-Fallback", "&6Returning from $str$: &r$msg$")); - lang.set("Bungee.Feature.Smart-Fallback.Result", updated.getMap("Lang", new YAMLSection()).getRawString("Bungee.Feature.Smart-Fallback.Result", "&6You are now on $str$.")); - lang.set("Bungee.Ping.Offline", updated.getMap("Lang", new YAMLSection()).getRawString("Bungee.Ping.Offline", "&6&l[&e&lWarning&6&l] &7Backend server(s) are not running")); - lang.set("Bungee.Server.Current", updated.getMap("Lang", new YAMLSection()).getRawString("Bungee.Server.Current", "&6You are currently connected to $str$")); - lang.set("Bungee.Server.Available", updated.getMap("Lang", new YAMLSection()).getRawString("Bungee.Server.Available", "&6You may connect to the following servers at this time:")); - lang.set("Bungee.Server.List", updated.getMap("Lang", new YAMLSection()).getRawString("Bungee.Server.List", "&6$str$")); - lang.set("Bungee.Server.Hover", updated.getMap("Lang", new YAMLSection()).getRawString("Bungee.Server.Hover", "$int$ player(s)\\n&oClick to connect to the server")); - lang.set("Bungee.Server.Divider", updated.getMap("Lang", new YAMLSection()).getRawString("Bungee.Server.Divider", "&6, ")); - lang.set("Bungee.Server.Offline", updated.getMap("Lang", new YAMLSection()).getRawString("Bungee.Server.Offline", "&cThe specified server is not currently running.")); - lang.set("Bungee.Server.Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Bungee.Server.Invalid", "&cThe specified server does not exist.")); - lang.set("Bungee.List.Format", updated.getMap("Lang", new YAMLSection()).getRawString("Bungee.List.Format", "&a[$str$] &e($int$)&r: ")); - lang.set("Bungee.List.List", updated.getMap("Lang", new YAMLSection()).getRawString("Bungee.List.List", "&f$str$")); - lang.set("Bungee.List.Divider", updated.getMap("Lang", new YAMLSection()).getRawString("Bungee.List.Divider", "&f, ")); - lang.set("Bungee.List.Total", updated.getMap("Lang", new YAMLSection()).getRawString("Bungee.List.Total", "Total players online: $int$")); - lang.set("Command.Generic.Player-Only", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Generic.Player-Only", "&cSubServers &4&l\\u00BB&c Console cannot run this command")); - lang.set("Command.Generic.Console-Only", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Generic.Console-Only", "&cSubServers &4&l\\u00BB&c This command is for console use only")); - lang.set("Command.Generic.Usage", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Generic.Usage", "&7SubServers &8&l\\u00BB&7 Usage: &f$str$")); - lang.set("Command.Generic.Exception", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Generic.Exception", "&cSubServers &4&l\\u00BB&c An unexpected exception has occurred while parsing this command")); - lang.set("Command.Generic.Invalid-Subcommand", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Generic.Invalid-Subcommand", "&cSubServers &4&l\\u00BB&c Unknown sub-command: $str$")); - lang.set("Command.Generic.Invalid-Permission", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Generic.Invalid-Permission", "&cSubServers &4&l\\u00BB&c You need &4&n$str$&c to use this command")); - lang.set("Command.Generic.Unknown-Proxy", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Generic.Unknown-Proxy", "&cSubServers &4&l\\u00BB&c There is no proxy with that name")); - lang.set("Command.Generic.Unknown-Host", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Generic.Unknown-Host", "&cSubServers &4&l\\u00BB&c There is no host with that name")); - lang.set("Command.Generic.Unknown-Group", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Generic.Unknown-Group", "&cSubServers &4&l\\u00BB&c There is no group with that name")); - lang.set("Command.Generic.Unknown-Server", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Generic.Unknown-Server", "&cSubServers &4&l\\u00BB&c There is no server with that name")); - lang.set("Command.Generic.Unknown-SubServer", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Generic.Unknown-SubServer", "&cSubServers &4&l\\u00BB&c There is no subserver with that name")); - lang.set("Command.Help.Header", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.Header", "&7SubServers &8&l\\u00BB&7 Command Help:")); - lang.set("Command.Help.Help", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.Help", " &7Help:&f $str$")); - lang.set("Command.Help.List", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.List", " &7List:&f $str$")); - lang.set("Command.Help.Version", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.Version", " &7Version:&f $str$")); - lang.set("Command.Help.Info", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.Info", " &7Info:&f $str$")); - lang.set("Command.Help.Host.Create", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.Host.Create", " &7Create Server:&f $str$")); - lang.set("Command.Help.SubServer.Start", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.SubServer.Start", " &7Start Server:&f $str$")); - lang.set("Command.Help.SubServer.Restart", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.SubServer.Restart", " &7Restart Server:&f $str$")); - lang.set("Command.Help.SubServer.Stop", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.SubServer.Stop", " &7Stop Server:&f $str$")); - lang.set("Command.Help.SubServer.Terminate", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.SubServer.Terminate", " &7Terminate Server:&f $str$")); - lang.set("Command.Help.SubServer.Command", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.SubServer.Command", " &7Command Server:&f $str$")); - lang.set("Command.Help.SubServer.Update", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.SubServer.Update", " &7Update Server:&f $str$")); - lang.set("Command.Version", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Version", "&7SubServers &8&l\\u00BB&7 These are the platforms and versions that are running &f$str$&7:")); - lang.set("Command.Version.Outdated", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Version.Outdated", "&7$name$ &f$str$ &7is available. You are $int$ version(s) behind.")); - lang.set("Command.Version.Latest", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Version.Latest", "&7You are on the latest version.")); - lang.set("Command.List.Group-Header", updated.getMap("Lang", new YAMLSection()).getRawString("Command.List.Group-Header", "&7SubServers &8&l\\u00BB&7 Group/Server List:")); - lang.set("Command.List.Host-Header", updated.getMap("Lang", new YAMLSection()).getRawString("Command.List.Host-Header", "&7SubServers &8&l\\u00BB&7 Host/SubServer List:")); - lang.set("Command.List.Server-Header", updated.getMap("Lang", new YAMLSection()).getRawString("Command.List.Server-Header", "&7SubServers &8&l\\u00BB&7 Server List:")); - lang.set("Command.List.Proxy-Header", updated.getMap("Lang", new YAMLSection()).getRawString("Command.List.Proxy-Header", "&7SubServers &8&l\\u00BB&7 Proxy List:")); - lang.set("Command.List.Header", updated.getMap("Lang", new YAMLSection()).getRawString("Command.List.Header", "&7: ")); - lang.set("Command.List.Divider", updated.getMap("Lang", new YAMLSection()).getRawString("Command.List.Divider", "&7, ")); - lang.set("Command.List.Empty", updated.getMap("Lang", new YAMLSection()).getRawString("Command.List.Empty", "&7(none)")); - lang.set("Command.Info", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Info", "&7SubServers &8&l\\u00BB&7 Info on $str$&7: &r")); - lang.set("Command.Info.Unknown", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Info.Unknown", "&cSubServers &4&l\\u00BB&c There is no object with that name")); - lang.set("Command.Info.Unknown-Type", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Info.Unknown-Type", "&cSubServers &4&l\\u00BB&c There is no object type with that name")); - lang.set("Command.Info.Unknown-Proxy", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Info.Unknown-Proxy", "&cSubServers &4&l\\u00BB&c There is no proxy with that name")); - lang.set("Command.Info.Unknown-Host", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Info.Unknown-Host", "&cSubServers &4&l\\u00BB&c There is no host with that name")); - lang.set("Command.Info.Unknown-Group", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Info.Unknown-Group", "&cSubServers &4&l\\u00BB&c There is no group with that name")); - lang.set("Command.Info.Unknown-Server", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Info.Unknown-Server", "&cSubServers &4&l\\u00BB&c There is no server with that name")); - lang.set("Command.Info.Format", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Info.Format", " -> &7$str$&7: &r")); - lang.set("Command.Info.List", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Info.List", " - ")); - lang.set("Command.Start", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start", "&aSubServers &2&l\\u00BB&a Starting SubServer")); - lang.set("Command.Start.Unknown", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Unknown", "&cSubServers &4&l\\u00BB&c There is no Server with that name")); - lang.set("Command.Start.Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Invalid", "&cSubServers &4&l\\u00BB&c That Server is not a SubServer")); - lang.set("Command.Start.Host-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Host-Unavailable", "&cSubServers &4&l\\u00BB&c That SubServer\\u0027s Host is not available")); - lang.set("Command.Start.Host-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Host-Disabled", "&cSubServers &4&l\\u00BB&c That SubServer\\u0027s Host is not enabled")); - lang.set("Command.Start.Server-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Server-Unavailable", "&cSubServers &4&l\\u00BB&c That SubServer is not available")); - lang.set("Command.Start.Server-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Server-Disabled", "&cSubServers &4&l\\u00BB&c That SubServer is not enabled")); - lang.set("Command.Start.Server-Incompatible", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Server-Incompatible", "&cSubServers &4&l\\u00BB&c That SubServer cannot start while these server(s) are running: &4$str$")); - lang.set("Command.Start.Running", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Running", "&cSubServers &4&l\\u00BB&c That SubServer is already running")); - lang.set("Command.Restart", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart", "&aSubServers &2&l\\u00BB&a Stopping SubServer")); - lang.set("Command.Restart.Finish", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Finish", "&aSubServers &2&l\\u00BB&a Starting SubServer")); - lang.set("Command.Restart.Unknown", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Unknown", "&cSubServers &4&l\\u00BB&c There is no Server with that name")); - lang.set("Command.Restart.Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Invalid", "&cSubServers &4&l\\u00BB&c That Server is not a SubServer")); - lang.set("Command.Restart.Disappeared", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Disappeared", "&cSubServers &4&l\\u00BB&c Could not restart server: That SubServer has disappeared")); - lang.set("Command.Restart.Host-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Host-Unavailable", "&cSubServers &4&l\\u00BB&c Could not restart server: That SubServer\\u0027s Host is no longer available")); - lang.set("Command.Restart.Host-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Host-Disabled", "&cSubServers &4&l\\u00BB&c Could not restart server: That SubServer\\u0027s Host is no longer enabled")); - lang.set("Command.Restart.Server-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Server-Unavailable", "&cSubServers &4&l\\u00BB&c Could not restart server: That SubServer is no longer available")); - lang.set("Command.Restart.Server-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Server-Disabled", "&cSubServers &4&l\\u00BB&c Could not restart server: That SubServer is no longer enabled")); - lang.set("Command.Restart.Server-Incompatible", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Server-Incompatible", "&cSubServers &4&l\\u00BB&c Could not restart server: That SubServer cannot start while these server(s) are running: &4$str$")); - lang.set("Command.Stop", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Stop", "&aSubServers &2&l\\u00BB&a Stopping SubServer")); - lang.set("Command.Stop.Unknown", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Stop.Unknown", "&cSubServers &4&l\\u00BB&c There is no Server with that name")); - lang.set("Command.Stop.Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Stop.Invalid", "&cSubServers &4&l\\u00BB&c That Server is not a SubServer")); - lang.set("Command.Stop.Not-Running", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Stop.Not-Running", "&cSubServers &4&l\\u00BB&c That SubServer is not running")); - lang.set("Command.Terminate", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Terminate", "&aSubServers &2&l\\u00BB&a Stopping SubServer")); - lang.set("Command.Terminate.Unknown", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Terminate.Unknown", "&cSubServers &4&l\\u00BB&c There is no Server with that name")); - lang.set("Command.Terminate.Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Terminate.Invalid", "&cSubServers &4&l\\u00BB&c That Server is not a SubServer")); - lang.set("Command.Terminate.Not-Running", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Terminate.Not-Running", "&cSubServers &4&l\\u00BB&c That SubServer is not running")); - lang.set("Command.Command", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Command", "&aSubServers &2&l\\u00BB&a Sending command to SubServer")); - lang.set("Command.Command.Unknown", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Command.Unknown", "&cSubServers &4&l\\u00BB&c There is no Server with that name")); - lang.set("Command.Command.Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Command.Invalid", "&cSubServers &4&l\\u00BB&c That Server is not a SubServer")); - lang.set("Command.Command.Not-Running", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Command.Not-Running", "&cSubServers &4&l\\u00BB&c That SubServer is not running")); - lang.set("Command.Creator", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Creator", "&aSubServers &2&l\\u00BB&a Creating SubServer")); - lang.set("Command.Creator.Exists", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Creator.Exists", "&cSubServers &4&l\\u00BB&c There is already a SubServer with that name")); - lang.set("Command.Creator.Unknown-Host", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Creator.Unknown-Host", "&cSubServers &4&l\\u00BB&c There is no Host with that name")); - lang.set("Command.Creator.Host-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Creator.Host-Unavailable", "&cSubServers &4&l\\u00BB&c That Host is not available")); - lang.set("Command.Creator.Host-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Creator.Host-Disabled", "&cSubServers &4&l\\u00BB&c That Host is not enabled")); - lang.set("Command.Creator.Unknown-Template", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Creator.Unknown-Template", "&cSubServers &4&l\\u00BB&c There is no Template with that name")); - lang.set("Command.Creator.Template-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Creator.Template-Disabled", "&cSubServers &4&l\\u00BB&c That Template is not enabled")); - lang.set("Command.Creator.Version-Required", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Creator.Version-Required", "&cSubServers &4&l\\u00BB&c That Template requires a Minecraft Version to be specified")); - lang.set("Command.Creator.Invalid-Port", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Creator.Invalid-Port", "&cSubServers &4&l\\u00BB&c Invalid Port Number")); - lang.set("Command.Update", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Creator", "&aSubServers &2&l\\u00BB&a Updating SubServer")); - lang.set("Command.Update.Unknown", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Unknown", "&cSubServers &4&l\\u00BB&c There is no Server with that name")); - lang.set("Command.Update.Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Invalid", "&cSubServers &4&l\\u00BB&c That Server is not a SubServer")); - lang.set("Command.Update.Host-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Host-Unavailable", "&cSubServers &4&l\\u00BB&c That SubServer\\u0027s Host is not available")); - lang.set("Command.Update.Host-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Host-Disabled", "&cSubServers &4&l\\u00BB&c That SubServer\\u0027s Host is not enabled")); - lang.set("Command.Update.Server-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Server-Unavailable", "&cSubServers &4&l\\u00BB&c That SubServer is not available")); - lang.set("Command.Update.Running", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Running", "&cSubServers &4&l\\u00BB&c Cannot update servers while they are still running")); - lang.set("Command.Update.Unknown-Template", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Unknown-Template", "&cSubServers &4&l\\u00BB&c We don't know which template created that SubServer")); - lang.set("Command.Update.Template-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Template-Disabled", "&cSubServers &4&l\\u00BB&c That SubServer's Template is not enabled")); - lang.set("Command.Update.Template-Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Template-Invalid", "&cSubServers &4&l\\u00BB&c That SubServer's Template does not support server updating")); - lang.set("Command.Update.Version-Required", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Version-Required", "&cSubServers &4&l\\u00BB&c That SubServer's Template requires a Minecraft Version to be specified")); - lang.set("Interface.Generic.Back", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Generic.Back", "&cBack")); - lang.set("Interface.Generic.Back-Arrow", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Generic.Back-Arrow", "&e&l<--")); - lang.set("Interface.Generic.Next-Arrow", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Generic.Next-Arrow", "&e&l-->")); - lang.set("Interface.Generic.Undo", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Generic.Undo", "&6Undo")); - lang.set("Interface.Generic.Downloading", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Generic.Downloading", "&7SubServers &8&l\\u00BB&7 Downloading:&f $str$")); - lang.set("Interface.Generic.Downloading.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Generic.Downloading.Title", "Downloading...")); - lang.set("Interface.Generic.Downloading.Title-Color", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Generic.Downloading.Title-Color", "&b")); - lang.set("Interface.Generic.Downloading.Title-Color-Alt", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Generic.Downloading.Title-Color-Alt", "&3")); - lang.set("Interface.Generic.Downloading.Response", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Generic.Downloading.Response", "&eWaiting for response")); - lang.set("Interface.Generic.Invalid-Permission", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Generic.Invalid-Permission", "&4You need &n$str$")); - lang.set("Interface.Proxy-Menu.Proxy-Player-Count", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Proxy-Menu.Proxy-Player-Count", "&2$int$ Player(s) Online")); - lang.set("Interface.Proxy-Menu.Proxy-Master", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Proxy-Menu.Proxy-Master", "&8Master Proxy")); - lang.set("Interface.Proxy-Menu.Proxy-SubData", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Proxy-Menu.Proxy-SubData", "&9SubData Only")); - lang.set("Interface.Proxy-Menu.Proxy-Redis", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Proxy-Menu.Proxy-Redis", "&7Redis Only")); - lang.set("Interface.Proxy-Menu.Proxy-Disconnected", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Proxy-Menu.Proxy-Disconnected", "&4Disconnected")); - lang.set("Interface.Host-Menu.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Menu.Title", "Host Menu")); - lang.set("Interface.Host-Menu.Host-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Menu.Host-Unavailable", "&4Unavailable")); - lang.set("Interface.Host-Menu.Host-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Menu.Host-Disabled", "&4Disabled")); - lang.set("Interface.Host-Menu.Host-Server-Count", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Menu.Host-Server-Count", "&9$int$ Server(s)")); - lang.set("Interface.Host-Menu.No-Hosts", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Menu.No-Hosts", "&c&oThere are No Hosts")); - lang.set("Interface.Host-Menu.Group-Menu", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Menu.Group-Menu", "&6&lView Servers by Group")); - lang.set("Interface.Host-Menu.Server-Menu", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Menu.Server-Menu", "&a&lView Servers")); - lang.set("Interface.Host-Admin.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Admin.Title", "Host/$str$")); - lang.set("Interface.Host-Admin.Creator", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Admin.Creator", "&eCreate a SubServer")); - lang.set("Interface.Host-Admin.SubServers", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Admin.SubServers", "&bView SubServers")); - lang.set("Interface.Host-Admin.Plugins", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Admin.Plugins", "&bPlugins...")); - lang.set("Interface.Host-Creator.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Title", "Host/$str$/Create")); - lang.set("Interface.Host-Creator.Edit-Name", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Name", "Change Name")); - lang.set("Interface.Host-Creator.Edit-Name.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Name.Title", "&eSubCreator\\n&6Enter a Name for this Server")); - lang.set("Interface.Host-Creator.Edit-Name.Message", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Name.Message", "&eSubCreator &6&l\\u00BB&e Enter a Name for this Server via Chat")); - lang.set("Interface.Host-Creator.Edit-Name.Exists", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Name.Exists", "&cSubCreator &4&l\\u00BB&c There is already a SubServer with that name")); - lang.set("Interface.Host-Creator.Edit-Name.Exists-Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Name.Exists-Title", "&eSubCreator\\n&cThere is already a SubServer with that name")); - lang.set("Interface.Host-Creator.Edit-Name.Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Name.Invalid", "&cSubCreator &4&l\\u00BB&c Invalid Server Name")); - lang.set("Interface.Host-Creator.Edit-Name.Invalid-Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Name.Invalid-Title", "&eSubCreator\\n&cInvalid Server Name")); - lang.set("Interface.Host-Creator.Edit-Template", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Template", "Change Server Template")); - lang.set("Interface.Host-Creator.Edit-Template.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Template.Title", "Host/$str$/Templates")); - lang.set("Interface.Host-Creator.Edit-Template.No-Templates", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Template.No-Templates", "&c&oThere are No Templates")); - lang.set("Interface.Host-Creator.Edit-Version", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Version", "Change Server Version")); - lang.set("Interface.Host-Creator.Edit-Version.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Version.Title", "&eSubCreator\\n&6Enter a Server Version")); - lang.set("Interface.Host-Creator.Edit-Version.Message", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Version.Message", "&eSubCreator &6&l\\u00BB&e Enter a Server Version via Chat")); - lang.set("Interface.Host-Creator.Edit-Port", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Port", "Change Server Port")); - lang.set("Interface.Host-Creator.Edit-Port.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Port.Title", "&eSubCreator\\n&6Enter a Port Number")); - lang.set("Interface.Host-Creator.Edit-Port.Message", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Port.Message", "&eSubCreator &6&l\\u00BB&e Enter a Port Number via Chat")); - lang.set("Interface.Host-Creator.Edit-Port.Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Port.Invalid", "&cSubCreator &4&l\\u00BB&c Invalid Port Number")); - lang.set("Interface.Host-Creator.Edit-Port.Invalid-Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Port.Invalid-Title", "&eSubCreator\\n&cInvalid Port Number")); - lang.set("Interface.Host-Creator.Submit", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Submit", "&eCreate SubServer")); - lang.set("Interface.Host-Creator.Form-Incomplete", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Form-Incomplete", "&4Buttons above must be green")); - lang.set("Interface.Host-Plugin.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Plugin.Title", "Host/$str$/Plugins")); - lang.set("Interface.Host-Plugin.No-Plugins", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Plugin.No-Plugins", "&c&oThere are No Plugins Available")); - lang.set("Interface.Host-SubServer.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-SubServer.Title", "Host/$str$/SubServers")); - lang.set("Interface.Group-Menu.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Group-Menu.Title", "Group Menu")); - lang.set("Interface.Group-Menu.Group-Server-Count", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Group-Menu.Group-Server-Count", "&9$int$ Server(s)")); - lang.set("Interface.Group-Menu.No-Groups", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Group-Menu.No-Groups", "&c&oThere are No Groups")); - lang.set("Interface.Group-Menu.Server-Menu", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Group-Menu.Server-Menu", "&a&lView All Servers")); - lang.set("Interface.Group-SubServer.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Group-SubServer.Title", "Group/$str$/Servers")); - lang.set("Interface.Server-Menu.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.Title", "Server Menu")); - lang.set("Interface.Server-Menu.Server-Player-Count", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.Server-Player-Count", "&2$int$ Player(s) Online")); - lang.set("Interface.Server-Menu.Server-External", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.Server-External", "&7External Server")); - lang.set("Interface.Server-Menu.SubServer-Temporary", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.SubServer-Temporary", "&9Temporary")); - lang.set("Interface.Server-Menu.SubServer-Offline", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.SubServer-Offline", "&6Offline")); - lang.set("Interface.Server-Menu.SubServer-Incompatible", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.SubServer-Incompatible", "&4Incompatible with $str$")); - lang.set("Interface.Server-Menu.SubServer-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.SubServer-Unavailable", "&4Unavailable")); - lang.set("Interface.Server-Menu.SubServer-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.SubServer-Disabled", "&4Disabled")); - lang.set("Interface.Server-Menu.SubServer-Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.SubServer-Invalid", "&4Cannot be managed by SubServers")); - lang.set("Interface.Server-Menu.No-Servers", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.No-Servers", "&c&oThere are No Servers")); - lang.set("Interface.Server-Menu.Host-Menu", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.Host-Menu", "&b&lView Hosts")); - lang.set("Interface.SubServer-Admin.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Title", "SubServer/$str$")); - lang.set("Interface.SubServer-Admin.Start", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Start", "&aStart SubServer")); - lang.set("Interface.SubServer-Admin.Start.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Start.Title", "&aStarting SubServer")); - lang.set("Interface.SubServer-Admin.Stop", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Stop", "&cStop SubServer")); - lang.set("Interface.SubServer-Admin.Stop.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Stop.Title", "&cStopping $str$")); - lang.set("Interface.SubServer-Admin.Terminate", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Terminate", "&4Terminate SubServer")); - lang.set("Interface.SubServer-Admin.Terminate.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Terminate.Title", "&cTerminating $str$")); - lang.set("Interface.SubServer-Admin.Command", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Command", "&bSend a Command to the SubServer")); - lang.set("Interface.SubServer-Admin.Command.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Command.Title", "&eSubServers\\n&6Enter a Command to send via Chat")); - lang.set("Interface.SubServer-Admin.Command.Message", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Command.Message", "&eSubServers &6&l\\u00BB&e Enter a Command to send via Chat")); - lang.set("Interface.SubServer-Admin.Update", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Update", "&eUpdate SubServer")); - lang.set("Interface.SubServer-Admin.Update.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Update.Title", "&eSubServers\\n&6Enter a Server Version to update to")); - lang.set("Interface.SubServer-Admin.Update.Message", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Update.Message", "&eSubServers &6&l\\u00BB&e Enter a Server Version to update to via Chat")); - lang.set("Interface.SubServer-Admin.Plugins", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Plugins", "&bPlugins...")); - lang.set("Interface.SubServer-Plugin.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Plugin.Title", "SubServer/$str$/Plugins")); - lang.set("Interface.SubServer-Plugin.No-Plugins", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Plugin.No-Plugins", "&c&oThere are No Plugins Available")); - - rewritten.set("Lang", lang); - - config.set(rewritten); - config.save(); - } - } -} diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadGroupInfo.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadGroupInfo.java index dea95c2f..29b12664 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadGroupInfo.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadGroupInfo.java @@ -8,6 +8,9 @@ import net.ME1312.SubData.Server.Protocol.PacketObjectIn; import net.ME1312.SubData.Server.Protocol.PacketObjectOut; import net.ME1312.SubServers.Bungee.SubProxy; +import java.util.Arrays; +import java.util.List; +import java.util.Map; import java.util.UUID; /** @@ -15,7 +18,7 @@ import java.util.UUID; */ public class PacketDownloadGroupInfo implements PacketObjectIn, PacketObjectOut { private SubProxy plugin; - private String group; + private String[] groups; private UUID tracker; /** @@ -32,30 +35,34 @@ public class PacketDownloadGroupInfo implements PacketObjectIn, PacketO * New PacketDownloadGroupInfo (Out) * * @param plugin SubPlugin - * @param group Group (or null for all) + * @param groups Groups (or null for all) * @param tracker Receiver ID */ - public PacketDownloadGroupInfo(SubProxy plugin, String group, UUID tracker) { + public PacketDownloadGroupInfo(SubProxy plugin, List groups, UUID tracker) { if (Util.isNull(plugin)) throw new NullPointerException(); this.plugin = plugin; - this.group = group; this.tracker = tracker; + + if (groups != null) { + this.groups = new String[groups.size()]; + for (int i = 0; i < this.groups.length; ++i) this.groups[i] = groups.get(i).toLowerCase(); + Arrays.sort(this.groups); + } } - @SuppressWarnings("unchecked") @Override public ObjectMap send(SubDataClient client) { ObjectMap data = new ObjectMap(); if (tracker != null) data.set(0x0000, tracker); ObjectMap groups = new ObjectMap(); - for (String group : plugin.api.getGroups().keySet()) { - if (this.group == null || this.group.length() <= 0 || this.group.equalsIgnoreCase(group)) { + for (Map.Entry> group : plugin.api.getGroups().entrySet()) { + if (this.groups == null || this.groups.length <= 0 || Arrays.binarySearch(this.groups, group.getKey().toLowerCase()) >= 0) { ObjectMap servers = new ObjectMap(); - for (Server server : plugin.api.getGroup(group)) { + for (Server server : group.getValue()) { servers.set(server.getName(), server.forSubData()); } - groups.set(group, servers); + groups.set(group.getKey(), servers); } } data.set(0x0001, groups); @@ -64,7 +71,7 @@ public class PacketDownloadGroupInfo implements PacketObjectIn, PacketO @Override public void receive(SubDataClient client, ObjectMap data) { - client.sendPacket(new PacketDownloadGroupInfo(plugin, (data.contains(0x0001))?data.getRawString(0x0001):null, (data.contains(0x0000))?data.getUUID(0x0000):null)); + client.sendPacket(new PacketDownloadGroupInfo(plugin, (data.contains(0x0001))?data.getRawStringList(0x0001):null, (data.contains(0x0000))?data.getUUID(0x0000):null)); } @Override diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadHostInfo.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadHostInfo.java index 78d465cc..1d2b5f6a 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadHostInfo.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadHostInfo.java @@ -8,6 +8,8 @@ import net.ME1312.SubData.Server.Protocol.PacketObjectIn; import net.ME1312.SubData.Server.Protocol.PacketObjectOut; import net.ME1312.SubServers.Bungee.SubProxy; +import java.util.Arrays; +import java.util.List; import java.util.UUID; /** @@ -15,7 +17,7 @@ import java.util.UUID; */ public class PacketDownloadHostInfo implements PacketObjectIn, PacketObjectOut { private SubProxy plugin; - private String host; + private String[] hosts; private UUID tracker; /** @@ -32,17 +34,21 @@ public class PacketDownloadHostInfo implements PacketObjectIn, PacketOb * New PacketDownloadHostInfo (Out) * * @param plugin SubPlugin - * @param host Host (or null for all) + * @param hosts Hosts (or null for all) * @param tracker Receiver ID */ - public PacketDownloadHostInfo(SubProxy plugin, String host, UUID tracker) { + public PacketDownloadHostInfo(SubProxy plugin, List hosts, UUID tracker) { if (Util.isNull(plugin)) throw new NullPointerException(); this.plugin = plugin; - this.host = host; this.tracker = tracker; + + if (hosts != null) { + this.hosts = new String[hosts.size()]; + for (int i = 0; i < this.hosts.length; ++i) this.hosts[i] = hosts.get(i).toLowerCase(); + Arrays.sort(this.hosts); + } } - @SuppressWarnings("unchecked") @Override public ObjectMap send(SubDataClient client) { ObjectMap data = new ObjectMap(); @@ -50,7 +56,7 @@ public class PacketDownloadHostInfo implements PacketObjectIn, PacketOb ObjectMap hosts = new ObjectMap(); for (Host host : plugin.api.getHosts().values()) { - if (this.host == null || this.host.length() <= 0 || this.host.equalsIgnoreCase(host.getName())) { + if (this.hosts == null || this.hosts.length <= 0 || Arrays.binarySearch(this.hosts, host.getName().toLowerCase()) >= 0) { hosts.set(host.getName(), host.forSubData()); } } @@ -60,7 +66,7 @@ public class PacketDownloadHostInfo implements PacketObjectIn, PacketOb @Override public void receive(SubDataClient client, ObjectMap data) { - client.sendPacket(new PacketDownloadHostInfo(plugin, (data.contains(0x0001))?data.getRawString(0x0001):null, (data.contains(0x0000))?data.getUUID(0x0000):null)); + client.sendPacket(new PacketDownloadHostInfo(plugin, (data.contains(0x0001))?data.getRawStringList(0x0001):null, (data.contains(0x0000))?data.getUUID(0x0000):null)); } @Override diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadPlayerInfo.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadPlayerInfo.java new file mode 100644 index 00000000..05f7e6da --- /dev/null +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadPlayerInfo.java @@ -0,0 +1,90 @@ +package net.ME1312.SubServers.Bungee.Network.Packet; + +import net.ME1312.SubData.Server.SubDataClient; +import net.ME1312.Galaxi.Library.Map.ObjectMap; +import net.ME1312.Galaxi.Library.Util; +import net.ME1312.SubData.Server.Protocol.PacketObjectIn; +import net.ME1312.SubData.Server.Protocol.PacketObjectOut; +import net.ME1312.SubServers.Bungee.Host.RemotePlayer; +import net.ME1312.SubServers.Bungee.SubProxy; + +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +/** + * Download Player Info Packet + */ +public class PacketDownloadPlayerInfo implements PacketObjectIn, PacketObjectOut { + private SubProxy plugin; + private String[] names; + private UUID[] ids; + private UUID tracker; + + /** + * New PacketDownloadPlayerInfo (In) + * + * @param plugin SubPlugin + */ + public PacketDownloadPlayerInfo(SubProxy plugin) { + if (Util.isNull(plugin)) throw new NullPointerException(); + this.plugin = plugin; + } + + /** + * New PacketDownloadPlayerInfo (Out) + * + * @param plugin SubPlugin + * @param names Player names (or null for all) + * @param ids Player IDs (or null for all) + * @param tracker Receiver ID + */ + public PacketDownloadPlayerInfo(SubProxy plugin, List names, List ids, UUID tracker) { + if (Util.isNull(plugin)) throw new NullPointerException(); + this.plugin = plugin; + this.tracker = tracker; + + if (ids != null) { + this.ids = new UUID[ids.size()]; + for (int i = 0; i < this.ids.length; ++i) this.ids[i] = ids.get(i); + } + if (names != null) { + this.names = new String[names.size()]; + for (int i = 0; i < this.names.length; ++i) this.names[i] = names.get(i); + } + } + + @Override + public ObjectMap send(SubDataClient client) { + ObjectMap data = new ObjectMap(); + if (tracker != null) data.set(0x0000, tracker); + + ObjectMap players = new ObjectMap(); + if (ids == null && names == null) { + for (RemotePlayer player : plugin.api.getGlobalPlayers().values()) { + players.set(player.getUniqueId().toString(), player.forSubData()); + } + } else { + if (ids != null) for (UUID id : ids) { + RemotePlayer player = plugin.api.getGlobalPlayer(id); + if (player != null) players.set(player.getUniqueId().toString(), player.forSubData()); + } + if (names != null) for (String name : names) { + RemotePlayer player = plugin.api.getGlobalPlayer(name); + if (player != null) players.set(player.getUniqueId().toString(), player.forSubData()); + } + } + data.set(0x0001, players); + return data; + } + + @Override + public void receive(SubDataClient client, ObjectMap data) { + client.sendPacket(new PacketDownloadPlayerInfo(plugin, (data.contains(0x0001))?data.getRawStringList(0x0001):null, (data.contains(0x0002))?data.getUUIDList(0x0002):null, (data.contains(0x0000))?data.getUUID(0x0000):null)); + } + + @Override + public int version() { + return 0x0001; + } +} diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadPlayerList.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadPlayerList.java deleted file mode 100644 index ff6ad54a..00000000 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadPlayerList.java +++ /dev/null @@ -1,76 +0,0 @@ -package net.ME1312.SubServers.Bungee.Network.Packet; - -import net.ME1312.SubData.Server.SubDataClient; -import net.ME1312.Galaxi.Library.Map.ObjectMap; -import net.ME1312.Galaxi.Library.NamedContainer; -import net.ME1312.Galaxi.Library.Util; -import net.ME1312.SubData.Server.Protocol.PacketObjectIn; -import net.ME1312.SubData.Server.Protocol.PacketObjectOut; -import net.ME1312.SubServers.Bungee.SubProxy; -import net.md_5.bungee.api.config.ServerInfo; - -import java.util.UUID; - -/** - * Download Player List Packet - */ -public class PacketDownloadPlayerList implements PacketObjectIn, PacketObjectOut { - private SubProxy plugin; - private UUID tracker; - - /** - * New PacketDownloadPlayerList (In) - * - * @param plugin SubPlugin - */ - public PacketDownloadPlayerList(SubProxy plugin) { - if (Util.isNull(plugin)) throw new NullPointerException(); - this.plugin = plugin; - } - - /** - * New PacketDownloadPlayerList (Out) - * - * @param plugin SubPlugin - * @param tracker Receiver ID - */ - public PacketDownloadPlayerList(SubProxy plugin, UUID tracker) { - if (Util.isNull(plugin)) throw new NullPointerException(); - this.plugin = plugin; - this.tracker = tracker; - } - - @SuppressWarnings("unchecked") - @Override - public ObjectMap send(SubDataClient client) { - ObjectMap data = new ObjectMap(); - if (tracker != null) data.set(0x0000, tracker); - ObjectMap players = new ObjectMap(); - for (NamedContainer player : plugin.api.getGlobalPlayers()) { - ObjectMap pinfo = new ObjectMap(); - pinfo.set("name", player.get()); - if (plugin.redis != null) { - try { - pinfo.set("server", ((ServerInfo) plugin.redis("getServerFor", new NamedContainer<>(UUID.class, player.get()))).getName()); - } catch (Exception e) { - e.printStackTrace(); - } - } else { - pinfo.set("server", plugin.getPlayer(player.get()).getServer().getInfo().getName()); - } - players.set(player.get().toString(), pinfo); - } - data.set(0x0001, players); - return data; - } - - @Override - public void receive(SubDataClient client, ObjectMap data) { - client.sendPacket(new PacketDownloadPlayerList(plugin, (data.contains(0x0000))?data.getUUID(0x0000):null)); - } - - @Override - public int version() { - return 0x0001; - } -} diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadProxyInfo.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadProxyInfo.java index ae106ee7..87dfc469 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadProxyInfo.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadProxyInfo.java @@ -8,6 +8,8 @@ import net.ME1312.SubData.Server.Protocol.PacketObjectOut; import net.ME1312.SubData.Server.Protocol.PacketObjectIn; import net.ME1312.SubServers.Bungee.SubProxy; +import java.util.Arrays; +import java.util.List; import java.util.UUID; /** @@ -15,7 +17,7 @@ import java.util.UUID; */ public class PacketDownloadProxyInfo implements PacketObjectIn, PacketObjectOut { private SubProxy plugin; - private String proxy; + private String[] proxies; private UUID tracker; /** @@ -32,17 +34,21 @@ public class PacketDownloadProxyInfo implements PacketObjectIn, PacketO * New PacketDownloadProxyInfo (Out) * * @param plugin SubPlugin - * @param proxy Proxy (or null for all) + * @param proxies Proxies (or null for all) * @param tracker Receiver ID */ - public PacketDownloadProxyInfo(SubProxy plugin, String proxy, UUID tracker) { + public PacketDownloadProxyInfo(SubProxy plugin, List proxies, UUID tracker) { if (Util.isNull(plugin)) throw new NullPointerException(); this.plugin = plugin; - this.proxy = proxy; this.tracker = tracker; + + if (proxies != null) { + this.proxies = new String[proxies.size()]; + for (int i = 0; i < this.proxies.length; ++i) this.proxies[i] = proxies.get(i).toLowerCase(); + Arrays.sort(this.proxies); + } } - @SuppressWarnings("unchecked") @Override public ObjectMap send(SubDataClient client) { ObjectMap data = new ObjectMap(); @@ -50,18 +56,18 @@ public class PacketDownloadProxyInfo implements PacketObjectIn, PacketO ObjectMap proxies = new ObjectMap(); for (Proxy proxy : plugin.api.getProxies().values()) { - if (this.proxy == null || this.proxy.equalsIgnoreCase(proxy.getName())) { + if (this.proxies == null || Arrays.binarySearch(this.proxies, proxy.getName().toLowerCase()) >= 0) { proxies.set(proxy.getName(), proxy.forSubData()); } } data.set(0x0001, proxies); - if ((this.proxy == null || this.proxy.length() <= 0) && plugin.api.getMasterProxy() != null) data.set(0x0002, plugin.api.getMasterProxy().forSubData()); + if (this.proxies != null && plugin.api.getMasterProxy() != null && (this.proxies.length <= 0 || Arrays.binarySearch(this.proxies, plugin.api.getMasterProxy().getName().toLowerCase()) >= 0)) data.set(0x0002, plugin.api.getMasterProxy().forSubData()); return data; } @Override public void receive(SubDataClient client, ObjectMap data) { - client.sendPacket(new PacketDownloadProxyInfo(plugin, (data.contains(0x0001))?data.getRawString(0x0001):null, (data.contains(0x0000))?data.getUUID(0x0000):null)); + client.sendPacket(new PacketDownloadProxyInfo(plugin, (data.contains(0x0001))?data.getRawStringList(0x0001):null, (data.contains(0x0000))?data.getUUID(0x0000):null)); } @Override diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadServerInfo.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadServerInfo.java index e9916eb9..75674da1 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadServerInfo.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDownloadServerInfo.java @@ -8,6 +8,8 @@ import net.ME1312.SubData.Server.Protocol.PacketObjectIn; import net.ME1312.SubData.Server.Protocol.PacketObjectOut; import net.ME1312.SubServers.Bungee.SubProxy; +import java.util.Arrays; +import java.util.List; import java.util.UUID; /** @@ -15,7 +17,7 @@ import java.util.UUID; */ public class PacketDownloadServerInfo implements PacketObjectIn, PacketObjectOut { private SubProxy plugin; - private String server; + private String[] servers; private UUID tracker; /** @@ -32,17 +34,21 @@ public class PacketDownloadServerInfo implements PacketObjectIn, Packet * New PacketDownloadServerInfo (Out) * * @param plugin SubPlugin - * @param server Server (or null for all) + * @param servers Servers (or null for all) * @param tracker Receiver ID */ - public PacketDownloadServerInfo(SubProxy plugin, String server, UUID tracker) { + public PacketDownloadServerInfo(SubProxy plugin, List servers, UUID tracker) { if (Util.isNull(plugin)) throw new NullPointerException(); this.plugin = plugin; - this.server = server; this.tracker = tracker; + + if (servers != null) { + this.servers = new String[servers.size()]; + for (int i = 0; i < this.servers.length; ++i) this.servers[i] = servers.get(i).toLowerCase(); + Arrays.sort(this.servers); + } } - @SuppressWarnings("unchecked") @Override public ObjectMap send(SubDataClient client) { ObjectMap data = new ObjectMap(); @@ -50,7 +56,7 @@ public class PacketDownloadServerInfo implements PacketObjectIn, Packet ObjectMap servers = new ObjectMap(); for (Server server : plugin.api.getServers().values()) { - if (this.server == null || this.server.length() <= 0 || this.server.equalsIgnoreCase(server.getName())) { + if (this.servers == null || this.servers.length <= 0 || Arrays.binarySearch(this.servers, server.getName().toLowerCase()) >= 0) { servers.set(server.getName(), server.forSubData()); } } @@ -60,7 +66,7 @@ public class PacketDownloadServerInfo implements PacketObjectIn, Packet @Override public void receive(SubDataClient client, ObjectMap data) { - client.sendPacket(new PacketDownloadServerInfo(plugin, (data.contains(0x0001))?data.getRawString(0x0001):null, (data.contains(0x0000))?data.getUUID(0x0000):null)); + client.sendPacket(new PacketDownloadServerInfo(plugin, (data.contains(0x0001))?data.getRawStringList(0x0001):null, (data.contains(0x0000))?data.getUUID(0x0000):null)); } @Override diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkExHost.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkExHost.java index 1d9a5a34..04f370ef 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkExHost.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkExHost.java @@ -11,8 +11,10 @@ import net.ME1312.SubData.Server.Protocol.PacketObjectOut; import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; import net.ME1312.SubServers.Bungee.SubProxy; -import java.util.HashMap; -import java.util.Map; +import java.util.*; + +import static net.ME1312.SubServers.Bungee.Network.Packet.PacketLinkServer.req; +import static net.ME1312.SubServers.Bungee.Network.Packet.PacketLinkServer.last; /** * Link External Host Packet @@ -64,7 +66,7 @@ public class PacketLinkExHost implements InitialPacket, PacketObjectIn, if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) { ((ExternalHost) host).setSubData(client, channel); Logger.get("SubData").info(client.getAddress().toString() + " has been defined as Host: " + host.getName() + ((channel > 0)?" (Sub-"+channel+")":"")); - client.sendPacket(new PacketLinkExHost(0, null)); + queue(host.getName(), () -> client.sendPacket(new PacketLinkExHost(0, null))); setReady(client, true); } else { client.sendPacket(new PacketLinkExHost(3, "Host already linked")); @@ -81,6 +83,20 @@ public class PacketLinkExHost implements InitialPacket, PacketObjectIn, } } + private void queue(String name, Runnable action) { + final long now = Calendar.getInstance().getTime().getTime(); + new Timer("SubServers.Bungee::ExHost_Linker(" + name + ")").schedule(new TimerTask() { + @Override + public void run() { + action.run(); + --req; + } + }, (now - last < 500) ? (req * 500) : 0); + + ++req; + last = now; + } + @Override public int version() { return 0x0001; diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java index 5ed5e261..2ea0f906 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java @@ -8,11 +8,15 @@ import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubData.Server.SubDataClient; import net.ME1312.SubData.Server.Protocol.PacketObjectOut; import net.ME1312.SubData.Server.Protocol.PacketObjectIn; +import net.ME1312.SubServers.Bungee.Host.SubServer; import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; import net.ME1312.SubServers.Bungee.SubProxy; -import java.util.HashMap; -import java.util.Map; +import java.util.*; +import java.util.concurrent.TimeUnit; + +import static net.ME1312.SubServers.Bungee.Network.Packet.PacketLinkServer.req; +import static net.ME1312.SubServers.Bungee.Network.Packet.PacketLinkServer.last; /** * Link Proxy Packet @@ -75,7 +79,7 @@ public class PacketLinkProxy implements InitialPacket, PacketObjectIn, proxy.setSubData(client, channel); if (isnew) plugin.getPluginManager().callEvent(new SubAddProxyEvent(proxy)); Logger.get("SubData").info(client.getAddress().toString() + " has been defined as Proxy: " + proxy.getName() + ((channel > 0)?" (Sub-"+channel+")":"")); - client.sendPacket(new PacketLinkProxy(proxy.getName(), 0, null)); + queue(proxy.getName(), () -> client.sendPacket(new PacketLinkProxy(proxy.getName(), 0, null))); setReady(client, true); } else { client.sendPacket(new PacketLinkProxy(proxy.getName(), 2, "Proxy already linked")); @@ -87,6 +91,20 @@ public class PacketLinkProxy implements InitialPacket, PacketObjectIn, } } + private void queue(String name, Runnable action) { + final long now = Calendar.getInstance().getTime().getTime(); + new Timer("SubServers.Bungee::Proxy_Linker(" + name + ")").schedule(new TimerTask() { + @Override + public void run() { + action.run(); + --req; + } + }, (now - last < 500) ? (req * 500) : 0); + + ++req; + last = now; + } + @Override public int version() { return 0x0001; diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java index 454de67b..5adc69c4 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java @@ -5,22 +5,19 @@ import net.ME1312.SubData.Server.Protocol.Initial.InitialPacket; import net.ME1312.SubData.Server.SubDataClient; import net.ME1312.SubServers.Bungee.Event.SubStartedEvent; import net.ME1312.SubServers.Bungee.Host.Server; -import net.ME1312.SubServers.Bungee.Host.ServerContainer; +import net.ME1312.SubServers.Bungee.Host.ServerImpl; import net.ME1312.SubServers.Bungee.Host.SubServer; import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubData.Server.Protocol.PacketObjectIn; import net.ME1312.SubData.Server.Protocol.PacketObjectOut; -import net.ME1312.SubServers.Bungee.Host.SubServerContainer; +import net.ME1312.SubServers.Bungee.Host.SubServerImpl; import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; import net.ME1312.SubServers.Bungee.SubProxy; import net.md_5.bungee.api.ProxyServer; import java.net.InetSocketAddress; -import java.util.HashMap; -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; +import java.util.*; import java.util.concurrent.TimeUnit; /** @@ -103,8 +100,10 @@ public class PacketLinkServer implements InitialPacket, PacketObjectIn, } } + static int req = 1; + static long last = Calendar.getInstance().getTime().getTime(); private void link(SubDataClient client, Server server, int channel) throws Throwable { - HashMap subdata = Util.getDespiteException(() -> Util.reflect(ServerContainer.class.getDeclaredField("subdata"), server), null); + HashMap subdata = Util.getDespiteException(() -> Util.reflect(ServerImpl.class.getDeclaredField("subdata"), server), null); if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) { server.setSubData(client, channel); Logger.get("SubData").info(client.getAddress().toString() + " has been defined as " + ((server instanceof SubServer) ? "SubServer" : "Server") + ": " + server.getName() + ((channel > 0)?" (Sub-"+channel+")":"")); @@ -118,25 +117,26 @@ public class PacketLinkServer implements InitialPacket, PacketObjectIn, Util.isException(() -> Util.reflect(SubDataClient.class.getDeclaredMethod("close", DisconnectReason.class), client, DisconnectReason.CLOSE_REQUESTED)); } } else { - if (server instanceof SubServer && !Util.getDespiteException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("started"), server), true)) { - Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("started"), server, true)); + if (server instanceof SubServer && !Util.getDespiteException(() -> Util.reflect(SubServerImpl.class.getDeclaredField("started"), server), true)) { + Util.isException(() -> Util.reflect(SubServerImpl.class.getDeclaredField("started"), server, true)); SubStartedEvent event = new SubStartedEvent((SubServer) server); ProxyServer.getInstance().getPluginManager().callEvent(event); } client.sendPacket(new PacketLinkServer(server.getName(), 0, null)); } + --req; }; - if (server instanceof SubServer && !((SubServer) server).isRunning()) { - new Timer("SubServers.Bungee::Rogue_SubServer_Detection(" + server.getName() + ")").schedule(new TimerTask() { - @Override - public void run() { - register.run(); - } - }, TimeUnit.SECONDS.toMillis(5)); - } else { - register.run(); - } + final long now = Calendar.getInstance().getTime().getTime(); + new Timer("SubServers.Bungee::Server_Linker(" + server.getName() + ")").schedule(new TimerTask() { + @Override + public void run() { + register.run(); + } + }, ((server instanceof SubServer && !((SubServer) server).isRunning()) ? TimeUnit.SECONDS.toMillis(5) : 0) + ((now - last < 500) ? (req * 500) : 0)); + + ++req; + last = now; setReady(client, true); } else { client.sendPacket(new PacketLinkServer(null, 4, "Server already linked")); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubProtocol.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubProtocol.java index 9ceb88cc..9730050a 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubProtocol.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubProtocol.java @@ -29,7 +29,7 @@ public class SubProtocol extends SubDataProtocol { plugin.getPluginManager().registerListener(null, new PacketOutExRunEvent(plugin)); instance.setName("SubServers 2"); - instance.setVersion(new Version("2.14a+")); + instance.setVersion(new Version("2.16a+")); // 00-0F: Object Link Packets @@ -49,7 +49,7 @@ public class SubProtocol extends SubDataProtocol { instance.registerPacket(0x0013, PacketDownloadHostInfo.class); instance.registerPacket(0x0014, PacketDownloadGroupInfo.class); instance.registerPacket(0x0015, PacketDownloadServerInfo.class); - instance.registerPacket(0x0016, PacketDownloadPlayerList.class); + instance.registerPacket(0x0016, PacketDownloadPlayerInfo.class); instance.registerPacket(0x0017, PacketCheckPermission.class); instance.registerPacket(0x0018, PacketCheckPermissionResponse.class); @@ -59,7 +59,7 @@ public class SubProtocol extends SubDataProtocol { instance.registerPacket(0x0013, new PacketDownloadHostInfo(plugin)); instance.registerPacket(0x0014, new PacketDownloadGroupInfo(plugin)); instance.registerPacket(0x0015, new PacketDownloadServerInfo(plugin)); - instance.registerPacket(0x0016, new PacketDownloadPlayerList(plugin)); + instance.registerPacket(0x0016, new PacketDownloadPlayerInfo(plugin)); instance.registerPacket(0x0017, new PacketCheckPermission()); instance.registerPacket(0x0018, new PacketCheckPermissionResponse()); @@ -75,6 +75,9 @@ public class SubProtocol extends SubDataProtocol { instance.registerPacket(0x0037, PacketStopServer.class); instance.registerPacket(0x0038, PacketRemoveServer.class); instance.registerPacket(0x0039, PacketDeleteServer.class); + //instance.registerPacket(0x003A, PacketRestoreServer.class); // TODO + //instance.registerPacket(0x003B, PacketTeleportPlayer.class); + //instance.registerPacket(0x003C, PacketTeleportPlayerResponse.class); instance.registerPacket(0x0030, new PacketCreateServer(plugin)); instance.registerPacket(0x0031, new PacketAddServer(plugin)); @@ -86,6 +89,9 @@ public class SubProtocol extends SubDataProtocol { instance.registerPacket(0x0037, new PacketStopServer(plugin)); instance.registerPacket(0x0038, new PacketRemoveServer(plugin)); instance.registerPacket(0x0039, new PacketDeleteServer(plugin)); + //instance.registerPacket(0x003A, new PacketRestoreServer(plugin)); // TODO + //instance.registerPacket(0x003B, new PacketTeleportPlayer(plugin)); + //instance.registerPacket(0x003C, new PacketTeleportPlayerResponse(plugin)); // 50-6F: External Host Packets @@ -96,8 +102,9 @@ public class SubProtocol extends SubDataProtocol { instance.registerPacket(0x0054, PacketExAddServer.class); instance.registerPacket(0x0055, PacketExEditServer.class); //instance.registerPacket(0x0056, PacketInExLogMessage.class); - instance.registerPacket(0x0057, PacketExDeleteServer.class); - instance.registerPacket(0x0058, PacketExRemoveServer.class); + instance.registerPacket(0x0057, PacketExRemoveServer.class); + instance.registerPacket(0x0058, PacketExDeleteServer.class); + //instance.registerPacket(0x0059, PacketExRestoreServer.class); instance.registerPacket(0x0050, new PacketExConfigureHost(plugin)); instance.registerPacket(0x0051, new PacketExDownloadTemplates(plugin)); @@ -106,8 +113,9 @@ public class SubProtocol extends SubDataProtocol { instance.registerPacket(0x0054, new PacketExAddServer()); instance.registerPacket(0x0055, new PacketExEditServer(plugin)); instance.registerPacket(0x0056, new PacketInExLogMessage()); - instance.registerPacket(0x0057, new PacketExDeleteServer()); - instance.registerPacket(0x0058, new PacketExRemoveServer()); + instance.registerPacket(0x0057, new PacketExRemoveServer()); + instance.registerPacket(0x0058, new PacketExDeleteServer()); + //instance.registerPacket(0x0059, new PacketExRestoreServer()); // 70-7F: External Misc Packets diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java index 0a49d6dc..cd76f431 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java @@ -1,6 +1,7 @@ package net.ME1312.SubServers.Bungee; import com.google.common.collect.Range; +import net.ME1312.SubData.Server.DataProtocol; import net.ME1312.SubData.Server.DataServer; import net.ME1312.SubServers.Bungee.Event.SubAddHostEvent; import net.ME1312.SubServers.Bungee.Event.SubAddServerEvent; @@ -8,7 +9,7 @@ import net.ME1312.SubServers.Bungee.Event.SubRemoveHostEvent; import net.ME1312.SubServers.Bungee.Event.SubRemoveServerEvent; import net.ME1312.SubServers.Bungee.Host.*; import net.ME1312.SubServers.Bungee.Library.Exception.InvalidHostException; -import net.ME1312.Galaxi.Library.NamedContainer; +import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.ME1312.Galaxi.Library.UniversalFile; import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Version.Version; @@ -33,7 +34,7 @@ public final class SubAPI { private final SubProxy plugin; private static SubAPI api; - protected SubAPI(SubProxy plugin) { + SubAPI(SubProxy plugin) { this.plugin = plugin; GAME_VERSION = getGameVersion(); api = this; @@ -83,14 +84,23 @@ public final class SubAPI { } /** - * Gets the SubData Network Manager + * Gets the SubData Network * - * @return SubData Network Manager + * @return SubData Network */ public DataServer getSubDataNetwork() { return plugin.subdata; } + /** + * Gets the SubData Network Protocol + * + * @return SubData Network Protocol + */ + public DataProtocol getSubDataProtocol() { + return plugin.subprotocol; + } + /** * Adds a Driver for Hosts * @@ -354,9 +364,12 @@ public final class SubAPI { * @param name Group name * @return a Server Group */ - public List getGroup(String name) { + public NamedContainer> getGroup(String name) { if (Util.isNull(name)) throw new NullPointerException(); - return Util.getCaseInsensitively(getGroups(), name); + for (Map.Entry> group : getLowercaseGroups().entrySet()) { + if (group.getKey().equalsIgnoreCase(name)) return new NamedContainer<>(group.getKey(), group.getValue()); + } + return null; } /** @@ -413,7 +426,7 @@ public final class SubAPI { */ public Server addServer(UUID player, String name, InetAddress ip, int port, String motd, boolean hidden, boolean restricted) { if (getServers().keySet().contains(name.toLowerCase())) throw new InvalidServerException("A Server already exists with this name!"); - Server server = new ServerContainer(name, new InetSocketAddress(ip, port), motd, hidden, restricted); + Server server = ServerImpl.construct(name, new InetSocketAddress(ip, port), motd, hidden, restricted); SubAddServerEvent event = new SubAddServerEvent(player, null, server); plugin.getPluginManager().callEvent(event); if (!event.isCancelled()) { @@ -517,7 +530,9 @@ public final class SubAPI { */ public Proxy getProxy(String name) { if (Util.isNull(name)) throw new NullPointerException(); - return getProxies().get(name.toLowerCase()); + Proxy proxy = getProxies().getOrDefault(name.toLowerCase(), null); + if (proxy == null && plugin.redis != null && plugin.redis.getName().equalsIgnoreCase(name)) proxy = plugin.redis; + return proxy; } /** @@ -532,21 +547,62 @@ public final class SubAPI { /** * Get players on this network across all known proxies * - * @return Player Collection + * @return Remote Player Collection */ @SuppressWarnings("unchecked") - public Collection> getGlobalPlayers() { - List> players = new ArrayList>(); + public Map getGlobalPlayers() { + TreeMap players = new TreeMap(); + SubProxy plugin = SubAPI.getInstance().getInternals(); + for (ProxiedPlayer player : plugin.getPlayers()) { + players.put(player.getUniqueId(), new RemotePlayer(player)); + } if (plugin.redis != null) { try { - for (UUID player : (Set) plugin.redis("getPlayersOnline")) players.add(new NamedContainer<>((String) plugin.redis("getNameFromUuid", new NamedContainer<>(UUID.class, player)), player)); + for (UUID id : (Set) plugin.redis("getPlayersOnline")) { + if (!players.keySet().contains(id)) { + players.put(id, new RemotePlayer(id)); + } + } } catch (Exception e) {} - } else { - for (ProxiedPlayer player : plugin.getPlayers()) players.add(new NamedContainer<>(player.getName(), player.getUniqueId())); } return players; } + /** + * Get a player on this network by searching across all known proxies + * + * @param name Player name + * @return Remote Player + */ + @SuppressWarnings("unchecked") + public RemotePlayer getGlobalPlayer(String name) { + if (Util.isNull(name)) throw new NullPointerException(); + SubProxy plugin = SubAPI.getInstance().getInternals(); + + RemotePlayer remote; + ProxiedPlayer local = plugin.getPlayer(name); + if (local != null) remote = new RemotePlayer(local); + else remote = Util.getDespiteException(() -> new RemotePlayer((UUID) plugin.redis("getUuidFromName", new NamedContainer<>(String.class, name), new NamedContainer<>(boolean.class, false))), null); + return remote; + } + + /** + * Get a player on this network by searching across all known proxies + * + * @param id Player UUID + * @return Remote Player + */ + public RemotePlayer getGlobalPlayer(UUID id) { + if (Util.isNull(id)) throw new NullPointerException(); + SubProxy plugin = SubAPI.getInstance().getInternals(); + + RemotePlayer remote; + ProxiedPlayer local = plugin.getPlayer(id); + if (local != null) remote = new RemotePlayer(local); + else remote = Util.getDespiteException(() -> new RemotePlayer(id), null); + return remote; + } + /** * Adds to the SubServers Lang * diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java index 52a8791b..e861b854 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java @@ -1,11 +1,14 @@ package net.ME1312.SubServers.Bungee; import com.google.gson.Gson; +import net.ME1312.Galaxi.Library.Callback.Callback; +import net.ME1312.Galaxi.Library.Callback.ReturnRunnable; +import net.ME1312.Galaxi.Library.Platform; import net.ME1312.SubData.Server.SubDataClient; import net.ME1312.SubServers.Bungee.Host.*; import net.ME1312.SubServers.Bungee.Library.Compatibility.CommandX; import net.ME1312.Galaxi.Library.Map.ObjectMap; -import net.ME1312.Galaxi.Library.NamedContainer; +import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.SubData.Server.ClientHandler; @@ -42,7 +45,7 @@ public final class SubCommand extends CommandX { private SubProxy plugin; private String label; - protected static NamedContainer newInstance(SubProxy plugin, String command) { + static NamedContainer newInstance(SubProxy plugin, String command) { NamedContainer cmd = new NamedContainer<>(new SubCommand(plugin, command), null); CommandX now = cmd.name(); //if (plugin.api.getGameVersion()[plugin.api.getGameVersion().length - 1].compareTo(new Version("1.13")) >= 0) { // TODO Future Command Validator API? @@ -80,43 +83,15 @@ public final class SubCommand extends CommandX { if (args[0].equalsIgnoreCase("help") || args[0].equalsIgnoreCase("?")) { sender.sendMessages(printHelp()); } else if (args[0].equalsIgnoreCase("version") || args[0].equalsIgnoreCase("ver")) { - String osarch; - if (System.getProperty("os.name").toLowerCase().startsWith("windows")) { - String arch = System.getenv("PROCESSOR_ARCHITECTURE"); - String wow64Arch = System.getenv("PROCESSOR_ARCHITEW6432"); - - osarch = arch != null && arch.endsWith("64") || wow64Arch != null && wow64Arch.endsWith("64")?"x64":"x86"; - } else if (System.getProperty("os.arch").endsWith("86")) { - osarch = "x86"; - } else if (System.getProperty("os.arch").endsWith("64")) { - osarch = "x64"; - } else { - osarch = System.getProperty("os.arch"); - } - - String javaarch = null; - switch (System.getProperty("sun.arch.data.model")) { - case "32": - javaarch = "x86"; - break; - case "64": - javaarch = "x64"; - break; - default: - if (!System.getProperty("sun.arch.data.model").equalsIgnoreCase("unknown")) - javaarch = System.getProperty("sun.arch.data.model"); - } - Version galaxi = GalaxiInfo.getVersion(); Version bungee = Util.getDespiteException(() -> (Version) BungeeCord.class.getMethod("getBuildVersion").invoke(plugin), null); Version galaxibuild = GalaxiInfo.getSignature(); Version bungeebuild = Util.getDespiteException(() -> (Version) BungeeCord.class.getMethod("getBuildSignature").invoke(plugin), null); sender.sendMessage("SubServers > These are the platforms and versions that are running SubServers.Bungee:"); - sender.sendMessage(" " + System.getProperty("os.name") + ((!System.getProperty("os.name").toLowerCase().startsWith("windows"))?' ' + System.getProperty("os.version"):"") + ((osarch != null)?" [" + osarch + ']':"") + ','); - sender.sendMessage(" Java " + System.getProperty("java.version") + ((javaarch != null)?" [" + javaarch + ']':"") + ','); - if (galaxi != null) - Util.isException(() -> sender.sendMessage(" GalaxiEngine v" + galaxi.toExtendedString() + ((galaxibuild != null)?" (" + galaxibuild + ')':"") + ',')); + sender.sendMessage(" " + Platform.getSystemName() + ' ' + Platform.getSystemVersion() + ((!Platform.getSystemArchitecture().equals("unknown"))?" [" + Platform.getSystemArchitecture() + ']':"") + ','); + sender.sendMessage(" Java " + Platform.getJavaVersion() + ((!Platform.getJavaArchitecture().equals("unknown"))?" [" + Platform.getJavaArchitecture() + ']':"") + ','); + if (galaxi != null) Util.isException(() -> sender.sendMessage(" GalaxiEngine v" + galaxi.toExtendedString() + ((galaxibuild != null)?" (" + galaxibuild + ')':"") + ',')); sender.sendMessage(" " + plugin.getBungeeName() + ((plugin.isGalaxi)?" v":" ") + ((bungee != null)?bungee:plugin.getVersion()) + ((bungeebuild != null)?" (" + bungeebuild + ')':"") + ((plugin.isPatched)?" [Patched]":"") + ','); sender.sendMessage(" SubServers.Bungee v" + SubProxy.version.toExtendedString() + ((plugin.api.getWrapperBuild() != null)?" (" + plugin.api.getWrapperBuild() + ')':"")); sender.sendMessage(""); @@ -170,6 +145,8 @@ public final class SubCommand extends CommandX { break; case "creator": case "creators": + case "subcreator": + case "subcreators": case "template": case "templates": for (Host host : plugin.api.getHosts().values()) { @@ -198,7 +175,7 @@ public final class SubCommand extends CommandX { message += ChatColor.GOLD + group + ChatColor.RESET + ": "; List names = new ArrayList(); Map servers = plugin.api.getServers(); - for (Server server : plugin.api.getGroup(group)) names.add(server.getName()); + for (Server server : plugin.api.getGroup(group).get()) names.add(server.getName()); Collections.sort(names); for (String name : names) { if (i != 0) message += div; @@ -216,7 +193,7 @@ public final class SubCommand extends CommandX { } else { message += ChatColor.RED; } - message += server.getDisplayName() + " (" + server.getAddress().getAddress().getHostAddress() + ':' + server.getAddress().getPort() + ((server.getName().equals(server.getDisplayName())) ? "" : ChatColor.stripColor(div) + server.getName()) + ")"; + message += server.getDisplayName() + ((server.getName().equals(server.getDisplayName()))?"":" ["+server.getName()+']'); i++; } if (i == 0) message += ChatColor.RESET + "(none)"; @@ -235,7 +212,7 @@ public final class SubCommand extends CommandX { } else { message += ChatColor.RED; } - message += host.getDisplayName() + " (" + host.getAddress().getHostAddress() + ((host.getName().equals(host.getDisplayName()))?"":ChatColor.stripColor(div)+host.getName()) + ")" + ChatColor.RESET + ": "; + message += host.getDisplayName() + " [" + ((host.getName().equals(host.getDisplayName()))?"":host.getName()+ChatColor.stripColor(div)) + host.getAddress().getHostAddress() + "]" + ChatColor.RESET + ": "; for (SubServer subserver : host.getSubServers().values()) { if (i != 0) message += div; if (subserver.isRunning()) { @@ -249,7 +226,7 @@ public final class SubCommand extends CommandX { } else { message += ChatColor.RED; } - message += subserver.getDisplayName() + " (" + subserver.getAddress().getPort() + ((subserver.getName().equals(subserver.getDisplayName()))?"":ChatColor.stripColor(div)+subserver.getName()) + ")"; + message += subserver.getDisplayName() + " [" + ((subserver.getName().equals(subserver.getDisplayName()))?"":subserver.getName()+ChatColor.stripColor(div)) + subserver.getAddress().getPort() + "]"; i++; } if (i == 0) message += ChatColor.RESET + "(none)"; @@ -263,7 +240,7 @@ public final class SubCommand extends CommandX { for (Server server : plugin.api.getServers().values()) { if (!(server instanceof SubServer)) { if (i != 0) message += div; - message += ChatColor.WHITE + server.getDisplayName() + " (" + server.getAddress().getAddress().getHostAddress() + ':' + server.getAddress().getPort() + ((server.getName().equals(server.getDisplayName()))?"":ChatColor.stripColor(div)+server.getName()) + ")"; + message += ChatColor.WHITE + server.getDisplayName() + " [" + ((server.getName().equals(server.getDisplayName()))?"":server.getName()+ChatColor.stripColor(div)) + server.getAddress().getAddress().getHostAddress() + ':' + server.getAddress().getPort() + "]"; i++; } } @@ -283,7 +260,7 @@ public final class SubCommand extends CommandX { } else { message += ChatColor.RED; } - message += proxy.getDisplayName() + ((proxy.getName().equals(proxy.getDisplayName()))?"":" ("+proxy.getName()+')'); + message += proxy.getDisplayName() + ((proxy.getName().equals(proxy.getDisplayName()))?"":" ["+proxy.getName()+']'); } sender.sendMessage(message); } @@ -292,17 +269,33 @@ public final class SubCommand extends CommandX { String type = (args.length > 2)?args[1]:null; String name = args[(type != null)?2:1]; + Runnable getPlayer = () -> { + RemotePlayer player = plugin.api.getGlobalPlayer(name); + if (player != null) { + sender.sendMessage("SubServers > Info on player: " + ChatColor.WHITE + player.getName()); + if (player.getProxy() != null) sender.sendMessage(" -> Proxy: " + ChatColor.WHITE + player.getProxy().getName()); + if (player.getServer() != null) sender.sendMessage(" -> Server: " + ChatColor.WHITE + player.getServer().getName()); + if (player.getAddress() != null) sender.sendMessage(" -> Address: " + ChatColor.WHITE + player.getAddress().getHostAddress()); + sender.sendMessage(" -> UUID: " + ChatColor.AQUA + player.getUniqueId()); + } else { + if (type == null) { + sender.sendMessage("SubServers > There is no object with that name"); + } else { + sender.sendMessage("SubServers > There is no player with that name"); + } + } + }; Runnable getServer = () -> { Server server = plugin.api.getServer(name); if (server != null) { - sender.sendMessage("SubServers > Info on " + ((server instanceof SubServer)?"Sub":"") + "Server: " + ChatColor.WHITE + server.getDisplayName()); - if (!server.getName().equals(server.getDisplayName())) sender.sendMessage(" -> System Name: " + ChatColor.WHITE + server.getName()); + sender.sendMessage("SubServers > Info on " + ((server instanceof SubServer)?"sub":"") + "server: " + ChatColor.WHITE + server.getDisplayName()); + if (!server.getName().equals(server.getDisplayName())) sender.sendMessage(" -> System Name: " + ChatColor.WHITE + server.getName()); if (server instanceof SubServer) { sender.sendMessage(" -> Available: " + ((((SubServer) server).isAvailable())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); sender.sendMessage(" -> Enabled: " + ((((SubServer) server).isEnabled())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); if (!((SubServer) server).isEditable()) sender.sendMessage(" -> Editable: " + ChatColor.RED + "no"); - sender.sendMessage(" -> Host: " + ChatColor.WHITE + ((SubServer) server).getHost().getName()); - if (((SubServer) server).getTemplate() != null) sender.sendMessage(" -> Template: " + ChatColor.WHITE + ((SubServer) server).getTemplate().getName()); + sender.sendMessage(" -> Host: " + ChatColor.WHITE + ((SubServer) server).getHost().getName()); + if (((SubServer) server).getTemplate() != null) sender.sendMessage(" -> Template: " + ChatColor.WHITE + ((SubServer) server).getTemplate().getName()); } if (server.getGroups().size() > 0) sender.sendMessage(" -> Group" + ((server.getGroups().size() > 1)?"s:":": " + ChatColor.WHITE + server.getGroups().get(0))); if (server.getGroups().size() > 1) for (String group : server.getGroups()) sender.sendMessage(" - " + ChatColor.WHITE + group); @@ -310,7 +303,7 @@ public final class SubCommand extends CommandX { if (server instanceof SubServer) sender.sendMessage(" -> Running: " + ((((SubServer) server).isRunning())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); if (!(server instanceof SubServer) || ((SubServer) server).isRunning()) { sender.sendMessage(" -> Connected: " + ((server.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((server.getSubData().length > 1)?ChatColor.AQUA+" +"+(server.getSubData().length-1)+" subchannel"+((server.getSubData().length == 2)?"":"s"):""):ChatColor.RED+"no")); - sender.sendMessage(" -> Players: " + ChatColor.AQUA + server.getPlayers().size() + " online"); + sender.sendMessage(" -> Players: " + ChatColor.AQUA + server.getGlobalPlayers().size() + " online"); } sender.sendMessage(" -> MOTD: " + ChatColor.WHITE + ChatColor.stripColor(server.getMotd())); if (server instanceof SubServer && ((SubServer) server).getStopAction() != SubServer.StopAction.NONE) sender.sendMessage(" -> Stop Action: " + ChatColor.WHITE + ((SubServer) server).getStopAction().toString()); @@ -326,18 +319,18 @@ public final class SubCommand extends CommandX { sender.sendMessage(" -> Hidden: " + ((server.isHidden())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); } else { if (type == null) { - sender.sendMessage("SubServers > There is no object with that name"); + getPlayer.run(); } else { sender.sendMessage("SubServers > There is no server with that name"); } } }; Runnable getGroup = () -> { - List group = plugin.api.getGroup(name); + NamedContainer> group = plugin.api.getGroup(name); if (group != null) { - sender.sendMessage("SubServers > Info on Group: " + ChatColor.WHITE + name); - sender.sendMessage(" -> Servers: " + ((group.size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + group.size())); - for (Server server : group) sender.sendMessage(" - " + ChatColor.WHITE + server.getDisplayName() + ((server.getName().equals(server.getDisplayName()))?"":" ("+server.getName()+')')); + sender.sendMessage("SubServers > Info on group: " + ChatColor.WHITE + group.name()); + sender.sendMessage(" -> Servers: " + ((group.get().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + group.get().size())); + for (Server server : group.get()) sender.sendMessage(" - " + ChatColor.WHITE + server.getDisplayName() + ((server.getName().equals(server.getDisplayName()))?"":" ["+server.getName()+']')); } else { if (type == null) { getServer.run(); @@ -349,16 +342,16 @@ public final class SubCommand extends CommandX { Runnable getHost = () -> { Host host = plugin.api.getHost(name); if (host != null) { - sender.sendMessage("SubServers > Info on Host: " + ChatColor.WHITE + host.getDisplayName()); - if (!host.getName().equals(host.getDisplayName())) sender.sendMessage(" -> System Name: " + ChatColor.WHITE + host.getName()); + sender.sendMessage("SubServers > Info on host: " + ChatColor.WHITE + host.getDisplayName()); + if (!host.getName().equals(host.getDisplayName())) sender.sendMessage(" -> System Name: " + ChatColor.WHITE + host.getName()); sender.sendMessage(" -> Available: " + ((host.isAvailable())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); sender.sendMessage(" -> Enabled: " + ((host.isEnabled())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); sender.sendMessage(" -> Address: " + ChatColor.WHITE + host.getAddress().getHostAddress()); if (host instanceof ClientHandler) sender.sendMessage(" -> Connected: " + ((((ClientHandler) host).getSubData()[0] != null)?ChatColor.GREEN+"yes"+((((ClientHandler) host).getSubData().length > 1)?ChatColor.AQUA+" +"+(((ClientHandler) host).getSubData().length-1)+" subchannel"+((((ClientHandler) host).getSubData().length == 2)?"":"s"):""):ChatColor.RED+"no")); sender.sendMessage(" -> SubServers: " + ((host.getSubServers().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getSubServers().keySet().size())); - for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(" - " + ((subserver.isEnabled())?ChatColor.WHITE:ChatColor.GRAY) + subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')')); + for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(" - " + ((subserver.isEnabled())?ChatColor.WHITE:ChatColor.GRAY) + subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ["+subserver.getName()+']')); sender.sendMessage(" -> Templates: " + ((host.getCreator().getTemplates().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getCreator().getTemplates().keySet().size())); - for (SubCreator.ServerTemplate template : host.getCreator().getTemplates().values()) sender.sendMessage(" - " + ((template.isEnabled())?ChatColor.WHITE:ChatColor.GRAY) + template.getDisplayName() + ((template.getName().equals(template.getDisplayName()))?"":" ("+template.getName()+')')); + for (SubCreator.ServerTemplate template : host.getCreator().getTemplates().values()) sender.sendMessage(" - " + ((template.isEnabled())?ChatColor.WHITE:ChatColor.GRAY) + template.getDisplayName() + ((template.getName().equals(template.getDisplayName()))?"":" ["+template.getName()+']')); sender.sendMessage(" -> Signature: " + ChatColor.AQUA + host.getSignature()); } else { if (type == null) { @@ -371,10 +364,11 @@ public final class SubCommand extends CommandX { Runnable getProxy = () -> { Proxy proxy = plugin.api.getProxy(name); if (proxy != null) { - sender.sendMessage("SubServers > Info on Proxy: " + ChatColor.WHITE + proxy.getDisplayName()); - if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(" -> System Name: " + ChatColor.WHITE + proxy.getName()); - sender.sendMessage(" -> Connected: " + ((proxy.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((proxy.getSubData().length > 1)?ChatColor.AQUA+" +"+(proxy.getSubData().length-1)+" subchannel"+((proxy.getSubData().length == 2)?"":"s"):""):ChatColor.RED+"no")); - sender.sendMessage(" -> Redis: " + ((proxy.isRedis())?ChatColor.GREEN:ChatColor.RED+"un") + "available"); + sender.sendMessage("SubServers > Info on proxy: " + ChatColor.WHITE + proxy.getDisplayName()); + if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(" -> System Name: " + ChatColor.WHITE + proxy.getName()); + if (!proxy.isMaster()) sender.sendMessage(" -> Connected: " + ((proxy.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((proxy.getSubData().length > 1)?ChatColor.AQUA+" +"+(proxy.getSubData().length-1)+" subchannel"+((proxy.getSubData().length == 2)?"":"s"):""):ChatColor.RED+"no")); + else if (!proxy.getDisplayName().toLowerCase().contains("master")) sender.sendMessage(" -> Type: " + ChatColor.WHITE + "Master"); + sender.sendMessage(" -> Redis: " + ((proxy.isRedis())?ChatColor.GREEN:ChatColor.RED+"un") + "available"); if (proxy.isRedis()) sender.sendMessage(" -> Players: " + ChatColor.AQUA + proxy.getPlayers().size() + " online"); sender.sendMessage(" -> Signature: " + ChatColor.AQUA + proxy.getSignature()); } else { @@ -407,178 +401,185 @@ public final class SubCommand extends CommandX { case "subserver": getServer.run(); break; + case "player": + getPlayer.run(); + break; default: sender.sendMessage("SubServers > There is no object type with that name"); } } } else { - sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " [proxy|host|group|server] "); + sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " [proxy|host|group|server|player] "); } } else if (args[0].equalsIgnoreCase("start")) { if (args.length > 1) { - Map servers = plugin.api.getServers(); - if (!servers.keySet().contains(args[1].toLowerCase())) { - sender.sendMessage("SubServers > There is no server with that name"); - } else if (!(servers.get(args[1].toLowerCase()) instanceof SubServer)) { - sender.sendMessage("SubServers > That Server is not a SubServer"); - } else if (!((SubServer) servers.get(args[1].toLowerCase())).getHost().isAvailable()) { - sender.sendMessage("SubServers > That SubServer's Host is not available"); - } else if (!((SubServer) servers.get(args[1].toLowerCase())).getHost().isEnabled()) { - sender.sendMessage("SubServers > That SubServer's Host is not enabled"); - } else if (!((SubServer) servers.get(args[1].toLowerCase())).isAvailable()) { - sender.sendMessage("SubServers > That SubServer is not available"); - } else if (!((SubServer) servers.get(args[1].toLowerCase())).isEnabled()) { - sender.sendMessage("SubServers > That SubServer is not enabled"); - } else if (((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { - sender.sendMessage("SubServers > That SubServer is already running"); - } else if (((SubServer) servers.get(args[1].toLowerCase())).getCurrentIncompatibilities().size() != 0) { - String list = ""; - for (SubServer server : ((SubServer) servers.get(args[1].toLowerCase())).getCurrentIncompatibilities()) { - if (list.length() != 0) list += ", "; - list += server.getName(); + ServerSelection select = selectServers(sender, args, 1, true); + if (select.subservers.length > 0) { + int success = 0, running = 0; + for (SubServer server : select.subservers) { + if (!server.getHost().isAvailable()) { + sender.sendMessage("SubServers > The host for " + server.getName() + " is not available"); + } else if (!server.getHost().isEnabled()) { + sender.sendMessage("SubServers > The host for " + server.getName() + " is not enabled"); + } else if (!server.isAvailable()) { + sender.sendMessage("SubServers > Subserver " + server.getName() + " is not available"); + } else if (!server.isEnabled()) { + sender.sendMessage("SubServers > SubServer " + server.getName() + " is not enabled"); + } else if (server.isRunning()) { + running++; + } else if (server.getCurrentIncompatibilities().size() != 0) { + String list = ""; + List others = server.getCurrentIncompatibilities(); + for (SubServer other : others) { + if (list.length() != 0) list += ", "; + list += other.getName(); + } + sender.sendMessages("SubServers > Subserver " + server.getName() + " cannot start while these server"+((others.size() == 1)?"":"s")+" are running:", list); + } else if (server.start()) { + success++; + } } - sender.sendMessages("That SubServer cannot start while these server(s) are running:", list); - } else { - ((SubServer) servers.get(args[1].toLowerCase())).start(); + if (running > 0) sender.sendMessage("SubServers > " + running + " subserver"+((running == 1)?"":"s") + " were already running"); + if (success > 0) sender.sendMessage("SubServers > Started " + success + " subserver"+((success == 1)?"":"s")); } } else { - sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); + sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); } } else if (args[0].equalsIgnoreCase("restart")) { if (args.length > 1) { - Runnable starter = () -> { - Map servers = plugin.api.getServers(); - if (!servers.keySet().contains(args[1].toLowerCase()) || !(servers.get(args[1].toLowerCase()) instanceof SubServer)) { - sender.sendMessage("SubServers > Could not restart server: That SubServer has disappeared"); - } else if (!((SubServer) servers.get(args[1].toLowerCase())).getHost().isAvailable()) { - sender.sendMessage("SubServers > Could not restart server: That SubServer's Host is no longer available"); - } else if (!((SubServer) servers.get(args[1].toLowerCase())).getHost().isEnabled()) { - sender.sendMessage("SubServers > Could not restart server: That SubServer's Host is no longer enabled"); - } else if (!((SubServer) servers.get(args[1].toLowerCase())).isAvailable()) { - sender.sendMessage("SubServers > Could not restart server: That SubServer is no longer available"); - } else if (!((SubServer) servers.get(args[1].toLowerCase())).isEnabled()) { - sender.sendMessage("SubServers > Could not restart server: That SubServer is no longer enabled"); - } else if (!((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { - if (((SubServer) servers.get(args[1].toLowerCase())).getCurrentIncompatibilities().size() != 0) { - String list = ""; - for (SubServer server : ((SubServer) servers.get(args[1].toLowerCase())).getCurrentIncompatibilities()) { - if (list.length() != 0) list += ", "; - list += server.getName(); + ServerSelection select = selectServers(sender, args, 1, true); + if (select.subservers.length > 0) { + Callback starter = server -> { + Map servers = plugin.api.getServers(); + if (!servers.keySet().contains(server.getName().toLowerCase()) || !(servers.get(server.getName().toLowerCase()) instanceof SubServer)) { + sender.sendMessage("SubServers > Could not restart server: Subserver " + server.getName() + " has disappeared"); + } else if (!(server = (SubServer) servers.get(server.getName().toLowerCase())).isRunning()) { + if (!server.getHost().isAvailable()) { + sender.sendMessage("SubServers > Could not restart server: The host for " + server.getName() + " is no longer available"); + } else if (!server.getHost().isEnabled()) { + sender.sendMessage("SubServers > Could not restart server: The host for " + server.getName() + " is no longer enabled"); + } else if (!server.isAvailable()) { + sender.sendMessage("SubServers > Could not restart server: Subserver " + server.getName() + " is no longer available"); + } else if (!server.isEnabled()) { + sender.sendMessage("SubServers > Could not restart server: Subserver " + server.getName() + " is no longer enabled"); + } else if (server.getCurrentIncompatibilities().size() != 0) { + String list = ""; + List others = server.getCurrentIncompatibilities(); + for (SubServer other : others) { + if (list.length() != 0) list += ", "; + list += other.getName(); + } + sender.sendMessages("Could not restart server: Subserver " + server.getName() + " cannot start while these server"+((others.size() == 1)?"":"s")+" are running:", list); + } else { + server.start(); + } + } + }; + + int success = 0; + for (SubServer server : select.subservers) { + if (server.isRunning()) { + if (server.stop()) { + new Thread(() -> { + try { + server.waitFor(); + Thread.sleep(100); + starter.run(server); + } catch (Exception e) { + e.printStackTrace(); + } + }, "SubServers.Bungee::Server_Restart_Command_Handler(" + server.getName() + ')').start(); + success++; } - sender.sendMessages("Could not restart server: That SubServer cannot start while these server(s) are running:", list); } else { - ((SubServer) servers.get(args[1].toLowerCase())).start(); + starter.run(server); + success++; } } - }; - - Map servers = plugin.api.getServers(); - if (!servers.keySet().contains(args[1].toLowerCase())) { - sender.sendMessage("SubServers > There is no server with that name"); - } else if (!(servers.get(args[1].toLowerCase()) instanceof SubServer)) { - sender.sendMessage("SubServers > That Server is not a SubServer"); - } else if (((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { - new Thread(() -> { - try { - ((SubServer) servers.get(args[1].toLowerCase())).stop(); - ((SubServer) servers.get(args[1].toLowerCase())).waitFor(); - Thread.sleep(100); - starter.run(); - } catch (Exception e) { - e.printStackTrace(); - } - }, "SubServers.Bungee::Server_Restart_Command_Handler(" + servers.get(args[1].toLowerCase()).getName() + ')').start(); - } else { - starter.run(); + if (success > 0) sender.sendMessage("SubServers > Restarting " + success + " subserver"+((success == 1)?"":"s")); } } else { - sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); + sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); } } else if (args[0].equalsIgnoreCase("stop")) { if (args.length > 1) { - Map servers = plugin.api.getServers(); - if (!args[1].equals("*") && !servers.keySet().contains(args[1].toLowerCase())) { - sender.sendMessage("SubServers > There is no server with that name"); - } else if (!args[1].equals("*") && !(servers.get(args[1].toLowerCase()) instanceof SubServer)) { - sender.sendMessage("SubServers > That Server is not a SubServer"); - } else if (!args[1].equals("*") && !((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { - sender.sendMessage("SubServers > That SubServer is not running"); - } else if (args[1].equals("*")) { - for (Server server : servers.values()) { - if (server instanceof SubServer && ((SubServer) server).isRunning()) { - ((SubServer) server).stop(); + ServerSelection select = selectServers(sender, args, 1, true); + if (select.subservers.length > 0) { + int success = 0, running = 0; + for (SubServer server : select.subservers) { + if (!server.isRunning()) { + running++; + } else if (server.stop()) { + success++; } } - } else { - ((SubServer) servers.get(args[1].toLowerCase())).stop(); + if (running > 0) sender.sendMessage("SubServers > " + running + " subserver"+((running == 1)?"":"s") + " were already offline"); + if (success > 0) sender.sendMessage("SubServers > Stopping " + success + " subserver"+((success == 1)?"":"s")); } } else { - sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); + sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); } } else if (args[0].equalsIgnoreCase("kill") || args[0].equalsIgnoreCase("terminate")) { if (args.length > 1) { - Map servers = plugin.api.getServers(); - if (!args[1].equals("*") && !servers.keySet().contains(args[1].toLowerCase())) { - sender.sendMessage("SubServers > There is no server with that name"); - } else if (!args[1].equals("*") && !(servers.get(args[1].toLowerCase()) instanceof SubServer)) { - sender.sendMessage("SubServers > That Server is not a SubServer"); - } else if (!args[1].equals("*") && !((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { - sender.sendMessage("SubServers > That SubServer is not running"); - } else if (args[1].equals("*")) { - for (Server server : servers.values()) { - if (server instanceof SubServer && ((SubServer) server).isRunning()) { - ((SubServer) server).terminate(); + ServerSelection select = selectServers(sender, args, 1, true); + if (select.subservers.length > 0) { + int success = 0, running = 0; + for (SubServer server : select.subservers) { + if (!server.isRunning()) { + running++; + } else if (server.terminate()) { + success++; } } - } else { - ((SubServer) servers.get(args[1].toLowerCase())).terminate(); + if (running > 0) sender.sendMessage("SubServers > " + running + " subserver"+((running == 1)?"":"s") + " were already offline"); + if (success > 0) sender.sendMessage("SubServers > Terminated " + success + " subserver"+((success == 1)?"":"s")); } } else { - sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); + sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); } } else if (args[0].equalsIgnoreCase("cmd") || args[0].equalsIgnoreCase("command")) { - if (args.length > 2) { - Map servers = plugin.api.getServers(); - if (!args[1].equals("*") && !servers.keySet().contains(args[1].toLowerCase())) { - sender.sendMessage("SubServers > There is no server with that name"); - } else if (!args[1].equals("*") && !(servers.get(args[1].toLowerCase()) instanceof SubServer)) { - sender.sendMessage("SubServers > That Server is not a SubServer"); - } else if (!args[1].equals("*") && !((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { - sender.sendMessage("SubServers > That SubServer is not running"); - } else { - String str = args[2]; - for (int i = 3; i < args.length; i++) { - str += " " + args[i]; - } - if (args[1].equals("*")) { - for (Server server : servers.values()) { - if (server instanceof SubServer && ((SubServer) server).isRunning()) { - ((SubServer) server).command(str); + if (args.length > 1) { + ServerSelection select = selectServers(sender, args, 1, true); + if (select.subservers.length > 0) { + if (select.args.length > 2) { + StringBuilder builder = new StringBuilder(select.args[2]); + for (int i = 3; i < select.args.length; i++) { + builder.append(' '); + builder.append(select.args[i]); + } + + int success = 0, running = 0; + String command = builder.toString(); + for (SubServer server : select.subservers) { + if (!server.isRunning()) { + running++; + } else if (server.command(command)) { + success++; } } + if (running > 0) sender.sendMessage("SubServers > " + running + " subserver"+((running == 1)?"":"s") + " were offline"); + if (success > 0) sender.sendMessage("SubServers > Sent command to " + success + " subserver"+((success == 1)?"":"s")); } else { - ((SubServer) servers.get(args[1].toLowerCase())).command(str); + sender.sendMessage("SubServers > No command was entered"); } } } else { - sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " [Args...]"); + sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " [Args...]"); } } else if (args[0].equalsIgnoreCase("sudo") || args[0].equalsIgnoreCase("screen")) { if (plugin.canSudo) { if (args.length > 1) { Map servers = plugin.api.getServers(); - if (!servers.keySet().contains(args[1].toLowerCase())) { - sender.sendMessage("SubServers > There is no server with that name"); - } else if (!(servers.get(args[1].toLowerCase()) instanceof SubServer)) { - sender.sendMessage("SubServers > That Server is not a SubServer"); + if (!servers.keySet().contains(args[1].toLowerCase()) || !(servers.get(args[1].toLowerCase()) instanceof SubServer)) { + sender.sendMessage("SubServers > There is no subserver with that name"); } else if (!((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { - sender.sendMessage("SubServers > That SubServer is not running"); + sender.sendMessage("SubServers > That subserver is not running"); } else { plugin.sudo = (SubServer) servers.get(args[1].toLowerCase()); Logger.get("SubServers").info("Now forwarding commands to " + plugin.sudo.getDisplayName() + ". Type \"exit\" to return."); } } else { - sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); + sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); } } else { sender.sendMessage("SubServers > The BungeeCord library provided does not support console sudo."); @@ -586,74 +587,75 @@ public final class SubCommand extends CommandX { } else if (args[0].equalsIgnoreCase("create")) { if (args.length > 3) { if (plugin.api.getSubServers().keySet().contains(args[1].toLowerCase()) || SubCreator.isReserved(args[1])) { - sender.sendMessage("SubServers > There is already a SubServer with that name"); + sender.sendMessage("SubServers > There is already a subserver with that name"); } else if (!plugin.hosts.keySet().contains(args[2].toLowerCase())) { sender.sendMessage("SubServers > There is no host with that name"); } else if (!plugin.hosts.get(args[2].toLowerCase()).isAvailable()) { - sender.sendMessage("SubServers > That Host is not available"); + sender.sendMessage("SubServers > That host is not available"); } else if (!plugin.hosts.get(args[2].toLowerCase()).isEnabled()) { - sender.sendMessage("SubServers > That Host is not enabled"); + sender.sendMessage("SubServers > That host is not enabled"); } else if (!plugin.hosts.get(args[2].toLowerCase()).getCreator().getTemplates().keySet().contains(args[3].toLowerCase())) { sender.sendMessage("SubServers > There is no template with that name"); } else if (!plugin.hosts.get(args[2].toLowerCase()).getCreator().getTemplate(args[3].toLowerCase()).isEnabled()) { - sender.sendMessage("SubServers > That Template is not enabled"); + sender.sendMessage("SubServers > That template is not enabled"); } else if (args.length <= 4 && plugin.hosts.get(args[2].toLowerCase()).getCreator().getTemplate(args[3].toLowerCase()).requiresVersion()) { - sender.sendMessage("SubServers > That Template requires a Minecraft Version to be specified"); + sender.sendMessage("SubServers > That template requires a Minecraft version to be specified"); } else if (args.length > 5 && (Util.isException(() -> Integer.parseInt(args[5])) || Integer.parseInt(args[5]) <= 0 || Integer.parseInt(args[5]) > 65535)) { - sender.sendMessage("SubServers > Invalid Port Number"); + sender.sendMessage("SubServers > Invalid port number"); } else { plugin.hosts.get(args[2].toLowerCase()).getCreator().create(args[1], plugin.hosts.get(args[2].toLowerCase()).getCreator().getTemplate(args[3].toLowerCase()), (args.length > 4)?new Version(args[4]):null, (args.length > 5)?Integer.parseInt(args[5]):null); + sender.sendMessage("SubServers > Creating subserver " + args[1]); } } else { sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + "