Load server data on startup

This commit is contained in:
Charles Gould 2017-01-28 17:08:02 -05:00
parent 3895082c65
commit fc849d2b0d
4 changed files with 84 additions and 50 deletions

View File

@ -17,9 +17,9 @@ public class Game {
public final int id;
private Player host;
private Player playerOne;
private Player challenger;
private Player playerTwo;
private Set<String> acceptableGuesses;
@ -31,7 +31,7 @@ public class Game {
public Game(Player host) {
this.id = idCounter.incrementAndGet();
this.host = host;
this.playerOne = host;
}
private static int indexOf(char[] array, char searchTerm) {
@ -80,12 +80,12 @@ public class Game {
return result;
}
public Player getChallenger() {
return challenger;
public Player getPlayerOne() {
return playerOne;
}
public Player getHost() {
return host;
public Player getPlayerTwo() {
return playerTwo;
}
public String newGame() {
@ -103,12 +103,12 @@ public class Game {
this.acceptableGuesses = value;
}
public void setChallenger(Player value) {
this.challenger = value;
public void setPlayerOne(Player value) {
this.playerOne = value;
}
public void setHost(Player value) {
this.host = value;
public void setPlayerTwo(Player value) {
this.playerTwo = value;
}
public void setPossibleWords(List<String> value) {

View File

@ -22,4 +22,12 @@ public class Player {
this.username = username;
}
@Override
public String toString() {
if (username != null) {
return username;
}
return sessionId;
}
}

View File

@ -81,7 +81,7 @@ public class LingoController implements ApplicationListener<AbstractSubProtocolE
return;
}
guess = guess.toUpperCase();
log.info("{} guessed {}", sessionId, guess);
log.info("{} guessed {}", player, guess);
final Game game = gameByPlayer.get(player);
final int[] result = game.evaluate(guess);
@ -103,10 +103,10 @@ public class LingoController implements ApplicationListener<AbstractSubProtocolE
opponentReport.setResult(result);
}
final Player opponent;
if (sessionId.equals(game.getHost().getSessionId())) {
opponent = game.getChallenger();
if (sessionId.equals(game.getPlayerOne().getSessionId())) {
opponent = game.getPlayerTwo();
} else {
opponent = game.getHost();
opponent = game.getPlayerOne();
}
sendToPlayer(player, Destinations.PLAYER_REPORTS, playerReport);
sendToPlayer(opponent, Destinations.OPPONENT_REPORTS, opponentReport);
@ -121,13 +121,13 @@ public class LingoController implements ApplicationListener<AbstractSubProtocolE
return;
}
if (gameByPlayer.containsKey(player)) {
log.warn("{} is in a game already", username);
log.warn("{} is in a game already", player);
return;
}
final Game game = new Game(player);
gameById.put(game.id, game);
gameByPlayer.put(player, game);
log.info("{} hosted a game", username);
log.info("{} hosted a game", player);
send(Destinations.GAME_HOSTED, game);
}
@ -140,7 +140,7 @@ public class LingoController implements ApplicationListener<AbstractSubProtocolE
return;
}
if (gameByPlayer.containsKey(player)) {
log.warn("{} is in a game already", username);
log.warn("{} is in a game already", player);
return;
}
final Game game = gameById.get(gameId);
@ -148,10 +148,10 @@ public class LingoController implements ApplicationListener<AbstractSubProtocolE
log.warn("No game with id {}", gameId);
return;
}
if (game.getChallenger() == null) {
game.setChallenger(player);
if (game.getPlayerTwo() == null) {
game.setPlayerTwo(player);
gameByPlayer.put(player, game);
log.info("{} joined {}'s game", username, game.getHost());
log.info("{} joined {}'s game", player, game.getPlayerOne());
send(Destinations.GAME_JOINED, game);
// Start the game immediately
@ -161,8 +161,8 @@ public class LingoController implements ApplicationListener<AbstractSubProtocolE
final String firstWord = game.newGame();
final String firstLetter = String.valueOf(firstWord.charAt(0));
log.info("First word: {}", firstWord);
final Player playerOne = game.getHost();
final Player playerTwo = game.getChallenger();
final Player playerOne = game.getPlayerOne();
final Player playerTwo = game.getPlayerTwo();
final String[] playerOneMessage = new String[] { firstLetter, playerTwo.getUsername() };
final String[] playerTwoMessage = new String[] { firstLetter, playerOne.getUsername() };
sendToPlayer(playerOne, Destinations.OPPONENT_JOINED, playerOneMessage);
@ -191,29 +191,29 @@ public class LingoController implements ApplicationListener<AbstractSubProtocolE
final Player player = playerBySession.get(sessionId);
final Game game = gameByPlayer.remove(player);
if (game == null) {
log.warn("{} is not in a game", player.getUsername());
log.warn("{} is not in a game", player);
return;
}
leaveGame(game, player);
}
private synchronized void leaveGame(Game game, Player player) {
final Player gameHost = game.getHost();
final Player gameChallenger = game.getChallenger();
if (gameHost == player) {
if (gameChallenger == null) {
final Player playerOne = game.getPlayerOne();
final Player playerTwo = game.getPlayerTwo();
if (playerOne == player) {
if (playerTwo == null) {
// Close the game
gameById.remove(game.id);
send(Destinations.GAME_CLOSED, game);
} else {
// Leave the game
game.setHost(gameChallenger);
game.setChallenger(null);
game.setPlayerOne(playerTwo);
game.setPlayerTwo(null);
send(Destinations.GAME_LEFT, new GameLeftMessage(game, player));
}
} else if (gameChallenger == player) {
} else if (playerTwo == player) {
// Leave the game
game.setChallenger(null);
game.setPlayerTwo(null);
send(Destinations.GAME_LEFT, new GameLeftMessage(game, player));
}
}
@ -262,7 +262,7 @@ public class LingoController implements ApplicationListener<AbstractSubProtocolE
public void practiceGuess(String guess, @Header(SESSION_ID_HEADER) String sessionId) {
final Player player = playerBySession.get(sessionId);
guess = guess.toUpperCase();
log.info("{} guessed {}", sessionId, guess);
log.info("{} guessed {}", player, guess);
final Game game = practiceByPlayer.get(player);
final int[] result = game.evaluate(guess);

View File

@ -132,6 +132,20 @@ function start() {
reset();
repaint();
// Load initial data
doHttpGet('/games', function(games) {
for (var i = 0; i < games.length; i++) {
var game = games[i];
vm.games.push({
id: game.id,
playerOne: game.playerOne.username,
playerTwo: game.playerTwo ? game.playerTwo.username : null,
started: game.playerTwo !== null
});
}
});
// Subscribe to updates
client.subscribe('/topic/chat', onChat);
client.subscribe('/topic/gameClosed', onGameClosed);
client.subscribe('/topic/gameHosted', onGameHosted);
@ -230,6 +244,18 @@ function addMessageItem(messageList, messageItem) {
messageList.scrollTop = messageList.scrollHeight;
}
function doHttpGet(url, callback) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
var response = JSON.parse(xhr.responseText);
callback(response);
}
};
xhr.open('GET', url, true);
xhr.send();
}
function drawMyBoard() {
var x = 25, y = MARGIN_TOP;
drawUsername(x, y, myUsername);
@ -437,42 +463,42 @@ function onChat(message) {
function onGameClosed(message) {
var game = JSON.parse(message.body);
var gameId = game.id;
var gameHost = game.host.username;
if (gameHost === myUsername) {
var playerOne = game.playerOne.username;
if (playerOne === myUsername) {
vm.gameId = null;
}
console.log(gameHost + ' closed Game ' + gameId);
console.log(playerOne + ' closed Game ' + gameId);
removeGame(gameId);
}
function onGameHosted(message) {
var game = JSON.parse(message.body);
var gameId = game.id;
var gameHost = game.host.username;
if (gameHost === myUsername) {
var playerOne = game.playerOne.username;
if (playerOne === myUsername) {
vm.gameId = gameId;
}
console.log(gameHost + ' hosted Game ' + gameId);
vm.games.push({ id: gameId, playerOne: gameHost, started: false });
console.log(playerOne + ' hosted Game ' + gameId);
vm.games.push({ id: gameId, playerOne: playerOne, started: false });
}
function onGameJoined(message) {
var game = JSON.parse(message.body);
var gameId = game.id;
var gameHost = game.host.username;
var gameChallenger = game.challenger.username;
if (gameChallenger === myUsername) {
var playerOne = game.playerOne.username;
var playerTwo = game.playerTwo.username;
if (playerTwo === myUsername) {
vm.gameId = gameId;
}
console.log(gameChallenger + ' joined ' + gameHost + "'s game");
console.log(playerTwo + ' joined ' + playerOne + "'s game");
for (var i = 0; i < vm.games.length; i++) {
if (vm.games[i].id === gameId) {
vm.games[i].playerTwo = gameChallenger;
vm.games[i].playerTwo = playerTwo;
vm.games[i].started = true;
break;
}
}
if (gameHost === myUsername || gameChallenger === myUsername) {
if (playerOne === myUsername || playerTwo === myUsername) {
toggleView();
}
}
@ -481,20 +507,20 @@ function onGameLeft(message) {
var report = JSON.parse(message.body);
var game = report.game;
var gameId = game.id;
var gameHost = game.host.username;
var playerOne = game.playerOne.username;
var gameLeaver = report.gameLeaver.username;
var previousPlayers = [];
for (var i = 0; i < vm.games.length; i++) {
if (vm.games[i].id === gameId) {
previousPlayers.push(vm.games[i].playerOne);
previousPlayers.push(vm.games[i].playerTwo);
vm.games[i].playerOne = gameHost;
vm.games[i].playerTwo = game.challenger ? game.challenger.username : null;
vm.games[i].playerOne = playerOne;
vm.games[i].playerTwo = game.playerTwo ? game.playerTwo.username : null;
vm.games[i].started = false;
break;
}
}
console.log(gameLeaver + ' left ' + gameHost + "'s game");
console.log(gameLeaver + ' left ' + playerOne + "'s game");
if (gameLeaver === myUsername) {
vm.gameId = null;
}