diff --git a/http-service/pom.xml b/http-service/pom.xml index bb5f1a4c4a..b58c202a79 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -101,6 +101,11 @@ minio 3.0.6 + + redis.clients + jedis + 2.10.0 + org.springframework.boot diff --git a/http-service/src/main/java/net/runelite/http/service/SpringBootWebApplication.java b/http-service/src/main/java/net/runelite/http/service/SpringBootWebApplication.java index 1ec97c0e0c..73aae1c360 100644 --- a/http-service/src/main/java/net/runelite/http/service/SpringBootWebApplication.java +++ b/http-service/src/main/java/net/runelite/http/service/SpringBootWebApplication.java @@ -39,6 +39,7 @@ import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.service.util.InstantConverter; import okhttp3.Cache; import okhttp3.OkHttpClient; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; @@ -48,12 +49,16 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.sql2o.Sql2o; import org.sql2o.converters.Converter; import org.sql2o.quirks.NoQuirks; +import redis.clients.jedis.Jedis; @SpringBootApplication @EnableScheduling @Slf4j public class SpringBootWebApplication extends SpringBootServletInitializer { + @Value("${redis.host:localhost}") + private String redisHost; + @Bean protected ServletContextListener listener() { @@ -124,6 +129,12 @@ public class SpringBootWebApplication extends SpringBootServletInitializer return new Sql2o(dataSource, new NoQuirks(converters)); } + @Bean + Jedis jedis() + { + return new Jedis(redisHost); + } + @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { diff --git a/http-service/src/main/java/net/runelite/http/service/account/AccountService.java b/http-service/src/main/java/net/runelite/http/service/account/AccountService.java index 5553a345f0..99ca9e2c54 100644 --- a/http-service/src/main/java/net/runelite/http/service/account/AccountService.java +++ b/http-service/src/main/java/net/runelite/http/service/account/AccountService.java @@ -39,6 +39,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.account.OAuthResponse; +import net.runelite.http.api.ws.WebsocketGsonFactory; +import net.runelite.http.api.ws.WebsocketMessage; import net.runelite.http.api.ws.messages.LoginResponse; import net.runelite.http.service.account.beans.SessionEntry; import net.runelite.http.service.account.beans.UserEntry; @@ -55,6 +57,7 @@ import org.springframework.web.bind.annotation.RestController; import org.sql2o.Connection; import org.sql2o.Sql2o; import org.sql2o.Sql2oException; +import redis.clients.jedis.Jedis; @RestController @RequestMapping("/account") @@ -88,24 +91,28 @@ public class AccountService private static final String RL_REDIR = "http://runelite.net/logged-in"; private final Gson gson = RuneLiteAPI.GSON; + private final Gson websocketGson = WebsocketGsonFactory.build(); private final Sql2o sql2o; private final String oauthClientId; private final String oauthClientSecret; private final AuthFilter auth; + private final Jedis jedis; @Autowired public AccountService( @Qualifier("Runelite SQL2O") Sql2o sql2o, @Value("${oauth.client-id}") String oauthClientId, @Value("${oauth.client-secret}") String oauthClientSecret, - AuthFilter auth + AuthFilter auth, + Jedis jedis ) { this.sql2o = sql2o; this.oauthClientId = oauthClientId; this.oauthClientSecret = oauthClientSecret; this.auth = auth; + this.jedis = jedis; try (Connection con = sql2o.open()) { @@ -232,17 +239,16 @@ public class AccountService private void notifySession(UUID uuid, String username) { - WSService service = SessionManager.findSession(uuid); - if (service == null) - { - logger.info("Session {} logged in - but no websocket session", uuid); - return; - } - LoginResponse response = new LoginResponse(); response.setUsername(username); - service.send(response); + WSService service = SessionManager.findSession(uuid); + if (service != null) + { + service.send(response); + } + + jedis.publish("session." + uuid, websocketGson.toJson(response, WebsocketMessage.class)); } @RequestMapping("/logout")