Skip to content

Commit 6c8f7de

Browse files
committed
Update the Proxy system
- add a tester to determine whether proxies are dead, and their approximate latency if not - add a button to clean and organise the proxy list - relevant settings are in a new config screen (checking threads, cleaning options, etc.) closes #4223
1 parent edba22e commit 6c8f7de

7 files changed

Lines changed: 389 additions & 9 deletions

File tree

src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import meteordevelopment.meteorclient.commands.arguments.ModuleArgumentType;
1111
import meteordevelopment.meteorclient.gui.GuiThemes;
1212
import meteordevelopment.meteorclient.settings.Setting;
13-
import meteordevelopment.meteorclient.systems.Systems;
1413
import meteordevelopment.meteorclient.systems.hud.Hud;
1514
import meteordevelopment.meteorclient.systems.modules.Module;
1615
import meteordevelopment.meteorclient.systems.modules.Modules;
@@ -56,7 +55,7 @@ public void build(LiteralArgumentBuilder<CommandSource> builder) {
5655
return SINGLE_SUCCESS;
5756
}))
5857
).then(literal("hud").executes(context -> {
59-
Systems.get(Hud.class).resetToDefaultElements();
58+
Hud.get().resetToDefaultElements();
6059
ChatUtils.infoPrefix("HUD", "Reset all elements.");
6160
return SINGLE_SUCCESS;
6261
}));

src/main/java/meteordevelopment/meteorclient/gui/screens/ProxiesImportScreen.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,12 @@ public void initWidgets() {
122122
add(theme.label("Invalid File!"));
123123
}
124124
add(theme.horizontalSeparator()).expandX();
125+
WButton refresh = add(theme.button("Check proxies")).expandX().widget();
126+
refresh.action = () -> {
127+
Proxies.get().checkProxies(false);
128+
close();
129+
};
130+
125131
WButton btnBack = add(theme.button("Back")).expandX().widget();
126132
btnBack.action = this::close;
127133
}

src/main/java/meteordevelopment/meteorclient/gui/screens/ProxiesScreen.java

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,18 @@
99
import meteordevelopment.meteorclient.gui.WindowScreen;
1010
import meteordevelopment.meteorclient.gui.renderer.GuiRenderer;
1111
import meteordevelopment.meteorclient.gui.widgets.WLabel;
12+
import meteordevelopment.meteorclient.gui.widgets.containers.WContainer;
1213
import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList;
1314
import meteordevelopment.meteorclient.gui.widgets.containers.WTable;
1415
import meteordevelopment.meteorclient.gui.widgets.pressable.WButton;
1516
import meteordevelopment.meteorclient.gui.widgets.pressable.WCheckbox;
17+
import meteordevelopment.meteorclient.gui.widgets.pressable.WConfirmedButton;
1618
import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus;
1719
import meteordevelopment.meteorclient.settings.Settings;
1820
import meteordevelopment.meteorclient.systems.proxies.Proxies;
1921
import meteordevelopment.meteorclient.systems.proxies.Proxy;
2022
import meteordevelopment.meteorclient.utils.misc.NbtUtils;
23+
import meteordevelopment.meteorclient.utils.network.MeteorExecutor;
2124
import org.lwjgl.BufferUtils;
2225
import org.lwjgl.PointerBuffer;
2326
import org.lwjgl.system.MemoryUtil;
@@ -26,12 +29,18 @@
2629
import java.io.File;
2730
import java.nio.ByteBuffer;
2831
import java.util.ArrayList;
32+
import java.util.HashMap;
2933
import java.util.List;
34+
import java.util.Map;
3035

3136
import static meteordevelopment.meteorclient.MeteorClient.mc;
3237

3338
public 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
}

src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import meteordevelopment.meteorclient.gui.widgets.pressable.WButton;
1717
import meteordevelopment.meteorclient.gui.widgets.pressable.WConfirmedButton;
1818
import meteordevelopment.meteorclient.gui.widgets.pressable.WConfirmedMinus;
19-
import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus;
2019
import meteordevelopment.meteorclient.systems.profiles.Profile;
2120
import meteordevelopment.meteorclient.systems.profiles.Profiles;
2221
import meteordevelopment.meteorclient.utils.Utils;
@@ -67,7 +66,7 @@ private void initTable(WTable table) {
6766
for (Profile profile : Profiles.get()) {
6867
table.add(theme.label(profile.name.get())).expandCellX();
6968

70-
WConfirmedButton save = theme.confirmedButton("Save", "Confirm");;
69+
WConfirmedButton save = theme.confirmedButton("Save", "Confirm");
7170
save.action = profile::save;
7271
table.add(save).right();
7372

src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WConfirmedButton.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,9 @@ public boolean onMouseReleased(double mouseX, double mouseY, int button) {
3939
public String getText() {
4040
return pressedOnce ? confirmText : text;
4141
}
42+
43+
public void set(String text, String confirmText) {
44+
super.set(text);
45+
this.confirmText = confirmText;
46+
}
4247
}

0 commit comments

Comments
 (0)