22
33import com .google .gson .JsonObject ;
44import com .google .gson .JsonParser ;
5- import me .shedaniel .autoconfig .AutoConfig ;
65import net .minecraft .client .MinecraftClient ;
76import net .minecraft .client .network .ClientPlayerEntity ;
87import net .minecraft .text .Text ;
98import net .minecraft .util .Util ;
10- import org .java_websocket .client .WebSocketClient ;
11- import org .java_websocket .handshake .ServerHandshake ;
129import zadudoder .spmhelper .config .SPmHelperConfig ;
1310
14- import java .net .URI ;
15- import java .util .concurrent .CompletableFuture ;
11+ import java .net .http .WebSocket ;
12+ import java .util .concurrent .CompletionStage ;
13+ import java .util .concurrent .CountDownLatch ;
1614
17- public class SocketClient extends WebSocketClient {
18- private final CompletableFuture < String > responseFuture = new CompletableFuture <>() ;
19- private Runnable onOpenCallback ;
20- private ClientPlayerEntity clientPlayer ;
15+ public class SocketClient implements WebSocket . Listener {
16+ private final CountDownLatch latch ;
17+ private final StringBuilder aggregatedText = new StringBuilder () ;
18+ private final ClientPlayerEntity clientPlayer ;
2119
22- public SocketClient (URI serverUri ) {
23- super (serverUri );
20+ public SocketClient (int latch , ClientPlayerEntity clientPlayer ) {
21+ this .latch = new CountDownLatch (latch );
22+ this .clientPlayer = clientPlayer ;
2423 }
2524
2625 @ Override
27- public void onOpen (ServerHandshake serverHandshake ) {
28- if (onOpenCallback != null ) {
29- onOpenCallback .run (); // Уведомляем, что соединение открыто
30- }
31-
26+ public void onOpen (WebSocket webSocket ) {
27+ //System.out.println("🔵 Соединение установлено");
28+ webSocket .request (1 ); // Запрашиваем первое сообщение
3229 }
3330
3431 @ Override
35- public void onMessage (String message ) {
36- MinecraftClient client = MinecraftClient .getInstance ();
37- JsonObject responseJson = JsonParser .parseString (message ).getAsJsonObject ();
38- System .out .println (responseJson .toString ());
39- if (responseJson .has ("auth_url" )) {
40- clientPlayer .sendMessage (Text .translatable ("text.spmhelper.WebSocketClient_OpenURL" ));
41- String authUrl = responseJson .get ("auth_url" ).getAsString ();
42- client .execute (() -> {
43- Util .getOperatingSystem ().open (authUrl );
44- });
45- clientPlayer .sendMessage (Text .translatable ("text.spmhelper.WebSocketClient_WaitingAuth" ));
46- } else if (responseJson .has ("token" )) {
47- SPmHelperConfig .get ().setAPI_TOKEN (responseJson .get ("token" ).getAsString ());
48- AutoConfig .getConfigHolder (SPmHelperConfig .class ).save ();
49- clientPlayer .sendMessage (Text .translatable ("text.spmhelper.WebSocketClient_TokenWritten" ));
50- safeClose ();
51- } else if (responseJson .has ("error" )) {
52- if (responseJson .get ("error" ).getAsString ().equals ("Авторизация отклонена игроком" )) {
53- clientPlayer .sendMessage (Text .translatable ("text.spmhelper.WebSocketClient_AuthorizationCancelledByYou" ));
54- } else {
55- clientPlayer .sendMessage (Text .translatable ("text.spmhelper.WebSocketClient_FailedToGetLink" ));
32+ public CompletionStage <?> onText (WebSocket webSocket , CharSequence data , boolean last ) {
33+ //System.out.println("📨 Получено сообщение: " + data);
34+ JsonObject responseJson = JsonParser .parseString (data .toString ()).getAsJsonObject ();
35+ if (last ) {
36+ if (responseJson .has ("auth_url" )) {
37+ clientPlayer .sendMessage (Text .translatable ("text.spmhelper.WebSocketClient_OpenURL" ));
38+ String authUrl = responseJson .get ("auth_url" ).getAsString ();
39+ MinecraftClient .getInstance ().execute (() -> {
40+ Util .getOperatingSystem ().open (authUrl );
41+ });
42+ clientPlayer .sendMessage (Text .translatable ("text.spmhelper.WebSocketClient_WaitingAuth" ));
43+ } else if (responseJson .has ("token" )) {
44+ SPmHelperConfig .get ().setToken (responseJson .get ("token" ).getAsString ());
45+ clientPlayer .sendMessage (Text .translatable ("text.spmhelper.WebSocketClient_TokenWritten" ));
46+ SPmHelperApi .webSocket .abort ();
47+ } else if (responseJson .has ("error" )) {
48+ if (responseJson .get ("error" ).getAsString ().equals ("Authorization denied by user" )) {
49+ clientPlayer .sendMessage (Text .translatable ("text.spmhelper.WebSocketClient_AuthorizationCancelledByYou" ));
50+ } else {
51+ clientPlayer .sendMessage (Text .translatable ("text.spmhelper.WebSocketClient_FailedToGetLink" ));
52+ }
53+ SPmHelperApi .webSocket .abort ();
5654 }
57- safeClose ();
5855 }
56+ aggregatedText .setLength (0 );
57+ webSocket .request (1 );
58+ return null ;
5959 }
6060
6161 @ Override
62- public void onClose (int i , String s , boolean b ) {
62+ public CompletionStage <?> onClose (WebSocket webSocket , int statusCode , String reason ) {
63+ //System.out.println("🔴 Соединение закрыто: " + statusCode + " - " + reason);
64+ latch .countDown ();
65+ return null ;
6366 }
6467
6568 @ Override
66- public void onError (Exception e ) {
67- responseFuture .completeExceptionally (e );
68- }
69-
70- public void setOnOpenCallback (Runnable callback ) {
71- this .onOpenCallback = callback ;
72- }
73-
74- public void setClientPlayer (ClientPlayerEntity client ) {
75- this .clientPlayer = client ;
76- }
77-
78- private void safeClose () {
79- if (isOpen ()) {
80- close ();
81- }
69+ public void onError (WebSocket webSocket , Throwable error ) {
70+ error .printStackTrace ();
71+ latch .countDown (); // Разблокируем основной поток
8272 }
83- }
73+ }
0 commit comments