diff --git a/Mage.Server/src/main/java/mage/server/ChatManager.java b/Mage.Server/src/main/java/mage/server/ChatManager.java index 04743136f13..3779a6f055d 100644 --- a/Mage.Server/src/main/java/mage/server/ChatManager.java +++ b/Mage.Server/src/main/java/mage/server/ChatManager.java @@ -159,10 +159,10 @@ public class ChatManager { } public void removeUser(UUID userId, User.DisconnectReason reason) { - Logger.getLogger(ChatManager.class).debug("Remove user start"); + Logger.getLogger(ChatManager.class).debug("ChatManager: Remove user start"); for (ChatSession chat: chatSessions.values()) { chat.kill(userId, reason); } - Logger.getLogger(ChatManager.class).debug("Remove user end"); + Logger.getLogger(ChatManager.class).debug("ChatManager: Remove user end"); } } diff --git a/Mage.Server/src/main/java/mage/server/ChatSession.java b/Mage.Server/src/main/java/mage/server/ChatSession.java index de6aac5ef03..fdcb8aaa6b8 100644 --- a/Mage.Server/src/main/java/mage/server/ChatSession.java +++ b/Mage.Server/src/main/java/mage/server/ChatSession.java @@ -66,12 +66,11 @@ public class ChatSession { } synchronized public void kill(UUID userId, User.DisconnectReason reason) { - if (userId != null && clients.containsKey(userId)) { - logger.debug("kill user: Start kill userId " + userId); + if (userId != null && clients.containsKey(userId)) { String userName = clients.get(userId); - String message; + logger.debug(userName + " leaves chat: " + chatId); clients.remove(userId); - logger.debug("kill user: After remove " + userId); + String message; switch (reason) { case Disconnected: message = " has left MAGE"; @@ -83,7 +82,7 @@ public class ChatSession { message = " has left chat"; } broadcast(null, new StringBuilder(userName).append(message).toString(), MessageColor.BLUE, true, MessageType.STATUS); - logger.debug("kill user: " + userName + message + " " + chatId); + logger.debug(userName + "left chat with reason " + message + " " + chatId); } } diff --git a/Mage.Server/src/main/java/mage/server/TableManager.java b/Mage.Server/src/main/java/mage/server/TableManager.java index 6a6d97a29d8..cb29b7696a3 100644 --- a/Mage.Server/src/main/java/mage/server/TableManager.java +++ b/Mage.Server/src/main/java/mage/server/TableManager.java @@ -207,7 +207,8 @@ public class TableManager { } public void leaveTable(UUID userId, UUID tableId) { - if (controllers.containsKey(tableId)) { + TableController tableController = controllers.get(tableId); + if (tableController != null) { // table not started yet and user is the owner, remove the table Table table = getTable(tableId); if (table != null @@ -217,7 +218,7 @@ public class TableManager { removeTable(tableId); } else { - controllers.get(tableId).leaveTable(userId); + tableController.leaveTable(userId); } } } diff --git a/Mage.Server/src/main/java/mage/server/User.java b/Mage.Server/src/main/java/mage/server/User.java index 0d92ae30128..d626769b659 100644 --- a/Mage.Server/src/main/java/mage/server/User.java +++ b/Mage.Server/src/main/java/mage/server/User.java @@ -321,15 +321,19 @@ public class User { } public void kill(DisconnectReason reason) { + logger.debug("kill: game sessions " + gameSessions.size()); for (GameSession gameSession: gameSessions.values()) { gameSession.kill(); } + logger.debug("kill: draft sessions " + draftSessions.size()); for (DraftSession draftSession: draftSessions.values()) { draftSession.setKilled(); } + logger.debug("kill: tournament sessions " + tournamentSessions.size()); for (TournamentSession tournamentSession: tournamentSessions.values()) { tournamentSession.setKilled(); } + logger.debug("kill: tables " + tables.size()); for (Entry entry: tables.entrySet()) { TableManager.getInstance().leaveTable(userId, entry.getValue().getId()); } diff --git a/Mage.Server/src/main/java/mage/server/UserManager.java b/Mage.Server/src/main/java/mage/server/UserManager.java index e9f37c7f1a6..b16d98bb20c 100644 --- a/Mage.Server/src/main/java/mage/server/UserManager.java +++ b/Mage.Server/src/main/java/mage/server/UserManager.java @@ -58,6 +58,16 @@ public class UserManager { } private UserManager() { + + Thread.setDefaultUncaughtExceptionHandler( + new Thread.UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread t, Throwable e) { + System.out.println(t.getName() + ": " + e.getMessage()); + e.printStackTrace(); + } + }); + expireExecutor.scheduleAtFixedRate(new Runnable() { @Override public void run() { @@ -109,7 +119,7 @@ public class UserManager { if (users.containsKey(userId)) { User user = users.get(userId); user.setSessionId(""); // Session will be set again with new id if user reconnects - ChatManager.getInstance().broadcast(userId, "has lost connection", MessageColor.BLACK); + // ChatManager.getInstance().broadcast(userId, "has lost connection", MessageColor.BLACK); logger.info(new StringBuilder("User ").append(user.getName()).append(" has lost connection userId:").append(userId)); } ChatManager.getInstance().removeUser(userId, reason); @@ -130,8 +140,8 @@ public class UserManager { .append(" userId: ").append(userId) .append(" sessionId: ").append(user.getSessionId()) .append(" Reason: ").append(reason.toString())); - ChatManager.getInstance().removeUser(userId, reason); ChatManager.getInstance().broadcast(userId, new StringBuilder("has disconnected (").append(reason.toString()).append(")").toString(), MessageColor.BLACK); + ChatManager.getInstance().removeUser(userId, reason); users.get(userId).kill(reason); users.remove(userId); } else {