thufir

PlayerController has-a Connection

Sep 13th, 2013
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.14 KB | None | 0 0
  1. package telnet.connection;
  2.  
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5. import java.net.InetAddress;
  6. import java.net.SocketException;
  7. import java.net.UnknownHostException;
  8. import java.util.ArrayDeque;
  9. import java.util.Deque;
  10. import java.util.NoSuchElementException;
  11. import java.util.Observable;
  12. import java.util.Observer;
  13. import java.util.Properties;
  14. import java.util.concurrent.ConcurrentLinkedQueue;
  15. import java.util.logging.Logger;
  16. import org.apache.commons.net.telnet.TelnetClient;
  17. import telnet.player.Action;
  18.  
  19. public final class TelnetConnection implements Observer {
  20.  
  21.     private Logger log = Logger.getLogger(TelnetConnection.class.getName());
  22.     private TelnetClient telnetClient = new TelnetClient();
  23.     private InputStreamWorker remoteInputStreamWorker = new InputStreamWorker();
  24.     private ConsoleReader localInputReader = new ConsoleReader();
  25.     private CharacterDataQueueWorker characterDataQueueWorker = new CharacterDataQueueWorker();
  26.     private ConcurrentLinkedQueue<Character> remoteCharDataQueue = new ConcurrentLinkedQueue<>();
  27.     private Deque<Action> actions = new ArrayDeque<>();
  28.  
  29.     public TelnetConnection() throws UnknownHostException, SocketException, IOException {
  30.         Properties props = PropertiesReader.getProps();
  31.         InetAddress host = InetAddress.getByName(props.getProperty("host"));
  32.         int port = Integer.parseInt(props.getProperty("port"));
  33.         telnetClient.connect(host, port);
  34.     }
  35.  
  36.     public void startReadPrintThreads() throws SocketException, IOException {
  37.         remoteInputStreamWorker.print(telnetClient.getInputStream(), remoteCharDataQueue);
  38.         localInputReader.read();
  39.         localInputReader.addObserver(this);
  40.         characterDataQueueWorker.read(remoteCharDataQueue);
  41.         characterDataQueueWorker.addObserver(this);
  42.     }
  43.  
  44.     private void sendActions(long delay) {
  45.         byte[] commandBytes = null;
  46.         OutputStream outputStream = telnetClient.getOutputStream();
  47.         while (!actions.isEmpty()) {
  48.             try {
  49.                 Action action = actions.remove();
  50.                 sendAction(action);
  51.                 Thread.sleep(delay);
  52.             } catch (InterruptedException | IOException | NoSuchElementException ex) {
  53.             } finally {
  54.             }
  55.         }
  56.     }
  57.  
  58.     private void sendAction(Action action) throws IOException {
  59.         byte[] actionBytes = action.getCommand().getBytes();
  60.         OutputStream outputStream = telnetClient.getOutputStream();
  61.         outputStream.write(actionBytes);
  62.         outputStream.write(13);
  63.         outputStream.write(10);
  64.         outputStream.flush();
  65.     }
  66.  
  67.     @Override
  68.     public void update(Observable o, Object arg) {
  69.         long delay = 0;
  70. //        Deque<Action> newActions = new ArrayDeque<>();
  71.         actions = new ArrayDeque<>();
  72.         try {
  73.             if (o instanceof CharacterDataQueueWorker) {
  74.                 String remoteOutputMessage = characterDataQueueWorker.getFinalData();
  75. //                newActions = playerController.processGameData(remoteOutputMessage);
  76.                 delay = 5;
  77.             }
  78.  //           actions.addAll(newActions);
  79.             sendActions(delay);
  80.         } catch (NullPointerException npe) {
  81.             log.fine(npe.toString());
  82.         }
  83.  
  84.         if (o instanceof ConsoleReader) {
  85.             try {
  86.                 String userInput = localInputReader.getCommand();
  87.                 Action action = new Action(userInput);
  88.                 sendAction(action);
  89.             } catch (IOException ex) {
  90.             }
  91.         }
  92.     }
  93.  
  94.     public String getGameData() {
  95.         String s = remoteCharDataQueue.toString();
  96.         return s;
  97.     }
  98. }
  99.  
  100.  
  101.  
  102. package telnet.player;
  103.  
  104. import java.io.IOException;
  105. import java.net.SocketException;
  106. import java.net.UnknownHostException;
  107. import java.util.Deque;
  108. import java.util.Map.Entry;
  109. import java.util.logging.Level;
  110. import java.util.logging.Logger;
  111. import telnet.connection.TelnetConnection;
  112.  
  113. public class PlayerController {
  114.  
  115.     private final static Logger log = Logger.getLogger(PlayerController.class.getName());
  116.     private static Player player = Player.INSTANCE;  //single player only, ever
  117.     private static RegexWorker rw = new RegexWorker();
  118.     private static TelnetConnection tc;
  119.  
  120.     public PlayerController() {
  121.     }
  122.  
  123.     public static void processGameData() {
  124.         String gameData = tc.getGameData();
  125.         Deque<Action> actions = rw.parseAndUpdatePlayerCharacter(gameData);
  126.         Flag flag = null;
  127.         for (Entry<Flag, Boolean> entry : player.getFlags().entrySet()) {
  128.             if (entry.getKey() != Flag.LOGGEDIN) {
  129.                 if (entry.getValue()) {
  130.                     flag = entry.getKey();
  131.                     log.log(Level.INFO, "detected\t{0}", flag);
  132.                     player.setFlag(flag, false);
  133.                     actions.addAll(flag.getActionsForState());
  134.                 }
  135.             }
  136.         }
  137.     }
  138.  
  139.     public static void main(String[] args) throws UnknownHostException, IOException {
  140.                     tc = new TelnetConnection();
  141.         while (true) {
  142.             processGameData();
  143.         }
  144.     }
  145. }
Advertisement
Add Comment
Please, Sign In to add comment