league_diplomacy.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. package mapLeague
  2. import (
  3. capp "f1-game/internal/cherry_app"
  4. "f1-game/internal/code"
  5. "f1-game/internal/constant"
  6. "f1-game/internal/data"
  7. "f1-game/internal/enum"
  8. "f1-game/internal/event"
  9. nameActor "f1-game/internal/name/actor"
  10. nameLocal "f1-game/internal/name/local"
  11. nameRemote "f1-game/internal/name/remote"
  12. "f1-game/internal/pb"
  13. "f1-game/internal/sessions"
  14. "f1-game/nodes/map/internal/db"
  15. leagueBase "f1-game/nodes/map/league/base"
  16. leagueMail "f1-game/nodes/map/league/mail"
  17. ctime "github.com/cherry-game/cherry/extend/time"
  18. cfacade "github.com/cherry-game/cherry/facade"
  19. cproto "github.com/cherry-game/cherry/net/proto"
  20. )
  21. func (p *actorLeague) initDiplomacy() {
  22. p.Local().Register(nameLocal.MapLeague_DiplomacyApplySend, p.diplomacyApplySend)
  23. p.Remote().Register(nameRemote.MapLeague_DiplomacyApply, p.diplomacyApply)
  24. p.Remote().Register(nameRemote.MapLeague_DiplomacyApplyHandle, p.diplomacyApplyHandle)
  25. p.Remote().Register(nameRemote.MapLeague_DiplomacyReject, p.diplomacyReject)
  26. p.Remote().Register(nameRemote.MapLeague_DiplomacyAgree, p.diplomacyAgree)
  27. p.Remote().Register(nameRemote.MapLeague_UmengRelieve, p.umengRelieve)
  28. p.Remote().Register(nameRemote.MapLeague_UmengRelieveCheck, p.umengRelieveCheck)
  29. p.Remote().Register(nameRemote.MapLeague_UnionRelieve, p.unionRelieve)
  30. p.Remote().Register(nameRemote.MapLeague_UnionRelieveCheck, p.unionRelieveCheck)
  31. }
  32. // 联盟外交发送申请
  33. func (p *actorLeague) diplomacyApplySend(session *cproto.Session, req *pb.I64I32) {
  34. var (
  35. playerID = sessions.GetPlayerID(session)
  36. applyLeagueID = req.Key
  37. applyType = req.Value
  38. )
  39. if p.leagueID == applyLeagueID {
  40. p.ResponseCode(session, code.LeagueDiplomacyNoSendSelf)
  41. return
  42. }
  43. if ok := enum.IsNotLeagueDiplomacyType(applyType); ok {
  44. p.ResponseCode(session, code.IllegalArgument)
  45. return
  46. }
  47. leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID)
  48. if !found {
  49. p.ResponseCode(session, code.LeagueMembersEmpty)
  50. return
  51. }
  52. // 判断玩家是否有权限
  53. if ok := leagueMemberTable.CheckPermission(playerID, enum.League_Permission_Diplomacy); !ok {
  54. p.ResponseCode(session, code.LeaguePermissionDenied)
  55. return
  56. }
  57. // 如果当前是加入联邦申请 且当前联盟已加入联邦
  58. if applyType == enum.LeagueDiplomacy_Union && p.leagueTable.Diplomacy.Union.UnionID > 0 {
  59. p.ResponseCode(session, code.LeagueDiplomacyUnionExist)
  60. return
  61. }
  62. // 如果当前是友盟申请
  63. if applyType == enum.LeagueDiplomacy_Umeng {
  64. // 判断当前发送申请联盟是否已经是友盟
  65. if p.leagueTable.Diplomacy.IsUmeng(applyLeagueID) {
  66. p.ResponseCode(session, code.LeagueDiplomacyUmengExist)
  67. return
  68. }
  69. // 判断友盟是否已达上限
  70. if p.leagueTable.Diplomacy.IsUmengFull() {
  71. p.ResponseCode(session, code.LeagueDiplomacyUmengFull)
  72. return
  73. }
  74. }
  75. // 判断当前申请是否已经发送过
  76. if found := p.leagueTable.Diplomacy.IsSendApply(applyLeagueID, applyType); found {
  77. p.ResponseCode(session, code.LeagueDiplomacyApplyExist)
  78. return
  79. }
  80. // 发送申请到目标联盟
  81. var (
  82. sendReq = &pb.I64I32{
  83. Key: p.leagueID,
  84. Value: applyType,
  85. }
  86. path = cfacade.NewChildPath("", nameActor.League, applyLeagueID)
  87. )
  88. capp.Call(path, nameRemote.MapLeague_DiplomacyApply, sendReq)
  89. // 添加申请
  90. p.leagueTable.Diplomacy.AddSendApply(applyLeagueID, applyType)
  91. // 保存数据
  92. p.leagueTable.Save2Queue()
  93. // TODO 通知联盟拥有外交权限成员 新增发送申请联盟
  94. p.ResponseCode(session, code.OK)
  95. }
  96. // 解除友盟外交关系
  97. func (p *actorLeague) umengRelieve(req *pb.I64I64) (*pb.I64, int32) {
  98. var (
  99. playerID = req.Key
  100. relieveLeagueID = req.Value
  101. )
  102. leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID)
  103. if !found {
  104. return nil, code.LeagueMembersEmpty
  105. }
  106. if ok := leagueMemberTable.CheckPermission(playerID, enum.League_Permission_Diplomacy); !ok {
  107. return nil, code.LeaguePermissionDenied
  108. }
  109. // 判断是否是友盟
  110. umeng, found := p.leagueTable.Diplomacy.Umengs.Get(relieveLeagueID)
  111. if !found {
  112. return nil, code.LeagueDiplomacyNotUmeng
  113. }
  114. // 关系解除中
  115. curTime := ctime.Now().ToSecond()
  116. if curTime < umeng.RelieveTime {
  117. return nil, code.LeagueDiplomacyRelieveTime
  118. }
  119. // CallWait到发送申请的联盟处理
  120. var (
  121. // 关系解除的结束时间戳
  122. relieveTime = curTime + data.Const.LeagueUnionLeaveTime
  123. relieveReq = &pb.I64I64{Key: p.leagueID, Value: relieveTime}
  124. path = cfacade.NewChildPath("", nameActor.League, relieveLeagueID)
  125. )
  126. errCode := capp.Call(path, nameRemote.MapLeague_UmengRelieveCheck, relieveReq)
  127. if code.IsFail(errCode) {
  128. return nil, errCode
  129. }
  130. umeng.RelieveTime = relieveTime
  131. p.leagueTable.Save2Queue()
  132. resp := &pb.I64{
  133. Value: umeng.RelieveTime,
  134. }
  135. return resp, code.OK
  136. }
  137. // 解除友盟外交关系检测
  138. func (p *actorLeague) umengRelieveCheck(req *pb.I64I64) {
  139. // 发起解除友盟关系联盟ID
  140. var (
  141. relieveLeagueID = req.Key
  142. relieveTime = req.Value
  143. )
  144. if relieveLeagueID <= 0 {
  145. return
  146. }
  147. // 判断是否是友盟
  148. umeng, found := p.leagueTable.Diplomacy.Umengs.Get(relieveLeagueID)
  149. if !found {
  150. // TODO 看是否需要通知当前解除关系的联盟解除友盟关系
  151. return
  152. }
  153. // 如果当前联盟已经解除过友盟关系 且解除时间比更新的时间要小 跳过
  154. if umeng.RelieveTime > 0 && umeng.RelieveTime <= relieveTime {
  155. return
  156. }
  157. // 更新结束时间戳
  158. umeng.RelieveTime = relieveTime
  159. p.leagueTable.Save2Queue()
  160. // 通知在线联盟成员
  161. leagueBase.Service().UmengRelievePush(p.leagueID, relieveLeagueID, relieveTime)
  162. }
  163. // 解除联邦外交关系
  164. func (p *actorLeague) unionRelieve(req *pb.I64) (*pb.I64, int32) {
  165. playerID := req.Value
  166. if playerID <= 0 {
  167. return nil, code.IllegalArgument
  168. }
  169. leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID)
  170. if !found {
  171. return nil, code.LeagueMembersEmpty
  172. }
  173. // 没有权限
  174. if ok := leagueMemberTable.CheckPermission(playerID, enum.League_Permission_Diplomacy); !ok {
  175. return nil, code.LeaguePermissionDenied
  176. }
  177. var (
  178. unionID = p.leagueTable.Diplomacy.Union.UnionID
  179. unionLeagueID = p.leagueTable.Diplomacy.Union.UnionLeagueID
  180. )
  181. // 没有联邦关系
  182. if unionID <= 0 || unionLeagueID <= 0 {
  183. return nil, code.LeagueUnionNotJoin
  184. }
  185. // 关系解除中
  186. curTime := ctime.Now().ToSecond()
  187. if curTime < p.leagueTable.Diplomacy.Union.UnionRelieveTime {
  188. return nil, code.LeagueDiplomacyRelieveTime
  189. }
  190. var (
  191. unionRelieveTime = curTime + data.Const.LeagueUnionLeaveTime
  192. // key 解除的联邦ID value 关系解除的结束时间戳
  193. relieveReq = &pb.I64I64{Key: unionID, Value: unionRelieveTime}
  194. path = cfacade.NewChildPath("", nameActor.League, unionLeagueID)
  195. )
  196. errCode := capp.Call(path, nameRemote.MapLeague_UnionRelieveCheck, relieveReq)
  197. if code.IsFail(errCode) {
  198. return nil, errCode
  199. }
  200. p.leagueTable.Diplomacy.Union.UnionRelieveTime = unionRelieveTime
  201. resp := &pb.I64{
  202. Value: p.leagueTable.Diplomacy.Union.UnionRelieveTime,
  203. }
  204. return resp, code.OK
  205. }
  206. func (p *actorLeague) unionRelieveCheck(req *pb.I64I64) {
  207. var (
  208. // 发起解除联邦关系联盟ID
  209. relieveUnionID = req.Key
  210. relieveTime = req.Value
  211. )
  212. // 解除的联邦ID不合法
  213. if relieveUnionID <= 0 {
  214. return
  215. }
  216. if p.leagueTable.Diplomacy.Union.UnionID != relieveUnionID {
  217. return
  218. }
  219. // 当前关系正在解除 且结束时间比更新时间要小 不处理
  220. curUnionRelieveTime := p.leagueTable.Diplomacy.Union.UnionRelieveTime
  221. if curUnionRelieveTime > 0 && curUnionRelieveTime <= relieveTime {
  222. return
  223. }
  224. // 更新解除时间
  225. p.leagueTable.Diplomacy.Union.UnionRelieveTime = relieveTime
  226. p.leagueTable.Save2Queue()
  227. // 通知在线联盟成员
  228. leagueBase.Service().UnionRelievePush(p.leagueTable)
  229. }
  230. // 联盟外交接收到申请
  231. func (p *actorLeague) diplomacyApply(req *pb.I64I32) {
  232. var (
  233. sendApplyLeagueID = req.Key
  234. applyType = req.Value
  235. )
  236. _, found := db.GetMapLeagueTable(sendApplyLeagueID)
  237. if !found {
  238. p.Warn("league diplomacy apply fail, league not exist. sendApplyLeagueID: %d, applyType: %d", sendApplyLeagueID, applyType)
  239. return
  240. }
  241. // 如果是邀请加入联邦 需要判断当前是否存在联邦,如果存在则返回
  242. if applyType == enum.LeagueDiplomacy_Union && p.leagueTable.Diplomacy.IsUnionDiplomacy() {
  243. return
  244. }
  245. // 判断是否存在申请
  246. if found := p.leagueTable.Diplomacy.IsApplyExist(sendApplyLeagueID, applyType); found {
  247. return
  248. }
  249. // 添加申请
  250. p.leagueTable.Diplomacy.AddApply(sendApplyLeagueID, applyType)
  251. // 保存
  252. p.leagueTable.Save2Queue()
  253. // 推送给联盟拥有外交权限成员
  254. leagueBase.Service().LeagueDiplomacyApplyChangePush(p.leagueID, sendApplyLeagueID, applyType, enum.LeagueDiplomacy_ApplyAdd)
  255. }
  256. func (p *actorLeague) diplomacyApplyHandle(req *pb.LeagueDiplomacyHandle) (*pb.I64, int32) {
  257. var (
  258. playerID = req.PlayerID
  259. sendApplyLeagueID = req.HandleLeagueID
  260. applyType = req.ApplyType
  261. agree = req.Agree
  262. )
  263. leagueMemberTable, found := db.GetMapLeagueMemberTable(p.leagueID)
  264. if !found {
  265. return nil, code.LeagueMembersEmpty
  266. }
  267. // 判断处理的玩家是否存在权限
  268. if ok := leagueMemberTable.CheckPermission(playerID, enum.League_Permission_Diplomacy); !ok {
  269. return nil, code.LeaguePermissionDenied
  270. }
  271. // 拒绝
  272. if !agree {
  273. resp, errCode := p.doApplyReject(sendApplyLeagueID, applyType)
  274. if code.IsOK(errCode) {
  275. mailID := int32(constant.MailID_LeagueUmengReject)
  276. if applyType == enum.LeagueDiplomacy_Union {
  277. mailID = constant.MailID_LeagueUnionReject
  278. }
  279. leagueMail.Service().SendMailWithPermission(p.leagueID, mailID, enum.League_Permission_Diplomacy, nil, resp.Value)
  280. }
  281. return nil, errCode
  282. }
  283. switch applyType {
  284. //友盟申请
  285. case enum.LeagueDiplomacy_Umeng:
  286. // 友盟人数已满,拒绝申请
  287. if p.leagueTable.Diplomacy.IsUmengFull() {
  288. p.doApplyReject(sendApplyLeagueID, applyType)
  289. return nil, code.LeagueDiplomacyUmengFull
  290. }
  291. // 联邦申请
  292. case enum.LeagueDiplomacy_Union:
  293. // 联盟已存在联邦,拒绝申请
  294. if p.leagueTable.Diplomacy.IsUnionDiplomacy() {
  295. p.doApplyReject(sendApplyLeagueID, applyType)
  296. return nil, code.LeagueDiplomacyUnionExist
  297. }
  298. }
  299. // CallWait到发送申请的联盟处理
  300. var (
  301. agreeReq = &pb.LeagueDiplomacyResult{
  302. LeagueID: p.leagueID,
  303. LeagueName: p.leagueTable.LeagueInfo.LeagueName,
  304. ApplyType: applyType,
  305. }
  306. agreeResp = &pb.I64Str{}
  307. path = cfacade.NewChildPath("", nameActor.League, sendApplyLeagueID)
  308. )
  309. errCode := capp.CallWait(path, nameRemote.MapLeague_DiplomacyAgree, agreeReq, agreeResp)
  310. if code.IsOK(errCode) {
  311. mailID := int32(constant.MailID_LeagueUmengSuccess)
  312. if applyType == enum.LeagueDiplomacy_Umeng {
  313. p.leagueTable.Diplomacy.AddUmeng(sendApplyLeagueID)
  314. // 新增友盟推送
  315. leagueBase.Service().LeagueUmengChangePush(p.leagueID, true, sendApplyLeagueID)
  316. } else {
  317. // 联邦ID更新
  318. p.leagueTable.Diplomacy.Union.UnionID = agreeResp.Key
  319. p.leagueTable.Diplomacy.Union.UnionLeagueID = sendApplyLeagueID
  320. // 同步给联盟成员
  321. leagueBase.Service().LeagueUnionChangePush(p.leagueID,
  322. p.leagueTable.Diplomacy.Union.UnionID, p.leagueTable.Diplomacy.Union.UnionLeagueID)
  323. mailID = constant.MailID_LeagueUnionSuccess
  324. }
  325. // 发送外交关系建立事件
  326. p.PostEvent(event.NewLeagueDiplomacyFinish(p.leagueID, applyType))
  327. // 发送关系建立邮件
  328. leagueMail.Service().SendMailWithPermission(p.leagueID, mailID, enum.League_Permission_Diplomacy, nil, agreeResp.Value)
  329. }
  330. // 不管成功与否都删除申请
  331. p.delApplyAndPush(sendApplyLeagueID, applyType)
  332. p.leagueTable.Save2Queue()
  333. result := &pb.I64{
  334. Value: agreeResp.Key,
  335. }
  336. return result, errCode
  337. }
  338. // 执行申请拒绝
  339. func (p *actorLeague) doApplyReject(applyLeagueID int64, applyType int32) (*pb.Str, int32) {
  340. // 删除接收到的申请
  341. p.delApplyAndPush(applyLeagueID, applyType)
  342. // 通知发起申请的联盟删除发起的申请
  343. var (
  344. rejectReq = &pb.LeagueDiplomacyResult{
  345. LeagueID: p.leagueID,
  346. LeagueName: p.leagueTable.LeagueInfo.LeagueName,
  347. ApplyType: applyType,
  348. }
  349. resp = &pb.Str{}
  350. path = cfacade.NewChildPath("", nameActor.League, applyLeagueID)
  351. )
  352. errCode := capp.CallWait(path, nameRemote.MapLeague_DiplomacyReject, rejectReq, resp)
  353. return resp, errCode
  354. }
  355. // 发送申请被拒绝处理
  356. func (p *actorLeague) diplomacyReject(req *pb.LeagueDiplomacyResult) (*pb.Str, int32) {
  357. var (
  358. rejectLeagueID = req.LeagueID
  359. rejectLeagueName = req.LeagueName
  360. applyType = req.ApplyType
  361. )
  362. if success := p.leagueTable.Diplomacy.DelSendApply(rejectLeagueID, applyType); success {
  363. p.leagueTable.Save2Queue()
  364. var mailID int32
  365. if applyType == enum.LeagueDiplomacy_Umeng {
  366. mailID = constant.MailID_LeagueUmengFail
  367. } else {
  368. mailID = constant.MailID_LeagueUnionFail
  369. }
  370. // 发失败邮件通知外交人员
  371. leagueMail.Service().SendMailWithPermission(p.leagueID, mailID, enum.League_Permission_Diplomacy, nil, rejectLeagueName)
  372. // TODO 看是打开界面请求下发还是直接推送
  373. return &pb.Str{Value: p.leagueTable.LeagueInfo.LeagueName}, code.OK
  374. }
  375. return nil, code.LeagueDiplomacyApplyNotExist
  376. }
  377. // 发送的申请被通过
  378. func (p *actorLeague) diplomacyAgree(req *pb.LeagueDiplomacyResult) (*pb.I64Str, int32) {
  379. var (
  380. agreeLeagueID = req.LeagueID
  381. agreeLeagueName = req.LeagueName
  382. applyType = req.ApplyType
  383. )
  384. // 判断申请是否存在
  385. if found := p.leagueTable.Diplomacy.IsSendApply(agreeLeagueID, applyType); !found {
  386. return nil, code.LeagueDiplomacyApplyNotExist
  387. }
  388. var (
  389. resp = &pb.I64Str{}
  390. mailID = int32(constant.MailID_LeagueUmengSuccess)
  391. )
  392. // 判断是否是友盟申请 如果是友盟申请判断友盟是否已达上限
  393. if applyType == enum.LeagueDiplomacy_Umeng {
  394. // 判断友盟是否已达上限
  395. if p.leagueTable.Diplomacy.IsUmengFull() {
  396. return nil, code.LeagueDiplomacyUmengFull
  397. }
  398. // 添加到友盟列表
  399. p.leagueTable.Diplomacy.AddUmeng(agreeLeagueID)
  400. // 新增友盟推送
  401. leagueBase.Service().LeagueUmengChangePush(p.leagueID, true, agreeLeagueID)
  402. } else {
  403. // 判断是否存在联邦 如果存在则返回联邦ID
  404. if p.leagueTable.Diplomacy.IsUnionDiplomacy() {
  405. return nil, code.LeagueDiplomacyUnionExist
  406. }
  407. // 使用当前联盟的ID作为联邦ID
  408. p.leagueTable.Diplomacy.Union.UnionID = p.leagueID
  409. p.leagueTable.Diplomacy.Union.UnionLeagueID = agreeLeagueID
  410. // 返回联邦ID给同意申请的联盟
  411. resp.Key = p.leagueTable.Diplomacy.Union.UnionID
  412. // 通知在线联盟成员联邦ID变更
  413. leagueBase.Service().LeagueUnionChangePush(p.leagueID,
  414. p.leagueTable.Diplomacy.Union.UnionID, p.leagueTable.Diplomacy.Union.UnionLeagueID)
  415. mailID = constant.MailID_LeagueUnionSuccess
  416. }
  417. // 发送外交关系建立事件
  418. p.PostEvent(event.NewLeagueDiplomacyFinish(p.leagueID, applyType))
  419. resp.Value = p.leagueTable.LeagueInfo.LeagueName
  420. // 发邮件通知外交人员
  421. leagueMail.Service().SendMailWithPermission(p.leagueID, mailID, enum.League_Permission_Diplomacy, nil, agreeLeagueName)
  422. // 删除发起的申请
  423. p.leagueTable.Diplomacy.DelSendApply(agreeLeagueID, applyType)
  424. // TODO 是否需要通知联盟有外交权限的成员 还是打开界面时获取
  425. p.leagueTable.Save2Queue()
  426. return resp, code.OK
  427. }
  428. func (p *actorLeague) delApplyAndPush(leagueID int64, applyType int32) bool {
  429. // 删除接收到的申请
  430. success := p.leagueTable.Diplomacy.DelApply(leagueID, applyType)
  431. if success {
  432. p.leagueTable.Save2Queue()
  433. // 通知联盟拥有外交权限成员
  434. leagueBase.Service().LeagueDiplomacyApplyChangePush(p.leagueID, leagueID, applyType, enum.LeagueDiplomacy_ApplyDel)
  435. }
  436. return success
  437. }