service.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package leagueMail
  2. import (
  3. actorRemote "f1-game/internal/actor_remote"
  4. "f1-game/internal/component/redis"
  5. nameRedis "f1-game/internal/name/redis"
  6. nameRoute "f1-game/internal/name/route"
  7. "f1-game/internal/pb"
  8. "f1-game/internal/sessions"
  9. "f1-game/internal/types"
  10. "f1-game/nodes/map/internal/db"
  11. dbLeague "f1-game/nodes/map/internal/db/data/league"
  12. mapFacade "f1-game/nodes/map/internal/facade"
  13. cstring "github.com/cherry-game/cherry/extend/string"
  14. clog "github.com/cherry-game/cherry/logger"
  15. cproto "github.com/cherry-game/cherry/net/proto"
  16. )
  17. func Service() *service {
  18. return &service{}
  19. }
  20. type service struct {
  21. mapFacade.LeagueServiceBase[*db.MapLeagueTable]
  22. }
  23. // 推送联盟邮件列表
  24. func (p *service) Push(leagueTable *db.MapLeagueTable, session *cproto.Session) {
  25. leagueMailTable, found := db.GetMapLeagueMailTable(leagueTable.LeagueID)
  26. if !found {
  27. return
  28. }
  29. var (
  30. playerID = sessions.GetPlayerID(session)
  31. pushMap = &pb.MailTypeList{
  32. List: []*pb.MailList{},
  33. }
  34. )
  35. for mailType, mailList := range leagueMailTable.MailMap {
  36. list := &pb.MailList{
  37. MailType: mailType,
  38. TopMailID: mailList.TopMailID,
  39. }
  40. for _, mail := range mailList.List {
  41. // 过滤删除邮件
  42. if mail.DelPlayerIDs.Contains(playerID) {
  43. continue
  44. }
  45. list.List = append(list.List, mail.ToProto(playerID))
  46. }
  47. pushMap.List = append(pushMap.List, list)
  48. }
  49. sessions.PushWithSession(session, nameRoute.PushLeagueMail_List, pushMap)
  50. }
  51. func (p *service) ChangePush(members []int64, mailType int32, topMailID int64, removeMailIDs []int64, addMails ...*dbLeague.LeagueMail) {
  52. if len(members) <= 0 {
  53. return
  54. }
  55. // 删除邮件
  56. if len(removeMailIDs) > 0 {
  57. removeResp := &pb.MailDelList{
  58. MailType: mailType,
  59. MailIDs: removeMailIDs,
  60. }
  61. sessions.PushPlayers(members, nameRoute.PushLeagueMail_Del, removeResp)
  62. }
  63. // 新增邮件
  64. if len(addMails) > 0 {
  65. addResp := &pb.MailList{
  66. MailType: mailType,
  67. TopMailID: topMailID,
  68. }
  69. for _, mail := range addMails {
  70. addResp.List = append(addResp.List, mail.ToProto(0))
  71. }
  72. sessions.PushPlayers(members, nameRoute.PushLeagueMail_New, addResp)
  73. }
  74. }
  75. // 给所有联盟成员推送邮件
  76. func (p *service) SendAllMemberMail(leagueID int64, mailID int32, assets types.Assets, params ...any) {
  77. p.SendMailWithPermission(leagueID, mailID, 0, assets, params...)
  78. }
  79. // 通过权限发送系统邮件
  80. // permission 0 发送给所有成员 否则具体权限联盟成员
  81. func (p *service) SendMailWithPermission(leagueID int64, mailID, permission int32, assets types.Assets, params ...any) {
  82. leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
  83. if !found {
  84. clog.Warnf("[SendMailWithPermission] leagueMemberTable not found. leagueID: %d, mailID: %d, permission: %d", leagueID, mailID, permission)
  85. return
  86. }
  87. var members []int64
  88. if permission <= 0 {
  89. members = leagueMemberTable.GetLeagueMemberIDs()
  90. } else {
  91. members = leagueMemberTable.GetMemberWithPermission(permission)
  92. }
  93. p.SendMailToMembers(leagueID, members, mailID, assets, params...)
  94. }
  95. // 发送系统邮件给联盟成员
  96. func (p *service) SendMailToMembers(leagueID int64, playerIDs []int64, mailID int32, assets types.Assets, params ...any) {
  97. if len(playerIDs) < 1 {
  98. return
  99. }
  100. playerGameNodeMap := redis.Game.GetPlayerDataMap(playerIDs, nameRedis.PlayerGameNodeFields...)
  101. if playerGameNodeMap == nil {
  102. clog.Warnf("[SendMailToMembers] player game node map fail.leagueID:%d, mailID:%d, playerIDs: %v", leagueID, mailID, playerIDs)
  103. return
  104. }
  105. var templateParams []string
  106. for _, param := range params {
  107. templateParams = append(templateParams, cstring.ToString(param))
  108. }
  109. for _, playerID := range playerIDs {
  110. playerData, found := playerGameNodeMap[playerID]
  111. if !found {
  112. clog.Warnf("[SendMailToMembers] player game node fail.leagueID:%d, mailID:%d, playerID: %v", leagueID, mailID, playerID)
  113. continue
  114. }
  115. // 发送邮件给联盟成员
  116. actorRemote.GameMail.SendMail(playerData.GameNodeID, playerID, mailID, assets, templateParams)
  117. }
  118. }