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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. #include "Communication.h"
  2. #include "utils.hpp"
  3. #include "structures.h"
  4. #include <thread>
  5. using grpc::ClientContext;
  6. Communication::Communication(std::string sIP, std::string sPort)
  7. {
  8. std::string aim = sIP + ':' + sPort;
  9. auto channel = grpc::CreateChannel(aim, grpc::InsecureChannelCredentials());
  10. THUAI6Stub = protobuf::AvailableService::NewStub(channel);
  11. }
  12. bool Communication::Move(int64_t time, double angle, int64_t playerID)
  13. {
  14. protobuf::MoveRes moveResult;
  15. ClientContext context;
  16. auto request = THUAI62Proto::THUAI62ProtobufMove(time, angle, playerID);
  17. std::cout << "Move request sent" << std::endl;
  18. auto status = THUAI6Stub->Move(&context, request, &moveResult);
  19. if (status.ok())
  20. return moveResult.act_success();
  21. else
  22. return false;
  23. }
  24. bool Communication::PickProp(THUAI6::PropType prop, int64_t playerID)
  25. {
  26. protobuf::BoolRes pickPropResult;
  27. ClientContext context;
  28. auto request = THUAI62Proto::THUAI62ProtobufPick(prop, playerID);
  29. auto status = THUAI6Stub->PickProp(&context, request, &pickPropResult);
  30. if (status.ok())
  31. return pickPropResult.act_success();
  32. else
  33. return false;
  34. }
  35. bool Communication::UseProp(int64_t playerID)
  36. {
  37. protobuf::BoolRes usePropResult;
  38. ClientContext context;
  39. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  40. auto status = THUAI6Stub->UseProp(&context, request, &usePropResult);
  41. if (status.ok())
  42. return usePropResult.act_success();
  43. else
  44. return false;
  45. }
  46. bool Communication::UseSkill(int64_t playerID)
  47. {
  48. protobuf::BoolRes useSkillResult;
  49. ClientContext context;
  50. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  51. auto status = THUAI6Stub->UseSkill(&context, request, &useSkillResult);
  52. if (status.ok())
  53. return useSkillResult.act_success();
  54. else
  55. return false;
  56. }
  57. bool Communication::SendMessage(int64_t toID, std::string message, int64_t playerID)
  58. {
  59. protobuf::BoolRes sendMessageResult;
  60. ClientContext context;
  61. auto request = THUAI62Proto::THUAI62ProtobufSend(message, toID, playerID);
  62. auto status = THUAI6Stub->SendMessage(&context, request, &sendMessageResult);
  63. if (status.ok())
  64. return sendMessageResult.act_success();
  65. else
  66. return false;
  67. }
  68. bool Communication::Escape(int64_t playerID)
  69. {
  70. protobuf::BoolRes escapeResult;
  71. ClientContext context;
  72. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  73. auto status = THUAI6Stub->Escape(&context, request, &escapeResult);
  74. if (status.ok())
  75. return escapeResult.act_success();
  76. else
  77. return false;
  78. }
  79. bool Communication::StartFixMachine(int64_t playerID)
  80. {
  81. protobuf::BoolRes startFixMachineResult;
  82. ClientContext context;
  83. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  84. auto status = THUAI6Stub->StartFixMachine(&context, request, &startFixMachineResult);
  85. if (status.ok())
  86. return startFixMachineResult.act_success();
  87. else
  88. return false;
  89. }
  90. bool Communication::EndFixMachine(int64_t playerID)
  91. {
  92. protobuf::BoolRes endFixMachineResult;
  93. ClientContext context;
  94. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  95. auto status = THUAI6Stub->EndFixMachine(&context, request, &endFixMachineResult);
  96. if (status.ok())
  97. return endFixMachineResult.act_success();
  98. else
  99. return false;
  100. }
  101. bool Communication::StartSaveHuman(int64_t playerID)
  102. {
  103. protobuf::BoolRes saveHumanResult;
  104. ClientContext context;
  105. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  106. auto status = THUAI6Stub->StartSaveHuman(&context, request, &saveHumanResult);
  107. if (status.ok())
  108. return saveHumanResult.act_success();
  109. else
  110. return false;
  111. }
  112. bool Communication::EndSaveHuman(int64_t playerID)
  113. {
  114. protobuf::BoolRes saveHumanResult;
  115. ClientContext context;
  116. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  117. auto status = THUAI6Stub->EndSaveHuman(&context, request, &saveHumanResult);
  118. if (status.ok())
  119. return saveHumanResult.act_success();
  120. else
  121. return false;
  122. }
  123. bool Communication::Attack(double angle, int64_t playerID)
  124. {
  125. protobuf::BoolRes attackResult;
  126. ClientContext context;
  127. auto request = THUAI62Proto::THUAI62ProtobufAttack(angle, playerID);
  128. auto status = THUAI6Stub->Attack(&context, request, &attackResult);
  129. if (status.ok())
  130. return attackResult.act_success();
  131. else
  132. return false;
  133. }
  134. bool Communication::CarryHuman(int64_t playerID)
  135. {
  136. protobuf::BoolRes carryHumanResult;
  137. ClientContext context;
  138. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  139. auto status = THUAI6Stub->CarryHuman(&context, request, &carryHumanResult);
  140. if (status.ok())
  141. return carryHumanResult.act_success();
  142. else
  143. return false;
  144. }
  145. bool Communication::ReleaseHuman(int64_t playerID)
  146. {
  147. protobuf::BoolRes releaseHumanResult;
  148. ClientContext context;
  149. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  150. auto status = THUAI6Stub->ReleaseHuman(&context, request, &releaseHumanResult);
  151. if (status.ok())
  152. return releaseHumanResult.act_success();
  153. else
  154. return false;
  155. }
  156. bool Communication::HangHuman(int64_t playerID)
  157. {
  158. protobuf::BoolRes hangHumanResult;
  159. ClientContext context;
  160. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  161. auto status = THUAI6Stub->HangHuman(&context, request, &hangHumanResult);
  162. if (status.ok())
  163. return hangHumanResult.act_success();
  164. else
  165. return false;
  166. }
  167. bool Communication::TryConnection(int64_t playerID)
  168. {
  169. protobuf::BoolRes reply;
  170. ClientContext context;
  171. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  172. auto status = THUAI6Stub->TryConnection(&context, request, &reply);
  173. if (status.ok())
  174. {
  175. std::cout << "Connection success!" << std::endl;
  176. return true;
  177. }
  178. else
  179. return false;
  180. }
  181. protobuf::MessageToClient Communication::GetMessage2Client()
  182. {
  183. haveNewMessage = false;
  184. return message2Client;
  185. }
  186. bool Communication::HaveMessage2Client()
  187. {
  188. return haveNewMessage;
  189. }
  190. std::optional<std::pair<int64_t, std::string>> Communication::GetMessage()
  191. {
  192. return messageQueue.tryPop();
  193. }
  194. bool Communication::HaveMessage()
  195. {
  196. return !messageQueue.empty();
  197. }
  198. void Communication::ReadMessage(int64_t playerID)
  199. {
  200. auto tRead = [&]()
  201. {
  202. auto request = THUAI62Proto::THUAI62ProtobufID(playerID);
  203. ClientContext context;
  204. protobuf::MsgRes messageReceived;
  205. auto reader = THUAI6Stub->GetMessage(&context, request);
  206. while (reader->Read(&messageReceived))
  207. {
  208. messageQueue.emplace(messageReceived.from_player_id(), messageReceived.message_received());
  209. }
  210. };
  211. std::thread(tRead).detach();
  212. }
  213. void Communication::AddPlayer(int64_t playerID, THUAI6::PlayerType playerType, THUAI6::HumanType humanType, THUAI6::ButcherType butcherType)
  214. {
  215. auto tMessage = [&]()
  216. {
  217. protobuf::PlayerMsg playerMsg = THUAI62Proto::THUAI62ProtobufPlayer(playerID, playerType, humanType, butcherType);
  218. grpc::ClientContext context;
  219. auto MessageReader = THUAI6Stub->AddPlayer(&context, playerMsg);
  220. while (MessageReader->Read(&message2Client))
  221. haveNewMessage = true;
  222. };
  223. std::thread(tMessage).detach();
  224. }