99import com .google .gson .annotations .SerializedName ;
1010import com .google .gson .reflect .TypeToken ;
1111
12+ import org .fusesource .jansi .Ansi ;
13+ import org .fusesource .jansi .AnsiConsole ;
14+ import org .fusesource .jansi .Ansi .*;
15+
1216public class GameSocket {
17+ private static final String cgVersion = "0.8" ;
18+
1319 @ FunctionalInterface
1420 public interface EventCallback <T > {
1521 void cb (T data );
@@ -33,8 +39,15 @@ private class Callbacks<T> {
3339 private HashMap <String , Callbacks > eventListeners = new HashMap <>();
3440 private CountDownLatch exitEvent = new CountDownLatch (1 );
3541
36- public GameSocket (String url ) {
42+ public GameSocket (String url ) throws IOException {
43+ AnsiConsole .systemInstall ();
3744 api = new Api (url );
45+ var info = api .fetchInfo ();
46+ if (!isVersionCompatible (info .cgVersion )) {
47+ System .out .println (Ansi .ansi ().fg (Color .YELLOW )
48+ .a ("WARNING: CodeGame version mismatch. Server: v" + info .cgVersion + ", client: v" + cgVersion )
49+ .reset ());
50+ }
3851 }
3952
4053 public Api .GameData createGame (boolean makePublic , boolean protect , Object config ) throws IOException {
@@ -156,7 +169,7 @@ public <T> String once(String eventName, Class<T> type, EventCallback<T> callbac
156169 }
157170
158171 public <T > void send (String commandName , T data ) {
159- if (websocket == null || session .getPlayerId () == "" )
172+ if (websocket == null || session .getPlayerId (). isEmpty () )
160173 throw new IllegalStateException ("The socket is not connected to a player." );
161174 Event <T > e = new Event <>(commandName , data );
162175 var json = Api .json .toJson (e , TypeToken .getParameterized (Event .class , data .getClass ()).getType ());
@@ -205,4 +218,27 @@ private void onMessage(String message) {
205218 private void onClose () {
206219 exitEvent .countDown ();
207220 }
221+
222+ private static boolean isVersionCompatible (String serverVersion ) {
223+ var serverParts = serverVersion .split ("\\ ." );
224+ if (serverParts .length == 1 )
225+ serverParts = new String [] { serverParts [0 ], "0" };
226+ var clientParts = cgVersion .split ("\\ ." );
227+ if (clientParts .length == 1 )
228+ clientParts = new String [] { clientParts [0 ], "0" };
229+
230+ if (!serverParts [0 ].equals (clientParts [0 ]))
231+ return false ;
232+
233+ if (clientParts [0 ].equals ("0" ))
234+ return serverParts [1 ].equals (clientParts [1 ]);
235+
236+ try {
237+ var serverMinor = Integer .parseInt (serverParts [1 ]);
238+ var clientMinor = Integer .parseInt (clientParts [1 ]);
239+ return clientMinor <= serverMinor ;
240+ } catch (NumberFormatException e ) {
241+ return false ;
242+ }
243+ }
208244}
0 commit comments