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 8.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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 StartTreatMate(self, playerID: int) -> bool:
  105. try:
  106. helpResult = self.__THUAI6Stub.StartTreatMate(
  107. THUAI62Proto.THUAI62ProtobufID(playerID))
  108. except grpc.RpcError as e:
  109. return False
  110. else:
  111. return helpResult.act_success
  112. def StartRescueMate(self, playerID: int) -> bool:
  113. try:
  114. helpResult = self.__THUAI6Stub.StartRescueMate(
  115. THUAI62Proto.THUAI62ProtobufID(playerID))
  116. except grpc.RpcError as e:
  117. return False
  118. else:
  119. return helpResult.act_success
  120. def Attack(self, angle: float, playerID: int) -> bool:
  121. try:
  122. attackResult = self.__THUAI6Stub.Attack(
  123. THUAI62Proto.THUAI62ProtobufTrick(angle, playerID))
  124. except grpc.RpcError as e:
  125. return False
  126. else:
  127. return attackResult.act_success
  128. def OpenDoor(self, playerID: int) -> bool:
  129. try:
  130. openResult = self.__THUAI6Stub.OpenDoor(
  131. THUAI62Proto.THUAI62ProtobufID(playerID))
  132. except grpc.RpcError as e:
  133. return False
  134. else:
  135. return openResult.act_success
  136. def CloseDoor(self, playerID: int) -> bool:
  137. try:
  138. closeResult = self.__THUAI6Stub.CloseDoor(
  139. THUAI62Proto.THUAI62ProtobufID(playerID))
  140. except grpc.RpcError as e:
  141. return False
  142. else:
  143. return closeResult.act_success
  144. def SkipWindow(self, playerID: int) -> bool:
  145. try:
  146. skipResult = self.__THUAI6Stub.SkipWindow(
  147. THUAI62Proto.THUAI62ProtobufID(playerID))
  148. except grpc.RpcError as e:
  149. return False
  150. else:
  151. return skipResult.act_success
  152. def StartOpenGate(self, playerID: int) -> bool:
  153. try:
  154. openResult = self.__THUAI6Stub.StartOpenGate(
  155. THUAI62Proto.THUAI62ProtobufID(playerID))
  156. except grpc.RpcError as e:
  157. return False
  158. else:
  159. return openResult.act_success
  160. def StartOpenChest(self, playerID: int) -> bool:
  161. try:
  162. openResult = self.__THUAI6Stub.StartOpenChest(
  163. THUAI62Proto.THUAI62ProtobufID(playerID))
  164. except grpc.RpcError as e:
  165. return False
  166. else:
  167. return openResult.act_success
  168. def EndAllAction(self, playerID: int) -> bool:
  169. try:
  170. endResult = self.__THUAI6Stub.EndAllAction(
  171. THUAI62Proto.THUAI62ProtobufID(playerID))
  172. except grpc.RpcError as e:
  173. return False
  174. else:
  175. return endResult.act_success
  176. def TryConnection(self, playerID: int) -> bool:
  177. try:
  178. connectResult = self.__THUAI6Stub.TryConnection(
  179. THUAI62Proto.THUAI62ProtobufID(playerID))
  180. except grpc.RpcError as e:
  181. return False
  182. else:
  183. return True
  184. def GetMessage2Client(self) -> Message2Clients.MessageToClient:
  185. with self.__cvMessage:
  186. self.__cvMessage.wait_for(lambda: self.__haveNewMessage)
  187. self.__haveNewMessage = False
  188. return self.__message2Client
  189. def AddPlayer(self, playerID: int) -> None:
  190. def tMessage():
  191. try:
  192. playerMsg = THUAI62Proto.THUAI62ProtobufPlayer(
  193. playerID, Setting.playerType(), Setting.studentType(), Setting.trickerType())
  194. for msg in self.__THUAI6Stub.AddPlayer(playerMsg):
  195. with self.__cvMessage:
  196. self.__haveNewMessage = True
  197. self.__message2Client = msg
  198. self.__cvMessage.notify()
  199. except grpc.RpcError as e:
  200. return
  201. threading.Thread(target=tMessage).start()