From 294647d31fe3bd53e0f277149d71d6e623f05fbf Mon Sep 17 00:00:00 2001 From: m9w Date: Tue, 19 Dec 2023 15:27:53 +0200 Subject: [PATCH] Multiple account feature --- .../darkbot/backpage/BackpageManager.java | 70 ++++++++++- .../github/manolo8/darkbot/config/Config.java | 4 + .../types/suppliers/AccountSupplier.java | 43 +++++++ .../manolo8/darkbot/core/api/GameAPIImpl.java | 12 +- .../darkbot/core/manager/HeroManager.java | 6 + .../darkbot/modules/DisconnectModule.java | 7 +- .../manolo8/darkbot/utils/StartupParams.java | 109 ++++++++++++++---- .../darkbot/utils/login/LoginData.java | 25 ++++ .../darkbot/utils/login/LoginUtils.java | 99 +++++++++------- src/main/resources/lang/strings_en.properties | 4 + 10 files changed, 307 insertions(+), 72 deletions(-) create mode 100644 src/main/java/com/github/manolo8/darkbot/config/types/suppliers/AccountSupplier.java diff --git a/src/main/java/com/github/manolo8/darkbot/backpage/BackpageManager.java b/src/main/java/com/github/manolo8/darkbot/backpage/BackpageManager.java index 8ae0f0faa..61b963ca0 100644 --- a/src/main/java/com/github/manolo8/darkbot/backpage/BackpageManager.java +++ b/src/main/java/com/github/manolo8/darkbot/backpage/BackpageManager.java @@ -2,7 +2,9 @@ import com.github.manolo8.darkbot.Main; import com.github.manolo8.darkbot.core.api.Capability; +import com.github.manolo8.darkbot.core.manager.HeroManager; import com.github.manolo8.darkbot.extensions.plugins.PluginIssue; +import com.github.manolo8.darkbot.modules.DisconnectModule; import com.github.manolo8.darkbot.utils.Time; import com.github.manolo8.darkbot.utils.http.Http; import com.github.manolo8.darkbot.utils.http.Method; @@ -24,6 +26,8 @@ import java.net.URL; import java.time.Instant; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -75,6 +79,20 @@ public BackpageManager(Main main, ConfigAPI configAPI) { setDaemon(true); } + private BackpageManager(LoginData loginData) { + legacyHangarManager = null; + hangarManager = null; + auctionManager = null; + novaManager = null; + main = null; + setLoginData(loginData); + } + + public Collection getAccountIds() { + if(loginData == null || loginData.isEmpty() || !loginData.get().hasAnotherAccounts()) return Collections.emptyList(); + return loginData.get().getAccounts().keySet(); + } + private static String getRandomAction() { return ACTIONS[(int) (Math.random() * ACTIONS.length)]; } @@ -84,6 +102,34 @@ private static String getRandomAction() { public void run() { while (true) { Time.sleep(100); + if(userId != 0 + && main.config.MISCELLANEOUS.LINKED_ACCOUNT_TO_CONFIG != 0 + && userId != main.config.MISCELLANEOUS.LINKED_ACCOUNT_TO_CONFIG + && loginData != null + && loginData.isPresent() + && loginData.get().hasAnotherAccounts() + && loginData.get().getAccounts().containsKey(main.config.MISCELLANEOUS.LINKED_ACCOUNT_TO_CONFIG) + ) { + boolean isRunning = main.isRunning(); + if (isRunning && !(main.getModule() instanceof DisconnectModule)) + main.setModule(new DisconnectModule(-10101L, "Switching account")); + if (!isRunning || main.guiManager.lostConnection.isVisible()) { + main.setRunning(false); + synchronized (main.pluginHandler.getBackgroundLock()) { + main.pluginHandler.updatePlugins(); + loginData.get().switchAccount(main.config.MISCELLANEOUS.LINKED_ACCOUNT_TO_CONFIG); + this.isInvalid(); + Main.API.handleRefresh(); + LoginData targetLoginData = loginData.get().getAccounts().get(main.config.MISCELLANEOUS.LINKED_ACCOUNT_TO_CONFIG); + sidLastUpdate = System.currentTimeMillis(); + sidNextUpdate = targetLoginData.nextUpdate; + sidStatus = targetLoginData.status; + HeroManager.instance.playerInfo.username = ""; + } + if (isRunning) main.setRunning(true); + } + if (main.getModule() instanceof DisconnectModule) continue; + } synchronized (main.pluginHandler.getBackgroundLock()) { for (Task task : tasks) { @@ -113,10 +159,24 @@ public void run() { } this.hangarManager.tick(); - if (System.currentTimeMillis() > sidNextUpdate) { - int waitTime = sidCheck(); - sidLastUpdate = System.currentTimeMillis(); - sidNextUpdate = sidLastUpdate + (int) (waitTime + waitTime * Math.random()); + if (loginData.isPresent()) { + LoginData loginDataInstance = loginData.get(); + + if (System.currentTimeMillis() > sidNextUpdate) { + int waitTime = sidCheck(); + sidLastUpdate = System.currentTimeMillis(); + sidNextUpdate = sidLastUpdate + (int) (waitTime + waitTime * Math.random()); + loginDataInstance.getAccounts().get(userId).nextUpdate = sidNextUpdate; + } + + if (loginDataInstance.hasAnotherAccounts()) + for (LoginData backgroundLoginData : loginDataInstance.getAccounts().values()) + if (System.currentTimeMillis() > backgroundLoginData.nextUpdate) { + BackpageManager backpageManager = new BackpageManager(backgroundLoginData); + int waitTime = backpageManager.sidCheck(); + backgroundLoginData.nextUpdate = System.currentTimeMillis() + (int) (waitTime + waitTime * Math.random()); + backgroundLoginData.status = backpageManager.sidStatus; + } } if (System.currentTimeMillis() > checkDrones) { @@ -178,7 +238,7 @@ private boolean isInvalid() { this.instanceURI = tryParse(this.instance); } } - return sid == null || instance == null || sid.isEmpty() || instance.isEmpty() || this.userId == 0; + return !isInstanceValid(); } private URI tryParse(String uri) { diff --git a/src/main/java/com/github/manolo8/darkbot/config/Config.java b/src/main/java/com/github/manolo8/darkbot/config/Config.java index 9748a1bd5..bcfba8299 100644 --- a/src/main/java/com/github/manolo8/darkbot/config/Config.java +++ b/src/main/java/com/github/manolo8/darkbot/config/Config.java @@ -1,6 +1,7 @@ package com.github.manolo8.darkbot.config; import com.github.manolo8.darkbot.config.actions.Condition; +import com.github.manolo8.darkbot.config.types.suppliers.AccountSupplier; import com.github.manolo8.darkbot.config.types.suppliers.BrowserApi; import com.github.manolo8.darkbot.config.types.suppliers.DisplayFlag; import com.github.manolo8.darkbot.config.types.suppliers.LanguageSupplier; @@ -31,6 +32,7 @@ import eu.darkbot.api.game.items.SelectableItem; import eu.darkbot.api.game.other.GameMap; import eu.darkbot.api.managers.HeroAPI; +import eu.darkbot.shared.config.ProfileNames; import eu.darkbot.shared.modules.LootCollectorModule; import org.jetbrains.annotations.Nullable; @@ -193,6 +195,7 @@ public static class Miscellaneous { public @Option boolean REFRESH_AFTER_REVIVE = false; public @Option @Number(max = 60 * 12, step = 10) int REFRESH_TIME = 60; public @Option @Number(max = 60 * 12, step = 10) int PAUSE_FOR = 0; + public @Option @Dropdown(options = ProfileNames.class) String CONFIG_AFTER_PAUSE; public @Option boolean RESET_REFRESH = true; public @Option boolean SOLVE_BACKPAGE_CAPTCHA = false; public @Option @Visibility(Level.INTERMEDIATE) boolean UPDATE_STATS_WHILE_PAUSED = true; @@ -203,6 +206,7 @@ public static class Miscellaneous { public @Option @Visibility(Level.INTERMEDIATE) boolean AVOID_MINES = true; public @Option @Visibility(Level.INTERMEDIATE) boolean AVOID_RADIATION = true; public @Option @Visibility(Level.INTERMEDIATE) boolean USERNAME_ON_TITLE = false; + public @Option @Visibility(Level.ADVANCED) @Dropdown(options = AccountSupplier.class) int LINKED_ACCOUNT_TO_CONFIG = 0; public @Option @Visibility(Level.ADVANCED) boolean AUTO_REFINE = false; } diff --git a/src/main/java/com/github/manolo8/darkbot/config/types/suppliers/AccountSupplier.java b/src/main/java/com/github/manolo8/darkbot/config/types/suppliers/AccountSupplier.java new file mode 100644 index 000000000..f798b7e1a --- /dev/null +++ b/src/main/java/com/github/manolo8/darkbot/config/types/suppliers/AccountSupplier.java @@ -0,0 +1,43 @@ +package com.github.manolo8.darkbot.config.types.suppliers; + +import com.github.manolo8.darkbot.backpage.BackpageManager; +import com.github.manolo8.darkbot.config.PlayerInfo; +import com.github.manolo8.darkbot.core.manager.HeroManager; +import eu.darkbot.api.config.annotations.Dropdown; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; + +public class AccountSupplier implements Dropdown.Options { + private final BackpageManager backpageManager; + private final HeroManager heroManager; + public AccountSupplier(BackpageManager backpageManager, HeroManager heroManager) { + this.backpageManager = backpageManager; + this.heroManager = heroManager; + } + @Override + public Collection options() { + List ids = new ArrayList<>(); + ids.add(0); + ids.addAll(backpageManager.getAccountIds()); + return ids; + } + + @Override + public @NotNull String getText(@Nullable Integer option) { + if(Integer.valueOf(0).equals(option)) return "(none)"; + PlayerInfo info = heroManager.main.config.PLAYER_INFOS.get(option); + if(info != null) return info.getUsername(); + return Objects.toString(option); + } + + @Override + public @Nullable String getTooltip(@Nullable Integer option) { + if(Integer.valueOf(0).equals(option)) return null; + return "User ID: " + option; + } +} diff --git a/src/main/java/com/github/manolo8/darkbot/core/api/GameAPIImpl.java b/src/main/java/com/github/manolo8/darkbot/core/api/GameAPIImpl.java index cfd15873d..a941b66ce 100644 --- a/src/main/java/com/github/manolo8/darkbot/core/api/GameAPIImpl.java +++ b/src/main/java/com/github/manolo8/darkbot/core/api/GameAPIImpl.java @@ -57,7 +57,7 @@ public class GameAPIImpl< protected final EnumSet capabilities; protected final String version; - + protected final Main main; private final ConfigAPI config; protected final LoginData loginData; // Used only if api supports LOGIN @@ -94,7 +94,7 @@ public GameAPIImpl(StartupParams params, interaction.getVersion() + "i" + direct.getVersion() + "d"; - Main main = HeroManager.instance.main; + main = HeroManager.instance.main; config = main.configHandler; this.loginData = hasCapability(Capability.LOGIN) ? LoginUtils.performUserLogin(params) : null; @@ -133,14 +133,18 @@ protected void tryRelogin() { try { System.out.println("Reloading, updating flash vars/preloader"); - LoginUtils.findPreloader(loginData); + synchronized (main.pluginHandler.getBackgroundLock()) { + LoginUtils.findPreloader(loginData); + } } catch (IOException e) { System.out.println("Failed to find preloader, aborting re-login"); e.printStackTrace(); lastFailedLogin = System.currentTimeMillis(); } catch (LoginUtils.WrongCredentialsException e) { // SID probably expired, time to log in again - performRelogin(); + synchronized (main.pluginHandler.getBackgroundLock()) { + performRelogin(); + } } } diff --git a/src/main/java/com/github/manolo8/darkbot/core/manager/HeroManager.java b/src/main/java/com/github/manolo8/darkbot/core/manager/HeroManager.java index 685a5f8f1..ab2bd7362 100644 --- a/src/main/java/com/github/manolo8/darkbot/core/manager/HeroManager.java +++ b/src/main/java/com/github/manolo8/darkbot/core/manager/HeroManager.java @@ -73,6 +73,7 @@ public class HeroManager extends Player implements Manager, HeroAPI { private long configTime; private long formationTime; private long portalTime; + private int previousId; public HeroManager(Main main, SettingsManager settingsManager, @@ -112,6 +113,11 @@ public void install(BotInstaller botInstaller) { public void tick() { long address = API.readMemoryLong(staticAddress); if (this.address != address) update(address); + if (getId() != previousId) { + playerInfo.username = ""; + playerInfo.clanTag = ""; + previousId = getId(); + } update(); diff --git a/src/main/java/com/github/manolo8/darkbot/modules/DisconnectModule.java b/src/main/java/com/github/manolo8/darkbot/modules/DisconnectModule.java index 9a34ac5e6..9d7d7d90f 100644 --- a/src/main/java/com/github/manolo8/darkbot/modules/DisconnectModule.java +++ b/src/main/java/com/github/manolo8/darkbot/modules/DisconnectModule.java @@ -81,7 +81,12 @@ public void tickStopped() { // Bot done. Pause "forever" (unless a behaviour restarts it). if (pauseTime == null) main.setRunning(false); else if (pauseTime == 0) goBack(); - else { + // -10101 is a magic number for preventing automatic switching config after manual switch while bot was active + else if(pauseTime == -10101L) refreshing = true; + else if (main.config.MISCELLANEOUS.CONFIG_AFTER_PAUSE != null && I18n.get("module.disconnect.reason.break").equals(reason)) { + main.configChange.send(main.config.MISCELLANEOUS.CONFIG_AFTER_PAUSE); + refreshing = true; + } else { pauseUntil = System.currentTimeMillis() + pauseTime; main.setRunning(false); } diff --git a/src/main/java/com/github/manolo8/darkbot/utils/StartupParams.java b/src/main/java/com/github/manolo8/darkbot/utils/StartupParams.java index e963e690e..d77aaebcb 100644 --- a/src/main/java/com/github/manolo8/darkbot/utils/StartupParams.java +++ b/src/main/java/com/github/manolo8/darkbot/utils/StartupParams.java @@ -3,6 +3,7 @@ import com.github.manolo8.darkbot.gui.utils.Strings; import eu.darkbot.api.API; import eu.darkbot.util.function.ThrowingFunction; +import lombok.Getter; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -10,9 +11,12 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Optional; import java.util.Properties; import java.util.stream.Collectors; @@ -139,49 +143,36 @@ private AutoLoginProps(String path) throws IOException { System.out.println("Loaded startup properties file"); } - private String getProperty(PropertyKey key) { - return prop.getProperty(key.toString()); - } - - private void setProperty(PropertyKey key, String val) { - prop.setProperty(key.toString(), val); - } - public String getUsername() { - return getProperty(PropertyKey.USERNAME); + return getAccount().username.orElse(null); } public String getPassword() { - return getProperty(PropertyKey.PASSWORD); + return getAccount().password.orElse(null); } public char[] getMasterPassword() { - String masterPassword = getProperty(PropertyKey.MASTER_PASSWORD); - return masterPassword == null ? null : masterPassword.toCharArray(); + return getAccount().masterPassword.orElse(null); } public String getServer() { - return getProperty(PropertyKey.SERVER); + return getAccount().server.orElse(null); } public String getSID() { - return getProperty(PropertyKey.SID); + return getAccount().sid.orElse(null); } public boolean isAllowStoreSID() { - return Boolean.parseBoolean(getProperty(PropertyKey.ALLOW_STORE_SID)); - } - - public boolean shouldSIDLogin() { - return !Strings.isEmpty(getSID()) && !Strings.isEmpty(getServer()); + return getAccount().allowStore; } public void setServer(String server) { - setProperty(PropertyKey.SERVER, server); + getAccount().setServer(server); } public void setSID(String sid) { - setProperty(PropertyKey.SID, sid); + getAccount().setSid(sid); } public void updateLoginFile() { @@ -191,5 +182,81 @@ public void updateLoginFile() { e.printStackTrace(); } } + + public AccountCredential getAccount() { + return new AccountCredential(null); + } + + public List getAccounts() { + List accounts = new ArrayList<>(); + accounts.add(getAccount()); + + for(int i = 1;; i++) { + AccountCredential account = new AccountCredential(i); + if(!account.isValid()) break; + accounts.add(account); + } + + return accounts; + } + + public class AccountCredential { + @Getter + private Optional username, password, server, sid; + @Getter + private Optional masterPassword; + @Getter + private final boolean allowStore; + + private final String index; + + private AccountCredential(Integer i) { + this.index = i == null ? "" : String.valueOf(i); + this.username = Optional.ofNullable(toNullEmpty(prop.getProperty(PropertyKey.USERNAME + index))); + this.password = Optional.ofNullable(toNullEmpty(prop.getProperty(PropertyKey.PASSWORD + index))); + this.server = Optional.ofNullable(toNullEmpty(prop.getProperty(PropertyKey.SERVER + index))); + this.sid = Optional.ofNullable(toNullEmpty(prop.getProperty(PropertyKey.SID + index))); + this.masterPassword = Optional.ofNullable(toNullEmpty(prop.getProperty(PropertyKey.MASTER_PASSWORD.toString()))).map(String::toCharArray); + this.allowStore = Boolean.parseBoolean(toNullEmpty(prop.getProperty(PropertyKey.ALLOW_STORE_SID.toString()))); + } + + public void setUsername(String username) { + this.username = Optional.ofNullable(toNullEmpty(username)); + prop.setProperty(PropertyKey.USERNAME + index, username); + } + + public void setPassword(String password) { + this.password = Optional.ofNullable(toNullEmpty(password)); + prop.setProperty(PropertyKey.PASSWORD + index, password); + } + + public void setServer(String server) { + this.server = Optional.ofNullable(toNullEmpty(server)); + prop.setProperty(PropertyKey.SERVER + index, server); + } + + public void setSid(String sid) { + this.sid = Optional.ofNullable(toNullEmpty(sid)); + prop.setProperty(PropertyKey.SID + index, sid); + } + + public boolean flush() { + if (!allowStore) return false; + updateLoginFile(); + return true; + } + + public boolean hasServerAndSid() { + return server.isPresent() && sid.isPresent(); + } + + private boolean isValid() { + return username.isPresent() && password.isPresent() || hasServerAndSid(); + } + + private String toNullEmpty(String val) { + return Strings.isEmpty(val) ? null : val; + } + } } } diff --git a/src/main/java/com/github/manolo8/darkbot/utils/login/LoginData.java b/src/main/java/com/github/manolo8/darkbot/utils/login/LoginData.java index dbdbe0325..a48963580 100644 --- a/src/main/java/com/github/manolo8/darkbot/utils/login/LoginData.java +++ b/src/main/java/com/github/manolo8/darkbot/utils/login/LoginData.java @@ -7,12 +7,17 @@ import java.lang.reflect.Type; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; +import java.util.stream.Collectors; public class LoginData { private static final Type PARAMS_TYPE = new TypeToken>() {}.getType(); + @Getter + private transient final Map accounts = new ConcurrentHashMap<>(); private transient BiConsumer onSetSid; private Map params; @@ -20,6 +25,8 @@ public class LoginData { private int userId; @Getter private String username, password, sid, url, fullUrl, preloaderUrl; + public transient long nextUpdate; + public transient int status; public void setCredentials(String username, String password, BiConsumer onSetSid) { this.username = username; @@ -72,4 +79,22 @@ public String toString() { ", params='" + params + '\'' + '}'; } + + public boolean hasAnotherAccounts() { + return accounts != null && accounts.size() > 1; + } + + public void setAccounts(List accounts) { + this.accounts.putAll(accounts.stream().collect(Collectors.toMap(LoginData::getUserId, loginData -> loginData))); + } + + public synchronized void switchAccount(int userId) { + LoginData account = accounts.get(userId); + if (account == null) return; + setCredentials(account.username, account.password, onSetSid); + setSid(account.sid, account.url); + params = account.params; + preloaderUrl = account.preloaderUrl; + this.userId = account.userId; + } } diff --git a/src/main/java/com/github/manolo8/darkbot/utils/login/LoginUtils.java b/src/main/java/com/github/manolo8/darkbot/utils/login/LoginUtils.java index 08e521e90..53b0c042c 100644 --- a/src/main/java/com/github/manolo8/darkbot/utils/login/LoginUtils.java +++ b/src/main/java/com/github/manolo8/darkbot/utils/login/LoginUtils.java @@ -1,8 +1,9 @@ package com.github.manolo8.darkbot.utils.login; +import com.github.manolo8.darkbot.config.UnresolvedPlayer; +import com.github.manolo8.darkbot.core.manager.HeroManager; import com.github.manolo8.darkbot.gui.login.LoginForm; import com.github.manolo8.darkbot.gui.utils.Popups; -import com.github.manolo8.darkbot.gui.utils.Strings; import com.github.manolo8.darkbot.utils.CaptchaAPI; import com.github.manolo8.darkbot.utils.I18n; import com.github.manolo8.darkbot.utils.IOUtils; @@ -23,8 +24,11 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.security.GeneralSecurityException; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -59,51 +63,64 @@ public static LoginData performUserLogin(StartupParams params) { } public static LoginData performAutoLogin(StartupParams.AutoLoginProps params) { - String password = params.getPassword(); - if (!params.shouldSIDLogin() && params.getUsername() != null && Strings.isEmpty(password)) { - password = getPassword(params.getUsername(), params.getMasterPassword()); - - if (password == null) - System.err.println("Password for user couldn't be retrieved. Check that the user exists and master password is correct."); - } - - if (!params.shouldSIDLogin() && (params.getUsername() == null || Strings.isEmpty(password))) { - System.err.println("Credentials file requires username & either a password or a master password, or/and server & sid"); - System.exit(-1); - } - - LoginData loginData = new LoginData(); - loginData.setCredentials(params.getUsername(), password, null); + List loginDataList = new ArrayList<>(); + for(StartupParams.AutoLoginProps.AccountCredential account : params.getAccounts()) { + LoginData loginData = new LoginData(); + + Optional password = account.getPassword(); + if (account.getUsername().isPresent() && password.isEmpty()) { + password = Optional.ofNullable(getPassword(account.getUsername().get(), account.getMasterPassword().orElse(null))); + if (password.isEmpty()) + System.err.println("Password for user couldn't be retrieved. Check that the user exists and master password is correct."); + } - System.out.println("Auto logging in using " + (params.shouldSIDLogin() ? "server & SID" : "user & password") + " (1/2)"); - try { - if (params.shouldSIDLogin()) loginData.setSid(params.getSID(), params.getServer() + ".darkorbit.com"); - else usernameLogin(loginData); - System.out.println("Loading spacemap (2/2)"); - findPreloader(loginData); - } catch (IOException e) { - System.err.println("IOException trying to perform auto login, servers may be down"); - e.printStackTrace(); - } catch (WrongCredentialsException e) { - if (params.shouldSIDLogin()) { - System.err.println("Expired SID in login properties file, attempting re-connect with user & pass"); - params.setSID(""); - return performAutoLogin(params); + if (!account.hasServerAndSid() && (account.getUsername().isEmpty() || password.isEmpty())) { + System.err.println("Credentials file requires username & either a password or a master password, or/and server & sid"); + System.exit(-1); } - System.err.println("Wrong credentials, check your username and password"); - } - if (loginData.isNotInitialized()) { - System.err.println("Could not find preloader url or parameters, exiting bot."); - System.exit(-1); - } + loginData.setCredentials(account.getUsername().orElse(null), password.orElse(null), null); + + int repeat = 0; + do { + repeat = -repeat; + System.out.println("Auto logging in using " + (account.hasServerAndSid() ? "server & SID" : "user & password") + " (1/2)"); + + try { + if (account.getSid().isPresent() && account.getServer().isPresent()) + loginData.setSid(account.getSid().get(), account.getServer().get() + ".darkorbit.com"); + else usernameLogin(loginData); + System.out.println("Loading spacemap (2/2)"); + findPreloader(loginData); + HeroManager.instance.main.config.UNRESOLVED.add(new UnresolvedPlayer(loginData.getUserId())); + } catch (IOException e) { + System.err.println("IOException trying to perform auto login, servers may be down"); + e.printStackTrace(); + } catch (WrongCredentialsException e) { + if (account.hasServerAndSid()) { + System.err.println("Expired SID in login properties file, attempting re-connect with user & pass"); + account.setSid(""); + repeat++; + } + System.err.println("Wrong credentials, check your username and password"); + } + } while (repeat == 1); + + if (loginData.isNotInitialized()) { + System.err.println("Could not find preloader url or parameters, exiting bot."); + System.exit(-1); + } - if (!params.shouldSIDLogin() && params.isAllowStoreSID()) { - params.setServer(loginData.getUrl().split("\\.")[0]); - params.setSID(loginData.getSid()); - params.updateLoginFile(); + if (!account.hasServerAndSid() && account.isAllowStore()) { + account.setServer(loginData.getUrl().split("\\.")[0]); + account.setSid(loginData.getSid()); + account.flush(); + } + loginDataList.add(loginData); } - + LoginData loginData = new LoginData(); + loginData.setAccounts(loginDataList); + loginData.switchAccount(loginDataList.get(0).getUserId()); return loginData; } diff --git a/src/main/resources/lang/strings_en.properties b/src/main/resources/lang/strings_en.properties index 040cac623..4afc08a2c 100644 --- a/src/main/resources/lang/strings_en.properties +++ b/src/main/resources/lang/strings_en.properties @@ -201,6 +201,8 @@ config.miscellaneous.refresh_time=Refresh every config.miscellaneous.refresh_time.desc=Every how many minutes to refresh config.miscellaneous.pause_for=Pause after refresh config.miscellaneous.pause_for.desc=How many minutes to pause for after a refresh +config.miscellaneous.config_after_pause=Config profile after pause +config.miscellaneous.CONFIG_AFTER_PAUSE.desc=Target config profile after pause (Pause after refresh should have positive value) config.miscellaneous.reset_refresh=Reset refresh time on pause/start config.miscellaneous.reset_refresh.desc=If refresh time should be reset or should continue config.miscellaneous.solve_backpage_captcha=Solve Captcha for Backpage @@ -219,6 +221,8 @@ config.miscellaneous.avoid_radiation=Avoid radiation config.miscellaneous.avoid_radiation.desc=Bot will avoid entering the radiation zone. Disable only if you are well aware of what you are doing config.miscellaneous.username_on_title=Add username to application title config.miscellaneous.username_on_title.desc=Adds your in-game name to application title e.g. visibility on task manager +config.miscellaneous.linked_account_to_config=Linked account +config.miscellaneous.LINKED_ACCOUNT_TO_CONFIG.desc=Switching to account when config profile is selected (if it is available) config.miscellaneous.auto_refine=Auto refine (API-specific) config.miscellaneous.auto_refine.desc=Automatically refine raw materials in ship.\nNOTE: only DarkHook (experimental) & DarkTanos (linux) APIs include support.