serivce.go 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. package leagueBase
  2. import (
  3. capp "f1-game/internal/cherry_app"
  4. "f1-game/internal/component/redis"
  5. "f1-game/internal/constant"
  6. "f1-game/internal/enum"
  7. "f1-game/internal/event"
  8. nameRedis "f1-game/internal/name/redis"
  9. nameRoute "f1-game/internal/name/route"
  10. "f1-game/internal/pb"
  11. "f1-game/internal/sessions"
  12. mapCall "f1-game/nodes/map/internal/call"
  13. "f1-game/nodes/map/internal/db"
  14. mapFacade "f1-game/nodes/map/internal/facade"
  15. leagueMail "f1-game/nodes/map/league/mail"
  16. ctime "github.com/cherry-game/cherry/extend/time"
  17. clog "github.com/cherry-game/cherry/logger"
  18. cproto "github.com/cherry-game/cherry/net/proto"
  19. )
  20. func Service() *service {
  21. return &service{}
  22. }
  23. type service struct {
  24. mapFacade.LeagueServiceBase[*db.MapLeagueTable]
  25. }
  26. // func (p *service) OnInit(leagueTable *db.MapLeagueTable) {
  27. // }
  28. func (p *service) Push(leagueTable *db.MapLeagueTable, session *cproto.Session) {
  29. // 推送联盟基础信息
  30. p.PushLeagueInfo(leagueTable, session)
  31. // 推送驻地列表
  32. p.LeagueResidencesPush(leagueTable, session)
  33. // 推送联盟地图标记
  34. p.MapMarkPush(leagueTable, session)
  35. }
  36. // 推送联盟基础信息
  37. func (p *service) PushLeagueInfo(leagueTable *db.MapLeagueTable, session *cproto.Session) {
  38. var (
  39. playerID = sessions.GetPlayerID(session)
  40. leagueID = leagueTable.LeagueID
  41. )
  42. // 获取联盟盟主权限是否需要更新
  43. if leagueTable.LeagueInfo.LeaderID == playerID {
  44. leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
  45. if found {
  46. jobID := leagueMemberTable.GetLeagueMemberJob(playerID)
  47. permissions, found := leagueMemberTable.GetJobPermissions(jobID)
  48. if !found || len(enum.LeaguePermissionss) != len(permissions) {
  49. leagueMemberTable.SetLeagueJobPermission(jobID, enum.LeaguePermissionss)
  50. leagueMemberTable.Save2Queue()
  51. }
  52. }
  53. }
  54. rsp := &pb.LeaguePush{
  55. LeagueID: leagueTable.LeagueID,
  56. LeagueName: leagueTable.LeagueInfo.LeagueName,
  57. LeagueAbbName: leagueTable.LeagueInfo.LeagueAbbName,
  58. }
  59. // 如果申请列表存在数据
  60. if len(leagueTable.LeagueInfo.LeagueApplys) > 0 {
  61. leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
  62. if found {
  63. if ok := leagueMemberTable.LeagueMember.CheckPermission(playerID, enum.League_Permission_Member); ok {
  64. rsp.RedPoint = true
  65. }
  66. }
  67. }
  68. sessions.PushWithSession(session, nameRoute.PushLeague_Info, rsp)
  69. }
  70. // 联盟驻地列表推送
  71. func (p *service) LeagueResidencesPush(leagueTable *db.MapLeagueTable, session *cproto.Session) {
  72. build, found := leagueTable.Builds.GetByType(constant.MapBuild_LeaguePoint)
  73. // 不存在联盟驻地 或 驻地还没建成
  74. if !found || build.BuildEndTime > ctime.Now().ToMillisecond() {
  75. return
  76. }
  77. var (
  78. resp = &pb.LeagueResidenceList{}
  79. playerIDs = []int64{}
  80. )
  81. for index, residence := range leagueTable.Residences {
  82. proto := &pb.LeagueResidence{
  83. Index: index,
  84. PlayerID: residence.PlayerID,
  85. }
  86. playerIDs = append(playerIDs, residence.PlayerID)
  87. resp.List = append(resp.List, proto)
  88. }
  89. if len(playerIDs) > 0 {
  90. playerDataMap := redis.Game.GetPlayerDataMap(playerIDs, nameRedis.PlayerBaseFields...)
  91. if playerDataMap != nil {
  92. for _, leagueResidence := range resp.List {
  93. playerData := playerDataMap[leagueResidence.PlayerID]
  94. if playerData != nil {
  95. leagueResidence.PlayerName = playerData.PlayerName
  96. }
  97. }
  98. }
  99. }
  100. sessions.PushWithSession(session, nameRoute.PushMapLeague_Residence, resp)
  101. }
  102. // 联盟成员登录推送地图标记
  103. func (p *service) MapMarkPush(leagueTable *db.MapLeagueTable, session *cproto.Session) {
  104. if len(leagueTable.MapMarks) <= 0 {
  105. return
  106. }
  107. resp := leagueTable.League.ToMapMarkListProto()
  108. sessions.PushWithSession(session, nameRoute.PushMapLeague_MapMark, resp)
  109. }
  110. // 联盟外交申请添加/删除更新
  111. func (p *service) LeagueDiplomacyApplyChangePush(leagueID, handleLeagueID int64, applyType, changeType int32) {
  112. // 推送给有联盟外交权限的玩家
  113. leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
  114. if !found {
  115. clog.Warnf("league member table not exist,apply push fail. leagueID:%d, sendLeagueID:%d", leagueID, handleLeagueID)
  116. return
  117. }
  118. // 获取外交权限的成员玩家ID
  119. playerIDs := leagueMemberTable.GetMemberWithPermission(enum.League_Permission_Diplomacy)
  120. if len(playerIDs) <= 0 {
  121. return
  122. }
  123. // 获取发送申请联盟名称 // TODO 后续通过其他地方获取不要直接读取db
  124. handleLeagueName := ""
  125. handleLeagueTable, found := db.GetMapLeagueTable(handleLeagueID)
  126. if found {
  127. handleLeagueName = handleLeagueTable.LeagueInfo.LeagueName
  128. }
  129. change := &pb.LeagueDiplomacyApplyChange{
  130. ChangeType: changeType,
  131. Apply: &pb.LeagueDiplomacyApply{
  132. LeagueID: handleLeagueID,
  133. LeagueName: handleLeagueName,
  134. ApplyType: applyType,
  135. },
  136. }
  137. sessions.PushPlayers(playerIDs, nameRoute.PushMapLeague_DiplomacyApplyChange, change)
  138. }
  139. // 联盟友盟变化推送
  140. func (p *service) LeagueUmengChangePush(curLeagueID int64, add bool, changeLeagueIDs ...int64) {
  141. if len(changeLeagueIDs) <= 0 {
  142. return
  143. }
  144. leagueMemberTable, found := db.GetMapLeagueMemberTable(curLeagueID)
  145. if !found {
  146. clog.Warnf("league member table not exist,umeng change push fail. leagueID:%d, sendLeagueIDs:%d", curLeagueID, changeLeagueIDs)
  147. return
  148. }
  149. resp := &pb.LeagueUmengChange{
  150. Add: add,
  151. LeagueIDList: changeLeagueIDs,
  152. }
  153. sessions.PushPlayers(leagueMemberTable.GetLeagueMemberIDs(), nameRoute.PushMapLeague_UmengChange, resp)
  154. }
  155. func (p *service) LeagueUnionChangePush(leagueID, unionID, unionLeagueID int64) {
  156. leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
  157. if !found {
  158. clog.Warnf("league member table not exist,union change push fail. leagueID:%d, unionID:%d", leagueID, unionID)
  159. return
  160. }
  161. resp := &pb.I64I64{
  162. Key: unionID,
  163. Value: unionLeagueID,
  164. }
  165. sessions.PushPlayers(leagueMemberTable.GetLeagueMemberIDs(), nameRoute.PushMapLeague_UnionChange, resp)
  166. }
  167. // 联盟关系解除定时检测
  168. func (p *service) LeagueDiplomacyTimer(leagueID int64, nowSecond int64) {
  169. leagueTable, found := db.GetMapLeagueTable(leagueID)
  170. if !found {
  171. return
  172. }
  173. var (
  174. unionRelieveTime = leagueTable.Diplomacy.Union.UnionRelieveTime
  175. unionID = leagueTable.Diplomacy.Union.UnionID
  176. unionLeagueID = leagueTable.Diplomacy.Union.UnionLeagueID
  177. save = false
  178. )
  179. // 联邦关系解除
  180. if unionRelieveTime > 0 && unionID > 0 && unionRelieveTime <= nowSecond {
  181. leagueTable.Diplomacy.Union.ResetUnion()
  182. save = true
  183. // 通知联盟在线成员
  184. p.LeagueUnionChangePush(leagueID, 0, 0)
  185. // 发送联邦关系解除邮件
  186. p.SendRelationReliveMail(leagueID, unionLeagueID, constant.MailID_LeagueUnionRelieve)
  187. }
  188. // 友盟关系解除
  189. removeUmengs := leagueTable.Diplomacy.GetUmengRelieveList(nowSecond)
  190. if len(removeUmengs) > 0 {
  191. for _, umengLeagueID := range removeUmengs {
  192. leagueTable.Diplomacy.DelUmeng(umengLeagueID)
  193. // 发送友盟关系解除邮件
  194. p.SendRelationReliveMail(leagueID, umengLeagueID, constant.MailID_LeagueUmengRelieve)
  195. }
  196. save = true
  197. // 通知在线的联盟成员
  198. p.LeagueUmengChangePush(leagueID, false, removeUmengs...)
  199. }
  200. if save {
  201. leagueTable.Save2Queue()
  202. }
  203. }
  204. // 发送解除关系邮件给联盟外交成员
  205. func (p *service) SendRelationReliveMail(curLeagueID, targetLeagueID int64, mailID int32) {
  206. var targetLeagueName string
  207. // TODO 当前先从db获取,后续优化完再从cache中获取
  208. leagueTable, found := db.GetMapLeagueTable(targetLeagueID)
  209. if found {
  210. targetLeagueName = leagueTable.LeagueInfo.LeagueName
  211. }
  212. // 发邮件通知当前联盟外交人员
  213. leagueMail.Service().SendMailWithPermission(curLeagueID, mailID, enum.League_Permission_Diplomacy, nil, targetLeagueName)
  214. }
  215. // 友盟关系解除推送
  216. func (p *service) UmengRelievePush(leagueID, umengLeagueID, umengRelieveTime int64) {
  217. leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
  218. if !found {
  219. clog.Warnf("league member table not exist,umeng relieve push fail. leagueID:%d, umengLeagueID:%d", leagueID, umengLeagueID)
  220. return
  221. }
  222. resp := &pb.I64I64{
  223. Key: umengLeagueID,
  224. Value: umengRelieveTime,
  225. }
  226. sessions.PushPlayers(leagueMemberTable.GetLeagueMemberIDs(), nameRoute.PushMapLeague_UmengRelieve, resp)
  227. }
  228. // 友盟关系解除推送
  229. func (p *service) UnionRelievePush(leagueTable *db.MapLeagueTable) {
  230. leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueTable.LeagueID)
  231. if !found {
  232. clog.Warnf("league member table not exist,union relieve push fail. leagueID:%d, push:%d", leagueTable.LeagueID)
  233. return
  234. }
  235. push := leagueTable.Diplomacy.Union.ToUnionProto()
  236. sessions.PushPlayers(leagueMemberTable.GetLeagueMemberIDs(), nameRoute.PushMapLeague_UnionRelieve, push)
  237. }
  238. // 同步联盟声望排行榜
  239. func (p *service) SyncLeaguePrestigeRank(leagueTable *db.MapLeagueTable, leagueMemberTable *db.MapLeagueMemberTable) {
  240. members := leagueMemberTable.GetLeagueMemberIDs()
  241. if len(members) <= 0 {
  242. return
  243. }
  244. playerDatas := redis.Game.GetPlayerDataMap(members, nameRedis.PlayerPerstigeFields...)
  245. if playerDatas == nil {
  246. return
  247. }
  248. totalPrestige := int32(0)
  249. for _, playerData := range playerDatas {
  250. totalPrestige += playerData.Prestige
  251. }
  252. rankLeague := leagueTable.ToRankLeague(int64(totalPrestige))
  253. // 更新排行榜
  254. mapCall.Rank.UpdateLeagueRank(enum.Rank_201, rankLeague)
  255. }
  256. // 联盟盟主变更事件
  257. func (p *service) SyncLeagueLeaderChange(leagueID, newLeaderID int64) {
  258. var (
  259. playerData = redis.Game.GetPlayerData(newLeaderID, nameRedis.PlayerNameFields...)
  260. leaderName = ""
  261. )
  262. if playerData != nil {
  263. leaderName = playerData.PlayerName
  264. }
  265. capp.PostEvent(event.NewLeagueLeaderChange(leagueID, newLeaderID, leaderName))
  266. }