Compare commits
2 commits
7e9dbe8bd5
...
9a646b9e8d
Author | SHA1 | Date | |
---|---|---|---|
9a646b9e8d | |||
d41570bf55 |
3 changed files with 54 additions and 34 deletions
|
@ -3,6 +3,7 @@ package de.hhhammer.dchat.discord.ws;
|
|||
import de.hhhammer.dchat.discord.ws.connection.BackoffRetryer;
|
||||
import de.hhhammer.dchat.discord.ws.connection.ConnectionManager;
|
||||
import de.hhhammer.dchat.discord.ws.connection.Connector;
|
||||
import de.hhhammer.dchat.discord.ws.connection.ResumeConnector;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
|
@ -32,7 +33,8 @@ public final class DiscordWebSocket {
|
|||
public void start() throws InterruptedException {
|
||||
final var connector = new Connector(eventHandler);
|
||||
final String initGatewayUrl = "wss://gateway.discord.gg/?v=10&encoding=json";
|
||||
final var connectionManager = new ConnectionManager(initGatewayUrl, discordApiKey, retryer);
|
||||
final ResumeConnector resumeConnector = new ResumeConnector(initGatewayUrl, discordApiKey);
|
||||
final var connectionManager = new ConnectionManager(resumeConnector, retryer);
|
||||
connectionManager.start(connector);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,49 +10,22 @@ import java.time.Duration;
|
|||
|
||||
public final class ConnectionManager {
|
||||
private static final Logger logger = LoggerFactory.getLogger(ConnectionManager.class);
|
||||
private final String initGatewayUrl;
|
||||
private final String token;
|
||||
private final ResumeConnector resumeConnector;
|
||||
private final Retryer retryer;
|
||||
|
||||
public ConnectionManager(final String initGatewayUrl, final String token, final Retryer retryer) {
|
||||
this.initGatewayUrl = initGatewayUrl;
|
||||
this.token = token;
|
||||
public ConnectionManager(final ResumeConnector resumeConnector, final Retryer retryer) {
|
||||
this.resumeConnector = resumeConnector;
|
||||
this.retryer = retryer;
|
||||
}
|
||||
|
||||
public void start(final Connector connector) throws InterruptedException {
|
||||
while (retryer.hasRetriesLeft()) {
|
||||
connect(connector);
|
||||
final int reconnectDelayInSeconds = retryer.nextRetryInSeconds();
|
||||
Thread.sleep(Duration.ofSeconds(reconnectDelayInSeconds));
|
||||
resumeConnector.connect(connector);
|
||||
logger.info("Reconnecting");
|
||||
}
|
||||
logger.info("No retries left");
|
||||
}
|
||||
|
||||
private void connect(final Connector connector) {
|
||||
ConnectionConfig mutConnectionConfig = new ConnectionConfig(initGatewayUrl, new IdendificationConnectionInitiator(token));
|
||||
boolean isResumable = true;
|
||||
while (isResumable) {
|
||||
final CloseEvent closeEvent = connector.connect(mutConnectionConfig);
|
||||
isResumable = switch (closeEvent) {
|
||||
case CloseEvent.ResumableCloseEvent resumableCloseEvent -> {
|
||||
if (resumableCloseEvent.resumeGatewayUrl() == null) {
|
||||
logger.warn("Unable to resume: Missing resume URL");
|
||||
yield false;
|
||||
}
|
||||
mutConnectionConfig = new ConnectionConfig(
|
||||
resumableCloseEvent.resumeGatewayUrl(),
|
||||
new ResumeConnectionInitiator(
|
||||
token,
|
||||
resumableCloseEvent.sessionId(),
|
||||
resumableCloseEvent.lastSequence()
|
||||
)
|
||||
);
|
||||
yield true;
|
||||
}
|
||||
case CloseEvent.UnresumableCloseEvent unresumableCloseEvent -> false;
|
||||
case CloseEvent.UnrecoverableCloseEvent unrecoverableCloseEvent ->
|
||||
throw new IllegalStateException("Unable to establish connection to the Discord gateway");
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
package de.hhhammer.dchat.discord.ws.connection;
|
||||
|
||||
import de.hhhammer.dchat.discord.ws.connection.event.CloseEvent;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public final class ResumeConnector {
|
||||
private static Logger logger = LoggerFactory.getLogger(ResumeConnector.class);
|
||||
private final String initGatewayUrl;
|
||||
private final String token;
|
||||
|
||||
public ResumeConnector(final String initGatewayUrl, final String token) {
|
||||
this.initGatewayUrl = initGatewayUrl;
|
||||
this.token = token;
|
||||
}
|
||||
|
||||
public void connect(final Connector connector) {
|
||||
ConnectionConfig mutConnectionConfig = new ConnectionConfig(initGatewayUrl, new IdendificationConnectionInitiator(token));
|
||||
boolean isResumable = true;
|
||||
while (isResumable) {
|
||||
final CloseEvent closeEvent = connector.connect(mutConnectionConfig);
|
||||
isResumable = switch (closeEvent) {
|
||||
case CloseEvent.ResumableCloseEvent resumableCloseEvent -> {
|
||||
if (resumableCloseEvent.resumeGatewayUrl() == null) {
|
||||
logger.warn("Unable to resume: Missing resume URL");
|
||||
yield false;
|
||||
}
|
||||
mutConnectionConfig = new ConnectionConfig(
|
||||
resumableCloseEvent.resumeGatewayUrl(),
|
||||
new ResumeConnectionInitiator(
|
||||
token,
|
||||
resumableCloseEvent.sessionId(),
|
||||
resumableCloseEvent.lastSequence()
|
||||
)
|
||||
);
|
||||
logger.info("Resuming connection");
|
||||
yield true;
|
||||
}
|
||||
case CloseEvent.UnresumableCloseEvent unresumableCloseEvent -> false;
|
||||
case CloseEvent.UnrecoverableCloseEvent unrecoverableCloseEvent ->
|
||||
throw new IllegalStateException("Unable to establish connection to the Discord gateway");
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue