Skip to content

Commit

Permalink
Use enabled wrapper for proxies
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexProgrammerDE committed Mar 3, 2024
1 parent 7fbbb9b commit 972495a
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 54 deletions.
Expand Up @@ -155,14 +155,13 @@ public void mousePressed(MouseEvent e) {
}
});
var removeButton = new JButton("-");
removeButton.setToolTipText("Remove accounts from the list");
removeButton.setToolTipText("Remove selected accounts from the list");
removeButton.addActionListener(
e -> {
var selectedRows = accountList.getSelectedRows();
for (var i = selectedRows.length - 1; i >= 0; i--) {
model.removeRow(selectedRows[i]);
}

reconstructFromTable.run();
});

Expand Down
Expand Up @@ -24,6 +24,7 @@
import com.soulfiremc.proxy.ProxyType;
import com.soulfiremc.proxy.SFProxy;
import com.soulfiremc.util.BuiltinSettingsConstants;
import com.soulfiremc.util.EnabledWrapper;
import com.soulfiremc.util.SFPathConstants;
import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
Expand Down Expand Up @@ -59,23 +60,6 @@ public ProxyPanel(GUIManager guiManager, GUIFrame parent, CardsContainer cardsCo
GBC.create(this).grid(0, 0).fill(GBC.HORIZONTAL).weightx(1).add(proxySettingsPanel);

var toolBar = new JToolBar();
toolBar.setFloatable(false);
var addButton = new JButton("+");
addButton.setToolTipText("Add proxies");
addButton.addMouseListener(
new MouseAdapter() {
public void mousePressed(MouseEvent e) {
var menu = new JPopupMenu();
menu.add(createProxyLoadButton(guiManager, parent, ProxyType.HTTP));
menu.add(createProxyLoadButton(guiManager, parent, ProxyType.SOCKS4));
menu.add(createProxyLoadButton(guiManager, parent, ProxyType.SOCKS5));
menu.show(e.getComponent(), e.getX(), e.getY());
}
});

toolBar.add(addButton);
toolBar.setBorder(BorderFactory.createLineBorder(UIManager.getColor("Component.borderColor")));
toolBar.setBackground(UIManager.getColor("Table.background"));

GBC.create(this).grid(0, 1).insets(10, 4, -5, 4).fill(GBC.HORIZONTAL).weightx(0).add(toolBar);

Expand Down Expand Up @@ -113,11 +97,11 @@ public Class<?> getColumnClass(int columnIndex) {

dataVector[i] =
new Object[] {
proxy.host(),
proxy.port(),
proxy.username(),
proxy.password(),
proxy.type(),
proxy.value().host(),
proxy.value().port(),
proxy.value().username(),
proxy.value().password(),
proxy.value().type(),
proxy.enabled()
};
}
Expand All @@ -132,34 +116,66 @@ public Class<?> getColumnClass(int columnIndex) {
model.fireTableDataChanged();
});

Runnable reconstructFromTable =
() -> {
var proxies = new ArrayList<EnabledWrapper<SFProxy>>();

for (var i = 0; i < proxyList.getRowCount(); i++) {
var row = new Object[proxyList.getColumnCount()];
for (var j = 0; j < proxyList.getColumnCount(); j++) {
row[j] = proxyList.getValueAt(i, j);
}

var host = (String) row[0];
var port = (int) row[1];
var username = (String) row[2];
var password = (String) row[3];
var type = (ProxyType) row[4];
var enabled = (boolean) row[5];

proxies.add(new EnabledWrapper<>(enabled, new SFProxy(type, host, port, username, password)));
}

proxyRegistry.setProxies(proxies);
};
proxyList.addPropertyChangeListener(
evt -> {
if ("tableCellEditor".equals(evt.getPropertyName()) && !proxyList.isEditing()) {
var proxies = new ArrayList<SFProxy>();

for (var i = 0; i < proxyList.getRowCount(); i++) {
var row = new Object[proxyList.getColumnCount()];
for (var j = 0; j < proxyList.getColumnCount(); j++) {
row[j] = proxyList.getValueAt(i, j);
}

var host = (String) row[0];
var port = (int) row[1];
var username = (String) row[2];
var password = (String) row[3];
var type = (ProxyType) row[4];
var enabled = (boolean) row[5];

proxies.add(new SFProxy(type, host, port, username, password, enabled));
}

proxyRegistry.setProxies(proxies);
reconstructFromTable.run();
}
});

var scrollPane = new JScrollPane(proxyList);

GBC.create(this).grid(0, 2).fill(GBC.BOTH).weight(1, 1).add(scrollPane);

toolBar.setFloatable(false);
var addButton = new JButton("+");
addButton.setToolTipText("Add proxies to the list");
addButton.addMouseListener(
new MouseAdapter() {
public void mousePressed(MouseEvent e) {
var menu = new JPopupMenu();
menu.add(createProxyLoadButton(guiManager, parent, ProxyType.HTTP));
menu.add(createProxyLoadButton(guiManager, parent, ProxyType.SOCKS4));
menu.add(createProxyLoadButton(guiManager, parent, ProxyType.SOCKS5));
menu.show(e.getComponent(), e.getX(), e.getY());
}
});
var removeButton = new JButton("-");
removeButton.setToolTipText("Remove selected proxies from the list");
removeButton.addActionListener(
e -> {
var selectedRows = proxyList.getSelectedRows();
for (var i = selectedRows.length - 1; i >= 0; i--) {
model.removeRow(selectedRows[i]);
}
reconstructFromTable.run();
});

