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

View File

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

View File

@ -132,6 +132,20 @@ function start() {
reset(); reset();
repaint(); 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/chat', onChat);
client.subscribe('/topic/gameClosed', onGameClosed); client.subscribe('/topic/gameClosed', onGameClosed);
client.subscribe('/topic/gameHosted', onGameHosted); client.subscribe('/topic/gameHosted', onGameHosted);
@ -230,6 +244,18 @@ function addMessageItem(messageList, messageItem) {
messageList.scrollTop = messageList.scrollHeight; 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() { function drawMyBoard() {
var x = 25, y = MARGIN_TOP; var x = 25, y = MARGIN_TOP;
drawUsername(x, y, myUsername); drawUsername(x, y, myUsername);
@ -437,42 +463,42 @@ function onChat(message) {
function onGameClosed(message) { function onGameClosed(message) {
var game = JSON.parse(message.body); var game = JSON.parse(message.body);
var gameId = game.id; var gameId = game.id;
var gameHost = game.host.username; var playerOne = game.playerOne.username;
if (gameHost === myUsername) { if (playerOne === myUsername) {
vm.gameId = null; vm.gameId = null;
} }
console.log(gameHost + ' closed Game ' + gameId); console.log(playerOne + ' closed Game ' + gameId);
removeGame(gameId); removeGame(gameId);
} }
function onGameHosted(message) { function onGameHosted(message) {
var game = JSON.parse(message.body); var game = JSON.parse(message.body);
var gameId = game.id; var gameId = game.id;
var gameHost = game.host.username; var playerOne = game.playerOne.username;
if (gameHost === myUsername) { if (playerOne === myUsername) {
vm.gameId = gameId; vm.gameId = gameId;
} }
console.log(gameHost + ' hosted Game ' + gameId); console.log(playerOne + ' hosted Game ' + gameId);
vm.games.push({ id: gameId, playerOne: gameHost, started: false }); vm.games.push({ id: gameId, playerOne: playerOne, started: false });
} }
function onGameJoined(message) { function onGameJoined(message) {
var game = JSON.parse(message.body); var game = JSON.parse(message.body);
var gameId = game.id; var gameId = game.id;
var gameHost = game.host.username; var playerOne = game.playerOne.username;
var gameChallenger = game.challenger.username; var playerTwo = game.playerTwo.username;
if (gameChallenger === myUsername) { if (playerTwo === myUsername) {
vm.gameId = gameId; 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++) { for (var i = 0; i < vm.games.length; i++) {
if (vm.games[i].id === gameId) { if (vm.games[i].id === gameId) {
vm.games[i].playerTwo = gameChallenger; vm.games[i].playerTwo = playerTwo;
vm.games[i].started = true; vm.games[i].started = true;
break; break;
} }
} }
if (gameHost === myUsername || gameChallenger === myUsername) { if (playerOne === myUsername || playerTwo === myUsername) {
toggleView(); toggleView();
} }
} }
@ -481,20 +507,20 @@ function onGameLeft(message) {
var report = JSON.parse(message.body); var report = JSON.parse(message.body);
var game = report.game; var game = report.game;
var gameId = game.id; var gameId = game.id;
var gameHost = game.host.username; var playerOne = game.playerOne.username;
var gameLeaver = report.gameLeaver.username; var gameLeaver = report.gameLeaver.username;
var previousPlayers = []; var previousPlayers = [];
for (var i = 0; i < vm.games.length; i++) { for (var i = 0; i < vm.games.length; i++) {
if (vm.games[i].id === gameId) { if (vm.games[i].id === gameId) {
previousPlayers.push(vm.games[i].playerOne); previousPlayers.push(vm.games[i].playerOne);
previousPlayers.push(vm.games[i].playerTwo); previousPlayers.push(vm.games[i].playerTwo);
vm.games[i].playerOne = gameHost; vm.games[i].playerOne = playerOne;
vm.games[i].playerTwo = game.challenger ? game.challenger.username : null; vm.games[i].playerTwo = game.playerTwo ? game.playerTwo.username : null;
vm.games[i].started = false; vm.games[i].started = false;
break; break;
} }
} }
console.log(gameLeaver + ' left ' + gameHost + "'s game"); console.log(gameLeaver + ' left ' + playerOne + "'s game");
if (gameLeaver === myUsername) { if (gameLeaver === myUsername) {
vm.gameId = null; vm.gameId = null;
} }