99import meteordevelopment .meteorclient .gui .WindowScreen ;
1010import meteordevelopment .meteorclient .gui .renderer .GuiRenderer ;
1111import meteordevelopment .meteorclient .gui .widgets .WLabel ;
12+ import meteordevelopment .meteorclient .gui .widgets .containers .WContainer ;
1213import meteordevelopment .meteorclient .gui .widgets .containers .WHorizontalList ;
1314import meteordevelopment .meteorclient .gui .widgets .containers .WTable ;
1415import meteordevelopment .meteorclient .gui .widgets .pressable .WButton ;
1516import meteordevelopment .meteorclient .gui .widgets .pressable .WCheckbox ;
17+ import meteordevelopment .meteorclient .gui .widgets .pressable .WConfirmedButton ;
1618import meteordevelopment .meteorclient .gui .widgets .pressable .WMinus ;
1719import meteordevelopment .meteorclient .settings .Settings ;
1820import meteordevelopment .meteorclient .systems .proxies .Proxies ;
1921import meteordevelopment .meteorclient .systems .proxies .Proxy ;
2022import meteordevelopment .meteorclient .utils .misc .NbtUtils ;
23+ import meteordevelopment .meteorclient .utils .network .MeteorExecutor ;
2124import org .lwjgl .BufferUtils ;
2225import org .lwjgl .PointerBuffer ;
2326import org .lwjgl .system .MemoryUtil ;
2629import java .io .File ;
2730import java .nio .ByteBuffer ;
2831import java .util .ArrayList ;
32+ import java .util .HashMap ;
2933import java .util .List ;
34+ import java .util .Map ;
3035
3136import static meteordevelopment .meteorclient .MeteorClient .mc ;
3237
3338public class ProxiesScreen extends WindowScreen {
3439 private final List <WCheckbox > checkboxes = new ArrayList <>();
40+ private final WButton refreshButton = theme .button ("Refresh" );
41+ private final WConfirmedButton cleanButton = theme .confirmedButton ("Cleanup" , "Confirm" );
42+ private Map <Proxy , WLabel > statuses = new HashMap <>();
43+ private int timer = 0 ;
3544
3645 public ProxiesScreen (GuiTheme theme ) {
3746 super (theme , "Proxies" );
@@ -66,12 +75,27 @@ public void initWidgets() {
6675 mc .setScreen (new ProxiesImportScreen (theme , file ));
6776 }
6877 };
78+
79+ l .add (refreshButton ).expandX ();
80+ refreshButton .action = () -> Proxies .get ().checkProxies (true );
81+
82+ l .add (cleanButton ).expandX ();
83+ cleanButton .action = () -> {
84+ if (Proxies .get ().refreshing ) return ;
85+ Proxies .get ().clean ();
86+ initTable (table );
87+ };
88+
89+ WButton configButton = l .add (theme .button (GuiRenderer .EDIT )).widget ();
90+ configButton .action = () -> mc .setScreen (new ConfigScreen (theme ));
91+ configButton .tooltip = "Proxies Config" ;
6992 }
7093
7194 private void initTable (WTable table ) {
7295 table .clear ();
7396 if (Proxies .get ().isEmpty ()) return ;
7497
98+ statuses = new HashMap <>(Proxies .get ().size (), 1 );
7599 for (Proxy proxy : Proxies .get ()) {
76100 WCheckbox enabled = table .add (theme .checkbox (proxy .enabled .get ())).widget ();
77101 checkboxes .add (enabled );
@@ -96,6 +120,15 @@ private void initTable(WTable table) {
96120 ipList .add (theme .label (":" )).widget ().color = theme .textSecondaryColor ();
97121 ipList .add (theme .label (Integer .toString (proxy .port .get ())));
98122
123+ String s = (proxy .status == Proxy .Status .ALIVE ? proxy .latency + "ms" : proxy .status .toString ());
124+ WLabel status = table .add (theme .label (s )).widget ();
125+ status .color = proxy .status .getColor ();
126+ statuses .put (proxy , status );
127+
128+ WButton refresh = table .add (theme .button (GuiRenderer .RESET )).widget ();
129+ refresh .action = () -> MeteorExecutor .execute (proxy ::checkStatus );
130+ refresh .tooltip = "Refresh" ;
131+
99132 WButton edit = table .add (theme .button (GuiRenderer .EDIT )).widget ();
100133 edit .action = () -> mc .setScreen (new EditProxyScreen (theme , proxy , this ::reload ));
101134
@@ -109,6 +142,49 @@ private void initTable(WTable table) {
109142 }
110143 }
111144
145+ @ Override
146+ public void tick () {
147+ if (Proxies .get ().refreshing ) {
148+ if (cleanButton .getText ().equals ("Cleanup" )) {
149+ cleanButton .set ("---" , "---" );
150+ }
151+ if (timer > 2 ) {
152+ refreshButton .set (getNext (refreshButton ));
153+ timer = 0 ;
154+ }
155+ else timer ++;
156+ }
157+ else {
158+ if (!refreshButton .getText ().equals ("Refresh" )) {
159+ refreshButton .set ("Refresh" );
160+ }
161+ if (!cleanButton .getText ().equals ("Cleanup" )) {
162+ cleanButton .set ("Cleanup" , "Confirm" );
163+ }
164+ }
165+
166+ for (Map .Entry <Proxy , WLabel > entry : statuses .entrySet ()) {
167+ Proxy proxy = entry .getKey ();
168+ WLabel label = entry .getValue ();
169+
170+ // only update them when there is a change in status
171+ if (label .get ().equals (proxy .status .toString ())) continue ;
172+
173+ label .set (proxy .status == Proxy .Status .ALIVE ? proxy .latency + "ms" : proxy .status .toString ());
174+ label .color = proxy .status .getColor ();
175+ }
176+ }
177+
178+ private String getNext (WButton b ) {
179+ return switch (b .getText ()) {
180+ case "Refresh" , "oo0" -> "ooo" ;
181+ case "ooo" -> "0oo" ;
182+ case "0oo" -> "o0o" ;
183+ case "o0o" -> "oo0" ;
184+ default -> "Refresh" ;
185+ };
186+ }
187+
112188 @ Override
113189 public boolean toClipboard () {
114190 return NbtUtils .toClipboard (Proxies .get ());
@@ -131,6 +207,7 @@ public Proxy create() {
131207
132208 @ Override
133209 public boolean save () {
210+ MeteorExecutor .execute (value ::checkStatus );
134211 return value .resolveAddress () && (!isNew || Proxies .get ().add (value ));
135212 }
136213
@@ -139,4 +216,23 @@ public Settings getSettings() {
139216 return value .settings ;
140217 }
141218 }
219+
220+ private static class ConfigScreen extends WindowScreen {
221+ private WContainer settingsContainer ;
222+
223+ public ConfigScreen (GuiTheme theme ) {
224+ super (theme , "Proxies Config" );
225+ }
226+
227+ @ Override
228+ public void initWidgets () {
229+ settingsContainer = add (theme .verticalList ()).expandX ().minWidth (400 ).widget ();
230+ settingsContainer .add (theme .settings (Proxies .get ().settings )).expandX ();
231+ }
232+
233+ @ Override
234+ public void tick () {
235+ Proxies .get ().settings .tick (settingsContainer , theme );
236+ }
237+ }
142238}
0 commit comments