service.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. mapFacade "f1-game/nodes/map/internal/facade"
  12. cstring "github.com/cherry-game/cherry/extend/string"
  13. clog "github.com/cherry-game/cherry/logger"
  14. cproto "github.com/cherry-game/cherry/net/proto"
  15. )
  16. func Service() *service {
  17. return &service{}
  18. }
  19. type service struct {
  20. mapFacade.LeagueServiceBase[*db.MapLeagueTable]
  21. }
  22. // 推送联盟邮件列表
  23. func (p *service) Push(leagueTable *db.MapLeagueTable, session *cproto.Session) {
  24. leagueMailTable, found := db.GetMapLeagueMailTable(leagueTable.LeagueID)
  25. if !found {
  26. return
  27. }
  28. var (
  29. playerID = sessions.GetPlayerID(session)
  30. pushMap = &pb.MailTypeList{
  31. List: []*pb.MailList{},
  32. }
  33. )
  34. for mailType, mailList := range leagueMailTable.MailMap {
  35. list := &pb.MailList{
  36. MailType: mailType,
  37. TopMailID: mailList.TopMailID,
  38. }
  39. for _, mail := range mailList.List {
  40. // 过滤删除邮件
  41. if mail.DelPlayerIDs.Contains(playerID) {
  42. continue
  43. }
  44. list.List = append(list.List, mail.ToProto(playerID))
  45. }
  46. pushMap.List = append(pushMap.List, list)
  47. }
  48. sessions.PushWithSession(session, nameRoute.PushLeagueMail_List, pushMap)
  49. }
  50. // 给所有联盟成员推送邮件
  51. func (p *service) SendAllMemberMail(leagueID int64, mailID int32, assets types.Assets, params ...any) {
  52. p.SendMailWithPermission(leagueID, mailID, 0, assets, params...)
  53. }
  54. // 通过权限发送系统邮件
  55. // permission 0 发送给所有成员 否则具体权限联盟成员
  56. func (p *service) SendMailWithPermission(leagueID int64, mailID, permission int32, assets types.Assets, params ...any) {
  57. leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
  58. if !found {
  59. clog.Warnf("[SendMailWithPermission] leagueMemberTable not found. leagueID: %d, mailID: %d, permission: %d", leagueID, mailID, permission)
  60. return
  61. }
  62. var members []int64
  63. if permission <= 0 {
  64. members = leagueMemberTable.GetLeagueMemberIDs()
  65. } else {
  66. members = leagueMemberTable.GetMemberWithPermission(permission)
  67. }
  68. p.SendMailToMembers(leagueID, members, mailID, assets, params...)
  69. }
  70. // 发送系统邮件给联盟成员
  71. func (p *service) SendMailToMembers(leagueID int64, playerIDs []int64, mailID int32, assets types.Assets, params ...any) {
  72. if len(playerIDs) < 1 {
  73. return
  74. }
  75. playerGameNodeMap := redis.Game.GetPlayerDataMap(playerIDs, nameRedis.PlayerGameNodeFields...)
  76. if playerGameNodeMap == nil {
  77. clog.Warnf("[SendMailToMembers] player game node map fail.leagueID:%d, mailID:%d, playerIDs: %v", leagueID, mailID, playerIDs)
  78. return
  79. }
  80. var templateParams []string
  81. for _, param := range params {
  82. templateParams = append(templateParams, cstring.ToString(param))
  83. }
  84. for _, playerID := range playerIDs {
  85. playerData, found := playerGameNodeMap[playerID]
  86. if !found {
  87. clog.Warnf("[SendMailToMembers] player game node fail.leagueID:%d, mailID:%d, playerID: %v", leagueID, mailID, playerID)
  88. continue
  89. }
  90. // 发送邮件给联盟成员
  91. actorRemote.GameMail.SendMail(playerData.GameNodeID, playerID, mailID, assets, templateParams)
  92. }
  93. }