
// FBFWatcher.java
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Třída FBFWatcher monitoruje proud přicházející ze serveru,
   který bude obsahovat zprávy, jež musejí být zpracovány klientem 
   (objektem typu NetFourByFour).

   Příchozí zprávy:
    ok <playerID>           -- spojení akceptováno; obsahuje ID hráče
    full                    -- spojení odmítnuto; server již má dostatek hráčů
    tooFewPlayers           -- tah odmítnut, neboť není dostatek hráčů
    otherTurn <player> <posn>  -- tah druhého hráče odeslaný klientovi
    added <player>          -- druhý hráč připojen k serveru
    removed <player>        -- druhý hráč odpojen
*/

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;


public class FBFWatcher extends Thread
{
  private NetFourByFour fbf;    // zpětný odkaz na klienta
  private BufferedReader in;

  public FBFWatcher(NetFourByFour fbf, BufferedReader i)
  {  this.fbf = fbf; 
     in = i;  
  }


  public void run()
  // Přečte zprávy server a reaguje na ně
  { 
    String line;
    try {
      while ((line = in.readLine()) != null) {
        if (line.startsWith("ok"))
          extractID(line.substring(3));
        else if (line.startsWith("full"))
          fbf.disable("hra je plná");    // deaktivuj klienta
        else if (line.startsWith("tooFewPlayers"))
            fbf.disable("druhý hráč opustil hru");    // deaktivuj klienta
        else if (line.startsWith("otherTurn"))
          extractOther(line.substring(10));
        else if (line.startsWith("added"))    // nepoužívej ID
          fbf.addmlayer();        // klient přidává druhého hráče
        else if (line.startsWith("removed"))  // nepoužívej ID
          fbf.removePlayer();     // klient odebírá druhého hráče
        else   // cokoliv jiného
          System.out.println("Chyba: " + line + "\n");
      }
    }
    catch(Exception e)    // uzavření socketu způsobí ukončení cyklu while
    { // System.out.println("Socket uzavřen");
      fbf.disable("spojení se serverem je pryč");   // stejně jako jej ukončí i konec hry
    }
  }  // konec metody: run()


  private void extractID(String line)
  // formát řádku:  <player id>
  {
    StringTokenizer tokens = new StringTokenizer(line);
    try {
      int id = Integer.parseInt( tokens.nextToken() );
      fbf.setPlayerID(id);     // klient získá ID svého hráče
    }
    catch(NumberFormatException e)
    { System.out.println(e); } 
  }  // konec metody: extractID()


  private void extractOther(String line)
  // formát řádku: <player id> <posn>
  {
    StringTokenizer tokens = new StringTokenizer(line);
    try {
      int playerID = Integer.parseInt( tokens.nextToken() );
      int posn = Integer.parseInt( tokens.nextToken() );
      fbf.doMove(posn, playerID);   // klient provede tah druhého hráče
    }
    catch(NumberFormatException e)
    { System.out.println(e); } 
  }  // konec metody: extractOther()

}  // konec třídy: FBFWatcher

