diff --git a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java
index 92cc8f2f8d3..512a6cfa8bf 100644
--- a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java
+++ b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java
@@ -433,7 +433,8 @@ public class CallbackClientImpl implements CallbackClient {
.append(KeyEvent.getKeyText(PreferencesDialog.getCurrentControlKey(PreferencesDialog.KEY_CONTROL_TOGGLE_MACRO)))
.append(" - Toggle recording a sequence of actions to repeat. Will not pause if interrupted and can fail if a selected card changes such as when scrying top card to bottom.")
.append("
").append(System.getProperty("os.name").contains("Mac OS X") ? "Cmd" : "Ctrl").append(" + click - Hold priority while casting a spell or activating an ability")
- .append("
").append("Type /FIX message in chat to fix freezed game")
+ .append("
").append("Type /fix message in chat to fix freezed game")
+ .append("
").append("Type /pings message in chat to show players and watchers ping")
.toString(),
null, MessageType.USER_INFO, ChatMessage.MessageColor.BLUE);
break;
diff --git a/Mage.Server/src/main/java/mage/server/ChatManager.java b/Mage.Server/src/main/java/mage/server/ChatManager.java
index 0676e316863..82a8d2f7bd0 100644
--- a/Mage.Server/src/main/java/mage/server/ChatManager.java
+++ b/Mage.Server/src/main/java/mage/server/ChatManager.java
@@ -201,7 +201,7 @@ public enum ChatManager {
return true;
}
if (command.startsWith("GAME")) {
- message += "
" + GameManager.instance.getChatId(chatId);
+ message += "
";
ChatSession session = chatSessions.get(chatId);
if (session != null && session.getInfo() != null) {
String gameId = session.getInfo();
@@ -222,7 +222,7 @@ public enum ChatManager {
return true;
}
if (command.startsWith("FIX")) {
- message += "
" + GameManager.instance.getChatId(chatId);
+ message += "
";
ChatSession session = chatSessions.get(chatId);
if (session != null && session.getInfo() != null) {
String gameId = session.getInfo();
@@ -242,6 +242,27 @@ public enum ChatManager {
}
return true;
}
+ if (command.equals("PINGS")) {
+ message += "
";
+ 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));
+ for (Entry entry : GameManager.instance.getGameController().entrySet()) {
+ if (entry.getKey().equals(id)) {
+ GameController controller = entry.getValue();
+ if (controller != null) {
+ message += controller.getPingsInfo();
+ chatSessions.get(chatId).broadcastInfoToUser(user, message);
+ }
+ }
+ }
+
+ }
+ }
+ return true;
+ }
if (command.startsWith("CARD ")) {
Matcher matchPattern = getCardTextPattern.matcher(message.toLowerCase(Locale.ENGLISH));
if (matchPattern.find()) {
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 86818d955cf..84a14fbff68 100644
--- a/Mage.Server/src/main/java/mage/server/game/GameController.java
+++ b/Mage.Server/src/main/java/mage/server/game/GameController.java
@@ -1188,6 +1188,29 @@ public class GameController implements GameCallback {
return player != null ? player.getName() : "-";
}
+ public String getPingsInfo() {
+ List usersInfo = new ArrayList<>();
+ for (Map.Entry entry : userPlayerMap.entrySet()) {
+ Optional user = UserManager.instance.getUser(entry.getKey());
+ user.ifPresent(u -> usersInfo.add(u.getName() + ": " + u.getPingInfo()));
+ }
+ Collections.sort(usersInfo);
+ usersInfo.add(0, "Players ping:");
+
+ List watchersinfo = new ArrayList<>();
+ for (Map.Entry entry : watchers.entrySet()) {
+ Optional user = UserManager.instance.getUser(entry.getValue().userId);
+ user.ifPresent(u -> watchersinfo.add(u.getName() + ": " + u.getPingInfo()));
+ }
+ Collections.sort(watchersinfo);
+ if (watchersinfo.size() > 0) {
+ watchersinfo.add(0, "Watchers ping:");
+ }
+
+ usersInfo.addAll(watchersinfo);
+ return String.join("
", usersInfo);
+ }
+
public String attemptToFixGame() {
// try to fix disconnects