Commit Qwebchess before fucking with it
[progcomp2013.git] / qchess / src / main.py
index 137d1cb..6ebf70c 100644 (file)
@@ -16,6 +16,7 @@ import os
 import time
 
 turn_delay = 0.5
+sleep_timeout = None
 [game, graphics] = [None, None]
 
 def make_player(name, colour):
@@ -24,10 +25,22 @@ def make_player(name, colour):
                        return HumanPlayer(name, colour)
                s = name[1:].split(":")
                if s[0] == "network":
-                       address = None
+                       ip = None
+                       port = 4562
+                       #print str(s)
                        if len(s) > 1:
-                               address = s[1]
-                       return NetworkReceiver(colour, address)
+                               if s[1] != "":
+                                       ip = s[1]
+                       if len(s) > 2:
+                               port = int(s[2])
+                               
+                       if ip == None:
+                               if colour == "black":
+                                       port += 1
+                       elif colour == "white":
+                               port += 1
+                                               
+                       return NetworkPlayer(colour, Network((ip, port)), None)
                if s[0] == "internal":
 
                        import inspect
@@ -47,7 +60,11 @@ def make_player(name, colour):
                        sys.stderr.write(sys.argv[0] + " : Can't find an internal agent matching \"" + s[1] + "\"\n")
                        sys.stderr.write(sys.argv[0] + " : Choices are: " + str(map(lambda e : e[0], internal_agents)) + "\n")
                        return None
-                       
+               if s[0] == "fifo":
+                       if len(s) > 1:
+                               return FifoPlayer(s[1], colour)
+                       else:
+                               return FifoPlayer(str(os.getpid())+"."+colour, colour)
 
        else:
                return ExternalAgent(name, colour)
@@ -64,12 +81,16 @@ def main(argv):
        
        global turn_delay
        global agent_timeout
-       global log_file
+       global log_files
        global src_file
        global graphics_enabled
        global always_reveal_states
+       global sleep_timeout
+
+
+       server_addr = None
 
-       max_lines = None
+       max_moves = None
        src_file = None
        
        style = "quantum"
@@ -109,23 +130,42 @@ def main(argv):
                elif arg[1] == '-' and arg[2:] == "reveal":
                        always_reveal_states = True
                elif (arg[1] == '-' and arg[2:] == "graphics"):
-                       graphics_enabled = not graphics_enabled
+                       graphics_enabled = True
+               elif (arg[1] == '-' and arg[2:] == "no-graphics"):
+                       graphics_enabled = False
                elif (arg[1] == '-' and arg[2:].split("=")[0] == "file"):
                        # Load game from file
                        if len(arg[2:].split("=")) == 1:
                                src_file = sys.stdin
                        else:
-                               src_file = open(arg[2:].split("=")[1].split(":")[0])
-
-                       if len(arg[2:].split(":")) == 2:
-                               max_lines = int(arg[2:].split(":")[1])
-
+                               f = arg[2:].split("=")[1]
+                               if f[0:7] == "http://":
+                                       src_file = HttpReplay(f)
+                               else:
+                                       src_file = FileReplay(f.split(":")[0])
+
+                                       if len(f.split(":")) == 2:
+                                               max_moves = int(f.split(":")[1])
+                                               
+               elif (arg[1] == '-' and arg[2:].split("=")[0] == "server"):
+                       #debug("Server: " + str(arg[2:]))
+                       if len(arg[2:].split("=")) <= 1:
+                               server_addr = True
+                       else:
+                               server_addr = arg[2:].split("=")[1]
+                       
                elif (arg[1] == '-' and arg[2:].split("=")[0] == "log"):
                        # Log file
                        if len(arg[2:].split("=")) == 1:
-                               log_file = sys.stdout
+                               log_files.append(LogFile(sys.stdout,""))
                        else:
-                               log_file = open(arg[2:].split("=")[1], "w")
+                               f = arg[2:].split("=")[1]
+                               if f == "":
+                                       log_files.append(LogFile(sys.stdout, ""))
+                               elif f[0] == '@':
+                                       log_files.append(ShortLog(f[1:]))
+                               else:
+                                       log_files.append(LogFile(open(f, "w", 0), f))
                elif (arg[1] == '-' and arg[2:].split("=")[0] == "delay"):
                        # Delay
                        if len(arg[2:].split("=")) == 1:
@@ -139,12 +179,34 @@ def main(argv):
                                agent_timeout = -1
                        else:
                                agent_timeout = float(arg[2:].split("=")[1])
+               elif (arg[1] == '-' and arg[2:].split("=")[0] == "blackout"):
+                       # Screen saver delay
+                       if len(arg[2:].split("=")) == 1:
+                               sleep_timeout = -1
+                       else:
+                               sleep_timeout = float(arg[2:].split("=")[1])
                                
                elif (arg[1] == '-' and arg[2:] == "help"):
                        # Help
                        os.system("less data/help.txt") # The best help function
                        return 0
