mirror of
https://github.com/ViaVersion/ViaProxy.git
synced 2024-11-14 19:15:08 -05:00
Added tabs to the ui
This commit is contained in:
parent
0b0e498fc7
commit
d036d37bd0
6 changed files with 491 additions and 206 deletions
|
@ -6,4 +6,4 @@ org.gradle.configureondemand=true
|
||||||
# Project properties
|
# Project properties
|
||||||
maven_name=ViaProxy
|
maven_name=ViaProxy
|
||||||
maven_group=net.raphimc
|
maven_group=net.raphimc
|
||||||
maven_version=3.0.1
|
maven_version=3.0.2
|
||||||
|
|
29
src/main/java/net/raphimc/viaproxy/ui/AUITab.java
Normal file
29
src/main/java/net/raphimc/viaproxy/ui/AUITab.java
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
package net.raphimc.viaproxy.ui;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
|
||||||
|
public abstract class AUITab {
|
||||||
|
|
||||||
|
protected final ViaProxyUI frame;
|
||||||
|
private final String name;
|
||||||
|
private final JPanel contentPane;
|
||||||
|
|
||||||
|
public AUITab(final ViaProxyUI frame, final String name) {
|
||||||
|
this.frame = frame;
|
||||||
|
this.name = name;
|
||||||
|
this.contentPane = new JPanel();
|
||||||
|
|
||||||
|
this.contentPane.setLayout(null);
|
||||||
|
this.init(this.contentPane);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(final JTabbedPane tabbedPane) {
|
||||||
|
tabbedPane.addTab(this.name, this.contentPane);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void init(final JPanel contentPane);
|
||||||
|
|
||||||
|
public void setReady() {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,54 +1,40 @@
|
||||||
package net.raphimc.viaproxy.ui;
|
package net.raphimc.viaproxy.ui;
|
||||||
|
|
||||||
import com.formdev.flatlaf.FlatDarkLaf;
|
import com.formdev.flatlaf.FlatDarkLaf;
|
||||||
import com.google.common.net.HostAndPort;
|
import net.lenni0451.reflect.stream.RStream;
|
||||||
import net.raphimc.vialegacy.util.VersionEnum;
|
|
||||||
import net.raphimc.viaproxy.ViaProxy;
|
import net.raphimc.viaproxy.ViaProxy;
|
||||||
import net.raphimc.viaproxy.cli.options.Options;
|
import net.raphimc.viaproxy.ui.impl.GeneralTab;
|
||||||
|
import net.raphimc.viaproxy.ui.impl.OnlineModeTab;
|
||||||
import net.raphimc.viaproxy.util.logging.Logger;
|
import net.raphimc.viaproxy.util.logging.Logger;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.event.MouseAdapter;
|
|
||||||
import java.awt.event.MouseEvent;
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class ViaProxyUI extends JFrame {
|
public class ViaProxyUI extends JFrame {
|
||||||
|
|
||||||
private final JPanel contentPane = new JPanel();
|
private final JTabbedPane contentPane = new JTabbedPane();
|
||||||
|
private final List<AUITab> tabs = new ArrayList<>();
|
||||||
|
private final GeneralTab generalTab = new GeneralTab(this);
|
||||||
|
private final OnlineModeTab onlineModeTab = new OnlineModeTab(this);
|
||||||
|
|
||||||
private ImageIcon icon;
|
private ImageIcon icon;
|
||||||
|
|
||||||
private JTextField serverAddress;
|
|
||||||
private JComboBox<VersionEnum> serverVersion;
|
|
||||||
private JSpinner bindPort;
|
|
||||||
private JComboBox<String> authMethod;
|
|
||||||
private JCheckBox betaCraftAuth;
|
|
||||||
private JCheckBox proxyOnlineMode;
|
|
||||||
private JLabel stateLabel;
|
|
||||||
private JButton stateButton;
|
|
||||||
|
|
||||||
public ViaProxyUI() {
|
public ViaProxyUI() {
|
||||||
this.applyDarkFlatLafTheme();
|
Thread.setDefaultUncaughtExceptionHandler((t, e) -> this.showException(e));
|
||||||
|
|
||||||
|
this.setLookAndFeel();
|
||||||
this.loadIcons();
|
this.loadIcons();
|
||||||
this.initWindow();
|
this.initWindow();
|
||||||
this.initElements();
|
this.initTabs();
|
||||||
|
|
||||||
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
|
|
||||||
Logger.LOGGER.error("Caught exception in thread " + t.getName(), e);
|
|
||||||
final StringBuilder builder = new StringBuilder("An error occurred:\n");
|
|
||||||
builder.append("[").append(e.getClass().getSimpleName()).append("] ").append(e.getMessage()).append("\n");
|
|
||||||
for (StackTraceElement element : e.getStackTrace()) {
|
|
||||||
builder.append(element.toString()).append("\n");
|
|
||||||
}
|
|
||||||
this.showError(builder.toString());
|
|
||||||
});
|
|
||||||
|
|
||||||
SwingUtilities.updateComponentTreeUI(this);
|
SwingUtilities.updateComponentTreeUI(this);
|
||||||
this.setVisible(true);
|
this.setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyDarkFlatLafTheme() {
|
private void setLookAndFeel() {
|
||||||
try {
|
try {
|
||||||
UIManager.setLookAndFeel(new FlatDarkLaf());
|
UIManager.setLookAndFeel(new FlatDarkLaf());
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
|
@ -64,195 +50,44 @@ public class ViaProxyUI extends JFrame {
|
||||||
this.setTitle("ViaProxy v" + ViaProxy.VERSION);
|
this.setTitle("ViaProxy v" + ViaProxy.VERSION);
|
||||||
this.setIconImage(this.icon.getImage());
|
this.setIconImage(this.icon.getImage());
|
||||||
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||||
this.setSize(500, 370);
|
this.setSize(500, 403);
|
||||||
this.setResizable(false);
|
this.setResizable(false);
|
||||||
this.setLocationRelativeTo(null);
|
this.setLocationRelativeTo(null);
|
||||||
this.setContentPane(this.contentPane);
|
this.setContentPane(this.contentPane);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initElements() {
|
private void initTabs() {
|
||||||
this.contentPane.setLayout(null);
|
RStream
|
||||||
{
|
.of(this)
|
||||||
JLabel titleLabel = new JLabel("ViaProxy");
|
.fields()
|
||||||
titleLabel.setBounds(0, 0, 500, 50);
|
.filter(field -> AUITab.class.isAssignableFrom(field.type()))
|
||||||
titleLabel.setHorizontalAlignment(SwingConstants.CENTER);
|
.forEach(field -> {
|
||||||
titleLabel.setFont(titleLabel.getFont().deriveFont(30F));
|
AUITab tab = field.get();
|
||||||
this.contentPane.add(titleLabel);
|
this.tabs.add(field.get());
|
||||||
}
|
tab.add(this.contentPane);
|
||||||
{
|
|
||||||
JLabel copyrightLabel = new JLabel("© RK_01 & Lenni0451");
|
|
||||||
copyrightLabel.setBounds(360, 10, 500, 20);
|
|
||||||
this.contentPane.add(copyrightLabel);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
JLabel discordLabel = new JLabel("Discord");
|
|
||||||
discordLabel.setBounds(10, 10, 45, 20);
|
|
||||||
discordLabel.setForeground(new Color(124, 171, 241));
|
|
||||||
discordLabel.addMouseListener(new MouseAdapter() {
|
|
||||||
private static final String LINK = "https://viaproxy.raphimc.net";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mouseReleased(MouseEvent e) {
|
|
||||||
try {
|
|
||||||
Desktop.getDesktop().browse(new URI(LINK));
|
|
||||||
} catch (Throwable t) {
|
|
||||||
showInfo("Couldn't open the link :(\nHere it is for you: " + LINK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
this.contentPane.add(discordLabel);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
JLabel addressLabel = new JLabel("Server Address:");
|
|
||||||
addressLabel.setBounds(10, 50, 100, 20);
|
|
||||||
this.contentPane.add(addressLabel);
|
|
||||||
|
|
||||||
this.serverAddress = new JTextField();
|
|
||||||
this.serverAddress.setBounds(10, 70, 465, 20);
|
|
||||||
this.contentPane.add(this.serverAddress);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
JLabel serverVersionLabel = new JLabel("Server Version:");
|
|
||||||
serverVersionLabel.setBounds(10, 100, 100, 20);
|
|
||||||
this.contentPane.add(serverVersionLabel);
|
|
||||||
|
|
||||||
this.serverVersion = new JComboBox<>(VersionEnum.RENDER_VERSIONS.toArray(new VersionEnum[0]));
|
|
||||||
this.serverVersion.setBounds(10, 120, 465, 20);
|
|
||||||
this.serverVersion.setRenderer(new DefaultListCellRenderer() {
|
|
||||||
@Override
|
|
||||||
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
|
|
||||||
if (value instanceof VersionEnum) {
|
|
||||||
VersionEnum version = (VersionEnum) value;
|
|
||||||
value = version.getName();
|
|
||||||
}
|
|
||||||
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.contentPane.add(this.serverVersion);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
JLabel bindPortLabel = new JLabel("Local Port:");
|
|
||||||
bindPortLabel.setBounds(10, 150, 100, 20);
|
|
||||||
this.contentPane.add(bindPortLabel);
|
|
||||||
|
|
||||||
this.bindPort = new JSpinner(new SpinnerNumberModel(25568, 1, 65535, 1));
|
|
||||||
this.bindPort.setBounds(10, 170, 465, 20);
|
|
||||||
this.bindPort.setEditor(new JSpinner.NumberEditor(this.bindPort, "#"));
|
|
||||||
((JSpinner.DefaultEditor) this.bindPort.getEditor()).getTextField().setHorizontalAlignment(SwingConstants.LEFT);
|
|
||||||
this.contentPane.add(this.bindPort);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
JLabel authMethodLabel = new JLabel("Server Online Mode Auth Method:");
|
|
||||||
authMethodLabel.setBounds(10, 200, 250, 20);
|
|
||||||
this.contentPane.add(authMethodLabel);
|
|
||||||
|
|
||||||
this.authMethod = new JComboBox<>(new String[]{"OpenAuthMod"});
|
|
||||||
this.authMethod.setBounds(10, 220, 465, 20);
|
|
||||||
this.contentPane.add(this.authMethod);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
this.betaCraftAuth = new JCheckBox("BetaCraft Auth (Classic)");
|
|
||||||
this.betaCraftAuth.setBounds(10, 250, 150, 20);
|
|
||||||
this.contentPane.add(this.betaCraftAuth);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
this.proxyOnlineMode = new JCheckBox("Proxy Online Mode");
|
|
||||||
this.proxyOnlineMode.setBounds(350, 250, 465, 20);
|
|
||||||
this.contentPane.add(this.proxyOnlineMode);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
this.stateLabel = new JLabel();
|
|
||||||
this.stateLabel.setBounds(14, 280, 465, 20);
|
|
||||||
this.stateLabel.setVisible(false);
|
|
||||||
this.contentPane.add(this.stateLabel);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
this.stateButton = new JButton("Loading ViaProxy...");
|
|
||||||
this.stateButton.setBounds(10, 300, 465, 20);
|
|
||||||
this.stateButton.addActionListener(e -> {
|
|
||||||
if (this.stateButton.getText().equalsIgnoreCase("Start")) this.start();
|
|
||||||
else if (this.stateButton.getText().equalsIgnoreCase("Stop")) this.stop();
|
|
||||||
});
|
|
||||||
this.stateButton.setEnabled(false);
|
|
||||||
this.contentPane.add(this.stateButton);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setComponentsEnabled(final boolean state) {
|
|
||||||
this.serverAddress.setEnabled(state);
|
|
||||||
this.serverVersion.setEnabled(state);
|
|
||||||
this.bindPort.setEnabled(state);
|
|
||||||
this.authMethod.setEnabled(state);
|
|
||||||
this.betaCraftAuth.setEnabled(state);
|
|
||||||
this.proxyOnlineMode.setEnabled(state);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateStateLabel() {
|
|
||||||
this.stateLabel.setText("ViaProxy is running! Connect with Minecraft 1.7+ to 127.0.0.1:" + this.bindPort.getValue());
|
|
||||||
this.stateLabel.setVisible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void start() {
|
|
||||||
this.setComponentsEnabled(false);
|
|
||||||
this.stateButton.setEnabled(false);
|
|
||||||
this.stateButton.setText("Starting...");
|
|
||||||
|
|
||||||
new Thread(() -> {
|
|
||||||
final String serverAddress = this.serverAddress.getText();
|
|
||||||
final VersionEnum serverVersion = (VersionEnum) this.serverVersion.getSelectedItem();
|
|
||||||
final int bindPort = (int) this.bindPort.getValue();
|
|
||||||
final String authMethod = (String) this.authMethod.getSelectedItem();
|
|
||||||
final boolean betaCraftAuth = this.betaCraftAuth.isSelected();
|
|
||||||
final boolean proxyOnlineMode = this.proxyOnlineMode.isSelected();
|
|
||||||
|
|
||||||
try {
|
|
||||||
final HostAndPort hostAndPort = HostAndPort.fromString(serverAddress);
|
|
||||||
|
|
||||||
Options.BIND_ADDRESS = "127.0.0.1";
|
|
||||||
Options.BIND_PORT = bindPort;
|
|
||||||
Options.ONLINE_MODE = proxyOnlineMode;
|
|
||||||
Options.CONNECT_ADDRESS = hostAndPort.getHost();
|
|
||||||
Options.CONNECT_PORT = hostAndPort.getPortOrDefault(25565);
|
|
||||||
Options.PROTOCOL_VERSION = serverVersion;
|
|
||||||
|
|
||||||
Options.OPENAUTHMOD_AUTH = true;
|
|
||||||
Options.BETACRAFT_AUTH = betaCraftAuth;
|
|
||||||
|
|
||||||
ViaProxy.startProxy();
|
|
||||||
|
|
||||||
SwingUtilities.invokeLater(() -> {
|
|
||||||
this.updateStateLabel();
|
|
||||||
this.stateButton.setEnabled(true);
|
|
||||||
this.stateButton.setText("Stop");
|
|
||||||
});
|
|
||||||
} catch (Throwable e) {
|
|
||||||
SwingUtilities.invokeLater(() -> {
|
|
||||||
this.showError("Invalid server address!");
|
|
||||||
this.setComponentsEnabled(true);
|
|
||||||
this.stateButton.setEnabled(true);
|
|
||||||
this.stateButton.setText("Start");
|
|
||||||
this.stateLabel.setVisible(false);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}).start();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void stop() {
|
|
||||||
ViaProxy.stopProxy();
|
|
||||||
|
|
||||||
this.stateLabel.setVisible(false);
|
|
||||||
this.stateButton.setText("Start");
|
|
||||||
this.setComponentsEnabled(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void setReady() {
|
public void setReady() {
|
||||||
SwingUtilities.invokeLater(() -> {
|
for (AUITab tab : this.tabs) tab.setReady();
|
||||||
this.stateButton.setText("Start");
|
|
||||||
this.stateButton.setEnabled(true);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void openURL(final String url) {
|
||||||
|
try {
|
||||||
|
Desktop.getDesktop().browse(new URI(url));
|
||||||
|
} catch (Throwable t) {
|
||||||
|
this.showInfo("Couldn't open the link :(\nHere it is for you: " + url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showException(final Throwable t) {
|
||||||
|
Logger.LOGGER.error("Caught exception in thread " + Thread.currentThread().getName(), t);
|
||||||
|
StringBuilder builder = new StringBuilder("An error occurred:\n");
|
||||||
|
builder.append("[").append(t.getClass().getSimpleName()).append("] ").append(t.getMessage()).append("\n");
|
||||||
|
for (StackTraceElement element : t.getStackTrace()) builder.append(element.toString()).append("\n");
|
||||||
|
this.showError(builder.toString());
|
||||||
|
}
|
||||||
|
|
||||||
public void showInfo(final String message) {
|
public void showInfo(final String message) {
|
||||||
this.showNotification(message, JOptionPane.INFORMATION_MESSAGE);
|
this.showNotification(message, JOptionPane.INFORMATION_MESSAGE);
|
||||||
|
|
204
src/main/java/net/raphimc/viaproxy/ui/impl/GeneralTab.java
Normal file
204
src/main/java/net/raphimc/viaproxy/ui/impl/GeneralTab.java
Normal file
|
@ -0,0 +1,204 @@
|
||||||
|
package net.raphimc.viaproxy.ui.impl;
|
||||||
|
|
||||||
|
import com.google.common.net.HostAndPort;
|
||||||
|
import net.raphimc.vialegacy.util.VersionEnum;
|
||||||
|
import net.raphimc.viaproxy.ViaProxy;
|
||||||
|
import net.raphimc.viaproxy.cli.options.Options;
|
||||||
|
import net.raphimc.viaproxy.ui.AUITab;
|
||||||
|
import net.raphimc.viaproxy.ui.ViaProxyUI;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.MouseAdapter;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
|
||||||
|
public class GeneralTab extends AUITab {
|
||||||
|
|
||||||
|
private JTextField serverAddress;
|
||||||
|
private JComboBox<VersionEnum> serverVersion;
|
||||||
|
private JSpinner bindPort;
|
||||||
|
private JComboBox<String> authMethod;
|
||||||
|
private JCheckBox betaCraftAuth;
|
||||||
|
private JCheckBox proxyOnlineMode;
|
||||||
|
private JLabel stateLabel;
|
||||||
|
private JButton stateButton;
|
||||||
|
|
||||||
|
public GeneralTab(final ViaProxyUI frame) {
|
||||||
|
super(frame, "General");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void init(JPanel contentPane) {
|
||||||
|
{
|
||||||
|
JLabel titleLabel = new JLabel("ViaProxy");
|
||||||
|
titleLabel.setBounds(0, 0, 500, 50);
|
||||||
|
titleLabel.setHorizontalAlignment(SwingConstants.CENTER);
|
||||||
|
titleLabel.setFont(titleLabel.getFont().deriveFont(30F));
|
||||||
|
contentPane.add(titleLabel);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
JLabel copyrightLabel = new JLabel("© RK_01 & Lenni0451");
|
||||||
|
copyrightLabel.setBounds(360, 10, 500, 20);
|
||||||
|
contentPane.add(copyrightLabel);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
JLabel discordLabel = new JLabel("<html><a href=\"\">Discord</a></html>");
|
||||||
|
discordLabel.setBounds(10, 10, 45, 20);
|
||||||
|
discordLabel.addMouseListener(new MouseAdapter() {
|
||||||
|
@Override
|
||||||
|
public void mouseReleased(MouseEvent e) {
|
||||||
|
frame.openURL("https://viaproxy.raphimc.net");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
contentPane.add(discordLabel);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
JLabel addressLabel = new JLabel("Server Address:");
|
||||||
|
addressLabel.setBounds(10, 50, 100, 20);
|
||||||
|
contentPane.add(addressLabel);
|
||||||
|
|
||||||
|
this.serverAddress = new JTextField();
|
||||||
|
this.serverAddress.setBounds(10, 70, 465, 20);
|
||||||
|
contentPane.add(this.serverAddress);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
JLabel serverVersionLabel = new JLabel("Server Version:");
|
||||||
|
serverVersionLabel.setBounds(10, 100, 100, 20);
|
||||||
|
contentPane.add(serverVersionLabel);
|
||||||
|
|
||||||
|
this.serverVersion = new JComboBox<>(VersionEnum.RENDER_VERSIONS.toArray(new VersionEnum[0]));
|
||||||
|
this.serverVersion.setBounds(10, 120, 465, 20);
|
||||||
|
this.serverVersion.setRenderer(new DefaultListCellRenderer() {
|
||||||
|
@Override
|
||||||
|
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
|
||||||
|
if (value instanceof VersionEnum) {
|
||||||
|
VersionEnum version = (VersionEnum) value;
|
||||||
|
value = version.getName();
|
||||||
|
}
|
||||||
|
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
contentPane.add(this.serverVersion);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
JLabel bindPortLabel = new JLabel("Local Port:");
|
||||||
|
bindPortLabel.setBounds(10, 150, 100, 20);
|
||||||
|
contentPane.add(bindPortLabel);
|
||||||
|
|
||||||
|
this.bindPort = new JSpinner(new SpinnerNumberModel(25568, 1, 65535, 1));
|
||||||
|
this.bindPort.setBounds(10, 170, 465, 20);
|
||||||
|
contentPane.add(this.bindPort);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
JLabel authMethodLabel = new JLabel("Minecraft Account: (used when server is in online mode)");
|
||||||
|
authMethodLabel.setBounds(10, 200, 400, 20);
|
||||||
|
contentPane.add(authMethodLabel);
|
||||||
|
|
||||||
|
this.authMethod = new JComboBox<>(new String[]{"Use OpenAuthMod"});
|
||||||
|
this.authMethod.setBounds(10, 220, 465, 20);
|
||||||
|
contentPane.add(this.authMethod);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
this.betaCraftAuth = new JCheckBox("BetaCraft Auth (Classic)");
|
||||||
|
this.betaCraftAuth.setBounds(10, 250, 150, 20);
|
||||||
|
contentPane.add(this.betaCraftAuth);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
this.proxyOnlineMode = new JCheckBox("Proxy Online Mode");
|
||||||
|
this.proxyOnlineMode.setBounds(350, 250, 465, 20);
|
||||||
|
contentPane.add(this.proxyOnlineMode);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
this.stateLabel = new JLabel();
|
||||||
|
this.stateLabel.setBounds(14, 280, 465, 20);
|
||||||
|
this.stateLabel.setVisible(false);
|
||||||
|
contentPane.add(this.stateLabel);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
this.stateButton = new JButton("Loading ViaProxy...");
|
||||||
|
this.stateButton.setBounds(10, 300, 465, 20);
|
||||||
|
this.stateButton.addActionListener(e -> {
|
||||||
|
if (this.stateButton.getText().equalsIgnoreCase("Start")) this.start();
|
||||||
|
else if (this.stateButton.getText().equalsIgnoreCase("Stop")) this.stop();
|
||||||
|
});
|
||||||
|
this.stateButton.setEnabled(false);
|
||||||
|
contentPane.add(this.stateButton);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setComponentsEnabled(final boolean state) {
|
||||||
|
this.serverAddress.setEnabled(state);
|
||||||
|
this.serverVersion.setEnabled(state);
|
||||||
|
this.bindPort.setEnabled(state);
|
||||||
|
this.authMethod.setEnabled(state);
|
||||||
|
this.betaCraftAuth.setEnabled(state);
|
||||||
|
this.proxyOnlineMode.setEnabled(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateStateLabel() {
|
||||||
|
this.stateLabel.setText("ViaProxy is running! Connect with Minecraft 1.7+ to 127.0.0.1:" + this.bindPort.getValue());
|
||||||
|
this.stateLabel.setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void start() {
|
||||||
|
this.setComponentsEnabled(false);
|
||||||
|
this.stateButton.setEnabled(false);
|
||||||
|
this.stateButton.setText("Starting...");
|
||||||
|
|
||||||
|
new Thread(() -> {
|
||||||
|
final String serverAddress = this.serverAddress.getText();
|
||||||
|
final VersionEnum serverVersion = (VersionEnum) this.serverVersion.getSelectedItem();
|
||||||
|
final int bindPort = (int) this.bindPort.getValue();
|
||||||
|
final String authMethod = (String) this.authMethod.getSelectedItem();
|
||||||
|
final boolean betaCraftAuth = this.betaCraftAuth.isSelected();
|
||||||
|
final boolean proxyOnlineMode = this.proxyOnlineMode.isSelected();
|
||||||
|
|
||||||
|
try {
|
||||||
|
final HostAndPort hostAndPort = HostAndPort.fromString(serverAddress);
|
||||||
|
|
||||||
|
Options.BIND_ADDRESS = "127.0.0.1";
|
||||||
|
Options.BIND_PORT = bindPort;
|
||||||
|
Options.ONLINE_MODE = proxyOnlineMode;
|
||||||
|
Options.CONNECT_ADDRESS = hostAndPort.getHost();
|
||||||
|
Options.CONNECT_PORT = hostAndPort.getPortOrDefault(25565);
|
||||||
|
Options.PROTOCOL_VERSION = serverVersion;
|
||||||
|
|
||||||
|
Options.OPENAUTHMOD_AUTH = true;
|
||||||
|
Options.BETACRAFT_AUTH = betaCraftAuth;
|
||||||
|
|
||||||
|
ViaProxy.startProxy();
|
||||||
|
|
||||||
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
this.updateStateLabel();
|
||||||
|
this.stateButton.setEnabled(true);
|
||||||
|
this.stateButton.setText("Stop");
|
||||||
|
});
|
||||||
|
} catch (Throwable e) {
|
||||||
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
this.frame.showError("Invalid server address!");
|
||||||
|
this.setComponentsEnabled(true);
|
||||||
|
this.stateButton.setEnabled(true);
|
||||||
|
this.stateButton.setText("Start");
|
||||||
|
this.stateLabel.setVisible(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stop() {
|
||||||
|
ViaProxy.stopProxy();
|
||||||
|
|
||||||
|
this.stateLabel.setVisible(false);
|
||||||
|
this.stateButton.setText("Start");
|
||||||
|
this.setComponentsEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setReady() {
|
||||||
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
this.stateButton.setText("Start");
|
||||||
|
this.stateButton.setEnabled(true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
125
src/main/java/net/raphimc/viaproxy/ui/impl/OnlineModeTab.java
Normal file
125
src/main/java/net/raphimc/viaproxy/ui/impl/OnlineModeTab.java
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
package net.raphimc.viaproxy.ui.impl;
|
||||||
|
|
||||||
|
import net.raphimc.mcauth.MinecraftAuth;
|
||||||
|
import net.raphimc.mcauth.step.java.StepMCProfile;
|
||||||
|
import net.raphimc.viaproxy.ui.AUITab;
|
||||||
|
import net.raphimc.viaproxy.ui.ViaProxyUI;
|
||||||
|
import net.raphimc.viaproxy.ui.popups.AddAccountPopup;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.awt.event.MouseAdapter;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
|
public class OnlineModeTab extends AUITab {
|
||||||
|
|
||||||
|
private JList<String> accountsList;
|
||||||
|
private JButton addAccountButton;
|
||||||
|
|
||||||
|
private AddAccountPopup addAccountPopup;
|
||||||
|
private Thread addThread;
|
||||||
|
|
||||||
|
public OnlineModeTab(final ViaProxyUI frame) {
|
||||||
|
super(frame, "Online Mode");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void init(JPanel contentPane) {
|
||||||
|
{
|
||||||
|
JLabel infoLabel = new JLabel("To join online mode servers you have to add minecraft accounts for ViaProxy to use.");
|
||||||
|
infoLabel.setBounds(10, 10, 500, 20);
|
||||||
|
contentPane.add(infoLabel);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
JLabel infoLabel = new JLabel("<html>If you change your account frequently, you might want to install <a href=\"\">OpenAuthMod</a> on your</html>");
|
||||||
|
infoLabel.setBounds(10, 40, 500, 20);
|
||||||
|
contentPane.add(infoLabel);
|
||||||
|
|
||||||
|
JLabel infoLabel2 = new JLabel("client. This allows ViaProxy to use the account you are logged in with on the client.");
|
||||||
|
infoLabel2.setBounds(10, 60, 500, 20);
|
||||||
|
contentPane.add(infoLabel2);
|
||||||
|
|
||||||
|
JLabel clickRect = new JLabel();
|
||||||
|
clickRect.setBounds(353, 40, 80, 20);
|
||||||
|
clickRect.addMouseListener(new MouseAdapter() {
|
||||||
|
@Override
|
||||||
|
public void mouseReleased(MouseEvent e) {
|
||||||
|
frame.openURL("https://github.com/RaphiMC/OpenAuthMod/");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
contentPane.add(clickRect);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
JScrollPane scrollPane = new JScrollPane();
|
||||||
|
scrollPane.setBounds(10, 85, 465, 205);
|
||||||
|
contentPane.add(scrollPane);
|
||||||
|
|
||||||
|
DefaultListModel<String> model = new DefaultListModel<>();
|
||||||
|
this.accountsList = new JList<>(model);
|
||||||
|
scrollPane.setViewportView(this.accountsList);
|
||||||
|
|
||||||
|
JPopupMenu contextMenu = new JPopupMenu();
|
||||||
|
JMenuItem removeItem = new JMenuItem("Remove");
|
||||||
|
removeItem.addActionListener(e -> {
|
||||||
|
int index = this.accountsList.getSelectedIndex();
|
||||||
|
if (index != -1) {
|
||||||
|
model.remove(index);
|
||||||
|
//TODO: Remove from save
|
||||||
|
}
|
||||||
|
if (index < model.getSize()) this.accountsList.setSelectedIndex(index);
|
||||||
|
else if (index > 0) this.accountsList.setSelectedIndex(index - 1);
|
||||||
|
});
|
||||||
|
contextMenu.add(removeItem);
|
||||||
|
this.accountsList.setComponentPopupMenu(contextMenu);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
this.addAccountButton = new JButton("Add Account");
|
||||||
|
this.addAccountButton.setBounds(300, 300, 175, 20);
|
||||||
|
this.addAccountButton.addActionListener(event -> {
|
||||||
|
this.addAccountButton.setEnabled(false);
|
||||||
|
this.addThread = new Thread(() -> {
|
||||||
|
try {
|
||||||
|
StepMCProfile.MCProfile profile = MinecraftAuth.requestJavaLogin(msaDeviceCode -> {
|
||||||
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
new AddAccountPopup(this.frame, msaDeviceCode, popup -> this.addAccountPopup = popup, () -> {
|
||||||
|
this.closePopup();
|
||||||
|
this.addThread.interrupt();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
this.closePopup();
|
||||||
|
DefaultListModel<String> model = (DefaultListModel<String>) this.accountsList.getModel();
|
||||||
|
model.addElement(profile.name());
|
||||||
|
this.frame.showInfo("The account " + profile.name() + " was added successfully.");
|
||||||
|
//TODO: Add to save
|
||||||
|
});
|
||||||
|
} catch (InterruptedException ignored) {
|
||||||
|
} catch (TimeoutException e) {
|
||||||
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
this.closePopup();
|
||||||
|
this.frame.showError("The login request timed out.\nPlease login within 60 seconds.");
|
||||||
|
});
|
||||||
|
} catch (Throwable t) {
|
||||||
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
this.closePopup();
|
||||||
|
this.frame.showException(t);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, "Add Account Thread");
|
||||||
|
this.addThread.setDaemon(true);
|
||||||
|
this.addThread.start();
|
||||||
|
});
|
||||||
|
contentPane.add(this.addAccountButton);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void closePopup() {
|
||||||
|
this.addAccountPopup.markExternalClose();
|
||||||
|
this.addAccountPopup.setVisible(false);
|
||||||
|
this.addAccountPopup.dispose();
|
||||||
|
this.addAccountPopup = null;
|
||||||
|
this.addAccountButton.setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,92 @@
|
||||||
|
package net.raphimc.viaproxy.ui.popups;
|
||||||
|
|
||||||
|
import net.raphimc.mcauth.step.msa.StepMsaDeviceCode;
|
||||||
|
import net.raphimc.viaproxy.ui.ViaProxyUI;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.datatransfer.StringSelection;
|
||||||
|
import java.awt.event.MouseAdapter;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.awt.event.WindowAdapter;
|
||||||
|
import java.awt.event.WindowEvent;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public class AddAccountPopup extends JDialog {
|
||||||
|
|
||||||
|
private final ViaProxyUI parent;
|
||||||
|
private final StepMsaDeviceCode.MsaDeviceCode deviceCode;
|
||||||
|
private boolean externalClose;
|
||||||
|
|
||||||
|
public AddAccountPopup(final ViaProxyUI parent, final StepMsaDeviceCode.MsaDeviceCode deviceCode, final Consumer<AddAccountPopup> popupConsumer, final Runnable closeListener) {
|
||||||
|
super(parent, true);
|
||||||
|
this.parent = parent;
|
||||||
|
this.deviceCode = deviceCode;
|
||||||
|
popupConsumer.accept(this);
|
||||||
|
|
||||||
|
this.initWindow(closeListener);
|
||||||
|
this.initComponents();
|
||||||
|
this.setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initWindow(final Runnable closeListener) {
|
||||||
|
this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
|
||||||
|
this.addWindowListener(new WindowAdapter() {
|
||||||
|
@Override
|
||||||
|
public void windowClosing(WindowEvent e) {
|
||||||
|
if (!externalClose) closeListener.run();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.setTitle("Add Account");
|
||||||
|
this.setSize(400, 200);
|
||||||
|
this.setResizable(false);
|
||||||
|
this.setLocationRelativeTo(this.parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initComponents() {
|
||||||
|
JPanel contentPane = new JPanel();
|
||||||
|
contentPane.setLayout(null);
|
||||||
|
this.setContentPane(contentPane);
|
||||||
|
{
|
||||||
|
JLabel browserLabel = new JLabel("Please open the following URL in your browser:");
|
||||||
|
browserLabel.setBounds(10, 10, 380, 20);
|
||||||
|
contentPane.add(browserLabel);
|
||||||
|
|
||||||
|
JLabel urlLabel = new JLabel("<html><a href=\"\">" + this.deviceCode.verificationUri() + "</a></html>");
|
||||||
|
urlLabel.setBounds(10, 30, 380, 20);
|
||||||
|
urlLabel.addMouseListener(new MouseAdapter() {
|
||||||
|
@Override
|
||||||
|
public void mouseReleased(MouseEvent e) {
|
||||||
|
parent.openURL(deviceCode.verificationUri());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
contentPane.add(urlLabel);
|
||||||
|
|
||||||
|
JLabel enterCodeLabel = new JLabel("Enter the following code:");
|
||||||
|
enterCodeLabel.setBounds(10, 50, 380, 20);
|
||||||
|
contentPane.add(enterCodeLabel);
|
||||||
|
|
||||||
|
JLabel codeLabel = new JLabel(this.deviceCode.userCode());
|
||||||
|
codeLabel.setBounds(10, 70, 380, 20);
|
||||||
|
contentPane.add(codeLabel);
|
||||||
|
|
||||||
|
JLabel closeInfo = new JLabel("The popup will close automatically after you have been logged in.");
|
||||||
|
closeInfo.setBounds(10, 100, 380, 20);
|
||||||
|
contentPane.add(closeInfo);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
JButton copyCodeButton = new JButton("Copy Code");
|
||||||
|
copyCodeButton.setBounds(this.getWidth() / 2 - 130 / 2, 130, 100, 20);
|
||||||
|
copyCodeButton.addActionListener(e -> {
|
||||||
|
StringSelection selection = new StringSelection(this.deviceCode.userCode());
|
||||||
|
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, selection);
|
||||||
|
});
|
||||||
|
contentPane.add(copyCodeButton);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void markExternalClose() {
|
||||||
|
this.externalClose = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue