server, refactor: added client side info about current table and parent table (tourney's sub-tables with matches);

This commit is contained in:
Oleg Agafonov 2024-08-11 19:29:42 +04:00
parent bd7aaa34ee
commit 7916af0e52
21 changed files with 315 additions and 161 deletions

View file

@ -37,7 +37,7 @@ import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
/**
* @author BetaSteward_at_googlemail.com
* @author BetaSteward_at_googlemail.com, JayDi85
*/
public class TableController {
@ -204,7 +204,7 @@ public class TableController {
if (seat.getPlayer().isHuman()) {
seat.getPlayer().setUserData(user.getUserData());
user.addTable(player.getId(), table);
user.ccJoinedTable(table.getRoomId(), table.getId(), true);
user.ccJoinedTable(table.getRoomId(), table.getId(), table.getParentTableId(), true);
userPlayerMap.put(userId, player.getId());
}
@ -394,7 +394,7 @@ public class TableController {
if (!table.isTournamentSubTable()) {
user.addTable(player.getId(), table);
}
user.ccJoinedTable(table.getRoomId(), table.getId(), false);
user.ccJoinedTable(table.getRoomId(), table.getId(), table.getParentTableId(), false);
userPlayerMap.put(userId, player.getId());
}
@ -524,7 +524,7 @@ public class TableController {
public boolean watchTable(UUID userId) {
if (table.isTournament()) {
managerFactory.userManager().getUser(userId).ifPresent(user -> user.ccShowTournament(table.getTournament().getId()));
managerFactory.userManager().getUser(userId).ifPresent(user -> user.ccShowTournament(table.getId(), table.getTournament().getId()));
return true;
} else {
if (table.isTournamentSubTable() && !table.getTournament().getOptions().isWatchingAllowed()) {
@ -541,7 +541,7 @@ public class TableController {
if (!_user.isPresent()) {
return false;
}
return _user.get().ccWatchGame(match.getGame().getId());
return _user.get().ccWatchGame(table.getId(), table.getParentTableId(), match.getGame().getId());
}
}
@ -685,7 +685,7 @@ public class TableController {
Optional<User> _user = managerFactory.userManager().getUser(entry.getKey());
if (_user.isPresent()) {
User user = _user.get();
user.ccGameStarted(match.getGame().getId(), entry.getValue());
user.ccGameStarted(table.getId(), table.getParentTableId(), match.getGame().getId(), entry.getValue());
if (creator == null) {
creator = user.getName();
@ -744,7 +744,7 @@ public class TableController {
for (Entry<UUID, UUID> entry : userPlayerMap.entrySet()) {
managerFactory.userManager().getUser(entry.getKey()).ifPresent(user -> {
logger.info(new StringBuilder("User ").append(user.getName()).append(" tournament started: ").append(tournament.getId()).append(" userId: ").append(user.getId()));
user.ccTournamentStarted(tournament.getId(), entry.getValue());
user.ccTournamentStarted(table.getId(), tournament.getId(), entry.getValue());
});
}
ServerMessagesUtil.instance.incTournamentsStarted();
@ -757,13 +757,13 @@ public class TableController {
}
public void startDraft(Draft draft) {
table.initDraft();
table.initDraft(draft);
managerFactory.draftManager().createDraftSession(draft, userPlayerMap, table.getId());
for (Entry<UUID, UUID> entry : userPlayerMap.entrySet()) {
Optional<User> user = managerFactory.userManager().getUser(entry.getKey());
if (user.isPresent()) {
logger.info(new StringBuilder("User ").append(user.get().getName()).append(" draft started: ").append(draft.getId()).append(" userId: ").append(user.get().getId()));
user.get().ccDraftStarted(draft.getId(), entry.getValue());
user.get().ccDraftStarted(table.getId(), draft.getId(), entry.getValue());
} else {
logger.fatal(new StringBuilder("Start draft user not found userId: ").append(entry.getKey()));
}
@ -776,7 +776,7 @@ public class TableController {
if (entry.getValue().equals(playerId)) {
Optional<User> user = managerFactory.userManager().getUser(entry.getKey());
int remaining = (int) futureTimeout.getDelay(TimeUnit.SECONDS);
user.ifPresent(user1 -> user1.ccSideboard(deck, table.getId(), remaining, options.isLimited()));
user.ifPresent(user1 -> user1.ccSideboard(deck, table.getId(), table.getParentTableId(), remaining, options.isLimited()));
break;
}
}

View file

@ -10,6 +10,7 @@ import mage.interfaces.callback.ClientCallback;
import mage.interfaces.callback.ClientCallbackMethod;
import mage.players.net.UserData;
import mage.server.draft.DraftSession;
import mage.server.game.GameController;
import mage.server.game.GameSessionPlayer;
import mage.server.managers.ManagerFactory;
import mage.server.rating.GlickoRating;
@ -262,41 +263,77 @@ public class User {
}
}
public void ccJoinedTable(final UUID roomId, final UUID tableId, boolean isTournament) {
fireCallback(new ClientCallback(ClientCallbackMethod.JOINED_TABLE, tableId, new TableClientMessage(roomId, tableId, isTournament)));
public void ccJoinedTable(final UUID roomId, final UUID currentTableId, final UUID parentTableId, boolean isTournament) {
fireCallback(new ClientCallback(
ClientCallbackMethod.JOINED_TABLE,
currentTableId,
new TableClientMessage().withRoom(roomId).withTable(currentTableId, parentTableId).withFlag(isTournament)
));
}
public void ccGameStarted(final UUID gameId, final UUID playerId) {
fireCallback(new ClientCallback(ClientCallbackMethod.START_GAME, gameId, new TableClientMessage(gameId, playerId)));
public void ccGameStarted(final UUID currentTableId, final UUID parentTableId, final UUID gameId, final UUID playerId) {
fireCallback(new ClientCallback(
ClientCallbackMethod.START_GAME,
gameId,
new TableClientMessage().withTable(currentTableId, parentTableId).withGame(gameId).withPlayer(playerId)
));
}
public void ccDraftStarted(final UUID draftId, final UUID playerId) {
fireCallback(new ClientCallback(ClientCallbackMethod.START_DRAFT, draftId, new TableClientMessage(draftId, playerId)));
public void ccDraftStarted(final UUID tableId, final UUID draftId, final UUID playerId) {
fireCallback(new ClientCallback(
ClientCallbackMethod.START_DRAFT,
draftId,
new TableClientMessage().withTable(tableId, null).withPlayer(playerId)
));
}
public void ccTournamentStarted(final UUID tournamentId, final UUID playerId) {
fireCallback(new ClientCallback(ClientCallbackMethod.START_TOURNAMENT, tournamentId, new TableClientMessage(tournamentId, playerId)));
public void ccTournamentStarted(final UUID tableID, final UUID tournamentId, final UUID playerId) {
fireCallback(new ClientCallback(
ClientCallbackMethod.START_TOURNAMENT,
tournamentId,
new TableClientMessage().withTable(tableID, null).withPlayer(playerId)
));
}
public void ccSideboard(final Deck deck, final UUID tableId, final int time, boolean limited) {
fireCallback(new ClientCallback(ClientCallbackMethod.SIDEBOARD, tableId, new TableClientMessage(deck, tableId, time, limited)));
sideboarding.put(tableId, deck);
public void ccSideboard(final Deck deck, final UUID currentTableId, final UUID parentTableId, final int time, boolean limited) {
fireCallback(new ClientCallback(
ClientCallbackMethod.SIDEBOARD,
currentTableId,
new TableClientMessage().withDeck(deck).withTable(currentTableId, parentTableId).withTime(time).withFlag(limited)
));
sideboarding.put(currentTableId, deck);
}
public void ccViewLimitedDeck(final Deck deck, final UUID tableId, final int time, boolean limited) {
fireCallback(new ClientCallback(ClientCallbackMethod.VIEW_LIMITED_DECK, tableId, new TableClientMessage(deck, tableId, time, limited)));
public void ccViewLimitedDeck(final Deck deck, final UUID currentTableId, final UUID parentTableId, final int time, boolean limited) {
fireCallback(new ClientCallback(
ClientCallbackMethod.VIEW_LIMITED_DECK,
currentTableId,
new TableClientMessage().withDeck(deck).withTable(currentTableId, parentTableId).withTime(time).withFlag(limited)
));
}
public void ccViewSideboard(final UUID tableId, final UUID gameId, final UUID targetPlayerId) {
fireCallback(new ClientCallback(ClientCallbackMethod.VIEW_SIDEBOARD, tableId, new TableClientMessage(gameId, targetPlayerId)));
fireCallback(new ClientCallback(
ClientCallbackMethod.VIEW_SIDEBOARD,
tableId,
new TableClientMessage().withGame(gameId).withPlayer(targetPlayerId)
));
}
public void ccConstruct(final Deck deck, final UUID tableId, final int time) {
fireCallback(new ClientCallback(ClientCallbackMethod.CONSTRUCT, tableId, new TableClientMessage(deck, tableId, time)));
public void ccConstruct(final Deck deck, final UUID currentTableId, final UUID parentTableId, final int time) {
fireCallback(new ClientCallback(
ClientCallbackMethod.CONSTRUCT,
currentTableId,
new TableClientMessage().withDeck(deck).withTable(currentTableId, parentTableId).withTime(time)
));
}
public void ccShowTournament(final UUID tournamentId) {
fireCallback(new ClientCallback(ClientCallbackMethod.SHOW_TOURNAMENT, tournamentId));
public void ccShowTournament(final UUID tableId, final UUID tournamentId) {
fireCallback(new ClientCallback(
ClientCallbackMethod.SHOW_TOURNAMENT,
tournamentId,
new TableClientMessage().withTable(tableId, null)
));
}
public void showUserMessage(final String title, String message) {
@ -306,8 +343,12 @@ public class User {
fireCallback(new ClientCallback(ClientCallbackMethod.SHOW_USERMESSAGE, null, messageData));
}
public boolean ccWatchGame(final UUID gameId) {
fireCallback(new ClientCallback(ClientCallbackMethod.WATCHGAME, gameId));
public boolean ccWatchGame(final UUID currentTableId, final UUID parentTableId, final UUID gameId) {
fireCallback(new ClientCallback(
ClientCallbackMethod.WATCHGAME,
gameId,
new TableClientMessage().withTable(currentTableId, parentTableId)
));
return true;
}
@ -367,7 +408,7 @@ public class User {
// active tables
for (Entry<UUID, Table> entry : tables.entrySet()) {
ccJoinedTable(entry.getValue().getRoomId(), entry.getValue().getId(), entry.getValue().isTournament());
ccJoinedTable(entry.getValue().getRoomId(), entry.getValue().getId(), entry.getValue().getParentTableId(), entry.getValue().isTournament());
}
// active tourneys
@ -375,7 +416,7 @@ public class User {
Entry<UUID, UUID> next = iterator.next();
Optional<TournamentController> tournamentController = managerFactory.tournamentManager().getTournamentController(next.getValue());
if (tournamentController.isPresent()) {
ccTournamentStarted(next.getValue(), next.getKey());
ccTournamentStarted(tournamentController.get().getTableId(), next.getValue(), next.getKey());
tournamentController.get().rejoin(next.getKey());
} else {
iterator.remove(); // tournament has ended meanwhile
@ -384,14 +425,20 @@ public class User {
// active games
for (Entry<UUID, GameSessionPlayer> entry : gameSessions.entrySet()) {
ccGameStarted(entry.getValue().getGameId(), entry.getKey());
entry.getValue().init();
managerFactory.gameManager().sendPlayerString(entry.getValue().getGameId(), userId, "");
GameController gameController = managerFactory.gameManager().getGameController().getOrDefault(entry.getValue().getGameId(), null);
if (gameController != null) {
Table table = managerFactory.tableManager().getTable(gameController.getTableId());
if (table != null) {
ccGameStarted(table.getId(), table.getParentTableId(), entry.getValue().getGameId(), entry.getKey());
entry.getValue().init();
managerFactory.gameManager().sendPlayerString(entry.getValue().getGameId(), userId, "");
}
}
}
// active drafts
for (Entry<UUID, DraftSession> entry : draftSessions.entrySet()) {
ccDraftStarted(entry.getValue().getDraftId(), entry.getKey());
ccDraftStarted(entry.getValue().getDraft().getTableId(), entry.getValue().getDraft().getId(), entry.getKey());
entry.getValue().init();
entry.getValue().update();
}
@ -403,9 +450,9 @@ public class User {
// active sideboarding
for (Entry<UUID, Deck> entry : sideboarding.entrySet()) {
Optional<TableController> controller = managerFactory.tableManager().getController(entry.getKey());
if (controller.isPresent()) {
ccSideboard(entry.getValue(), entry.getKey(), controller.get().getRemainingTime(), controller.get().getOptions().isLimited());
TableController controller = managerFactory.tableManager().getController(entry.getKey()).orElse(null);
if (controller != null) {
ccSideboard(entry.getValue(), controller.getTable().getId(), controller.getTable().getParentTableId(), controller.getRemainingTime(), controller.getOptions().isLimited());
} else {
// Table is missing after connection was lost during sideboard.
// Means other players were removed or conceded the game?

View file

@ -156,8 +156,8 @@ public class DraftSession {
return new DraftPickView(draft.getPlayer(playerId), timeout);
}
public UUID getDraftId() {
return draft.getId();
public Draft getDraft() {
return draft;
}
public UUID getMarkedCard() {

View file

@ -378,9 +378,14 @@ public class GameController implements GameCallback {
if (session != null) {
problemPlayerFixes = "re-send start game event";
logger.warn("Send forced game start event for player " + player.getName() + " in gameId: " + game.getId());
user.ccGameStarted(session.getGameId(), player.getId());
session.init();
managerFactory.gameManager().sendPlayerString(session.getGameId(), user.getId(), "");
Table table = managerFactory.tableManager().getTable(this.tableId);
if (table != null) {
user.ccGameStarted(table.getId(), table.getParentTableId(), session.getGameId(), player.getId());
session.init();
managerFactory.gameManager().sendPlayerString(session.getGameId(), user.getId(), "");
} else {
logger.error("Can't find table on fix and re-send start game event: " + this.tableId);
}
} else {
throw new IllegalStateException("Wrong code usage: session can't be null cause it created in forced joinGame already");
//player.leave();
@ -735,9 +740,9 @@ public class GameController implements GameCallback {
if (isSideboardOnly) {
// sideboard data already sent in PlayerView, so no need to re-sent it TODO: re-sent deck instead?
user.ccViewSideboard(tableId, game.getId(), targetPlayerId);
user.ccViewSideboard(table.getId(), game.getId(), targetPlayerId);
} else {
user.ccViewLimitedDeck(deckSource.getDeckForViewer(), tableId, requestsOpen, true);
user.ccViewLimitedDeck(deckSource.getDeckForViewer(), table.getId(), table.getParentTableId(), requestsOpen, true);
}
}
@ -1410,4 +1415,8 @@ public class GameController implements GameCallback {
return fixedAlready;
}
public UUID getTableId() {
return tableId;
}
}

View file

@ -224,7 +224,7 @@ public class TournamentController {
try {
TableManager tableManager = managerFactory.tableManager();
Table table = tableManager.createTable(managerFactory.gamesRoomManager().getMainRoomId(), matchOptions);
table.setTournamentSubTable(true);
table.setTournamentSubTable(this.tableId);
table.setTournament(tournament);
table.setState(TableState.WAITING);
TournamentPlayer player1 = pair.getPlayer1();
@ -267,7 +267,7 @@ public class TournamentController {
try {
TableManager tableManager = managerFactory.tableManager();
Table table = tableManager.createTable(managerFactory.gamesRoomManager().getMainRoomId(), matchOptions);
table.setTournamentSubTable(true);
table.setTournamentSubTable(this.tableId);
table.setTournament(tournament);
table.setState(TableState.WAITING);
if (round.getAllPlayers().stream().allMatch(tournamentPlayer -> getPlayerUserId(tournamentPlayer.getPlayer().getId()).isPresent())) {
@ -397,7 +397,7 @@ public class TournamentController {
} else {
managerFactory.draftManager().getController(tableId).ifPresent(draftController -> {
draftController.getDraftSession(playerId).ifPresent(draftSession
-> managerFactory.draftManager().kill(draftSession.getDraftId(), userId));
-> managerFactory.draftManager().kill(draftSession.getDraft().getId(), userId));
});
}
@ -526,4 +526,8 @@ public class TournamentController {
}
return true;
}
public UUID getTableId() {
return tableId;
}
}

View file

@ -73,7 +73,7 @@ public class TournamentSession {
setupTimeout(timeout);
managerFactory.userManager().getUser(userId).ifPresent(user -> {
int remaining = (int) futureTimeout.getDelay(TimeUnit.SECONDS);
user.ccConstruct(tournament.getPlayer(playerId).getDeck(), tableId, remaining);
user.ccConstruct(tournament.getPlayer(playerId).getDeck(), tableId, null, remaining);
});
}
}