package ring.server.telnet; import java.io.IOException; import java.net.InetAddress; import java.util.Timer; import java.util.TimerTask; import ring.comms.Communicator; import ring.comms.telnet.TelnetInputStream; import ring.comms.telnet.TelnetOutputStream; import ring.comms.telnet.TelnetStreamCommunicator; import ring.server.MUDConnectionManager; import ring.server.MUDConnectionTimeout; import ring.server.shells.PlayerLoginShell; import ring.server.shells.PlayerShell; import net.wimpi.telnetd.net.Connection; import net.wimpi.telnetd.net.ConnectionEvent; import net.wimpi.telnetd.shell.Shell; public class TelnetShell implements Shell { private Connection connection; private Communicator comms; public static Shell createShell() { return new TelnetShell(); } @Override public void run(Connection conn) { init(conn); //Clear screen try { conn.getTerminalIO().eraseScreen(); conn.getTerminalIO().homeCursor(); } catch (IOException e1) { e1.printStackTrace(); } //Delegate to PlayerLoginShell. new PlayerLoginShell(connection.getConnectionData().getInetAddress(), comms).run(); //Note: the login shell always takes care of setting up the player, assuming it needs to happen. //Otherwise, the player is cached by the mud connection manager. //Then delegate to PlayerShell new PlayerShell(connection.getConnectionData().getInetAddress(), comms).run(); } private void init(Connection conn) { connection = conn; connection.addConnectionListener(this); //Clear out the timer if they have one MUDConnectionManager.deleteTimer(connection.getConnectionData().getInetAddress()); //Initialize the communicator. TelnetStreamCommunicator c = new TelnetStreamCommunicator(new TelnetInputStream(connection.getTerminalIO()), new TelnetOutputStream(connection.getTerminalIO())); c.setEchoReturn(true); comms = c; } @Override public void connectionIdle(ConnectionEvent arg0) { System.out.println("Idle connection for " + connection); InetAddress ip = connection.getConnectionData().getInetAddress(); TimerTask task = new MUDConnectionTimeout(ip); Timer timer = MUDConnectionManager.createTimer(ip); //timer.schedule(task, 1000); timer.schedule(task, 300000); //5 minutes = 300,000 } @Override public void connectionLogoutRequest(ConnectionEvent arg0) { System.out.println("Logout request for " + connection); } @Override public void connectionSentBreak(ConnectionEvent arg0) { System.out.println("Connection break for " + connection); } @Override public void connectionTimedOut(ConnectionEvent arg0) { System.out.println("Timeout for " + connection); } }