service.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package leagueMember
  2. import (
  3. "f1-game/internal/enum"
  4. nameRoute "f1-game/internal/name/route"
  5. "f1-game/internal/pb"
  6. "f1-game/internal/sessions"
  7. "f1-game/nodes/map/internal/db"
  8. mapFacade "f1-game/nodes/map/internal/facade"
  9. leagueBase "f1-game/nodes/map/league/base"
  10. cherryLogger "github.com/cherry-game/cherry/logger"
  11. clog "github.com/cherry-game/cherry/logger"
  12. cproto "github.com/cherry-game/cherry/net/proto"
  13. )
  14. func Service() *service {
  15. return &service{}
  16. }
  17. type service struct {
  18. mapFacade.LeagueServiceBase[*db.MapLeagueTable]
  19. }
  20. func (p *service) OnReset(leagueTable *db.MapLeagueTable) {
  21. if leagueTable.Stats.IsWeekReset {
  22. leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueTable.LeagueID)
  23. if !found {
  24. clog.Warnf("league member week reset, league member table not found. leagueID:%d", leagueTable.LeagueID)
  25. }
  26. for _, member := range leagueMemberTable.Members {
  27. member.WeekReset()
  28. }
  29. leagueMemberTable.Save2Queue()
  30. }
  31. }
  32. // 推送联盟邮件列表
  33. func (p *service) Push(leagueTable *db.MapLeagueTable, session *cproto.Session) {
  34. // 推送联盟职位信息
  35. p.JobPush(leagueTable, session)
  36. }
  37. // 盟主转让定时检测
  38. func (p *service) LeagueLeaderTransferTimer(leagueTable *db.MapLeagueTable, nowSecond int64) {
  39. leagueID := leagueTable.LeagueID
  40. leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
  41. if !found {
  42. return
  43. }
  44. var (
  45. playerID = leagueMemberTable.LeagueMember.Transfer.PlayerID
  46. endTime = leagueMemberTable.LeagueMember.Transfer.EndTime
  47. )
  48. // 不存在转让玩家
  49. if playerID <= 0 || nowSecond < endTime {
  50. return
  51. }
  52. if found = leagueMemberTable.LeagueMember.CheckMemberExist(playerID); found {
  53. leagueTable, found := db.GetMapLeagueTable(leagueID)
  54. if !found {
  55. clog.Warnf("leagueLeaderTransfer leagueTable not found leagueID = %v", leagueID)
  56. return
  57. }
  58. oldLeaderPlayerID := leagueTable.LeagueInfo.LeaderID
  59. leagueTable.LeagueInfo.LeaderID = playerID
  60. leagueTable.Save2Queue()
  61. // 获取旧盟主职位
  62. leaderJobID := leagueMemberTable.GetLeagueMemberJob(oldLeaderPlayerID)
  63. leagueMemberTable.LeagueJob.Jobs[leaderJobID] = playerID
  64. // 职位变更通知
  65. p.PermissionChangePush(leagueMemberTable, oldLeaderPlayerID, playerID)
  66. // 同步新盟主信息
  67. leagueBase.Service().SyncLeagueLeaderChange(leagueID, playerID, oldLeaderPlayerID, enum.Log_LeagueLeaderTransfer)
  68. }
  69. leagueMemberTable.SetLeagueTransfer(0, 0)
  70. leagueMemberTable.Save2Queue()
  71. }
  72. // 弹劾盟主定时器检测
  73. func (p *service) LeagueImpeachTimer(leagueTable *db.MapLeagueTable, nowSecond int64) {
  74. leagueID := leagueTable.LeagueID
  75. leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
  76. if !found {
  77. return
  78. }
  79. if !leagueMemberTable.LeagueMember.CheckLeagueImpeachExist() {
  80. return
  81. }
  82. // 判断时间是否以达到
  83. if nowSecond < leagueMemberTable.GetLeagueImpeachEndTime() {
  84. return
  85. }
  86. // 时间已到 获取弹劾人数
  87. var (
  88. agreeCount = int32(len(leagueMemberTable.Impeach.AgreePlayerIDs))
  89. rejectCount = int32(len(leagueMemberTable.Impeach.RejectPlayerIDs))
  90. newLeaderID = leagueMemberTable.Impeach.PlayerID
  91. needCount = leagueMemberTable.Impeach.Total / 2
  92. )
  93. // 同意人数大于反对的人数 且 当前同意的人数大于等于总可以投票的人数/2 弹劾成功
  94. if rejectCount < agreeCount && agreeCount >= needCount {
  95. // 盟主转换
  96. leagueTable, found := db.GetMapLeagueTable(leagueID)
  97. if !found {
  98. cherryLogger.Warnf("league impeach finish fail, league not found. leagueID:%d", leagueID)
  99. return
  100. }
  101. oldLeaderPlayerID := leagueTable.LeagueInfo.LeaderID
  102. leagueTable.LeagueInfo.LeaderID = newLeaderID
  103. // 如果弹劾玩家存在职位 需要先卸载职位
  104. leagueMemberTable.Resigned(newLeaderID)
  105. leagueTable.Save2Queue()
  106. // 同步新的盟主信息
  107. leagueBase.Service().SyncLeagueLeaderChange(leagueID, newLeaderID, oldLeaderPlayerID, enum.Log_LeagueLeaderImpeach)
  108. }
  109. // 不管是否弹劾成功 都需要清除弹劾数据
  110. leagueMemberTable.LeagueImpeachClear(newLeaderID)
  111. leagueMemberTable.Save2Queue()
  112. }
  113. func (p *service) PermissionChangePush(leagueMemberTable *db.MapLeagueMemberTable, playerIDs ...int64) {
  114. if len(playerIDs) <= 0 {
  115. return
  116. }
  117. for _, playerID := range playerIDs {
  118. session, found := sessions.GetSession(playerID)
  119. if !found {
  120. continue
  121. }
  122. resp := &pb.LeagueJob{
  123. Job: leagueMemberTable.GetLeagueMemberJob(playerID),
  124. }
  125. // 获取职位权限列表
  126. if resp.Job > 0 {
  127. permissions, _ := leagueMemberTable.GetJobPermissions(resp.Job)
  128. resp.Permissions = permissions
  129. }
  130. sessions.PushWithSession(session, nameRoute.PushLeague_JobChange, resp)
  131. }
  132. }
  133. func (p *service) JobPush(leagueTable *db.MapLeagueTable, session *cproto.Session) {
  134. var (
  135. playerID = sessions.GetPlayerID(session)
  136. leagueID = leagueTable.LeagueID
  137. )
  138. leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
  139. if !found {
  140. return
  141. }
  142. jobID := leagueMemberTable.LeagueMember.GetLeagueMemberJob(playerID)
  143. // 没有职位
  144. if jobID <= 0 {
  145. return
  146. }
  147. permissions, _ := leagueMemberTable.GetJobPermissions(jobID)
  148. resp := &pb.LeagueJob{
  149. Job: jobID,
  150. Permissions: permissions,
  151. }
  152. sessions.PushWithSession(session, nameRoute.PushLeague_JobInfo, resp)
  153. }