package kubach.gui;
import com.sun.jna.NativeLibrary;
import java.awt.Component;
import java.awt.Insets;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import kubach.ConfigManager;
import kubach.Constants;
import kubach.packet.PacketFilesList;
import kubach.packet.PacketLoginResponse;
import kubach.util.LaunchCommandBuilder;
import kubach.util.Md5Checksum;
import kubach.workers.AuthWorker;
import kubach.workers.ChangePasswordWorker;
import kubach.workers.DownloadFileSyncWorker;
import kubach.workers.LoadCaptchaWorker;
import kubach.workers.ProcessMonitorWorker;
import kubach.workers.ProcessMonitorWorker.ProcessState;
import kubach.workers.RemoveSkinWorker;
import kubach.workers.RequestFilesListWorker;
import kubach.workers.UploadSkinWorker;
import kubach.zip.ExtractingDialog;
import net.minecraft.skintest.ModelPreview;
/**
* Main frame
*
* @author Cr0s
*/
public class MainFrame extends javax.swing.JFrame {
private String loggedUsername, session;
// Sync
private int numFilesToSync, numFilesSynced;
private PacketFilesList p;
private SyncState syncState = SyncState.WAITING;
private boolean expectExit;
private Process process;
public void cancelRegistration() {
txtUsername.setEnabled(true);
txtPassword.setEnabled(true);
btnLogin.setEnabled(true);
btnRegister.setEnabled(true);
btnRegister.setText("Register");
this.currentState = LauncherState.WAIT_LOGIN;
}
private void startFileSync() {
this.syncState = SyncState.STARTED;
this.numFilesSynced = 0;
RequestFilesListWorker rflw = new RequestFilesListWorker(this, ConfigManager.getInstance().getClientPrefix());
rflw.execute();
}
public void parseFilesList(PacketFilesList p) {
this.numFilesToSync = 0;
this.pbSync.setValue(0);
DefaultTableModel model = (DefaultTableModel) tblSync.getModel();
int rows = model.getRowCount();
for (int i = rows - 1; i >= 0; i--) {
model.removeRow(i);
}
boolean needToBeSync = false;
for (String s : p.files) {
String[] args = s.split(":");
if (isFileNeedToSync(args[0], args[1])) {
needToBeSync = true;
this.numFilesToSync++;
this.pbSync.setMaximum(this.numFilesToSync);
// Make nonexistent dirs first
String pathToFile = ConfigManager.getInstance().pathToJar + args[0];
File f = new File(pathToFile);
File pf = f.getParentFile();
if (pf != null && !pf.exists()) {
pf.mkdirs();
}
// Create worker to download
((DefaultTableModel) tblSync.getModel()).addRow(new Object[]{args[0], "-", new JProgressBar()});
DownloadFileSyncWorker wsi = new DownloadFileSyncWorker(this, f.getPath(), args[0], tblSync.getModel().getRowCount() - 1);
wsi.execute();
}
}
if (!needToBeSync) {
this.syncState = SyncState.COMPLETE;
}
}
private boolean isFileNeedToSync(String path, String md5) {
File f = new File(ConfigManager.getInstance().pathToJar + path);
try {
if (!f.exists() || !md5.equals(Md5Checksum.getMD5Checksum(f.getPath()))) {
return true;
}
} catch (Exception ex) {
Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
return true;
}
return false;
}
public void setSyncTableRow(int tableRowIndex, String status, int progressValue, int totalProgressValue, File file) {
tblSync.getModel().setValueAt(status, tableRowIndex, 1);
Component c = (Component) tblSync.getValueAt(tableRowIndex, 2);
if (c instanceof JProgressBar) {
((JProgressBar) c).setMaximum(totalProgressValue);
((JProgressBar) c).setValue(progressValue);
}
// TODO: determine its thread-safe or not
if (status.equals("Finished")) {
this.numFilesSynced++;
// Just downloaded package, extract it
if (file.getPath().endsWith(".package")) {
ExtractingDialog ed = new ExtractingDialog(this, false, file);
ed.setVisible(true);
}
if (file.getName().equals("changelog.txt")) {
refreshLogoAndChangelog();
}
}
tblSync.repaint();
pbSync.setValue(this.numFilesSynced);
pbSync.setString("Done: " + this.numFilesSynced + "/" + this.numFilesToSync);
if (this.numFilesToSync != 0) {
float percentage = this.numFilesSynced / (float) this.numFilesToSync * 100;
tabs.setTitleAt(1, "File sync (" + String.format("%.2f", percentage) + "%)");
}
if (this.numFilesSynced == this.numFilesToSync) {
this.syncState = SyncState.COMPLETE;
refreshLogoAndChangelog();
} else {
this.syncState = SyncState.SYNCING;
}
}
private void refreshLogoAndChangelog() {
panBg.removeAll();
LogoPanel lp = new LogoPanel(panBg);
panBg.add(lp);
}
private String getSkinUrl(String username) {
return ConfigManager.getInstance().getProperties().getProperty("skinurl").replace("%USERNAME%", username);
}
public void updateSkinUploadState(boolean success) {
removeSkinPanel();
setSkinPanel();
btnRemoveSkin.setEnabled(true);
btnUploadSkin.setEnabled(true);
btnUploadSkin.setText("Setup new");
if (!success) {
JOptionPane.showMessageDialog(this, "An error occured while uploading skin", "Skin upload error", JOptionPane.ERROR_MESSAGE);
}
}
private void setSkinPanel() {
ModelPreview mp = new ModelPreview(1, getSkinUrl(this.loggedUsername));
panSkin.add(mp);
Insets i = panSkin.getInsets();
mp.setBounds(i.left, i.top, panSkin.getSize().width - (i.right + i.left), panSkin.getSize().height - (i.bottom + i.top));
mp.start();
}
private void removeSkinPanel() {
for (int i = 0; i < panSkin.getComponentCount(); i++) {
Component c = panSkin.getComponent(i);
if (c instanceof ModelPreview) {
((ModelPreview) panSkin.getComponent(i)).stop();
}
}
panSkin.removeAll();
}
public void updateSkinRemoveState(boolean success) {
removeSkinPanel();
setSkinPanel();
btnRemoveSkin.setEnabled(true);
btnUploadSkin.setEnabled(true);
btnRemoveSkin.setText("Remove");
if (!success) {
JOptionPane.showMessageDialog(this, "An error occured while removing skin", "Skin remove error", JOptionPane.ERROR_MESSAGE);
}
}
public void parsePasswordChangeResult(boolean success) {
String newPass = new String(txtNewPassword.getPassword());
txtNewPassword.setText("");
txtNewPassword.setEnabled(true);
btnChangePassword.setEnabled(true);
btnChangePassword.setText("Change");
if (success) {
txtPassword.setText(newPass);
ConfigManager.getInstance().getProperties().setProperty("password", newPass);
} else {
JOptionPane.showMessageDialog(this, "An error occured while changing password!", "Password change error", JOptionPane.ERROR_MESSAGE);
}
}
public void parseProcessState(ProcessState s) {
int exitCode = s.exitCode;
if (exitCode != 0 && !expectExit) {
JOptionPane.showMessageDialog(this, "Launched game process unexpectedly exited with code: " + exitCode, "Process died", JOptionPane.ERROR_MESSAGE);
}
btnLaunch.setText("Launch");
this.process = null;
this.expectExit = false;
}
public enum LauncherState {
WAIT_LOGIN,
LOGGED_IN,
REGISTERING,
MD5_CHECK,
READY
};
public enum SyncState {
WAITING,
STARTED,
SYNCING,
COMPLETE
};
public LauncherState currentState = LauncherState.WAIT_LOGIN;
/**
* Creates new form MainFrame
*/
public MainFrame() {
initComponents();
/*try {
NativeLibrary.addSearchPath("Cr0s", ConfigManager.getInstance().pathToJar);
} catch (Exception e) {
e.printStackTrace();
}*/
LogoPanel lp = new LogoPanel(panBg);
panBg.add(lp);
startFileSync();
fcSkin.addChoosableFileFilter(new FileNameExtensionFilter("PNG files", "png"));
this.redirectSystemStreams();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
fcSkin = new javax.swing.JFileChooser();
grbLogin = new javax.swing.JPanel();
lblUsername = new javax.swing.JLabel();
txtUsername = new javax.swing.JTextField();
lblPassword = new javax.swing.JLabel();
btnLogin = new javax.swing.JButton();
btnRegister = new javax.swing.JButton();
txtPassword = new javax.swing.JPasswordField();
tabs = new javax.swing.JTabbedPane();
tabMain = new javax.swing.JPanel();
panBg = new javax.swing.JPanel();
tabSync = new javax.swing.JPanel();
panSync = new javax.swing.JPanel();
pbSync = new javax.swing.JProgressBar();
btnRestartSync = new javax.swing.JButton();
spTblSync = new javax.swing.JScrollPane();
tblSync = new javax.swing.JTable();
tabLog = new javax.swing.JPanel();
logTabs = new javax.swing.JTabbedPane();
tabOutLog = new javax.swing.JPanel();
spLog = new javax.swing.JScrollPane();
txtLog = new javax.swing.JTextArea();
tabChatLog = new javax.swing.JPanel();
scChatDates = new javax.swing.JScrollPane();
lbChatDates = new javax.swing.JList();
scChatLog = new javax.swing.JScrollPane();
txtChatLog = new javax.swing.JTextArea();
btnRefresh = new javax.swing.JButton();
jPanel1 = new javax.swing.JPanel();
grbSkin = new javax.swing.JPanel();
panSkin = new javax.swing.JPanel();
btnRemoveSkin = new javax.swing.JButton();
btnUploadSkin = new javax.swing.JButton();
jPanel2 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
btnChangePassword = new javax.swing.JButton();
txtNewPassword = new javax.swing.JPasswordField();
jPanel3 = new javax.swing.JPanel();
lblMemory = new javax.swing.JLabel();
cbMemory = new javax.swing.JComboBox();
btnLaunch = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jLabel4 = new javax.swing.JLabel();
txtWidth = new javax.swing.JTextField();
jLabel5 = new javax.swing.JLabel();
txtHeight = new javax.swing.JTextField();
jPanel4 = new javax.swing.JPanel();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
fcSkin.setAcceptAllFileFilterUsed(false);
fcSkin.setDialogTitle("Select skin png");
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setResizable(false);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent evt) {
formWindowOpened(evt);
}
public void windowClosed(java.awt.event.WindowEvent evt) {
formWindowClosed(evt);
}
});
grbLogin.setBorder(javax.swing.BorderFactory.createTitledBorder("Login"));
lblUsername.setText("Username:");
txtUsername.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
txtUsernameKeyTyped(evt);
}
});
lblPassword.setText("Password:");
btnLogin.setText("Login");
btnLogin.setEnabled(false);
btnLogin.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnLoginActionPerformed(evt);
}
});
btnRegister.setText("Register");
btnRegister.setEnabled(false);
btnRegister.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnRegisterActionPerformed(evt);
}
});
txtPassword.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
txtPasswordKeyTyped(evt);
}
});
javax.swing.GroupLayout grbLoginLayout = new javax.swing.GroupLayout(grbLogin);
grbLogin.setLayout(grbLoginLayout);
grbLoginLayout.setHorizontalGroup(
grbLoginLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(grbLoginLayout.createSequentialGroup()
.addContainerGap()
.addGroup(grbLoginLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(txtPassword, javax.swing.GroupLayout.DEFAULT_SIZE, 249, Short.MAX_VALUE)
.addComponent(txtUsername, javax.swing.GroupLayout.DEFAULT_SIZE, 249, Short.MAX_VALUE)
.addGroup(grbLoginLayout.createSequentialGroup()
.addComponent(btnLogin, javax.swing.GroupLayout.PREFERRED_SIZE, 103, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 43, Short.MAX_VALUE)
.addComponent(btnRegister, javax.swing.GroupLayout.PREFERRED_SIZE, 103, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(grbLoginLayout.createSequentialGroup()
.addGroup(grbLoginLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(lblUsername)
.addComponent(lblPassword))
.addGap(0, 174, Short.MAX_VALUE)))
.addContainerGap())
);
grbLoginLayout.setVerticalGroup(
grbLoginLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(grbLoginLayout.createSequentialGroup()
.addComponent(lblUsername)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblPassword)
.addGap(1, 1, 1)
.addComponent(txtPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(grbLoginLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btnLogin)
.addComponent(btnRegister)))
);
javax.swing.GroupLayout panBgLayout = new javax.swing.GroupLayout(panBg);
panBg.setLayout(panBgLayout);
panBgLayout.setHorizontalGroup(
panBgLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 508, Short.MAX_VALUE)
);
panBgLayout.setVerticalGroup(
panBgLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 486, Short.MAX_VALUE)
);
javax.swing.GroupLayout tabMainLayout = new javax.swing.GroupLayout(tabMain);
tabMain.setLayout(tabMainLayout);
tabMainLayout.setHorizontalGroup(
tabMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(tabMainLayout.createSequentialGroup()
.addComponent(panBg, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, Short.MAX_VALUE))
);
tabMainLayout.setVerticalGroup(
tabMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(panBg, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
tabs.addTab("Main", tabMain);
panSync.setBorder(javax.swing.BorderFactory.createEtchedBorder());
pbSync.setStringPainted(true);
btnRestartSync.setText("Restart");
btnRestartSync.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnRestartSyncActionPerformed(evt);
}
});
javax.swing.GroupLayout panSyncLayout = new javax.swing.GroupLayout(panSync);
panSync.setLayout(panSyncLayout);
panSyncLayout.setHorizontalGroup(
panSyncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panSyncLayout.createSequentialGroup()
.addContainerGap()
.addComponent(pbSync, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnRestartSync)
.addContainerGap())
);
panSyncLayout.setVerticalGroup(
panSyncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panSyncLayout.createSequentialGroup()
.addContainerGap()
.addGroup(panSyncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(pbSync, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnRestartSync))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
tblSync.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null},
{null, null, null},
{null, null, null},
{null, null, null}
},
new String [] {
"File", "Status", "Progress"
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.String.class, java.lang.Object.class
};
boolean[] canEdit = new boolean [] {
false, false, false
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
spTblSync.setViewportView(tblSync);
if (tblSync.getColumnModel().getColumnCount() > 0) {
tblSync.getColumnModel().getColumn(2).setResizable(false);
tblSync.getColumnModel().getColumn(2).setCellRenderer(new TableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (table.getValueAt(row, 2) == null) {
table.setValueAt(new JProgressBar(), row, 2);
}
if (table.getValueAt(row, 2) instanceof Component) {
return (Component)table.getValueAt(row, 2);
} else {
return null;
}
}
});
}
javax.swing.GroupLayout tabSyncLayout = new javax.swing.GroupLayout(tabSync);
tabSync.setLayout(tabSyncLayout);
tabSyncLayout.setHorizontalGroup(
tabSyncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(panSync, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(spTblSync, javax.swing.GroupLayout.DEFAULT_SIZE, 508, Short.MAX_VALUE)
);
tabSyncLayout.setVerticalGroup(
tabSyncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(tabSyncLayout.createSequentialGroup()
.addComponent(panSync, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(spTblSync, javax.swing.GroupLayout.DEFAULT_SIZE, 421, Short.MAX_VALUE))
);
tabs.addTab("File sync", tabSync);
spLog.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
spLog.setAutoscrolls(true);
txtLog.setEditable(false);
txtLog.setColumns(20);
txtLog.setFont(new java.awt.Font("Courier New", 0, 12)); // NOI18N
txtLog.setRows(5);
spLog.setViewportView(txtLog);
javax.swing.GroupLayout tabOutLogLayout = new javax.swing.GroupLayout(tabOutLog);
tabOutLog.setLayout(tabOutLogLayout);
tabOutLogLayout.setHorizontalGroup(
tabOutLogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(spLog, javax.swing.GroupLayout.DEFAULT_SIZE, 496, Short.MAX_VALUE)
);
tabOutLogLayout.setVerticalGroup(
tabOutLogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(spLog, javax.swing.GroupLayout.DEFAULT_SIZE, 443, Short.MAX_VALUE)
);
logTabs.addTab("Output", tabOutLog);
lbChatDates.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
lbChatDatesMouseClicked(evt);
}
});
scChatDates.setViewportView(lbChatDates);
scChatLog.setAutoscrolls(true);
txtChatLog.setEditable(false);
txtChatLog.setColumns(20);
txtChatLog.setFont(new java.awt.Font("Courier New", 0, 12)); // NOI18N
txtChatLog.setRows(5);
scChatLog.setViewportView(txtChatLog);
btnRefresh.setText("Refresh");
btnRefresh.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnRefreshActionPerformed(evt);
}
});
javax.swing.GroupLayout tabChatLogLayout = new javax.swing.GroupLayout(tabChatLog);
tabChatLog.setLayout(tabChatLogLayout);
tabChatLogLayout.setHorizontalGroup(
tabChatLogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(tabChatLogLayout.createSequentialGroup()
.addGroup(tabChatLogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(scChatDates, javax.swing.GroupLayout.DEFAULT_SIZE, 98, Short.MAX_VALUE)
.addComponent(btnRefresh, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(scChatLog, javax.swing.GroupLayout.DEFAULT_SIZE, 392, Short.MAX_VALUE))
);
tabChatLogLayout.setVerticalGroup(
tabChatLogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(tabChatLogLayout.createSequentialGroup()
.addGroup(tabChatLogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(scChatLog)
.addComponent(scChatDates, javax.swing.GroupLayout.DEFAULT_SIZE, 411, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnRefresh)
.addContainerGap())
);
logTabs.addTab("Chat log", tabChatLog);
javax.swing.GroupLayout tabLogLayout = new javax.swing.GroupLayout(tabLog);
tabLog.setLayout(tabLogLayout);
tabLogLayout.setHorizontalGroup(
tabLogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(logTabs)
);
tabLogLayout.setVerticalGroup(
tabLogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(logTabs, javax.swing.GroupLayout.PREFERRED_SIZE, 486, Short.MAX_VALUE)
);
tabs.addTab("Log", tabLog);
grbSkin.setBorder(javax.swing.BorderFactory.createTitledBorder("Skin setup"));
panSkin.setBorder(javax.swing.BorderFactory.createEtchedBorder());
javax.swing.GroupLayout panSkinLayout = new javax.swing.GroupLayout(panSkin);
panSkin.setLayout(panSkinLayout);
panSkinLayout.setHorizontalGroup(
panSkinLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 153, Short.MAX_VALUE)
);
panSkinLayout.setVerticalGroup(
panSkinLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 157, Short.MAX_VALUE)
);
btnRemoveSkin.setText("Remove");
btnRemoveSkin.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnRemoveSkinActionPerformed(evt);
}
});
btnUploadSkin.setText("Setup new");
btnUploadSkin.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnUploadSkinActionPerformed(evt);
}
});
javax.swing.GroupLayout grbSkinLayout = new javax.swing.GroupLayout(grbSkin);
grbSkin.setLayout(grbSkinLayout);
grbSkinLayout.setHorizontalGroup(
grbSkinLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(grbSkinLayout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(panSkin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(grbSkinLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(btnUploadSkin, javax.swing.GroupLayout.DEFAULT_SIZE, 104, Short.MAX_VALUE)
.addComponent(btnRemoveSkin, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
);
grbSkinLayout.setVerticalGroup(
grbSkinLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(panSkin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(grbSkinLayout.createSequentialGroup()
.addComponent(btnUploadSkin)
.addGap(4, 4, 4)
.addComponent(btnRemoveSkin))
);
jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Change password"));
jLabel1.setText("New password:");
btnChangePassword.setText("Change");
btnChangePassword.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnChangePasswordActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(btnChangePassword))
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(jLabel1)
.addGap(0, 0, Short.MAX_VALUE))
.addComponent(txtNewPassword))
.addContainerGap())
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtNewPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnChangePassword)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(grbSkin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(grbSkin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(289, Short.MAX_VALUE))
);
tabs.addTab("My Account", jPanel1);
jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Launch", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION));
lblMemory.setText("Memory:");
cbMemory.setEditable(true);
cbMemory.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "512", "1024", "2048", "3032", "4096" }));
btnLaunch.setText("Launch");
btnLaunch.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnLaunchActionPerformed(evt);
}
});
jButton2.setText("Get launch command");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
jLabel4.setText("Resolution:");
jLabel5.setText("X");
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(btnLaunch, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(jButton2))
.addGroup(jPanel3Layout.createSequentialGroup()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(lblMemory)
.addComponent(jLabel4))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addComponent(txtWidth, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel5)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtHeight, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(cbMemory, javax.swing.GroupLayout.PREFERRED_SIZE, 176, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblMemory)
.addComponent(cbMemory, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel4)
.addComponent(txtWidth, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel5)
.addComponent(txtHeight, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnLaunch)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton2)
.addContainerGap())
);
jPanel4.setBorder(javax.swing.BorderFactory.createEtchedBorder());
jLabel2.setText("(c) 2014-2015 Cr0s");
jLabel3.setForeground(new java.awt.Color(22, 88, 54));
jLabel3.setText("!!rkyi9XPa76");
javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
jPanel4.setLayout(jPanel4Layout);
jPanel4Layout.setHorizontalGroup(
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel4Layout.createSequentialGroup()
.addContainerGap(74, Short.MAX_VALUE)
.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 107, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jLabel3)
.addContainerGap())
);
jPanel4Layout.setVerticalGroup(
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(jLabel3)))
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(tabs)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(grbLogin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
.addComponent(grbLogin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(tabs))
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened
this.setTitle("Kubach Launcher (v" + Constants.VERSION + ")");
evt.getWindow().setLocationRelativeTo(evt.getOppositeWindow());
// Load previously saved credentials
txtUsername.setText(ConfigManager.getInstance().getProperties().getProperty("username"));
txtPassword.setText(ConfigManager.getInstance().getProperties().getProperty("password"));
updateCredentialsEnabled();
// Load previously saved memory amount
cbMemory.setSelectedItem(ConfigManager.getInstance().getProperties().getProperty("memory"));
// Load previously saved resolution settings
txtWidth.setText(ConfigManager.getInstance().getScreenWidth());
txtHeight.setText(ConfigManager.getInstance().getScreenHeight());
}//GEN-LAST:event_formWindowOpened
private void btnLoginActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnLoginActionPerformed
if (this.currentState == LauncherState.WAIT_LOGIN
&& !txtUsername.getText().trim().isEmpty()
&& !new String(txtPassword.getPassword()).trim().isEmpty()) {
btnLogin.setEnabled(false);
AuthWorker aw = new AuthWorker(this, txtUsername.getText(), new String(txtPassword.getPassword()));
aw.execute();
} else if (this.currentState == LauncherState.LOGGED_IN) {
btnLogin.setText("Login");
this.cancelRegistration(); // this enables back text fields and buttons
removeSkinPanel();
txtNewPassword.setText("");
}
}//GEN-LAST:event_btnLoginActionPerformed
private void btnRegisterActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRegisterActionPerformed
if (!txtUsername.getText().trim().isEmpty()
&& !new String(txtPassword.getPassword()).trim().isEmpty()) {
this.cp.username = txtUsername.getText();
this.cp.password = new String(txtPassword.getPassword());
txtUsername.setEnabled(false);
txtPassword.setEnabled(false);
btnLogin.setEnabled(false);
btnRegister.setEnabled(false);
btnRegister.setText("Loading...");
this.currentState = LauncherState.REGISTERING;
LoadCaptchaWorker lcw = new LoadCaptchaWorker(cp, txtUsername.getText(), new String(txtPassword.getPassword()));
lcw.execute();
}
}//GEN-LAST:event_btnRegisterActionPerformed
private void btnUploadSkinActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnUploadSkinActionPerformed
if (fcSkin.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
File skinFile = fcSkin.getSelectedFile();
if (skinFile.exists() && skinFile.canRead()) {
UploadSkinWorker usw = new UploadSkinWorker(this, skinFile, this.loggedUsername, this.session);
usw.execute();
btnRemoveSkin.setEnabled(false);
btnUploadSkin.setEnabled(false);
btnUploadSkin.setText("Uploading...");
}
}
}//GEN-LAST:event_btnUploadSkinActionPerformed
private void btnRemoveSkinActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveSkinActionPerformed
RemoveSkinWorker rsw = new RemoveSkinWorker(this, this.loggedUsername, this.session);
rsw.execute();
btnRemoveSkin.setEnabled(false);
btnUploadSkin.setEnabled(false);
btnRemoveSkin.setText("Removing...");
}//GEN-LAST:event_btnRemoveSkinActionPerformed
private void btnChangePasswordActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnChangePasswordActionPerformed
if (txtNewPassword.getPassword().length > 0) {
ChangePasswordWorker cpw = new ChangePasswordWorker(this, this.loggedUsername, this.session, new String(txtNewPassword.getPassword()));
cpw.execute();
txtPassword.setEnabled(false);
btnChangePassword.setEnabled(false);
btnChangePassword.setText("Changing...");
}
}//GEN-LAST:event_btnChangePasswordActionPerformed
private boolean isValidInteger(String i) {
try {
Integer.parseInt(i);
} catch (NumberFormatException nfe) {
return false;
}
return true;
}
private void btnLaunchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnLaunchActionPerformed
if (this.process != null) {
this.expectExit = true;
this.process.destroy();
return;
}
String osName = System.getProperty("os.name").toLowerCase();
boolean isNix = osName.contains("ux") || osName.contains("ix") || osName.contains("mac");
String memValue = cbMemory.getSelectedItem().toString();
String screenWidth = txtWidth.getText();
String screenHeight = txtHeight.getText();
// Validate memory value
if (!isValidInteger(memValue)) {
JOptionPane.showMessageDialog(this, "Invalid memory value specified!", "Launch error", JOptionPane.ERROR_MESSAGE);
return;
}
// Validate screenWidth, screenHeight
if (!isValidInteger(screenWidth) || !isValidInteger(screenWidth)) {
JOptionPane.showMessageDialog(this, "Invalid screen width/height specified!", "Launch error", JOptionPane.ERROR_MESSAGE);
return;
}
String launchCommand = LaunchCommandBuilder.getLaunchCommand(this.loggedUsername, this.session, memValue, screenWidth, screenHeight);
String gameDir = ConfigManager.getInstance().pathToJar;
//String jreDir = System.getProperty("java.home") + File.separatorChar + "bin" + File.separatorChar;
if (this.syncState != SyncState.COMPLETE) {
if (JOptionPane.showConfirmDialog(this, "Synchronization with server isn't done.\nAre you sure to launch unsynchronized client?", "Client not synchronized", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE)
== JOptionPane.CANCEL_OPTION) {
return;
}
}
if (this.currentState != LauncherState.LOGGED_IN) {
if (JOptionPane.showConfirmDialog(this, "You are not logged in. If you launch game without login you can't join the Kubach servers.\nAre you sure to launch client without login?", "You are not logged in", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE)
== JOptionPane.CANCEL_OPTION) {
return;
}
}
// = *nix/mac Workaround =
// Java for some reason won't setup current dir for subprocess correctly
// So there is workaround which creates temporary shell script and launch it
// This script changes current dir to gameDir and executes launch command
final String SCRIPT_NAME = "launch.sh";
if (isNix) {
try {
String scriptPath = gameDir + File.separator + SCRIPT_NAME;
// Create and write script file
Files.write(Paths.get(scriptPath),
("#!/bin/sh\n"
+ "cd \"" + gameDir + "\"\n"
+ launchCommand).getBytes("UTF-8"),
(new File(scriptPath).exists())
? StandardOpenOption.WRITE
: StandardOpenOption.CREATE_NEW);
// Command for launch
launchCommand = "sh " + SCRIPT_NAME;
} catch (IOException ex) {
ex.printStackTrace();
}
}
// Create process and launch
Process proc;
try {
proc = new ProcessBuilder(launchCommand.split(" "))
.directory(new File(gameDir))
//.redirectErrorStream(true)
.start();
} catch (IOException ex) {
JOptionPane.showMessageDialog(this, "Unable to start process: " + ex.toString(), "Launch error", JOptionPane.ERROR_MESSAGE);
return;
}
// Intercept process' output
StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream());
StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream());
errorGobbler.start();
outputGobbler.start();
// Save memory value
ConfigManager.getInstance().getProperties().setProperty("memory", memValue);
ConfigManager.getInstance().saveProperties();
// Save screen parameters
ConfigManager.getInstance().setResolution(screenWidth, screenHeight);
// Disabled for Linux, because if we kill launched process (shell script) we don't actually kill Minecraft process
if (!isNix) {
this.process = proc;
this.expectExit = false;
btnLaunch.setText("Kill");
ProcessMonitorWorker pmw = new ProcessMonitorWorker(this, this.process);
pmw.execute();
}
}//GEN-LAST:event_btnLaunchActionPerformed
private void redirectSystemStreams() {
OutputStream out = new OutputStream() {
@Override
public void write(int b) throws IOException {
appendToLogs(String.valueOf((char) b));
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
appendToLogs(new String(b, off, len));
}
@Override
public void write(byte[] b) throws IOException {
write(b, 0, b.length);
}
};
System.setOut(new PrintStream(out, true));
System.setErr(new PrintStream(out, true));
}
private void appendToLogs(final String text) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (text.contains("[CHAT]")) { // this is chat message, append it to chat log
appendChatLog(text.replace("[INFO] [Minecraft-Client] [CHAT]", ""));
}
txtLog.append(text);
}
});
}
private void appendChatLog(String text) {
try {
SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
String logName = dt.format(new Date());
// Path format: gameDir/chatlogs/yyyy-mm-dd.log
String logPath = ConfigManager.getInstance().chatlogsDir + File.separatorChar + logName + ".log";
// Append text with line ending
text += "\n";
// Append data to file. If file doesn't exists, create new
File logFile = new File(logPath);
if (!logFile.exists()) {
new File(new File(logPath).getParent()).mkdirs();
if (!logFile.createNewFile()){
return;
}
}
Files.write(Paths.get(logPath), text.getBytes("UTF-8"),StandardOpenOption.APPEND);
} catch (IOException ex) {
ex.printStackTrace();
}
}
private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed
ConfigManager.getInstance().saveProperties();
}//GEN-LAST:event_formWindowClosed
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
String memValue = cbMemory.getSelectedItem().toString();
String launchCommand = LaunchCommandBuilder.getLaunchCommand(this.loggedUsername, this.session, memValue, txtWidth.getText(), txtHeight.getText());
LaunchCommandDialog lcd = new LaunchCommandDialog(this, true, launchCommand);
lcd.setVisible(true);
}//GEN-LAST:event_jButton2ActionPerformed
private void btnRestartSyncActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRestartSyncActionPerformed
// Make sure we ended current synch process
// If not, ask user what to do with current synch process
if (this.syncState != SyncState.COMPLETE) {
if (JOptionPane.showConfirmDialog(this, "Synchronization with server isn't done.\nAre you sure to restart current synch process?", "Synchronization isn't complete yet", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE)
== JOptionPane.CANCEL_OPTION) {
return;
}
}
// Restart
startFileSync();
}//GEN-LAST:event_btnRestartSyncActionPerformed
private void btnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshActionPerformed
refreshChatLogs();
}//GEN-LAST:event_btnRefreshActionPerformed
private void lbChatDatesMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lbChatDatesMouseClicked
if (evt.getClickCount() == 2) { // doubleclick
if (lbChatDates.getSelectedIndex() == -1) { // there is no selection
return;
}
String selectedName = (String) lbChatDates.getSelectedValue();
String logPath = ConfigManager.getInstance().chatlogsDir + File.separatorChar + selectedName;
try {
txtChatLog.setText(new String(Files.readAllBytes(Paths.get(logPath)), "UTF-8"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
}//GEN-LAST:event_lbChatDatesMouseClicked
private void txtUsernameKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtUsernameKeyTyped
updateCredentialsEnabled();
}//GEN-LAST:event_txtUsernameKeyTyped
private void txtPasswordKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtPasswordKeyTyped
updateCredentialsEnabled();
}//GEN-LAST:event_txtPasswordKeyTyped
private void updateCredentialsEnabled() {
boolean enabled = !txtUsername.getText().trim().isEmpty() && txtPassword.getPassword().length > 0;
btnLogin.setEnabled(enabled);
btnRegister.setEnabled(enabled);
}
private void refreshChatLogs() {
File dir = new File(ConfigManager.getInstance().chatlogsDir);
if (!dir.exists()) {
dir.mkdir();
}
File[] logs = dir.listFiles();
if (logs.length == 0) {
return;
}
String[] names = new String[logs.length];
for (int i = 0; i < logs.length; i++) {
names[i] = logs[i].getName();
}
lbChatDates.setListData(names);
}
public void showLoginResult(PacketLoginResponse p) {
btnLogin.setEnabled(true);
if (p.isSuccess) {
System.out.println("Got session: " + p.session);
this.currentState = LauncherState.LOGGED_IN;
txtUsername.setEnabled(false);
txtPassword.setEnabled(false);
btnRegister.setEnabled(false);
btnLogin.setText("Log Out");
this.loggedUsername = txtUsername.getText();
this.session = p.session;
setSkinPanel();
ConfigManager.getInstance().getProperties().setProperty("username", txtUsername.getText());
ConfigManager.getInstance().getProperties().setProperty("password", new String(txtPassword.getPassword()));
ConfigManager.getInstance().saveProperties();
WhiteListChecker wlc = new WhiteListChecker(this, true, this.loggedUsername, this.session, p.role.equals("admin"));
//wlc.setVisible(true);
} else {
System.out.println("Login error: " + p.reason);
JOptionPane.showMessageDialog(this, p.reason, "Error", JOptionPane.ERROR_MESSAGE);
}
}
CaptchaPanel cp = new CaptchaPanel(this);
class StreamGobbler extends Thread {
InputStream is;
// reads everything from is until empty.
StreamGobbler(InputStream is) {
this.is = is;
}
@Override
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnChangePassword;
private javax.swing.JButton btnLaunch;
private javax.swing.JButton btnLogin;
private javax.swing.JButton btnRefresh;
private javax.swing.JButton btnRegister;
private javax.swing.JButton btnRemoveSkin;
private javax.swing.JButton btnRestartSync;
private javax.swing.JButton btnUploadSkin;
private javax.swing.JComboBox cbMemory;
private javax.swing.JFileChooser fcSkin;
private javax.swing.JPanel grbLogin;
private javax.swing.JPanel grbSkin;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JList lbChatDates;
private javax.swing.JLabel lblMemory;
private javax.swing.JLabel lblPassword;
private javax.swing.JLabel lblUsername;
private javax.swing.JTabbedPane logTabs;
private javax.swing.JPanel panBg;
private javax.swing.JPanel panSkin;
private javax.swing.JPanel panSync;
private javax.swing.JProgressBar pbSync;
private javax.swing.JScrollPane scChatDates;
private javax.swing.JScrollPane scChatLog;
private javax.swing.JScrollPane spLog;
private javax.swing.JScrollPane spTblSync;
private javax.swing.JPanel tabChatLog;
private javax.swing.JPanel tabLog;
private javax.swing.JPanel tabMain;
private javax.swing.JPanel tabOutLog;
private javax.swing.JPanel tabSync;
private javax.swing.JTabbedPane tabs;
private javax.swing.JTable tblSync;
private javax.swing.JTextArea txtChatLog;
private javax.swing.JTextField txtHeight;
private javax.swing.JTextArea txtLog;
private javax.swing.JPasswordField txtNewPassword;
private javax.swing.JPasswordField txtPassword;
private javax.swing.JTextField txtUsername;
private javax.swing.JTextField txtWidth;
// End of variables declaration//GEN-END:variables
}