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.3 kB

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