/* * Computoser is a music-composition algorithm and a website to present the results * Copyright (C) 2012-2014 Bozhidar Bozhanov * * Computoser is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * Computoser is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Computoser. If not, see <http://www.gnu.org/licenses/>. */ package com.music.web.websocket; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.socket.WebSocketSession; import com.music.web.websocket.dto.Answer; import com.music.web.websocket.dto.GameEvent; import com.music.web.websocket.dto.GameEventType; import com.music.web.websocket.dto.GameResults; import com.music.web.websocket.dto.PlayerResult; import com.music.web.websocket.dto.PossibleAnswers; public class Player { private static final Logger logger = LoggerFactory.getLogger(Player.class); private WebSocketSession session; private String name; private ConcurrentMap<Long, Answer> answers = new ConcurrentHashMap<>(); public Player(WebSocketSession session) { this.session = session; } public void gameStarted() { GameEvent event = new GameEvent(GameEventType.GAME_STARTED); event.setPieceCount(Game.PIECES_PER_GAME); GameHandler.sendMessage(event, session); } public void gameFinished(GameResults results, Game game) { GameEvent event = new GameEvent(GameEventType.GAME_FINISHED); List<PlayerResult> playerResults = new ArrayList<PlayerResult>(); for (int i = 0; i < results.getRanking().size(); i ++) { PlayerResult result = new PlayerResult(); result.setRank(i + 1); // the scores map is a name-to-score mapping. We get the name for the player, currently iterated on via the list of players of the game String name = game.getPlayers().get(results.getRanking().get(i)).getName(); result.setScore(results.getScores().get(name)); result.setName(name); playerResults.add(result); } PlayerResult currentPlayerResult = new PlayerResult(); int rank = results.getRanking().indexOf(session.getId()) + 1; int score = results.getScores().get(name); currentPlayerResult.setRank(rank); currentPlayerResult.setScore(score); event.setPlayerResults(playerResults); event.setCurrentPlayerResult(currentPlayerResult); GameHandler.sendMessage(event, session); } public void playerLeft(String id) { GameEvent event = new GameEvent(GameEventType.PLAYER_LEFT); event.setPlayerId(id); try { GameHandler.sendMessage(event, session); } catch (Exception e) { logger.warn("Problem sending PLAYER_LEFT message", e); } } public void playerJoined(Player player) { GameEvent event = new GameEvent(GameEventType.PLAYER_JOINED); event.setPlayerId(player.getSession().getId()); event.setPlayerName(player.getName()); GameHandler.sendMessage(event, session); } public void sendNextPiece(Long pieceId, PossibleAnswers possibleAnswers, int seconds) { GameEvent event = new GameEvent(GameEventType.NEW_PIECE); event.setPieceId(pieceId); event.setSeconds(seconds); event.setPossibleAnswers(possibleAnswers); GameHandler.sendMessage(event, session); } public void answer(Game game, Answer answer) { if (answers.putIfAbsent(game.getCurrentPieceId(), answer) == null) { if (answer != Game.DUMMY_ANSWER) { game.playerHasAnswered(); } GameEvent event = new GameEvent(GameEventType.ANSWER_ACCEPTED); event.setCorrectAnswer(game.getCurrentCorrectAnswer()); GameHandler.sendMessage(event, session); } } public WebSocketSession getSession() { return session; } public void setSession(WebSocketSession session) { this.session = session; } public Map<Long, Answer> getAnswers() { return answers; } public String getName() { return name; } public void setName(String name) { this.name = name; } }