public TableProto toProto() { TableProto.Builder builder = TableProto.newBuilder(); if (this.isTournament()) { builder.getTourneyBuilder().mergeFrom(this.getTournament().toProto()); } else { builder.getMatchBuilder().mergeFrom(this.getMatch().toProto()); } return builder.setGameType(this.getGameType()) .setName(this.getName()) .setGameType(this.getGameType()) .setDeckType(this.getDeckType()) .setControllerName(this.getControllerName()) .setStartTimeMs(this.getStartTime() != null ? this.getStartTime().getTime() : 0L) .setEndTimeMs(this.getEndTime() != null ? this.getEndTime().getTime() : 0L) .build(); } }
for (Table table : getTables()) { try { if (table.getState() != TableState.FINISHED && ((System.currentTimeMillis() - table.getStartTime().getTime()) / 1000) > 30) { // removeUserFromAllTablesAndChat only if table started longer than 30 seconds ago logger.debug(table.getId() + " [" + table.getName() + "] " + formatter.format(table.getStartTime() == null ? table.getCreateTime() : table.getCreateTime()) + " (" + table.getState().toString() + ") " + (table.isTournament() ? "- Tournament" : "")); getController(table.getId()).ifPresent(tableController -> { if ((table.isTournament() && !tableController.isTournamentStillValid()) || (!table.isTournament() && !tableController.isMatchTableStillValid())) { try { logger.warn("Removing unhealthy tableId " + table.getId()); removeTable(table.getId()); } catch (Exception e) { logger.error(e); logger.debug("Table Health check error tableId: " + table.getId()); logger.debug(Arrays.toString(ex.getStackTrace()));
/** * All activities of the table end (only replay of games (if active) and * display tournament results) */ public void closeTable() { if (getState() != TableState.WAITING && getState() != TableState.READY_TO_START) { setState(TableState.FINISHED); // otherwise the table can be removed completely } this.validator = null; }
public synchronized boolean changeTableStateToStarting() { if (table.getState() != TableState.READY_TO_START) { // tournament is not ready, can't start return false; } if (!table.allSeatsAreOccupied()) { logger.debug("Not alle Seats are occupied: stop start tableId:" + table.getId()); return false; } table.setState(TableState.STARTING); return true; } }
public MatchView(Table table) { this.tableId = table.getId(); this.isTournament = table.isTournament(); if (table.isTournament()) { initTournamentTable(table); } else { initMatchTable(table); } }
public TableView(Table table) { this.tableId = table.getId(); this.gameType = table.getGameType(); this.tableName = table.getName(); this.controllerName = table.getControllerName(); this.tableState = table.getState(); if (table.getState() == TableState.WAITING || table.getState() == TableState.READY_TO_START || table.getState() == TableState.STARTING) { this.createTime = table.getCreateTime(); } else { if (table.isTournament()) { this.createTime = table.getTournament().getStartTime(); } else { this.createTime = table.getMatch().getStartTime(); this.isTournament = table.isTournament(); for (Seat seat : table.getSeats()) { seats.add(new SeatView(seat)); if (!table.isTournament()) { seatsInfo = "" + table.getMatch().getPlayers().size() + '/' + table.getSeats().length; if (table.getState() == TableState.WAITING || table.getState() == TableState.READY_TO_START) { tableStateText = table.getState().toString() + " (" + seatsInfo + ')'; } else { tableStateText = table.getState().toString(); for (Game game : table.getMatch().getGames()) { games.add(game.getId());
Table table = tableEntry.getValue(); if (table != null) { if (table.isTournament()) { if (tableEntry.getKey() != null) { TournamentPlayer tournamentPlayer = table.getTournament().getPlayer(tableEntry.getKey()); if (tournamentPlayer != null) { if (!tournamentPlayer.isEliminated()) { switch (table.getState()) { case WAITING: case STARTING: logger.debug(userName + " tournament player missing - tableId:" + table.getId(), null); tablesToDelete.add(tableEntry.getKey()); logger.error(userName + " tournament key missing - tableId: " + table.getId(), null); switch (table.getState()) { case WAITING: case STARTING:
public synchronized boolean submitDeck(UUID userId, DeckCardLists deckList) throws MageException { UUID playerId = userPlayerMap.get(userId); if (table.isTournament()) { TournamentPlayer player = tournament.getPlayer(playerId); if (player == null || player.hasQuit()) { return true; // so the construct panel closes after submit } else if (table.getMatch() != null) { MatchPlayer mPlayer = table.getMatch().getPlayer(playerId); if (mPlayer == null || mPlayer.hasQuit()) { return true; // so the construct panel closes after submit if (table.isTournamentSubTable()) { TournamentPlayer tournamentPlayer = table.getTournament().getPlayer(mPlayer.getPlayer().getId()); if (tournamentPlayer != null) { tournamentPlayer.setStateInfo(""); // reset sideboarding state if (table.getState() != TableState.SIDEBOARDING && table.getState() != TableState.CONSTRUCTING) { return false; if (table.getState() == TableState.SIDEBOARDING && table.getMatch() != null) { MatchPlayer mPlayer = table.getMatch().getPlayer(playerId); if (mPlayer != null) { deck.setName(mPlayer.getDeck().getName()); if (!Main.isTestMode() && !table.getValidator().validate(deck)) { Optional<User> _user = UserManager.instance.getUser(userId); if (!_user.isPresent()) { return false;
public boolean watchTable(UUID userId) { if (table.isTournament()) { UserManager.instance.getUser(userId).ifPresent(user -> user.ccShowTournament(table.getTournament().getId())); return true; } else { if (table.isTournamentSubTable() && !table.getTournament().getOptions().isWatchingAllowed()) { return false; } if (table.getState() != TableState.DUELING) { return false; } // you can't watch your own game if (userPlayerMap.get(userId) != null) { return false; } Optional<User> _user = UserManager.instance.getUser(userId); if (!_user.isPresent()) { return false; } return _user.get().ccWatchGame(match.getGame().getId()); } }
if (table.isTournament() && tournament == null) { logger.error("No tournament object - userId: " + userId + " table: " + table.getId()); return; && (table.getState() == TableState.WAITING || table.getState() == TableState.READY_TO_START)) { TableManager.instance.removeTable(table.getId()); } else { UUID playerId = userPlayerMap.get(userId); if (playerId != null) { if (table.getState() == TableState.WAITING || table.getState() == TableState.READY_TO_START) { table.leaveNotStartedTable(playerId); if (table.isTournament()) { tournament.removePlayer(playerId); } else { if (user.isPresent()) { ChatManager.instance.broadcast(chatId, user.get().getName(), "has left the table", ChatMessage.MessageColor.BLUE, true, ChatMessage.MessageType.STATUS, ChatMessage.SoundToPlay.PlayerLeft); if (!table.isTournamentSubTable()) { user.get().removeTable(playerId); logger.debug("User not found - userId: " + userId + " tableId:" + table.getId()); } else if (table.getState() != TableState.FINISHED) { if (table.isTournament()) { logger.debug("Quit tournament sub tables for userId: " + userId); TableManager.instance.userQuitTournamentSubTables(tournament.getId(), userId); logger.debug("Quit tournament Id: " + table.getTournament().getId() + '(' + table.getTournament().getTournamentState() + ')');
public synchronized boolean joinTournament(UUID userId, String name, PlayerType playerType, int skill, DeckCardLists deckList, String password) throws GameException { if (table.getState() != TableState.WAITING) { return false; Seat seat = table.getNextAvailableSeat(playerType); if (seat == null) { throw new GameException("No available seats."); if (!table.getTournament().getOptions().getPassword().isEmpty() && playerType == PlayerType.HUMAN) { if (!table.getTournament().getOptions().getPassword().equals(password)) { user.showUserMessage("Join Table", "Wrong password."); return false; if (!table.getTournament().getTournamentType().isLimited()) { if (deckList != null) { deck = Deck.load(deckList, false, false); if (!Main.isTestMode() && !table.getValidator().validate(deck)) { StringBuilder sb = new StringBuilder("You (").append(name).append(") have an invalid deck for the selected ").append(table.getValidator().getName()).append(" Format. \n\n"); for (Map.Entry<String, String> entry : table.getValidator().getInvalid().entrySet()) { sb.append(entry.getKey()).append(": ").append(entry.getValue()).append('\n'); user.showUserMessage("Join Table", sb.toString()); if (isOwner(userId)) { logger.debug("New table removed because owner submitted invalid deck tableId " + table.getId()); TableManager.instance.removeTable(table.getId()); int quitRatio = table.getTournament().getOptions().getQuitRatio(); if (quitRatio < user.getTourneyQuitRatio()) { String message = new StringBuilder("Your quit ratio ").append(user.getTourneyQuitRatio())
if (table.getState() != TableState.WAITING) { user.showUserMessage("Join Table", "No available seats."); return false; if (!table.getMatch().getOptions().getPassword().isEmpty() && playerType == PlayerType.HUMAN) { if (!table.getMatch().getOptions().getPassword().equals(password)) { user.showUserMessage("Join Table", "Wrong password."); return false; Seat seat = table.getNextAvailableSeat(playerType); if (seat == null) { user.showUserMessage("Join Table", "No available seats."); if (!Main.isTestMode() && !table.getValidator().validate(deck)) { StringBuilder sb = new StringBuilder("You (").append(name).append(") have an invalid deck for the selected ").append(table.getValidator().getName()).append(" Format. \n\n"); for (Map.Entry<String, String> entry : table.getValidator().getInvalid().entrySet()) { sb.append(entry.getKey()).append(": ").append(entry.getValue()).append('\n'); user.showUserMessage("Join Table", sb.toString()); if (isOwner(userId)) { logger.debug("New table removed because owner submitted invalid deck tableId " + table.getId()); TableManager.instance.removeTable(table.getId()); int quitRatio = table.getMatch().getOptions().getQuitRatio(); if (quitRatio < user.getMatchQuitRatio()) { String message = new StringBuilder("Your quit ratio ").append(user.getMatchQuitRatio()) int minimumRating = table.getMatch().getOptions().getMinimumRating(); int userRating;
@Override public boolean canJoinTable(Table table) { if (table.isTournament()) { TournamentType tournamentType = table.getTournament().getTournamentType(); if(tournamentType != null && tournamentType.isDraft()) { return true; } } return false; } }
private void initTournamentTable(Table table) { this.matchId = table.getTournament().getId(); this.matchName = table.getName(); this.gameType = table.getGameType(); if (table.getTournament().getOptions().getNumberRounds() > 0) { this.gameType = new StringBuilder(this.gameType).append(' ').append(table.getTournament().getOptions().getNumberRounds()).append(" Rounds").toString(); StringBuilder sbDeckType = new StringBuilder(table.getDeckType()); if (!table.getTournament().getBoosterInfo().isEmpty()) { sbDeckType.append(' ').append(table.getTournament().getBoosterInfo()); if (table.getName() != null && !table.getName().isEmpty()) { sbDeckType.append(table.getDeckType()).append(" [").append(table.getName()).append(']'); for (TournamentPlayer tPlayer : table.getTournament().getPlayers()) { sb1.append(tPlayer.getPlayer().getName()).append(" (").append(tPlayer.getPoints()).append(" P.) "); if (!table.getTournament().getRounds().isEmpty()) { for (TournamentPlayer tPlayer : table.getTournament().getPlayers()) { sb2.append(tPlayer.getPlayer().getName()).append(": ").append(tPlayer.getResults()).append(' '); this.startTime = table.getTournament().getStartTime(); this.endTime = table.getTournament().getEndTime(); this.replayAvailable = false; this.rated = table.getTournament().getOptions().getMatchOptions().isRated();
private boolean updateDeck(UUID userId, UUID playerId, Deck deck) { boolean validDeck = true; if (table.isTournament()) { if (tournament != null) { validDeck = TournamentManager.instance.updateDeck(tournament.getId(), playerId, deck); } else { logger.fatal("Tournament == null table: " + table.getId() + " userId: " + userId); } } else if (TableState.SIDEBOARDING == table.getState()) { validDeck = match.updateDeck(playerId, deck); } else { // deck was meanwhile submitted so the autoupdate can be ignored } return validDeck; }
@Override public int compare(Table one, Table two) { if (one.getState() != null && two.getState() != null) { if (TableState.SIDEBOARDING != one.getState() && TableState.DUELING != one.getState()) { if (one.getState().compareTo(two.getState()) != 0) { return one.getState().compareTo(two.getState()); } else if (TableState.SIDEBOARDING != two.getState() && TableState.DUELING != two.getState()) { if (one.getState().compareTo(two.getState()) != 0) { return one.getState().compareTo(two.getState()); if (two.getEndTime() != null) { if (one.getEndTime() == null) { return 1; } else { return two.getEndTime().compareTo(one.getEndTime()); } else if (one.getEndTime() != null) { return -1; if (two.getStartTime() != null) { if (one.getStartTime() == null) { return 1; } else { return two.getStartTime().compareTo(one.getStartTime()); } else if (one.getStartTime() != null) { return -1; if (two.getCreateTime() != null) {
public int getNumberOfNotFinishedTables() { int number = 0; for (Table table : tables.values()) { if (table.getState() == TableState.FINISHED) { number++; } else { Optional<TableController> tableController = TableManager.instance.getController(table.getId()); if (!tableController.isPresent()) { logger.error("table not found : " + table.getId()); } else if (tableController.get().isUserStillActive(userId)) { number++; } } } return number; }
public boolean isTournamentStillValid() { if (table.getTournament() != null) { if (table.getState() != TableState.WAITING && table.getState() != TableState.READY_TO_START && table.getState() != TableState.STARTING) { return TournamentManager.instance.getTournamentController(table.getTournament().getId()) .map(tc -> tc.isTournamentStillValid(table.getState())) .orElse(false); } else { // check if table creator is still a valid user, if not removeUserFromAllTablesAndChat table return UserManager.instance.getUser(userId).isPresent(); } } return false; }
public synchronized void startMatch() { if (table.getState() == TableState.STARTING) { try { if (table.isTournamentSubTable()) { logger.info("Tourn. match started id:" + match.getId() + " tournId: " + table.getTournament().getId()); } else { UserManager.instance.getUser(userId).ifPresent(user -> { logger.info("MATCH started [" + match.getName() + "] " + match.getId() + '(' + user.getName() + ')'); logger.debug("- " + match.getOptions().getGameType() + " - " + match.getOptions().getDeckType()); }); } match.startMatch(); startGame(null); } catch (GameException ex) { logger.fatal("Error starting match ", ex); match.endGame(); } } }
private void reconnect() { logger.trace(userName + " started reconnect"); for (Entry<UUID, Table> entry : tables.entrySet()) { ccJoinedTable(entry.getValue().getRoomId(), entry.getValue().getId(), entry.getValue().isTournament());