actor_uid.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package player
  2. import (
  3. "f1-game/internal/component/redis"
  4. "f1-game/internal/constant"
  5. nameRemote "f1-game/internal/name/remote"
  6. "f1-game/internal/pb"
  7. "f1-game/nodes/center/internal/db"
  8. ctime "github.com/cherry-game/cherry/extend/time"
  9. "github.com/cherry-game/cherry/net/parser/pomelo"
  10. )
  11. type actorUID struct {
  12. pomelo.ActorBase
  13. }
  14. func (p *actorUID) OnInit() {
  15. p.Remote().Register(nameRemote.Player_BindUID, p.bindUID)
  16. p.Remote().Register(nameRemote.Player_UpdateLastPlayer, p.updateLastPlayer)
  17. }
  18. // bind 绑定并获取uid
  19. func (p *actorUID) bindUID(req *pb.User) {
  20. // save to db
  21. db.SaveUserBindTable(req)
  22. }
  23. // updateLastPlayer 更新玩家历史登录数据到redis
  24. func (p *actorUID) updateLastPlayer(req *pb.UpdateLastPlayer) {
  25. if req.PID < 1 || len(req.OpenID) < 1 {
  26. return
  27. }
  28. loginList := redis.Center.GetLastLoginPlayer(req.PID, req.OpenID)
  29. // update data
  30. for _, player := range loginList {
  31. if player.GameNodeID == req.GameNodeID {
  32. player.PlayerID = req.PlayerID
  33. player.PlayerIcon = req.Icon
  34. player.PlayerName = req.PlayerName
  35. player.PlayerLevel = req.PlayerLevel
  36. player.UpTime = ctime.Now().ToMillisecond()
  37. player.Power = req.Power
  38. }
  39. }
  40. // 如果超过上限,则删除
  41. listLen := len(loginList)
  42. remain := listLen - constant.Player_LastMax
  43. if remain > 0 {
  44. loginList = loginList[:constant.Player_LastMax-1]
  45. }
  46. // save to redis
  47. key := redis.Center.BuildLastLoginKey(req.PID)
  48. redis.Center.HSetJSON(key, req.OpenID, loginList)
  49. // save to db
  50. // TODO 每次都会构造一个对象
  51. table := &db.LastPlayerTable{
  52. UID: req.UID,
  53. PID: req.PID,
  54. OpenID: req.OpenID,
  55. }
  56. table.UpdateList(loginList)
  57. table.Save()
  58. }