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

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package core
  2. import (
  3. pb "API/proto"
  4. thuai6 "API/thuai6"
  5. "context"
  6. "sync"
  7. "google.golang.org/grpc"
  8. "google.golang.org/grpc/credentials/insecure"
  9. )
  10. type Communication struct {
  11. stub pb.AvailableServiceClient
  12. messageToClient *pb.MessageToClient
  13. haveNewMessage bool
  14. mtxMessage sync.Mutex
  15. cvMessage *sync.Cond
  16. }
  17. func NewCommunication(ip string, port string) (*Communication, error) {
  18. addr := ip + ":" + port
  19. conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
  20. if err != nil {
  21. return nil, err
  22. }
  23. stub := pb.NewAvailableServiceClient(conn)
  24. comm := &Communication{stub: stub, messageToClient: nil, haveNewMessage: false, mtxMessage: sync.Mutex{}}
  25. comm.cvMessage = sync.NewCond(&comm.mtxMessage)
  26. return comm, nil
  27. }
  28. func (self *Communication) TryConnection(playerID int64) bool {
  29. res, err := self.stub.TryConnection(context.Background(), &pb.IDMsg{PlayerId: playerID})
  30. if err != nil {
  31. // TODO: do loggings
  32. return false
  33. }
  34. return res.GetActSuccess()
  35. }
  36. func (self *Communication) AddPlayer(playerID int64, playerType thuai6.PlayerType, studentType thuai6.StudentType, trickerType thuai6.TrickerType) {
  37. var playerMsg pb.PlayerMsg
  38. playerMsg.PlayerId = playerID
  39. playerMsg.PlayerType = thuai6.PlayerTypeToProto[playerType]
  40. if playerType == thuai6.StudentPlayer {
  41. playerMsg.JobType = &pb.PlayerMsg_StudentType{StudentType: thuai6.StudentTypeToProto[studentType]}
  42. } else if playerType == thuai6.TrickerPlayer {
  43. playerMsg.JobType = &pb.PlayerMsg_TrickerType{TrickerType: thuai6.TrickerTypeToProto[trickerType]}
  44. } else {
  45. // TODO: Report ERROR
  46. }
  47. go func() {
  48. msgReader, err := self.stub.AddPlayer(context.Background(), &playerMsg)
  49. if err != nil {
  50. // TODO: Report ERROR
  51. }
  52. for {
  53. msg, err := msgReader.Recv()
  54. if err != nil {
  55. break
  56. }
  57. func() {
  58. self.mtxMessage.Lock()
  59. defer self.mtxMessage.Unlock()
  60. self.messageToClient = msg
  61. self.haveNewMessage = true
  62. self.cvMessage.Signal()
  63. }()
  64. }
  65. }()
  66. }
  67. func (self *Communication) Move(time int64, angle float64, playerID int64) bool {
  68. res, err := self.stub.Move(context.Background(), &pb.MoveMsg{
  69. TimeInMilliseconds: time,
  70. Angle: angle,
  71. PlayerId: playerID,
  72. })
  73. if err != nil {
  74. // TODO: do loggings
  75. return false
  76. }
  77. return res.GetActSuccess()
  78. }
  79. func (self *Communication) GetMessageToClient() pb.MessageToClient {
  80. self.mtxMessage.Lock()
  81. defer self.mtxMessage.Unlock()
  82. for !self.haveNewMessage {
  83. self.cvMessage.Wait()
  84. }
  85. self.haveNewMessage = false
  86. return *self.messageToClient
  87. }