package leagueMail import ( actorRemote "f1-game/internal/actor_remote" "f1-game/internal/component/redis" nameRedis "f1-game/internal/name/redis" nameRoute "f1-game/internal/name/route" "f1-game/internal/pb" "f1-game/internal/sessions" "f1-game/internal/types" "f1-game/nodes/map/internal/db" mapFacade "f1-game/nodes/map/internal/facade" cstring "github.com/cherry-game/cherry/extend/string" clog "github.com/cherry-game/cherry/logger" cproto "github.com/cherry-game/cherry/net/proto" ) func Service() *service { return &service{} } type service struct { mapFacade.LeagueServiceBase[*db.MapLeagueTable] } // 推送联盟邮件列表 func (p *service) Push(leagueTable *db.MapLeagueTable, session *cproto.Session) { leagueMailTable, found := db.GetMapLeagueMailTable(leagueTable.LeagueID) if !found { return } var ( playerID = sessions.GetPlayerID(session) pushMap = &pb.MailTypeList{ List: []*pb.MailList{}, } ) for mailType, mailList := range leagueMailTable.MailMap { list := &pb.MailList{ MailType: mailType, TopMailID: mailList.TopMailID, } for _, mail := range mailList.List { // 过滤删除邮件 if mail.DelPlayerIDs.Contains(playerID) { continue } list.List = append(list.List, mail.ToProto(playerID)) } pushMap.List = append(pushMap.List, list) } sessions.PushWithSession(session, nameRoute.PushLeagueMail_List, pushMap) } // 给所有联盟成员推送邮件 func (p *service) SendAllMemberMail(leagueID int64, mailID int32, assets types.Assets, params ...any) { p.SendMailWithPermission(leagueID, mailID, 0, assets, params...) } // 通过权限发送系统邮件 // permission 0 发送给所有成员 否则具体权限联盟成员 func (p *service) SendMailWithPermission(leagueID int64, mailID, permission int32, assets types.Assets, params ...any) { leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID) if !found { clog.Warnf("[SendMailWithPermission] leagueMemberTable not found. leagueID: %d, mailID: %d, permission: %d", leagueID, mailID, permission) return } var members []int64 if permission <= 0 { members = leagueMemberTable.GetLeagueMemberIDs() } else { members = leagueMemberTable.GetMemberWithPermission(permission) } p.SendMailToMembers(leagueID, members, mailID, assets, params...) } // 发送系统邮件给联盟成员 func (p *service) SendMailToMembers(leagueID int64, playerIDs []int64, mailID int32, assets types.Assets, params ...any) { if len(playerIDs) < 1 { return } playerGameNodeMap := redis.Game.GetPlayerDataMap(playerIDs, nameRedis.PlayerGameNodeFields...) if playerGameNodeMap == nil { clog.Warnf("[SendMailToMembers] player game node map fail.leagueID:%d, mailID:%d, playerIDs: %v", leagueID, mailID, playerIDs) return } var templateParams []string for _, param := range params { templateParams = append(templateParams, cstring.ToString(param)) } for _, playerID := range playerIDs { playerData, found := playerGameNodeMap[playerID] if !found { clog.Warnf("[SendMailToMembers] player game node fail.leagueID:%d, mailID:%d, playerID: %v", leagueID, mailID, playerID) continue } // 发送邮件给联盟成员 actorRemote.GameMail.SendMail(playerData.GameNodeID, playerID, mailID, assets, templateParams) } }