1- from threading import Lock
2- from typing import List
1+ from typing import Tuple
32import grpc
43from concurrent import futures
54
109from ScriptsOfTribute .enums import PatronId
1110
1211class AIService (main_pb2_grpc .AIServiceServicer ):
13- def __init__ (self , ai : BaseAI , server_instance ):
12+ def __init__ (self , ai : BaseAI , server_instance , engine_service_port : int ):
1413 self .ai = ai
1514 self .server_instance = server_instance
15+ self .engine_service_port = engine_service_port
1616 self .engine_service_stub = None
1717
18- def set_engine_service_stub (self , stub ):
19- self .engine_service_stub = stub
20-
2118 def RegisterBot (self , request , context ):
19+ engine_service_channel1 = grpc .insecure_channel (f"localhost:{ self .engine_service_port } " )
20+ self .engine_service_stub = main_pb2_grpc .EngineServiceStub (engine_service_channel1 )
21+ print (f"Registering { self .ai .bot_name } " )
22+ print (f"localhost:{ self .engine_service_port } " )
2223 return main_pb2 .RegistrationStatus (name = self .ai .bot_name , message = "" )
2324
2425 def PregamePrepare (self , request , context ):
@@ -32,10 +33,11 @@ def SelectPatron(self, request, context):
3233
3334 def Play (self , request , context ):
3435 game_state = build_game_state (request .gameState , self .engine_service_stub )
35- # game_state.debug_print()
36+ #game_state.debug_print()
3637 moves = [from_proto_move (proto_move ) for proto_move in request .possibleMoves ]
37- move = self .ai .play (game_state , moves )
38- return move .to_proto ()
38+ move = self .ai .play (game_state , moves , request .remainingTimeMs ).to_proto ()
39+ # print(move)
40+ return move
3941
4042 def GameEnd (self , request , context ):
4143 self .ai .game_end (request )
@@ -53,36 +55,54 @@ class Server:
5355
5456 def __init__ (self ):
5557 self .active_bots = 0
58+ self .server = None
5659 def add_bot (self ):
5760 self .active_bots += 1
58- print (f"Bot connected. Active bots: { self .active_bots } " )
61+ # print(f"Bot connected. Active bots: {self.active_bots}")
5962
6063 def bot_disconnected (self ):
6164 self .active_bots -= 1
62- print (f"Bot disconnected. Active bots: { self .active_bots } " )
65+ # print(f"Bot disconnected. Active bots: {self.active_bots}")
6366 if self .active_bots == 0 :
6467 self .shutdown_server ()
6568
6669 def shutdown_server (self ):
6770 if self .server :
68- print ("No active bots. Shutting down the server..." )
71+ # print("No active bots. Shutting down the server...")
6972 self .server .stop (0 )
7073 else :
7174 print ("Server is already stopped." )
7275
73- def run_grpc_server (self , ai_instances : List [BaseAI ], port = 50000 , debug_prints = True ):
74- self .server = grpc .server (futures .ThreadPoolExecutor (max_workers = 10 ))
75- for i , ai in enumerate (ai_instances ):
76- self .add_bot ()
77- ai_service = AIService (ai , self )
78- assigned_port = port + i
79- self .server .add_insecure_port (f"localhost:{ assigned_port } " )
80- engine_service_channel = grpc .insecure_channel (f"localhost:{ assigned_port } " )
81- engine_service_stub = main_pb2_grpc .EngineServiceStub (engine_service_channel )
82- if debug_prints :
83- print (f"Bot { ai .bot_name } listening on localhost:{ assigned_port } " )
84- ai_service .set_engine_service_stub (engine_service_stub )
76+ def run_grpc_server (
77+ bot1 : BaseAI | None ,
78+ bot2 : BaseAI | None ,
79+ base_client_ports : Tuple [int , int ]= (50000 , 50001 ),
80+ base_server_ports : Tuple [int , int ]= (49000 , 49001 ),
81+ debug_prints = True
82+ ):
83+ if bot1 is not None :
84+ server1 = Server ()
85+ server1 .server = grpc .server (futures .ThreadPoolExecutor (max_workers = 5 ))
86+ server1 .add_bot ()
87+ ai_service1 = AIService (bot1 , server1 , base_server_ports [0 ])
88+ server1 .server .add_insecure_port (f"localhost:{ base_client_ports [0 ]} " )
89+ main_pb2_grpc .add_AIServiceServicer_to_server (ai_service1 , server1 .server )
90+ if debug_prints :
91+ print (f"Bot { bot1 .bot_name } listening on localhost:{ base_client_ports [0 ]} , channel for engine service open on: { base_server_ports [0 ]} " )
92+ server1 .server .start ()
93+
94+ if bot2 is not None :
95+ server2 = Server ()
96+ server2 .server = grpc .server (futures .ThreadPoolExecutor (max_workers = 5 ))
97+ server2 .add_bot ()
98+ ai_service2 = AIService (bot2 , server2 , base_server_ports [1 ])
99+ server2 .server .add_insecure_port (f"localhost:{ base_client_ports [1 ]} " )
100+ main_pb2_grpc .add_AIServiceServicer_to_server (ai_service2 , server2 .server )
101+ if debug_prints :
102+ print (f"Bot { bot2 .bot_name } listening on localhost:{ base_client_ports [1 ]} , channel for engine service open on: { base_server_ports [1 ]} " )
103+ server2 .server .start ()
85104
86- main_pb2_grpc .add_AIServiceServicer_to_server (ai_service , self .server )
87- self .server .start ()
88- return self .server
105+ if bot1 is not None :
106+ server1 .server .wait_for_termination ()
107+ if bot2 is not None :
108+ server2 .server .wait_for_termination ()
0 commit comments