You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

Communication.py 7.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import PyAPI.structures as THUAI6
  2. from PyAPI.AI import Setting
  3. from PyAPI.utils import THUAI62Proto
  4. from PyAPI.Interface import IErrorHandler
  5. import proto.Services_pb2_grpc as Services
  6. import proto.Message2Clients_pb2 as Message2Clients
  7. import threading
  8. import grpc
  9. from queue import Queue
  10. # 使用gRPC的异步来减少通信对于选手而言损失的时间,而gRPC的return值有result()方法,故若连接错误时也应当返回一个具有result()方法的对象,使用此处的ErrorHandler类来实现
  11. class BoolErrorHandler(IErrorHandler):
  12. @staticmethod
  13. def result():
  14. return False
  15. class Communication:
  16. __THUAI6Stub: Services.AvailableServiceStub
  17. __haveNewMessage: bool
  18. __message2Client: Message2Clients.MessageToClient
  19. __messageQueue: Queue # Python的Queue是线程安全的,故无须自己实现Queue
  20. __mtxMessage: threading.Lock
  21. __cvMessage: threading.Condition
  22. def __init__(self, sIP: str, sPort: str):
  23. aim = sIP + ':' + sPort
  24. channel = grpc.insecure_channel(aim)
  25. self.__THUAI6Stub = Services.AvailableServiceStub(channel)
  26. self.__haveNewMessage = False
  27. self.__messageQueue = Queue()
  28. self.__cvMessage = threading.Condition()
  29. def Move(self, time: int, angle: float, playerID: int) -> bool:
  30. try:
  31. moveResult = self.__THUAI6Stub.Move(
  32. THUAI62Proto.THUAI62ProtobufMove(time, angle, playerID))
  33. except grpc.RpcError as e:
  34. return False
  35. else:
  36. return moveResult.act_success
  37. def PickProp(self, propType: THUAI6.PropType, playerID: int) -> bool:
  38. try:
  39. pickResult = self.__THUAI6Stub.PickProp(
  40. THUAI62Proto.THUAI62ProtobufPick(propType, playerID))
  41. except grpc.RpcError as e:
  42. return False
  43. else:
  44. return pickResult.act_success
  45. def UseProp(self, playerID: int):
  46. try:
  47. useResult = self.__THUAI6Stub.UseProp(
  48. THUAI62Proto.THUAI62ProtobufID(playerID))
  49. except grpc.RpcError as e:
  50. return False
  51. else:
  52. return useResult.act_success
  53. def UseSkill(self, playerID: int) -> bool:
  54. try:
  55. useResult = self.__THUAI6Stub.UseSkill(
  56. THUAI62Proto.THUAI62ProtobufID(playerID))
  57. except grpc.RpcError as e:
  58. return False
  59. else:
  60. return useResult.act_success
  61. def SendMessage(self, toID: int, message: str, playerID: int) -> bool:
  62. try:
  63. sendResult = self.__THUAI6Stub.SendMessage(
  64. THUAI62Proto.THUAI62ProtobufSend(message, toID, playerID))
  65. except grpc.RpcError as e:
  66. return False
  67. else:
  68. return sendResult.act_success
  69. def HaveMessage(self) -> bool:
  70. return not self.__messageQueue.empty()
  71. def GetMessage(self) -> tuple[int, str]:
  72. try:
  73. message = self.__messageQueue.get_nowait()
  74. except Exception as e:
  75. return -1, ''
  76. else:
  77. return message
  78. def ReadMessage(self, playerID: int) -> None:
  79. def tRead():
  80. try:
  81. for msg in self.__THUAI6Stub.GetMessage(
  82. THUAI62Proto.THUAI62ProtobufID(playerID)):
  83. self.__messageQueue.put(
  84. (msg.from_player_id, msg.message_received))
  85. except grpc.RpcError as e:
  86. return
  87. threading.Thread(target=tRead).start()
  88. def Graduate(self, playerID: int) -> bool:
  89. try:
  90. escapeResult = self.__THUAI6Stub.Graduate(
  91. THUAI62Proto.THUAI62ProtobufID(playerID))
  92. except grpc.RpcError as e:
  93. return False
  94. else:
  95. return escapeResult.act_success
  96. def StartLearning(self, playerID: int) -> bool:
  97. try:
  98. learnResult = self.__THUAI6Stub.StartLearning(
  99. THUAI62Proto.THUAI62ProtobufID(playerID))
  100. except grpc.RpcError as e:
  101. return False
  102. else:
  103. return learnResult.act_success
  104. def EndLearning(self, playerID: int) -> bool:
  105. try:
  106. learnResult = self.__THUAI6Stub.EndLearning(
  107. THUAI62Proto.THUAI62ProtobufID(playerID))
  108. except grpc.RpcError as e:
  109. return False
  110. else:
  111. return learnResult.act_success
  112. def StartHelpMate(self, playerID: int) -> bool:
  113. try:
  114. helpResult = self.__THUAI6Stub.StartHelpMate(
  115. THUAI62Proto.THUAI62ProtobufID(playerID))
  116. except grpc.RpcError as e:
  117. return False
  118. else:
  119. return helpResult.act_success
  120. def EndHelpMate(self, playerID: int) -> bool:
  121. try:
  122. helpResult = self.__THUAI6Stub.EndHelpMate(
  123. THUAI62Proto.THUAI62ProtobufID(playerID))
  124. except grpc.RpcError as e:
  125. return False
  126. else:
  127. return helpResult.act_success
  128. def Trick(self, angle: float, playerID: int) -> bool:
  129. try:
  130. trickResult = self.__THUAI6Stub.Trick(
  131. THUAI62Proto.THUAI62ProtobufTrick(angle, playerID))
  132. except grpc.RpcError as e:
  133. return False
  134. else:
  135. return trickResult.act_success
  136. def StartExam(self, playerID: int) -> bool:
  137. try:
  138. carryResult = self.__THUAI6Stub.StartExam(
  139. THUAI62Proto.THUAI62ProtobufID(playerID))
  140. except grpc.RpcError as e:
  141. return False
  142. else:
  143. return carryResult.act_success
  144. def EndExam(self, playerID: int) -> bool:
  145. try:
  146. releaseResult = self.__THUAI6Stub.EndExam(
  147. THUAI62Proto.THUAI62ProtobufID(playerID))
  148. except grpc.RpcError as e:
  149. return False
  150. else:
  151. return releaseResult.act_success
  152. def MakeFail(self, playerID: int) -> bool:
  153. try:
  154. hangResult = self.__THUAI6Stub.MakeFail(
  155. THUAI62Proto.THUAI62ProtobufID(playerID))
  156. except grpc.RpcError as e:
  157. return False
  158. else:
  159. return hangResult.act_success
  160. def TryConnection(self, playerID: int) -> bool:
  161. try:
  162. connectResult = self.__THUAI6Stub.TryConnection(
  163. THUAI62Proto.THUAI62ProtobufID(playerID))
  164. except grpc.RpcError as e:
  165. return False
  166. else:
  167. return True
  168. def GetMessage2Client(self) -> Message2Clients.MessageToClient:
  169. with self.__cvMessage:
  170. self.__cvMessage.wait_for(lambda: self.__haveNewMessage)
  171. self.__haveNewMessage = False
  172. return self.__message2Client
  173. def AddPlayer(self, playerID: int) -> None:
  174. def tMessage():
  175. try:
  176. playerMsg = THUAI62Proto.THUAI62ProtobufPlayer(
  177. playerID, Setting.playerType(), Setting.studentType(), Setting.trickerType())
  178. for msg in self.__THUAI6Stub.AddPlayer(playerMsg):
  179. with self.__cvMessage:
  180. self.__haveNewMessage = True
  181. self.__message2Client = msg
  182. self.__cvMessage.notify()
  183. except grpc.RpcError as e:
  184. return
  185. threading.Thread(target=tMessage).start()