league_mail.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. package mapLeague
  2. import (
  3. "f1-game/internal/code"
  4. "f1-game/internal/component/redis"
  5. "f1-game/internal/data"
  6. "f1-game/internal/enum"
  7. "f1-game/internal/extend/utils"
  8. nameLocal "f1-game/internal/name/local"
  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. "f1-game/internal/types"
  14. "f1-game/nodes/map/internal/db"
  15. dbLeague "f1-game/nodes/map/internal/db/data/league"
  16. leagueMail "f1-game/nodes/map/league/mail"
  17. ctime "github.com/cherry-game/cherry/extend/time"
  18. cproto "github.com/cherry-game/cherry/net/proto"
  19. )
  20. func (p *actorLeague) initLeagueMail() {
  21. p.Local().Register(nameLocal.MapLeagueMail_Send, p.leagueMailSend)
  22. p.Local().Register(nameLocal.MapLeagueMail_Del, p.leagueMailDel)
  23. p.Local().Register(nameLocal.MapLeagueMail_MemberDel, p.leagueMailMemberDel)
  24. p.Local().Register(nameLocal.MapLeagueMail_Top, p.leagueMailTop)
  25. p.Local().Register(nameLocal.MapLeagueMail_Read, p.leagueMailRead)
  26. p.Local().Register(nameLocal.MapLeagueMail_FastRead, p.leagueMailFastRead)
  27. }
  28. // 发送/更新联盟邮件
  29. func (p *actorLeague) leagueMailSend(session *cproto.Session, req *pb.LeagueMailSend) {
  30. opPlayerID := sessions.GetPlayerID(session)
  31. _, found := db.GetMapLeagueTable(p.leagueID)
  32. if !found {
  33. p.ResponseCode(session, code.LeagueNotExist)
  34. return
  35. }
  36. leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID)
  37. if !found {
  38. p.ResponseCode(session, code.LeagueMembersEmpty)
  39. return
  40. }
  41. // 获取发送联盟邮件所需权限
  42. permID := enum.GetSendLeagueMailPermission(req.MailType)
  43. // 判断玩家是否有权处理
  44. if !leagueMemberTable.LeagueMember.CheckPermission(opPlayerID, permID) {
  45. p.ResponseCode(session, code.LeaguePermissionDenied)
  46. return
  47. }
  48. // 发送联盟邮件
  49. errCode := p.SendLeagueMail(leagueMemberTable, opPlayerID, req.MailID, req.MailType,
  50. req.Title, req.Content, req.IsTop)
  51. p.ResponseCode(session, errCode)
  52. }
  53. // 删除联盟邮件
  54. func (p *actorLeague) leagueMailDel(session *cproto.Session, req *pb.I64) {
  55. var (
  56. opPlayerID = sessions.GetPlayerID(session)
  57. mailID = req.Value
  58. mailType = enum.MailType_Decree
  59. )
  60. _, found := db.GetMapLeagueTable(p.leagueID)
  61. if !found {
  62. p.ResponseCode(session, code.LeagueNotExist)
  63. return
  64. }
  65. leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID)
  66. if !found {
  67. p.ResponseCode(session, code.LeagueMembersEmpty)
  68. return
  69. }
  70. // 判断玩家是否有权处理
  71. if !leagueMemberTable.LeagueMember.CheckPermission(opPlayerID, enum.League_Permission_Decree) {
  72. p.ResponseCode(session, code.LeaguePermissionDenied)
  73. return
  74. }
  75. leagueMailTable, found := db.GetMapLeagueMailTable(p.leagueID)
  76. if !found {
  77. p.ResponseCode(session, code.LeagueMailDataNotExist)
  78. return
  79. }
  80. removeMailIDs := []int64{mailID}
  81. leagueMailList := leagueMailTable.GetLeagueMails(mailType)
  82. if len(leagueMailList.List) <= 0 {
  83. p.ResponseCode(session, code.LeagueMailDataNotExist)
  84. return
  85. }
  86. if mailID <= 0 {
  87. // 删除所有邮件
  88. leagueMailList := leagueMailTable.DeleteLeagueMailList(mailType)
  89. for _, mail := range leagueMailList.List {
  90. removeMailIDs = append(removeMailIDs, mail.MailID)
  91. }
  92. } else {
  93. _, index := leagueMailList.GetLeagueMail(mailID)
  94. if index < 0 {
  95. p.ResponseCode(session, code.MailDataNotFound)
  96. return
  97. }
  98. _, ok := leagueMailList.DeleteLeagueMail(mailID)
  99. if !ok {
  100. p.ResponseCode(session, code.MailDelFail)
  101. return
  102. }
  103. removeMailIDs = append(removeMailIDs, mailID)
  104. }
  105. leagueMailTable.Save2Queue()
  106. // 通知联盟所有在线玩家
  107. leagueMail.Service().ChangePush(leagueMemberTable.GetLeagueMemberIDs(), mailType, leagueMailList.TopMailID, removeMailIDs)
  108. p.ResponseCode(session, code.OK)
  109. }
  110. func (p *actorLeague) leagueMailMemberDel(session *cproto.Session, req *pb.I64I32) {
  111. var (
  112. opPlayerID = sessions.GetPlayerID(session)
  113. mailID = req.Key
  114. mailType = req.Value
  115. )
  116. if mailType == enum.MailType_Decree {
  117. p.ResponseCode(session, code.MailDecreeNoCanDel)
  118. return
  119. }
  120. _, found := db.GetMapLeagueTable(p.leagueID)
  121. if !found {
  122. p.ResponseCode(session, code.LeagueNotExist)
  123. return
  124. }
  125. leagueMailTable, found := db.GetMapLeagueMailTable(p.leagueID)
  126. if !found {
  127. p.ResponseCode(session, code.LeagueMailDataNotExist)
  128. return
  129. }
  130. leagueMailList := leagueMailTable.GetLeagueMails(mailType)
  131. if len(leagueMailList.List) <= 0 {
  132. p.ResponseCode(session, code.LeagueMailDataNotExist)
  133. return
  134. }
  135. removeMailIDs := []int64{}
  136. // 删除特定同盟/指挥邮件
  137. if mailID > 0 {
  138. leagueMail, index := leagueMailList.GetLeagueMail(mailID)
  139. if index < 0 {
  140. p.ResponseCode(session, code.MailDataNotFound)
  141. return
  142. }
  143. if leagueMail.DelPlayerIDs.Contains(opPlayerID) {
  144. p.ResponseCode(session, code.MailAlreadyDel)
  145. return
  146. }
  147. leagueMail.DelPlayerIDs.Add(opPlayerID)
  148. removeMailIDs = append(removeMailIDs, mailID)
  149. } else {
  150. for _, leagueMail := range leagueMailList.List {
  151. if leagueMail.DelPlayerIDs.Contains(opPlayerID) || !leagueMail.ReadPlayerIDs.Contains(opPlayerID) {
  152. continue
  153. }
  154. leagueMail.DelPlayerIDs.Add(opPlayerID)
  155. removeMailIDs = append(removeMailIDs, leagueMail.MailID)
  156. }
  157. }
  158. // 暂无可删除邮件
  159. if len(removeMailIDs) <= 0 {
  160. p.ResponseCode(session, code.MailDelNotExist)
  161. return
  162. }
  163. // 通知玩家删除邮件
  164. member := []int64{opPlayerID}
  165. leagueMail.Service().ChangePush(member, mailType, leagueMailList.TopMailID, removeMailIDs)
  166. p.ResponseCode(session, code.OK)
  167. }
  168. // 置顶联盟邮件
  169. func (p *actorLeague) leagueMailTop(session *cproto.Session, req *pb.I64) {
  170. var (
  171. opPlayerID = sessions.GetPlayerID(session)
  172. mailID = req.Value
  173. mailType = enum.MailType_Decree
  174. )
  175. _, found := db.GetMapLeagueTable(p.leagueID)
  176. if !found {
  177. p.ResponseCode(session, code.LeagueNotExist)
  178. return
  179. }
  180. leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID)
  181. if !found {
  182. p.ResponseCode(session, code.LeagueMembersEmpty)
  183. return
  184. }
  185. // 判断玩家是否有权处理
  186. if !leagueMemberTable.LeagueMember.CheckPermission(opPlayerID, enum.League_Permission_Decree) {
  187. p.ResponseCode(session, code.LeaguePermissionDenied)
  188. return
  189. }
  190. leagueMailTable, found := db.GetMapLeagueMailTable(p.leagueID)
  191. if !found {
  192. p.ResponseCode(session, code.LeagueMailDataNotExist)
  193. return
  194. }
  195. leagueMailList := leagueMailTable.GetLeagueMails(mailType)
  196. _, index := leagueMailList.GetLeagueMail(mailID)
  197. if index < 0 {
  198. p.ResponseCode(session, code.MailDataNotFound)
  199. return
  200. }
  201. // 当前置顶邮件唯一ID相同则取消置顶 否则置顶
  202. if leagueMailList.TopMailID == mailID {
  203. leagueMailList.TopMailID = 0
  204. } else {
  205. leagueMailList.TopMailID = mailID
  206. }
  207. leagueMailTable.Save2Queue()
  208. resp := &pb.I64I32{
  209. Key: leagueMailList.TopMailID,
  210. Value: mailType,
  211. }
  212. // 通知联盟所有在线玩家
  213. sessions.PushPlayers(leagueMemberTable.GetLeagueMemberIDs(), nameRoute.PushLeagueMail_Top, resp)
  214. p.ResponseCode(session, code.OK)
  215. }
  216. // 阅读联盟邮件
  217. func (p *actorLeague) leagueMailRead(session *cproto.Session, req *pb.I64I32) {
  218. playerID := sessions.GetPlayerID(session)
  219. if playerID < 1 {
  220. p.ResponseCode(session, code.MailRequestDataError)
  221. return
  222. }
  223. var (
  224. mailID = req.Key
  225. mailType = req.Value
  226. )
  227. if enum.VaildateMailType(mailType) {
  228. p.ResponseCode(session, code.MailTypeError)
  229. return
  230. }
  231. leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID)
  232. if !found {
  233. p.ResponseCode(session, code.LeagueMembersEmpty)
  234. return
  235. }
  236. if !leagueMemberTable.CheckMemberExist(playerID) {
  237. p.ResponseCode(session, code.LeagueMemberNotExist)
  238. return
  239. }
  240. leagueMailTable, found := db.GetMapLeagueMailTable(p.leagueID)
  241. if !found {
  242. p.ResponseCode(session, code.LeagueMailDataNotExist)
  243. return
  244. }
  245. leagueMailList := leagueMailTable.GetLeagueMails(mailType)
  246. leagueMail, index := leagueMailList.GetLeagueMail(mailID)
  247. if index < 0 {
  248. p.ResponseCode(session, code.MailDataNotFound)
  249. return
  250. }
  251. if !leagueMail.ReadPlayerIDs.Contains(playerID) {
  252. leagueMail.ReadPlayerIDs.Add(playerID)
  253. leagueMailTable.Save2Queue()
  254. }
  255. resp := &pb.I64I32{
  256. Key: mailID,
  257. Value: mailType,
  258. }
  259. p.Response(session, resp)
  260. }
  261. // 一键阅读联盟邮件
  262. func (p *actorLeague) leagueMailFastRead(session *cproto.Session, req *pb.I32) {
  263. playerID := sessions.GetPlayerID(session)
  264. if playerID < 1 {
  265. p.ResponseCode(session, code.MailRequestDataError)
  266. return
  267. }
  268. mailType := req.Value
  269. if enum.VaildateMailType(mailType) {
  270. p.ResponseCode(session, code.MailTypeError)
  271. return
  272. }
  273. leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID)
  274. if !found {
  275. p.ResponseCode(session, code.LeagueMembersEmpty)
  276. return
  277. }
  278. if !leagueMemberTable.CheckMemberExist(playerID) {
  279. p.ResponseCode(session, code.LeagueMemberNotExist)
  280. return
  281. }
  282. mailIDs := &pb.I64List{}
  283. leagueMailTable, found := db.GetMapLeagueMailTable(p.leagueID)
  284. if found {
  285. leagueMails := leagueMailTable.GetLeagueMails(mailType)
  286. for _, leagueMail := range leagueMails.List {
  287. if !leagueMail.ReadPlayerIDs.Contains(playerID) {
  288. mailIDs.List = append(mailIDs.List, leagueMail.MailID)
  289. leagueMail.ReadPlayerIDs.Add(playerID)
  290. }
  291. }
  292. }
  293. if len(mailIDs.List) > 0 {
  294. leagueMailTable.Save2Queue()
  295. }
  296. p.Response(session, mailIDs)
  297. }
  298. // 发送联盟邮件
  299. func (p *actorLeague) SendLeagueMail(leagueMemberTable *db.MapLeagueMemberTable, opPlayerID, mailID int64,
  300. mailType int32, title, content string, top bool) int32 {
  301. leagueMailTable, found := db.GetMapLeagueMailTable(p.leagueID)
  302. if !found {
  303. return code.LeagueMailDataNotExist
  304. }
  305. if enum.VaildateLeagueMailType(mailType) {
  306. return code.MailTypeError
  307. }
  308. var (
  309. leagueMailLimit = data.Const.GetLeagueMailLimit(mailType)
  310. leagueMailList = leagueMailTable.GetLeagueMails(mailType)
  311. )
  312. // 当前存在类型邮件列表数据 且 当前为法令邮件 且 当前非更新邮件内容 判断是否达到上限
  313. if mailType == enum.MailType_Decree && mailID <= 0 {
  314. // 检测邮件数量是否超过限制 法令数量超出上限后不能添加 其他是删除旧的数据
  315. if leagueMailList.Size() >= leagueMailLimit {
  316. return code.MailNumLimit
  317. }
  318. }
  319. // 检测邮件标题&内容是否合法
  320. if !utils.CheckStrLen(title, data.Const.LeagueMailTitleLimit) {
  321. return code.MailTitleError
  322. }
  323. if !utils.CheckStrLen(content, data.Const.LeagueMailContentLimit) {
  324. return code.MailContentError
  325. }
  326. newMailID := int64(0)
  327. // 如果是法令邮件更新 删除旧法令邮件数据
  328. if mailType == enum.MailType_Decree && mailID > 0 {
  329. _, ok := leagueMailList.DeleteLeagueMail(mailID)
  330. if !ok {
  331. return code.MailDataNotFound
  332. }
  333. // 更新法令邮件 沿用旧的邮件ID
  334. newMailID = mailID
  335. }
  336. // 新增邮件
  337. if newMailID <= 0 {
  338. newMailID = leagueMailTable.NewLeagueMailID()
  339. }
  340. // 创建一封邮件 联盟邮件更新出了发送人&发送人原来的职位不变,其他都变,且需要新的红点
  341. newLeagueMail := &dbLeague.LeagueMail{
  342. MailID: newMailID,
  343. Title: title,
  344. Content: content,
  345. FromPlayerID: opPlayerID,
  346. Job: leagueMemberTable.LeagueMember.GetLeagueMemberJob(opPlayerID),
  347. SendTime: ctime.Now().ToSecond(),
  348. ReadPlayerIDs: types.List[int64]{},
  349. DelPlayerIDs: types.List[int64]{},
  350. }
  351. // 获取玩家名称
  352. playerData := redis.Game.GetPlayerData(opPlayerID, nameRedis.PlayerNameFields...)
  353. if playerData != nil {
  354. newLeagueMail.FromPlayerName = playerData.PlayerName
  355. }
  356. leagueMailList.AddLeagueMail(newLeagueMail)
  357. removeMailIDs := []int64{}
  358. // 检测邮件是否已满
  359. for leagueMailLimit > 0 && leagueMailList.Size() > leagueMailLimit {
  360. leagueMail, ok := leagueMailList.DeleteLeagueMailIndex(0)
  361. if !ok {
  362. break
  363. }
  364. removeMailIDs = append(removeMailIDs, leagueMail.MailID)
  365. }
  366. // 当前法令邮件才能设置置顶
  367. if mailType == enum.MailType_Decree && top {
  368. leagueMailList.TopMailID = newLeagueMail.MailID
  369. }
  370. // 更新保存邮件
  371. leagueMailTable.Save2Queue()
  372. // 通知联盟所有在线玩家
  373. leagueMail.Service().ChangePush(leagueMemberTable.GetLeagueMemberIDs(), mailType, leagueMailList.TopMailID, removeMailIDs, newLeagueMail)
  374. return code.OK
  375. }