diff --git a/frontend/core/src/com/game/tankwars/Callback.java b/frontend/core/src/com/game/tankwars/Callback.java index cefc5efa35cc2e5ca9b2e13a2cc7ea9f8d680603..869b75cbcbbd30ac32aeca45109a5477a7df69f1 100644 --- a/frontend/core/src/com/game/tankwars/Callback.java +++ b/frontend/core/src/com/game/tankwars/Callback.java @@ -2,14 +2,22 @@ package com.game.tankwars; import com.badlogic.gdx.Net; +/** + * This interface defines two methods to handle the different responses from an HTTP request + */ public interface Callback { - // This interface defines two methods to handle the different responses from an HTTP request - // Method to handle a successful response - // Takes a String parameter containing the response body - void onResult(Net.HttpResponse result); + /** + * Method to handle a successful response + * @param result the response body + * @return true if response was accepted + * false if the request should be resent + */ + boolean onResult(Net.HttpResponse result); - // Method to handle a failed response - // Takes a Throwable parameter containing the exception that caused the failure + /** + * Method to handle a failed response + * @param t Throwable containing the exception that caused the failure + */ void onFailed(Throwable t); } \ No newline at end of file diff --git a/frontend/core/src/com/game/tankwars/HTTPRequestHandler.java b/frontend/core/src/com/game/tankwars/HTTPRequestHandler.java index 9dfc274094a23d876b876713ae33e15665b406a6..64b8d35b3bdd545c7050c9c5f0eee31b8355ccab 100644 --- a/frontend/core/src/com/game/tankwars/HTTPRequestHandler.java +++ b/frontend/core/src/com/game/tankwars/HTTPRequestHandler.java @@ -11,11 +11,6 @@ import com.badlogic.gdx.Net.HttpResponse; * a few times with increasing backoff time between resends. */ public class HTTPRequestHandler implements Net.HttpResponseListener { - - public static final String PROTOCOL = "http"; - public static final String HOST = "localhost"; - public static final int PORT = 3000; - private final Callback callback; private final Net.HttpRequest request; private int attempts = 0; @@ -34,6 +29,7 @@ public class HTTPRequestHandler implements Net.HttpResponseListener { Gdx.net.sendHttpRequest(request, this); } + /** * Request was successful and response received. Passes response body * to callback. @@ -41,7 +37,9 @@ public class HTTPRequestHandler implements Net.HttpResponseListener { * @param httpResponse The {@link HttpResponse} with the HTTP response values. */ public void handleHttpResponse(HttpResponse httpResponse) { - callback.onResult(httpResponse); + if (!callback.onResult(httpResponse)) + failed(new Throwable("Response returned with status code " + + httpResponse.getStatus().getStatusCode())); } /** @@ -57,12 +55,13 @@ public class HTTPRequestHandler implements Net.HttpResponseListener { try { Thread.sleep((long) attempts * BACKOFF_TIME); sendRequest(); + return; } catch(InterruptedException e) { System.err.println(e.getMessage()); } - } else { - callback.onFailed(t); } + + callback.onFailed(t); } /** diff --git a/frontend/core/src/com/game/tankwars/controller/FindGameController.java b/frontend/core/src/com/game/tankwars/controller/FindGameController.java index 2008a9e8a78749fbb9921c4cb25482b004e41228..9b8a7ccbb52cb668b8f4d63e00b30dc54243e65a 100644 --- a/frontend/core/src/com/game/tankwars/controller/FindGameController.java +++ b/frontend/core/src/com/game/tankwars/controller/FindGameController.java @@ -199,7 +199,9 @@ public class FindGameController { new HTTPRequestHandler(new Callback() { @Override - public void onResult(Net.HttpResponse response) { + public boolean onResult(Net.HttpResponse response) { + if (response.getStatus().getStatusCode() == -1) return false; + HttpStatus status = response.getStatus(); if (status.getStatusCode() == HttpStatus.SC_CREATED || @@ -211,10 +213,9 @@ public class FindGameController { screen.showWaitingWindow(); checkLobbyStatus(); - } else { - System.err.println("Join lobby request failed with status code " + - status.getStatusCode()); + return true; } + return false; } @Override @@ -241,23 +242,27 @@ public class FindGameController { new HTTPRequestHandler(new Callback() { @Override - public void onResult(Net.HttpResponse response) { + public boolean onResult(Net.HttpResponse response) { + if (response.getStatus().getStatusCode() == -1) return false; + HttpStatus status = response.getStatus(); if (status.getStatusCode() == HttpStatus.SC_OK && !response.getResultAsString().isEmpty()) { CurrentUser.getCurrentUser().setGameId(response.getResultAsString()); Gdx.app.postRunnable(gameScreenTransition); - } else { - System.out.println("Awaiting opponent..."); - - try { - Thread.sleep(1500); - if (lobbyId != null) checkLobbyStatus(); - } catch (InterruptedException e) { - System.out.println(e.getMessage()); - exitLobby(); - } + return true; } + + System.out.println("Awaiting opponent..."); + + try { + Thread.sleep(1500); + } catch (InterruptedException e) { + System.out.println(e.getMessage()); + } + + if (lobbyId != null) checkLobbyStatus(); + return true; } @Override @@ -282,22 +287,20 @@ public class FindGameController { new HTTPRequestHandler(new Callback() { @Override - public void onResult(Net.HttpResponse response) { + public boolean onResult(Net.HttpResponse response) { + if (response.getStatus().getStatusCode() == -1) return false; + removeWaitingWindowListeners(); setMainListeners(); lobbyId = null; screen.hideWaitingWindow(); + return true; } @Override public void onFailed(Throwable t) { System.err.println("Exit lobby request failed:\n" + t); - removeWaitingWindowListeners(); - setMainListeners(); - - lobbyId = null; - screen.hideWaitingWindow(); } }, new HttpRequestBuilder() .newRequest() diff --git a/frontend/core/src/com/game/tankwars/controller/LeaderboardController.java b/frontend/core/src/com/game/tankwars/controller/LeaderboardController.java index e58eae5de29f10e84236cb71209baaddeb38d914..291c9bbc94e97c8082fc161330b0c6812472e835 100644 --- a/frontend/core/src/com/game/tankwars/controller/LeaderboardController.java +++ b/frontend/core/src/com/game/tankwars/controller/LeaderboardController.java @@ -48,12 +48,15 @@ public class LeaderboardController { new HTTPRequestHandler( new Callback() { @Override - public void onResult(Net.HttpResponse response) { + public boolean onResult(Net.HttpResponse response) { + if (response.getStatus().getStatusCode() == -1) return false; + Json json = new Json(); // Convert the response body to an Array of User objects using the Json instance Array<User> leaderboardUsers = json.fromJson(Array.class, User.class, response.getResultAsString()); screen.setLeaderBoard(leaderboardUsers); + return true; } @Override diff --git a/frontend/core/src/com/game/tankwars/controller/LoginController.java b/frontend/core/src/com/game/tankwars/controller/LoginController.java index 94780e9aebbb0d79871093632738724ecd790f0f..d20c9544c5bf7fea575a652bbf1a31787c8fd457 100644 --- a/frontend/core/src/com/game/tankwars/controller/LoginController.java +++ b/frontend/core/src/com/game/tankwars/controller/LoginController.java @@ -60,7 +60,7 @@ public class LoginController { loginButton.addListener(new InputListener() { @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { - handleInput(usernameField.getText()); + fetchUser(usernameField.getText()); return true; } }); @@ -97,18 +97,17 @@ public class LoginController { }); } - public void handleInput(String username) { - fetchUser(username); - } - public void fetchUser(final String username) { new HTTPRequestHandler(new Callback() { @Override - public void onResult(Net.HttpResponse response) { + public boolean onResult(Net.HttpResponse response) { + if (response.getStatus().getStatusCode() == -1) return false; + Json json = new Json(); User user = json.fromJson(User.class, response.getResultAsString()); currentUser.setUser(user); Gdx.app.postRunnable(mainMenuScreenTransition); + return true; } @Override