Skip to content

Commit

Permalink
Remake account and proxy internal structure
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexProgrammerDE committed Mar 15, 2024
1 parent 8c226c6 commit 66391ac
Show file tree
Hide file tree
Showing 7 changed files with 94 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,11 @@ public boolean isCellEditable(int row, int column) {
() -> {
model.getDataVector().removeAllElements();

var accounts = accountRegistry.getAccounts();
var registrySize = accounts.size();
var dataVector = new Object[registrySize][];
for (var i = 0; i < registrySize; i++) {
var account = accounts.get(i);

dataVector[i] =
var accounts = accountRegistry.accounts();
var dataVector = new Object[accounts.size()][];
var i = 0;
for (var account : accounts) {
dataVector[i++] =
new Object[] {
account.value().lastKnownName(),
account.value().profileId(),
Expand Down Expand Up @@ -118,7 +116,7 @@ public boolean isCellEditable(int row, int column) {
var authType = (AuthType) row[2];
var enabled = (boolean) row[3];

var account = accountRegistry.getAccount(username, authType);
var account = accountRegistry.getAccount(profileId).orElseThrow();

accounts.add(
new EnabledWrapper<>(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,11 @@ public Class<?> getColumnClass(int columnIndex) {
() -> {
model.getDataVector().removeAllElements();

var proxies = proxyRegistry.getProxies();
var registrySize = proxies.size();
var dataVector = new Object[registrySize][];
for (var i = 0; i < registrySize; i++) {
var proxy = proxies.get(i);

dataVector[i] =
var proxies = proxyRegistry.proxies();
var dataVector = new Object[proxies.size()][];
var i = 0;
for (var proxy : proxies) {
dataVector[i++] =
new Object[] {
proxy.value().host(),
proxy.value().port(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,45 @@
import com.soulfiremc.settings.account.MinecraftAccount;
import com.soulfiremc.settings.proxy.SFProxy;
import com.soulfiremc.util.EnabledWrapper;
import it.unimi.dsi.fastutil.Hash;
import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenCustomHashSet;
import it.unimi.dsi.fastutil.objects.ObjectSortedSet;
import it.unimi.dsi.fastutil.objects.ObjectSortedSets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.function.Predicate;
import javax.inject.Inject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RequiredArgsConstructor(onConstructor_ = @Inject)
public class AccountRegistry {
private final List<EnabledWrapper<MinecraftAccount>> accounts = new ArrayList<>();
private final ObjectSortedSet<EnabledWrapper<MinecraftAccount>> accounts =
new ObjectLinkedOpenCustomHashSet<>(
new Hash.Strategy<>() {
@Override
public int hashCode(EnabledWrapper<MinecraftAccount> obj) {
if (obj == null) {
return 0;
}

return obj.value().profileId().hashCode();
}

@Override
public boolean equals(
EnabledWrapper<MinecraftAccount> obj1, EnabledWrapper<MinecraftAccount> obj2) {
if (obj1 == null || obj2 == null) {
return false;
}

return obj1.value().profileId().equals(obj2.value().profileId());
}
});
private final List<Runnable> loadHooks = new ArrayList<>();
private final RPCClient rpcClient;

Expand All @@ -43,10 +71,10 @@ public void loadFromString(String data, AuthType authType, SFProxy proxy) {
var newAccounts =
data.lines()
.map(String::strip)
.filter(line -> !line.isBlank())
.filter(Predicate.not(String::isBlank))
.distinct()
.map(account -> fromStringSingle(account, authType, proxy))
.map(account -> new EnabledWrapper<>(true, account))
.map(EnabledWrapper::defaultTrue)
.toList();

if (newAccounts.isEmpty()) {
Expand All @@ -64,12 +92,6 @@ public void loadFromString(String data, AuthType authType, SFProxy proxy) {
}

private MinecraftAccount fromStringSingle(String data, AuthType authType, SFProxy proxy) {
data = data.trim();

if (data.isBlank()) {
throw new IllegalArgumentException("Account cannot be empty!");
}

try {
var request =
AuthRequest.newBuilder()
Expand All @@ -88,8 +110,8 @@ private MinecraftAccount fromStringSingle(String data, AuthType authType, SFProx
}
}

public List<EnabledWrapper<MinecraftAccount>> getAccounts() {
return Collections.unmodifiableList(accounts);
public Collection<EnabledWrapper<MinecraftAccount>> accounts() {
return ObjectSortedSets.unmodifiable(accounts);
}

public void setAccounts(List<EnabledWrapper<MinecraftAccount>> accounts) {
Expand All @@ -105,12 +127,10 @@ public void addLoadHook(Runnable hook) {
loadHooks.add(hook);
}

public MinecraftAccount getAccount(String username, AuthType authType) {
public Optional<MinecraftAccount> getAccount(UUID profileId) {
return accounts.stream()
.map(EnabledWrapper::value)
.filter(account -> account.authType() == authType)
.filter(account -> account.lastKnownName().equals(username))
.findFirst()
.orElse(null);
.filter(account -> account.profileId().equals(profileId))
.findFirst();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public String exportSettings() {
}

return new ProfileDataStructure(
settingsData, accountRegistry.getAccounts(), proxyRegistry.getProxies())
settingsData, accountRegistry.accounts().stream().toList(), proxyRegistry.proxies().stream().toList())
.serialize();
}

Expand Down Expand Up @@ -157,13 +157,13 @@ public AttackStartRequest exportSettingsProto() {
return AttackStartRequest.newBuilder()
.addAllSettings(namespaces)
.addAllAccounts(
accountRegistry.getAccounts().stream()
accountRegistry.accounts().stream()
.filter(EnabledWrapper::enabled)
.map(EnabledWrapper::value)
.map(MinecraftAccount::toProto)
.toList())
.addAllProxies(
proxyRegistry.getProxies().stream()
proxyRegistry.proxies().stream()
.filter(EnabledWrapper::enabled)
.map(EnabledWrapper::value)
.map(SFProxy::toProto)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,50 @@

import com.soulfiremc.settings.proxy.SFProxy;
import com.soulfiremc.util.EnabledWrapper;
import it.unimi.dsi.fastutil.Hash;
import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenCustomHashSet;
import it.unimi.dsi.fastutil.objects.ObjectSortedSet;
import it.unimi.dsi.fastutil.objects.ObjectSortedSets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Collection;
import java.util.List;
import java.util.function.Predicate;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RequiredArgsConstructor
public class ProxyRegistry {
private final List<EnabledWrapper<SFProxy>> proxies = new ArrayList<>();
private final ObjectSortedSet<EnabledWrapper<SFProxy>> proxies = new ObjectLinkedOpenCustomHashSet<>(new Hash.Strategy<>() {
@Override
public int hashCode(EnabledWrapper<SFProxy> obj) {
if (obj == null) {
return 0;
}

return obj.value().hashCode();
}

@Override
public boolean equals(EnabledWrapper<SFProxy> obj1, EnabledWrapper<SFProxy> obj2) {
if (obj1 == null || obj2 == null) {
return false;
}

return obj1.value().equals(obj2.value());
}
});
private final List<Runnable> loadHooks = new ArrayList<>();

public void loadFromString(String data, ProxyParser proxyParser) {
try {
var newProxies =
data.lines()
.map(String::strip)
.filter(line -> !line.isBlank())
.filter(Predicate.not(String::isBlank))
.distinct()
.map(line -> fromStringSingle(line, proxyParser))
.map(proxyParser::parse)
.map(EnabledWrapper::defaultTrue)
.toList();

if (newProxies.isEmpty()) {
Expand All @@ -55,12 +79,8 @@ public void loadFromString(String data, ProxyParser proxyParser) {
}
}

private EnabledWrapper<SFProxy> fromStringSingle(String data, ProxyParser proxyParser) {
return new EnabledWrapper<>(true, proxyParser.parse(data));
}

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

public void setProxies(List<EnabledWrapper<SFProxy>> proxies) {
Expand Down
12 changes: 8 additions & 4 deletions common/src/main/java/com/soulfiremc/settings/proxy/SFProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,16 @@ public record SFProxy(
public SFProxy {
if (type == ProxyType.SOCKS4 && password != null) {
throw new IllegalArgumentException("SOCKS4 does not support passwords!");
} else if (username == null && password != null) {
throw new IllegalArgumentException("Username must be set if password is set!");
} else if (username != null && username.isBlank()) {
throw new IllegalArgumentException("Username must not be blank! (Should be null)");
// Sanitize empty strings
username = null;
} else if (password != null && password.isBlank()) {
throw new IllegalArgumentException("Password must not be blank! (Should be null)");
// Sanitize empty strings
password = null;
}

if (username == null && password != null) {
throw new IllegalArgumentException("Username must be set if password is set!");
}
}

Expand Down
6 changes: 5 additions & 1 deletion common/src/main/java/com/soulfiremc/util/EnabledWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,8 @@
*/
package com.soulfiremc.util;

public record EnabledWrapper<T>(boolean enabled, T value) {}
public record EnabledWrapper<T>(boolean enabled, T value) {
public static <T> EnabledWrapper<T> defaultTrue(T value) {
return new EnabledWrapper<>(true, value);
}
}

0 comments on commit 66391ac

Please sign in to comment.