You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
286 lines
10 KiB
286 lines
10 KiB
package sig.modules.RabiRace;
|
|
|
|
import java.awt.Dimension;
|
|
import java.awt.Graphics;
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.event.ActionListener;
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.net.URL;
|
|
import java.security.MessageDigest;
|
|
import java.security.NoSuchAlgorithmException;
|
|
import java.util.concurrent.Executors;
|
|
import java.util.concurrent.ScheduledExecutorService;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
import javax.swing.Box;
|
|
import javax.swing.BoxLayout;
|
|
import javax.swing.DefaultListModel;
|
|
import javax.swing.JButton;
|
|
import javax.swing.JFrame;
|
|
import javax.swing.JLabel;
|
|
import javax.swing.JList;
|
|
import javax.swing.JOptionPane;
|
|
import javax.swing.JPanel;
|
|
import javax.swing.JPasswordField;
|
|
import javax.swing.JScrollPane;
|
|
import javax.swing.ListSelectionModel;
|
|
import javax.swing.event.ListSelectionEvent;
|
|
import javax.swing.event.ListSelectionListener;
|
|
|
|
import sig.sigIRC;
|
|
import sig.modules.RabiRaceModule;
|
|
import sig.utils.DebugUtils;
|
|
import sig.utils.FileUtils;
|
|
|
|
public class SessionListWindow extends JFrame{
|
|
JPanel container = new JPanel();
|
|
public JList<String> sessionlist = new JList<String>();
|
|
public DefaultListModel<String> sessionlist_model = new DefaultListModel<String>();
|
|
public int selected = -1;
|
|
public DataPanel previewPanel = new DataPanel();
|
|
public JButton joinButton = new JButton("Join");
|
|
public JScrollPane scrolllist = new JScrollPane();
|
|
public PasswordBox box = new PasswordBox();
|
|
public String enteredPassword = "";
|
|
|
|
|
|
public SessionListWindow(){
|
|
this.setTitle("Rabi-Race Sessions List");
|
|
this.setIconImage(sigIRC.programIcon);
|
|
|
|
previewPanel.setWindow(this);
|
|
|
|
scrolllist.setViewportView(sessionlist);
|
|
scrolllist.setPreferredSize(new Dimension(160,150));
|
|
scrolllist.setMinimumSize(new Dimension(160,150));
|
|
scrolllist.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
|
JPanel sessionPanel = new JPanel();
|
|
|
|
sessionlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
|
sessionlist.setLayoutOrientation(JList.VERTICAL);
|
|
sessionlist.setVisibleRowCount(6);
|
|
|
|
sessionPanel.setLayout(new BoxLayout(sessionPanel,BoxLayout.PAGE_AXIS));
|
|
sessionPanel.setSize(130,200);
|
|
sessionPanel.setMinimumSize(new Dimension(130,200));
|
|
|
|
sessionPanel.add(scrolllist);
|
|
sessionPanel.add(Box.createRigidArea(new Dimension(10,10)));
|
|
sessionPanel.add(joinButton);
|
|
|
|
UpdateSessionList();
|
|
joinButton.setEnabled(false);
|
|
joinButton.addActionListener(new ActionListener() {
|
|
@Override
|
|
public void actionPerformed(ActionEvent ev) {
|
|
|
|
if (sessionlist.getSelectedIndex()!=-1) {
|
|
selected = sessionlist.getSelectedIndex();
|
|
Session session = RabiRaceModule.module.session_listing.data.get(getSelectedID());
|
|
|
|
if (!session.password.equalsIgnoreCase("none")) {
|
|
box.displayPasswordBox();
|
|
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
|
scheduler.scheduleWithFixedDelay(()->{
|
|
if (enteredPassword.length()!=0) {
|
|
File file = new File(sigIRC.BASEDIR+"sigIRC/tmp.data");
|
|
|
|
String hashedPass = GetHashedPassword(enteredPassword);
|
|
|
|
ConnectToSession(session, hashedPass);
|
|
|
|
enteredPassword="";
|
|
|
|
scheduler.shutdownNow();
|
|
}
|
|
}, 1000l, 1000l, TimeUnit.MILLISECONDS);
|
|
} else {
|
|
ConnectToSession(session, "");
|
|
}
|
|
if (RabiRaceModule.mySession!=null) {
|
|
setVisible(false);
|
|
}
|
|
//Attempt to join the session.
|
|
|
|
|
|
}
|
|
}
|
|
});
|
|
|
|
sessionlist.setModel(sessionlist_model);
|
|
sessionlist.addListSelectionListener(new ListSelectionListener() {
|
|
|
|
@Override
|
|
public void valueChanged(ListSelectionEvent arg0) {
|
|
if (sessionlist.getSelectedIndex()!=-1) {
|
|
selected = sessionlist.getSelectedIndex();
|
|
Session session = RabiRaceModule.module.session_listing.data.get(getSelectedID());
|
|
if (RabiRaceModule.module.mySession==null &&
|
|
session.maxPlayers!=session.players.size()) {
|
|
joinButton.setEnabled(true);
|
|
} else {
|
|
joinButton.setEnabled(false);
|
|
}
|
|
} else {
|
|
joinButton.setEnabled(false);
|
|
}
|
|
}
|
|
|
|
});
|
|
|
|
container.add(Box.createRigidArea(new Dimension(10,1)));
|
|
container.add(sessionPanel);
|
|
container.add(Box.createRigidArea(new Dimension(10,1)));
|
|
container.add(previewPanel);
|
|
previewPanel.setPreferredSize(new Dimension(400,300));
|
|
|
|
|
|
this.add(container);
|
|
this.setMinimumSize(new Dimension(640,480));
|
|
}
|
|
|
|
public static void ConnectToSession(Session session, String hashedPass) {
|
|
try {
|
|
if (hashedPass.length()==0) {
|
|
hashedPass="none";
|
|
}
|
|
File file = new File(sigIRC.BASEDIR+"sigIRC/tmp.data");
|
|
org.apache.commons.io.FileUtils.copyURLToFile(new URL("http://45.33.13.215/rabirace/send.php?key=joinsession&name="+RabiRaceModule.module.myProfile.username+"&session="+session.id+"&password="+hashedPass),file);
|
|
String[] data = FileUtils.readFromFile(sigIRC.BASEDIR+"sigIRC/tmp.data");
|
|
|
|
if (data.length==1) {
|
|
int errorCode = Integer.parseInt(data[0]);
|
|
switch (errorCode) {
|
|
case 400:
|
|
case 404:{
|
|
JOptionPane.showMessageDialog(RabiRaceModule.module.window, "Invalid format sent. Please contact the dev! This should not be happening! \n"+DebugUtils.getStackTrace(), "Error "+errorCode, JOptionPane.WARNING_MESSAGE);
|
|
}break;
|
|
case 403:{
|
|
JOptionPane.showMessageDialog(RabiRaceModule.module.window, "Session does not exist!", "Error "+errorCode, JOptionPane.WARNING_MESSAGE);
|
|
}break;
|
|
case 405:{
|
|
JOptionPane.showMessageDialog(RabiRaceModule.module.window, "Session room is full!", "Error "+errorCode, JOptionPane.WARNING_MESSAGE);
|
|
}break;
|
|
case 406:{
|
|
JOptionPane.showMessageDialog(RabiRaceModule.module.window, "Incorrect Password! "+hashedPass, "Error "+errorCode, JOptionPane.WARNING_MESSAGE);
|
|
}break;
|
|
case 0:{
|
|
RabiRaceModule.mySession = session;
|
|
}break;
|
|
}
|
|
}
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
public void run() {
|
|
this.repaint();
|
|
}
|
|
|
|
public static String GetHashedPassword(String input) {
|
|
try {
|
|
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
|
|
byte[] array = md.digest(input.getBytes());
|
|
StringBuffer sb = new StringBuffer();
|
|
for (int i = 0; i < array.length; ++i) {
|
|
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
|
|
}
|
|
return sb.toString();
|
|
} catch (java.security.NoSuchAlgorithmException e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public void UpdateSessionList() {
|
|
selected = sessionlist.getSelectedIndex();
|
|
int selectedID = getSelectedID();
|
|
sessionlist_model.clear();
|
|
int count=0;
|
|
for (Integer id : RabiRaceModule.module.session_listing.data.keySet()) {
|
|
Session session = RabiRaceModule.module.session_listing.data.get(id);
|
|
sessionlist_model.addElement((session.password.equalsIgnoreCase("none")?"":"🔑 ")+session.id+" - "+session.name+" ("+session.players.size()+"/"+session.maxPlayers+")");
|
|
if (id == selectedID && sessionlist_model.getSize()>count) {
|
|
sessionlist.setSelectedIndex(count);
|
|
}
|
|
count++;
|
|
}
|
|
//System.out.println("Selected is "+selected);
|
|
//Try to find ID in list.
|
|
}
|
|
|
|
public int getSelectedID() {
|
|
if (selected!=-1) {
|
|
return Integer.parseInt(sessionlist_model.getElementAt(selected).replaceAll("🔑", "").split(" - ")[0].trim());
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
class DataPanel extends JPanel{
|
|
SessionListWindow window;
|
|
public void setWindow(SessionListWindow window) {
|
|
this.window=window;
|
|
}
|
|
public void paintComponent(Graphics g) {
|
|
super.paintComponent(g);
|
|
//Axis.GetAxisDisplay(g,window.ConstructTemporaryAxis(),0,0,window.axis_width,window.axis_height);
|
|
//Axis.GetAxisIndicatorDisplay(g,window.ConstructTemporaryAxis(),0,0,window.axis_width,window.axis_height);
|
|
if (selected!=-1 &&
|
|
RabiRaceModule.module.session_listing.data.size()>selected) {
|
|
int selectedID = getSelectedID();
|
|
//Get the players from that session.
|
|
Session s = RabiRaceModule.module.session_listing.data.get(selectedID);
|
|
|
|
Profile.DrawMultiPanel(g,0,0,400,s.players);
|
|
}
|
|
}
|
|
}
|
|
|
|
class PasswordBox extends JFrame{
|
|
JPasswordField pass = new JPasswordField();
|
|
JButton okay = new JButton("Submit");
|
|
JPanel container = new JPanel();
|
|
public PasswordBox(){
|
|
this.setVisible(false);
|
|
container.setLayout(new BoxLayout(container,BoxLayout.PAGE_AXIS));
|
|
container.add(Box.createRigidArea(new Dimension(240,20)));
|
|
JPanel label_panel = new JPanel();
|
|
label_panel.setLayout(new BoxLayout(label_panel,BoxLayout.LINE_AXIS));
|
|
label_panel.add(Box.createRigidArea(new Dimension(20,5)));
|
|
JLabel label = new JLabel("Please enter the password required to join this session:");
|
|
label_panel.add(label);
|
|
label_panel.add(Box.createRigidArea(new Dimension(20,5)));
|
|
label.setLayout(new BoxLayout(label,BoxLayout.LINE_AXIS));
|
|
container.add(label_panel);
|
|
container.add(Box.createRigidArea(new Dimension(240,5)));
|
|
JPanel pass_row = new JPanel();
|
|
pass_row.setLayout(new BoxLayout(pass_row,BoxLayout.LINE_AXIS));
|
|
pass.setMinimumSize(new Dimension(120,20));
|
|
pass.setPreferredSize(new Dimension(120,20));
|
|
pass_row.setSize(240,20);
|
|
pass_row.add(Box.createRigidArea(new Dimension(20,5)));
|
|
pass_row.add(pass);
|
|
pass_row.add(Box.createRigidArea(new Dimension(20,5)));
|
|
|
|
okay.addActionListener(new ActionListener(){
|
|
@Override
|
|
public void actionPerformed(ActionEvent ev) {
|
|
enteredPassword = String.copyValueOf(pass.getPassword());
|
|
box.setVisible(false);
|
|
}
|
|
});
|
|
|
|
container.add(pass_row);
|
|
container.add(okay);
|
|
container.add(Box.createRigidArea(new Dimension(240,20)));
|
|
this.add(container);
|
|
this.pack();
|
|
}
|
|
|
|
public void displayPasswordBox() {
|
|
this.setVisible(true);
|
|
pass.setText("");
|
|
}
|
|
}
|
|
}
|
|
|