| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- package leagueBase
- import (
- capp "f1-game/internal/cherry_app"
- "f1-game/internal/component/redis"
- "f1-game/internal/constant"
- "f1-game/internal/enum"
- "f1-game/internal/event"
- nameRedis "f1-game/internal/name/redis"
- nameRoute "f1-game/internal/name/route"
- "f1-game/internal/pb"
- "f1-game/internal/sessions"
- mapCall "f1-game/nodes/map/internal/call"
- "f1-game/nodes/map/internal/db"
- mapFacade "f1-game/nodes/map/internal/facade"
- leagueMail "f1-game/nodes/map/league/mail"
- ctime "github.com/cherry-game/cherry/extend/time"
- 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) OnInit(leagueTable *db.MapLeagueTable) {
- // }
- func (p *service) Push(leagueTable *db.MapLeagueTable, session *cproto.Session) {
- // 推送联盟基础信息
- p.PushLeagueInfo(leagueTable, session)
- // 推送驻地列表
- p.LeagueResidencesPush(leagueTable, session)
- // 推送联盟地图标记
- p.MapMarkPush(leagueTable, session)
- }
- // 推送联盟基础信息
- func (p *service) PushLeagueInfo(leagueTable *db.MapLeagueTable, session *cproto.Session) {
- var (
- playerID = sessions.GetPlayerID(session)
- leagueID = leagueTable.LeagueID
- )
- // 获取联盟盟主权限是否需要更新
- if leagueTable.LeagueInfo.LeaderID == playerID {
- leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
- if found {
- jobID := leagueMemberTable.GetLeagueMemberJob(playerID)
- permissions, found := leagueMemberTable.GetJobPermissions(jobID)
- if !found || len(enum.LeaguePermissionss) != len(permissions) {
- leagueMemberTable.SetLeagueJobPermission(jobID, enum.LeaguePermissionss)
- leagueMemberTable.Save2Queue()
- }
- }
- }
- rsp := &pb.LeaguePush{
- LeagueID: leagueTable.LeagueID,
- LeagueName: leagueTable.LeagueInfo.LeagueName,
- LeagueAbbName: leagueTable.LeagueInfo.LeagueAbbName,
- }
- // 如果申请列表存在数据
- if len(leagueTable.LeagueInfo.LeagueApplys) > 0 {
- leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
- if found {
- if ok := leagueMemberTable.LeagueMember.CheckPermission(playerID, enum.League_Permission_Member); ok {
- rsp.RedPoint = true
- }
- }
- }
- sessions.PushWithSession(session, nameRoute.PushLeague_Info, rsp)
- }
- // 联盟驻地列表推送
- func (p *service) LeagueResidencesPush(leagueTable *db.MapLeagueTable, session *cproto.Session) {
- build, found := leagueTable.Builds.GetByType(constant.MapBuild_LeaguePoint)
- // 不存在联盟驻地 或 驻地还没建成
- if !found || build.BuildEndTime > ctime.Now().ToMillisecond() {
- return
- }
- var (
- resp = &pb.LeagueResidenceList{}
- playerIDs = []int64{}
- )
- for index, residence := range leagueTable.Residences {
- proto := &pb.LeagueResidence{
- Index: index,
- PlayerID: residence.PlayerID,
- }
- playerIDs = append(playerIDs, residence.PlayerID)
- resp.List = append(resp.List, proto)
- }
- if len(playerIDs) > 0 {
- playerDataMap := redis.Game.GetPlayerDataMap(playerIDs, nameRedis.PlayerBaseFields...)
- if playerDataMap != nil {
- for _, leagueResidence := range resp.List {
- playerData := playerDataMap[leagueResidence.PlayerID]
- if playerData != nil {
- leagueResidence.PlayerName = playerData.PlayerName
- }
- }
- }
- }
- sessions.PushWithSession(session, nameRoute.PushMapLeague_Residence, resp)
- }
- // 联盟成员登录推送地图标记
- func (p *service) MapMarkPush(leagueTable *db.MapLeagueTable, session *cproto.Session) {
- if len(leagueTable.MapMarks) <= 0 {
- return
- }
- resp := leagueTable.League.ToMapMarkListProto()
- sessions.PushWithSession(session, nameRoute.PushMapLeague_MapMark, resp)
- }
- // 联盟外交申请添加/删除更新
- func (p *service) LeagueDiplomacyApplyChangePush(leagueID, handleLeagueID int64, applyType, changeType int32) {
- // 推送给有联盟外交权限的玩家
- leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
- if !found {
- clog.Warnf("league member table not exist,apply push fail. leagueID:%d, sendLeagueID:%d", leagueID, handleLeagueID)
- return
- }
- // 获取外交权限的成员玩家ID
- playerIDs := leagueMemberTable.GetMemberWithPermission(enum.League_Permission_Diplomacy)
- if len(playerIDs) <= 0 {
- return
- }
- // 获取发送申请联盟名称 // TODO 后续通过其他地方获取不要直接读取db
- handleLeagueName := ""
- handleLeagueTable, found := db.GetMapLeagueTable(handleLeagueID)
- if found {
- handleLeagueName = handleLeagueTable.LeagueInfo.LeagueName
- }
- change := &pb.LeagueDiplomacyApplyChange{
- ChangeType: changeType,
- Apply: &pb.LeagueDiplomacyApply{
- LeagueID: handleLeagueID,
- LeagueName: handleLeagueName,
- ApplyType: applyType,
- },
- }
- sessions.PushPlayers(playerIDs, nameRoute.PushMapLeague_DiplomacyApplyChange, change)
- }
- // 联盟友盟变化推送
- func (p *service) LeagueUmengChangePush(curLeagueID int64, add bool, changeLeagueIDs ...int64) {
- if len(changeLeagueIDs) <= 0 {
- return
- }
- leagueMemberTable, found := db.GetMapLeagueMemberTable(curLeagueID)
- if !found {
- clog.Warnf("league member table not exist,umeng change push fail. leagueID:%d, sendLeagueIDs:%d", curLeagueID, changeLeagueIDs)
- return
- }
- resp := &pb.LeagueUmengChange{
- Add: add,
- LeagueIDList: changeLeagueIDs,
- }
- sessions.PushPlayers(leagueMemberTable.GetLeagueMemberIDs(), nameRoute.PushMapLeague_UmengChange, resp)
- }
- func (p *service) LeagueUnionChangePush(leagueID, unionID, unionLeagueID int64) {
- leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
- if !found {
- clog.Warnf("league member table not exist,union change push fail. leagueID:%d, unionID:%d", leagueID, unionID)
- return
- }
- resp := &pb.I64I64{
- Key: unionID,
- Value: unionLeagueID,
- }
- sessions.PushPlayers(leagueMemberTable.GetLeagueMemberIDs(), nameRoute.PushMapLeague_UnionChange, resp)
- }
- // 联盟关系解除定时检测
- func (p *service) LeagueDiplomacyTimer(leagueID int64, nowSecond int64) {
- leagueTable, found := db.GetMapLeagueTable(leagueID)
- if !found {
- return
- }
- var (
- unionRelieveTime = leagueTable.Diplomacy.Union.UnionRelieveTime
- unionID = leagueTable.Diplomacy.Union.UnionID
- unionLeagueID = leagueTable.Diplomacy.Union.UnionLeagueID
- save = false
- )
- // 联邦关系解除
- if unionRelieveTime > 0 && unionID > 0 && unionRelieveTime <= nowSecond {
- leagueTable.Diplomacy.Union.ResetUnion()
- save = true
- // 通知联盟在线成员
- p.LeagueUnionChangePush(leagueID, 0, 0)
- // 发送联邦关系解除邮件
- p.SendRelationReliveMail(leagueID, unionLeagueID, constant.MailID_LeagueUnionRelieve)
- }
- // 友盟关系解除
- removeUmengs := leagueTable.Diplomacy.GetUmengRelieveList(nowSecond)
- if len(removeUmengs) > 0 {
- for _, umengLeagueID := range removeUmengs {
- leagueTable.Diplomacy.DelUmeng(umengLeagueID)
- // 发送友盟关系解除邮件
- p.SendRelationReliveMail(leagueID, umengLeagueID, constant.MailID_LeagueUmengRelieve)
- }
- save = true
- // 通知在线的联盟成员
- p.LeagueUmengChangePush(leagueID, false, removeUmengs...)
- }
- if save {
- leagueTable.Save2Queue()
- }
- }
- // 发送解除关系邮件给联盟外交成员
- func (p *service) SendRelationReliveMail(curLeagueID, targetLeagueID int64, mailID int32) {
- var targetLeagueName string
- // TODO 当前先从db获取,后续优化完再从cache中获取
- leagueTable, found := db.GetMapLeagueTable(targetLeagueID)
- if found {
- targetLeagueName = leagueTable.LeagueInfo.LeagueName
- }
- // 发邮件通知当前联盟外交人员
- leagueMail.Service().SendMailWithPermission(curLeagueID, mailID, enum.League_Permission_Diplomacy, nil, targetLeagueName)
- }
- // 友盟关系解除推送
- func (p *service) UmengRelievePush(leagueID, umengLeagueID, umengRelieveTime int64) {
- leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID)
- if !found {
- clog.Warnf("league member table not exist,umeng relieve push fail. leagueID:%d, umengLeagueID:%d", leagueID, umengLeagueID)
- return
- }
- resp := &pb.I64I64{
- Key: umengLeagueID,
- Value: umengRelieveTime,
- }
- sessions.PushPlayers(leagueMemberTable.GetLeagueMemberIDs(), nameRoute.PushMapLeague_UmengRelieve, resp)
- }
- // 友盟关系解除推送
- func (p *service) UnionRelievePush(leagueTable *db.MapLeagueTable) {
- leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueTable.LeagueID)
- if !found {
- clog.Warnf("league member table not exist,union relieve push fail. leagueID:%d, push:%d", leagueTable.LeagueID)
- return
- }
- push := leagueTable.Diplomacy.Union.ToUnionProto()
- sessions.PushPlayers(leagueMemberTable.GetLeagueMemberIDs(), nameRoute.PushMapLeague_UnionRelieve, push)
- }
- // 同步联盟声望排行榜
- func (p *service) SyncLeaguePrestigeRank(leagueTable *db.MapLeagueTable, leagueMemberTable *db.MapLeagueMemberTable) {
- members := leagueMemberTable.GetLeagueMemberIDs()
- if len(members) <= 0 {
- return
- }
- playerDatas := redis.Game.GetPlayerDataMap(members, nameRedis.PlayerPerstigeFields...)
- if playerDatas == nil {
- return
- }
- totalPrestige := int32(0)
- for _, playerData := range playerDatas {
- totalPrestige += playerData.Prestige
- }
- rankLeague := leagueTable.ToRankLeague(int64(totalPrestige))
- // 更新排行榜
- mapCall.Rank.UpdateLeagueRank(enum.Rank_201, rankLeague)
- }
- // 联盟盟主变更事件
- func (p *service) SyncLeagueLeaderChange(leagueID, newLeaderID int64) {
- var (
- playerData = redis.Game.GetPlayerData(newLeaderID, nameRedis.PlayerNameFields...)
- leaderName = ""
- )
- if playerData != nil {
- leaderName = playerData.PlayerName
- }
- capp.PostEvent(event.NewLeagueLeaderChange(leagueID, newLeaderID, leaderName))
- }
|