From a28824fc3d5c800a258aaa4dd027e93b7b0d48a6 Mon Sep 17 00:00:00 2001 From: Tim Speckhals Date: Sat, 1 Dec 2018 02:12:48 +0100 Subject: [PATCH] Kill process when socket dies (1.2.3) This approach to dealing with reconnecting should hopefully work 24/7. --- .gitignore | 1 - pom.xml | 12 +++- src/META-INF/MANIFEST.MF | 2 - src/de/timmyrs/suprdiscordbot/Main.java | 10 ++- src/de/timmyrs/suprdiscordbot/RAMCleaner.java | 55 -------------- .../suprdiscordbot/apis/DiscordAPI.java | 71 ++++--------------- .../suprdiscordbot/scripts/ScriptManager.java | 8 --- .../suprdiscordbot/websocket/WebSocket.java | 48 +------------ .../websocket/WebSocketEndpoint.java | 36 +++------- .../websocket/WebSocketHeart.java | 17 +---- version.txt | 2 +- 11 files changed, 45 insertions(+), 217 deletions(-) delete mode 100644 src/META-INF/MANIFEST.MF delete mode 100644 src/de/timmyrs/suprdiscordbot/RAMCleaner.java diff --git a/.gitignore b/.gitignore index 3796b72..a7df657 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,5 @@ target/ values/ dependency-reduced-pom.xml SuprDiscordbot.iml -SuprDiscordBot.jar SuprDiscordBot.zip config.json diff --git a/pom.xml b/pom.xml index cf5e045..0191fda 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 de.timmyRS SuprDiscordBot - 1.2.2 + 1.2.3 UTF-8 @@ -27,6 +27,16 @@ shade + + + + + de.timmyrs.suprdiscordbot.Main + + + + diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF deleted file mode 100644 index 11e6fc2..0000000 --- a/src/META-INF/MANIFEST.MF +++ /dev/null @@ -1,2 +0,0 @@ -Manifest-Version: 1 -Main-Class: de.timmyrs.suprdiscordbot.Main diff --git a/src/de/timmyrs/suprdiscordbot/Main.java b/src/de/timmyrs/suprdiscordbot/Main.java index 343fa77..10b279c 100644 --- a/src/de/timmyrs/suprdiscordbot/Main.java +++ b/src/de/timmyrs/suprdiscordbot/Main.java @@ -8,6 +8,7 @@ import de.timmyrs.suprdiscordbot.apis.PermissionAPI; import de.timmyrs.suprdiscordbot.apis.ScriptAPI; import de.timmyrs.suprdiscordbot.scripts.ScriptManager; +import de.timmyrs.suprdiscordbot.websocket.WebSocket; import de.timmyrs.suprdiscordbot.websocket.WebSocketEndpoint; import de.timmyrs.suprdiscordbot.websocket.WebSocketHeart; @@ -40,7 +41,7 @@ */ public class Main { - private static final String version = "1.2.2"; + private static final String version = "1.2.3"; private static final File valuesDir = new File("values"); private final static File confFile = new File("config.json"); public static boolean debug = false; @@ -80,12 +81,15 @@ public static void main(String[] args) throws DeploymentException, IOException, if(Main.configuration.has("botToken") && !Main.configuration.getString("botToken").equals("BOT_TOKEN")) { Main.gson = new Gson(); + if(!Main.configuration.has("gateway")) + { + Main.configuration.set("gateway", Main.jsonParser.parse(Main.discordAPI.request("/gateway").toString()).getAsJsonObject().get("url").getAsString()); + } Main.scriptManager = new ScriptManager(); + Main.discordAPI = new DiscordAPI(new WebSocket(Main.configuration.getString("gateway") + "/?v=6&encoding=json")); Main.consoleAPI = new ConsoleAPI(); - Main.discordAPI = new DiscordAPI(); Main.internetAPI = new InternetAPI(); Main.permissionAPI = new PermissionAPI(); - DiscordAPI.openWebSocket(); new WebSocketHeart(); try { diff --git a/src/de/timmyrs/suprdiscordbot/RAMCleaner.java b/src/de/timmyrs/suprdiscordbot/RAMCleaner.java deleted file mode 100644 index 9cb1152..0000000 --- a/src/de/timmyrs/suprdiscordbot/RAMCleaner.java +++ /dev/null @@ -1,55 +0,0 @@ -package de.timmyrs.suprdiscordbot; - -import de.timmyrs.suprdiscordbot.apis.DiscordAPI; - -import java.util.Map.Entry; - -public class RAMCleaner extends Thread -{ - public RAMCleaner() - { - this.start(); - } - - @Override - public void run() - { - //noinspection InfiniteLoopStatement - do - { - try - { - long milis = System.currentTimeMillis(); - int removed = 0; - synchronized(DiscordAPI.rate_limits) - { - for(Entry entry : DiscordAPI.rate_limits.entrySet()) - { - if(milis > entry.getValue()) - { - DiscordAPI.rate_limits.remove(entry.getKey()); - removed++; - } - } - } - if(removed > 0 && Main.debug) - { - Main.log("Cleaner", "Removed " + removed + " useless value" + (removed == 1 ? "" : "s") + " from RAM."); - } - Thread.sleep(60000); - } - catch(Exception e) - { - try - { - Thread.sleep(100); - } - catch(InterruptedException ex) - { - ex.printStackTrace(); - } - } - } - while(true); - } -} diff --git a/src/de/timmyrs/suprdiscordbot/apis/DiscordAPI.java b/src/de/timmyrs/suprdiscordbot/apis/DiscordAPI.java index 64dee24..58ed312 100644 --- a/src/de/timmyrs/suprdiscordbot/apis/DiscordAPI.java +++ b/src/de/timmyrs/suprdiscordbot/apis/DiscordAPI.java @@ -14,12 +14,10 @@ import org.apache.commons.io.IOUtils; import sun.net.www.protocol.https.HttpsURLConnectionImpl; -import javax.websocket.DeploymentException; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.net.HttpURLConnection; -import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; @@ -42,12 +40,13 @@ public class DiscordAPI */ public User user; + public DiscordAPI(WebSocket ws) + { + DiscordAPI.ws = ws; + } + /** * Not accessible within script. - * - * @param endpoint Endpoint - * @param structure Structure - * @return Object */ public static Object request(String endpoint, Structure structure) { @@ -56,11 +55,6 @@ public static Object request(String endpoint, Structure structure) /** * Not accessible within script. - * - * @param method Method - * @param endpoint Endpoint - * @param structure Structure - * @return Object */ public static Object request(String method, String endpoint, Structure structure) { @@ -69,12 +63,6 @@ public static Object request(String method, String endpoint, Structure structure /** * Not accessible within script. - * - * @param method Method - * @param endpoint Endpoint - * @param args Args - * @param structure Structure - * @return Object */ public static Object request(String method, String endpoint, String args, Structure structure) { @@ -237,36 +225,7 @@ else if(res.startsWith("[")) } /** - * Not accessible within script. - */ - public static void openWebSocket() throws DeploymentException, IOException, URISyntaxException - { - if(ws == null) - { - if(!Main.configuration.has("gateway")) - { - Main.configuration.set("gateway", Main.jsonParser.parse(Main.discordAPI.request("/gateway").toString()).getAsJsonObject().get("url").getAsString()); - } - ws = new WebSocket(Main.configuration.getString("gateway") + "/?v=6&encoding=json"); - } - } - - /** - * Not accessible within script. - * - * @param reason Close reason - */ - public static void closeWebSocket(String reason) - { - if(ws != null) - { - ws.close(reason); - ws = null; - } - } - - /** - * Send a manual request to the Discord API. + * Sends a request to the Discord API. * * @param method HTTP Method (GET, POST, PATCH, etc.) * @param endpoint The API endpoint (e.g. /users/_ID_) @@ -278,7 +237,7 @@ public static Object request(String method, String endpoint) } /** - * Send a manual request to the Discord API. + * Sends a request to the Discord API. * * @param method HTTP Method (GET, POST, PATCH, etc.) * @param endpoint The API endpoint (e.g. /users/_ID_) @@ -291,7 +250,7 @@ public static Object request(String method, String endpoint, String args) } /** - * Send a manual request to the Discord API. + * Sends a request to the Discord API. * * @param endpoint HTTP Method (GET, POST, PATCH, etc.) * @return Object @@ -308,7 +267,7 @@ public Object request(String endpoint) * @param op OP Code * @param d Raw JSON Data */ - public void send(int op, Object d) throws DeploymentException, IOException, URISyntaxException + public void send(int op, Object d) { JsonObject json = new JsonObject(); json.addProperty("op", op); @@ -324,15 +283,9 @@ else if(d instanceof String && d.toString().startsWith("{")) { json.addProperty("d", d.toString()); } - if(ws == null) - { - WebSocket.afterConnectSend = json; - DiscordAPI.openWebSocket(); - } - else - { - ws.send(json); - } + final String msg = json.toString(); + Main.log("Socket", "< " + msg); + Main.webSocketEndpoint.session.getAsyncRemote().sendText(msg); } /** diff --git a/src/de/timmyrs/suprdiscordbot/scripts/ScriptManager.java b/src/de/timmyrs/suprdiscordbot/scripts/ScriptManager.java index ae2e319..2af9784 100644 --- a/src/de/timmyrs/suprdiscordbot/scripts/ScriptManager.java +++ b/src/de/timmyrs/suprdiscordbot/scripts/ScriptManager.java @@ -22,7 +22,6 @@ public ScriptManager() this.factory = new ScriptEngineManager(); } - Script getScript(final String name) { for(Script script : scripts) @@ -35,7 +34,6 @@ Script getScript(final String name) return null; } - FailedScript getFailedScript(final String name) { for(FailedScript script : failedscripts) @@ -48,19 +46,16 @@ FailedScript getFailedScript(final String name) return null; } - void removeScript(final Script script) { scripts.remove(script); } - void removeFailedScript(final FailedScript script) { failedscripts.remove(script); } - Script registerScript(final File f) throws ScriptException { String cont = ""; @@ -77,7 +72,6 @@ Script registerScript(final File f) throws ScriptException return s; } - void registerFailedScript(final File f) { String cont = ""; @@ -93,13 +87,11 @@ void registerFailedScript(final File f) this.failedscripts.add(s); } - public void fireEvent(final String event) { fireEvent(event, null); } - public void fireEvent(final String event, final Object data) { for(Script script : scripts) diff --git a/src/de/timmyrs/suprdiscordbot/websocket/WebSocket.java b/src/de/timmyrs/suprdiscordbot/websocket/WebSocket.java index 64ea512..e48c194 100644 --- a/src/de/timmyrs/suprdiscordbot/websocket/WebSocket.java +++ b/src/de/timmyrs/suprdiscordbot/websocket/WebSocket.java @@ -2,7 +2,6 @@ import com.google.gson.JsonObject; import de.timmyrs.suprdiscordbot.Main; -import de.timmyrs.suprdiscordbot.RAMCleaner; import de.timmyrs.suprdiscordbot.apis.DiscordAPI; import de.timmyrs.suprdiscordbot.scripts.ScriptWatcher; import de.timmyrs.suprdiscordbot.structures.Channel; @@ -22,14 +21,12 @@ public class WebSocket { - public static JsonObject afterConnectSend; static int lastSeq; private static String session_id = ""; public WebSocket(String url) throws URISyntaxException, IOException, DeploymentException { - Main.webSocketEndpoint = new WebSocketEndpoint(new URI(url)); - Main.webSocketEndpoint.addMessageHandler(message-> + Main.webSocketEndpoint = new WebSocketEndpoint(new URI(url), message-> { JsonObject json = Main.jsonParser.parse(message).getAsJsonObject(); GatewayPayload payload = Main.gson.fromJson(json, GatewayPayload.class); @@ -64,15 +61,8 @@ public WebSocket(String url) throws URISyntaxException, IOException, DeploymentE if(!Main.ready) { new ScriptWatcher(); - new RAMCleaner(); Main.ready = true; } - case "RESUMED": - if(afterConnectSend != null) - { - send(afterConnectSend); - afterConnectSend = null; - } Main.scriptManager.fireEvent("CONNECTED"); break; case "GUILD_CREATE": @@ -264,12 +254,8 @@ else if(c.type == 3) } break; case 7: - DiscordAPI.closeWebSocket("Gateway requested reconnect."); - DiscordAPI.openWebSocket(); - break; - case 9: - DiscordAPI.closeWebSocket("Resume failed."); - DiscordAPI.openWebSocket(); + Main.log("Socket", "Gateway requested reconnect."); + System.exit(0); break; case 10: JsonObject d = new JsonObject(); @@ -303,32 +289,4 @@ else if(c.type == 3) } }); } - - public void send(JsonObject json) - { - Main.webSocketEndpoint.send(json.toString()); - } - - public void close(String reason) - { - try - { - if(reason != null) - { - Main.log("Socket", "Manually closing: " + reason); - } - if(Main.webSocketEndpoint.userSession != null && Main.webSocketEndpoint.userSession.isOpen()) - { - Main.webSocketEndpoint.userSession.close(); - } - if(reason == null) - { - Main.webSocketEndpoint = null; - } - } - catch(Exception e) - { - e.printStackTrace(); - } - } } diff --git a/src/de/timmyrs/suprdiscordbot/websocket/WebSocketEndpoint.java b/src/de/timmyrs/suprdiscordbot/websocket/WebSocketEndpoint.java index 6e9d434..2cdeeda 100644 --- a/src/de/timmyrs/suprdiscordbot/websocket/WebSocketEndpoint.java +++ b/src/de/timmyrs/suprdiscordbot/websocket/WebSocketEndpoint.java @@ -1,7 +1,6 @@ package de.timmyrs.suprdiscordbot.websocket; import de.timmyrs.suprdiscordbot.Main; -import de.timmyrs.suprdiscordbot.apis.DiscordAPI; import javax.websocket.ClientEndpoint; import javax.websocket.CloseReason; @@ -21,20 +20,21 @@ @ClientEndpoint public class WebSocketEndpoint { - Session userSession; - private MessageHandler messageHandler; + final private MessageHandler messageHandler; + public Session session; - WebSocketEndpoint(URI endpointURI) throws IOException, DeploymentException + WebSocketEndpoint(URI endpointURI, MessageHandler messageHandler) throws IOException, DeploymentException { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); container.connectToServer(this, endpointURI); + this.messageHandler = messageHandler; } @OnOpen - public void onOpen(Session userSession) + public void onOpen(Session session) { Main.log("Socket", "WebSocket opened."); - this.userSession = userSession; + this.session = session; } @OnError @@ -44,13 +44,10 @@ public void onError(Session userSession, Throwable e) } @OnClose - public void onClose(Session userSession, CloseReason reason) throws DeploymentException, IOException, URISyntaxException + public void onClose(Session userSession, CloseReason reason) { Main.log("Socket", "WebSocket closed: " + reason.getReasonPhrase() + " (" + reason.getCloseCode().getCode() + ")"); - this.userSession = null; - Main.scriptManager.fireEvent("DISCONNECTED"); - DiscordAPI.closeWebSocket(null); - DiscordAPI.openWebSocket(); + System.exit(0); } @OnMessage @@ -70,23 +67,6 @@ else if(msg != null) } } - void addMessageHandler(MessageHandler msgHandler) - { - this.messageHandler = msgHandler; - } - - void send(String msg) - { - if(Main.debug) - { - Main.log("Socket", "< " + msg); - } - if(this.userSession != null && this.userSession.isOpen()) - { - this.userSession.getAsyncRemote().sendText(msg); - } - } - public interface MessageHandler { void handleMessage(String message) throws DeploymentException, IOException, URISyntaxException; diff --git a/src/de/timmyrs/suprdiscordbot/websocket/WebSocketHeart.java b/src/de/timmyrs/suprdiscordbot/websocket/WebSocketHeart.java index db939c0..52c62c0 100644 --- a/src/de/timmyrs/suprdiscordbot/websocket/WebSocketHeart.java +++ b/src/de/timmyrs/suprdiscordbot/websocket/WebSocketHeart.java @@ -1,11 +1,6 @@ package de.timmyrs.suprdiscordbot.websocket; import de.timmyrs.suprdiscordbot.Main; -import de.timmyrs.suprdiscordbot.apis.DiscordAPI; - -import javax.websocket.DeploymentException; -import java.io.IOException; -import java.net.URISyntaxException; public class WebSocketHeart extends Thread { @@ -30,19 +25,13 @@ public void run() if(gotACK) { gotACK = false; - try - { - Main.discordAPI.send(1, WebSocket.lastSeq); - } - catch(DeploymentException | IOException | URISyntaxException e) - { - e.printStackTrace(); - } + Main.discordAPI.send(1, WebSocket.lastSeq); } else { interval = 0; - DiscordAPI.closeWebSocket("Discord did not answer heartbeat."); + Main.log("Socket", "Discord did not answer heartbeat."); + System.exit(0); } lastHeartbeat = System.currentTimeMillis(); } diff --git a/version.txt b/version.txt index d2d61a7..e2cac26 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.2.2 \ No newline at end of file +1.2.3 \ No newline at end of file