playeragent.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package servers
  2. import (
  3. sjson "encoding/json"
  4. "errors"
  5. "leafstalk/covenant/pbfmsg"
  6. "leafstalk/log"
  7. "leafstalk/network/cluster"
  8. "reflect"
  9. )
  10. // type PlayerGate struct {
  11. // PlayerId int64
  12. // GateId int32
  13. // }
  14. type PlayerAgent struct {
  15. *cluster.ServerAgent
  16. PlayerId int64
  17. GateId int64
  18. }
  19. // var (
  20. // allPlayerGates *cach2.Cache
  21. // )
  22. // func InitPlayerAgentList() {
  23. // allPlayerGates = cach2.New(0, 10*time.Minute)
  24. // }
  25. func NewPlayerAgent(serverAgent *cluster.ServerAgent, msg *pbfmsg.RouteMsg) *PlayerAgent {
  26. pa := new(PlayerAgent)
  27. pa.ServerAgent = serverAgent
  28. pa.PlayerId = msg.PlayerId
  29. pa.GateId = msg.GateId
  30. return pa
  31. }
  32. func GetUserData(serverAgent *cluster.ServerAgent, request *pbfmsg.RouteMsg) func() interface{} {
  33. return func() interface{} {
  34. return NewPlayerAgent(serverAgent, request)
  35. }
  36. }
  37. // func GetPlayerAgent(msg *pbfmsg.RouteMsg, serverAgent *cluster.ServerAgent) interface{} {
  38. // if msg.PlayerId == 0 { // || msg.GateId == 0
  39. // return serverAgent
  40. // }
  41. // strId := strconv.FormatInt(msg.PlayerId, 10)
  42. // if v, ok := allPlayerGates.Get(strId); ok {
  43. // old := v.(*PlayerGate)
  44. // if old.PlayerId == msg.PlayerId && old.GateId == msg.GateId {
  45. // return NewPlayerAgent(old, serverAgent)
  46. // }
  47. // }
  48. // npg := newPlayerGate(msg)
  49. // return NewPlayerAgent(npg, serverAgent)
  50. // }
  51. // func newPlayerGate(msg *pbfmsg.RouteMsg) *PlayerGate {
  52. // p := new(PlayerGate)
  53. // p.PlayerId = msg.PlayerId
  54. // p.GateId = msg.GateId
  55. // return p
  56. // }
  57. // func NewPlayerGate(playerId int64, gateId int32) *PlayerGate {
  58. // p := new(PlayerGate)
  59. // p.PlayerId = playerId
  60. // p.GateId = gateId
  61. // return p
  62. // }
  63. // // func (p *PlayerGate) GetGateId() int32 {
  64. // // return atomic.LoadInt32(&p.GateId)
  65. // // }
  66. // // func (p *PlayerGate) SetGateId(gateId int32) {
  67. // // atomic.StoreInt32(&p.GateId, gateId)
  68. // // }
  69. // // 客户端登录,记录玩家网关
  70. // func AddPlayerGate(playerId int64, gateId int32) {
  71. // // 确保信息不会被删除
  72. // // gateId 不等时,不能修改只能添加,因为信息有可能被使用
  73. // strId := strconv.FormatInt(playerId, 10)
  74. // if v, ok := allPlayerGates.Get(strId); ok {
  75. // old := v.(*PlayerGate)
  76. // if old.GateId == gateId {
  77. // allPlayerGates.SetDefault(strId, v)
  78. // return
  79. // }
  80. // }
  81. // //
  82. // pg := NewPlayerGate(playerId, gateId)
  83. // allPlayerGates.SetDefault(strId, pg)
  84. // }
  85. // // 客户端退出,延迟删除玩家网关
  86. // func RemovePlayerGate(playerId int64) {
  87. // strId := strconv.FormatInt(playerId, 10)
  88. // if v, ok := allPlayerGates.Get(strId); ok {
  89. // allPlayerGates.Set(strId, v, 3*time.Minute)
  90. // }
  91. // }
  92. func CopyPlayerAgent(agent *PlayerAgent) *PlayerAgent {
  93. p := new(PlayerAgent)
  94. p.ServerAgent = agent.ServerAgent
  95. p.PlayerId = agent.PlayerId
  96. p.GateId = agent.GateId
  97. return p
  98. }
  99. func (p *PlayerAgent) SendToPlayer(Msg interface{}) error {
  100. data, _ := sjson.Marshal(Msg)
  101. if len(data) > 2048 {
  102. data = data[:2048]
  103. }
  104. msgType := reflect.TypeOf(Msg)
  105. var msgName string
  106. if msgType != nil && msgType.Kind() == reflect.Ptr {
  107. msgName = msgType.Elem().Name()
  108. }
  109. log.Infow("SendToPlayer", "playerId", p.PlayerId, msgName, string(data))
  110. s := GetServerById(p.GateId)
  111. if s != nil && s.Agent != nil {
  112. _, err := s.Agent.WriteClientRouteMsg(Msg, p.PlayerId)
  113. return err
  114. }
  115. log.Warn("no found gate.", p.GateId)
  116. return errors.New("no found gate")
  117. }
  118. // rpc回应消息,需要传递rpcMsgId;
  119. // rpc请求消息和非rpc消息,不用传递rpcMsgIds
  120. func (p *PlayerAgent) SendToServer(Msg interface{}, rpcMsgIds ...int64) error {
  121. if p.ServerAgent != nil {
  122. rpcMsgId := int64(0)
  123. if len(rpcMsgIds) > 0 {
  124. rpcMsgId = rpcMsgIds[0]
  125. }
  126. // if rpcMsg, ok := Msg.(msg.RPCer); ok {
  127. // return p.ServerAgent.WriteServerRouteMsg(Msg, p.PlayerId, p.GateId, rpcMsg.GetMsgId())
  128. // }
  129. return p.ServerAgent.WriteServerRouteMsg(Msg, p.PlayerId, p.GateId, rpcMsgId)
  130. }
  131. log.Warn("no found server agent")
  132. return errors.New("no server agent")
  133. }
  134. // func (p *PlayerAgent) SendRpcMsgToServer(Msg msg.RPCer) error {
  135. // return p.SendToServer(Msg, Msg.GetMsgId())
  136. // }
  137. // func (p *PlayerAgent) SendToServer(Msg interface{}, rpcMsgId int64) error {
  138. // if p.ServerAgent != nil {
  139. // return p.ServerAgent.WriteServerRouteMsg(Msg, p.PlayerId, p.GateId, rpcMsgId)
  140. // }
  141. // log.Warn("no found server agent")
  142. // return errors.New("no server agent")
  143. // }