server_router.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package main
  2. import (
  3. "git.wanbits.io/joe/franklin/mod"
  4. pb "git.wanbits.io/joe/franklin/protos"
  5. "git.wanbits.io/joe/kettle/log"
  6. "git.wanbits.io/joe/nnet"
  7. "github.com/go-redis/redis"
  8. "github.com/golang/protobuf/proto"
  9. "go.uber.org/zap"
  10. "time"
  11. )
  12. var (
  13. routes = map[string]fnCSHandler{
  14. "C_Heartbeat": on_C_Heartbeat,
  15. "C_Login": on_C_Login,
  16. "C_Logout": on_C_Logout,
  17. "C_EnterGame": on_C_EnterGame,
  18. "C_LeaveGame": on_C_LeaveGame,
  19. "C_EnterRoom": on_C_EnterRoom,
  20. "C_EnterTable": on_C_EnterTable,
  21. "C_LeaveRoom": on_C_LeaveRoom,
  22. "C_LeaveTable": on_C_LeaveTable,
  23. }
  24. )
  25. type fnCSHandler func(nnet.ISession, *CSPacket)
  26. func dispatch(ses nnet.ISession, pkt *CSPacket) {
  27. handler, ok := routes[pkt.MsgName]
  28. if !ok {
  29. // route to lobbies
  30. if pkt.MsgId <= 5000 {
  31. PostLobby(pkt.UserId, pkt)
  32. return
  33. }
  34. logicId, err:= mod.LoadUserLogic(pkt.UserId)
  35. if err != nil {
  36. if err != redis.Nil {
  37. log.Error("user logic", zap.Error(err))
  38. }
  39. return
  40. }
  41. PostLogic(logicId, pkt)
  42. return
  43. }
  44. handler(ses, pkt)
  45. }
  46. func on_C_Heartbeat(ses nnet.ISession, p *CSPacket) {
  47. resp := &pb.S_Heartbeat{
  48. Ts: time.Now().Unix(),
  49. }
  50. SendToClient(ses, ses.Id(), pb.ErrCode_OK, resp)
  51. }
  52. func on_C_Login(ses nnet.ISession, p *CSPacket) {
  53. prm := &pb.C_Login{}
  54. ses.SetId(p.UserId)
  55. err := proto.Unmarshal(p.Req, prm)
  56. if err != nil {
  57. response_c_login(ses, pb.ErrCode_BAD_FORMAT, nil)
  58. return
  59. }
  60. // verify by rabbit
  61. seq := time.Now().UnixNano()
  62. err = g_rabbitProto.Send(NewReqPacket("bl_login_verify", seq, &pb.VerifyParams{
  63. UserId: p.UserId,
  64. Username: prm.Username,
  65. Token: prm.Token,
  66. }), ses)
  67. if err != nil {
  68. response_c_login(ses, pb.ErrCode_FAILED, nil)
  69. }
  70. }
  71. func response_c_login(ses nnet.ISession, errCode pb.ErrCode, res *pb.S_Login) {
  72. var ec = pb.ErrCode_OK
  73. var reason = pb.NetCloseReason_KICK
  74. defer func() {
  75. p := []int32{}
  76. if ec != pb.ErrCode_OK {
  77. p = append(p, 1)
  78. p = append(p, int32(reason))
  79. res = &pb.S_Login{}
  80. //SendToClient(ses, ses.Id(), ec, &pb.S_Login{})
  81. //KillUserSession(ses, ses.Id(), pb.NetCloseReason_ERR_AUTH)
  82. }
  83. SendToClient(ses, ses.Id(), ec, res, p...)
  84. }()
  85. if errCode != pb.ErrCode_OK {
  86. ec = errCode
  87. reason = pb.NetCloseReason_ERR_AUTH
  88. return
  89. }
  90. // check agent offline
  91. if g_offline {
  92. ec = pb.ErrCode_MAINTAINING
  93. reason = pb.NetCloseReason_KICK
  94. return
  95. }
  96. // check user status
  97. // check user kicked off
  98. if mod.LoadKick(ses.Id()) {
  99. ec = pb.ErrCode_FORBIDDEN
  100. reason = pb.NetCloseReason_KICK
  101. return
  102. }
  103. //TODO: check if have logged in any agents already
  104. // check reconnect state
  105. logicId, err := mod.LoadOffline(ses.Id())
  106. if err == nil {
  107. // route to logic
  108. PostLogic(logicId, ses.Id(), &pb.Q_Online{UserId: ses.Id()})
  109. } else {
  110. if err != redis.Nil {
  111. log.Error("", zap.Error(err))
  112. }
  113. // route to a lobby
  114. PostLobby(ses.Id(), &pb.Q_Online{UserId: ses.Id()})
  115. }
  116. // update user location
  117. err = mod.SaveUserLogin(ses.Id(), g_conf.Id)
  118. if err != nil {
  119. log.Error("", zap.Error(err))
  120. }
  121. // update session id
  122. ses.UpdateId(ses.Id())
  123. }
  124. func on_C_Logout(ses nnet.ISession, p *CSPacket) {
  125. //
  126. if err := mod.SaveUserLogout(ses.Id()); err != nil {
  127. log.Error("logout", zap.Error(err))
  128. }
  129. }
  130. func on_C_EnterGame(ses nnet.ISession, p *CSPacket) {
  131. }
  132. func on_C_LeaveGame(ses nnet.ISession, p *CSPacket) {
  133. }
  134. func on_C_EnterRoom(ses nnet.ISession, p *CSPacket) {
  135. }
  136. func on_C_EnterTable(ses nnet.ISession, p *CSPacket) {
  137. }
  138. func on_C_LeaveRoom(ses nnet.ISession, p *CSPacket) {
  139. }
  140. func on_C_LeaveTable(ses nnet.ISession, p *CSPacket) {
  141. }