league_diplomacy.go 16 KB

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