Extract session-related logic to SessionManager

- Extract runelite session related logic from RuneLite to SessionManager
class and expose this as Guice service
- Move WSClient to account package

Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
This commit is contained in:
Tomas Slusny
2017-12-24 03:09:59 +01:00
parent 82ee4a0036
commit 984ebb63dd
5 changed files with 196 additions and 142 deletions

View File

@@ -26,7 +26,6 @@ package net.runelite.client;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.eventbus.EventBus; import com.google.common.eventbus.EventBus;
import com.google.gson.Gson;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Injector; import com.google.inject.Injector;
@@ -38,10 +37,7 @@ import java.awt.TrayIcon;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL; import java.net.URL;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
@@ -57,16 +53,13 @@ import joptsimple.OptionSet;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.Query; import net.runelite.api.Query;
import net.runelite.client.account.AccountSession; import net.runelite.client.account.SessionManager;
import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.events.SessionClose;
import net.runelite.client.events.SessionOpen;
import net.runelite.client.menus.MenuManager; import net.runelite.client.menus.MenuManager;
import net.runelite.client.plugins.PluginManager; import net.runelite.client.plugins.PluginManager;
import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.ClientUI;
import net.runelite.client.ui.overlay.OverlayRenderer; import net.runelite.client.ui.overlay.OverlayRenderer;
import net.runelite.http.api.account.AccountClient;
import org.pushingpixels.substance.api.skin.SubstanceGraphiteLookAndFeel; import org.pushingpixels.substance.api.skin.SubstanceGraphiteLookAndFeel;
@Singleton @Singleton
@@ -75,7 +68,6 @@ public class RuneLite
{ {
public static final File RUNELITE_DIR = new File(System.getProperty("user.home"), ".runelite"); public static final File RUNELITE_DIR = new File(System.getProperty("user.home"), ".runelite");
public static final File PROFILES_DIR = new File(RUNELITE_DIR, "profiles"); public static final File PROFILES_DIR = new File(RUNELITE_DIR, "profiles");
public static final File SESSION_FILE = new File(RUNELITE_DIR, "session");
public static final File PLUGIN_DIR = new File(RUNELITE_DIR, "plugins"); public static final File PLUGIN_DIR = new File(RUNELITE_DIR, "plugins");
public static Image ICON; public static Image ICON;
@@ -113,9 +105,8 @@ public class RuneLite
@Inject @Inject
private OverlayRenderer overlayRenderer; private OverlayRenderer overlayRenderer;
private WSClient wsclient; @Inject
private SessionManager sessionManager;
private AccountSession accountSession;
Notifier notifier; Notifier notifier;
@@ -199,7 +190,7 @@ public class RuneLite
pluginManager.startCorePlugins(); pluginManager.startCorePlugins();
// Load the session, including saved configuration // Load the session, including saved configuration
loadSession(); sessionManager.loadSession();
// Begin watching for new plugins // Begin watching for new plugins
pluginManager.watch(); pluginManager.watch();
@@ -251,118 +242,6 @@ public class RuneLite
}); });
} }
private void loadSession()
{
if (!SESSION_FILE.exists())
{
log.info("No session file exists");
return;
}
AccountSession session;
try (FileInputStream in = new FileInputStream(SESSION_FILE))
{
session = new Gson().fromJson(new InputStreamReader(in), AccountSession.class);
log.debug("Loaded session for {}", session.getUsername());
}
catch (Exception ex)
{
log.warn("Unable to load session file", ex);
return;
}
// Check if session is still valid
AccountClient accountClient = new AccountClient(session.getUuid());
if (!accountClient.sesssionCheck())
{
log.debug("Loaded session {} is invalid", session.getUuid());
return;
}
openSession(session);
}
public void saveSession()
{
if (accountSession == null)
{
return;
}
try (FileWriter fw = new FileWriter(SESSION_FILE))
{
new Gson().toJson(accountSession, fw);
log.debug("Saved session to {}", SESSION_FILE);
}
catch (IOException ex)
{
log.warn("Unable to save session file", ex);
}
}
public void deleteSession()
{
SESSION_FILE.delete();
}
/**
* Set the given session as the active session and open a socket to the
* server with the given session
*
* @param session
*/
public void openSession(AccountSession session)
{
// If the ws session already exists, don't need to do anything
if (wsclient == null || !wsclient.getSession().equals(session))
{
if (wsclient != null)
{
wsclient.close();
}
wsclient = new WSClient(eventBus, executor, session);
wsclient.connect();
}
accountSession = session;
if (session.getUsername() != null)
{
// Initialize config for new session
// If the session isn't logged in yet, don't switch to the new config
configManager.switchSession(session);
}
eventBus.post(new SessionOpen());
}
public void closeSession()
{
if (wsclient != null)
{
wsclient.close();
wsclient = null;
}
if (accountSession == null)
{
return;
}
log.debug("Logging out of account {}", accountSession.getUsername());
accountSession = null; // No more account
// Restore config
configManager.switchSession(null);
eventBus.post(new SessionClose());
}
public Client getClient() public Client getClient()
{ {
return client; return client;
@@ -408,11 +287,6 @@ public class RuneLite
return trayIcon; return trayIcon;
} }
public AccountSession getAccountSession()
{
return accountSession;
}
public <T> T[] runQuery(Query query) public <T> T[] runQuery(Query query)
{ {
return (T[]) query.result(client); return (T[]) query.result(client);

View File

@@ -33,6 +33,7 @@ import java.util.concurrent.ScheduledExecutorService;
import javax.inject.Singleton; import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.client.account.SessionManager;
import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.config.RuneliteConfig; import net.runelite.client.config.RuneliteConfig;
@@ -57,6 +58,7 @@ public class RuneliteModule extends AbstractModule
bind(Scheduler.class); bind(Scheduler.class);
bind(PluginManager.class); bind(PluginManager.class);
bind(RuneliteProperties.class); bind(RuneliteProperties.class);
bind(SessionManager.class);
} }
@Provides @Provides

