From dcd2907112de15906a8e284a80b173cc7e9440fd Mon Sep 17 00:00:00 2001 From: betasteward Date: Wed, 10 Jun 2015 15:59:48 -0400 Subject: [PATCH] handle table join and waiting --- .../src/main/java/mage/client/MageFrame.java | 212 ++++++++++-------- .../client/dialog/TableWaitingDialog.java | 6 +- .../client/remote/CallbackClientImpl.java | 26 +-- .../mage/client/game/MultiConnectTest.java | 5 + .../main/java/org/mage/network/Client.java | 29 ++- .../main/java/org/mage/network/Server.java | 18 +- .../handlers/client/ChatRoomHandler.java | 1 + .../ClientRegisteredMessageHandler.java | 4 - .../client/JoinTableMessageHandler.java | 5 +- .../client/JoinedTableMessageHandler.java | 28 +++ .../client/LeaveTableMessageHandler.java | 41 ++++ .../handlers/client/RoomMessageHandler.java | 1 + .../handlers/client/ServerMessageHandler.java | 1 + .../client/TableWaitingMessageHandler.java | 39 ++++ .../server/JoinTableMessageHandler.java | 2 +- .../server/LeaveTableMessageHandler.java | 32 +++ .../server/TableWaitingMessageHandler.java | 28 +++ .../mage/network/interfaces/MageClient.java | 1 + .../mage/network/interfaces/MageServer.java | 5 +- .../mage/network/model/JoinTableRequest.java | 2 +- .../network/model/JoinedTableMessage.java | 45 ++++ .../mage/network/model/LeaveTableRequest.java | 28 +++ .../mage/network/model/LeftTableMessage.java | 21 ++ .../network/model/TableWaitingMessage.java | 22 ++ .../network/model/TableWaitingRequest.java | 28 +++ .../src/main/java/mage/server/Main.java | 46 ++-- .../java/mage/server/TableController.java | 5 +- .../src/main/java/mage/server/User.java | 8 +- 28 files changed, 538 insertions(+), 151 deletions(-) create mode 100644 Mage.Network/src/main/java/org/mage/network/handlers/client/JoinedTableMessageHandler.java create mode 100644 Mage.Network/src/main/java/org/mage/network/handlers/client/LeaveTableMessageHandler.java create mode 100644 Mage.Network/src/main/java/org/mage/network/handlers/client/TableWaitingMessageHandler.java create mode 100644 Mage.Network/src/main/java/org/mage/network/handlers/server/LeaveTableMessageHandler.java create mode 100644 Mage.Network/src/main/java/org/mage/network/handlers/server/TableWaitingMessageHandler.java create mode 100644 Mage.Network/src/main/java/org/mage/network/model/JoinedTableMessage.java create mode 100644 Mage.Network/src/main/java/org/mage/network/model/LeaveTableRequest.java create mode 100644 Mage.Network/src/main/java/org/mage/network/model/LeftTableMessage.java create mode 100644 Mage.Network/src/main/java/org/mage/network/model/TableWaitingMessage.java create mode 100644 Mage.Network/src/main/java/org/mage/network/model/TableWaitingRequest.java diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 4dfce042653..3a9896acf5b 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -604,59 +604,79 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { * @param gameId * @param playerId */ - public void showGame(UUID gameId, UUID playerId) { - try { - GamePane gamePane = new GamePane(); - desktopPane.add(gamePane, JLayeredPane.DEFAULT_LAYER); - gamePane.setMaximum(true); - gamePane.setVisible(true); - gamePane.showGame(gameId, playerId); - setActive(gamePane); - } catch (PropertyVetoException ex) { - } - } - - public void watchGame(UUID gameId) { - try { - for(Component component :desktopPane.getComponents()) { - if (component instanceof GamePane - && ((GamePane) component).getGameId().equals(gameId)) { - setActive((GamePane) component); - return; + public void showGame(final UUID gameId, final UUID playerId) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + try { + GamePane gamePane = new GamePane(); + desktopPane.add(gamePane, JLayeredPane.DEFAULT_LAYER); + gamePane.setMaximum(true); + gamePane.setVisible(true); + gamePane.showGame(gameId, playerId); + setActive(gamePane); + } catch (PropertyVetoException ex) { } } - GamePane gamePane = new GamePane(); - desktopPane.add(gamePane, JLayeredPane.DEFAULT_LAYER); - gamePane.setMaximum(true); - gamePane.setVisible(true); - gamePane.watchGame(gameId); - setActive(gamePane); - } catch (PropertyVetoException ex) { - } + }); } - public void replayGame(UUID gameId) { - try { - GamePane gamePane = new GamePane(); - desktopPane.add(gamePane, JLayeredPane.DEFAULT_LAYER); - gamePane.setMaximum(true); - gamePane.setVisible(true); - gamePane.replayGame(gameId); - setActive(gamePane); - } catch (PropertyVetoException ex) { - } + public void watchGame(final UUID gameId) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + try { + for(Component component :desktopPane.getComponents()) { + if (component instanceof GamePane + && ((GamePane) component).getGameId().equals(gameId)) { + setActive((GamePane) component); + return; + } + } + GamePane gamePane = new GamePane(); + desktopPane.add(gamePane, JLayeredPane.DEFAULT_LAYER); + gamePane.setMaximum(true); + gamePane.setVisible(true); + gamePane.watchGame(gameId); + setActive(gamePane); + } catch (PropertyVetoException ex) { + } + } + }); } - public void showDraft(UUID draftId) { - try { - DraftPane draftPane = new DraftPane(); - desktopPane.add(draftPane, JLayeredPane.DEFAULT_LAYER); - draftPane.setMaximum(true); - draftPane.setVisible(true); - draftPane.showDraft(draftId); - setActive(draftPane); - } catch (PropertyVetoException ex) { - } + public void replayGame(final UUID gameId) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + try { + GamePane gamePane = new GamePane(); + desktopPane.add(gamePane, JLayeredPane.DEFAULT_LAYER); + gamePane.setMaximum(true); + gamePane.setVisible(true); + gamePane.replayGame(gameId); + setActive(gamePane); + } catch (PropertyVetoException ex) { + } + } + }); + } + + public void showDraft(final UUID draftId) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + try { + DraftPane draftPane = new DraftPane(); + desktopPane.add(draftPane, JLayeredPane.DEFAULT_LAYER); + draftPane.setMaximum(true); + draftPane.setVisible(true); + draftPane.showDraft(draftId); + setActive(draftPane); + } catch (PropertyVetoException ex) { + } + } + }); } public void endDraft(UUID draftId) { @@ -669,35 +689,50 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { } } - public void showTournament(UUID tournamentId) { - try { - for(Component component :desktopPane.getComponents()) { - if (component instanceof TournamentPane && - ((TournamentPane) component).getTournamentId().equals(tournamentId)) { - setActive((TournamentPane) component); - return; + public void showTournament(final UUID tournamentId) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + try { + for(Component component :desktopPane.getComponents()) { + if (component instanceof TournamentPane && + ((TournamentPane) component).getTournamentId().equals(tournamentId)) { + setActive((TournamentPane) component); + return; + } + } + TournamentPane tournamentPane = new TournamentPane(); + desktopPane.add(tournamentPane, JLayeredPane.DEFAULT_LAYER); + tournamentPane.setMaximum(true); + tournamentPane.setVisible(true); + tournamentPane.showTournament(tournamentId); + setActive(tournamentPane); + } catch (PropertyVetoException ex) { } } - TournamentPane tournamentPane = new TournamentPane(); - desktopPane.add(tournamentPane, JLayeredPane.DEFAULT_LAYER); - tournamentPane.setMaximum(true); - tournamentPane.setVisible(true); - tournamentPane.showTournament(tournamentId); - setActive(tournamentPane); - } catch (PropertyVetoException ex) { - } + }); } - public void showGameEndDialog(GameEndView gameEndView) { - GameEndDialog gameEndDialog = new GameEndDialog(gameEndView); - desktopPane.add(gameEndDialog, JLayeredPane.MODAL_LAYER); - gameEndDialog.showDialog(); + public void showGameEndDialog(final GameEndView gameEndView) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + GameEndDialog gameEndDialog = new GameEndDialog(gameEndView); + desktopPane.add(gameEndDialog, JLayeredPane.MODAL_LAYER); + gameEndDialog.showDialog(); + } + }); } - public void showTableWaitingDialog(UUID roomId, UUID tableId, boolean isTournament) { - TableWaitingDialog tableWaitingDialog = new TableWaitingDialog(); - desktopPane.add(tableWaitingDialog, JLayeredPane.MODAL_LAYER); - tableWaitingDialog.showDialog(roomId, tableId, isTournament); + public void showTableWaitingDialog(final UUID roomId, final UUID tableId, final UUID chatId, final boolean owner, final boolean tournament) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + TableWaitingDialog tableWaitingDialog = new TableWaitingDialog(); + desktopPane.add(tableWaitingDialog, JLayeredPane.MODAL_LAYER); + tableWaitingDialog.showDialog(roomId, tableId, chatId, owner, tournament); + } + }); } public boolean connect(Connection connection) { @@ -1358,29 +1393,21 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { } public void showMessage(final String title, final String message) { - if (SwingUtilities.isEventDispatchThread()) { - JOptionPane.showMessageDialog(desktopPane, message, title, JOptionPane.INFORMATION_MESSAGE); - } else { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - JOptionPane.showMessageDialog(desktopPane, message, title, JOptionPane.INFORMATION_MESSAGE); - } - }); - } + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + JOptionPane.showMessageDialog(desktopPane, message, title, JOptionPane.INFORMATION_MESSAGE); + } + }); } public void showError(final String title, final String message) { - if (SwingUtilities.isEventDispatchThread()) { - JOptionPane.showMessageDialog(desktopPane, message, title, JOptionPane.ERROR_MESSAGE); - } else { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - JOptionPane.showMessageDialog(desktopPane, message, title, JOptionPane.ERROR_MESSAGE); - } - }); - } + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + JOptionPane.showMessageDialog(desktopPane, message, title, JOptionPane.ERROR_MESSAGE); + } + }); } // @Override @@ -1438,6 +1465,11 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { return serverState; } + @Override + public void joinedTable(UUID roomId, UUID tableId, UUID chatId, boolean owner, boolean tournament) { + showTableWaitingDialog(roomId, tableId, chatId, owner, tournament); + } + } class MagePaneMenuItem extends JCheckBoxMenuItem { diff --git a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java index 70cdeca91ba..f1bab39acf4 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java @@ -110,13 +110,13 @@ public class TableWaitingDialog extends MageDialog { } } - public void showDialog(UUID roomId, UUID tableId, boolean isTournament) { + public void showDialog(UUID roomId, UUID tableId, UUID chatId, boolean owner, boolean isTournament) { this.roomId = roomId; this.tableId = tableId; this.isTournament = isTournament; client = MageFrame.getClient(); updateTask = new UpdateSeatsTask(client, roomId, tableId, this); - if (client.isTableOwner(roomId, tableId)) { + if (owner) { this.btnStart.setVisible(true); this.btnMoveDown.setVisible(true); this.btnMoveUp.setVisible(true); @@ -125,7 +125,7 @@ public class TableWaitingDialog extends MageDialog { this.btnMoveDown.setVisible(false); this.btnMoveUp.setVisible(false); } - UUID chatId = client.getTableChatId(tableId); +// UUID chatId = client.getTableChatId(tableId); if (chatId != null) { this.chatPanel.connect(chatId); updateTask.execute(); 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 1d9b47b7d18..dea27be8c6c 100644 --- a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java +++ b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java @@ -161,12 +161,12 @@ public class CallbackClientImpl implements CallbackClient { JOptionPane.showMessageDialog(null, message.getMessage(), "Server message", JOptionPane.INFORMATION_MESSAGE); } } break; - case "joinedTable": - { - TableClientMessage message = (TableClientMessage) callback.getData(); - joinedTable(message.getRoomId(), message.getTableId(), message.getFlag()); - break; - } +// case "joinedTable": +// { +// TableClientMessage message = (TableClientMessage) callback.getData(); +// joinedTable(message.getRoomId(), message.getTableId(), message.getFlag()); +// break; +// } case "replayInit": { GamePanel panel = MageFrame.getGame(callback.getObjectId()); @@ -425,13 +425,13 @@ public class CallbackClientImpl implements CallbackClient { // } // } - private void joinedTable(UUID roomId, UUID tableId, boolean isTournament) { - try { - frame.showTableWaitingDialog(roomId, tableId, isTournament); - } catch (Exception ex) { - handleException(ex); - } - } +// private void joinedTable(UUID roomId, UUID tableId, boolean isTournament) { +// try { +// frame.showTableWaitingDialog(roomId, tableId, isTournament); +// } catch (Exception ex) { +// handleException(ex); +// } +// } protected void gameStarted(final UUID gameId, final UUID playerId) { try { diff --git a/Mage.Client/src/test/java/mage/client/game/MultiConnectTest.java b/Mage.Client/src/test/java/mage/client/game/MultiConnectTest.java index a8d5c4bb88b..def5b28dd79 100644 --- a/Mage.Client/src/test/java/mage/client/game/MultiConnectTest.java +++ b/Mage.Client/src/test/java/mage/client/game/MultiConnectTest.java @@ -122,6 +122,11 @@ public class MultiConnectTest { public ServerState getServerState() { return serverState; } + + @Override + public void joinedTable(UUID roomId, UUID tableId, UUID chatId, boolean owner, boolean tournament) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } } public static void main(String[] argv) throws Exception { diff --git a/Mage.Network/src/main/java/org/mage/network/Client.java b/Mage.Network/src/main/java/org/mage/network/Client.java index 6608e342276..6951058551c 100644 --- a/Mage.Network/src/main/java/org/mage/network/Client.java +++ b/Mage.Network/src/main/java/org/mage/network/Client.java @@ -13,7 +13,6 @@ import io.netty.handler.codec.serialization.ObjectEncoder; import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.util.InsecureTrustManagerFactory; import io.netty.handler.timeout.IdleStateHandler; -import java.util.Collection; import java.util.List; import java.util.Set; import java.util.UUID; @@ -27,8 +26,6 @@ import mage.interfaces.ServerState; import mage.players.net.UserSkipPrioritySteps; import mage.utils.MageVersion; import mage.view.DraftPickView; -import mage.view.MatchView; -import mage.view.RoomUsersView; import mage.view.RoomView; import mage.view.TableView; import mage.view.TournamentView; @@ -43,9 +40,12 @@ import org.mage.network.handlers.client.ClientRegisteredMessageHandler; import org.mage.network.handlers.client.ConnectionHandler; import org.mage.network.handlers.client.InformClientMessageHandler; import org.mage.network.handlers.client.JoinTableMessageHandler; +import org.mage.network.handlers.client.JoinedTableMessageHandler; +import org.mage.network.handlers.client.LeaveTableMessageHandler; import org.mage.network.handlers.client.ServerMessageHandler; import org.mage.network.handlers.client.RoomMessageHandler; import org.mage.network.handlers.client.TableMessageHandler; +import org.mage.network.handlers.client.TableWaitingMessageHandler; import org.mage.network.interfaces.MageClient; import org.mage.network.model.MessageType; @@ -71,6 +71,9 @@ public class Client { private final RoomMessageHandler roomMessageHandler; private final TableMessageHandler tableMessageHandler; private final JoinTableMessageHandler joinTableMessageHandler; + private final JoinedTableMessageHandler joinedTableMessageHandler; + private final TableWaitingMessageHandler tableWaitingMessageHandler; + private final LeaveTableMessageHandler leaveTableMessageHandler; private final ExceptionHandler exceptionHandler; @@ -93,6 +96,9 @@ public class Client { roomMessageHandler = new RoomMessageHandler(); tableMessageHandler = new TableMessageHandler(); joinTableMessageHandler = new JoinTableMessageHandler(); + joinedTableMessageHandler = new JoinedTableMessageHandler(client); + tableWaitingMessageHandler = new TableWaitingMessageHandler(); + leaveTableMessageHandler = new LeaveTableMessageHandler(); exceptionHandler = new ExceptionHandler(); } @@ -160,6 +166,9 @@ public class Client { ch.pipeline().addLast("roomMessageHandler", roomMessageHandler); ch.pipeline().addLast("tableMessageHandler", tableMessageHandler); ch.pipeline().addLast("joinTableMessageHandler", joinTableMessageHandler); + ch.pipeline().addLast("joinedTableMessageHandler", joinedTableMessageHandler); + ch.pipeline().addLast("tableWaitingMessageHandler", tableWaitingMessageHandler); + ch.pipeline().addLast("leaveTableMessageHandler", leaveTableMessageHandler); ch.pipeline().addLast("exceptionHandler", exceptionHandler); } @@ -278,7 +287,12 @@ public class Client { } public boolean leaveTable(UUID roomId, UUID tableId) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + try { + return leaveTableMessageHandler.leaveTable(roomId, tableId); + } catch (Exception ex) { + logger.error("Error creating table", ex); + } + return false; } public void swapSeats(UUID roomId, UUID tableId, int row, int i) { @@ -290,7 +304,12 @@ public class Client { } public TableView getTable(UUID roomId, UUID tableId) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + try { + return tableWaitingMessageHandler.getTable(roomId, tableId); + } catch (Exception ex) { + logger.error("Error getting chat room id", ex); + } + return null; } public void watchTournamentTable(UUID tableId) { diff --git a/Mage.Network/src/main/java/org/mage/network/Server.java b/Mage.Network/src/main/java/org/mage/network/Server.java index 689e4f89dcc..81701c9a6dc 100644 --- a/Mage.Network/src/main/java/org/mage/network/Server.java +++ b/Mage.Network/src/main/java/org/mage/network/Server.java @@ -32,12 +32,15 @@ import org.mage.network.handlers.server.ConnectionHandler; import org.mage.network.handlers.server.JoinChatMessageHandler; import org.mage.network.handlers.server.JoinTableMessageHandler; import org.mage.network.handlers.server.LeaveChatMessageHandler; +import org.mage.network.handlers.server.LeaveTableMessageHandler; import org.mage.network.handlers.server.RegisterClientMessageHandler; import org.mage.network.handlers.server.RoomMessageHandler; import org.mage.network.handlers.server.ServerMessageHandler; import org.mage.network.handlers.server.TableMessageHandler; +import org.mage.network.handlers.server.TableWaitingMessageHandler; import org.mage.network.interfaces.MageServer; import org.mage.network.model.InformClientMessage; +import org.mage.network.model.JoinedTableMessage; import org.mage.network.model.MessageType; import org.mage.network.model.PingMessage; import org.mage.network.model.ReceiveChatMessage; @@ -71,6 +74,8 @@ public class Server { private final RoomMessageHandler roomMessageHandler; private final TableMessageHandler tableMessageHandler; private final JoinTableMessageHandler joinTableMessageHandler; + private final TableWaitingMessageHandler tableWaitingMessageHandler; + private final LeaveTableMessageHandler leaveTableMessageHandler; private final ExceptionHandler exceptionHandler; @@ -85,6 +90,8 @@ public class Server { roomMessageHandler = new RoomMessageHandler(server); tableMessageHandler = new TableMessageHandler(server); joinTableMessageHandler = new JoinTableMessageHandler(server); + tableWaitingMessageHandler = new TableWaitingMessageHandler(server); + leaveTableMessageHandler = new LeaveTableMessageHandler(server); exceptionHandler = new ExceptionHandler(); } @@ -117,7 +124,7 @@ public class Server { } } - + private class ServerInitializer extends ChannelInitializer { @Override @@ -144,6 +151,8 @@ public class Server { ch.pipeline().addLast(handlersExecutor, "roomMessageHandler", roomMessageHandler); ch.pipeline().addLast(handlersExecutor, "tableMessageHandler", tableMessageHandler); ch.pipeline().addLast(handlersExecutor, "joinTableMessageHandler", joinTableMessageHandler); + ch.pipeline().addLast(handlersExecutor, "tableWaitingMessageHandler", tableWaitingMessageHandler); + ch.pipeline().addLast(handlersExecutor, "leaveTableMessageHandler", leaveTableMessageHandler); ch.pipeline().addLast("exceptionHandler", exceptionHandler); } @@ -182,5 +191,12 @@ public class Server { heartbeatHandler.pingClient(); } } + + public void joinedTable(String sessionId, UUID roomId, UUID tableId, UUID chatId, boolean owner, boolean tournament) { + Channel ch = findChannel(sessionId); + if (ch != null) + ch.writeAndFlush(new JoinedTableMessage(roomId, tableId, chatId, owner, tournament)); + } + } diff --git a/Mage.Network/src/main/java/org/mage/network/handlers/client/ChatRoomHandler.java b/Mage.Network/src/main/java/org/mage/network/handlers/client/ChatRoomHandler.java index 2b02f75781e..65c6c119e83 100644 --- a/Mage.Network/src/main/java/org/mage/network/handlers/client/ChatRoomHandler.java +++ b/Mage.Network/src/main/java/org/mage/network/handlers/client/ChatRoomHandler.java @@ -31,6 +31,7 @@ public class ChatRoomHandler extends SimpleChannelInboundHandler { -// private final MageClient client; -// private ChannelHandlerContext ctx; private final BlockingQueue queue = new LinkedBlockingQueue<>(); private String userName; private MageVersion version; diff --git a/Mage.Network/src/main/java/org/mage/network/handlers/client/JoinTableMessageHandler.java b/Mage.Network/src/main/java/org/mage/network/handlers/client/JoinTableMessageHandler.java index 06764658fe9..56b43767dd7 100644 --- a/Mage.Network/src/main/java/org/mage/network/handlers/client/JoinTableMessageHandler.java +++ b/Mage.Network/src/main/java/org/mage/network/handlers/client/JoinTableMessageHandler.java @@ -6,10 +6,6 @@ import java.util.UUID; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import mage.cards.decks.DeckCardLists; -import mage.game.match.MatchOptions; -import mage.view.TableView; -import org.mage.network.model.CreateTableMessage; -import org.mage.network.model.CreateTableRequest; import org.mage.network.model.JoinTableMessage; import org.mage.network.model.JoinTableRequest; @@ -35,6 +31,7 @@ public class JoinTableMessageHandler extends SimpleChannelInboundHandler { + + + private final MageClient client; + + public JoinedTableMessageHandler (MageClient client) { + this.client = client; + } + + @Override + protected void messageReceived(ChannelHandlerContext ctx, JoinedTableMessage msg) throws Exception { + client.joinedTable(msg.getRoomId(), msg.getTableId(), msg.getChatId(), msg.isOwner(), msg.isTournament()); + } + + +} diff --git a/Mage.Network/src/main/java/org/mage/network/handlers/client/LeaveTableMessageHandler.java b/Mage.Network/src/main/java/org/mage/network/handlers/client/LeaveTableMessageHandler.java new file mode 100644 index 00000000000..65ef9e32be2 --- /dev/null +++ b/Mage.Network/src/main/java/org/mage/network/handlers/client/LeaveTableMessageHandler.java @@ -0,0 +1,41 @@ +package org.mage.network.handlers.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import java.util.UUID; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import mage.cards.decks.DeckCardLists; +import org.mage.network.model.JoinTableMessage; +import org.mage.network.model.JoinTableRequest; +import org.mage.network.model.LeaveTableRequest; +import org.mage.network.model.LeftTableMessage; + + +/** + * + * @author BetaSteward + */ +public class LeaveTableMessageHandler extends SimpleChannelInboundHandler { + + private ChannelHandlerContext ctx; + private final BlockingQueue queue = new LinkedBlockingQueue<>(); + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + this.ctx = ctx; + super.channelActive(ctx); + } + + @Override + protected void messageReceived(ChannelHandlerContext ctx, LeftTableMessage msg) throws Exception { + queue.offer(msg.getSuccess()); + } + + public boolean leaveTable(UUID roomId, UUID tableId) throws Exception { + queue.clear(); + ctx.writeAndFlush(new LeaveTableRequest(roomId, tableId)); + return queue.take(); + } + +} diff --git a/Mage.Network/src/main/java/org/mage/network/handlers/client/RoomMessageHandler.java b/Mage.Network/src/main/java/org/mage/network/handlers/client/RoomMessageHandler.java index 4ff9dcc3759..f1505e4b8a2 100644 --- a/Mage.Network/src/main/java/org/mage/network/handlers/client/RoomMessageHandler.java +++ b/Mage.Network/src/main/java/org/mage/network/handlers/client/RoomMessageHandler.java @@ -31,6 +31,7 @@ public class RoomMessageHandler extends SimpleChannelInboundHandler } public RoomView getRoom(UUID roomId) throws Exception { + queue.clear(); ctx.writeAndFlush(new RoomRequest(roomId)); return queue.take(); } diff --git a/Mage.Network/src/main/java/org/mage/network/handlers/client/ServerMessageHandler.java b/Mage.Network/src/main/java/org/mage/network/handlers/client/ServerMessageHandler.java index 910c9a8b4b4..92598e1ef56 100644 --- a/Mage.Network/src/main/java/org/mage/network/handlers/client/ServerMessageHandler.java +++ b/Mage.Network/src/main/java/org/mage/network/handlers/client/ServerMessageHandler.java @@ -30,6 +30,7 @@ public class ServerMessageHandler extends SimpleChannelInboundHandler getServerMessages() throws Exception { + queue.clear(); ctx.writeAndFlush(new ServerMessagesRequest()); return queue.take(); } diff --git a/Mage.Network/src/main/java/org/mage/network/handlers/client/TableWaitingMessageHandler.java b/Mage.Network/src/main/java/org/mage/network/handlers/client/TableWaitingMessageHandler.java new file mode 100644 index 00000000000..6277d9801de --- /dev/null +++ b/Mage.Network/src/main/java/org/mage/network/handlers/client/TableWaitingMessageHandler.java @@ -0,0 +1,39 @@ +package org.mage.network.handlers.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import java.util.UUID; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import mage.view.TableView; +import org.mage.network.model.TableWaitingMessage; +import org.mage.network.model.TableWaitingRequest; + + +/** + * + * @author BetaSteward + */ +public class TableWaitingMessageHandler extends SimpleChannelInboundHandler { + + private ChannelHandlerContext ctx; + private final BlockingQueue queue = new LinkedBlockingQueue<>(); + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + this.ctx = ctx; + super.channelActive(ctx); + } + + @Override + protected void messageReceived(ChannelHandlerContext ctx, TableWaitingMessage msg) throws Exception { + queue.offer(msg.getRoom()); + } + + public TableView getTable(UUID roomId, UUID tableId) throws Exception { + queue.clear(); + ctx.writeAndFlush(new TableWaitingRequest(roomId, tableId)); + return queue.take(); + } + +} diff --git a/Mage.Network/src/main/java/org/mage/network/handlers/server/JoinTableMessageHandler.java b/Mage.Network/src/main/java/org/mage/network/handlers/server/JoinTableMessageHandler.java index e7ddae8e944..5592a90ba44 100644 --- a/Mage.Network/src/main/java/org/mage/network/handlers/server/JoinTableMessageHandler.java +++ b/Mage.Network/src/main/java/org/mage/network/handlers/server/JoinTableMessageHandler.java @@ -22,7 +22,7 @@ public class JoinTableMessageHandler extends SimpleChannelInboundHandler { + + private final MageServer server; + + public LeaveTableMessageHandler (MageServer server) { + this.server = server; + } + + @Override + public void messageReceived(ChannelHandlerContext ctx, LeaveTableRequest msg) { + LeftTableMessage resp = new LeftTableMessage(server.leaveTable(ctx.channel().id().asLongText(), msg.getRoomId(), msg.getTableId())); + ctx.writeAndFlush(resp); + } + +} diff --git a/Mage.Network/src/main/java/org/mage/network/handlers/server/TableWaitingMessageHandler.java b/Mage.Network/src/main/java/org/mage/network/handlers/server/TableWaitingMessageHandler.java new file mode 100644 index 00000000000..424d69876e3 --- /dev/null +++ b/Mage.Network/src/main/java/org/mage/network/handlers/server/TableWaitingMessageHandler.java @@ -0,0 +1,28 @@ +package org.mage.network.handlers.server; + +import io.netty.channel.ChannelHandler.Sharable; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import org.mage.network.interfaces.MageServer; +import org.mage.network.model.TableWaitingMessage; +import org.mage.network.model.TableWaitingRequest; + +/** + * + * @author BetaSteward + */ +@Sharable +public class TableWaitingMessageHandler extends SimpleChannelInboundHandler { + + private final MageServer server; + + public TableWaitingMessageHandler (MageServer server) { + this.server = server; + } + + @Override + public void messageReceived(ChannelHandlerContext ctx, TableWaitingRequest msg) { + ctx.writeAndFlush(new TableWaitingMessage(server.getTable(msg.getRoomId(), msg.getTableId()))); + } + +} diff --git a/Mage.Network/src/main/java/org/mage/network/interfaces/MageClient.java b/Mage.Network/src/main/java/org/mage/network/interfaces/MageClient.java index b45ada78463..0e0ff7e45ca 100644 --- a/Mage.Network/src/main/java/org/mage/network/interfaces/MageClient.java +++ b/Mage.Network/src/main/java/org/mage/network/interfaces/MageClient.java @@ -22,4 +22,5 @@ public interface MageClient { void clientRegistered(ServerState state); ServerState getServerState(); + void joinedTable(UUID roomId, UUID tableId, UUID chatId, boolean owner, boolean tournament); } diff --git a/Mage.Network/src/main/java/org/mage/network/interfaces/MageServer.java b/Mage.Network/src/main/java/org/mage/network/interfaces/MageServer.java index e401e723804..7b8626d5e02 100644 --- a/Mage.Network/src/main/java/org/mage/network/interfaces/MageServer.java +++ b/Mage.Network/src/main/java/org/mage/network/interfaces/MageServer.java @@ -2,9 +2,7 @@ package org.mage.network.interfaces; import java.util.List; import java.util.UUID; -import mage.MageException; import mage.cards.decks.DeckCardLists; -import mage.game.GameException; import mage.game.match.MatchOptions; import mage.interfaces.ServerState; import mage.remote.DisconnectReason; @@ -33,6 +31,9 @@ public interface MageServer { RoomView getRoom(UUID roomId); TableView createTable(String sessionId, UUID roomId, MatchOptions options); boolean joinTable(String sessionId, UUID roomId, UUID tableId, String name, String playerType, int skill, DeckCardLists deckList, String password); + TableView getTable(UUID roomId, UUID tableId); + boolean leaveTable(String asLongText, UUID roomId, UUID tableId); + void pingTime(long milliSeconds, String sessionId); } diff --git a/Mage.Network/src/main/java/org/mage/network/model/JoinTableRequest.java b/Mage.Network/src/main/java/org/mage/network/model/JoinTableRequest.java index 5558ddf46eb..0ec4f0e4d7d 100644 --- a/Mage.Network/src/main/java/org/mage/network/model/JoinTableRequest.java +++ b/Mage.Network/src/main/java/org/mage/network/model/JoinTableRequest.java @@ -32,7 +32,7 @@ public class JoinTableRequest implements Serializable { return roomId; } - public UUID gettableId() { + public UUID getTableId() { return tableId; } diff --git a/Mage.Network/src/main/java/org/mage/network/model/JoinedTableMessage.java b/Mage.Network/src/main/java/org/mage/network/model/JoinedTableMessage.java new file mode 100644 index 00000000000..4665f50def8 --- /dev/null +++ b/Mage.Network/src/main/java/org/mage/network/model/JoinedTableMessage.java @@ -0,0 +1,45 @@ +package org.mage.network.model; + +import java.io.Serializable; +import java.util.UUID; + +/** + * + * @author BetaSteward + */ +public class JoinedTableMessage implements Serializable { + + private UUID roomId; + private UUID tableId; + private UUID chatId; + private boolean owner; + private boolean tournament; + + public JoinedTableMessage(UUID roomId, UUID tableId, UUID chatId, boolean owner, boolean tournament) { + this.roomId = roomId; + this.tableId = tableId; + this.chatId = chatId; + this.owner = owner; + this.tournament = tournament; + } + + public UUID getRoomId() { + return roomId; + } + + public UUID getTableId() { + return tableId; + } + + public UUID getChatId() { + return chatId; + } + + public boolean isOwner() { + return owner; + } + + public boolean isTournament() { + return tournament; + } +} diff --git a/Mage.Network/src/main/java/org/mage/network/model/LeaveTableRequest.java b/Mage.Network/src/main/java/org/mage/network/model/LeaveTableRequest.java new file mode 100644 index 00000000000..7e0ed8ebb31 --- /dev/null +++ b/Mage.Network/src/main/java/org/mage/network/model/LeaveTableRequest.java @@ -0,0 +1,28 @@ +package org.mage.network.model; + +import java.io.Serializable; +import java.util.UUID; + +/** + * + * @author BetaSteward + */ +public class LeaveTableRequest implements Serializable { + + private UUID roomId; + private UUID tableId; + + public LeaveTableRequest(UUID roomId, UUID tableId) { + this.roomId = roomId; + this.tableId = tableId; + } + + public UUID getRoomId() { + return roomId; + } + + public UUID getTableId() { + return tableId; + } + +} diff --git a/Mage.Network/src/main/java/org/mage/network/model/LeftTableMessage.java b/Mage.Network/src/main/java/org/mage/network/model/LeftTableMessage.java new file mode 100644 index 00000000000..b3981b070d6 --- /dev/null +++ b/Mage.Network/src/main/java/org/mage/network/model/LeftTableMessage.java @@ -0,0 +1,21 @@ +package org.mage.network.model; + +import java.io.Serializable; + +/** + * + * @author BetaSteward + */ +public class LeftTableMessage implements Serializable { + + private boolean success; + + public LeftTableMessage(boolean success) { + this.success = success; + } + + public boolean getSuccess() { + return success; + } + +} diff --git a/Mage.Network/src/main/java/org/mage/network/model/TableWaitingMessage.java b/Mage.Network/src/main/java/org/mage/network/model/TableWaitingMessage.java new file mode 100644 index 00000000000..c945e4c5abc --- /dev/null +++ b/Mage.Network/src/main/java/org/mage/network/model/TableWaitingMessage.java @@ -0,0 +1,22 @@ +package org.mage.network.model; + +import java.io.Serializable; +import mage.view.TableView; + +/** + * + * @author BetaSteward + */ +public class TableWaitingMessage implements Serializable { + + private TableView table; + + public TableWaitingMessage(TableView table) { + this.table = table; + } + + public TableView getRoom() { + return table; + } + +} diff --git a/Mage.Network/src/main/java/org/mage/network/model/TableWaitingRequest.java b/Mage.Network/src/main/java/org/mage/network/model/TableWaitingRequest.java new file mode 100644 index 00000000000..5f9e5cd6427 --- /dev/null +++ b/Mage.Network/src/main/java/org/mage/network/model/TableWaitingRequest.java @@ -0,0 +1,28 @@ +package org.mage.network.model; + +import java.io.Serializable; +import java.util.UUID; + +/** + * + * @author BetaSteward + */ +public class TableWaitingRequest implements Serializable { + + private UUID roomId; + private UUID tableId; + + public TableWaitingRequest(UUID roomId, UUID tableId) { + this.roomId = roomId; + this.tableId = tableId; + } + + public UUID getRoomId() { + return roomId; + } + + public UUID getTableId() { + return tableId; + } + +} diff --git a/Mage.Server/src/main/java/mage/server/Main.java b/Mage.Server/src/main/java/mage/server/Main.java index f0ea450a81e..8131fb65eff 100644 --- a/Mage.Server/src/main/java/mage/server/Main.java +++ b/Mage.Server/src/main/java/mage/server/Main.java @@ -470,22 +470,22 @@ public class Main implements MageServer { // return null; // } // -// @Override -// //FIXME: why no sessionId here??? -// public TableView getTable(UUID roomId, UUID tableId) throws MageException { + @Override + //FIXME: why no sessionId here??? + public TableView getTable(UUID roomId, UUID tableId) { // try { -// GamesRoom room = GamesRoomManager.getInstance().getRoom(roomId); -// if (room != null) { -// return room.getTable(tableId); -// } else { -// return null; -// } + GamesRoom room = GamesRoomManager.getInstance().getRoom(roomId); + if (room != null) { + return room.getTable(tableId); + } else { + return null; + } // } // catch (Exception ex) { // handleException(ex); // } // return null; -// } + } // // @Override // public boolean ping(String sessionId, String pingInfo) { @@ -674,22 +674,22 @@ public class Main implements MageServer { // }); // } // -// @Override -// public boolean leaveTable(final String sessionId, final UUID roomId, final UUID tableId) throws MageException { -// TableState tableState = TableManager.getInstance().getController(tableId).getTableState(); -// if (!tableState.equals(TableState.WAITING) && !tableState.equals(TableState.READY_TO_START)) { -// // table was already started, so player can't leave anymore now -// return false; -// } + @Override + public boolean leaveTable(final String sessionId, final UUID roomId, final UUID tableId) { + TableState tableState = TableManager.getInstance().getController(tableId).getTableState(); + if (!tableState.equals(TableState.WAITING) && !tableState.equals(TableState.READY_TO_START)) { + // table was already started, so player can't leave anymore now + return false; + } // execute("leaveTable", sessionId, new Action() { // @Override // public void execute() { -// UUID userId = SessionManager.getInstance().getSession(sessionId).getUserId(); -// GamesRoomManager.getInstance().getRoom(roomId).leaveTable(userId, tableId); + UUID userId = SessionManager.getInstance().getSession(sessionId).getUserId(); + GamesRoomManager.getInstance().getRoom(roomId).leaveTable(userId, tableId); // } // }); -// return true; -// } + return true; + } // // @Override // //FIXME: why no sessionId here??? @@ -1377,4 +1377,8 @@ public class Main implements MageServer { return testMode; } + public void joinedTable(String sessionId, UUID roomId, UUID tableId, UUID chatId, boolean owner, boolean tournament) { + server.joinedTable(sessionId, roomId, tableId, chatId, owner, tournament); + } + } diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index c0efb8744e0..826e85b2ba8 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -35,7 +35,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import java.util.logging.Level; import mage.MageException; import mage.cards.decks.Deck; import mage.cards.decks.DeckCardLists; @@ -222,7 +221,7 @@ public class TableController { if (seat.getPlayer().isHuman()) { seat.getPlayer().setUserData(user.getUserData()); user.addTable(player.getId(), table); - user.ccJoinedTable(table.getRoomId(), table.getId(), true); + user.joinedTable(table.getRoomId(), table.getId(), chatId, isOwner(userId), true); userPlayerMap.put(userId, player.getId()); } @@ -325,7 +324,7 @@ public class TableController { if (!table.isTournamentSubTable()) { user.addTable(player.getId(), table); } - user.ccJoinedTable(table.getRoomId(), table.getId(), false); + user.joinedTable(table.getRoomId(), table.getId(), chatId, isOwner(userId), false); userPlayerMap.put(userId, player.getId()); } return true; diff --git a/Mage.Server/src/main/java/mage/server/User.java b/Mage.Server/src/main/java/mage/server/User.java index 9af4d258001..b1b25656ebc 100644 --- a/Mage.Server/src/main/java/mage/server/User.java +++ b/Mage.Server/src/main/java/mage/server/User.java @@ -188,8 +188,9 @@ public class User { } } - public void ccJoinedTable(final UUID roomId, final UUID tableId, boolean isTournament) { - fireCallback(new ClientCallback("joinedTable", tableId, new TableClientMessage(roomId, tableId, isTournament))); + public void joinedTable(final UUID roomId, final UUID tableId, final UUID chatId, boolean owner, boolean tournament) { +// fireCallback(new ClientCallback("joinedTable", tableId, new TableClientMessage(roomId, tableId, isTournament))); + Main.getInstance().joinedTable(sessionId, roomId, tableId, chatId, owner, tournament); } public void ccGameStarted(final UUID gameId, final UUID playerId) { @@ -285,7 +286,8 @@ public class User { private void reconnect() { for (Entry entry: tables.entrySet()) { - ccJoinedTable(entry.getValue().getRoomId(), entry.getValue().getId(), entry.getValue().isTournament()); + Table t = entry.getValue(); + joinedTable(t.getRoomId(), t.getId(), TableManager.getInstance().getChatId(t.getId()), TableManager.getInstance().isTableOwner(t.getId(), userId), t.isTournament()); } for (Entry entry: userTournaments.entrySet()) { TournamentController tournamentController = TournamentManager.getInstance().getTournamentController(entry.getValue());