diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 1c407e05f8..f2246c76fb 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -746,6 +746,16 @@ public class MageFrame extends javax.swing.JFrame { this.tablesPane.hideTables(); } + public void hideGames() { + JInternalFrame[] windows = desktopPane.getAllFramesInLayer(javax.swing.JLayeredPane.DEFAULT_LAYER); + for (JInternalFrame window: windows) { + if (window instanceof GamePane) { + GamePane gamePane = (GamePane) window; + gamePane.hideGame(); + } + } + } + public void showDeckEditor(DeckEditorMode mode, Deck deck, UUID tableId, int time) { try { DeckEditorPane deckEditorPane = new DeckEditorPane(); @@ -826,6 +836,7 @@ public class MageFrame extends javax.swing.JFrame { public void setStatusText(String status) { this.lblStatus.setText(status); } + } class MagePaneMenuItem extends JCheckBoxMenuItem { diff --git a/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java b/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java index 294ebeac64..da912a551c 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java @@ -78,7 +78,7 @@ public class ConnectDialog extends MageDialog { this.chkAutoConnect.setSelected(Boolean.parseBoolean(MageFrame.getPreferences().get("autoConnect", "false"))); this.txtProxyServer.setText(MageFrame.getPreferences().get("proxyAddress", Config.serverName)); this.txtProxyPort.setText(MageFrame.getPreferences().get("proxyPort", Integer.toString(Config.port))); - this.cbProxyType.setSelectedItem(MageFrame.getPreferences().get("proxyType", Connection.ProxyType.NONE.toString())); + this.cbProxyType.setSelectedItem(Connection.ProxyType.valueOf(MageFrame.getPreferences().get("proxyType", "NONE").toUpperCase())); this.showProxySettings(); this.setModal(true); this.setLocation(50, 50); diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java index b790bb852a..c1bb8f30f3 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java @@ -318,6 +318,10 @@ public class NewTableDialog extends MageDialog { options.setRange((RangeOfInfluence) this.cbRange.getSelectedItem()); options.setWinsNeeded((Integer)this.spnNumWins.getValue()); table = session.createTable(roomId, options); + if (table == null) { + JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Error creating table.", "Error", JOptionPane.ERROR_MESSAGE); + return; + } try { if (session.joinTable(roomId, table.getTableId(), this.player1Panel.getPlayerName(), "Human", 1, Sets.loadDeck(this.player1Panel.getDeckFile()))) { for (TablePlayerPanel player: players) { diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java index bcf680160b..67bdb14292 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java @@ -308,6 +308,10 @@ public class NewTournamentDialog extends MageDialog { tOptions.getMatchOptions().setAttackOption(MultiplayerAttackOption.LEFT); tOptions.getMatchOptions().setRange(RangeOfInfluence.ALL); table = session.createTournamentTable(roomId, tOptions); + if (table == null) { + JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Error creating table.", "Error", JOptionPane.ERROR_MESSAGE); + return; + } if (session.joinTournamentTable(roomId, table.getTableId(), this.txtPlayer1Name.getText(), "Human", 1)) { for (TournamentPlayerPanel player: players) { if (!player.getPlayerType().equals("Human")) { diff --git a/Mage.Client/src/main/java/mage/client/game/GamePane.java b/Mage.Client/src/main/java/mage/client/game/GamePane.java index 2bae3de3b6..457726c3b8 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePane.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePane.java @@ -83,6 +83,10 @@ public class GamePane extends MagePane { this.toFront(); } + public void hideGame() { + gamePanel.hideGame(); + } + public void watchGame(UUID gameId) { this.setTitle("Watching " + gameId); gamePanel.watchGame(gameId); diff --git a/Mage.Client/src/main/java/mage/client/remote/Session.java b/Mage.Client/src/main/java/mage/client/remote/Session.java index 4bc11d37d5..f12d278d59 100644 --- a/Mage.Client/src/main/java/mage/client/remote/Session.java +++ b/Mage.Client/src/main/java/mage/client/remote/Session.java @@ -100,6 +100,8 @@ public class Session { } try { System.setSecurityManager(null); + System.setProperty("http.nonProxyHosts", "code.google.com"); + System.setProperty("socksNonProxyHosts", "code.google.com"); switch (connection.getProxyType()) { case SOCKS: System.setProperty("socksProxyHost", connection.getProxyHost()); @@ -157,7 +159,8 @@ public class Session { } try { //TODO: stop daemon - server.deregisterClient(sessionId); + if (server != null) + server.deregisterClient(sessionId); } catch (RemoteException ex) { logger.fatal("Error disconnecting ...", ex); } catch (MageException ex) { @@ -171,6 +174,7 @@ public class Session { if (future != null && !future.isDone()) future.cancel(true); server = null; + frame.hideGames(); frame.hideTables(); frame.setStatusText("Not connected"); frame.disableButtons(); diff --git a/Mage.Common/src/mage/interfaces/Server.java b/Mage.Common/src/mage/interfaces/Server.java index 852b9f0ded..08a9510c7e 100644 --- a/Mage.Common/src/mage/interfaces/Server.java +++ b/Mage.Common/src/mage/interfaces/Server.java @@ -122,5 +122,7 @@ public interface Server extends Remote, CallbackServer { //admin methods public List<UserView> getUsers(UUID sessionId) throws RemoteException, MageException; + public void disconnectUser(UUID sessionId, UUID userSessionId) throws RemoteException, MageException; + public void removeTable(UUID sessionId, UUID tableId) throws RemoteException, MageException; } diff --git a/Mage.Common/src/mage/view/UserView.java b/Mage.Common/src/mage/view/UserView.java index ef91e22892..73847d0127 100644 --- a/Mage.Common/src/mage/view/UserView.java +++ b/Mage.Common/src/mage/view/UserView.java @@ -46,6 +46,7 @@ public class UserView implements Serializable { this.userName = userName; this.host = host; this.sessionId = sessionId; + this.timeConnected = timeConnected; } public String getUserName() { diff --git a/Mage.Server.Console/src/main/java/mage/server/console/ConsoleFrame.java b/Mage.Server.Console/src/main/java/mage/server/console/ConsoleFrame.java index 724ff143cb..242ab054fb 100644 --- a/Mage.Server.Console/src/main/java/mage/server/console/ConsoleFrame.java +++ b/Mage.Server.Console/src/main/java/mage/server/console/ConsoleFrame.java @@ -34,12 +34,10 @@ package mage.server.console; -import java.util.logging.Level; import java.util.prefs.Preferences; import javax.swing.Box; import javax.swing.JOptionPane; import javax.swing.UIManager; -import javax.swing.UnsupportedLookAndFeelException; import mage.server.console.remote.Session; import mage.utils.MageVersion; import org.apache.log4j.Logger; diff --git a/Mage.Server.Console/src/main/java/mage/server/console/ConsolePanel.form b/Mage.Server.Console/src/main/java/mage/server/console/ConsolePanel.form index f709629d2b..f73700c30a 100644 --- a/Mage.Server.Console/src/main/java/mage/server/console/ConsolePanel.form +++ b/Mage.Server.Console/src/main/java/mage/server/console/ConsolePanel.form @@ -120,6 +120,9 @@ <Properties> <Property name="text" type="java.lang.String" value="Disconnect"/> </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnDisconnectActionPerformed"/> + </Events> </Component> </SubComponents> </Container> @@ -208,6 +211,9 @@ <Properties> <Property name="text" type="java.lang.String" value="Remove"/> </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnDeleteActionPerformed"/> + </Events> </Component> </SubComponents> </Container> diff --git a/Mage.Server.Console/src/main/java/mage/server/console/ConsolePanel.java b/Mage.Server.Console/src/main/java/mage/server/console/ConsolePanel.java index b1259c4831..1019fe330b 100644 --- a/Mage.Server.Console/src/main/java/mage/server/console/ConsolePanel.java +++ b/Mage.Server.Console/src/main/java/mage/server/console/ConsolePanel.java @@ -134,6 +134,11 @@ public class ConsolePanel extends javax.swing.JPanel { jPanel4.setVerifyInputWhenFocusTarget(false); btnDisconnect.setText("Disconnect"); + btnDisconnect.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnDisconnectActionPerformed(evt); + } + }); javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); jPanel4.setLayout(jPanel4Layout); @@ -182,6 +187,11 @@ public class ConsolePanel extends javax.swing.JPanel { ); btnDelete.setText("Remove"); + btnDelete.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnDeleteActionPerformed(evt); + } + }); javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6); jPanel6.setLayout(jPanel6Layout); @@ -226,6 +236,17 @@ public class ConsolePanel extends javax.swing.JPanel { .addComponent(jSplitPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 395, Short.MAX_VALUE) ); }// </editor-fold>//GEN-END:initComponents + + private void btnDisconnectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDisconnectActionPerformed + int row = this.tblUsers.getSelectedRow(); + ConsoleFrame.getSession().disconnectUser((UUID)tableUserModel.getValueAt(row, 3)); + }//GEN-LAST:event_btnDisconnectActionPerformed + + private void btnDeleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDeleteActionPerformed + int row = this.tblTables.getSelectedRow(); + ConsoleFrame.getSession().removeTable((UUID)tableTableModel.getValueAt(row, 7)); + }//GEN-LAST:event_btnDeleteActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnDelete; private javax.swing.JButton btnDisconnect; diff --git a/Mage.Server.Console/src/main/java/mage/server/console/remote/Session.java b/Mage.Server.Console/src/main/java/mage/server/console/remote/Session.java index 4b747911d5..847638bb7c 100644 --- a/Mage.Server.Console/src/main/java/mage/server/console/remote/Session.java +++ b/Mage.Server.Console/src/main/java/mage/server/console/remote/Session.java @@ -492,9 +492,9 @@ public class Session { return false; } - public boolean removeTable(UUID roomId, UUID tableId) { + public boolean removeTable(UUID tableId) { try { - server.removeTable(sessionId, roomId, tableId); + server.removeTable(sessionId, tableId); return true; } catch (RemoteException ex) { handleRemoteException(ex); @@ -672,6 +672,18 @@ public class Session { return null; } + public boolean disconnectUser(UUID userSessionId) { + try { + server.disconnectUser(sessionId, userSessionId); + return true; + } catch (RemoteException ex) { + handleRemoteException(ex); + } catch (MageException ex) { + handleMageException(ex); + } + return false; + } + private void handleRemoteException(RemoteException ex) { logger.fatal("Communication error", ex); if (ex instanceof java.rmi.ConnectException) { diff --git a/Mage.Server/src/main/java/mage/server/ServerImpl.java b/Mage.Server/src/main/java/mage/server/ServerImpl.java index bbae5591cc..8eff2ebce0 100644 --- a/Mage.Server/src/main/java/mage/server/ServerImpl.java +++ b/Mage.Server/src/main/java/mage/server/ServerImpl.java @@ -154,9 +154,11 @@ public class ServerImpl extends RemoteServer implements Server { @Override public TableView createTable(UUID sessionId, UUID roomId, MatchOptions options) throws MageException { try { - TableView table = GamesRoomManager.getInstance().getRoom(roomId).createTable(sessionId, options); - logger.info("Table " + table.getTableId() + " created"); - return table; + if (SessionManager.getInstance().isValidSession(sessionId)) { + TableView table = GamesRoomManager.getInstance().getRoom(roomId).createTable(sessionId, options); + logger.info("Table " + table.getTableId() + " created"); + return table; + } } catch (Exception ex) { handleException(ex); @@ -167,9 +169,11 @@ public class ServerImpl extends RemoteServer implements Server { @Override public TableView createTournamentTable(UUID sessionId, UUID roomId, TournamentOptions options) throws MageException { try { - TableView table = GamesRoomManager.getInstance().getRoom(roomId).createTournamentTable(sessionId, options); - logger.info("Tournament table " + table.getTableId() + " created"); - return table; + if (SessionManager.getInstance().isValidSession(sessionId)) { + TableView table = GamesRoomManager.getInstance().getRoom(roomId).createTournamentTable(sessionId, options); + logger.info("Tournament table " + table.getTableId() + " created"); + return table; + } } catch (Exception ex) { handleException(ex); @@ -179,27 +183,31 @@ public class ServerImpl extends RemoteServer implements Server { @Override public void removeTable(final UUID sessionId, final UUID roomId, final UUID tableId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - GamesRoomManager.getInstance().getRoom(roomId).removeTable(sessionId, tableId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + TableManager.getInstance().removeTable(sessionId, tableId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public boolean joinTable(UUID sessionId, UUID roomId, UUID tableId, String name, String playerType, int skill, DeckCardLists deckList) throws MageException, GameException { try { - boolean ret = GamesRoomManager.getInstance().getRoom(roomId).joinTable(sessionId, tableId, name, playerType, skill, deckList); - logger.info("Session " + sessionId + " joined table " + tableId); - return ret; + if (SessionManager.getInstance().isValidSession(sessionId)) { + boolean ret = GamesRoomManager.getInstance().getRoom(roomId).joinTable(sessionId, tableId, name, playerType, skill, deckList); + logger.info("Session " + sessionId + " joined table " + tableId); + return ret; + } } catch (Exception ex) { if (ex instanceof GameException) @@ -212,9 +220,11 @@ public class ServerImpl extends RemoteServer implements Server { @Override public boolean joinTournamentTable(UUID sessionId, UUID roomId, UUID tableId, String name, String playerType, int skill) throws MageException, GameException { try { - boolean ret = GamesRoomManager.getInstance().getRoom(roomId).joinTournamentTable(sessionId, tableId, name, playerType, skill); - logger.info("Session " + sessionId + " joined table " + tableId); - return ret; + if (SessionManager.getInstance().isValidSession(sessionId)) { + boolean ret = GamesRoomManager.getInstance().getRoom(roomId).joinTournamentTable(sessionId, tableId, name, playerType, skill); + logger.info("Session " + sessionId + " joined table " + tableId); + return ret; + } } catch (Exception ex) { if (ex instanceof GameException) @@ -227,9 +237,11 @@ public class ServerImpl extends RemoteServer implements Server { @Override public boolean submitDeck(UUID sessionId, UUID tableId, DeckCardLists deckList) throws MageException, GameException { try { - boolean ret = TableManager.getInstance().submitDeck(sessionId, tableId, deckList); - logger.info("Session " + sessionId + " submitted deck"); - return ret; + if (SessionManager.getInstance().isValidSession(sessionId)) { + boolean ret = TableManager.getInstance().submitDeck(sessionId, tableId, deckList); + logger.info("Session " + sessionId + " submitted deck"); + return ret; + } } catch (Exception ex) { if (ex instanceof GameException) @@ -299,52 +311,58 @@ public class ServerImpl extends RemoteServer implements Server { @Override public void startMatch(final UUID sessionId, final UUID roomId, final UUID tableId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - TableManager.getInstance().startMatch(sessionId, roomId, tableId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + TableManager.getInstance().startMatch(sessionId, roomId, tableId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public void startChallenge(final UUID sessionId, final UUID roomId, final UUID tableId, final UUID challengeId) throws RemoteException, MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - TableManager.getInstance().startChallenge(sessionId, roomId, tableId, challengeId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + TableManager.getInstance().startChallenge(sessionId, roomId, tableId, challengeId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public void startTournament(final UUID sessionId, final UUID roomId, final UUID tableId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - TableManager.getInstance().startTournament(sessionId, roomId, tableId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + TableManager.getInstance().startTournament(sessionId, roomId, tableId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @@ -445,35 +463,39 @@ public class ServerImpl extends RemoteServer implements Server { @Override public void swapSeats(final UUID sessionId, final UUID roomId, final UUID tableId, final int seatNum1, final int seatNum2) throws RemoteException, MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - TableManager.getInstance().swapSeats(tableId, sessionId, seatNum1, seatNum2); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + TableManager.getInstance().swapSeats(tableId, sessionId, seatNum1, seatNum2); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public void leaveTable(final UUID sessionId, final UUID roomId, final UUID tableId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - GamesRoomManager.getInstance().getRoom(roomId).leaveTable(sessionId, tableId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + GamesRoomManager.getInstance().getRoom(roomId).leaveTable(sessionId, tableId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @@ -490,52 +512,58 @@ public class ServerImpl extends RemoteServer implements Server { @Override public void joinGame(final UUID gameId, final UUID sessionId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - GameManager.getInstance().joinGame(gameId, sessionId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + GameManager.getInstance().joinGame(gameId, sessionId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public void joinDraft(final UUID draftId, final UUID sessionId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - DraftManager.getInstance().joinDraft(draftId, sessionId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + DraftManager.getInstance().joinDraft(draftId, sessionId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public void joinTournament(final UUID tournamentId, final UUID sessionId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - TournamentManager.getInstance().joinTournament(tournamentId, sessionId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + TournamentManager.getInstance().joinTournament(tournamentId, sessionId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @@ -563,76 +591,86 @@ public class ServerImpl extends RemoteServer implements Server { @Override public void sendPlayerUUID(final UUID gameId, final UUID sessionId, final UUID data) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - GameManager.getInstance().sendPlayerUUID(gameId, sessionId, data); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + GameManager.getInstance().sendPlayerUUID(gameId, sessionId, data); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public void sendPlayerString(final UUID gameId, final UUID sessionId, final String data) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - GameManager.getInstance().sendPlayerString(gameId, sessionId, data); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + GameManager.getInstance().sendPlayerString(gameId, sessionId, data); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public void sendPlayerBoolean(final UUID gameId, final UUID sessionId, final Boolean data) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - GameManager.getInstance().sendPlayerBoolean(gameId, sessionId, data); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + GameManager.getInstance().sendPlayerBoolean(gameId, sessionId, data); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public void sendPlayerInteger(final UUID gameId, final UUID sessionId, final Integer data) throws RemoteException, MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - GameManager.getInstance().sendPlayerInteger(gameId, sessionId, data); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + GameManager.getInstance().sendPlayerInteger(gameId, sessionId, data); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public DraftPickView sendCardPick(final UUID draftId, final UUID sessionId, final UUID cardPick) throws MageException { try { - return DraftManager.getInstance().sendCardPick(draftId, sessionId, cardPick); + if (SessionManager.getInstance().isValidSession(sessionId)) { + return DraftManager.getInstance().sendCardPick(draftId, sessionId, cardPick); + } } catch (Exception ex) { handleException(ex); @@ -642,25 +680,29 @@ public class ServerImpl extends RemoteServer implements Server { @Override public void concedeGame(final UUID gameId, final UUID sessionId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - GameManager.getInstance().concedeGame(gameId, sessionId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + GameManager.getInstance().concedeGame(gameId, sessionId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public boolean watchTable(UUID sessionId, UUID roomId, UUID tableId) throws MageException { try { - return GamesRoomManager.getInstance().getRoom(roomId).watchTable(sessionId, tableId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + return GamesRoomManager.getInstance().getRoom(roomId).watchTable(sessionId, tableId); + } } catch (Exception ex) { handleException(ex); @@ -670,120 +712,134 @@ public class ServerImpl extends RemoteServer implements Server { @Override public void watchGame(final UUID gameId, final UUID sessionId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - GameManager.getInstance().watchGame(gameId, sessionId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + GameManager.getInstance().watchGame(gameId, sessionId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public void stopWatching(final UUID gameId, final UUID sessionId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - GameManager.getInstance().stopWatching(gameId, sessionId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + GameManager.getInstance().stopWatching(gameId, sessionId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public void replayGame(final UUID gameId, final UUID sessionId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - ReplayManager.getInstance().replayGame(gameId, sessionId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + ReplayManager.getInstance().replayGame(gameId, sessionId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public void startReplay(final UUID gameId, final UUID sessionId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - ReplayManager.getInstance().startReplay(gameId, sessionId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + ReplayManager.getInstance().startReplay(gameId, sessionId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public void stopReplay(final UUID gameId, final UUID sessionId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - ReplayManager.getInstance().stopReplay(gameId, sessionId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + ReplayManager.getInstance().stopReplay(gameId, sessionId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public void nextPlay(final UUID gameId, final UUID sessionId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - ReplayManager.getInstance().nextPlay(gameId, sessionId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + ReplayManager.getInstance().nextPlay(gameId, sessionId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public void previousPlay(final UUID gameId, final UUID sessionId) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - ReplayManager.getInstance().previousPlay(gameId, sessionId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + ReplayManager.getInstance().previousPlay(gameId, sessionId); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @@ -806,43 +862,90 @@ public class ServerImpl extends RemoteServer implements Server { @Override public void cheat(final UUID gameId, final UUID sessionId, final UUID playerId, final DeckCardLists deckList) throws MageException { - try { - rmiExecutor.execute( - new Runnable() { - @Override - public void run() { - if (testMode) - GameManager.getInstance().cheat(gameId, sessionId, playerId, deckList); + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + if (testMode) + GameManager.getInstance().cheat(gameId, sessionId, playerId, deckList); + } } - } - ); - } - catch (Exception ex) { - handleException(ex); + ); + } + catch (Exception ex) { + handleException(ex); + } } } @Override public boolean cheat(final UUID gameId, final UUID sessionId, final UUID playerId, final String cardName) throws MageException { if (testMode) { - return GameManager.getInstance().cheat(gameId, sessionId, playerId, cardName); - } else { - return false; + if (SessionManager.getInstance().isValidSession(sessionId)) { + return GameManager.getInstance().cheat(gameId, sessionId, playerId, cardName); + } } - } + return false; + } public void handleException(Exception ex) throws MageException { logger.fatal("", ex); throw new MageException("Server error: " + ex.getMessage()); } + @Override public GameView getGameView(final UUID gameId, final UUID sessionId, final UUID playerId) { - return GameManager.getInstance().getGameView(gameId, sessionId, playerId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + return GameManager.getInstance().getGameView(gameId, sessionId, playerId); + } + return null; } @Override public List<UserView> getUsers(UUID sessionId) throws RemoteException, MageException { - return SessionManager.getInstance().getUsers(sessionId); + if (SessionManager.getInstance().isValidSession(sessionId)) { + return SessionManager.getInstance().getUsers(sessionId); + } + return null; } + @Override + public void disconnectUser(final UUID sessionId, final UUID userSessionId) throws RemoteException, MageException { + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + SessionManager.getInstance().disconnectUser(sessionId, userSessionId); + } + } + ); + } + catch (Exception ex) { + handleException(ex); + } + } + } + + @Override + public void removeTable(final UUID sessionId, final UUID tableId) throws RemoteException, MageException { + if (SessionManager.getInstance().isValidSession(sessionId)) { + try { + rmiExecutor.execute( + new Runnable() { + @Override + public void run() { + TableManager.getInstance().removeTable(sessionId, tableId); + } + } + ); + } + catch (Exception ex) { + handleException(ex); + } + } + } } diff --git a/Mage.Server/src/main/java/mage/server/SessionManager.java b/Mage.Server/src/main/java/mage/server/SessionManager.java index 597d498dcd..ae2b8601f0 100644 --- a/Mage.Server/src/main/java/mage/server/SessionManager.java +++ b/Mage.Server/src/main/java/mage/server/SessionManager.java @@ -124,6 +124,29 @@ public class SessionManager { return users; } + public void disconnectUser(UUID sessionId, UUID userSessionId) { + if (isAdmin(sessionId)) { + Session session = sessions.get(userSessionId); + if (session != null) { + session.kill(); + } + } + } + + public boolean isAdmin(UUID sessionId) { + Session admin = sessions.get(sessionId); + if (admin != null) { + return admin.isAdmin(); + } + return false; + } + + public boolean isValidSession(UUID sessionId) { + if (sessions.containsKey(sessionId)) + return true; + return false; + } + class SessionChecker implements Runnable { @Override diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index cc190b1285..be56f30b56 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -279,18 +279,35 @@ public class TableController { match.startMatch(); startGame(null); } catch (GameException ex) { - logger.fatal(null, ex); + logger.fatal("Error starting match ", ex); + match.endGame(); } } } private void startGame(UUID choosingPlayerId) throws GameException { - match.startGame(); - table.initGame(); - GameManager.getInstance().createGameSession(match.getGame(), sessionPlayerMap, table.getId(), choosingPlayerId); - SessionManager sessionManager = SessionManager.getInstance(); - for (Entry<UUID, UUID> entry: sessionPlayerMap.entrySet()) { - sessionManager.getSession(entry.getKey()).gameStarted(match.getGame().getId(), entry.getValue()); + try { + match.startGame(); + table.initGame(); + GameManager.getInstance().createGameSession(match.getGame(), sessionPlayerMap, table.getId(), choosingPlayerId); + SessionManager sessionManager = SessionManager.getInstance(); + for (Entry<UUID, UUID> entry: sessionPlayerMap.entrySet()) { + Session session = sessionManager.getSession(entry.getKey()); + if (session != null) { + session.gameStarted(match.getGame().getId(), entry.getValue()); + } + else { + TableManager.getInstance().removeTable(table.getId()); + GameManager.getInstance().removeGame(match.getGame().getId()); + logger.warn("Unable to find player " + entry.getKey()); + break; + } + } + } + catch (Exception ex) { + logger.fatal("Error starting game", ex); + TableManager.getInstance().removeTable(table.getId()); + GameManager.getInstance().removeGame(match.getGame().getId()); } } @@ -341,7 +358,7 @@ public class TableController { startGame(choosingPlayerId); } else { - GamesRoomManager.getInstance().getRoom(table.getRoomId()).removeTable(sessionId, table.getId()); + GamesRoomManager.getInstance().removeTable(table.getId()); } } catch (GameException ex) { logger.fatal(null, ex); diff --git a/Mage.Server/src/main/java/mage/server/TableManager.java b/Mage.Server/src/main/java/mage/server/TableManager.java index 18de520008..3af3add6b6 100644 --- a/Mage.Server/src/main/java/mage/server/TableManager.java +++ b/Mage.Server/src/main/java/mage/server/TableManager.java @@ -40,6 +40,7 @@ import mage.game.match.Match; import mage.game.match.MatchOptions; import mage.game.tournament.TournamentOptions; import mage.players.Player; +import mage.server.game.GamesRoomManager; import org.apache.log4j.Logger; /** @@ -84,7 +85,9 @@ public class TableManager { } public Match getMatch(UUID tableId) { - return controllers.get(tableId).getMatch(); + if (controllers.containsKey(tableId)) + return controllers.get(tableId).getMatch(); + return null; } public Collection<Table> getTables() { @@ -92,15 +95,21 @@ public class TableManager { } public boolean joinTable(UUID sessionId, UUID tableId, String name, String playerType, int skill, DeckCardLists deckList) throws GameException { - return controllers.get(tableId).joinTable(sessionId, name, playerType, skill, deckList); + if (controllers.containsKey(tableId)) + return controllers.get(tableId).joinTable(sessionId, name, playerType, skill, deckList); + return false; } public boolean joinTournament(UUID sessionId, UUID tableId, String name, String playerType, int skill) throws GameException { - return controllers.get(tableId).joinTournament(sessionId, name, playerType, skill); + if (controllers.containsKey(tableId)) + return controllers.get(tableId).joinTournament(sessionId, name, playerType, skill); + return false; } public boolean submitDeck(UUID sessionId, UUID tableId, DeckCardLists deckList) throws GameException { - return controllers.get(tableId).submitDeck(sessionId, deckList); + if (controllers.containsKey(tableId)) + return controllers.get(tableId).submitDeck(sessionId, deckList); + return false; } public void removeSession(UUID sessionId) { @@ -108,74 +117,101 @@ public class TableManager { } public boolean isTableOwner(UUID tableId, UUID sessionId) { - return controllers.get(tableId).isOwner(sessionId); + if (controllers.containsKey(tableId)) + return controllers.get(tableId).isOwner(sessionId); + return false; } public boolean removeTable(UUID sessionId, UUID tableId) { - if (isTableOwner(tableId, sessionId)) { - controllers.remove(tableId); - tables.remove(tableId); + if (isTableOwner(tableId, sessionId) || SessionManager.getInstance().isAdmin(sessionId)) { + removeTable(tableId); return true; } return false; } public void leaveTable(UUID sessionId, UUID tableId) { - controllers.get(tableId).leaveTable(sessionId); + if (controllers.containsKey(tableId)) + controllers.get(tableId).leaveTable(sessionId); } public UUID getChatId(UUID tableId) { - return controllers.get(tableId).getChatId(); + if (controllers.containsKey(tableId)) + return controllers.get(tableId).getChatId(); + return null; } public void startMatch(UUID sessionId, UUID roomId, UUID tableId) { - controllers.get(tableId).startMatch(sessionId); + if (controllers.containsKey(tableId)) + controllers.get(tableId).startMatch(sessionId); } public void startMatch(UUID roomId, UUID tableId) { - controllers.get(tableId).startMatch(); + if (controllers.containsKey(tableId)) + controllers.get(tableId).startMatch(); } public void startChallenge(UUID sessionId, UUID roomId, UUID tableId, UUID challengeId) { - controllers.get(tableId).startChallenge(sessionId, challengeId); + if (controllers.containsKey(tableId)) + controllers.get(tableId).startChallenge(sessionId, challengeId); } public void startTournament(UUID sessionId, UUID roomId, UUID tableId) { - controllers.get(tableId).startTournament(sessionId); + if (controllers.containsKey(tableId)) + controllers.get(tableId).startTournament(sessionId); } public void startDraft(UUID tableId, Draft draft) { - controllers.get(tableId).startDraft(draft); + if (controllers.containsKey(tableId)) + controllers.get(tableId).startDraft(draft); } public boolean watchTable(UUID sessionId, UUID tableId) { - return controllers.get(tableId).watchTable(sessionId); + if (controllers.containsKey(tableId)) + return controllers.get(tableId).watchTable(sessionId); + return false; } public boolean replayTable(UUID sessionId, UUID tableId) { - return controllers.get(tableId).replayTable(sessionId); + if (controllers.containsKey(tableId)) + return controllers.get(tableId).replayTable(sessionId); + return false; } public void endGame(UUID tableId) { - controllers.get(tableId).endGame(); + if (controllers.containsKey(tableId)) + controllers.get(tableId).endGame(); } public void endDraft(UUID tableId, Draft draft) { - controllers.get(tableId).endDraft(draft); + if (controllers.containsKey(tableId)) + controllers.get(tableId).endDraft(draft); } public void swapSeats(UUID tableId, UUID sessionId, int seatNum1, int seatNum2) { - if (isTableOwner(tableId, sessionId)) { + if (controllers.containsKey(tableId) && isTableOwner(tableId, sessionId)) { controllers.get(tableId).swapSeats(seatNum1, seatNum2); } } public void construct(UUID tableId) { - controllers.get(tableId).construct(); + if (controllers.containsKey(tableId)) + controllers.get(tableId).construct(); } public void addPlayer(UUID sessionId, UUID tableId, Player player, String playerType, Deck deck) throws GameException { - controllers.get(tableId).addPlayer(sessionId, player, playerType, deck); + if (controllers.containsKey(tableId)) + controllers.get(tableId).addPlayer(sessionId, player, playerType, deck); + } + + public void removeTable(UUID tableId) { + if (tables.containsKey(tableId)) { + Table table = tables.get(tableId); + table.getMatch().getGame().end(); + } + controllers.remove(tableId); + tables.remove(tableId); + GamesRoomManager.getInstance().removeTable(tableId); } } diff --git a/Mage.Server/src/main/java/mage/server/game/GameManager.java b/Mage.Server/src/main/java/mage/server/game/GameManager.java index 7cf9970ea6..b7ea82341b 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameManager.java +++ b/Mage.Server/src/main/java/mage/server/game/GameManager.java @@ -56,7 +56,8 @@ public class GameManager { } public void joinGame(UUID gameId, UUID sessionId) { - gameControllers.get(gameId).join(sessionId); + if (gameControllers.containsKey(gameId)) + gameControllers.get(gameId).join(sessionId); } public void destroyChatSession(UUID gameId) { @@ -70,31 +71,38 @@ public class GameManager { } public void sendPlayerUUID(UUID gameId, UUID sessionId, UUID data) { - gameControllers.get(gameId).sendPlayerUUID(sessionId, data); + if (gameControllers.containsKey(gameId)) + gameControllers.get(gameId).sendPlayerUUID(sessionId, data); } public void sendPlayerString(UUID gameId, UUID sessionId, String data) { - gameControllers.get(gameId).sendPlayerString(sessionId, data); + if (gameControllers.containsKey(gameId)) + gameControllers.get(gameId).sendPlayerString(sessionId, data); } public void sendPlayerBoolean(UUID gameId, UUID sessionId, Boolean data) { - gameControllers.get(gameId).sendPlayerBoolean(sessionId, data); + if (gameControllers.containsKey(gameId)) + gameControllers.get(gameId).sendPlayerBoolean(sessionId, data); } public void sendPlayerInteger(UUID gameId, UUID sessionId, Integer data) { - gameControllers.get(gameId).sendPlayerInteger(sessionId, data); + if (gameControllers.containsKey(gameId)) + gameControllers.get(gameId).sendPlayerInteger(sessionId, data); } public void concedeGame(UUID gameId, UUID sessionId) { - gameControllers.get(gameId).concede(sessionId); + if (gameControllers.containsKey(gameId)) + gameControllers.get(gameId).concede(sessionId); } public void watchGame(UUID gameId, UUID sessionId) { - gameControllers.get(gameId).watch(sessionId); + if (gameControllers.containsKey(gameId)) + gameControllers.get(gameId).watch(sessionId); } public void stopWatching(UUID gameId, UUID sessionId) { - gameControllers.get(gameId).stopWatching(sessionId); + if (gameControllers.containsKey(gameId)) + gameControllers.get(gameId).stopWatching(sessionId); } public void removeSession(UUID sessionId) { @@ -104,19 +112,24 @@ public class GameManager { } public void kill(UUID gameId, UUID sessionId) { - gameControllers.get(gameId).kill(sessionId); + if (gameControllers.containsKey(gameId)) + gameControllers.get(gameId).kill(sessionId); } public void cheat(UUID gameId, UUID sessionId, UUID playerId, DeckCardLists deckList) { - gameControllers.get(gameId).cheat(sessionId, playerId, deckList); + if (gameControllers.containsKey(gameId)) + gameControllers.get(gameId).cheat(sessionId, playerId, deckList); } public boolean cheat(UUID gameId, UUID sessionId, UUID playerId, String cardName) { - return gameControllers.get(gameId).cheat(sessionId, playerId, cardName); + if (gameControllers.containsKey(gameId)) + return gameControllers.get(gameId).cheat(sessionId, playerId, cardName); + return false; } public void timeout(UUID gameId, UUID sessionId) { - gameControllers.get(gameId).timeout(sessionId); + if (gameControllers.containsKey(gameId)) + gameControllers.get(gameId).timeout(sessionId); } public void removeGame(UUID gameId) { @@ -124,11 +137,14 @@ public class GameManager { } public void saveGame(UUID gameId) { - gameControllers.get(gameId).saveGame(); + if (gameControllers.containsKey(gameId)) + gameControllers.get(gameId).saveGame(); } public GameView getGameView(UUID gameId, UUID sessionId, UUID playerId) { - return gameControllers.get(gameId).getGameView(playerId); + if (gameControllers.containsKey(gameId)) + return gameControllers.get(gameId).getGameView(playerId); + return null; } } diff --git a/Mage.Server/src/main/java/mage/server/game/GamesRoom.java b/Mage.Server/src/main/java/mage/server/game/GamesRoom.java index 86ea03e6e7..a43d1a3585 100644 --- a/Mage.Server/src/main/java/mage/server/game/GamesRoom.java +++ b/Mage.Server/src/main/java/mage/server/game/GamesRoom.java @@ -49,9 +49,9 @@ public interface GamesRoom extends Room { public TableView createTable(UUID sessionId, MatchOptions options); public TableView createTournamentTable(UUID sessionId, TournamentOptions options); public void removeTable(UUID sessionId, UUID tableId); + public void removeTable(UUID tableId); public TableView getTable(UUID tableId); public void leaveTable(UUID sessionId, UUID tableId); - public boolean watchTable(UUID sessionId, UUID tableId); } diff --git a/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java b/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java index 0bbf9acb52..0b1ff934ec 100644 --- a/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java +++ b/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java @@ -49,7 +49,7 @@ import org.apache.log4j.Logger; */ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { -// private final static Logger logger = Logger.getLogger(GamesRoomImpl.class); + private final static Logger logger = Logger.getLogger(GamesRoomImpl.class); private ConcurrentHashMap<UUID, Table> tables = new ConcurrentHashMap<UUID, Table>(); @@ -103,9 +103,14 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { @Override public void removeTable(UUID sessionId, UUID tableId) { - if (TableManager.getInstance().removeTable(sessionId, tableId)) { - tables.remove(tableId); - } + tables.remove(tableId); + } + + @Override + public void removeTable(UUID tableId) { + tables.remove(tableId); + if (logger.isDebugEnabled()) + logger.debug("Table removed: " + tableId); } @Override diff --git a/Mage.Server/src/main/java/mage/server/game/GamesRoomManager.java b/Mage.Server/src/main/java/mage/server/game/GamesRoomManager.java index 30f885eeaa..838f836b52 100644 --- a/Mage.Server/src/main/java/mage/server/game/GamesRoomManager.java +++ b/Mage.Server/src/main/java/mage/server/game/GamesRoomManager.java @@ -67,5 +67,11 @@ public class GamesRoomManager { public GamesRoom getRoom(UUID roomId) { return rooms.get(roomId); } + + public void removeTable(UUID tableId) { + for (GamesRoom room: rooms.values()) { + room.removeTable(tableId); + } + } }