View File

@@ -0,0 +1,175 @@
/*
* Copyright (c) 2017, Adam <Adam@sigterm.info>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.account;
import com.google.common.eventbus.EventBus;
import com.google.gson.Gson;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.ScheduledExecutorService;
import javax.inject.Inject;
import javax.inject.Singleton;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import net.runelite.client.RuneLite;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.events.SessionClose;
import net.runelite.client.events.SessionOpen;
import net.runelite.http.api.account.AccountClient;
@Singleton
@Slf4j
public class SessionManager
{
private static final File SESSION_FILE = new File(RuneLite.RUNELITE_DIR, "session");
private WSClient wsclient;
@Getter
private AccountSession accountSession;
@Inject
private EventBus eventBus;
@Inject
private ConfigManager configManager;
@Inject
private ScheduledExecutorService executor;
public void loadSession()
{
if (!SESSION_FILE.exists())
{
log.info("No session file exists");
return;
}
AccountSession session;
try (FileInputStream in = new FileInputStream(SESSION_FILE))
{
session = new Gson().fromJson(new InputStreamReader(in), AccountSession.class);
log.debug("Loaded session for {}", session.getUsername());
}
catch (Exception ex)
{
log.warn("Unable to load session file", ex);
return;
}
// Check if session is still valid
AccountClient accountClient = new AccountClient(session.getUuid());
if (!accountClient.sesssionCheck())
{
log.debug("Loaded session {} is invalid", session.getUuid());
return;
}
openSession(session);
}
public void saveSession()
{
if (accountSession == null)
{
return;
}
try (FileWriter fw = new FileWriter(SESSION_FILE))
{
new Gson().toJson(accountSession, fw);
log.debug("Saved session to {}", SESSION_FILE);
}
catch (IOException ex)
{
log.warn("Unable to save session file", ex);
}
}
public void deleteSession()
{
SESSION_FILE.delete();
}
/**
* Set the given session as the active session and open a socket to the
* server with the given session
*
* @param session
*/
public void openSession(AccountSession session)
{
// If the ws session already exists, don't need to do anything
if (wsclient == null || !wsclient.getSession().equals(session))
{
if (wsclient != null)
{
wsclient.close();
}
wsclient = new WSClient(eventBus, executor, session);
wsclient.connect();
}
accountSession = session;
if (session.getUsername() != null)
{
// Initialize config for new session
// If the session isn't logged in yet, don't switch to the new config
configManager.switchSession(session);
}
eventBus.post(new SessionOpen());
}
public void closeSession()
{
if (wsclient != null)
{
wsclient.close();
wsclient = null;
}
if (accountSession == null)
{
return;
}
log.debug("Logging out of account {}", accountSession.getUsername());
accountSession = null; // No more account
// Restore config
configManager.switchSession(null);
eventBus.post(new SessionClose());
}
}

