diff --git a/http-api/src/main/java/net/runelite/http/api/RuneliteAPI.java b/http-api/src/main/java/net/runelite/http/api/RuneliteAPI.java
index f0ef14cf92..4f193d08a9 100644
--- a/http-api/src/main/java/net/runelite/http/api/RuneliteAPI.java
+++ b/http-api/src/main/java/net/runelite/http/api/RuneliteAPI.java
@@ -36,6 +36,7 @@ public class RuneliteAPI
private static final Logger logger = LoggerFactory.getLogger(RuneliteAPI.class);
private static final String BASE = "https://api.runelite.net/runelite-";
+ private static final String WSBASE = "wss://api.runelite.net/runelite-";
private static final Properties properties = new Properties();
private static String version;
private static int rsVersion;
@@ -61,6 +62,11 @@ public class RuneliteAPI
return HttpUrl.parse(BASE + getVersion());
}
+ public static String getWsEndpoint()
+ {
+ return WSBASE + getVersion() + "/ws";
+ }
+
public static String getVersion()
{
return version;
diff --git a/http-service/pom.xml b/http-service/pom.xml
index fa022baa33..9cacf2fcca 100644
--- a/http-service/pom.xml
+++ b/http-service/pom.xml
@@ -52,6 +52,12 @@
3.1.0
provided
+
+ javax.websocket
+ javax.websocket-api
+ 1.1
+ provided
+
com.sparkjava
diff --git a/http-service/src/main/java/net/runelite/http/service/WSService.java b/http-service/src/main/java/net/runelite/http/service/WSService.java
new file mode 100644
index 0000000000..7dc476f516
--- /dev/null
+++ b/http-service/src/main/java/net/runelite/http/service/WSService.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2017, Adam
+ * 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.http.service;
+
+import javax.websocket.CloseReason;
+import javax.websocket.EndpointConfig;
+import javax.websocket.OnClose;
+import javax.websocket.OnError;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@ServerEndpoint("/ws")
+public class WSService
+{
+ private static final Logger logger = LoggerFactory.getLogger(WSService.class);
+
+ @OnOpen
+ public void onOpen(Session session, EndpointConfig config)
+ {
+ logger.info("New session {}", session);
+ }
+
+ @OnClose
+ public void onClose(Session session, CloseReason resaon)
+ {
+ logger.info("Close session {}", session);
+ }
+
+ @OnError
+ public void onError(Session session, Throwable ex)
+ {
+ logger.warn("Error in session {}", session, ex);
+ }
+
+ @OnMessage
+ public void onMessage(Session session, String message)
+ {
+ logger.info("Got message: {}", message);
+ }
+}
diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java
index 2f08e48c4a..fa5530edd7 100644
--- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java
+++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java
@@ -65,6 +65,7 @@ public class RuneLite
private OverlayRenderer renderer;
private EventBus eventBus = new EventBus(this::eventExceptionHandler);
private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(4);
+ private final WSClient wsclient = new WSClient();
static
{
diff --git a/runelite-client/src/main/java/net/runelite/client/WSClient.java b/runelite-client/src/main/java/net/runelite/client/WSClient.java
new file mode 100644
index 0000000000..f3777f7398
--- /dev/null
+++ b/runelite-client/src/main/java/net/runelite/client/WSClient.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2017, Adam
+ * 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;
+
+import net.runelite.http.api.RuneliteAPI;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.WebSocket;
+import okhttp3.WebSocketListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WSClient extends WebSocketListener implements AutoCloseable
+{
+ private static final Logger logger = LoggerFactory.getLogger(WSClient.class);
+
+ private final OkHttpClient client = new OkHttpClient();
+
+ private WebSocket webSocket;
+
+ public WSClient()
+ {
+ connect();
+ }
+
+ private void connect()
+ {
+ Request request = new Request.Builder()
+ .url(RuneliteAPI.getWsEndpoint())
+ .build();
+
+ webSocket = client.newWebSocket(request, this);
+ }
+
+ @Override
+ public void close()
+ {
+ webSocket.close(0, null);
+ }
+
+ @Override
+ public void onOpen(WebSocket webSocket, Response response)
+ {
+ logger.info("Websocket {} opened", webSocket);
+
+ webSocket.send("Hello");
+ }
+
+ @Override
+ public void onMessage(WebSocket webSocket, String text)
+ {
+ logger.debug("Got message: {}", text);
+ }
+
+ @Override
+ public void onClosed(WebSocket webSocket, int code, String reason)
+ {
+ logger.info("Websocket {} closed: {}/{}", webSocket, code, reason);
+ this.webSocket = null;
+ }
+
+ @Override
+ public void onFailure(WebSocket webSocket, Throwable t, Response response)
+ {
+ logger.warn("Error in websocket", t);
+ this.webSocket = null;
+ }
+}