home *** CD-ROM | disk | FTP | other *** search
/ BUG 15 / BUGCD1998_06.ISO / aplic / jbuilder / jsamples.z / PlayerId.java < prev    next >
Encoding:
Java Source  |  1997-07-03  |  14.1 KB  |  412 lines

  1. package borland.samples.apps.chess.server;
  2.  
  3. import java.io.*;
  4. import java.util.*;
  5. import java.lang.*;
  6. import borland.samples.apps.chess.client.PersistString;
  7.  
  8. class PlayerId
  9. {
  10.   public static Hashtable usersByUser = new Hashtable();
  11.   public static Hashtable usersById   = new Hashtable();
  12.   private final static File partialGames = new File("Suspended");  //directory for holding suspended games
  13.   private final static File userlist     = new File("users.txt");  //file that holds user list
  14.   private static int nextId = 4096;   //highest userid, for constructing new users id's
  15.   private static boolean userListIsDirty = false;
  16.   String id   = null;    //unique string representation of a hex number. Key to usersById
  17.   String user = null;    //unique key to usersByUser
  18.   String password;
  19.   String name;
  20.   String email;
  21.   String location;
  22.   String extra;       //whatever
  23.   Vector message;     //array of undelivered messages
  24.   int rating;         //elo rating
  25.   int gamesPlayed;    //number of games played
  26.   long lastNoteTime;
  27.   Vector partialGame; //list of users suspended game filenames
  28.  
  29.   public PlayerId(String user,String password){
  30.     int idNum = PlayerId.nextId++;
  31.     id = "000" + Integer.toHexString(idNum);
  32.     if (id.length() > 4)
  33.       id = id.substring(id.length() - 4);
  34.     this.user = user;
  35.     this.password = password;
  36.     message = new Vector();
  37.     name = " ";
  38.     email = " ";
  39.     location = " ";
  40.     extra = " ";
  41.     rating = 1200;
  42.     partialGame = new Vector(1);
  43.     gamesPlayed = 0;
  44.     lastNoteTime = 0;
  45.   }
  46.   public void isDirty() {
  47.     userListIsDirty = true;
  48.   }
  49.   public  void Update(String password,String email,String name,String location,String extra) {
  50.     this.password = password;
  51.     this.name = name;
  52.     this.email = email;
  53.     this.location = location;
  54.     this.extra = extra;
  55.     PlayerId.userListIsDirty = true;
  56.   }
  57.  
  58.   public PlayerId() {
  59.     partialGame = new Vector(5);
  60.     message = new Vector();
  61.   }
  62.  
  63.   public boolean addPlayer() {
  64.     if (id != null && user != null) {
  65.       PlayerId.usersByUser.put(user,this);
  66.       PlayerId.usersById.put(id,this);
  67.       PlayerId.userListIsDirty = true;
  68.       return true;
  69.     }
  70.     return false;
  71.   }
  72.   void addNote(String msg) {
  73.     long now = System.currentTimeMillis();
  74.     if (now - lastNoteTime > 180000) {
  75.       message.addElement(new Date(now).toString());
  76.       lastNoteTime = now;
  77.     }
  78.     message.addElement(msg);
  79.     isDirty();
  80.   }
  81.   void read(String data) {
  82.     try {
  83.       String [] temp = PersistString.parse(data);
  84.       id = temp[0];
  85.       user = temp[1];
  86.       password = temp[2];
  87.       name = temp[3];
  88.       email = temp[4];
  89.       location = temp[5];
  90.       extra = temp[6];
  91.       rating = Integer.parseInt(temp[7]);
  92.       gamesPlayed = Integer.parseInt(temp[8]);
  93.  
  94.  
  95.       for (int i= 9;i<temp.length;i++)
  96.          message.addElement(temp[i]);
  97.       //System.out.println ("user=" + user + " name=" + name + " rating=" + rating);
  98.       PlayerId.userListIsDirty = true; // this method is used to update data
  99.     }
  100.     catch (Exception e) {System.out.println("PlayerId.read " + e);
  101.        System.out.println("record: " + data);
  102.     }
  103.   }
  104.  
  105.   public String Output() {
  106.  
  107.      String [] temp = new String [9+ message.size()];
  108.      temp[0] =  id;
  109.      temp[1] =  user ;
  110.      temp[2] =  password ;
  111.      temp[3] =  name  ;
  112.      temp[4] =  email;
  113.  
  114.      temp[5] =  location ;
  115.      temp[6] =  extra  ;
  116.      temp[7] =  String.valueOf(rating);
  117.      temp[8] =  String.valueOf( gamesPlayed) ;
  118.      for (int i = 0; i < message.size(); i++)
  119.        temp[i+9] = (String) message.elementAt(i);
  120.      return PersistString.concat(temp);
  121.   }
  122.  
  123.   public void addGame(String filename) {
  124.     partialGame.addElement(filename);
  125.   }
  126.  
  127.   public static void ReadUserFile() {
  128.     int numUsers = 0;
  129.     try {
  130.       // partialGames = new File("Suspended");
  131.       //userlist = new File("users.txt");
  132.       if (userlist.exists()) {
  133.         FileInputStream fs = new FileInputStream(userlist);
  134.         DataInputStream ds = new DataInputStream(fs);
  135.         InputStreamReader isr  = new InputStreamReader(ds);
  136.         BufferedReader br = new BufferedReader(isr);
  137.         PlayerId temp;
  138.         String inputData;
  139.         while (true) {
  140.           inputData =  br.readLine();
  141.           if (inputData == null || inputData.length() < 10)
  142.             break;
  143.           else
  144.             //System.out.println(inputData);
  145.             temp = new PlayerId() ;
  146.             temp.read(inputData);
  147.             numUsers++;
  148.             if (temp.addPlayer()) {
  149.               try {
  150.               int intId = Integer.parseInt(temp.id,16);
  151.               if (intId >= nextId)
  152.                 nextId = intId  + 1;
  153.             }
  154.             catch (NumberFormatException e) { System.out.println (temp.id +  "is not a hex number"); }
  155.           }
  156.           else
  157.             System.out.println(temp.id + " " + temp.user + ": junk data in user file");
  158.         }
  159.         fs.close();
  160.       }
  161.       else
  162.         System.out.println("User database " + userlist.getAbsolutePath() + " not found ");
  163.  
  164.       System.out.println("Read " + numUsers + " userId records from " + userlist.getAbsolutePath());
  165.       ConstructSuspendLists();
  166.       PlayerId.userListIsDirty = false;
  167.     }
  168.     catch (Exception e) {System.out.println("Exception  after reading " + numUsers + " " + e);}
  169.   }
  170.  
  171.   private static void ConstructSuspendLists() {
  172.     PgnFilter filter = new PgnFilter(13);
  173.     if (filter == null)
  174.       System.out.println("file filter object is null??");
  175.     if (partialGames == null)
  176.       System.out.println("game directory object is null??");
  177.     else if (!partialGames.exists())
  178.       partialGames.mkdir();
  179.     String [] dirlist  = partialGames.list(filter);
  180.     if (dirlist != null)
  181.       for (int i=0; i<dirlist.length;++i) {
  182.         PlayerId white = (PlayerId)usersById.get(dirlist[i].substring(0,4));
  183.         PlayerId black = (PlayerId)usersById.get(dirlist[i].substring(4,8));
  184.         if (white != null && black != null) {
  185.           System.out.println("added game " + dirlist[i] + " to " + white.user  + " & " + black.user + "'s suspended list");
  186.           white.addGame(dirlist[i]);
  187.           black.addGame(dirlist[i]);
  188.         }
  189.         else
  190.           System.out.println("could not find id " + dirlist[i].substring(0,8));
  191.       }
  192.     else
  193.       System.out.println("Suspended game directory is empty");
  194.   }
  195.  
  196.   //game is over. if it was a suspended game, delete it
  197.   public static void RecordResult(Game g,String result) {
  198.     PlayerId white = (PlayerId) PlayerId.usersByUser.get(g.white) ;
  199.     PlayerId black = (PlayerId) PlayerId.usersByUser.get(g.black) ;
  200.     if (g.filename != null) {
  201.       black.partialGame.removeElement(g.filename);
  202.       white.partialGame.removeElement(g.filename);
  203.       File file = new File("Suspended",g.filename);
  204.       if (file.delete())
  205.         System.out.println("deleted " + g.filename);
  206.       else
  207.         System.out.println("delete " + g.filename + " failed ");
  208.     }
  209.     PlayerId winner = white;
  210.     PlayerId loser = black;
  211.     int loserdelta;
  212.     int winnerdelta;
  213.     if (result.startsWith("Abort"))
  214.        return;
  215.     if (result.startsWith("1/2-1/2")) {
  216.       if  (winner.gamesPlayed < 20)
  217.         winner.rating = ((winner.rating * winner.gamesPlayed) +
  218.                         loser.rating ) / (winner.gamesPlayed + 1) ;
  219.       else
  220.         winner.rating = winner.rating  - elo(winner.rating - loser.rating);
  221.       if  (winner.gamesPlayed < 20)
  222.         loser.rating = ((loser.rating * loser.gamesPlayed) +
  223.                        winner.rating ) / (loser.gamesPlayed + 1) ;
  224.       else
  225.         loser.rating = loser.rating  + elo(winner.rating - loser.rating);
  226.     }
  227.     else {
  228.       if (result.startsWith("0-1")) {
  229.         winner = black;
  230.         loser = white;
  231.       }
  232.       winnerdelta = loser.rating + 400;
  233.       loserdelta = winner.rating - 400;
  234.       if (winner.gamesPlayed < 20)
  235.         winner.rating = ((winner.rating * winner.gamesPlayed) +
  236.                         winnerdelta ) / (winner.gamesPlayed + 1) ;
  237.       else
  238.         winner.rating = winner.rating + 16 - elo(winner.rating - loser.rating);
  239.       if (loser.gamesPlayed < 20)
  240.         loser.rating = ((loser.rating * loser.gamesPlayed) +
  241.                        loserdelta ) / (loser.gamesPlayed + 1) ;
  242.       else
  243.         loser.rating = loser.rating - 16 + elo(winner.rating - loser.rating);
  244.     }
  245.     winner.gamesPlayed++;
  246.     loser.gamesPlayed++;
  247.     PlayerId.userListIsDirty = true;
  248.   }
  249.  
  250.   static int elo(int ratingdiff) {
  251.     int distribution[] = {0,12,34,56,8,101,126,151,177,206,239,273,315,366,446,471,714};
  252.     int sign = 1;
  253.     if (ratingdiff < 0)  {
  254.        sign = -1;
  255.        ratingdiff = -ratingdiff;
  256.     }
  257.     int oldsub = -1;
  258.     int i = 8;
  259.     int maxsub = 16;
  260.     int minsub = 0;
  261.     while (oldsub != i) {
  262.       oldsub = i;
  263.       i = (maxsub + minsub) /2;
  264.       if (ratingdiff > distribution[i])
  265.         minsub = i;
  266.       else
  267.         maxsub = i;
  268.     }
  269.     return oldsub * sign;
  270.   }
  271.   //Game is being suspended. Delete old version (if any) and
  272.   //write game to disk
  273.   public static void SuspendGame(Game g) {
  274.     String tomove  = "1";
  275.     if (g.whitetomove)
  276.       tomove = "0" ;
  277.     String suffix = tomove + String.valueOf(g.offerFlag) + String.valueOf(g.movenum); //1 digit
  278.     String gameName;
  279.     PlayerId black = null;
  280.     PlayerId white = null;
  281.     if (g.filename != null ) {
  282.       if (g.blackId == null || g.whiteId == null)
  283.         System.out.println("weird Game object " + g.filename + g.white + g.black);
  284.       if (g.filename.substring(8).equals(suffix + ".pgn"))
  285.         return;
  286.     }
  287.     white = (PlayerId) PlayerId.usersByUser.get(g.white) ;
  288.     black = (PlayerId) PlayerId.usersByUser.get(g.black) ;
  289.     gameName =  white.id + black.id + suffix + ".pgn";
  290.     try {
  291.       File file = new File("Suspended",gameName);
  292.       System.out.println("Saving " + gameName);
  293.       if (file == null)
  294.         System.out.println("could not open file");
  295.       FileOutputStream fs = new FileOutputStream(file);
  296.       PrintWriter ps = new PrintWriter(fs);
  297.       ps.print(g.getMoves());
  298.       ps.flush();
  299.       ps.close();
  300.       System.out.println("Wrote file");
  301.       if (g.filename != null) {
  302.         black.partialGame.removeElement(g.filename);
  303.         white.partialGame.removeElement(g.filename);
  304.         file = new File("Suspended",g.filename);
  305.         if (file.delete())
  306.           System.out.println("deleted " + g.filename);
  307.         else
  308.           System.out.println("delete " + g.filename + " failed ");
  309.       }
  310.       black.partialGame.addElement(gameName);
  311.       white.partialGame.addElement(gameName);
  312.       g.filename = gameName;
  313.       g.blackId = black.id;
  314.       g.whiteId = white.id;
  315.     }
  316.     catch (Exception e ) {
  317.       System.out.println("err in SuspendGame " + e);
  318.     }
  319.   }
  320.  
  321.   //Create a game object for the suspended game file
  322.   public Game getGame(String filename) {
  323.     Game g = null;
  324.     try {
  325.       File gamefile = new File("Suspended",filename);
  326.       FileInputStream fs = new FileInputStream(gamefile) ;
  327.       DataInputStream ds = new DataInputStream(fs);
  328.       InputStreamReader isr  = new InputStreamReader(ds);
  329.       BufferedReader br = new BufferedReader(isr);
  330.       String moves = br.readLine();
  331.       fs.close();
  332.       String whiteId = filename.substring(0,4);
  333.       String blackId = filename.substring(4,8);
  334.       String tomove = filename.substring(8,9);
  335.       int movenum = Integer.parseInt(filename.substring(10,filename.indexOf('.',9)));
  336.       PlayerId white = (PlayerId) PlayerId.usersById.get(whiteId);
  337.       PlayerId black = (PlayerId) PlayerId.usersById.get(blackId);
  338.       g = new Game(white.user,black.user);
  339.       g.offerFlag = Integer.parseInt(filename.substring(9,10));
  340.       g.movenum = movenum;
  341.       int index;
  342.       if (tomove.equals("0"))
  343.         g.whitetomove = true;
  344.       else {
  345.         g.whitetomove = false;
  346.         index = moves.lastIndexOf('.') ;
  347.         String temp = moves.substring(index-5,index);
  348.         System.out.println("temp=" + temp);
  349.         int index1 = temp.lastIndexOf(' ');
  350.         g.whitesLastMove = moves.substring(index - 4 + index1);
  351.         System.out.println("indexes="+index + "," + index1+ g.whitesLastMove);
  352.       }
  353.       g.setInfo();
  354.       index = moves.indexOf("Whitetime");
  355.       int endindex = moves.indexOf("]",index);
  356.       g.whiteTime = moves.substring(index+10,endindex);
  357.       index = moves.indexOf("Blacktime");
  358.       endindex = moves.indexOf("]",index);
  359.       g.blackTime = moves.substring(index+10,endindex);
  360.       index = moves.indexOf("Movetime");
  361.       endindex = moves.indexOf("]",index);
  362.       g.moveTime = moves.substring(index+9,endindex);
  363.       g.moves = moves.substring(endindex+1);
  364.       g.whiteId = whiteId;
  365.       g.blackId = blackId;
  366.       g.filename = filename;
  367.     }
  368.     catch (Exception e) {System.out.println("PlayerId.getGame " + e);}
  369.     return g;
  370.   }
  371.  
  372.   static public void WriteUserList() {
  373.     if (!PlayerId.userListIsDirty)
  374.       return;
  375.     FileOutputStream fo = null;
  376.     PrintWriter ps = null;
  377.     //System.out.println("Trying to write out updated user List")  ;
  378.     try {
  379.       fo = new FileOutputStream(PlayerId.userlist);
  380.       ps = new PrintWriter(fo);
  381.     }
  382.     catch (Exception e) {System.out.println("Things look bad for the home team");}
  383.     PlayerId p = null;
  384.     if (ps != null) {
  385.       for (Enumeration e = PlayerId.usersById.elements(); e.hasMoreElements();) {
  386.         p = (PlayerId) e.nextElement();
  387.         //System.out.println("Writing " + p.user );
  388.         ps.println(p.Output());
  389.       }
  390.       System.out.println("Updated the user List");
  391.       ps.flush();
  392.       ps.close();
  393.       PlayerId.userListIsDirty = false;
  394.     }
  395.   }
  396. } //end of class
  397.  
  398. class PgnFilter implements FilenameFilter {
  399.   int minFileNameLength = 2;
  400.   public PgnFilter(int length) {
  401.     minFileNameLength = length;
  402.   }
  403.   public boolean accept(File dir,String name) {
  404.     if ( name != null && name.endsWith(".pgn") && name.length() > minFileNameLength)
  405.       return true;
  406.     else  {
  407.       System.out.println("Threw out " + name );
  408.       return false;
  409.     }
  410.   }
  411. }
  412.