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.cpp 8.2 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. #include "Communication.h"
  2. #include "utils.hpp"
  3. #include "structures.h"
  4. #include <thread>
  5. #include <mutex>
  6. #include <condition_variable>
  7. using grpc::ClientContext;
  8. Communication::Communication(std::string sIP, std::string sPort)
  9. {
  10. std::string aim = sIP + ':' + sPort;
  11. auto channel = grpc::CreateChannel(aim, grpc::InsecureChannelCredentials());
  12. THUAI6Stub = protobuf::AvailableService::NewStub(channel);
  13. }
  14. bool Communication::Move(int64_t time, double angle, int64_t playerID)
  15. {
  16. protobuf::MoveRes moveResult;
  17. ClientContext context;
  18. auto request = THUAI62Proto::THUAI62ProtobufMove(time, angle, playerID);
  19. auto status = THUAI6Stub->Move(&context, request, &moveResult);
  20. if (status.ok())
  21. return moveResult.act_success();
  22. else
  23. return false;
  24. }
  25. bool Communication::PickProp(THUAI6::PropType prop, int64_t playerID)
  26. {
  27. protobuf::BoolRes pickPropResult;
  28. ClientContext context;
  29. auto request = THUAI62Proto::THUAI62ProtobufProp(prop, playerID);
  30. auto status = THUAI6Stub->PickProp(&context, request, &pickPropResult);
  31. if (status.ok())
  32. return pickPropResult.act_success();
  33. else
  34. return false;
  35. }
  36. bool Communication::UseProp(THUAI6::PropType prop, int64_t playerID)
  37. {
  38. protobuf::BoolRes usePropResult;
  39. ClientContext context;
  40. auto request = THUAI62Proto::THUAI62ProtobufProp(prop, playerID);
  41. auto status = THUAI6Stub->UseProp(&context, request, &usePropResult);
  42. if (status.ok())
  43. return usePropResult.act_success();
  44. else
  45. return false;
  46. }
  47. bool Communication::ThrowProp(THUAI6::PropType prop, int64_t playerID)
  48. {
  49. protobuf::BoolRes throwPropResult;
  50. ClientContext context;
  51. auto request = THUAI62Proto::THUAI62ProtobufProp(prop, playerID);
  52. auto status = THUAI6Stub->ThrowProp(&context, request, &throwPropResult);
  53. if (status.ok())
  54. return throwPropResult.act_success();
  55. else
  56. return false;
  57. }
  58. bool Communication::UseSkill(int32_t skillID, int64_t playerID)
  59. {
  60. protobuf::BoolRes useSkillResult;
  61. ClientContext context;
  62. auto request = THUAI62Proto::THUAI62ProtobufSkill(skillID, playerID);
  63. auto status = THUAI6Stub->UseSkill(&context, request, &useSkillResult);
  64. if (status.ok())
  65. return useSkillResult.act_success();
  66. else
  67. return false;
  68. }
  69. bool Communication::SendMessage(int64_t toID, std::string message, int64_t playerID)
  70. {
  71. protobuf::BoolRes sendMessageResult;
  72. ClientContext context;
  73. auto request = THUAI62Proto::THUAI62ProtobufSend(message, toID, playerID);
  74. auto status = THUAI6Stub->SendMessage(&context, request, &sendMessageResult);
  75. if (status.ok())
  76. return sendMessageResult.act_success();
  77. else
  78. return false;
  79. }
  80. bool Communication::OpenDoor(int64_t playerID)
  81. {
  82. protobuf::BoolRes openDoorResult;
  83. ClientContext context;
  84. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  85. auto status = THUAI6Stub->OpenDoor(&context, request, &openDoorResult);
  86. if (status.ok())
  87. return openDoorResult.act_success();
  88. else
  89. return false;
  90. }
  91. bool Communication::CloseDoor(int64_t playerID)
  92. {
  93. protobuf::BoolRes closeDoorResult;
  94. ClientContext context;
  95. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  96. auto status = THUAI6Stub->CloseDoor(&context, request, &closeDoorResult);
  97. if (status.ok())
  98. return closeDoorResult.act_success();
  99. else
  100. return false;
  101. }
  102. bool Communication::SkipWindow(int64_t playerID)
  103. {
  104. protobuf::BoolRes skipWindowResult;
  105. ClientContext context;
  106. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  107. auto status = THUAI6Stub->SkipWindow(&context, request, &skipWindowResult);
  108. if (status.ok())
  109. return skipWindowResult.act_success();
  110. else
  111. return false;
  112. }
  113. bool Communication::StartOpenGate(int64_t playerID)
  114. {
  115. protobuf::BoolRes startOpenGateResult;
  116. ClientContext context;
  117. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  118. auto status = THUAI6Stub->StartOpenGate(&context, request, &startOpenGateResult);
  119. if (status.ok())
  120. return startOpenGateResult.act_success();
  121. else
  122. return false;
  123. }
  124. bool Communication::StartOpenChest(int64_t playerID)
  125. {
  126. protobuf::BoolRes startOpenChestResult;
  127. ClientContext context;
  128. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  129. auto status = THUAI6Stub->StartOpenChest(&context, request, &startOpenChestResult);
  130. if (status.ok())
  131. return startOpenChestResult.act_success();
  132. else
  133. return false;
  134. }
  135. bool Communication::EndAllAction(int64_t playerID)
  136. {
  137. protobuf::BoolRes endAllActionResult;
  138. ClientContext context;
  139. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  140. auto status = THUAI6Stub->EndAllAction(&context, request, &endAllActionResult);
  141. if (status.ok())
  142. return endAllActionResult.act_success();
  143. else
  144. return false;
  145. }
  146. bool Communication::Graduate(int64_t playerID)
  147. {
  148. protobuf::BoolRes graduateResult;
  149. ClientContext context;
  150. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  151. auto status = THUAI6Stub->Graduate(&context, request, &graduateResult);
  152. if (status.ok())
  153. return graduateResult.act_success();
  154. else
  155. return false;
  156. }
  157. bool Communication::StartLearning(int64_t playerID)
  158. {
  159. protobuf::BoolRes startLearningResult;
  160. ClientContext context;
  161. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  162. auto status = THUAI6Stub->StartLearning(&context, request, &startLearningResult);
  163. if (status.ok())
  164. return startLearningResult.act_success();
  165. else
  166. return false;
  167. }
  168. bool Communication::StartRouseMate(int64_t playerID, int64_t mateID)
  169. {
  170. protobuf::BoolRes saveStudentResult;
  171. ClientContext context;
  172. auto request = THUAI62Proto::THUAI62ProtobufTreatAndRescue(playerID, mateID);
  173. auto status = THUAI6Stub->StartRescueMate(&context, request, &saveStudentResult);
  174. if (status.ok())
  175. return saveStudentResult.act_success();
  176. else
  177. return false;
  178. }
  179. bool Communication::StartEncourageMate(int64_t playerID, int64_t mateID)
  180. {
  181. protobuf::BoolRes healStudentResult;
  182. ClientContext context;
  183. auto request = THUAI62Proto::THUAI62ProtobufTreatAndRescue(playerID, mateID);
  184. auto status = THUAI6Stub->StartTreatMate(&context, request, &healStudentResult);
  185. if (status.ok())
  186. return healStudentResult.act_success();
  187. else
  188. return false;
  189. }
  190. bool Communication::Attack(double angle, int64_t playerID)
  191. {
  192. protobuf::BoolRes attackResult;
  193. ClientContext context;
  194. auto request = THUAI62Proto::THUAI62ProtobufAttack(angle, playerID);
  195. auto status = THUAI6Stub->Attack(&context, request, &attackResult);
  196. if (status.ok())
  197. return attackResult.act_success();
  198. else
  199. return false;
  200. }
  201. bool Communication::TryConnection(int64_t playerID)
  202. {
  203. protobuf::BoolRes reply;
  204. ClientContext context;
  205. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  206. auto status = THUAI6Stub->TryConnection(&context, request, &reply);
  207. if (status.ok())
  208. {
  209. return true;
  210. }
  211. else
  212. return false;
  213. }
  214. protobuf::MessageToClient Communication::GetMessage2Client()
  215. {
  216. std::unique_lock<std::mutex> lock(mtxMessage);
  217. cvMessage.wait(lock, [this]()
  218. { return haveNewMessage; });
  219. haveNewMessage = false;
  220. return message2Client;
  221. }
  222. void Communication::AddPlayer(int64_t playerID, THUAI6::PlayerType playerType, THUAI6::StudentType studentType, THUAI6::TrickerType trickerType)
  223. {
  224. auto tMessage = [=]()
  225. {
  226. protobuf::PlayerMsg playerMsg = THUAI62Proto::THUAI62ProtobufPlayer(playerID, playerType, studentType, trickerType);
  227. grpc::ClientContext context;
  228. auto MessageReader = THUAI6Stub->AddPlayer(&context, playerMsg);
  229. while (MessageReader->Read(&message2Client))
  230. {
  231. {
  232. std::lock_guard<std::mutex> lock(mtxMessage);
  233. haveNewMessage = true;
  234. }
  235. cvMessage.notify_one();
  236. }
  237. };
  238. std::thread(tMessage).detach();
  239. }