View File

@@ -22,7 +22,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
package net.runelite.client; package net.runelite.client.account;
import com.google.common.eventbus.EventBus; import com.google.common.eventbus.EventBus;
import com.google.gson.Gson; import com.google.gson.Gson;
@@ -32,12 +32,11 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.client.account.AccountSession;
import net.runelite.http.api.RuneliteAPI; import net.runelite.http.api.RuneliteAPI;
import net.runelite.http.api.ws.messages.Handshake;
import net.runelite.http.api.ws.messages.Ping;
import net.runelite.http.api.ws.WebsocketGsonFactory; import net.runelite.http.api.ws.WebsocketGsonFactory;
import net.runelite.http.api.ws.WebsocketMessage; import net.runelite.http.api.ws.WebsocketMessage;
import net.runelite.http.api.ws.messages.Handshake;
import net.runelite.http.api.ws.messages.Ping;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;

View File

@@ -37,6 +37,7 @@ import javax.inject.Inject;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.client.RuneLite; import net.runelite.client.RuneLite;
import net.runelite.client.account.AccountSession; import net.runelite.client.account.AccountSession;
import net.runelite.client.account.SessionManager;
import net.runelite.client.events.SessionClose; import net.runelite.client.events.SessionClose;
import net.runelite.client.events.SessionOpen; import net.runelite.client.events.SessionOpen;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
@@ -58,6 +59,9 @@ public class AccountPlugin extends Plugin
@Inject @Inject
RuneLite runelite; RuneLite runelite;
@Inject
SessionManager sessionManager;
@Inject @Inject
ClientUI ui; ClientUI ui;
@@ -87,7 +91,7 @@ public class AccountPlugin extends Plugin
private void logoutClick(ActionEvent ae) private void logoutClick(ActionEvent ae)
{ {
// Destroy session // Destroy session
AccountSession session = runelite.getAccountSession(); AccountSession session = sessionManager.getAccountSession();
if (session != null) if (session != null)
{ {
AccountClient client = new AccountClient(session.getUuid()); AccountClient client = new AccountClient(session.getUuid());
@@ -101,8 +105,8 @@ public class AccountPlugin extends Plugin
} }
} }
runelite.closeSession(); // remove session from client sessionManager.closeSession(); // remove session from client
runelite.deleteSession(); // delete saved session file sessionManager.deleteSession(); // delete saved session file
// Replace logout nav button with login // Replace logout nav button with login
PluginToolbar navigationPanel = ui.getPluginToolbar(); PluginToolbar navigationPanel = ui.getPluginToolbar();
@@ -129,7 +133,7 @@ public class AccountPlugin extends Plugin
session.setUuid(login.getUid()); session.setUuid(login.getUid());
session.setCreated(Instant.now()); session.setCreated(Instant.now());
runelite.openSession(session); sessionManager.openSession(session);
if (!Desktop.isDesktopSupported()) if (!Desktop.isDesktopSupported())
{ {
@@ -161,21 +165,21 @@ public class AccountPlugin extends Plugin
{ {
log.debug("Now logged in as {}", loginResponse.getUsername()); log.debug("Now logged in as {}", loginResponse.getUsername());
AccountSession session = runelite.getAccountSession(); AccountSession session = sessionManager.getAccountSession();
session.setUsername(loginResponse.getUsername()); session.setUsername(loginResponse.getUsername());
// Open session, again, now that we have a username // Open session, again, now that we have a username
// This triggers onSessionOpen // This triggers onSessionOpen
runelite.openSession(session); sessionManager.openSession(session);
// Save session to disk // Save session to disk
runelite.saveSession(); sessionManager.saveSession();
} }
@Subscribe @Subscribe
public void onSessionOpen(SessionOpen sessionOpen) public void onSessionOpen(SessionOpen sessionOpen)
{ {
AccountSession session = runelite.getAccountSession(); AccountSession session = sessionManager.getAccountSession();
if (session.getUsername() == null) if (session.getUsername() == null)
{ {