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 ( "" ) ;
}
}
}