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();
+ }
+
}