toolBar.add(addButton);
toolBar.setBorder(BorderFactory.createLineBorder(UIManager.getColor("Component.borderColor")));
toolBar.setBackground(UIManager.getColor("Table.background"));
}

private static JMenuItem createProxyLoadButton(
Expand Down
Expand Up @@ -19,6 +19,7 @@

import com.soulfiremc.proxy.ProxyType;
import com.soulfiremc.proxy.SFProxy;
import com.soulfiremc.util.EnabledWrapper;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
Expand All @@ -28,7 +29,7 @@
@Slf4j
@RequiredArgsConstructor
public class ProxyRegistry {
private final List<SFProxy> proxies = new ArrayList<>();
private final List<EnabledWrapper<SFProxy>> proxies = new ArrayList<>();
private final List<Runnable> loadHooks = new ArrayList<>();

private static <T> T getIndexOrNull(T[] array, int index) {
Expand Down Expand Up @@ -59,7 +60,7 @@ public void loadFromString(String data, ProxyType proxyType) {
log.info("Loaded {} proxies!", newProxies.size());
}

private SFProxy fromStringSingle(String data, ProxyType proxyType) {
private EnabledWrapper<SFProxy> fromStringSingle(String data, ProxyType proxyType) {
data = data.trim();

var split = data.split(":");
Expand All @@ -74,18 +75,18 @@ private SFProxy fromStringSingle(String data, ProxyType proxyType) {
var username = getIndexOrNull(split, 2);
var password = getIndexOrNull(split, 3);

return new SFProxy(proxyType, host, port, username, password, true);
return new EnabledWrapper<>(true, new SFProxy(proxyType, host, port, username, password));
} catch (Exception e) {
log.error("Failed to load proxy from string.", e);
throw new RuntimeException(e);
}
}

public List<SFProxy> getProxies() {
public List<EnabledWrapper<SFProxy>> getProxies() {
return Collections.unmodifiableList(proxies);
}

public void setProxies(List<SFProxy> proxies) {
public void setProxies(List<EnabledWrapper<SFProxy>> proxies) {
this.proxies.clear();
this.proxies.addAll(proxies);
}
Expand Down
3 changes: 1 addition & 2 deletions server/src/main/java/com/soulfiremc/proxy/SFProxy.java
Expand Up @@ -25,8 +25,7 @@ public record SFProxy(
@NonNull String host,
int port,
String username,
String password,
boolean enabled) {
String password) {
public SFProxy {
if (type == ProxyType.SOCKS4 && password != null) {
throw new IllegalArgumentException("SOCKS4 does not support passwords!");
Expand Down
Expand Up @@ -137,7 +137,8 @@ public CompletableFuture<?> start() {

var proxies =
settingsHolder.proxies().stream()
.filter(SFProxy::enabled)
.filter(EnabledWrapper::enabled)
.map(EnabledWrapper::value)
.collect(Collectors.toCollection(ArrayList::new));
var availableProxiesCount = proxies.size(); // How many proxies are available?
var maxBots =
Expand Down
Expand Up @@ -47,7 +47,7 @@
public record ProfileDataStructure(
Map<String, Map<String, JsonElement>> settings,
List<EnabledWrapper<MinecraftAccount>> accounts,
List<SFProxy> proxies) {
List<EnabledWrapper<SFProxy>> proxies) {
private static final Gson PROFILE_GSON =
new GsonBuilder()
.registerTypeHierarchyAdapter(ECPublicKey.class, new ECPublicKeyAdapter())
Expand Down
Expand Up @@ -43,7 +43,7 @@ public record SettingsHolder(
Object2BooleanMap<PropertyKey> booleanProperties,
Object2ObjectMap<PropertyKey, String> stringProperties,
List<EnabledWrapper<MinecraftAccount>> accounts,
List<SFProxy> proxies) {
List<EnabledWrapper<SFProxy>> proxies) {
public static final SettingsHolder EMPTY =
new SettingsHolder(
Object2ObjectMaps.emptyMap(),
Expand All @@ -56,7 +56,7 @@ public static SettingsHolder createSettingsHolder(
ProfileDataStructure settingsSerialized,
Multimap<PropertyKey, Consumer<JsonElement>> listeners,
Consumer<List<EnabledWrapper<MinecraftAccount>>> accountRegistryCallback,
Consumer<List<SFProxy>> proxyRegistryCallback) {
Consumer<List<EnabledWrapper<SFProxy>>> proxyRegistryCallback) {
var numberProperties = new Object2ObjectOpenHashMap<PropertyKey, Number>();
var booleanProperties = new Object2BooleanOpenHashMap<PropertyKey>();
var stringProperties = new Object2ObjectOpenHashMap<PropertyKey, String>();
Expand Down

0 comments on commit 972495a

Please sign in to comment.