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

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