Some changes to the server console.

This commit is contained in:
LevelX2 2016-10-04 17:40:37 +02:00
parent a1123b3c0b
commit db31264538
7 changed files with 212 additions and 89 deletions

View file

@ -166,7 +166,6 @@ public interface MageServer {
GameView getGameView(UUID gameId, String sessionId, UUID playerId) throws MageException; GameView getGameView(UUID gameId, String sessionId, UUID playerId) throws MageException;
// priority, undo, concede, mana pool // priority, undo, concede, mana pool
void sendPlayerAction(PlayerAction playerAction, UUID gameId, String sessionId, Object data) throws MageException; void sendPlayerAction(PlayerAction playerAction, UUID gameId, String sessionId, Object data) throws MageException;
//tournament methods //tournament methods
@ -214,6 +213,8 @@ public interface MageServer {
void endUserSession(String sessionId, String userSessionId) throws MageException; void endUserSession(String sessionId, String userSessionId) throws MageException;
void muteUser(String sessionId, String userName, long durationMinutes) throws MageException;
void removeTable(String sessionId, UUID tableId) throws MageException; void removeTable(String sessionId, UUID tableId) throws MageException;
void sendBroadcastMessage(String sessionId, String message) throws MageException; void sendBroadcastMessage(String sessionId, String message) throws MageException;

View file

@ -27,6 +27,11 @@
*/ */
package mage.remote; package mage.remote;
import java.io.IOException;
import java.lang.reflect.UndeclaredThrowableException;
import java.net.*;
import java.util.*;
import java.util.concurrent.TimeUnit;
import mage.MageException; import mage.MageException;
import mage.cards.decks.DeckCardLists; import mage.cards.decks.DeckCardLists;
import mage.cards.decks.InvalidDeckException; import mage.cards.decks.InvalidDeckException;
@ -56,12 +61,6 @@ import org.jboss.remoting.transport.bisocket.Bisocket;
import org.jboss.remoting.transport.socket.SocketWrapper; import org.jboss.remoting.transport.socket.SocketWrapper;
import org.jboss.remoting.transporter.TransporterClient; import org.jboss.remoting.transporter.TransporterClient;
import java.io.IOException;
import java.lang.reflect.UndeclaredThrowableException;
import java.net.*;
import java.util.*;
import java.util.concurrent.TimeUnit;
/** /**
* *
* @author BetaSteward_at_googlemail.com * @author BetaSteward_at_googlemail.com
@ -103,6 +102,7 @@ public class SessionImpl implements Session {
// intended to be used with handleRemotingTaskExceptions for sharing the common exception // intended to be used with handleRemotingTaskExceptions for sharing the common exception
// handling. // handling.
public interface RemotingTask { public interface RemotingTask {
public boolean run() throws Throwable; public boolean run() throws Throwable;
} }
@ -127,8 +127,8 @@ public class SessionImpl implements Session {
} else if (cause instanceof NoSuchMethodException) { } else if (cause instanceof NoSuchMethodException) {
// NoSuchMethodException is thrown on an invocation of an unknow JBoss remoting // NoSuchMethodException is thrown on an invocation of an unknow JBoss remoting
// method, so it's likely to be because of a version incompatibility. // method, so it's likely to be because of a version incompatibility.
addMessage = "The following method is not available in the server, probably the " + addMessage = "The following method is not available in the server, probably the "
"server version is not compatible to the client: " + cause.getMessage(); + "server version is not compatible to the client: " + cause.getMessage();
} }
if (addMessage.isEmpty()) { if (addMessage.isEmpty()) {
logger.fatal("", ex); logger.fatal("", ex);
@ -341,24 +341,25 @@ public class SessionImpl implements Session {
/** /**
* I'll explain the meaning of "secondaryBindPort" and * I'll explain the meaning of "secondaryBindPort" and
* "secondaryConnectPort", and maybe that will help. The Remoting * "secondaryConnectPort", and maybe that will help. The
* bisocket transport creates two ServerSockets on the server. The * Remoting bisocket transport creates two ServerSockets on the
* "primary" ServerSocket is used to create connections used for * server. The "primary" ServerSocket is used to create
* ordinary invocations, e.g., a request to create a JMS consumer, * connections used for ordinary invocations, e.g., a request to
* and the "secondary" ServerSocket is used to create "control" * create a JMS consumer, and the "secondary" ServerSocket is
* connections for internal Remoting messages. The port for the * used to create "control" connections for internal Remoting
* primary ServerSocket is configured by the "serverBindPort" * messages. The port for the primary ServerSocket is configured
* parameter, and the port for the secondary ServerSocket is, by * by the "serverBindPort" parameter, and the port for the
* default, chosen randomly. The "secondaryBindPort" parameter can * secondary ServerSocket is, by default, chosen randomly. The
* be used to assign a specific port to the secondary ServerSocket. * "secondaryBindPort" parameter can be used to assign a
* Now, if there is a translating firewall between the client and * specific port to the secondary ServerSocket. Now, if there is
* server, the client should be given the value of the port that is * a translating firewall between the client and server, the
* client should be given the value of the port that is
* translated to the actual binding port of the secondary * translated to the actual binding port of the secondary
* ServerSocket. For example, your configuration will tell the * ServerSocket. For example, your configuration will tell the
* secondary ServerSocket to bind to port 14000, and it will tell * secondary ServerSocket to bind to port 14000, and it will
* the client to connect to port 14001. It assumes that there is a * tell the client to connect to port 14001. It assumes that
* firewall which will translate 14001 to 14000. Apparently, that's * there is a firewall which will translate 14001 to 14000.
* not happening. * Apparently, that's not happening.
*/ */
// secondaryBindPort - the port to which the secondary server socket is to be bound. By default, an arbitrary port is selected. // secondaryBindPort - the port to which the secondary server socket is to be bound. By default, an arbitrary port is selected.
// secondaryConnectPort - the port clients are to use to connect to the secondary server socket. // secondaryConnectPort - the port clients are to use to connect to the secondary server socket.
@ -1424,6 +1425,21 @@ public class SessionImpl implements Session {
return false; return false;
} }
@Override
public boolean muteUserChat(String userName, long durationMinutes) {
try {
if (isConnected()) {
server.muteUser(sessionId, userName, durationMinutes);
return true;
}
} catch (MageException ex) {
handleMageException(ex);
} catch (Throwable t) {
handleThrowable(t);
}
return false;
}
private void handleThrowable(Throwable t) { private void handleThrowable(Throwable t) {
logger.fatal("Communication error", t); logger.fatal("Communication error", t);
// Probably this can cause hanging the client under certain circumstances as the disconnect method is synchronized // Probably this can cause hanging the client under certain circumstances as the disconnect method is synchronized

View file

@ -56,5 +56,7 @@ public interface Connect {
boolean endUserSession(String userSessionId); boolean endUserSession(String userSessionId);
boolean muteUserChat(String userName, long durationMinute);
String getSessionId(); String getSessionId();
} }

View file

@ -42,13 +42,15 @@ public class UserView implements Serializable {
private final String sessionId; private final String sessionId;
private final Date timeConnected; private final Date timeConnected;
private final String gameInfo; private final String gameInfo;
private final String userState;
public UserView(String userName, String host, String sessionId, Date timeConnected, String gameInfo) { public UserView(String userName, String host, String sessionId, Date timeConnected, String gameInfo, String userState) {
this.userName = userName; this.userName = userName;
this.host = host; this.host = host;
this.sessionId = sessionId; this.sessionId = sessionId;
this.timeConnected = timeConnected; this.timeConnected = timeConnected;
this.gameInfo = gameInfo; this.gameInfo = gameInfo;
this.userState = userState;
} }
public String getUserName() { public String getUserName() {
@ -71,4 +73,8 @@ public class UserView implements Serializable {
return gameInfo; return gameInfo;
} }
public String getUserState() {
return userState;
}
} }

View file

@ -52,8 +52,8 @@
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0"> <Group type="102" alignment="1" attributes="0">
<Component id="jPanel3" max="32767" attributes="0"/> <Component id="jPanel3" max="32767" attributes="0"/>
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="jPanel4" min="-2" pref="33" max="-2" attributes="0"/> <Component id="jPanel4" min="-2" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -64,12 +64,12 @@
<Layout> <Layout>
<DimensionLayout dim="0"> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane1" alignment="0" pref="249" max="32767" attributes="0"/> <Component id="jScrollPane1" alignment="0" pref="0" max="32767" attributes="0"/>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
<DimensionLayout dim="1"> <DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane1" alignment="0" pref="358" max="32767" attributes="0"/> <Component id="jScrollPane1" alignment="0" pref="347" max="32767" attributes="0"/>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
</Layout> </Layout>
@ -101,10 +101,16 @@
<DimensionLayout dim="0"> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<Component id="btnDisconnect" min="-2" pref="103" max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<EmptySpace type="separate" max="-2" attributes="0"/> <Component id="btnDisconnect" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="btnEndSession" min="-2" max="-2" attributes="0"/> <Component id="btnEndSession" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="8" max="32767" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" max="-2" attributes="0">
<Component id="sliderMuteDurationMinutes" pref="0" max="32767" attributes="0"/>
<Component id="btnMuteUser" max="32767" attributes="0"/>
</Group>
<EmptySpace pref="50" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -114,8 +120,10 @@
<Group type="103" groupAlignment="3" attributes="0"> <Group type="103" groupAlignment="3" attributes="0">
<Component id="btnDisconnect" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="btnDisconnect" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="btnEndSession" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="btnEndSession" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="btnMuteUser" alignment="3" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace max="32767" attributes="0"/> <EmptySpace pref="9" max="32767" attributes="0"/>
<Component id="sliderMuteDurationMinutes" min="-2" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -137,6 +145,21 @@
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnEndSessionActionPerformed"/> <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnEndSessionActionPerformed"/>
</Events> </Events>
</Component> </Component>
<Component class="javax.swing.JButton" name="btnMuteUser">
<Properties>
<Property name="text" type="java.lang.String" value="Mute user"/>
<Property name="actionCommand" type="java.lang.String" value="Mute 1h"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnMuteUserActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JSlider" name="sliderMuteDurationMinutes">
<Properties>
<Property name="maximum" type="int" value="3600"/>
<Property name="value" type="int" value="60"/>
</Properties>
</Component>
</SubComponents> </SubComponents>
</Container> </Container>
</SubComponents> </SubComponents>
@ -159,7 +182,7 @@
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0"> <Group type="102" alignment="1" attributes="0">
<Component id="jPanel5" max="32767" attributes="0"/> <Component id="jPanel5" max="32767" attributes="0"/>
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/> <EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="jPanel6" min="-2" max="-2" attributes="0"/> <Component id="jPanel6" min="-2" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
@ -171,12 +194,15 @@
<Layout> <Layout>
<DimensionLayout dim="0"> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane2" alignment="0" pref="306" max="32767" attributes="0"/> <Component id="jScrollPane2" alignment="0" pref="351" max="32767" attributes="0"/>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
<DimensionLayout dim="1"> <DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane2" alignment="0" pref="356" max="32767" attributes="0"/> <Group type="102" alignment="0" attributes="0">
<Component id="jScrollPane2" min="-2" pref="343" max="-2" attributes="0"/>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
</Layout> </Layout>
@ -205,8 +231,9 @@
<DimensionLayout dim="0"> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="btnRemoveTable" min="-2" max="-2" attributes="0"/> <Component id="btnRemoveTable" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="170" max="32767" attributes="0"/> <EmptySpace max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -214,7 +241,7 @@
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<Component id="btnRemoveTable" min="-2" max="-2" attributes="0"/> <Component id="btnRemoveTable" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/> <EmptySpace pref="31" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>

View file

@ -63,7 +63,9 @@ public class ConsolePanel extends javax.swing.JPanel {
private UpdateUsersTask updateUsersTask; private UpdateUsersTask updateUsersTask;
private UpdateTablesTask updateTablesTask; private UpdateTablesTask updateTablesTask;
/** Creates new form ConsolePanel */ /**
* Creates new form ConsolePanel
*/
public ConsolePanel() { public ConsolePanel() {
this.tableUserModel = new TableUserModel(); this.tableUserModel = new TableUserModel();
this.tableTableModel = new TableTableModel(); this.tableTableModel = new TableTableModel();
@ -91,7 +93,6 @@ public class ConsolePanel extends javax.swing.JPanel {
this.tblTables.getSelectionModel().setSelectionInterval(row, row); this.tblTables.getSelectionModel().setSelectionInterval(row, row);
} }
public void start() { public void start() {
updateUsersTask = new UpdateUsersTask(ConsoleFrame.getSession(), this); updateUsersTask = new UpdateUsersTask(ConsoleFrame.getSession(), this);
updateTablesTask = new UpdateTablesTask(ConsoleFrame.getSession(), ConsoleFrame.getSession().getMainRoomId(), this); updateTablesTask = new UpdateTablesTask(ConsoleFrame.getSession(), ConsoleFrame.getSession().getMainRoomId(), this);
@ -108,10 +109,10 @@ public class ConsolePanel extends javax.swing.JPanel {
} }
} }
/** This method is called from within the constructor to /**
* initialize the form. * This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is * WARNING: Do NOT modify this code. The content of this method is always
* always regenerated by the Form Editor. * regenerated by the Form Editor.
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
@ -125,6 +126,8 @@ public class ConsolePanel extends javax.swing.JPanel {
jPanel4 = new javax.swing.JPanel(); jPanel4 = new javax.swing.JPanel();
btnDisconnect = new javax.swing.JButton(); btnDisconnect = new javax.swing.JButton();
btnEndSession = new javax.swing.JButton(); btnEndSession = new javax.swing.JButton();
btnMuteUser = new javax.swing.JButton();
sliderMuteDurationMinutes = new javax.swing.JSlider();
jPanel2 = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel();
jPanel5 = new javax.swing.JPanel(); jPanel5 = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane(); jScrollPane2 = new javax.swing.JScrollPane();
@ -142,11 +145,11 @@ public class ConsolePanel extends javax.swing.JPanel {
jPanel3.setLayout(jPanel3Layout); jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup( jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 249, Short.MAX_VALUE) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
); );
jPanel3Layout.setVerticalGroup( jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 358, Short.MAX_VALUE) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 347, Short.MAX_VALUE)
); );
jPanel4.setVerifyInputWhenFocusTarget(false); jPanel4.setVerifyInputWhenFocusTarget(false);
@ -165,23 +168,41 @@ public class ConsolePanel extends javax.swing.JPanel {
} }
}); });
btnMuteUser.setText("Mute user");
btnMuteUser.setActionCommand("Mute 1h");
btnMuteUser.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnMuteUserActionPerformed(evt);
}
});
sliderMuteDurationMinutes.setMaximum(3600);
sliderMuteDurationMinutes.setValue(60);
javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
jPanel4.setLayout(jPanel4Layout); jPanel4.setLayout(jPanel4Layout);
jPanel4Layout.setHorizontalGroup( jPanel4Layout.setHorizontalGroup(
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel4Layout.createSequentialGroup() .addGroup(jPanel4Layout.createSequentialGroup()
.addComponent(btnDisconnect, javax.swing.GroupLayout.PREFERRED_SIZE, 103, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()
.addGap(18, 18, 18) .addComponent(btnDisconnect)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnEndSession) .addComponent(btnEndSession)
.addContainerGap(8, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(sliderMuteDurationMinutes, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
.addComponent(btnMuteUser, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap(50, Short.MAX_VALUE))
); );
jPanel4Layout.setVerticalGroup( jPanel4Layout.setVerticalGroup(
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel4Layout.createSequentialGroup() .addGroup(jPanel4Layout.createSequentialGroup()
.addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btnDisconnect) .addComponent(btnDisconnect)
.addComponent(btnEndSession)) .addComponent(btnEndSession)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addComponent(btnMuteUser))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 9, Short.MAX_VALUE)
.addComponent(sliderMuteDurationMinutes, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
); );
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
@ -195,8 +216,8 @@ public class ConsolePanel extends javax.swing.JPanel {
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(0, 0, 0) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
); );
jSplitPane1.setLeftComponent(jPanel1); jSplitPane1.setLeftComponent(jPanel1);
@ -208,11 +229,13 @@ public class ConsolePanel extends javax.swing.JPanel {
jPanel5.setLayout(jPanel5Layout); jPanel5.setLayout(jPanel5Layout);
jPanel5Layout.setHorizontalGroup( jPanel5Layout.setHorizontalGroup(
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 306, Short.MAX_VALUE) .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 351, Short.MAX_VALUE)
); );
jPanel5Layout.setVerticalGroup( jPanel5Layout.setVerticalGroup(
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 356, Short.MAX_VALUE) .addGroup(jPanel5Layout.createSequentialGroup()
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 343, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, Short.MAX_VALUE))
); );
btnRemoveTable.setLabel("Remove Table"); btnRemoveTable.setLabel("Remove Table");
@ -227,14 +250,15 @@ public class ConsolePanel extends javax.swing.JPanel {
jPanel6Layout.setHorizontalGroup( jPanel6Layout.setHorizontalGroup(
jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel6Layout.createSequentialGroup() .addGroup(jPanel6Layout.createSequentialGroup()
.addContainerGap()
.addComponent(btnRemoveTable) .addComponent(btnRemoveTable)
.addContainerGap(170, Short.MAX_VALUE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
); );
jPanel6Layout.setVerticalGroup( jPanel6Layout.setVerticalGroup(
jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel6Layout.createSequentialGroup() .addGroup(jPanel6Layout.createSequentialGroup()
.addComponent(btnRemoveTable) .addComponent(btnRemoveTable)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap(31, Short.MAX_VALUE))
); );
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
@ -242,13 +266,13 @@ public class ConsolePanel extends javax.swing.JPanel {
jPanel2Layout.setHorizontalGroup( jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel6, javax.swing.GroupLayout.DEFAULT_SIZE, 301, Short.MAX_VALUE) .addComponent(jPanel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
); );
jPanel2Layout.setVerticalGroup( jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
.addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(0, 0, 0) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
); );
@ -258,7 +282,7 @@ public class ConsolePanel extends javax.swing.JPanel {
this.setLayout(layout); this.setLayout(layout);
layout.setHorizontalGroup( layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jSplitPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 562, Short.MAX_VALUE) .addComponent(jSplitPane1, javax.swing.GroupLayout.Alignment.TRAILING)
); );
layout.setVerticalGroup( layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@ -268,7 +292,7 @@ public class ConsolePanel extends javax.swing.JPanel {
private void btnDisconnectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDisconnectActionPerformed private void btnDisconnectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDisconnectActionPerformed
int row = this.tblUsers.convertRowIndexToModel(tblUsers.getSelectedRow()); int row = this.tblUsers.convertRowIndexToModel(tblUsers.getSelectedRow());
ConsoleFrame.getSession().disconnectUser((String)tableUserModel.getValueAt(row, 3)); ConsoleFrame.getSession().disconnectUser((String) tableUserModel.getValueAt(row, TableUserModel.POS_SESSION_ID));
}//GEN-LAST:event_btnDisconnectActionPerformed }//GEN-LAST:event_btnDisconnectActionPerformed
private void btnRemoveTableActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveTableActionPerformed private void btnRemoveTableActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveTableActionPerformed
@ -278,12 +302,18 @@ public class ConsolePanel extends javax.swing.JPanel {
private void btnEndSessionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEndSessionActionPerformed private void btnEndSessionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEndSessionActionPerformed
int row = this.tblUsers.convertRowIndexToModel(tblUsers.getSelectedRow()); int row = this.tblUsers.convertRowIndexToModel(tblUsers.getSelectedRow());
ConsoleFrame.getSession().endUserSession((String) tableUserModel.getValueAt(row, 3)); ConsoleFrame.getSession().endUserSession((String) tableUserModel.getValueAt(row, TableUserModel.POS_GAME_INFO));
}//GEN-LAST:event_btnEndSessionActionPerformed }//GEN-LAST:event_btnEndSessionActionPerformed
private void btnMuteUserActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnMuteUserActionPerformed
int row = this.tblUsers.convertRowIndexToModel(tblUsers.getSelectedRow());
ConsoleFrame.getSession().muteUserChat((String) tableUserModel.getValueAt(row, TableUserModel.POS_USER_NAME), sliderMuteDurationMinutes.getValue());
}//GEN-LAST:event_btnMuteUserActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnDisconnect; private javax.swing.JButton btnDisconnect;
private javax.swing.JButton btnEndSession; private javax.swing.JButton btnEndSession;
private javax.swing.JButton btnMuteUser;
private javax.swing.JButton btnRemoveTable; private javax.swing.JButton btnRemoveTable;
private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel2;
@ -294,13 +324,22 @@ public class ConsolePanel extends javax.swing.JPanel {
private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2; private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JSplitPane jSplitPane1; private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JSlider sliderMuteDurationMinutes;
private javax.swing.JTable tblTables; private javax.swing.JTable tblTables;
private javax.swing.JTable tblUsers; private javax.swing.JTable tblUsers;
// End of variables declaration//GEN-END:variables // End of variables declaration//GEN-END:variables
} }
class TableUserModel extends AbstractTableModel { class TableUserModel extends AbstractTableModel {
private final String[] columnNames = new String[]{"User Name", "Host", "Time Connected", "SessionId", "Gameinfo"};
public static final int POS_USER_NAME = 0;
public static final int POS_HOST = 1;
public static final int POS_TIME_CONNECTED = 2;
public static final int POS_SESSION_ID = 3;
public static final int POS_GAME_INFO = 4;
public static final int POS_USER_STATE = 5;
private final String[] columnNames = new String[]{"User Name", "Host", "Time Connected", "SessionId", "Gameinfo", "User State"};
private UserView[] users = new UserView[0]; private UserView[] users = new UserView[0];
private static final DateFormat formatter = new SimpleDateFormat("HH:mm:ss"); private static final DateFormat formatter = new SimpleDateFormat("HH:mm:ss");
@ -322,16 +361,18 @@ class TableUserModel extends AbstractTableModel {
@Override @Override
public Object getValueAt(int arg0, int arg1) { public Object getValueAt(int arg0, int arg1) {
switch (arg1) { switch (arg1) {
case 0: case POS_USER_NAME:
return users[arg0].getUserName(); return users[arg0].getUserName();
case 1: case POS_HOST:
return users[arg0].getHost(); return users[arg0].getHost();
case 2: case POS_TIME_CONNECTED:
return formatter.format(users[arg0].getConnectionTime()); return formatter.format(users[arg0].getConnectionTime());
case 3: case POS_SESSION_ID:
return users[arg0].getSessionId(); return users[arg0].getSessionId();
case 4: case POS_GAME_INFO:
return users[arg0].getGameInfo(); return users[arg0].getGameInfo();
case POS_USER_STATE:
return users[arg0].getUserState();
} }
return ""; return "";
} }
@ -360,10 +401,10 @@ class TableUserModel extends AbstractTableModel {
} }
class TableTableModel extends AbstractTableModel { class TableTableModel extends AbstractTableModel {
private final String[] columnNames = new String[]{"Table Name", "Owner", "Game Type", "Deck Type", "Status"}; private final String[] columnNames = new String[]{"Table Name", "Owner", "Game Type", "Deck Type", "Status"};
private TableView[] tables = new TableView[0]; private TableView[] tables = new TableView[0];
public void loadData(Collection<TableView> tables) { public void loadData(Collection<TableView> tables) {
this.tables = tables.toArray(new TableView[0]); this.tables = tables.toArray(new TableView[0]);
this.fireTableDataChanged(); this.fireTableDataChanged();
@ -497,7 +538,8 @@ class UpdateUsersTask extends SwingWorker<Void, List<UserView>> {
logger.fatal("Update Users Task error", ex); logger.fatal("Update Users Task error", ex);
} catch (ExecutionException ex) { } catch (ExecutionException ex) {
logger.fatal("Update Users Task error", ex); logger.fatal("Update Users Task error", ex);
} catch (CancellationException ex) {} } catch (CancellationException ex) {
}
} }
} }
@ -537,6 +579,7 @@ class UpdateTablesTask extends SwingWorker<Void, Collection<TableView>> {
logger.fatal("Update Tables Task error", ex); logger.fatal("Update Tables Task error", ex);
} catch (ExecutionException ex) { } catch (ExecutionException ex) {
logger.fatal("Update Tables Task error", ex); logger.fatal("Update Tables Task error", ex);
} catch (CancellationException ex) {} } catch (CancellationException ex) {
}
} }
} }

View file

@ -28,7 +28,11 @@
package mage.server; package mage.server;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
@ -36,6 +40,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import javax.management.timer.Timer;
import mage.MageException; import mage.MageException;
import mage.cards.decks.DeckCardLists; import mage.cards.decks.DeckCardLists;
import mage.cards.repository.CardInfo; import mage.cards.repository.CardInfo;
@ -100,6 +105,8 @@ public class MageServerImpl implements MageServer {
private static final ExecutorService callExecutor = ThreadExecutor.getInstance().getCallExecutor(); private static final ExecutorService callExecutor = ThreadExecutor.getInstance().getCallExecutor();
private static final SecureRandom RANDOM = new SecureRandom(); private static final SecureRandom RANDOM = new SecureRandom();
private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-M-dd hh:mm:ss");
private final String adminPassword; private final String adminPassword;
private final boolean testMode; private final boolean testMode;
private final LinkedHashMap<String, String> activeAuthTokens = new LinkedHashMap<String, String>() { private final LinkedHashMap<String, String> activeAuthTokens = new LinkedHashMap<String, String>() {
@ -1062,8 +1069,13 @@ public class MageServerImpl implements MageServer {
public List<UserView> execute() throws MageException { public List<UserView> execute() throws MageException {
List<UserView> users = new ArrayList<>(); List<UserView> users = new ArrayList<>();
for (User user : UserManager.getInstance().getUsers()) { for (User user : UserManager.getInstance().getUsers()) {
users.add(new UserView(
users.add(new UserView(user.getName(), user.getHost(), user.getSessionId(), user.getConnectionTime(), user.getGameInfo())); user.getName(),
user.getHost(),
user.getSessionId(),
user.getConnectionTime(),
user.getGameInfo(),
user.getUserState().toString()));
} }
return users; return users;
} }
@ -1080,6 +1092,22 @@ public class MageServerImpl implements MageServer {
}); });
} }
@Override
public void muteUser(final String sessionId, final String userName, final long durationMinutes) throws MageException {
execute("muteUser", sessionId, new Action() {
@Override
public void execute() {
User user = UserManager.getInstance().getUserByName(userName);
if (user != null) {
Date muteUntil = new Date(Calendar.getInstance().getTimeInMillis() + (durationMinutes * Timer.ONE_MINUTE));
user.showUserMessage("Admin info", "You were muted for chat messages until " + dateFormat.format(muteUntil) + ".");
// user.setChatMuteUntil(new Date() + duationMinutes);
}
}
});
}
@Override @Override
public void endUserSession(final String sessionId, final String userSessionId) throws MageException { public void endUserSession(final String sessionId, final String userSessionId) throws MageException {
execute("endUserSession", sessionId, new Action() { execute("endUserSession", sessionId, new Action() {