11package com .javadiscord .jdi .internal .gateway ;
22
3+ import java .net .URI ;
4+
35import com .javadiscord .jdi .internal .cache .Cache ;
46import com .javadiscord .jdi .internal .gateway .handlers .heartbeat .HeartbeatService ;
57import com .javadiscord .jdi .internal .gateway .identify .IdentifyRequest ;
68
79import com .fasterxml .jackson .core .JsonProcessingException ;
810import com .fasterxml .jackson .databind .ObjectMapper ;
9- import io .vertx .core .Vertx ;
10- import io .vertx .core .buffer .Buffer ;
11- import io .vertx .core .http .WebSocket ;
12- import io .vertx .core .http .WebSocketClient ;
13- import io .vertx .core .http .WebSocketConnectOptions ;
14- import io .vertx .core .http .WebSocketFrame ;
1511import org .apache .logging .log4j .LogManager ;
1612import org .apache .logging .log4j .Logger ;
13+ import org .java_websocket .client .WebSocketClient ;
14+ import org .java_websocket .framing .CloseFrame ;
15+ import org .java_websocket .framing .Framedata ;
16+ import org .java_websocket .framing .PingFrame ;
17+ import org .java_websocket .framing .PongFrame ;
1718
1819public class WebSocketManager {
1920 private static final Logger LOGGER = LogManager .getLogger (WebSocketManager .class );
2021 private final GatewaySetting gatewaySetting ;
2122 private final IdentifyRequest identifyRequest ;
22- private final Vertx vertx ;
2323 private final WebSocketRetryHandler retryHandler ;
2424 private final Cache cache ;
25- private WebSocket webSocket ;
26- private WebSocketClient webSocketClient ;
25+ private GatewayWebSocketClient client ;
2726 private HeartbeatService heartbeatService ;
2827 private boolean retryAllowed ;
2928
@@ -32,66 +31,61 @@ public WebSocketManager(
3231 ) {
3332 this .gatewaySetting = gatewaySetting ;
3433 this .identifyRequest = identifyRequest ;
35- this .vertx = Vertx .vertx ();
36- this .retryHandler = new WebSocketRetryHandler (vertx );
34+ this .retryHandler = new WebSocketRetryHandler ();
3735 this .cache = cache ;
3836 }
3937
4038 public void start (ConnectionMediator connectionMediator ) {
4139 heartbeatService = new HeartbeatService (connectionMediator );
40+ retryAllowed = true ;
4241
4342 String gatewayURL = connectionMediator .getConnectionDetails ().getGatewayURL ();
44-
45- WebSocketConnectOptions webSocketConnectOptions =
46- new WebSocketConnectOptions ()
47- .addHeader ("Origin" , "localhost" )
48- .setAbsoluteURI (
43+ client =
44+ new GatewayWebSocketClient (
45+ URI .create (
4946 "%s/?v=%d&encoding=%s"
5047 .formatted (
5148 gatewayURL ,
5249 gatewaySetting .getApiVersion (),
5350 gatewaySetting .getEncoding ()
5451 )
55- )
56- .setSsl (true );
57-
58- webSocketClient = vertx .createWebSocketClient ();
59- retryAllowed = true ;
60- webSocketClient .connect (webSocketConnectOptions )
61- .onSuccess (
62- webSocket -> {
52+ ),
53+ () -> {
54+ // Success
6355 LOGGER .info ("Connected to Discord" );
64-
65- this .webSocket = webSocket ;
66-
6756 WebSocketHandler webSocketHandler =
6857 new WebSocketHandler (connectionMediator , cache , heartbeatService );
6958
70- webSocketHandler .handle (webSocket );
59+ webSocketHandler .handle (client );
7160
72- webSocket . frameHandler (frame -> frameHandler (frame , webSocketHandler ));
61+ client . setFrameHandler (frame -> frameHandler (frame , webSocketHandler ));
7362
7463 if (retryHandler .hasRetried ()) {
7564 retryHandler .clear ();
76- sendResumeEvent (webSocket , connectionMediator );
65+ sendResumeEvent (connectionMediator );
7766 } else {
78- sendIdentify (webSocket , identifyRequest );
67+ sendIdentify (client , identifyRequest );
7968 }
80- }
81- )
82- .onFailure (
83- error -> {
84- LOGGER .warn ("Failed to connect to {} {}" , gatewayURL , error .getCause ());
69+ },
70+ (exception ) -> {
71+ // Error
72+ LOGGER .warn (
73+ "An error occurred in the gateway's connection: {} {}" , gatewayURL ,
74+ exception .getCause ()
75+ );
8576 if (retryAllowed ) {
8677 retryHandler .retry (() -> restart (connectionMediator ));
8778 }
8879 }
8980 );
81+ client .connect ();
9082 }
9183
92- private void frameHandler (WebSocketFrame frame , WebSocketHandler webSocketHandler ) {
93- if (frame .isClose ()) {
94- webSocketHandler .handleClose (frame .closeStatusCode (), frame .closeReason ());
84+ private void frameHandler (Framedata frame , WebSocketHandler webSocketHandler ) {
85+ if (frame instanceof PingFrame ) {
86+ client .sendFrame (new PongFrame ());
87+ } else if (frame instanceof CloseFrame closeFrame ) {
88+ webSocketHandler .handleClose (closeFrame .getCloseCode (), closeFrame .getMessage ());
9589 }
9690 }
9791
@@ -102,54 +96,57 @@ public void restart(ConnectionMediator connectionMediator) {
10296 }
10397
10498 public void stop () {
105- if (webSocket != null && !webSocket .isClosed ()) {
106- webSocket .close ();
99+ if (client != null && !client .isClosed ()) {
100+ try {
101+ client .closeBlocking ();
102+ LOGGER .info ("Web socket has closed successfully" );
103+ } catch (InterruptedException e ) {
104+ LOGGER .error ("Failed to close websocket client: {}" , e .getMessage ());
105+ Thread .currentThread ().interrupt ();
106+ }
107107 }
108+
108109 if (heartbeatService != null ) {
109110 heartbeatService .stop ();
110111 }
111- webSocketClient .close ()
112- .onSuccess (res -> LOGGER .info ("Web socket client has been shutdown" ))
113- .onFailure (err -> LOGGER .error ("Failed to shutdown web socket client" , err ));
112+
114113 retryAllowed = false ;
115- vertx .close ()
116- .onSuccess (res -> LOGGER .info ("Gateway has shutdown" ))
117- .onFailure (err -> LOGGER .error ("Failed to shutdown gateway" , err ));
118114 }
119115
120- public WebSocket getWebSocket () {
121- return webSocket ;
116+ public WebSocketClient getWebSocket () {
117+ return client ;
122118 }
123119
124- private static void sendIdentify (WebSocket webSocket , IdentifyRequest identifyRequest ) {
120+ private static void sendIdentify (
121+ org .java_websocket .client .WebSocketClient client ,
122+ IdentifyRequest identifyRequest
123+ ) {
125124 try {
126- webSocket . write (
127- Buffer . buffer (( new ObjectMapper ().writeValueAsString (identifyRequest )) )
125+ client . send (
126+ new ObjectMapper ().writeValueAsString (identifyRequest )
128127 );
129128 } catch (JsonProcessingException e ) {
130129 LOGGER .error ("Failed to send identify request, restarting bot" );
131130 }
132131 }
133132
134- private void sendResumeEvent (WebSocket webSocket , ConnectionMediator connectionMediator ) {
133+ private void sendResumeEvent (ConnectionMediator connectionMediator ) {
135134 String botToken = identifyRequest .getD ().getToken ();
136135 String sessionId = connectionMediator .getConnectionDetails ().getSessionId ();
137136 int sequence = connectionMediator .getConnectionDetails ().getSequence ();
138137 int opcode = GatewayOpcode .RESUME ;
139- webSocket .write (
140- Buffer .buffer (
138+ client .send (
139+ """
140+ {
141+ "op": %d,
142+ "d": {
143+ "token": "%s",
144+ "session_id": "%s",
145+ "seq": %d
146+ }
147+ }
141148 """
142- {
143- "op": %d,
144- "d": {
145- "token": "%s",
146- "session_id": "%s",
147- "seq": %d
148- }
149- }
150- """
151- .formatted (opcode , botToken , sessionId , sequence )
152- )
149+ .formatted (opcode , botToken , sessionId , sequence )
153150 );
154151 }
155152}
0 commit comments