serivce.go 11 KB

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