-
+               
+       # Dedicated server?
+       
+       #debug("server_addr = " + str(server_addr))
+       
+       if server_addr != None:
+               if server_addr == True:
+                       return dedicated_server()
+               else:
+                       if len(players) > 1:
+                               sys.stderr.write("Only a single player may be provided when --server is used\n")
+                               return 1
+                       if len(players) == 1:
+                               return client(server_addr, players[0].name)
+                       else:
+                               return client(server_addr)
+               
 
        # Create the board
        
@@ -165,17 +227,21 @@ def main(argv):
                        if graphics_enabled:
                                sys.stderr.write(sys.argv[0] + " : (You won't get a GUI, because --file was used, and the author is lazy)\n")
                        return 44
-               game = ReplayThread(players, src_file, end=end, max_lines=max_lines)
+               game = ReplayThread(players, src_file, end=end, max_moves=max_moves)
        else:
                board = Board(style)
+               board.max_moves = max_moves
                game = GameThread(board, players) 
 
 
 
+
        # Initialise GUI
        if graphics_enabled == True:
                try:
                        graphics = GraphicsThread(game.board, grid_sz = [64,64]) # Construct a GraphicsThread!
+                       
+                       graphics.sleep_timeout = sleep_timeout
 
                except Exception,e:
                        graphics = None
@@ -185,6 +251,15 @@ def main(argv):
        # If there are no players listed, display a nice pretty menu
        if len(players) != 2:
                if graphics != None:
+                       
+                       server_addr = graphics.SelectServer()
+                       if server_addr != None:
+                               pygame.quit() # Time to say goodbye
+                               if server_addr == True:
+                                       return dedicated_server()
+                               else:
+                                       return client(server_addr)      
+                       
                        players = graphics.SelectPlayers(players)
                else:
                        sys.stderr.write(sys.argv[0] + " : Usage " + sys.argv[0] + " white black\n")
@@ -195,27 +270,23 @@ def main(argv):
                sys.stderr.write(sys.argv[0] + " : Graphics window closed before players chosen\n")
                return 45
 
-
-       # Wrap NetworkSender players around original players if necessary
-       for i in range(len(players)):
-               if isinstance(players[i], NetworkReceiver):
-                       players[i].board = board # Network players need direct access to the board
-                       for j in range(len(players)):
-                               if j == i:
+       old = players[:]
+       for p in old:
+               if isinstance(p, NetworkPlayer):
+                       for i in range(len(old)):
+                               if old[i] == p or isinstance(old[i], NetworkPlayer):
                                        continue
-                               if isinstance(players[j], NetworkSender) or isinstance(players[j], NetworkReceiver):
-                                       continue
-                               players[j] = NetworkSender(players[j], players[i].address)
-                               players[j].board = board
-
-       # Connect the networked players
+                               players[i] = NetworkPlayer(old[i].colour, p.network, old[i])
+               
        for p in players:
-               if isinstance(p, NetworkSender) or isinstance(p, NetworkReceiver):
-                       if graphics != None:
-                               graphics.board.display_grid(graphics.window, graphics.grid_sz)
-                               graphics.message("Connecting to " + p.colour + " player...")
-                       p.connect()
-
+               #debug(str(p))
+               if isinstance(p, NetworkPlayer):
+                       p.board = game.board
+                       if not p.network.connected:
+                               if not p.network.server:
+                                       time.sleep(0.2)
+                               p.network.connect()
+                               
        
        # If using windows, select won't work; use horrible TimeoutPlayer hack
        if agent_timeout > 0:
@@ -254,19 +325,28 @@ def main(argv):
                error = game.error
        
 
-       if log_file != None and log_file != sys.stdout:
-               log_file.write("# EOF\n")
-               log_file.close()
+       for l in log_files:
+               l.close()
 
        if src_file != None and src_file != sys.stdin:
                src_file.close()
 
+       sys.stdout.write(game.final_result + "\n")
+
        return error
+               
+               
+       
+               
+       
+               
+               
 
 # This is how python does a main() function...
 if __name__ == "__main__":
+       retcode = 0
        try:
-               sys.exit(main(sys.argv))
+               retcode = main(sys.argv)
        except KeyboardInterrupt:
                sys.stderr.write(sys.argv[0] + " : Got KeyboardInterrupt. Stopping everything\n")
                if isinstance(graphics, StoppableThread):
@@ -277,6 +357,19 @@ if __name__ == "__main__":
                        game.stop()
                        if game.is_alive():
                                game.join()
-
-               sys.exit(102)
+               retcode = 102
+       #except Exception, e:
+       #       sys.stderr.write(sys.argv[0] + " : " + e.message + "\n")
+       #       retcode = 103   
+               
+       try:
+               sys.stdout.close()
+       except:
+               pass
+       try:
+               sys.stderr.close()
+       except:
+               pass
+       sys.exit(retcode)
+               
 

UCC git Repository :: git.ucc.asn.au