diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 9a9de3cc922..c14ab9682a0 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -856,6 +856,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { if (session.isConnected()) { if (JOptionPane.showConfirmDialog(this, "Are you sure you want to disconnect?", "Confirm disconnect", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { session.disconnect(false); + tablesPane.clearChat(); showMessage("You have disconnected"); } } else { diff --git a/Mage.Client/src/main/java/mage/client/chat/ChatPanel.java b/Mage.Client/src/main/java/mage/client/chat/ChatPanel.java index 1131e7f1555..08cd8f82fb8 100644 --- a/Mage.Client/src/main/java/mage/client/chat/ChatPanel.java +++ b/Mage.Client/src/main/java/mage/client/chat/ChatPanel.java @@ -275,8 +275,7 @@ class TableModel extends AbstractTableModel { } public void clear() { - this.txtConversation.selectAll(); - this.txtConversation.replaceSelection(""); + this.txtConversation.setText(""); } /** This method is called from within the constructor to diff --git a/Mage.Client/src/main/java/mage/client/table/TablesPane.java b/Mage.Client/src/main/java/mage/client/table/TablesPane.java index 7ff06414d97..ca3051a618d 100644 --- a/Mage.Client/src/main/java/mage/client/table/TablesPane.java +++ b/Mage.Client/src/main/java/mage/client/table/TablesPane.java @@ -71,6 +71,9 @@ public class TablesPane extends MagePane { tablesPanel.hideTables(); } + public void clearChat() { + tablesPanel.getChatPanel().clear(); + } /** This method is called from within the constructor to * initialize the form. diff --git a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java index dfd93f255dc..a4c21530ee0 100644 --- a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java +++ b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java @@ -331,6 +331,11 @@ public class TablesPanel extends javax.swing.JPanel { } } + public ChatPanel getChatPanel() { + return this.chatPanel; + } + + /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is diff --git a/Mage.Common/src/mage/remote/SessionImpl.java b/Mage.Common/src/mage/remote/SessionImpl.java index 1af8d1faf51..224350b2bc6 100644 --- a/Mage.Common/src/mage/remote/SessionImpl.java +++ b/Mage.Common/src/mage/remote/SessionImpl.java @@ -177,8 +177,8 @@ public class SessionImpl implements Session { if (registerResult) { sessionState = SessionState.CONNECTED; serverState = server.getServerState(); - logger.info("Connected to MAGE server at " + connection.getHost() + ":" + connection.getPort()); - client.connected("Connected to " + connection.getHost() + ":" + connection.getPort() + " "); + logger.info(new StringBuilder("Connected as ").append(this.getUserName()).append(" to MAGE server at ").append(connection.getHost()).append(":").append(connection.getPort()).toString()); + client.connected(new StringBuilder("Connected as ").append(this.getUserName()).append(" to ").append(connection.getHost()).append(":").append(connection.getPort()).append(" ").toString()); return true; } disconnect(false); @@ -1189,7 +1189,9 @@ public class SessionImpl implements Session { public boolean ping() { try { if (isConnected()) { - server.ping(sessionId); + if (!server.ping(sessionId)) { + logger.error(new StringBuilder("Ping failed: ").append(this.getUserName()).append(" Session: ").append(sessionId).append(" to MAGE server at ").append(connection.getHost()).append(":").append(connection.getPort()).toString()); + } } return true; } catch (MageException ex) { diff --git a/Mage.Server/src/main/java/mage/server/ChatManager.java b/Mage.Server/src/main/java/mage/server/ChatManager.java index 4704c986516..ea6beccec1a 100644 --- a/Mage.Server/src/main/java/mage/server/ChatManager.java +++ b/Mage.Server/src/main/java/mage/server/ChatManager.java @@ -60,7 +60,7 @@ public class ChatManager { } public void leaveChat(UUID chatId, UUID userId) { - chatSessions.get(chatId).kill(userId); + chatSessions.get(chatId).kill(userId, User.DisconnectReason.CleaningUp); } public void destroyChatSession(UUID chatId) { @@ -87,15 +87,16 @@ public class ChatManager { User user = UserManager.getInstance().getUser(userId); if (user != null) { for (ChatSession chat: chatSessions.values()) { - if (chat.hasUser(userId)) + if (chat.hasUser(userId)) { chat.broadcast(user.getName(), message, color); + } } } } - public void removeUser(UUID userId) { + public void removeUser(UUID userId, User.DisconnectReason reason) { for (ChatSession chat: chatSessions.values()) { - chat.kill(userId); + chat.kill(userId, reason); } } } diff --git a/Mage.Server/src/main/java/mage/server/ChatSession.java b/Mage.Server/src/main/java/mage/server/ChatSession.java index c8d15646dcf..bcaafbca169 100644 --- a/Mage.Server/src/main/java/mage/server/ChatSession.java +++ b/Mage.Server/src/main/java/mage/server/ChatSession.java @@ -64,12 +64,23 @@ public class ChatSession { } } - public void kill(UUID userId) { + public void kill(UUID userId, User.DisconnectReason reason) { if (userId != null && clients.containsKey(userId)) { String userName = clients.get(userId); + String message; clients.remove(userId); - broadcast(userName, " has left", MessageColor.BLUE); - logger.info(userName + " has left chat " + chatId); + switch (reason) { + case Disconnected: + message = " has quit MAGE"; + break; + case SessionExpired: + message = " session expired"; + break; + default: + message = " has left chat"; + } + broadcast(userName, message, MessageColor.BLUE); + logger.info(userName + message + " " + chatId); } } @@ -86,10 +97,12 @@ public class ChatSession { logger.debug("Broadcasting '" + msg + "' for " + chatId); for (UUID userId: clients.keySet()) { User user = UserManager.getInstance().getUser(userId); - if (user != null) + if (user != null) { user.fireCallback(new ClientCallback("chatMessage", chatId, new ChatMessage(username, msg, time, color))); - else - kill(userId); + } + else { + kill(userId, User.DisconnectReason.CleaningUp); + } } } } diff --git a/Mage.Server/src/main/java/mage/server/Main.java b/Mage.Server/src/main/java/mage/server/Main.java index 22c8abfa6dc..5aaf76ebdb3 100644 --- a/Mage.Server/src/main/java/mage/server/Main.java +++ b/Mage.Server/src/main/java/mage/server/Main.java @@ -168,7 +168,7 @@ public class Main { sessionName = session.getHost(); } if (throwable instanceof ClientDisconnectedException) { - SessionManager.getInstance().disconnect(client.getSessionId(), false); + SessionManager.getInstance().disconnect(client.getSessionId(), true); logger.info("client disconnected - " + sessionName); } else { diff --git a/Mage.Server/src/main/java/mage/server/Session.java b/Mage.Server/src/main/java/mage/server/Session.java index 1d3c22d3cfd..e9a5eacbdfb 100644 --- a/Mage.Server/src/main/java/mage/server/Session.java +++ b/Mage.Server/src/main/java/mage/server/Session.java @@ -163,7 +163,7 @@ public class Session { public void kill() { logger.info("session killed for user " + userId); - UserManager.getInstance().removeUser(userId); + UserManager.getInstance().removeUser(userId, User.DisconnectReason.Disconnected); } synchronized void fireCallback(final ClientCallback call) { diff --git a/Mage.Server/src/main/java/mage/server/SessionManager.java b/Mage.Server/src/main/java/mage/server/SessionManager.java index fd2a3303da3..537411da702 100644 --- a/Mage.Server/src/main/java/mage/server/SessionManager.java +++ b/Mage.Server/src/main/java/mage/server/SessionManager.java @@ -99,7 +99,7 @@ public class SessionManager { public synchronized void disconnect(String sessionId, boolean voluntary) { Session session = sessions.get(sessionId); - sessions.remove(sessionId); + sessions.remove(sessionId); if (session != null) { if (voluntary) { session.kill(); diff --git a/Mage.Server/src/main/java/mage/server/User.java b/Mage.Server/src/main/java/mage/server/User.java index 43c3f6cd03e..5aa2003ea42 100644 --- a/Mage.Server/src/main/java/mage/server/User.java +++ b/Mage.Server/src/main/java/mage/server/User.java @@ -56,6 +56,10 @@ public class User { Created, Connected, Disconnected, Reconnected; } + public enum DisconnectReason { + SessionExpired, Disconnected, CleaningUp; + } + private UUID userId = UUID.randomUUID(); private String userName; private String sessionId = ""; @@ -64,7 +68,7 @@ public class User { private Date lastActivity = new Date(); private UserState userState; private Map tables = new HashMap(); - private Map gameSessions = new HashMap(); + private Map gameSessions = new HashMap(); private Map draftSessions = new HashMap(); private Map tournamentSessions = new HashMap(); private Map constructing = new HashMap(); @@ -98,14 +102,14 @@ public class User { this.sessionId = sessionId; if (sessionId.isEmpty()) { userState = UserState.Disconnected; - logger.info("User " + userName + " disconnected"); + logger.info(new StringBuilder("User ").append(userName).append(" disconnected").toString()); } else if (userState == UserState.Created) { userState = UserState.Connected; - logger.info("User " + userName + " created"); + logger.info(new StringBuilder("User ").append(userName).append(" created").toString()); } else { userState = UserState.Reconnected; reconnect(); - logger.info("User " + userName + " reconnected"); + logger.info(new StringBuilder("User ").append(userName).append(" reconnected").toString()); } } @@ -184,6 +188,7 @@ public class User { } public boolean isExpired(Date expired) { + logger.trace(new StringBuilder("isExpired: User ").append(userName).append(" lastActivity: ").append(lastActivity).append(" expired: ").append(expired).toString()); return /*userState == UserState.Disconnected && */ lastActivity.before(expired); } @@ -259,7 +264,7 @@ public class User { sideboarding.remove(tableId); } - public void kill() { + public void kill(DisconnectReason reason) { for (GameSession session: gameSessions.values()) { session.kill(); } @@ -275,6 +280,7 @@ public class User { TableManager.getInstance().removeTable(userId, entry.getValue().getId()); } } + ChatManager.getInstance().removeUser(userId, reason); } public void setUserData(UserData userData) { diff --git a/Mage.Server/src/main/java/mage/server/UserManager.java b/Mage.Server/src/main/java/mage/server/UserManager.java index 6c3ad94ea0d..4855c35a990 100644 --- a/Mage.Server/src/main/java/mage/server/UserManager.java +++ b/Mage.Server/src/main/java/mage/server/UserManager.java @@ -102,7 +102,7 @@ public class UserManager { public void disconnect(UUID userId) { if (userId != null) { - ChatManager.getInstance().removeUser(userId); + ChatManager.getInstance().removeUser(userId, User.DisconnectReason.Disconnected); if (users.containsKey(userId)) { logger.info("user disconnected " + userId); users.get(userId).setSessionId(""); @@ -118,12 +118,12 @@ public class UserManager { return false; } - public void removeUser(UUID userId) { + public void removeUser(UUID userId, User.DisconnectReason reason) { if (users.containsKey(userId)) { logger.info("user removed" + userId); - users.get(userId).setSessionId(""); + ChatManager.getInstance().removeUser(userId, reason); ChatManager.getInstance().broadcast(userId, "has disconnected", MessageColor.BLACK); - users.get(userId).kill(); + users.get(userId).kill(User.DisconnectReason.Disconnected); users.remove(userId); } } @@ -142,7 +142,7 @@ public class UserManager { for (User user: users.values()) { if (user.isExpired(expired.getTime())) { logger.info(user.getName() + " session expired " + user.getId()); - user.kill(); + user.kill(User.DisconnectReason.SessionExpired); users.remove(user.getId()); } }