mirror of
https://github.com/TotalFreedomMC/ZeroTelnetClient.git
synced 2024-12-22 16:25:14 +00:00
Added right click player list popup + actions.
This commit is contained in:
parent
ba202365c7
commit
e2eaacd1e0
4 changed files with 250 additions and 24 deletions
|
@ -21,13 +21,15 @@ public class BTC_ConnectionManager
|
|||
private int port;
|
||||
private boolean canDoDisconnect = false;
|
||||
private String loginName;
|
||||
private final ByteArrayOutputStream consoleBuffer = new ByteArrayOutputStream();
|
||||
private final PrintStream consoleStream = new PrintStream(consoleBuffer);
|
||||
|
||||
public BTC_ConnectionManager()
|
||||
{
|
||||
this.telnetClient = new TelnetClient();
|
||||
}
|
||||
|
||||
public void triggerConnect(String hostname, int port)
|
||||
public void triggerConnect(final String hostname, final int port)
|
||||
{
|
||||
final BTC_MainPanel btc = BukkitTelnetClient.mainPanel;
|
||||
|
||||
|
@ -45,7 +47,7 @@ public class BTC_ConnectionManager
|
|||
startConnectThread();
|
||||
}
|
||||
|
||||
public void triggerConnect(String hostnameAndPort)
|
||||
public void triggerConnect(final String hostnameAndPort)
|
||||
{
|
||||
final String[] parts = StringUtils.split(hostnameAndPort, ":");
|
||||
|
||||
|
@ -103,15 +105,12 @@ public class BTC_ConnectionManager
|
|||
System.out.println("\nDisconnected.");
|
||||
}
|
||||
|
||||
private final ByteArrayOutputStream consoleBuffer = new ByteArrayOutputStream();
|
||||
private final PrintStream consoleStream = new PrintStream(consoleBuffer);
|
||||
|
||||
public void sendCommand(String text)
|
||||
public void sendCommand(final String text)
|
||||
{
|
||||
sendCommand(text, true);
|
||||
}
|
||||
|
||||
public void sendCommand(String text, boolean verbose)
|
||||
public void sendCommand(final String text, final boolean verbose)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -169,7 +168,6 @@ public class BTC_ConnectionManager
|
|||
|
||||
try (final BufferedReader reader = new BufferedReader(new InputStreamReader(telnetClient.getInputStream())))
|
||||
{
|
||||
|
||||
int read = 0;
|
||||
while (read != -1)
|
||||
{
|
||||
|
@ -198,7 +196,7 @@ public class BTC_ConnectionManager
|
|||
{
|
||||
BTC_ConnectionManager.this.loginName = _loginName;
|
||||
updateTitle(true);
|
||||
sendDelayedCommand("telnet.enhanced", false, 500);
|
||||
sendDelayedCommand("telnet.enhanced", false, 100);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -247,7 +245,7 @@ public class BTC_ConnectionManager
|
|||
this.connectThread.start();
|
||||
}
|
||||
|
||||
public final void updateTitle(boolean isConnected)
|
||||
public final void updateTitle(final boolean isConnected)
|
||||
{
|
||||
final BTC_MainPanel mainPanel = BukkitTelnetClient.mainPanel;
|
||||
if (mainPanel == null)
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
<SubComponents>
|
||||
<Container class="javax.swing.JSplitPane" name="splitPane">
|
||||
<Properties>
|
||||
<Property name="dividerLocation" type="int" value="650"/>
|
||||
<Property name="dividerLocation" type="int" value="700"/>
|
||||
</Properties>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
|
||||
|
@ -71,7 +71,7 @@
|
|||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="txtCommand" max="32767" attributes="0"/>
|
||||
<Component id="txtServer" pref="378" max="32767" attributes="0"/>
|
||||
<Component id="txtServer" pref="428" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
||||
|
@ -215,9 +215,9 @@
|
|||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jScrollPane2" pref="346" max="32767" attributes="0"/>
|
||||
<Component id="jScrollPane2" pref="296" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
|
@ -225,7 +225,7 @@
|
|||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jScrollPane2" pref="395" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
|
|
|
@ -2,8 +2,12 @@ package me.StevenLawson.BukkitTelnetClient;
|
|||
|
||||
import java.awt.EventQueue;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
|
@ -16,6 +20,9 @@ import java.util.LinkedList;
|
|||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JMenuItem;
|
||||
import javax.swing.JPopupMenu;
|
||||
import javax.swing.JTable;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.table.DefaultTableModel;
|
||||
import javax.swing.text.BadLocationException;
|
||||
|
@ -57,10 +64,135 @@ public class BTC_MainPanel extends javax.swing.JFrame
|
|||
|
||||
this.splitPane.setResizeWeight(1.0);
|
||||
|
||||
setupTablePopup();
|
||||
|
||||
this.setLocationRelativeTo(null);
|
||||
this.setVisible(true);
|
||||
}
|
||||
|
||||
public static final class CommandMenuItem extends JMenuItem
|
||||
{
|
||||
private final ServerCommand command;
|
||||
private final BTC_PlayerListDecoder.PlayerInfo player;
|
||||
|
||||
public CommandMenuItem(String text, ServerCommand command, BTC_PlayerListDecoder.PlayerInfo player)
|
||||
{
|
||||
super(text);
|
||||
this.command = command;
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
public ServerCommand getCommand()
|
||||
{
|
||||
return command;
|
||||
}
|
||||
|
||||
public BTC_PlayerListDecoder.PlayerInfo getPlayer()
|
||||
{
|
||||
return player;
|
||||
}
|
||||
}
|
||||
|
||||
public static enum ServerCommand
|
||||
{
|
||||
BAN("Ban", "glist ban %s"),
|
||||
MUTE("Toggle Mute", "mute %s"),
|
||||
KICK("Kick", "tempban %s 10s Kicked"),
|
||||
TEMPBAN("Tempban 5m", "tempban %s 5m"),
|
||||
SMITE("Smite", "smite %s"),
|
||||
OP("Op", "op %s"),
|
||||
DEOP("Deop", "deop %s"),
|
||||
GTFO("GTFO", "gtfo %s");
|
||||
|
||||
private final String commandName;
|
||||
private final String commandFormat;
|
||||
|
||||
private ServerCommand(String commandName, String commandFormat)
|
||||
{
|
||||
this.commandName = commandName;
|
||||
this.commandFormat = commandFormat;
|
||||
}
|
||||
|
||||
public String getCommandName()
|
||||
{
|
||||
return commandName;
|
||||
}
|
||||
|
||||
public String getCommandFormat()
|
||||
{
|
||||
return commandFormat;
|
||||
}
|
||||
}
|
||||
|
||||
public final void setupTablePopup()
|
||||
{
|
||||
this.tblPlayers.addMouseListener(new MouseAdapter()
|
||||
{
|
||||
@Override
|
||||
public void mouseReleased(final MouseEvent mouseEvent)
|
||||
{
|
||||
final JTable table = BTC_MainPanel.this.tblPlayers;
|
||||
|
||||
final int r = table.rowAtPoint(mouseEvent.getPoint());
|
||||
if (r >= 0 && r < table.getRowCount())
|
||||
{
|
||||
table.setRowSelectionInterval(r, r);
|
||||
}
|
||||
else
|
||||
{
|
||||
table.clearSelection();
|
||||
}
|
||||
|
||||
final int rowindex = table.getSelectedRow();
|
||||
if (rowindex < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (mouseEvent.isPopupTrigger() && mouseEvent.getComponent() instanceof JTable)
|
||||
{
|
||||
final BTC_PlayerListDecoder.PlayerInfo player = getSelectedPlayer();
|
||||
if (player != null)
|
||||
{
|
||||
final JPopupMenu popup = new JPopupMenu(player.getName());
|
||||
|
||||
final JMenuItem header = new JMenuItem("Apply action to " + player.getName() + ":");
|
||||
header.setEnabled(false);
|
||||
popup.add(header);
|
||||
|
||||
popup.addSeparator();
|
||||
|
||||
final ActionListener popupAction = new ActionListener()
|
||||
{
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent actionEvent)
|
||||
{
|
||||
Object _source = actionEvent.getSource();
|
||||
if (_source instanceof CommandMenuItem)
|
||||
{
|
||||
final CommandMenuItem source = (CommandMenuItem) _source;
|
||||
final BTC_PlayerListDecoder.PlayerInfo _player = source.getPlayer();
|
||||
final ServerCommand _command = source.getCommand();
|
||||
final String output = String.format(_command.getCommandFormat(), _player.getName());
|
||||
|
||||
BTC_MainPanel.this.getConnectionManager().sendDelayedCommand(output, true, 100);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
for (final ServerCommand command : ServerCommand.values())
|
||||
{
|
||||
final CommandMenuItem item = new CommandMenuItem(command.getCommandName(), command, player);
|
||||
item.addActionListener(popupAction);
|
||||
popup.add(item);
|
||||
}
|
||||
|
||||
popup.show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY());
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public final void updateTextPane(final String text)
|
||||
{
|
||||
SwingUtilities.invokeLater(new Runnable()
|
||||
|
@ -91,6 +223,62 @@ public class BTC_MainPanel extends javax.swing.JFrame
|
|||
});
|
||||
}
|
||||
|
||||
public BTC_PlayerListDecoder.PlayerInfo getSelectedPlayer()
|
||||
{
|
||||
String name = null;
|
||||
String ip = null;
|
||||
String displayName = null;
|
||||
|
||||
final JTable table = BTC_MainPanel.this.tblPlayers;
|
||||
final DefaultTableModel model = (DefaultTableModel) table.getModel();
|
||||
|
||||
int selectedRow = table.getSelectedRow();
|
||||
if (selectedRow < 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
for (int col = 0; col <= 2; col++)
|
||||
{
|
||||
int modelRow = table.convertRowIndexToModel(selectedRow);
|
||||
int modelCol = table.convertColumnIndexToModel(col);
|
||||
|
||||
String colName = model.getColumnName(modelCol);
|
||||
Object value = model.getValueAt(modelRow, modelCol);
|
||||
|
||||
if (null != colName)
|
||||
{
|
||||
switch (colName)
|
||||
{
|
||||
case "Name":
|
||||
{
|
||||
name = value.toString();
|
||||
break;
|
||||
}
|
||||
case "IP":
|
||||
{
|
||||
ip = value.toString();
|
||||
break;
|
||||
}
|
||||
case "Display Name":
|
||||
{
|
||||
displayName = value.toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (name != null && ip != null & displayName != null)
|
||||
{
|
||||
return new BTC_PlayerListDecoder.PlayerInfo(name, ip, displayName);
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public final void updatePlayerList(final Map<String, BTC_PlayerListDecoder.PlayerInfo> playerList)
|
||||
{
|
||||
EventQueue.invokeLater(new Runnable()
|
||||
|
@ -98,7 +286,8 @@ public class BTC_MainPanel extends javax.swing.JFrame
|
|||
@Override
|
||||
public void run()
|
||||
{
|
||||
final DefaultTableModel model = (DefaultTableModel) BTC_MainPanel.this.tblPlayers.getModel();
|
||||
final JTable table = BTC_MainPanel.this.tblPlayers;
|
||||
final DefaultTableModel model = (DefaultTableModel) table.getModel();
|
||||
|
||||
model.setRowCount(0);
|
||||
|
||||
|
@ -219,7 +408,7 @@ public class BTC_MainPanel extends javax.swing.JFrame
|
|||
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
|
||||
setTitle("BukkitTelnetClient");
|
||||
|
||||
splitPane.setDividerLocation(650);
|
||||
splitPane.setDividerLocation(700);
|
||||
|
||||
mainOutput.setEditable(false);
|
||||
mainOutput.setFont(new java.awt.Font("Courier New", 0, 12)); // NOI18N
|
||||
|
@ -294,7 +483,7 @@ public class BTC_MainPanel extends javax.swing.JFrame
|
|||
.addGap(18, 18, 18)
|
||||
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(txtCommand)
|
||||
.addComponent(txtServer, 0, 378, Short.MAX_VALUE))
|
||||
.addComponent(txtServer, 0, 428, Short.MAX_VALUE))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
||||
.addComponent(btnConnect, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
|
@ -372,7 +561,7 @@ public class BTC_MainPanel extends javax.swing.JFrame
|
|||
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel2Layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 346, Short.MAX_VALUE)
|
||||
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 296, Short.MAX_VALUE)
|
||||
.addContainerGap())
|
||||
);
|
||||
jPanel2Layout.setVerticalGroup(
|
||||
|
|
|
@ -5,6 +5,8 @@ import java.util.Iterator;
|
|||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import org.apache.commons.lang3.builder.EqualsBuilder;
|
||||
import org.apache.commons.lang3.builder.HashCodeBuilder;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
@ -73,20 +75,57 @@ public class BTC_PlayerListDecoder
|
|||
this.displayName = displayName;
|
||||
}
|
||||
|
||||
public String getIp()
|
||||
{
|
||||
return ip;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getIp()
|
||||
{
|
||||
return ip;
|
||||
}
|
||||
|
||||
public String getDisplayName()
|
||||
{
|
||||
return displayName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
return new HashCodeBuilder(17, 31).
|
||||
append(name).
|
||||
append(ip).
|
||||
append(displayName).
|
||||
toHashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj)
|
||||
{
|
||||
if (!(obj instanceof PlayerInfo))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (obj == this)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
PlayerInfo rhs = (PlayerInfo) obj;
|
||||
return new EqualsBuilder().
|
||||
append(name, rhs.name).
|
||||
append(ip, rhs.ip).
|
||||
append(displayName, rhs.displayName).
|
||||
isEquals();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return String.format("%s[Name: %s, Display Name: %s, IP: %s]", this.getClass().toString(), name, displayName, ip);
|
||||
}
|
||||
}
|
||||
|
||||
public static final class JSONArrayIterable implements Iterable<JSONObject>
|
||||
|
|
Loading…
Reference in a new issue