guild_manager.go 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528
  1. package model
  2. import (
  3. "encoding/base64"
  4. "errors"
  5. "math/rand"
  6. "rocommon"
  7. "rocommon/service"
  8. "rocommon/util"
  9. model2 "roserver/baseserver/model"
  10. model3 "roserver/db/model"
  11. "roserver/serverproto"
  12. "sort"
  13. "strconv"
  14. )
  15. const (
  16. MAX_APPLY_COUNT = 10
  17. WRITE_DB_MAX_COUTN = 100 //每次写入100个变化的公会
  18. MAX_RECOMMEND_GUILD = 100 //
  19. )
  20. const (
  21. Recruit_None = iota
  22. Recruit_Refused = 1 //拒绝加入
  23. Recruit_Verify = 2 //需要审核
  24. Recruit_None_Verify = 3 //随意加入
  25. )
  26. const (
  27. Guild_Title_Member = 0 //成员
  28. Guild_Title_Vice_Pre = 1 //副会长
  29. Guild_Title_Pre = 2 //会长
  30. )
  31. const (
  32. Guild_Apply_None = 0
  33. Guild_Apply_All_Accept = 1 //全部通过
  34. Guild_Apply_All_Refused = 2 //全部拒绝
  35. )
  36. const (
  37. Guild_Apply_Accept = 1 //同意入会
  38. Guild_Apply_Refused = 2 //拒绝入会
  39. Guild_Apply_Ignore = 3 //无处理
  40. )
  41. const MaxRecommend = 30
  42. const MaxMsgRec = 20
  43. const (
  44. Guild_Event_Type_JoinGuild = 1 //玩家加入公会
  45. Guild_Event_Type_KickGuild = 2 //玩家被踢出工会
  46. Guild_Event_Type_LeaveGuild = 3 //玩家离开公会
  47. Guild_Event_Type_VicePresident = 4 //提升为副会长
  48. Guild_Event_Type_Member = 5 //降职为会员
  49. Guild_Event_Type_ChangePresident = 6 //转让会长
  50. Guild_Event_Type_DirectJoin = 7 //直接加入
  51. Guild_Event_Type_GuildEliteBoss = 8 //精英boss开启
  52. Guild_Event_Type_ChangeGuildPre = 9 //自动转让公会会长
  53. )
  54. const (
  55. Guild_SysChat_Event_Online = 1 //公会管理员上线
  56. Guild_SysChat_Event_PlayerJoin = 2 //会员上线
  57. Guild_SysChat_Event_SummonBoss = 3 //召唤boss
  58. )
  59. //公会boss
  60. const (
  61. Guild_Boss_Type_Normal = 1 //普通公会boss
  62. Guild_Boss_Type_Elite = 2 //召唤公会boss
  63. )
  64. //公会boss状态
  65. const (
  66. Guild_Boss_State_Wait_Summon = 1 //待召唤
  67. Guild_Boss_State_Fight = 2 //战斗状态
  68. Guild_Boss_State_Fight_Finish = 3 //结算状态
  69. )
  70. type RecommendInfo struct {
  71. GuildId uint32
  72. Level int32
  73. Active uint32
  74. ActiveTime int64
  75. }
  76. //公会做一个超时从内存移除机制//目前设定超时6小时,从内存移除
  77. type GuildData struct {
  78. GuildBase *serverproto.GuildBase //公会基础信息
  79. GuildMember *serverproto.MemberData //公会成员信息
  80. ApplyList *serverproto.GuildApplayData //申请列表
  81. GuildLogs *serverproto.GuildLogSet //公会日志
  82. GuildMsg []*serverproto.MessageContentInfo //公会聊天记录
  83. GuildSys *serverproto.SystemMessage //公会boos通知
  84. GuildBoss map[uint32]*serverproto.GuildBossInfo //公会boss
  85. GuildDemon *serverproto.GuildDemon //公会魔王
  86. LogLoad bool
  87. ApplyListTime int64 //上次拉去公会申请列表时间
  88. CheckMemberGuild bool
  89. }
  90. type GuildManager struct {
  91. Guilds map[uint64]*GuildData //按照工会ID索引 //需要定义一个列表大小
  92. GuildsIndex map[string]*serverproto.GuildIdex //按照工会名字索引 key:名字, value:公会ID
  93. RoleToGuilds map[uint64]*serverproto.GuildIdex //玩家公会映射
  94. // CurGuildID uint64 //当前用到的ID
  95. ApplyData map[uint64]*serverproto.RoleApplayData //公会申请列表
  96. // ChangeList map[uint32]int32 //有变化的公会Key:公会ID, value,变化类型:
  97. //公会推荐列表
  98. RecommendGuildIndex map[uint64]int32 //推荐的公会索引
  99. RecommendGuild []*serverproto.RecommendGuild //推荐公会//定时更新,只推荐人未满员,申请列表为满员的活跃公会。从Guilds中查找
  100. GuildManagerInit bool
  101. BossTickTime int64
  102. DemonTickTime uint64
  103. }
  104. func newGuildManager() *GuildManager {
  105. guildMag := &GuildManager{}
  106. guildMag.Guilds = map[uint64]*GuildData{}
  107. guildMag.GuildsIndex = map[string]*serverproto.GuildIdex{}
  108. guildMag.RoleToGuilds = map[uint64]*serverproto.GuildIdex{}
  109. guildMag.ApplyData = map[uint64]*serverproto.RoleApplayData{}
  110. guildMag.GuildManagerInit = false
  111. guildMag.RecommendGuildIndex = make(map[uint64]int32)
  112. return guildMag
  113. }
  114. //TODO wangzhaocan 后期优化//定时更新推荐列表
  115. func (this *GuildManager) Update(ms uint64) {
  116. if service.GetRedis() == nil {
  117. return
  118. }
  119. if this.GuildManagerInit == false {
  120. err := this.LoadRecommendGuild()
  121. if err != nil {
  122. }
  123. err = this.LoadGuildDataFromRedis()
  124. if err != nil {
  125. }
  126. err = this.LoadGuildNameIndex()
  127. if err != nil {
  128. }
  129. err = this.LoadRoleToGuildFromRedis()
  130. if err != nil {
  131. }
  132. this.GuildManagerInit = true
  133. }
  134. this.GuildBossReset(Guild_Boss_Type_Normal)
  135. this.GuildBossReset(Guild_Boss_Type_Elite)
  136. this.RefreshGuildDemonAll(ms)
  137. }
  138. //初始其服务器只加载推荐的公会。
  139. func (this *GuildManager) LoadGuildDataFromRedis() error {
  140. if service.GetRedis() == nil {
  141. return errors.New("redis not ok")
  142. }
  143. if len(this.RecommendGuild) <= 0 {
  144. util.InfoF("[LoadGuildDataFromRedis] RecommendGuild empty")
  145. return nil
  146. }
  147. for _, data := range this.RecommendGuild {
  148. fieldStr := strconv.FormatUint(uint64(data.GuildId), 10)
  149. this.Guilds[data.GuildId] = &GuildData{
  150. GuildBase: &serverproto.GuildBase{},
  151. GuildMember: &serverproto.MemberData{},
  152. ApplyList: &serverproto.GuildApplayData{},
  153. GuildDemon: &serverproto.GuildDemon{},
  154. }
  155. //加载公会基础信息
  156. baseStr := model2.GuildBasePrefix
  157. guildBaseStr, baseErr := service.GetRedis().HGet(baseStr, fieldStr).Result()
  158. if baseErr == nil {
  159. guildBase := &serverproto.GuildBase{}
  160. err := model2.GetDecodeMessage(guildBase, guildBaseStr)
  161. if err == nil {
  162. this.Guilds[data.GuildId].GuildBase = guildBase
  163. } else {
  164. util.InfoF("[LoadGuildDataFromRedis] get guildBaseStr [%v] err:%v", guildBaseStr, err)
  165. return nil
  166. }
  167. }
  168. //加载公会成员信息
  169. memberStr := model2.GuildMemberPrefix
  170. guildMemberStr, memberErr := service.GetRedis().HGet(memberStr, fieldStr).Result()
  171. if memberErr == nil {
  172. guildMember := &serverproto.MemberData{}
  173. err := model2.GetDecodeMessage(guildMember, guildMemberStr)
  174. if err == nil {
  175. this.Guilds[data.GuildId].GuildMember = guildMember
  176. } else {
  177. util.InfoF("[LoadGuildDataFromRedis] get guildMemberStr [%v] err:%v", guildMemberStr, err)
  178. return nil
  179. }
  180. /*
  181. if len(guildMember.MemberInfo) > 1 {
  182. this.CheckMemberGuild(this.Guilds[data.GuildId])
  183. }
  184. */
  185. }
  186. //加载公会申请数据
  187. applyStr := model2.GuildApplyPrefix
  188. guildApplyStr, guildErr := service.GetRedis().HGet(applyStr, fieldStr).Result()
  189. if guildErr == nil {
  190. guildApply := &serverproto.GuildApplayData{}
  191. err := model2.GetDecodeMessage(guildApply, guildApplyStr)
  192. if err == nil {
  193. this.Guilds[data.GuildId].ApplyList = guildApply
  194. } else {
  195. util.InfoF("[LoadGuildDataFromRedis] get guildApplyStr [%v] err:%v", guildApplyStr, err)
  196. return nil
  197. }
  198. }
  199. err := this.LoadGuildDemon(this.Guilds[data.GuildId])
  200. if err == nil {
  201. }
  202. }
  203. return nil
  204. }
  205. //服务器启动从DB加载进来
  206. /*
  207. func (this *GuildManager)LoadGuildDataToRedis() error {
  208. if service.GetRedis() == nil {
  209. return errors.New("redis not ok")
  210. }
  211. keyStr := model2.GuildBasePrefix
  212. valueStr, err := service.GetRedis().HGetAll(keyStr).Result()
  213. if err != nil {
  214. util.InfoF("[LoadGuildDataToRedis] get GuildBasePrefix [%v] err:%v", keyStr, err)
  215. return err
  216. }
  217. for index, guildData := range valueStr {
  218. val, _ := model2.Str2Num(index)
  219. msgStr, err := base64.StdEncoding.DecodeString(guildData)
  220. if err != nil {
  221. util.InfoF("[LoadGuildDataToRedis] get GuildBasePrefix [%v] err:%v", index, err)
  222. continue
  223. }
  224. guildData := &serverproto.GuildBase{}
  225. err = rocommon.GetCodec().Unmarshal(msgStr, guildData)
  226. if err == nil {
  227. //做个优化。如果是3天之内有活跃度变化的加载进来,否则延迟加载
  228. // guildId := guildData.GuildBrief.GuildId
  229. this.Guilds[uint32(val)] = &GuildData{
  230. GuildBase: guildData,
  231. GuildMember: &serverproto.MemberData{},
  232. ApplyList: &serverproto.GuildApplayData{},
  233. }
  234. util.InfoF("[LoadGuildDataToRedis] get GuildBasePrefix :%v", this.Guilds[uint32(val)].ApplyList)
  235. } else {
  236. return err
  237. }
  238. }
  239. keyStr1 := model2.GuildMemberPrefix
  240. valueStr1, err1 := service.GetRedis().HGetAll(keyStr1).Result()
  241. if err1 != nil {
  242. util.InfoF("[LoadGuildDataToRedis] get GuildMemberPrefix [%v] err:%v", keyStr1, err)
  243. return err
  244. }
  245. for guildId, guildMember := range valueStr1 {
  246. val, _ := model2.Str2Num(guildId)
  247. msgStr, err := base64.StdEncoding.DecodeString(guildMember)
  248. if err != nil {
  249. util.InfoF("[LoadGuildDataToRedis] get GuildMemberPrefix [%v] err:%v", guildId, err)
  250. continue
  251. }
  252. memberData := &serverproto.MemberData{}
  253. err = rocommon.GetCodec().Unmarshal(msgStr, memberData)
  254. if err == nil {
  255. //做个优化。如果是3天之内有活跃度变化的加载进来,否则延迟加载
  256. guildData := this.Guilds[uint32(val)]
  257. if guildData != nil {
  258. guildData.GuildMember = memberData
  259. }
  260. } else {
  261. return err
  262. }
  263. }
  264. //加载公会申请数据
  265. keyStr2 := model2.GuildApplyPrefix
  266. valueStr2, err2 := service.GetRedis().HGetAll(keyStr2).Result()
  267. if err2 != nil {
  268. util.InfoF("[LoadGuildDataToRedis] get GuildApplyPrefix [%v] err:%v", keyStr2, err)
  269. return err
  270. }
  271. for guildId, guildApply := range valueStr2 {
  272. val, _ := model2.Str2Num(guildId)
  273. msgStr, err := base64.StdEncoding.DecodeString(guildApply)
  274. if err != nil {
  275. util.InfoF("[LoadGuildDataToRedis] get GuildApplyPrefix [%v] err:%v", guildId, err)
  276. continue
  277. }
  278. applyData := &serverproto.GuildApplayData{}
  279. err = rocommon.GetCodec().Unmarshal(msgStr, applyData)
  280. if err == nil {
  281. guildData := this.Guilds[uint32(val)]
  282. if guildData != nil {
  283. guildData.ApplyList = applyData
  284. util.InfoF("[LoadGuildDataToRedis] get GuildApplyPrefix err:%v", applyData)
  285. }
  286. } else {
  287. return err
  288. }
  289. }
  290. //加载
  291. util.DebugF("[LoadGuildDataToRedis] get guild :%s", this.Guilds)
  292. return nil
  293. }
  294. */
  295. func (this *GuildManager) RemoveGuildFromRedis(guildId uint64, guildName string) {
  296. this.DeleteGuildBaseFromRedis(guildId)
  297. this.DeleteGuildMemberFromRedis(guildId)
  298. this.DeleteGuildApplyFromRedis(guildId)
  299. this.RemoveGuildNameIndex(guildName)
  300. }
  301. //定时写入DB
  302. func (this *GuildManager) SaveGuildBase(guild *GuildData) {
  303. if guild == nil {
  304. return
  305. }
  306. fieldStr := strconv.FormatUint(uint64(guild.GuildBase.GuildBrief.GuildId), 10)
  307. keyStr := model2.GuildBasePrefix
  308. msgData, err := rocommon.GetCodec().Marshal(guild.GuildBase)
  309. if err != nil {
  310. util.InfoF("[SaveGuildBase] Marshal err:%v %v %s", err, fieldStr, msgData)
  311. return
  312. }
  313. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  314. ret, err := service.GetRedis().HSet(keyStr, fieldStr, msgStr).Result()
  315. if err != nil {
  316. util.InfoF("[SaveGuildBase] err:%v %v", err, ret)
  317. return
  318. }
  319. util.InfoF("[SaveGuildBase] save guild_base data success")
  320. }
  321. //从数据库中删除玩家申请数据
  322. func (this *GuildManager) DeleteGuildBaseFromRedis(guildId uint64) {
  323. fieldStr := strconv.FormatUint(uint64(guildId), 10)
  324. service.GetRedis().HDel(model2.GuildBasePrefix, fieldStr)
  325. }
  326. //保存玩家申请的ID
  327. func (this *GuildManager) SaveRoleApplyData(uid uint64, applyData *serverproto.RoleApplayData) {
  328. if applyData == nil {
  329. return
  330. }
  331. //如果申请列表为空
  332. if len(applyData.ApplyGuild) <= 0 {
  333. //从数据库中删除此人申请信息
  334. this.RemoveRoleApplyFromRedis(uid)
  335. //从内存中删除申请信息
  336. delete(this.ApplyData, uid)
  337. return
  338. }
  339. //申请列表不为空
  340. fieldStr := strconv.FormatUint(uid, 10)
  341. keyStr := model2.RoleApplyPrefix
  342. msgData, err := rocommon.GetCodec().Marshal(applyData)
  343. if err != nil {
  344. util.InfoF("[SaveRoleApplyData] Marshal err:%v %v %s", err, fieldStr, msgData)
  345. return
  346. }
  347. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  348. ret, err := service.GetRedis().HSet(keyStr, fieldStr, msgStr).Result()
  349. if err != nil {
  350. util.InfoF("[SaveRoleApplyData] err:%v %v", err, ret)
  351. return
  352. }
  353. util.InfoF("[SaveRoleApplyData] save role_apply data success")
  354. }
  355. //查找玩家的申请ID
  356. func (this *GuildManager) GetRoleApplyInfo(uid uint64) *serverproto.RoleApplayData {
  357. applyData, ok := this.ApplyData[uid]
  358. if ok {
  359. return applyData
  360. }
  361. fieldStr := strconv.FormatUint(uint64(uid), 10)
  362. applyStr, applyErr := service.GetRedis().HGet(model2.RoleApplyPrefix, fieldStr).Result()
  363. if applyErr == nil {
  364. recordApply := &serverproto.RoleApplayData{}
  365. memberErr := model2.GetDecodeMessage(recordApply, applyStr)
  366. if memberErr == nil {
  367. this.ApplyData[uid] = recordApply
  368. return recordApply
  369. } else {
  370. return nil
  371. }
  372. }
  373. return nil
  374. }
  375. //从数据库中删除玩家申请数据
  376. func (this *GuildManager) RemoveRoleApplyFromRedis(uid uint64) {
  377. fieldStr := strconv.FormatUint(uint64(uid), 10)
  378. service.GetRedis().HDel(model2.RoleApplyPrefix, fieldStr)
  379. }
  380. //公会成员存储
  381. func (this *GuildManager) SaveGuildMember(guildData *GuildData) {
  382. if guildData == nil {
  383. return
  384. }
  385. //校验一下
  386. // this.CheckMemberGuild(guildData)
  387. fieldStr := strconv.FormatUint(uint64(guildData.GuildBase.GuildBrief.GuildId), 10)
  388. keyStr := model2.GuildMemberPrefix
  389. msgData, err := rocommon.GetCodec().Marshal(guildData.GuildMember)
  390. if err != nil {
  391. util.InfoF("[SaveGuildMember] Marshal err:%v %v %s", err, fieldStr, msgData)
  392. return
  393. }
  394. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  395. ret, err := service.GetRedis().HSet(keyStr, fieldStr, msgStr).Result()
  396. if err != nil {
  397. util.InfoF("[SaveGuildMember] err:%v %v", err, ret)
  398. return
  399. }
  400. util.InfoF("[SaveGuildMember] save guild_member data success :%v", guildData.GuildMember)
  401. }
  402. //从数据库中删除玩家申请数据
  403. func (this *GuildManager) DeleteGuildMemberFromRedis(guildId uint64) {
  404. fieldStr := strconv.FormatUint(uint64(guildId), 10)
  405. service.GetRedis().HDel(model2.GuildMemberPrefix, fieldStr)
  406. }
  407. func (this *GuildManager) SaveGuildApply(guildData *GuildData) {
  408. if guildData == nil {
  409. return
  410. }
  411. fieldStr := strconv.FormatUint(uint64(guildData.GuildBase.GuildBrief.GuildId), 10)
  412. keyStr := model2.GuildApplyPrefix
  413. msgData, err := rocommon.GetCodec().Marshal(guildData.ApplyList)
  414. if err != nil {
  415. util.InfoF("[SaveGuildApply] Marshal err:%v %v %s", err, fieldStr, msgData)
  416. return
  417. }
  418. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  419. ret, err := service.GetRedis().HSet(keyStr, fieldStr, msgStr).Result()
  420. if err != nil {
  421. util.InfoF("[SaveGuildApply] err:%v %v", err, ret)
  422. return
  423. }
  424. }
  425. //从数据库中删除玩家申请数据
  426. func (this *GuildManager) DeleteGuildApplyFromRedis(guildId uint64) {
  427. fieldStr := strconv.FormatUint(uint64(guildId), 10)
  428. service.GetRedis().HDel(model2.GuildApplyPrefix, fieldStr)
  429. }
  430. func (this *GuildManager) SaveGuildNameIndex(name string) {
  431. guildIndex := this.GuildsIndex[name]
  432. if guildIndex.GuildId == 0 {
  433. return
  434. }
  435. fieldStr := name
  436. keyStr := model2.GuildNameIndexPrefix
  437. msgData, err := rocommon.GetCodec().Marshal(guildIndex)
  438. if err != nil {
  439. util.InfoF("[SaveGuildNameIndex] Marshal err:%v %v %s", err, fieldStr, msgData)
  440. return
  441. }
  442. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  443. ret, err := service.GetRedis().HSet(keyStr, fieldStr, msgStr).Result()
  444. if err != nil {
  445. util.InfoF("[SaveGuildNameIndex] err:%v %v", err, ret)
  446. return
  447. }
  448. }
  449. func (this *GuildManager) LoadGuildNameIndex() error {
  450. keyStr := model2.GuildNameIndexPrefix
  451. valueStr, err := service.GetRedis().HGetAll(keyStr).Result()
  452. if err != nil {
  453. util.InfoF("[LoadGuildNameIndex] get GuildNameIndexPrefix [%v] err:%v", keyStr, err)
  454. return err
  455. }
  456. for guildName, guildId := range valueStr {
  457. msgStr, err := base64.StdEncoding.DecodeString(guildId)
  458. if err != nil {
  459. util.InfoF("[LoadGuildNameIndex] get guildId [%v] err:%v", guildId, err)
  460. continue
  461. }
  462. guildIndex := &serverproto.GuildIdex{}
  463. err = rocommon.GetCodec().Unmarshal(msgStr, guildIndex)
  464. if err == nil {
  465. this.GuildsIndex[guildName] = guildIndex
  466. } else {
  467. return err
  468. }
  469. }
  470. return nil
  471. }
  472. func (this *GuildManager) RemoveGuildNameIndex(name string) {
  473. fieldStr := name
  474. service.GetRedis().HDel(model2.GuildNameIndexPrefix, fieldStr)
  475. delete(this.GuildsIndex, name)
  476. }
  477. func (this *GuildManager) SaveRoleToGuild(uid uint64) {
  478. guildId := this.RoleToGuilds[uid]
  479. if guildId != nil {
  480. //从redis删除
  481. fieldStr := strconv.FormatUint(uint64(uid), 10)
  482. keyStr := model2.GuildRoleToGuildPrefix
  483. msgData, err := rocommon.GetCodec().Marshal(guildId)
  484. if err != nil {
  485. util.InfoF("[SaveRoleToGuild] Marshal err:%v %v %s", err, fieldStr, msgData)
  486. return
  487. }
  488. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  489. ret, err := service.GetRedis().HSet(keyStr, fieldStr, msgStr).Result()
  490. if err != nil {
  491. util.InfoF("[SaveRoleToGuild] err:%v %v", err, ret)
  492. return
  493. }
  494. util.InfoF("[SaveRoleToGuild] save success")
  495. }
  496. }
  497. func (this *GuildManager) RemoveRoleToGuild(uid uint64) {
  498. guildId := this.RoleToGuilds[uid]
  499. if guildId != nil {
  500. //从redis删除
  501. fieldStr := strconv.FormatUint(uint64(uid), 10)
  502. keyStr := model2.GuildRoleToGuildPrefix
  503. service.GetRedis().HDel(keyStr, fieldStr)
  504. delete(this.RoleToGuilds, uid)
  505. }
  506. }
  507. func (this *GuildManager) LoadRoleToGuildFromRedis() error {
  508. keyStr := model2.GuildRoleToGuildPrefix
  509. valueStr, err := service.GetRedis().HGetAll(keyStr).Result()
  510. if err != nil {
  511. util.InfoF("[LoadRoleToGuildFromRedis] get GuildRoleToGuildPrefix [%v] err:%v", keyStr, err)
  512. return err
  513. }
  514. for uidStr, guildId := range valueStr {
  515. val, _ := model2.Str2NumU64(uidStr)
  516. msgStr, err := base64.StdEncoding.DecodeString(guildId)
  517. if err != nil {
  518. util.InfoF("[LoadRoleToGuildFromRedis] get guildId [%v] err:%v", guildId, err)
  519. continue
  520. }
  521. guildIndex := &serverproto.GuildIdex{}
  522. err = rocommon.GetCodec().Unmarshal(msgStr, guildIndex)
  523. if err == nil {
  524. this.RoleToGuilds[val] = guildIndex
  525. } else {
  526. return err
  527. }
  528. }
  529. util.InfoF("[LoadRoleToGuildFromRedis] load success")
  530. return nil
  531. }
  532. //
  533. func (this *GuildManager) RemoveGuildLogFromRedis(guildId uint64, guildLog *serverproto.GuildLog) {
  534. value := strconv.FormatUint(uint64(guildId), 10)
  535. keyStr := model2.GuildLogPrefix + value
  536. fieldStr := strconv.FormatUint(guildLog.EventTime, 10)
  537. service.GetRedis().HDel(keyStr, fieldStr)
  538. return
  539. }
  540. func (this *GuildManager) SaveGuildLogToRedis(guildId uint64, guildLog *serverproto.GuildLog) {
  541. if guildLog == nil {
  542. return
  543. }
  544. value := strconv.FormatUint(uint64(guildId), 10)
  545. keyStr := model2.GuildLogPrefix + value
  546. fieldStr := strconv.FormatUint(guildLog.EventTime, 10)
  547. msgData, err := rocommon.GetCodec().Marshal(guildLog)
  548. if err != nil {
  549. util.InfoF("[SetRoleHeroDataToRedis] Marshal err:%v %v", err, fieldStr)
  550. return
  551. }
  552. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  553. ret, err := service.GetRedis().HSet(keyStr, fieldStr, msgStr).Result()
  554. if err != nil {
  555. util.InfoF("[SetRoleHeroDataToRedis] err:%v %v", err, ret)
  556. return
  557. }
  558. }
  559. //加载1个公会的公会日志
  560. func (this *GuildManager) GetGuildLog(guildId uint64, guild *GuildData) error {
  561. if guild == nil || guild.LogLoad == true {
  562. return nil
  563. }
  564. if guild.GuildLogs == nil {
  565. guild.GuildLogs = &serverproto.GuildLogSet{}
  566. }
  567. value := strconv.FormatUint(uint64(guildId), 10)
  568. keyStr := model2.GuildLogPrefix + value
  569. valueStr, err := service.GetRedis().HGetAll(keyStr).Result()
  570. if err != nil {
  571. util.InfoF("[GetGuildLog] get GuildLogPrefix [%v] err:%v", keyStr, err)
  572. return err
  573. }
  574. for _, logData := range valueStr {
  575. msgStr, err := base64.StdEncoding.DecodeString(logData)
  576. if err != nil {
  577. util.InfoF("[GetGuildLog] get guildId [%v] err:%v", guildId, err)
  578. continue
  579. }
  580. guildLog := &serverproto.GuildLog{}
  581. err = rocommon.GetCodec().Unmarshal(msgStr, guildLog)
  582. if err == nil {
  583. guild.GuildLogs.GuildLog = append(guild.GuildLogs.GuildLog, guildLog)
  584. } else {
  585. return err
  586. }
  587. }
  588. if len(guild.GuildLogs.GuildLog) > 1 {
  589. //按照时间排序
  590. sort.Slice(guild.GuildLogs.GuildLog, func(i, j int) bool {
  591. return guild.GuildLogs.GuildLog[i].EventTime > guild.GuildLogs.GuildLog[j].EventTime
  592. })
  593. }
  594. return nil
  595. }
  596. func (this *GuildManager) AddGuildLog(guild *GuildData, opTitle int32, opId uint64, beOpTitle int32, beOpId uint64, eventType int32) {
  597. if guild == nil {
  598. return
  599. }
  600. if guild.GuildLogs == nil {
  601. guild.GuildLogs = &serverproto.GuildLogSet{}
  602. }
  603. count := len(guild.GuildLogs.GuildLog)
  604. if count >= int(model2.GlobalGuildLogMaxCount) {
  605. this.RemoveGuildLogFromRedis(guild.GuildBase.GuildBrief.GuildId, guild.GuildLogs.GuildLog[model2.GlobalGuildLogMaxCount-1])
  606. //从数据库中删除一个元素
  607. newLog := append(guild.GuildLogs.GuildLog[:count-1])
  608. guild.GuildLogs.GuildLog = newLog
  609. }
  610. var opName string = ""
  611. var beOpName string = ""
  612. if opId != 0 {
  613. opBrief := &serverproto.CommonPlayerBriefInfo{}
  614. err := model3.GetSystemDataFromRedis(model3.RolePlayerBriefPrefix, opId, opBrief)
  615. if err == nil {
  616. opName = opBrief.NickName
  617. }
  618. }
  619. if beOpId != 0 {
  620. beOpBrief := &serverproto.CommonPlayerBriefInfo{}
  621. err2 := model3.GetSystemDataFromRedis(model3.RolePlayerBriefPrefix, beOpId, beOpBrief)
  622. if err2 == nil {
  623. beOpName = beOpBrief.NickName
  624. }
  625. }
  626. log := &serverproto.GuildLog{
  627. OpTitle: opTitle,
  628. OpName: opName,
  629. BeOpTitle: beOpTitle,
  630. BeOpName: beOpName,
  631. EventTime: uint64(util.GetCurrentTime()),
  632. EventType: eventType,
  633. }
  634. guild.GuildLogs.GuildLog = append([]*serverproto.GuildLog{log}, guild.GuildLogs.GuildLog...)
  635. this.SaveGuildLogToRedis(guild.GuildBase.GuildBrief.GuildId, log)
  636. }
  637. /*
  638. func (this *GuildManager) SaveGuildID() {
  639. keyStr := model2.GuildCurGuildIdPrefix
  640. curGuildId := &serverproto.GuildIdex{
  641. GuildId: this.CurGuildID,
  642. }
  643. msgData, err := rocommon.GetCodec().Marshal(curGuildId)
  644. if err != nil {
  645. return
  646. }
  647. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  648. ret, err := service.GetRedis().Set(keyStr, msgStr, 0).Result()
  649. if err != nil {
  650. util.InfoF("SaveGuildID err=%v ret=%v", keyStr, ret)
  651. return
  652. }
  653. util.InfoF("SaveGuildID save guildIdIndex sucess : %v", curGuildId)
  654. }
  655. func (this *GuildManager) LoadGuildID() {
  656. keyStr := model2.GuildCurGuildIdPrefix
  657. ret, err := service.GetRedis().Get(keyStr).Result()
  658. if err != nil {
  659. util.InfoF("LoadGuildID get guildId key=%v err=%v\n", keyStr, err)
  660. return
  661. }
  662. if ret == "" {
  663. util.InfoF("key(%v)->val empty", keyStr)
  664. return
  665. }
  666. str, err := base64.StdEncoding.DecodeString(ret)
  667. if err != nil {
  668. util.InfoF("key(%v)->val DecodeString error", keyStr)
  669. return
  670. }
  671. curGuildId := &serverproto.GuildIdex{}
  672. err = rocommon.GetCodec().Unmarshal(str, curGuildId)
  673. if err == nil {
  674. this.CurGuildID = curGuildId.GuildId
  675. util.InfoF("LoadGuildID success:%v", this.CurGuildID)
  676. return
  677. }
  678. util.InfoF("LoadGuildID failed")
  679. }
  680. */
  681. func (this *GuildManager) SaveGuildBoss(bossId uint32, guild *GuildData) {
  682. if guild == nil || guild.GuildBoss == nil {
  683. return
  684. }
  685. bossInfo, ok := guild.GuildBoss[bossId]
  686. if !ok {
  687. return
  688. }
  689. value := strconv.FormatUint(uint64(guild.GuildBase.GuildBrief.GuildId), 10)
  690. keyStr := model2.GuildBossPrefix + value
  691. fieldStr := strconv.FormatUint(uint64(bossId), 10)
  692. msgData, err := rocommon.GetCodec().Marshal(bossInfo)
  693. if err != nil {
  694. util.InfoF("[SaveGuildBoss] Marshal err:%v %v", err, fieldStr)
  695. return
  696. }
  697. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  698. ret, err := service.GetRedis().HSet(keyStr, fieldStr, msgStr).Result()
  699. if err != nil {
  700. util.InfoF("[SaveGuildBoss] err:%v %v", err, ret)
  701. return
  702. }
  703. }
  704. func (this *GuildManager) RemoveGuildBoss(bossId uint32, guild *GuildData) {
  705. if guild == nil || guild.GuildBoss == nil || len(guild.GuildBoss) <= 0 {
  706. return
  707. }
  708. fieldStr := strconv.FormatUint(uint64(bossId), 10)
  709. value := strconv.FormatUint(uint64(guild.GuildBase.GuildBrief.GuildId), 10)
  710. keyStr := model2.GuildBossPrefix + value
  711. service.GetRedis().HDel(keyStr, fieldStr)
  712. delete(guild.GuildBoss, bossId)
  713. }
  714. //加载1个公会的公会BOSS
  715. func (this *GuildManager) LoadGuildBoss(guild *GuildData) error {
  716. if guild == nil {
  717. return nil
  718. }
  719. if guild.GuildBoss == nil {
  720. guild.GuildBoss = map[uint32]*serverproto.GuildBossInfo{}
  721. }
  722. value := strconv.FormatUint(uint64(guild.GuildBase.GuildBrief.GuildId), 10)
  723. keyStr := model2.GuildBossPrefix + value
  724. valueStr, err := service.GetRedis().HGetAll(keyStr).Result()
  725. if err != nil {
  726. util.InfoF("[GetGuildBoss] get GuildBossPrefix [%v] err:%v", keyStr, err)
  727. return err
  728. }
  729. for bossId, bossData := range valueStr {
  730. id, _ := model2.Str2NumU64(bossId)
  731. msgStr, err := base64.StdEncoding.DecodeString(bossData)
  732. if err != nil {
  733. util.InfoF("[GetGuildBoss] get guildId [%v] err:%v", id, err)
  734. continue
  735. }
  736. bossInfo := &serverproto.GuildBossInfo{}
  737. err = rocommon.GetCodec().Unmarshal(msgStr, bossInfo)
  738. if err == nil {
  739. //超过两条需要排序,降序
  740. if len(bossInfo.FightLog) >= 2 {
  741. sort.Slice(bossInfo.FightLog, func(i, j int) bool { return bossInfo.FightLog[j].FightTime > bossInfo.FightLog[i].FightTime })
  742. }
  743. guild.GuildBoss[uint32(id)] = bossInfo
  744. } else {
  745. return err
  746. }
  747. }
  748. if guild.GuildBoss != nil {
  749. this.UpdateNormalBoss(guild)
  750. this.UpdateEliteBoss(guild)
  751. }
  752. return nil
  753. }
  754. func (this *GuildManager) LoadRecommendGuild() error {
  755. this.RecommendGuildIndex = make(map[uint64]int32)
  756. keyStr := model2.GuildRecommendPrefix
  757. ret, err := service.GetRedis().Get(keyStr).Result()
  758. if err != nil {
  759. util.InfoF("LoadRecommendGuild get guildId key=%v err=%v\n", keyStr, err)
  760. return err
  761. }
  762. if ret == "" {
  763. util.InfoF("key(%v)->val empty", keyStr)
  764. return err
  765. }
  766. str, err := base64.StdEncoding.DecodeString(ret)
  767. if err != nil {
  768. util.InfoF("key(%v)->val DecodeString error", keyStr)
  769. return err
  770. }
  771. recommend := &serverproto.RecommendSet{}
  772. err = rocommon.GetCodec().Unmarshal(str, recommend)
  773. if err == nil {
  774. for _, data := range recommend.Guild {
  775. this.RecommendGuild = append(this.RecommendGuild, data)
  776. this.RecommendGuildIndex[data.GuildId] = 1
  777. }
  778. sort.Slice(this.RecommendGuild, func(i, j int) bool {
  779. if this.RecommendGuild[i].Level > this.RecommendGuild[j].Level {
  780. return true
  781. } else if this.RecommendGuild[i].Level < this.RecommendGuild[j].Level {
  782. return false
  783. } else {
  784. if this.RecommendGuild[i].ActiveTime > this.RecommendGuild[j].ActiveTime {
  785. return true
  786. } else if this.RecommendGuild[i].ActiveTime < this.RecommendGuild[j].ActiveTime {
  787. return false
  788. } else {
  789. if this.RecommendGuild[i].Active > this.RecommendGuild[j].Active {
  790. return true
  791. }
  792. return false
  793. }
  794. }
  795. })
  796. util.InfoF("LoadRecommendGuild success:%v", len(this.RecommendGuild))
  797. return nil
  798. }
  799. util.InfoF("LoadRecommendGuild failed")
  800. return err
  801. }
  802. func (this *GuildManager) SaveRecommendGuild() {
  803. if len(this.RecommendGuild) <= 0 {
  804. return
  805. }
  806. keyStr := model2.GuildRecommendPrefix
  807. recommend := &serverproto.RecommendSet{}
  808. for _, data := range this.RecommendGuild {
  809. recommend.Guild = append(recommend.Guild, data)
  810. }
  811. msgData, err := rocommon.GetCodec().Marshal(recommend)
  812. if err != nil {
  813. return
  814. }
  815. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  816. ret, err := service.GetRedis().Set(keyStr, msgStr, 0).Result()
  817. if err != nil {
  818. util.InfoF("SaveRecommendGuild err=%v ret=%v", keyStr, ret)
  819. return
  820. }
  821. util.InfoF("SaveRecommendGuild save recommend guild sucess : %v", len(recommend.Guild))
  822. }
  823. //================================= 以上数据库相关操作 ======================================
  824. //================================= 以下公会逻辑相关操作 ======================================
  825. //内存找不到,从DB加载,再找不到说明查无此公会
  826. func (this *GuildManager) GetGuild(guildId uint64) *GuildData {
  827. guild, ok := this.Guilds[guildId]
  828. if ok {
  829. return guild
  830. }
  831. //从数据库加载
  832. guildData := &GuildData{
  833. GuildBase: &serverproto.GuildBase{},
  834. GuildMember: &serverproto.MemberData{},
  835. ApplyList: &serverproto.GuildApplayData{},
  836. GuildBoss: map[uint32]*serverproto.GuildBossInfo{},
  837. }
  838. fieldStr := strconv.FormatUint(uint64(guildId), 10)
  839. baseStr, baseErr := service.GetRedis().HGet(model2.GuildBasePrefix, fieldStr).Result()
  840. if baseErr == nil {
  841. recordBase := &serverproto.GuildBase{}
  842. err := model2.GetDecodeMessage(recordBase, baseStr)
  843. if err == nil {
  844. guildData.GuildBase = recordBase
  845. } else {
  846. util.InfoF("[GetGuild] get baseStr [%v] err:%v", baseStr, err)
  847. return nil
  848. }
  849. } else {
  850. util.InfoF("[GetGuild] get baseStr [%v] err:%v", baseStr, baseErr)
  851. return nil
  852. }
  853. memberStr, memberErr := service.GetRedis().HGet(model2.GuildMemberPrefix, fieldStr).Result()
  854. if memberErr == nil {
  855. recordMember := &serverproto.MemberData{}
  856. err := model2.GetDecodeMessage(recordMember, memberStr)
  857. if err == nil {
  858. guildData.GuildMember = recordMember
  859. } else {
  860. util.InfoF("[GetGuild] get memberStr [%v] err:%v", memberStr, err)
  861. return nil
  862. }
  863. } else {
  864. util.InfoF("[GetGuild] get memberStr [%v] err:%v", memberStr, memberErr)
  865. return nil
  866. }
  867. applyStr, applyErr := service.GetRedis().HGet(model2.GuildApplyPrefix, fieldStr).Result()
  868. if applyErr == nil {
  869. recordMember := &serverproto.GuildApplayData{}
  870. err := model2.GetDecodeMessage(recordMember, applyStr)
  871. if err == nil {
  872. guildData.ApplyList = recordMember
  873. } else {
  874. util.InfoF("[GetGuild] get applyStr [%v] err:%v", applyStr, err)
  875. return nil
  876. }
  877. }
  878. err := this.LoadGuildBoss(guildData)
  879. if err != nil {
  880. }
  881. err2 := this.LoadGuildDemon(guildData)
  882. if err2 != nil {
  883. }
  884. this.Guilds[guildId] = guildData
  885. return guildData
  886. }
  887. func (this *GuildManager) GetMemberTitle(uid uint64, guildData *GuildData) int32 {
  888. if guildData == nil || guildData.GuildMember == nil {
  889. return -1
  890. }
  891. for _, member := range guildData.GuildMember.MemberInfo {
  892. if member.MemberId == uid {
  893. return member.Title
  894. }
  895. }
  896. return -1
  897. }
  898. func (this *GuildManager) GetUUId() uint64 {
  899. return model2.GenerateUid()
  900. }
  901. //创建工会
  902. func (this *GuildManager) BuildGuild(uid uint64, guildName string, guildBadge int32) (serverproto.ErrorCode, *serverproto.GuildBrief) {
  903. //检查名字是否重复
  904. guildId := this.RoleToGuilds[uid]
  905. if guildId != nil {
  906. guild := this.GetGuild(guildId.GuildId)
  907. if guild != nil {
  908. return serverproto.ErrorCode_ERROR_GUILD_ALREADY_EXIST, nil
  909. }
  910. }
  911. _, ok := this.GuildsIndex[guildName]
  912. if ok {
  913. return serverproto.ErrorCode_ERROR_GUILD_NAME_EXIST, nil
  914. }
  915. newGuildId := this.GetUUId()
  916. //添加公会
  917. newGuild := &GuildData{
  918. GuildBase: &serverproto.GuildBase{
  919. GuildBrief: &serverproto.GuildBrief{
  920. GuildId: newGuildId,
  921. GuildBadge: guildBadge,
  922. GuildName: guildName,
  923. GuildLevel: 1,
  924. // GuildExp: 0,
  925. },
  926. RecruitLevel: model2.GlobalGuildJoinLevel,
  927. RecruitType: Recruit_None_Verify,
  928. },
  929. GuildMember: &serverproto.MemberData{
  930. PreId: uid,
  931. },
  932. }
  933. member := &serverproto.GuildMember{
  934. MemberId: uid,
  935. Title: 2,
  936. OfflineTime: 0,
  937. AddGuildTime: util.GetCurrentTime(),
  938. }
  939. newGuild.GuildMember.MemberInfo = append(newGuild.GuildMember.MemberInfo, member)
  940. newGuild.ApplyList = &serverproto.GuildApplayData{}
  941. newGuild.GuildDemon = &serverproto.GuildDemon{}
  942. this.Guilds[newGuildId] = newGuild
  943. //添加各类索引
  944. var guildIndex serverproto.GuildIdex
  945. guildIndex.GuildId = newGuildId
  946. this.GuildsIndex[guildName] = &guildIndex
  947. this.RoleToGuilds[uid] = &serverproto.GuildIdex{
  948. GuildId: newGuildId,
  949. }
  950. this.SaveGuildBase(newGuild)
  951. this.SaveGuildMember(newGuild)
  952. this.SaveGuildNameIndex(guildName)
  953. this.SaveRoleToGuild(uid)
  954. this.SaveGuildDemon(newGuild)
  955. //删除公会申请记录,删除个人申请
  956. roleApply := this.GetRoleApplyInfo(uid)
  957. if roleApply != nil {
  958. for _, guildId := range roleApply.ApplyGuild {
  959. applyGuild := this.GetGuild(guildId)
  960. if applyGuild != nil {
  961. this.RemoveGuildApply(uid, applyGuild)
  962. this.SaveGuildApply(applyGuild)
  963. }
  964. }
  965. }
  966. //清除此人的所有申请
  967. this.RemoveRoleApply(uid)
  968. this.InitGuildBoss(newGuildId)
  969. this.CheckAddRecommendGuild(newGuild)
  970. return serverproto.ErrorCode_ERROR_OK, newGuild.GuildBase.GuildBrief
  971. }
  972. //解散公会
  973. func (this *GuildManager) DisbandGuild(uid uint64, guildId uint64) serverproto.ErrorCode {
  974. guild := this.GetGuild(guildId)
  975. if guild == nil || guild.GuildBase.GuildBrief.GuildId != guildId {
  976. return serverproto.ErrorCode_ERROR_FAIL
  977. }
  978. //判定公会是否在公会战中
  979. _, bRet := GuildBattleMag.IsInGuildBattle(guildId)
  980. if bRet == true {
  981. return serverproto.ErrorCode_ERROR_GUILDBATTLE_In_GuildBattle
  982. }
  983. if guild.GuildMember.PreId != uid {
  984. return serverproto.ErrorCode_ERROR_GUILD_NO_AUTHORITY
  985. }
  986. //如果公会只有1个人
  987. if len(guild.GuildMember.MemberInfo) != 1 {
  988. return serverproto.ErrorCode_ERROR_GUILD_DISBAND_FAILED
  989. }
  990. //遍历公会的加入申请信息,找到对应申请玩家,删除他们申请记录
  991. if guild.ApplyList != nil && len(guild.ApplyList.ApplyGuild) > 0 {
  992. for _, data := range guild.ApplyList.ApplyGuild {
  993. //清空公会的加入申请
  994. applyData := this.GetRoleApplyInfo(uid)
  995. if applyData == nil {
  996. continue
  997. }
  998. if data == uid {
  999. for idx, info := range applyData.ApplyGuild {
  1000. if info == guildId {
  1001. //删除
  1002. applyData.ApplyGuild = append(applyData.ApplyGuild[:idx], applyData.ApplyGuild[idx+1:]...)
  1003. break
  1004. }
  1005. }
  1006. }
  1007. //TODO wangzhaocan
  1008. //保存applyData 保存这个人的申请信息
  1009. this.SaveRoleApplyData(data, applyData)
  1010. }
  1011. }
  1012. guildName := guild.GuildBase.GuildBrief.GuildName
  1013. if guild.GuildBoss != nil {
  1014. for id, _ := range guild.GuildBoss {
  1015. this.RemoveGuildBoss(id, guild)
  1016. }
  1017. }
  1018. //魔王排行榜删除该公会
  1019. this.RemoveGuildDemonRank(guildId, guild.GuildDemon)
  1020. //推荐列表删除此公会
  1021. this.RemoveRecommendGuild(guildId)
  1022. //删除数据库
  1023. this.RemoveGuildFromRedis(guildId, guildName)
  1024. //删除公会
  1025. delete(this.Guilds, guildId)
  1026. //删除玩家-公会索引
  1027. this.RemoveRoleToGuild(uid)
  1028. //修改索引中的名字。
  1029. this.RemoveGuildNameIndex(guild.GuildBase.GuildBrief.GuildName)
  1030. OnDisbandGuild(guildId)
  1031. return serverproto.ErrorCode_ERROR_OK
  1032. }
  1033. func (this *GuildManager) GetMaxGuildMemberNum(guild *GuildData) int32 {
  1034. if guild == nil {
  1035. return 0
  1036. }
  1037. cfgData, ok := serverproto.GuildLvCfgLoader[guild.GuildBase.GuildBrief.GuildLevel]
  1038. if !ok {
  1039. return 0
  1040. }
  1041. return cfgData.PeopleLimit
  1042. }
  1043. func (this *GuildManager) OnChangeGuildName(guild *GuildData, ev rocommon.ProcEvent) {
  1044. if guild == nil {
  1045. return
  1046. }
  1047. ntfMsg := &serverproto.SSGuildNameChangeNtf{}
  1048. ntfMsg.GuildId = guild.GuildBase.GuildBrief.GuildId
  1049. ntfMsg.GuildName = guild.GuildBase.GuildBrief.GuildName
  1050. for _, data := range guild.GuildMember.MemberInfo {
  1051. ntfMsg.UidList = append(ntfMsg.UidList, data.MemberId)
  1052. }
  1053. SendSocial(ntfMsg)
  1054. }
  1055. func (this *GuildManager) ChangeGuildName(uid uint64, guildId uint64, name string, ev rocommon.ProcEvent) serverproto.ErrorCode {
  1056. _, ok := this.GuildsIndex[name]
  1057. if ok {
  1058. return serverproto.ErrorCode_ERROR_GUILD_NAME_EXIST
  1059. }
  1060. guild := this.GetGuild(guildId)
  1061. if guild == nil {
  1062. return serverproto.ErrorCode_ERROR_GUILD_NOT_EXIST
  1063. }
  1064. if uid != guild.GuildMember.PreId {
  1065. return serverproto.ErrorCode_ERROR_GUILD_NO_AUTHORITY
  1066. }
  1067. if guild.GuildBase.GuildBrief.GuildName == name {
  1068. return serverproto.ErrorCode_ERROR_GUILD_SAME_NAME
  1069. }
  1070. //修改索引中的名字。
  1071. this.RemoveGuildNameIndex(guild.GuildBase.GuildBrief.GuildName)
  1072. //新增索引
  1073. var guildIndex serverproto.GuildIdex
  1074. guildIndex.GuildId = guild.GuildBase.GuildBrief.GuildId
  1075. this.GuildsIndex[name] = &guildIndex
  1076. this.SaveGuildNameIndex(name)
  1077. //改名字
  1078. guild.GuildBase.GuildBrief.GuildName = name
  1079. this.SaveGuildBase(guild)
  1080. this.OnChangeGuildName(guild, ev)
  1081. return serverproto.ErrorCode_ERROR_OK
  1082. }
  1083. //长度game有判定
  1084. func (this *GuildManager) ChangeGuildNotice(guildId uint64, notice string, uid uint64) serverproto.ErrorCode {
  1085. guild := this.GetGuild(guildId)
  1086. if guild == nil {
  1087. return serverproto.ErrorCode_ERROR_GUILD_NOT_EXIST
  1088. }
  1089. if uid != guild.GuildMember.PreId {
  1090. return serverproto.ErrorCode_ERROR_GUILD_NO_AUTHORITY
  1091. }
  1092. guild.GuildBase.Notice = notice
  1093. this.SaveGuildBase(guild)
  1094. return serverproto.ErrorCode_ERROR_OK
  1095. }
  1096. func (this *GuildManager) ChangeSetGuildInfo(msg *serverproto.CSSetGuildInfoReq) serverproto.ErrorCode {
  1097. if msg == nil {
  1098. return serverproto.ErrorCode_ERROR_FAIL
  1099. }
  1100. guild := this.GetGuild(msg.GuildId)
  1101. if guild == nil {
  1102. return serverproto.ErrorCode_ERROR_GUILD_NOT_EXIST
  1103. }
  1104. guild.GuildBase.GuildBrief.GuildBadge = msg.GuildBadge
  1105. guild.GuildBase.RecruitLevel = msg.JoinLevel
  1106. guild.GuildBase.RecruitType = msg.JoinType
  1107. return serverproto.ErrorCode_ERROR_OK
  1108. }
  1109. //公会有活跃度变动时检查
  1110. func (this *GuildManager) CheckNeedChangePresident(guild *GuildData, needCheckTime bool) {
  1111. if guild == nil {
  1112. return
  1113. }
  1114. //检查会长是否超过5天未上线
  1115. var active uint32 = 0
  1116. var uid uint64 = 0
  1117. var addGuildTime uint64 = 0
  1118. var title int32 = 0
  1119. for _, member := range guild.GuildMember.MemberInfo {
  1120. //会长离线不满4天,则返回
  1121. if member.MemberId == guild.GuildMember.PreId && needCheckTime {
  1122. gapDay := util.GetDurationDay1(uint64(member.OfflineTime), util.GetTimeMilliseconds())
  1123. if member.OfflineTime == 0 || gapDay < model2.GlobalExchangeGuildPresident {
  1124. return
  1125. }
  1126. //会长离线满了4天。
  1127. util.InfoF("[CheckNeedChangePresident] guild pre offline over 5 Days, guildId: %v guild pre : %v offlineTime :%v, gapDay:%v",
  1128. guild.GuildBase.GuildBrief.GuildId, member.MemberId, member.OfflineTime, gapDay)
  1129. }
  1130. if member.MemberId != guild.GuildMember.PreId {
  1131. gapDay := util.GetDurationDay1(uint64(member.OfflineTime), util.GetTimeMilliseconds())
  1132. if member.OfflineTime != 0 && gapDay >= model2.GlobalExchangeGuildPresident {
  1133. continue
  1134. }
  1135. //查找转让会长
  1136. memActive := this.GetMemberActive(member)
  1137. if title < member.Title {
  1138. active = memActive
  1139. uid = member.MemberId
  1140. addGuildTime = member.AddGuildTime
  1141. title = member.Title
  1142. } else if title > member.Title {
  1143. continue
  1144. }else {
  1145. //职位相等的情况下。
  1146. if memActive > active {
  1147. active = memActive
  1148. uid = member.MemberId
  1149. addGuildTime = member.AddGuildTime
  1150. title = member.Title
  1151. } else if memActive == active {
  1152. //都在线的情况下
  1153. if addGuildTime != 0 && member.AddGuildTime != 0 {
  1154. //member 先加入公会
  1155. if addGuildTime > member.AddGuildTime {
  1156. active = memActive
  1157. uid = member.MemberId
  1158. addGuildTime = member.AddGuildTime
  1159. title = member.Title
  1160. }
  1161. } else {
  1162. //uid小的(先注册的)为会长
  1163. if uid > member.MemberId {
  1164. active = memActive
  1165. uid = member.MemberId
  1166. addGuildTime = member.AddGuildTime
  1167. title = member.Title
  1168. }
  1169. }
  1170. }
  1171. }
  1172. }
  1173. }
  1174. util.InfoF("[CheckNeedChangePresident] guildId :%v old_pre:%v new_preId:%v old_title:%v",guild.GuildBase.GuildBrief.GuildId, guild.GuildMember.PreId, uid, title)
  1175. if uid != 0 && uid != guild.GuildMember.PreId {
  1176. curPreUid := guild.GuildMember.PreId
  1177. this.AddGuildLog(guild, Guild_Title_Pre, curPreUid, title, uid, Guild_Event_Type_ChangeGuildPre)
  1178. for _, member := range guild.GuildMember.MemberInfo {
  1179. if member.MemberId == guild.GuildMember.PreId {
  1180. member.Title = Guild_Title_Member
  1181. }
  1182. if member.MemberId == uid {
  1183. //如果是副会长则删除
  1184. if member.Title == Guild_Title_Vice_Pre {
  1185. for index, data := range guild.GuildMember.VicePreId {
  1186. if data == uid {
  1187. guild.GuildMember.VicePreId = append(guild.GuildMember.VicePreId[:index], guild.GuildMember.VicePreId [index+1:]...)
  1188. break
  1189. }
  1190. }
  1191. }
  1192. member.Title = Guild_Title_Pre
  1193. }
  1194. }
  1195. guild.GuildMember.PreId = uid
  1196. this.SaveGuildMember(guild)
  1197. }
  1198. }
  1199. func (this *GuildManager) CanAddRecommendList(guild *GuildData) bool {
  1200. if guild.GuildBase.RecruitType == Recruit_Refused {
  1201. return false
  1202. }
  1203. if guild.GuildBase.RecruitType == Recruit_Verify {
  1204. if guild.ApplyList == nil {
  1205. return false
  1206. }
  1207. if len(guild.ApplyList.ApplyGuild) >= int(model2.GlobalGuildApplyListMax) {
  1208. return false
  1209. }
  1210. }
  1211. if guild.GuildBase.RecruitType == Recruit_None_Verify {
  1212. if guild.GuildMember == nil {
  1213. return false
  1214. }
  1215. count := this.GetMaxGuildMemberNum(guild)
  1216. if int(count) < len(guild.GuildMember.MemberInfo) {
  1217. return false
  1218. }
  1219. }
  1220. return true
  1221. }
  1222. func (this *GuildManager) CheckAddRecommendGuild(guild *GuildData) {
  1223. newId := guild.GuildBase.GuildBrief.GuildId
  1224. _, ok := this.RecommendGuildIndex[newId]
  1225. //原来有这个公会
  1226. if ok {
  1227. for _, data := range this.RecommendGuild {
  1228. if data.GuildId == newId {
  1229. data.GuildId = guild.GuildBase.GuildBrief.GuildId
  1230. data.Active = guild.GuildBase.GuildBrief.GuildActive
  1231. data.ActiveTime = guild.GuildBase.ActiveTime
  1232. data.Level = guild.GuildBase.GuildBrief.GuildLevel
  1233. }
  1234. }
  1235. } else {
  1236. if this.CanAddRecommendList(guild) == false {
  1237. return
  1238. }
  1239. recommend := &serverproto.RecommendGuild{}
  1240. recommend.GuildId = guild.GuildBase.GuildBrief.GuildId
  1241. recommend.Active = guild.GuildBase.GuildBrief.GuildActive
  1242. recommend.ActiveTime = guild.GuildBase.ActiveTime
  1243. recommend.Level = guild.GuildBase.GuildBrief.GuildLevel
  1244. this.RecommendGuild = append(this.RecommendGuild, recommend)
  1245. }
  1246. //排序
  1247. sort.Slice(this.RecommendGuild, func(i, j int) bool {
  1248. if this.RecommendGuild[i].Level > this.RecommendGuild[j].Level {
  1249. return true
  1250. } else if this.RecommendGuild[i].Level < this.RecommendGuild[j].Level {
  1251. return false
  1252. } else {
  1253. if this.RecommendGuild[i].ActiveTime > this.RecommendGuild[j].ActiveTime {
  1254. return true
  1255. } else if this.RecommendGuild[i].ActiveTime < this.RecommendGuild[j].ActiveTime {
  1256. return false
  1257. } else {
  1258. if this.RecommendGuild[i].Active > this.RecommendGuild[j].Active {
  1259. return true
  1260. }
  1261. return false
  1262. }
  1263. }
  1264. })
  1265. this.RecommendGuildIndex[newId] = 1
  1266. if len(this.RecommendGuild) <= MAX_RECOMMEND_GUILD {
  1267. this.SaveRecommendGuild()
  1268. return
  1269. }
  1270. delId := this.RecommendGuild[0].GuildId
  1271. delete(this.RecommendGuildIndex, delId)
  1272. //超过100个则删除100之后的
  1273. this.RecommendGuild = append(this.RecommendGuild[:0], this.RecommendGuild[1:]...)
  1274. //todo wangzhaocan 暂时实施村春,后续这个做定时存储
  1275. this.SaveRecommendGuild()
  1276. }
  1277. func (this *GuildManager) RemoveRecommendGuild(guildId uint64) {
  1278. _, ok := this.RecommendGuildIndex[guildId]
  1279. if !ok {
  1280. return
  1281. }
  1282. for idx, data := range this.RecommendGuild {
  1283. if data.GuildId == guildId {
  1284. this.RecommendGuild = append(this.RecommendGuild[:idx], this.RecommendGuild[idx+1:]...)
  1285. delete(this.RecommendGuildIndex, guildId)
  1286. break
  1287. }
  1288. }
  1289. this.SaveRecommendGuild()
  1290. }
  1291. func (this *GuildManager) GetPlayerGuildId(uid uint64) uint64 {
  1292. guildId, ok := this.RoleToGuilds[uid]
  1293. if !ok {
  1294. return 0
  1295. }
  1296. return uint64(guildId.GuildId)
  1297. }
  1298. func (this *GuildManager) CheckMemberGuild(guildData *GuildData) {
  1299. if guildData == nil || guildData.GuildMember == nil {
  1300. return
  1301. }
  1302. if guildData.CheckMemberGuild == true {
  1303. return
  1304. }
  1305. guildData.CheckMemberGuild = true
  1306. guildId := guildData.GuildBase.GuildBrief.GuildId
  1307. for i:=0; i<len(guildData.GuildMember.MemberInfo); {
  1308. uid := guildData.GuildMember.MemberInfo[i].MemberId
  1309. //会长不处理
  1310. if uid == guildData.GuildMember.PreId {
  1311. i++
  1312. continue
  1313. }
  1314. realGuildId := this.GetPlayerGuildId(uid)
  1315. if guildId != realGuildId {
  1316. util.InfoF("[CheckMemberGuild] uid:%v curguildid:%v, realGuildId:%v", uid, guildId, realGuildId)
  1317. //删除次玩家
  1318. guildData.GuildMember.MemberInfo = append(guildData.GuildMember.MemberInfo[:i], guildData.GuildMember.MemberInfo[i+1:]...)
  1319. //判定是否是副会长
  1320. for index, viceUid := range guildData.GuildMember.VicePreId {
  1321. if viceUid == uid {
  1322. guildData.GuildMember.VicePreId = append(guildData.GuildMember.VicePreId[:index], guildData.GuildMember.VicePreId[index+1:]...)
  1323. break
  1324. }
  1325. }
  1326. continue
  1327. }
  1328. i++
  1329. }
  1330. }
  1331. //GM命令切换公会会长
  1332. func (this *GuildManager) GMChangeGuildLeader(guildId uint64) {
  1333. guild := this.GetGuild(guildId)
  1334. if guild == nil || guild.GuildMember == nil {
  1335. return
  1336. }
  1337. if len(guild.GuildMember.MemberInfo) <= 1 {
  1338. //解散公会
  1339. this.DisbandGuild(guild.GuildMember.PreId, guildId)
  1340. //通知客户端,改变客户端状态
  1341. } else {
  1342. oldPreId := guild.GuildMember.PreId
  1343. //改变公会会长
  1344. this.CheckNeedChangePresident(guild, false)
  1345. if guild.GuildMember.PreId == oldPreId {
  1346. return
  1347. }
  1348. this.KickGuildMember(guild.GuildMember.PreId, oldPreId, guildId, false)
  1349. //通知客户端,改变客户端状态
  1350. }
  1351. }
  1352. //GM踢除玩家
  1353. func (this *GuildManager) GMKickMember(guildId, uid uint64) {
  1354. guild := this.GetGuild(guildId)
  1355. if guild == nil || guild.GuildMember == nil {
  1356. return
  1357. }
  1358. if guild.GuildMember.PreId == uid {
  1359. return
  1360. }
  1361. this.KickGuildMember(guild.GuildMember.PreId, uid, guildId, false)
  1362. }
  1363. //QA测试用GM命令
  1364. func (this *GuildManager) GMSetGuildDemonDamage() {
  1365. for _, guild := range this.Guilds {
  1366. if guild == nil || guild.GuildMember == nil || guild.GuildBase == nil {
  1367. util.InfoF("[GMSetGuildDemonDamage] entity nil")
  1368. continue
  1369. }
  1370. if guild.GuildDemon == nil {
  1371. guild.GuildDemon = &serverproto.GuildDemon{}
  1372. }
  1373. if guild.GuildDemon.TotalDamage > 0 {
  1374. continue
  1375. }
  1376. nowTime := util.GetCurrentTimeNow()
  1377. curWeekDay := nowTime.Weekday()
  1378. if curWeekDay == 0 {
  1379. curWeekDay = 7
  1380. }
  1381. demonData, _ := model2.GetDemonInfo(int32(curWeekDay), nowTime)
  1382. if demonData == nil {
  1383. return
  1384. }
  1385. randDamage := rand.Int31n(1000000)
  1386. msg := &serverproto.SSGuildDemonFightReq{
  1387. DemonId: demonData.DemonId,
  1388. Damage: uint64(randDamage),
  1389. GuildId: guild.GuildBase.GuildBrief.GuildId,
  1390. Uid: guild.GuildMember.PreId,
  1391. }
  1392. ackMsg := &serverproto.SSGuildDemonFightAck{}
  1393. this.GuildDemonFight(msg, ackMsg)
  1394. }
  1395. }