Dedicated server stuff should now work
[progcomp2013.git] / qchess / src / main.py
index a4fc574..ea50a1f 100644 (file)
@@ -25,10 +25,22 @@ def make_player(name, colour):
                        return HumanPlayer(name, colour)
                s = name[1:].split(":")
                if s[0] == "network":
-                       address = (None, 4562)
+                       ip = None
+                       port = 4562
+                       #print str(s)
                        if len(s) > 1:
-                               address = (s[1], 4562)
-                       return Network(colour, address, baseplayer = None)
+                               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
@@ -71,6 +83,9 @@ def main(argv):
        global always_reveal_states
        global sleep_timeout
 
+
+       server_addr = None
+
        max_moves = None
        src_file = None
        
@@ -127,17 +142,26 @@ def main(argv):
 
                                        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_files.append(LogFile(sys.stdout))
+                               log_files.append(LogFile(sys.stdout,""))
                        else:
                                f = arg[2:].split("=")[1]
-                               if f[0] == '@':
+                               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)))
+                                       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:
@@ -162,7 +186,17 @@ def main(argv):
                        # 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:
+                       return client(server_addr)
+               
 
        # Create the board
        
@@ -207,6 +241,14 @@ 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:
+                               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")
@@ -217,27 +259,22 @@ def main(argv):
                sys.stderr.write(sys.argv[0] + " : Graphics window closed before players chosen\n")
                return 45
 
-
-       # Wrap Networks players around original players if necessary
-       for i in range(len(players)):
-               if isinstance(players[i], Network) and players[i].baseplayer == None:
-                       for j in range(len(players)):
-                               if i == j:
+       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
-                                       
-                               port = players[i].address[1]
-                               if players[j].colour == "black" and players[i].colour == "white":
-                                       pass
-                               elif players[j].colour == "white" and players[i].colour == "black":
-                                       port -= 1
-                               players[j] = Network(players[j].colour, (players[i].address[0], port), baseplayer = players[j])
-                       
-                       
+                               players[i] = NetworkPlayer(old[i].colour, p.network, old[i])
+               
        for p in players:
-               if isinstance(p, Network):
-                       if p.address[0] != None:
-                               time.sleep(0.2)
-                       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
@@ -286,11 +323,19 @@ def main(argv):
        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):
@@ -301,6 +346,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