From bb512faa9878eb77a98d9d3b38e84b8698c7be49 Mon Sep 17 00:00:00 2001 From: spjspj Date: Mon, 19 Feb 2018 12:12:18 +1100 Subject: [PATCH] Add option to get debug information from game state in chat --- .../main/java/mage/server/ChatManager.java | 36 +++++-- .../java/mage/server/game/GameController.java | 94 +++++++++++++++++++ 2 files changed, 124 insertions(+), 6 deletions(-) diff --git a/Mage.Server/src/main/java/mage/server/ChatManager.java b/Mage.Server/src/main/java/mage/server/ChatManager.java index 371ead70e5f..d479f1b569f 100644 --- a/Mage.Server/src/main/java/mage/server/ChatManager.java +++ b/Mage.Server/src/main/java/mage/server/ChatManager.java @@ -28,6 +28,7 @@ package mage.server; import java.util.*; +import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; @@ -37,6 +38,8 @@ import java.util.regex.Pattern; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; import mage.server.exceptions.UserNotFoundException; +import mage.server.game.GameController; +import mage.server.game.GameManager; import mage.server.util.SystemUtil; import mage.view.ChatMessage.MessageColor; import mage.view.ChatMessage.MessageType; @@ -220,6 +223,27 @@ public enum ChatManager { chatSessions.get(chatId).broadcastInfoToUser(user, message); return true; } + if (command.startsWith("GAME")) { + message += "
" + GameManager.instance.getChatId(chatId); + ChatSession session = chatSessions.get(chatId); + if (session != null && session.getInfo() != null) { + String gameId = session.getInfo(); + if (gameId.startsWith("Game ")) { + UUID id = java.util.UUID.fromString(gameId.substring(5, gameId.length())); + for (Entry entry : GameManager.instance.getGameController().entrySet()) { + if (entry.getKey().equals(id)) { + GameController controller = entry.getValue(); + if (controller != null) { + message += controller.getGameStateDebugMessage(); + chatSessions.get(chatId).broadcastInfoToUser(user, message); + } + } + } + + } + } + return true; + } if (command.startsWith("CARD ")) { Matcher matchPattern = getCardTextPattern.matcher(message.toLowerCase()); if (matchPattern.find()) { @@ -289,18 +313,18 @@ public enum ChatManager { public void sendReconnectMessage(UUID userId) { UserManager.instance.getUser(userId).ifPresent(user -> getChatSessions() - .stream() - .filter(chat -> chat.hasUser(userId)) - .forEach(chatSession -> chatSession.broadcast(null, user.getName() + " has reconnected", MessageColor.BLUE, true, MessageType.STATUS, null))); + .stream() + .filter(chat -> chat.hasUser(userId)) + .forEach(chatSession -> chatSession.broadcast(null, user.getName() + " has reconnected", MessageColor.BLUE, true, MessageType.STATUS, null))); } public void sendLostConnectionMessage(UUID userId, DisconnectReason reason) { UserManager.instance.getUser(userId).ifPresent(user -> getChatSessions() - .stream() - .filter(chat -> chat.hasUser(userId)) - .forEach(chatSession -> chatSession.broadcast(null, user.getName() + reason.getMessage(), MessageColor.BLUE, true, MessageType.STATUS, null))); + .stream() + .filter(chat -> chat.hasUser(userId)) + .forEach(chatSession -> chatSession.broadcast(null, user.getName() + reason.getMessage(), MessageColor.BLUE, true, MessageType.STATUS, null))); } diff --git a/Mage.Server/src/main/java/mage/server/game/GameController.java b/Mage.Server/src/main/java/mage/server/game/GameController.java index d039beff8da..1af7921751c 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -50,6 +50,7 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.GameException; import mage.game.GameOptions; +import mage.game.GameState; import mage.game.Table; import mage.game.events.Listener; import mage.game.events.PlayerQueryEvent; @@ -1088,4 +1089,97 @@ public class GameController implements GameCallback { return false; } + public String getGameStateDebugMessage() { + if (game == null) { + return ""; + } + GameState state = game.getState(); + if (state == null) { + return ""; + } + StringBuilder sb = new StringBuilder(); + sb.append("
Game State:
"); + sb.append(state); + + sb.append("
Active player is: "); + sb.append(game.getPlayer(state.getActivePlayerId()).getName()); + sb.append("
isGameOver: "); + sb.append(state.isGameOver()); + sb.append("
Current phase is: "); + sb.append(state.getTurn().getPhase()); + sb.append("
getBattlefield: "); + sb.append(state.getBattlefield()); + sb.append("
getChoosingPlayerId: "); + if (state.getChoosingPlayerId() != null) { + sb.append(game.getPlayer(state.getChoosingPlayerId()).getName()); + } else { + sb.append("noone!"); + } + sb.append("
getCombat: "); + sb.append(state.getCombat()); + sb.append("
getCommand: "); + sb.append(state.getCommand()); + sb.append("
getContinuousEffects: "); + sb.append(state.getContinuousEffects()); + sb.append("
getCopiedCards: "); + sb.append(state.getCopiedCards()); + sb.append("
getDelayed: "); + sb.append(state.getDelayed()); + sb.append("
getDesignations: "); + sb.append(state.getDesignations()); + sb.append("
getExile: "); + sb.append(state.getExile()); + sb.append("
getMonarchId: "); + sb.append(state.getMonarchId()); + sb.append("
getNextPermanentOrderNumber: "); + sb.append(state.getNextPermanentOrderNumber()); + sb.append("
getPlayerByOrderId: "); + if (state.getPlayerByOrderId() != null) { + sb.append(game.getPlayer(state.getPlayerByOrderId()).getName()); + } else { + sb.append("noone!"); + } + sb.append("
getPlayerList: "); + sb.append(state.getPlayerList()); + sb.append("
getPlayers: "); + sb.append(state.getPlayers()); + sb.append("
Player with Priority is: "); + if (state.getPriorityPlayerId() != null) { + sb.append(game.getPlayer(state.getPriorityPlayerId()).getName()); + } else { + sb.append("noone!"); + } + sb.append("
getRevealed: "); + sb.append(state.getRevealed()); + sb.append("
getSpecialActions: "); + sb.append(state.getSpecialActions()); + sb.append("
getStack: "); + sb.append(state.getStack()); + sb.append("
getStepNum: "); + sb.append(state.getStepNum()); + sb.append("
getTriggers: "); + sb.append(state.getTriggers()); + sb.append("
getTurn: "); + sb.append(state.getTurn()); + sb.append("
getTurnId: "); + sb.append(state.getTurnId()); + sb.append("
getTurnMods: "); + sb.append(state.getTurnMods()); + sb.append("
getTurnNum: "); + sb.append(state.getTurnNum()); + sb.append("
Future Timeout:"); + if (futureTimeout != null) { + sb.append("Cancelled?="); + sb.append(futureTimeout.isCancelled()); + sb.append(",,,Done?="); + sb.append(futureTimeout.isDone()); + sb.append(",,,GetDelay?="); + sb.append((int) futureTimeout.getDelay(TimeUnit.SECONDS)); + } else { + sb.append("Not using future Timeout!"); + } + sb.append("
"); + return sb.toString(); + } + }