guild_operator.go 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347
  1. package model
  2. import (
  3. "rocommon"
  4. "rocommon/util"
  5. "roserver/baseserver/model"
  6. model2 "roserver/db/model"
  7. "roserver/serverproto"
  8. )
  9. func (this *GuildManager) GetGuildMemberCount(guildMember *serverproto.MemberData) int32 {
  10. if guildMember == nil {
  11. return 0
  12. }
  13. return int32(len(guildMember.MemberInfo))
  14. }
  15. func (this *GuildManager) QuitApplyGuild(uid uint64, guildId uint64) serverproto.ErrorCode {
  16. guild := this.GetGuild(guildId)
  17. if guild != nil {
  18. //删除公会中,此玩家的申请信息
  19. var bFind bool = false
  20. for index, data := range guild.ApplyList.ApplyGuild {
  21. if data == uid {
  22. guild.ApplyList.ApplyGuild = append(guild.ApplyList.ApplyGuild[:index], guild.ApplyList.ApplyGuild[index+1:]...)
  23. bFind = true
  24. break
  25. }
  26. }
  27. if bFind == true {
  28. this.SaveGuildApply(guild)
  29. }
  30. }
  31. applyData := this.GetRoleApplyInfo(uid)
  32. if applyData != nil {
  33. var bFind bool = false
  34. for index, data := range applyData.ApplyGuild {
  35. if data == guildId {
  36. applyData.ApplyGuild = append(applyData.ApplyGuild[:index], applyData.ApplyGuild[index+1:]...)
  37. bFind = true
  38. break
  39. }
  40. }
  41. if bFind == true {
  42. this.SaveRoleApplyData(uid, applyData)
  43. }
  44. }
  45. return serverproto.ErrorCode_ERROR_OK
  46. }
  47. //申请加入工会
  48. func (this *GuildManager) ApplyGuild(uid uint64, guildId uint64, level int32, ev rocommon.ProcEvent) serverproto.ErrorCode {
  49. guild := this.GetGuild(guildId)
  50. if guild == nil {
  51. return serverproto.ErrorCode_ERROR_GUILD_NOT_EXIST
  52. }
  53. if level < guild.GuildBase.RecruitLevel {
  54. return serverproto.ErrorCode_ERROR_GUILD_ROLE_LEVEL_LOW
  55. }
  56. //如果公会默认是不接受申请的
  57. if guild.GuildBase.RecruitType == Recruit_Refused {
  58. return serverproto.ErrorCode_ERROR_GUILD_CANT_APPLY
  59. }
  60. //公会申请列表满
  61. if guild.ApplyList != nil {
  62. if len(guild.ApplyList.ApplyGuild) >= int(model.GlobalGuildApplyListMax) {
  63. return serverproto.ErrorCode_ERROR_GUILD_APPLY_COUNT_MAX
  64. } else {
  65. for _, data := range guild.ApplyList.ApplyGuild {
  66. if data == uid {
  67. return serverproto.ErrorCode_ERROR_GUILD_NO_REAPPLY
  68. }
  69. }
  70. }
  71. }
  72. //玩家申请列表
  73. applyData := this.GetRoleApplyInfo(uid)
  74. if applyData != nil {
  75. if len(applyData.ApplyGuild) >= int(model.GlobalGuildRoleApplyMax) {
  76. return serverproto.ErrorCode_ERROR_GUILD_APPLY_COUTN_MAX
  77. }
  78. for _, data := range applyData.ApplyGuild {
  79. if data == guildId {
  80. return serverproto.ErrorCode_ERROR_GUILD_NO_REAPPLY
  81. }
  82. }
  83. }
  84. //是否需要申请
  85. if guild.GuildBase.RecruitType == Recruit_Verify {
  86. if guild.ApplyList == nil {
  87. guild.ApplyList = &serverproto.GuildApplayData{}
  88. }
  89. guild.ApplyList.ApplyGuild = append(guild.ApplyList.ApplyGuild, uid)
  90. this.SaveGuildApply(guild)
  91. } else if guild.GuildBase.RecruitType == Recruit_None_Verify {
  92. //判定公会是否在公会战中
  93. _, bRet := GuildBattleMag.IsInGuildBattle(guildId)
  94. if bRet == true {
  95. return serverproto.ErrorCode_ERROR_GUILDBATTLE_In_GuildBattle
  96. }
  97. //看下这个人是否有公会
  98. _, ok := this.RoleToGuilds[uid]
  99. if ok {
  100. return serverproto.ErrorCode_ERROR_GUILD_IN_GUILD
  101. }
  102. //公会是否满员
  103. memberNum := this.GetMaxGuildMemberNum(guild)
  104. if this.GetGuildMemberCount(guild.GuildMember) >= memberNum {
  105. return serverproto.ErrorCode_ERROR_GUILD_MEMBER_COUNT_MAX
  106. }
  107. //检查公会是否有这个人
  108. for _, data := range guild.GuildMember.MemberInfo {
  109. if data.MemberId == uid {
  110. return serverproto.ErrorCode_ERROR_GUILD_IN_GUILD
  111. }
  112. }
  113. //添加公会成员
  114. member := &serverproto.GuildMember{
  115. MemberId: uid,
  116. Title: Guild_Title_Member,
  117. OfflineTime: 0,
  118. AddGuildTime: util.GetCurrentTime(),
  119. }
  120. guild.GuildMember.MemberInfo = append(guild.GuildMember.MemberInfo, member)
  121. this.SaveGuildMember(guild)
  122. //直接加入公会,则推送公会信息
  123. ntfMsg := &serverproto.SCApplyInfoHandleNtf{
  124. Data: &serverproto.GuildNotifyData{},
  125. }
  126. ntfMsg.ApplyResult = Guild_Apply_Accept
  127. ntfMsg.GuildId = guild.GuildBase.GuildBrief.GuildId
  128. ntfMsg.Uid = uid
  129. ntfMsg.Data.Brief = guild.GuildBase.GuildBrief
  130. ntfMsg.Data.MemCount = this.GetGuildMemberCount(guild.GuildMember)
  131. ntfMsg.Data.IsApply = false
  132. //保存
  133. this.RoleToGuilds[uid] = &serverproto.GuildIdex{
  134. GuildId: guildId,
  135. }
  136. this.SaveRoleToGuild(uid)
  137. model.ServiceReplay(ev, ntfMsg)
  138. //删除玩家个人申请记录
  139. this.RemoveRoleApply(uid)
  140. //刪除该公会玩家申请信息
  141. this.RemoveGuildApply(uid, guild)
  142. //保存玩家公会信息
  143. this.SaveGuildApply(guild)
  144. this.SendGuildNotice(guild, uid, Guild_SysChat_Event_PlayerJoin, Guild_Title_Member, 0)
  145. this.AddGuildLog(guild, 0, 0, Guild_Title_Member, uid, Guild_Event_Type_DirectJoin)
  146. util.InfoF("[ApplyGuild] player join guild guildId :%v uid:%v ", guild.GuildBase.GuildBrief.GuildId, uid)
  147. return serverproto.ErrorCode_ERROR_OK
  148. }
  149. //存库一下玩家的申请信息
  150. if applyData == nil {
  151. var newApply serverproto.RoleApplayData
  152. newApply.ApplyGuild = append(newApply.ApplyGuild, guildId)
  153. this.ApplyData[uid] = &newApply
  154. this.SaveRoleApplyData(uid, &newApply)
  155. } else {
  156. applyData.ApplyGuild = append(applyData.ApplyGuild, guildId)
  157. this.SaveRoleApplyData(uid, applyData)
  158. }
  159. return serverproto.ErrorCode_ERROR_OK
  160. }
  161. //离开公会(会长离开公会需要有额外处理)
  162. func (this *GuildManager) QuitGuild(uid uint64, guildId uint64) serverproto.ErrorCode {
  163. guild := this.GetGuild(guildId)
  164. if guild == nil {
  165. return serverproto.ErrorCode_ERROR_GUILD_NOT_EXIST
  166. }
  167. //todo wangzhaocan 退出公会测试放开
  168. _, bRet := GuildBattleMag.IsInGuildBattle(guildId)
  169. if bRet == true {
  170. return serverproto.ErrorCode_ERROR_GUILDBATTLE_In_GuildBattle
  171. }
  172. //检查是否是会长
  173. title := this.GetMemberTitle(uid, guild)
  174. if title == Guild_Title_Pre {
  175. return serverproto.ErrorCode_ERROR_GUILD_PRESIDENT_CANT_LEAVE
  176. }
  177. for index, member := range guild.GuildMember.MemberInfo {
  178. if member.MemberId == uid {
  179. //找到,则删除
  180. guild.GuildMember.MemberInfo = append(guild.GuildMember.MemberInfo[:index], guild.GuildMember.MemberInfo[index+1:]...)
  181. break
  182. }
  183. }
  184. for index, member := range guild.GuildMember.VicePreId {
  185. if member == uid {
  186. //找到,则删除
  187. guild.GuildMember.VicePreId = append(guild.GuildMember.VicePreId[:index], guild.GuildMember.VicePreId[index+1:]...)
  188. break
  189. }
  190. }
  191. this.AddGuildLog(guild, title, uid, 0, 0, Guild_Event_Type_LeaveGuild)
  192. this.SaveGuildMember(guild)
  193. this.RemoveRoleToGuild(uid)
  194. util.InfoF("[QuitGuild] guildId :%v uid:%v old_title:%v", guild.GuildBase.GuildBrief.GuildId, uid, title)
  195. return serverproto.ErrorCode_ERROR_OK
  196. }
  197. //检查今日踢出玩家数量
  198. func (this *GuildManager) CheckKickNum(guildMember *serverproto.MemberData) bool {
  199. if guildMember == nil {
  200. return false
  201. }
  202. //重置时间
  203. if guildMember.KickTime < util.GetCurrentTime() {
  204. guildMember.KickTime = util.GetLatest5Hour()
  205. guildMember.KickNum = 0
  206. }
  207. if util.GetCurrentTime() <= guildMember.KickTime && guildMember.KickNum < model.GlobalGuildKickMemberCount {
  208. return true
  209. }
  210. return false
  211. }
  212. //踢除公会成员
  213. func (this *GuildManager) KickGuildMember(preUid uint64, uid uint64, guildId uint64, needCheck bool) serverproto.ErrorCode {
  214. guild, ok := this.Guilds[guildId]
  215. if !ok {
  216. return serverproto.ErrorCode_ERROR_GUILD_NOT_EXIST
  217. }
  218. //判定公会是否在公会战中
  219. _, bRet := GuildBattleMag.IsInGuildBattle(guildId)
  220. if bRet == true {
  221. return serverproto.ErrorCode_ERROR_GUILDBATTLE_In_GuildBattle
  222. }
  223. checkRet := this.CheckKickNum(guild.GuildMember)
  224. if !checkRet && needCheck {
  225. return serverproto.ErrorCode_ERROR_GUILD_KICK_MEMBER_MAX_COUNT
  226. }
  227. opTitle := this.GetMemberTitle(preUid, guild)
  228. memberTitle := this.GetMemberTitle(uid, guild)
  229. if opTitle == -1 {
  230. return serverproto.ErrorCode_ERROR_FAIL
  231. }
  232. if memberTitle == -1 {
  233. return serverproto.ErrorCode_ERROR_GUILD_NOT_FOUND_MEMBER
  234. }
  235. //被踢的人是会长,则返回
  236. if memberTitle == Guild_Title_Pre {
  237. return serverproto.ErrorCode_ERROR_GUILD_PRESIDENT_KICK
  238. }
  239. if opTitle != Guild_Title_Pre && opTitle != Guild_Title_Vice_Pre {
  240. return serverproto.ErrorCode_ERROR_GUILD_NO_AUTHORITY
  241. }
  242. //验证是否是会长副会长操作,验证是否存在这个成员
  243. if opTitle > memberTitle {
  244. var bFind bool = false
  245. for idx, data := range guild.GuildMember.MemberInfo {
  246. if data.MemberId == uid {
  247. bFind = true
  248. //删除当前玩家
  249. _, ok := this.RoleToGuilds[uid]
  250. if ok {
  251. this.RoleToGuilds[uid] = &serverproto.GuildIdex{
  252. GuildId: guildId,
  253. }
  254. }
  255. guild.GuildMember.MemberInfo = append(guild.GuildMember.MemberInfo[:idx], guild.GuildMember.MemberInfo[idx+1:]...)
  256. //副会长ID删除
  257. for index, viceUid := range guild.GuildMember.VicePreId {
  258. if viceUid == uid {
  259. guild.GuildMember.VicePreId = append(guild.GuildMember.VicePreId[:index], guild.GuildMember.VicePreId[index+1:]...)
  260. break
  261. }
  262. }
  263. //踢人次数+1
  264. guild.GuildMember.KickNum += 1
  265. this.SaveGuildMember(guild)
  266. this.RemoveRoleToGuild(uid)
  267. this.AddGuildLog(guild, opTitle, preUid, memberTitle, uid, Guild_Event_Type_KickGuild)
  268. ntfMsg := &serverproto.SCKickGuildMemberNtf{
  269. GuildId: guildId,
  270. Uid: uid,
  271. }
  272. SendSocial(ntfMsg)
  273. util.InfoF("[ApplyGuild] kick guild member guildId :%v pre_id:%v, uid:%v ", guild.GuildBase.GuildBrief.GuildId, preUid, uid)
  274. return serverproto.ErrorCode_ERROR_OK
  275. }
  276. }
  277. if bFind == false {
  278. return serverproto.ErrorCode_ERROR_GUILD_KICK_TARGET_NOT_FOUND
  279. }
  280. } else {
  281. return serverproto.ErrorCode_ERROR_GUILD_NO_AUTHORITY
  282. }
  283. return serverproto.ErrorCode_ERROR_FAIL
  284. }
  285. func (this *GuildManager) ChangeMemberTitleNtf(guildId uint64, uid uint64, uidList []*serverproto.KeyValueType64) {
  286. ntfMsg := &serverproto.SCChangeMemberTitleNtf{}
  287. ntfMsg.GuildId = guildId
  288. ntfMsg.UidList = uidList
  289. ntfMsg.Uid = uid
  290. SendSocial(ntfMsg)
  291. }
  292. func (this *GuildManager) ApplyInfoHandleNtf(guild *GuildData, uid uint64, result int32) {
  293. ntfMsg := &serverproto.SCApplyInfoHandleNtf{
  294. Data: &serverproto.GuildNotifyData{},
  295. }
  296. ntfMsg.ApplyResult = result
  297. ntfMsg.Uid = uid
  298. ntfMsg.GuildId = guild.GuildBase.GuildBrief.GuildId
  299. ntfMsg.Data.Brief = guild.GuildBase.GuildBrief
  300. ntfMsg.Data.MemCount = this.GetGuildMemberCount(guild.GuildMember)
  301. SendSocial(ntfMsg)
  302. }
  303. func (this *GuildManager) KickGuildMemberNtf(guild *GuildData, uid uint64, result int32) {
  304. ntfMsg := &serverproto.SCKickGuildMemberNtf{}
  305. ntfMsg.Uid = uid
  306. ntfMsg.GuildId = guild.GuildBase.GuildBrief.GuildId
  307. SendSocial(ntfMsg)
  308. }
  309. //去social请求在线状态
  310. func (this *GuildManager) GetMemberOnlineInfo(guild *GuildData, memberList []uint64) {
  311. if len(memberList) <= 0 {
  312. return
  313. }
  314. reqMsg := &serverproto.SSGuildMemberOnlineInfoReq{}
  315. reqMsg.GuildId = guild.GuildBase.GuildBrief.GuildId
  316. for _, data := range memberList {
  317. reqMsg.UidList = append(reqMsg.UidList, data)
  318. }
  319. SendSocial(reqMsg)
  320. }
  321. //social返回,设置公会成员在线状态
  322. func (this *GuildManager) OnGuildMemberOnlineAck(ackMsg *serverproto.SSGuildMemberOnlineInfoAck) {
  323. if ackMsg == nil {
  324. return
  325. }
  326. guild := this.GetGuild(ackMsg.GuildId)
  327. if guild == nil || guild.GuildMember == nil {
  328. return
  329. }
  330. for _, data := range ackMsg.UidList {
  331. for _, member := range guild.GuildMember.MemberInfo {
  332. if data.Key == member.MemberId {
  333. if data.Value == 1 {
  334. member.OfflineTime = 0
  335. } else if data.Value == 0 {
  336. member.OfflineTime = int64(util.GetCurrentTime())
  337. }
  338. }
  339. }
  340. }
  341. }
  342. //修改会员官职
  343. func (this *GuildManager) ChangeMemberTitle(preUid, uid, guildId uint64, title int32) serverproto.ErrorCode {
  344. guild, ok := this.Guilds[guildId]
  345. if !ok {
  346. return serverproto.ErrorCode_ERROR_GUILD_NOT_EXIST
  347. }
  348. if guild.GuildMember == nil {
  349. return serverproto.ErrorCode_ERROR_GUILD_NOT_FOUND
  350. }
  351. var nFind int32 = 0
  352. for _, data := range guild.GuildMember.MemberInfo {
  353. if data.MemberId == uid || data.MemberId == preUid {
  354. nFind++
  355. }
  356. if nFind == 2 {
  357. break
  358. }
  359. }
  360. if nFind != 2 {
  361. return serverproto.ErrorCode_ERROR_GUILD_KICK_TARGET_NOT_FOUND
  362. }
  363. //不是会长,错误
  364. opTitle := this.GetMemberTitle(preUid, guild)
  365. if opTitle != Guild_Title_Pre {
  366. return serverproto.ErrorCode_ERROR_GUILD_NO_AUTHORITY
  367. }
  368. memberTitle := this.GetMemberTitle(uid, guild)
  369. if memberTitle == title {
  370. return serverproto.ErrorCode_ERROR_GUILD_ARGS_INVALIDATE
  371. }
  372. if title == Guild_Title_Member {
  373. //查看此人是否是副会长,不是副会长则操作无效
  374. if memberTitle != Guild_Title_Vice_Pre {
  375. return serverproto.ErrorCode_ERROR_GUILD_ARGS_INVALIDATE
  376. }
  377. //从副会长列表中删除
  378. for idx, viceUid := range guild.GuildMember.VicePreId {
  379. if viceUid == uid {
  380. guild.GuildMember.VicePreId = append(guild.GuildMember.VicePreId[:idx], guild.GuildMember.VicePreId[idx+1:]...)
  381. break
  382. }
  383. }
  384. for _, member := range guild.GuildMember.MemberInfo {
  385. if member.MemberId == uid {
  386. member.Title = Guild_Title_Member
  387. break
  388. }
  389. }
  390. var uidList []*serverproto.KeyValueType64
  391. uidList = append(uidList, &serverproto.KeyValueType64{
  392. Key: uid,
  393. Value: Guild_Title_Member,
  394. })
  395. this.ChangeMemberTitleNtf(guildId, uid, uidList)
  396. this.AddGuildLog(guild, opTitle, preUid, memberTitle, uid, Guild_Event_Type_Member)
  397. } else if title == Guild_Title_Vice_Pre {
  398. //此人不是副会长,且,副会长人数小于2。则可以提升
  399. if len(guild.GuildMember.VicePreId) >= int(model.GlobalGuildVicePreNum) {
  400. return serverproto.ErrorCode_ERROR_GUILD_VICE_PRESIDENT_MAX
  401. }
  402. if memberTitle == Guild_Title_Vice_Pre {
  403. return serverproto.ErrorCode_ERROR_GUILD_ARGS_INVALIDATE
  404. }
  405. guild.GuildMember.VicePreId = append(guild.GuildMember.VicePreId, uid)
  406. for _, member := range guild.GuildMember.MemberInfo {
  407. if member.MemberId == uid {
  408. member.Title = Guild_Title_Vice_Pre
  409. }
  410. }
  411. var uidList []*serverproto.KeyValueType64
  412. uidList = append(uidList, &serverproto.KeyValueType64{
  413. Key: uid,
  414. Value: Guild_Title_Vice_Pre,
  415. })
  416. this.ChangeMemberTitleNtf(guildId, uid, uidList)
  417. this.AddGuildLog(guild, opTitle, preUid, memberTitle, uid, Guild_Event_Type_VicePresident)
  418. } else if title == Guild_Title_Pre { //转让会长只能给副会长
  419. if memberTitle != Guild_Title_Vice_Pre {
  420. return serverproto.ErrorCode_ERROR_GUILD_ARGS_INVALIDATE
  421. }
  422. for idx, viceUid := range guild.GuildMember.VicePreId {
  423. if viceUid == uid {
  424. guild.GuildMember.VicePreId[idx] = preUid
  425. break
  426. }
  427. }
  428. guild.GuildMember.PreId = uid
  429. //修改职位
  430. var count int32 = 0
  431. for _, member := range guild.GuildMember.MemberInfo {
  432. if member.MemberId == preUid {
  433. if member.Title == Guild_Title_Pre {
  434. member.Title = Guild_Title_Vice_Pre
  435. count++
  436. }
  437. } else if member.MemberId == uid {
  438. if member.Title == Guild_Title_Vice_Pre {
  439. member.Title = Guild_Title_Pre
  440. count++
  441. }
  442. } else {
  443. if count >= 2 {
  444. break
  445. }
  446. }
  447. }
  448. var uidList []*serverproto.KeyValueType64
  449. uidList = append(uidList, &serverproto.KeyValueType64{
  450. Key: preUid,
  451. Value: Guild_Title_Vice_Pre,
  452. })
  453. uidList = append(uidList, &serverproto.KeyValueType64{
  454. Key: uid,
  455. Value: Guild_Title_Pre,
  456. })
  457. this.ChangeMemberTitleNtf(guildId, preUid, uidList)
  458. this.ChangeMemberTitleNtf(guildId, uid, uidList)
  459. this.AddGuildLog(guild, opTitle, preUid, memberTitle, uid, Guild_Event_Type_ChangePresident)
  460. GuildBattleMag.ExchangeGuildPre(preUid, uid, guildId)
  461. }
  462. this.SaveGuildMember(guild)
  463. return serverproto.ErrorCode_ERROR_OK
  464. }
  465. //设置公会信息(徽章,)
  466. func (this *GuildManager) SetGuildInfo(msg *serverproto.CSSetGuildInfoReq) serverproto.ErrorCode {
  467. guild := this.GetGuild(msg.GuildId)
  468. if guild == nil {
  469. return serverproto.ErrorCode_ERROR_GUILD_NOT_EXIST
  470. }
  471. if msg.Uid != guild.GuildMember.PreId {
  472. return serverproto.ErrorCode_ERROR_GUILD_NO_AUTHORITY
  473. }
  474. //设置入会等级,和入会条件
  475. guild.GuildBase.RecruitLevel = msg.JoinLevel
  476. if msg.JoinType == Recruit_Refused || msg.JoinType == Recruit_Verify || msg.JoinType == Recruit_None_Verify {
  477. guild.GuildBase.RecruitType = msg.JoinType
  478. }
  479. //设置徽章
  480. if msg.GuildBadge != 0 {
  481. //检查是否存在这个徽章
  482. guild.GuildBase.GuildBrief.GuildBadge = msg.GuildBadge
  483. guild.GuildBase.RecruitLevel = msg.JoinLevel
  484. guild.GuildBase.RecruitType = msg.JoinType
  485. guild.GuildBase.RecruitNotice = msg.RecruitNotice
  486. }
  487. this.SaveGuildBase(guild)
  488. return serverproto.ErrorCode_ERROR_OK
  489. }
  490. func (this *GuildManager) CheckInGuildApplyList(uid uint64, guild *GuildData) serverproto.ErrorCode {
  491. if guild == nil {
  492. return serverproto.ErrorCode_ERROR_GUILD_NOT_EXIST
  493. }
  494. if guild.ApplyList == nil {
  495. return serverproto.ErrorCode_ERROR_GUILD_APPLY_TIME_OUT
  496. }
  497. for _, data := range guild.ApplyList.ApplyGuild {
  498. if data == uid {
  499. return serverproto.ErrorCode_ERROR_OK
  500. }
  501. }
  502. //需要判定判定是否是公会成员
  503. return serverproto.ErrorCode_ERROR_GUILD_APPLY_TIME_OUT
  504. }
  505. //处理玩家入会申请 todo wangzhaocan
  506. func (this *GuildManager) ApplyInfoHandle(msg *serverproto.CSApplyInfoHandleReq, ackMsg *serverproto.SCApplyInfoHandleAck) serverproto.ErrorCode {
  507. if msg == nil || ackMsg == nil {
  508. return serverproto.ErrorCode_ERROR_FAIL
  509. }
  510. guild := this.GetGuild(msg.GuildId)
  511. if guild == nil {
  512. return serverproto.ErrorCode_ERROR_GUILD_NOT_EXIST
  513. }
  514. opTitle := this.GetMemberTitle(msg.Uid, guild)
  515. if opTitle != Guild_Title_Pre && opTitle != Guild_Title_Vice_Pre {
  516. return serverproto.ErrorCode_ERROR_GUILD_NO_AUTHORITY
  517. }
  518. if msg.HandleType == Guild_Apply_None {
  519. //处理玩家入会申请
  520. if msg.Apply.Value == Guild_Apply_Accept {
  521. //判定公会是否在公会战中
  522. _, bBattle := GuildBattleMag.IsInGuildBattle(msg.GuildId)
  523. if bBattle == true {
  524. return serverproto.ErrorCode_ERROR_GUILDBATTLE_In_GuildBattle
  525. }
  526. bRet := this.HandlePlayerApply(msg.Apply.Key, guild)
  527. retResult := &serverproto.KeyValueType64{
  528. Key: msg.Apply.Key,
  529. }
  530. if bRet != serverproto.ErrorCode_ERROR_OK {
  531. retResult.Value = Guild_Apply_Refused
  532. if bRet == serverproto.ErrorCode_ERROR_GUILD_MEMBER_COUNT_MAX {
  533. retResult.Value = Guild_Apply_Ignore
  534. }
  535. retResult.Value2 = int32(bRet)
  536. ackMsg.UidList = append(ackMsg.UidList, retResult)
  537. return bRet
  538. }
  539. retResult.Value = Guild_Apply_Accept
  540. retResult.Value2 = int32(serverproto.ErrorCode_ERROR_OK)
  541. ackMsg.UidList = append(ackMsg.UidList, retResult)
  542. this.GetMemberOnlineInfo(guild, []uint64{msg.Apply.Key})
  543. this.ApplyInfoHandleNtf(guild, msg.Apply.Key, Guild_Apply_Accept)
  544. this.SaveGuildMember(guild)
  545. //刪除玩家所有申請
  546. this.RemoveRoleApply(msg.Apply.Key)
  547. this.SendGuildNotice(guild, msg.Apply.Key, Guild_SysChat_Event_PlayerJoin, Guild_Title_Member, 0)
  548. this.AddGuildLog(guild, opTitle, msg.Uid, Guild_Title_Member, msg.Apply.Key, Guild_Event_Type_JoinGuild)
  549. } else {
  550. //删除玩家申请的这个公会ID
  551. bRet := this.CheckInGuildApplyList(msg.Apply.Key, guild)
  552. ackMsg.UidList = append(ackMsg.UidList, &serverproto.KeyValueType64{
  553. Key: msg.Apply.Key,
  554. Value: Guild_Apply_Refused,
  555. Value2: int32(bRet),
  556. })
  557. this.RemoveRoleApplyItem(msg.Apply.Key, guild.GuildBase.GuildBrief.GuildId)
  558. }
  559. //刪除该公会玩家申请信息
  560. this.RemoveGuildApply(msg.Apply.Key, guild)
  561. //保存玩家公会信息
  562. this.SaveGuildApply(guild)
  563. } else if msg.HandleType == Guild_Apply_All_Accept {
  564. //判定公会是否在公会战中
  565. _, bBattle := GuildBattleMag.IsInGuildBattle(msg.GuildId)
  566. if bBattle == true {
  567. return serverproto.ErrorCode_ERROR_GUILDBATTLE_In_GuildBattle
  568. }
  569. //同意所有玩家入会
  570. var hasNewMember bool = false
  571. var bRet serverproto.ErrorCode
  572. var uidList []uint64
  573. for _, applyUid := range msg.UidList {
  574. bRet = this.HandlePlayerApply(applyUid, guild)
  575. retResult := &serverproto.KeyValueType64{
  576. Key: applyUid,
  577. Value2: int32(bRet),
  578. }
  579. if bRet == serverproto.ErrorCode_ERROR_OK {
  580. retResult.Value = Guild_Apply_Accept
  581. } else if bRet == serverproto.ErrorCode_ERROR_GUILD_MEMBER_COUNT_MAX {
  582. retResult.Value = Guild_Apply_Ignore
  583. } else {
  584. retResult.Value = Guild_Apply_Refused
  585. }
  586. ackMsg.UidList = append(ackMsg.UidList, retResult)
  587. if bRet == serverproto.ErrorCode_ERROR_OK {
  588. uidList = append(uidList, applyUid)
  589. this.RemoveRoleApply(applyUid)
  590. this.RemoveGuildApply(applyUid, guild)
  591. this.ApplyInfoHandleNtf(guild, applyUid, Guild_Apply_Accept)
  592. this.AddGuildLog(guild, opTitle, msg.Uid, Guild_Title_Member, applyUid, Guild_Event_Type_JoinGuild)
  593. this.SendGuildNotice(guild, applyUid, Guild_SysChat_Event_PlayerJoin, Guild_Title_Member, 0)
  594. hasNewMember = true
  595. }
  596. }
  597. if hasNewMember == true {
  598. if len(uidList) > 0 {
  599. this.GetMemberOnlineInfo(guild, uidList)
  600. }
  601. this.SaveGuildMember(guild)
  602. this.SaveGuildApply(guild)
  603. }
  604. } else if msg.HandleType == Guild_Apply_All_Refused {
  605. //清除所有的申请
  606. for _, applyUid := range guild.ApplyList.ApplyGuild {
  607. this.RemoveRoleApplyItem(applyUid, guild.GuildBase.GuildBrief.GuildId)
  608. this.RemoveGuildApply(applyUid, guild)
  609. }
  610. this.SaveGuildApply(guild)
  611. }
  612. return serverproto.ErrorCode_ERROR_OK
  613. }
  614. //删除公会的申请记录
  615. func (this *GuildManager) RemoveGuildApply(uid uint64, guild *GuildData) {
  616. if guild == nil {
  617. return
  618. }
  619. for idx, applyData := range guild.ApplyList.ApplyGuild {
  620. if applyData == uid {
  621. guild.ApplyList.ApplyGuild = append(guild.ApplyList.ApplyGuild[:idx], guild.ApplyList.ApplyGuild[idx+1:]...)
  622. }
  623. }
  624. }
  625. func (this *GuildManager) RemoveRoleApplyItem(uid uint64, guildId uint64) {
  626. applyData := this.GetRoleApplyInfo(uid)
  627. if applyData == nil {
  628. return
  629. }
  630. var change bool = false
  631. for idx, data := range applyData.ApplyGuild {
  632. if data == guildId {
  633. applyData.ApplyGuild = append(applyData.ApplyGuild[:idx], applyData.ApplyGuild[idx+1:]...)
  634. change = true
  635. }
  636. }
  637. if change == true {
  638. this.SaveRoleApplyData(uid, applyData)
  639. }
  640. }
  641. //删除个人申请公会记录
  642. func (this *GuildManager) RemoveRoleApply(uid uint64) {
  643. applyData := this.GetRoleApplyInfo(uid)
  644. if applyData == nil {
  645. return
  646. }
  647. //删除所有公会的申请列表数据
  648. for _, guildId := range applyData.ApplyGuild {
  649. guild := this.GetGuild(guildId)
  650. if guild != nil {
  651. this.RemoveGuildApply(uid, guild)
  652. this.SaveGuildApply(guild)
  653. }
  654. }
  655. //删除数据库中,玩家的申请数据“
  656. this.RemoveRoleApplyFromRedis(uid)
  657. //删除applyData申请列表
  658. delete(this.ApplyData, uid)
  659. }
  660. //处理加入
  661. func (this *GuildManager) HandlePlayerApply(uid uint64, guildData *GuildData) serverproto.ErrorCode {
  662. if guildData == nil {
  663. return serverproto.ErrorCode_ERROR_FAIL
  664. }
  665. if guildData.ApplyList == nil || len(guildData.ApplyList.ApplyGuild) <= 0 {
  666. return serverproto.ErrorCode_ERROR_GUILD_APPLYLIST_NOT_FOUND
  667. }
  668. count := this.GetMaxGuildMemberNum(guildData)
  669. if this.GetGuildMemberCount(guildData.GuildMember) >= count {
  670. return serverproto.ErrorCode_ERROR_GUILD_MEMBER_COUNT_MAX
  671. }
  672. //查找这个人是否有加入工会
  673. _, ok := this.RoleToGuilds[uid]
  674. if ok {
  675. return serverproto.ErrorCode_ERROR_GUILD_IN_GUILD
  676. }
  677. //检查是否有这个人申请
  678. var bApply bool = false
  679. for _, data := range guildData.ApplyList.ApplyGuild {
  680. if data == uid {
  681. bApply = true
  682. break
  683. }
  684. }
  685. if bApply == false {
  686. return serverproto.ErrorCode_ERROR_GUILD_APPLYLIST_NOT_FOUND
  687. }
  688. //将这个人加入到工会列表中
  689. member := &serverproto.GuildMember{
  690. MemberId: uid,
  691. Title: Guild_Title_Member,
  692. AddGuildTime: util.GetCurrentTime(),
  693. }
  694. guildData.GuildMember.MemberInfo = append(guildData.GuildMember.MemberInfo, member)
  695. this.RoleToGuilds[uid] = &serverproto.GuildIdex{
  696. GuildId: guildData.GuildBase.GuildBrief.GuildId,
  697. }
  698. this.SaveRoleToGuild(uid)
  699. return serverproto.ErrorCode_ERROR_OK
  700. }
  701. func (this *GuildManager) GetGuildInfo(guildId uint64) (serverproto.ErrorCode, *serverproto.GuildBase, []*serverproto.MemberBrief) {
  702. guild := this.GetGuild(guildId)
  703. if guild == nil {
  704. return serverproto.ErrorCode_ERROR_GUILD_NOT_EXIST, nil, nil
  705. }
  706. var memBrief []*serverproto.MemberBrief
  707. for _, data := range guild.GuildMember.MemberInfo {
  708. memBrief = append(memBrief, &serverproto.MemberBrief{
  709. Uid: data.MemberId,
  710. OfflineTime: data.OfflineTime,
  711. Title: data.Title,
  712. })
  713. }
  714. return serverproto.ErrorCode_ERROR_OK, guild.GuildBase, memBrief
  715. }
  716. //上线检查是否有公会通过申请
  717. func (this *GuildManager) CheckRoleApply(uid uint64, changeType int32, reLogin bool, ntf bool, ev rocommon.ProcEvent) {
  718. ackMsg := &serverproto.SSOnlineGuildInfoAck{
  719. Data: &serverproto.GuildNotifyData{
  720. Brief: &serverproto.GuildBrief{},
  721. },
  722. InGuildBattle: GuildBattleMag.IsInBattleTime(),
  723. }
  724. guildIndex, ok := this.RoleToGuilds[uid]
  725. if ok == false {
  726. if ntf == true {
  727. ackMsg.Data = nil
  728. model.ServiceReplay(ev, ackMsg)
  729. }
  730. return
  731. }
  732. guild := this.GetGuild(guildIndex.GuildId)
  733. if guild == nil || guild.GuildBase == nil {
  734. ackMsg.Data = nil
  735. if ntf == true {
  736. model.ServiceReplay(ev, ackMsg)
  737. }
  738. return
  739. } else {
  740. guildIndex := &serverproto.GuildIdex{
  741. GuildId: guild.GuildBase.GuildBrief.GuildId,
  742. }
  743. this.RoleToGuilds[uid] = guildIndex
  744. }
  745. if guild.GuildBase != nil {
  746. ackMsg.Data.Brief = guild.GuildBase.GuildBrief
  747. ackMsg.Data.MemCount = this.GetGuildMemberCount(guild.GuildMember)
  748. }
  749. //记录下时间
  750. if guild.GuildMember != nil {
  751. bFind := false
  752. for _, data := range guild.GuildMember.MemberInfo {
  753. if data.MemberId == uid {
  754. data.OfflineTime = 0
  755. bFind = true
  756. break
  757. }
  758. }
  759. if bFind {
  760. this.SaveGuildMember(guild)
  761. this.GetBattleBossList(guild, ackMsg)
  762. this.BossRefreshNotify(guild, ev)
  763. } else {
  764. this.RemoveRoleToGuild(uid)
  765. ackMsg.Data = nil
  766. }
  767. }
  768. // this.GetBattleBossList(guild, ackMsg)
  769. // this.BossRefreshNotify(guild, ev)
  770. if reLogin == false && ntf == true {
  771. model.ServiceReplay(ev, ackMsg)
  772. }
  773. this.CheckNeedChangePresident(guild, true)
  774. }
  775. //公会成员上下线:changeType:1上线 2:下线
  776. func (this *GuildManager) MemberStateChange(uid uint64, guildId uint64, changeType int32, reLogin bool, demonFightTime uint64, ntf bool, ev rocommon.ProcEvent) {
  777. guild := this.GetGuild(guildId)
  778. if guildId == 0 || guild == nil {
  779. //没有公会,检查是否有过申请加入公会
  780. this.CheckRoleApply(uid, changeType, reLogin, ntf, ev)
  781. return
  782. }
  783. ackMsg := &serverproto.SSOnlineGuildInfoAck{
  784. Data: &serverproto.GuildNotifyData{},
  785. InGuildBattle: GuildBattleMag.IsInBattleTime(),
  786. }
  787. // guild := this.GetGuild(guildId)
  788. if guild.GuildMember == nil {
  789. if changeType == 1 && ntf == true {
  790. model.ServiceReplay(ev, ackMsg)
  791. }
  792. return
  793. }
  794. var inGuild bool = false
  795. for _, data := range guild.GuildMember.MemberInfo {
  796. if data.MemberId == uid {
  797. inGuild = true
  798. if changeType == 1 {
  799. data.OfflineTime = 0
  800. } else if changeType == 2 {
  801. data.OfflineTime = int64(util.GetCurrentTime())
  802. } else {
  803. if ntf == true {
  804. model.ServiceReplay(ev, ackMsg)
  805. }
  806. return
  807. }
  808. break
  809. }
  810. }
  811. //上线情况下:
  812. if changeType == 1 {
  813. //当前玩家在公会里
  814. if inGuild == true {
  815. apply := len(guild.ApplyList.ApplyGuild)
  816. ackMsg.Data.IsApply = false
  817. if apply > 0 {
  818. ackMsg.Data.IsApply = true
  819. }
  820. ackMsg.Data.Brief = guild.GuildBase.GuildBrief
  821. ackMsg.Data.MemCount = this.GetGuildMemberCount(guild.GuildMember)
  822. title := this.GetMemberTitle(uid, guild)
  823. if title == Guild_Title_Pre || title == Guild_Title_Vice_Pre {
  824. this.SendGuildNotice(guild, uid, Guild_SysChat_Event_Online, title, 0)
  825. }
  826. this.BossRefreshNotify(guild, ev)
  827. this.GetBattleBossList(guild, ackMsg)
  828. ackMsg.MsgRec = append(ackMsg.MsgRec, guild.GuildMsg...)
  829. ackMsg.GuildSys = guild.GuildSys
  830. //上线校验是否有公会魔王挑战奖励
  831. if demonFightTime != 0 {
  832. this.OnlineGetDemonReward(uid, demonFightTime, ev)
  833. }
  834. } else {
  835. ackMsg.Data = nil
  836. }
  837. if reLogin == false && ntf == true {
  838. ackMsg.InGuildBattle = GuildBattleMag.IsInBattleTime()
  839. model.ServiceReplay(ev, ackMsg)
  840. util.InfoF("[MemberStateChange] online return guild info uid:%v, inGuild:%v, ackMsg:::::%v", uid, inGuild, ackMsg)
  841. }
  842. this.CheckNeedChangePresident(guild, true)
  843. }
  844. if inGuild == true {
  845. this.SaveGuildMember(guild)
  846. }
  847. }
  848. func (this *GuildManager) GetGuildMemberData(msg *serverproto.CSGuildMemberInfoReq, ackMsg *serverproto.SCGuildMemberInfoAck) serverproto.ErrorCode {
  849. if msg == nil || ackMsg == nil {
  850. return serverproto.ErrorCode_ERROR_FAIL
  851. }
  852. guild := this.GetGuild(msg.GuildId)
  853. if guild == nil {
  854. return serverproto.ErrorCode_ERROR_GUILD_NOT_EXIST
  855. }
  856. ackMsg.GuildId = guild.GuildBase.GuildBrief.GuildId
  857. for _, uids := range msg.UidList {
  858. for _, member := range guild.GuildMember.MemberInfo {
  859. if uids == member.MemberId {
  860. memInfo := &serverproto.MemberInfo{
  861. Brief: &serverproto.CommonPlayerBriefInfo{},
  862. }
  863. memInfo.TotalActive = this.GetMemberActive(member)
  864. model2.GetSystemDataFromRedis(model2.RolePlayerBriefPrefix, member.MemberId, memInfo.Brief)
  865. ackMsg.MemberData = append(ackMsg.MemberData, memInfo)
  866. }
  867. }
  868. }
  869. return serverproto.ErrorCode_ERROR_OK
  870. }
  871. //玩家是否申请自己公会
  872. func (this *GuildManager) CheckGuildApply(uid uint64, guildId uint64) bool {
  873. apply := this.GetRoleApplyInfo(uid)
  874. if apply == nil {
  875. return false
  876. }
  877. for _, data := range apply.ApplyGuild {
  878. if data == guildId {
  879. return true
  880. }
  881. }
  882. return false
  883. }
  884. func (this *GuildManager) SearchGuild(uid uint64, searchString string, ev rocommon.ProcEvent) {
  885. ackMsg := &serverproto.SCSearchGuildAck{
  886. SearchString: searchString,
  887. }
  888. //按照名字查找,
  889. guildIndex, ok := this.GuildsIndex[searchString]
  890. if ok == true {
  891. guild := this.GetGuild(uint64(guildIndex.GuildId))
  892. if guild != nil {
  893. var ntfData serverproto.GuildNotifyData
  894. ntfData.Brief = guild.GuildBase.GuildBrief
  895. ntfData.MemCount = this.GetGuildMemberCount(guild.GuildMember)
  896. ntfData.IsApply = this.CheckGuildApply(uid, guild.GuildBase.GuildBrief.GuildId)
  897. ackMsg.Data = append(ackMsg.Data, &ntfData)
  898. }
  899. }
  900. //按照ID查找,
  901. guildId2, _ := model.Str2NumU64(searchString)
  902. guild := this.GetGuild(guildId2)
  903. if guild != nil {
  904. //返回公会信息
  905. var ntfData serverproto.GuildNotifyData
  906. ntfData.Brief = guild.GuildBase.GuildBrief
  907. ntfData.MemCount = this.GetGuildMemberCount(guild.GuildMember)
  908. ntfData.IsApply = this.CheckGuildApply(uid, guild.GuildBase.GuildBrief.GuildId)
  909. ackMsg.Data = append(ackMsg.Data, &ntfData)
  910. }
  911. model.ServiceReplay(ev, ackMsg)
  912. }
  913. func (this *GuildManager) PackRecommendGuild(uid uint64, reqCount int32, ackMsg *serverproto.SCRecommendGuildInfoAck) {
  914. if ackMsg == nil {
  915. return
  916. }
  917. //先打包申请了的公会
  918. var count int32 = 0
  919. RecommendMap := map[uint64]int32{}
  920. applyInfo := this.GetRoleApplyInfo(uid)
  921. if applyInfo != nil {
  922. for _, guildId := range applyInfo.ApplyGuild {
  923. guild := this.GetGuild(guildId)
  924. if guild == nil {
  925. //玩家申请列表中 删除这个ID
  926. continue
  927. }
  928. var data serverproto.GuildNotifyData
  929. data.Brief = guild.GuildBase.GuildBrief
  930. data.MemCount = this.GetGuildMemberCount(guild.GuildMember)
  931. data.IsApply = true
  932. ackMsg.Data = append(ackMsg.Data, &data)
  933. count += 1
  934. RecommendMap[guildId] = 1
  935. }
  936. }
  937. //再打包其他推荐公会
  938. var startId int32 = 0
  939. if int32(len(this.RecommendGuild)) <= MaxRecommend {
  940. startId = 1
  941. } else if int32(len(this.RecommendGuild)) <= 60 && int32(len(this.RecommendGuild)) > 30 {
  942. if reqCount >= 2 {
  943. startId = int32(len(this.RecommendGuild)) - MaxRecommend + 1
  944. } else {
  945. startId = 1
  946. }
  947. } else {
  948. if reqCount == 3 {
  949. if int32(len(this.RecommendGuild)) >= 90 {
  950. startId = 61
  951. } else {
  952. startId = int32(len(this.RecommendGuild)) - MaxRecommend + 1
  953. }
  954. } else if reqCount == 2 {
  955. startId = MaxRecommend + 1
  956. } else if reqCount == 1 {
  957. startId = 1
  958. }
  959. }
  960. util.InfoF("uid:=%v PackRecommendGuild startId:=%v, size:%v ", uid, startId, len(this.RecommendGuild))
  961. //打包公会相关数据
  962. for idx, recommend := range this.RecommendGuild {
  963. if count >= MaxRecommend { //打包超过30个
  964. break
  965. }
  966. if int32(idx+1) < int32(startId) { //从startId开始
  967. continue
  968. }
  969. _, ok := RecommendMap[recommend.GuildId]
  970. if ok {
  971. continue
  972. }
  973. var bFind bool = false
  974. if applyInfo != nil && applyInfo.ApplyGuild != nil {
  975. for _, data := range applyInfo.ApplyGuild {
  976. if data == recommend.GuildId {
  977. bFind = true
  978. break
  979. }
  980. }
  981. }
  982. if bFind == true {
  983. continue
  984. }
  985. guild := this.GetGuild(recommend.GuildId)
  986. if guild == nil {
  987. continue
  988. }
  989. var data serverproto.GuildNotifyData
  990. data.Brief = guild.GuildBase.GuildBrief
  991. data.MemCount = this.GetGuildMemberCount(guild.GuildMember)
  992. data.IsApply = false
  993. ackMsg.Data = append(ackMsg.Data, &data)
  994. count++
  995. }
  996. util.InfoF("uid:=%v PackRecommendGuild data size := %v, reqCount:=%v", uid, ackMsg.Data, reqCount)
  997. }
  998. func (this *GuildManager) GetGuildApplyList(uid uint64, guildId uint64, ev rocommon.ProcEvent) {
  999. ackMsg := &serverproto.SCGuildApplyDataAck{
  1000. Error: int32(serverproto.ErrorCode_ERROR_OK),
  1001. }
  1002. guild := this.GetGuild(guildId)
  1003. if guild == nil {
  1004. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_GUILD_NOT_EXIST)
  1005. model.ServiceReplay(ev, ackMsg)
  1006. return
  1007. }
  1008. for _, data := range guild.ApplyList.ApplyGuild {
  1009. ackMsg.UidList = append(ackMsg.UidList, data)
  1010. }
  1011. model.ServiceReplay(ev, ackMsg)
  1012. }
  1013. func (this *GuildManager) RemoveGuildActive(member *serverproto.GuildMember) {
  1014. if member == nil {
  1015. return
  1016. }
  1017. if len(member.ActiveInfo) <= 5 {
  1018. return
  1019. }
  1020. //删除最早的记录
  1021. for i := 0; i < len(member.ActiveInfo); {
  1022. gapDay := util.GetDurationDay1(uint64(member.ActiveInfo[i].Key), util.GetTimeMilliseconds())
  1023. if gapDay > 4 {
  1024. member.ActiveInfo = append(member.ActiveInfo[:i], member.ActiveInfo[i+1:]...)
  1025. } else {
  1026. i++
  1027. }
  1028. }
  1029. }
  1030. func (this *GuildManager) GetSelfGuildData(msg *serverproto.CSGetSelfGuildInfoReq, ackMsg *serverproto.SCGetSelfGuildInfoAck) serverproto.ErrorCode {
  1031. if ackMsg == nil {
  1032. return serverproto.ErrorCode_ERROR_FAIL
  1033. }
  1034. guild := this.GetGuild(msg.GuildId)
  1035. if guild == nil {
  1036. return serverproto.ErrorCode_ERROR_GUILD_NOT_EXIST
  1037. }
  1038. for _, data := range guild.GuildMember.MemberInfo {
  1039. ackMsg.MemBrief = append(ackMsg.MemBrief, &serverproto.MemberBrief{
  1040. Uid: data.MemberId,
  1041. OfflineTime: data.OfflineTime,
  1042. Title: data.Title,
  1043. })
  1044. if data.MemberId == msg.Uid {
  1045. ackMsg.TotalActive = this.GetMemberActive(data)
  1046. }
  1047. }
  1048. ackMsg.Guild_Base = guild.GuildBase
  1049. title := this.GetMemberTitle(msg.Uid, guild)
  1050. if title == Guild_Title_Vice_Pre || title == Guild_Title_Pre {
  1051. if guild.ApplyList == nil || len(guild.ApplyList.ApplyGuild) <= 0 {
  1052. ackMsg.ApplyList = false
  1053. } else {
  1054. ackMsg.ApplyList = true
  1055. }
  1056. }
  1057. GetSelfGuildBattleData(guild.GuildBase.GuildBrief.GuildId, ackMsg)
  1058. return serverproto.ErrorCode_ERROR_OK
  1059. }
  1060. func (this *GuildManager) GetMemberActive(member *serverproto.GuildMember) uint32 {
  1061. if member == nil {
  1062. return 0
  1063. }
  1064. if len(member.ActiveInfo) <= 0 {
  1065. return 0
  1066. }
  1067. var totalActive uint32 = 0
  1068. for _, data := range member.ActiveInfo {
  1069. gapDay := util.GetDurationDay1(uint64(data.Key), util.GetTimeMilliseconds())
  1070. if gapDay > 4 {
  1071. continue
  1072. }
  1073. totalActive += uint32(data.Value)
  1074. }
  1075. return totalActive
  1076. }
  1077. func (this *GuildManager) OnRoleActivityChange(uid uint64, guildId uint64, activity int32) {
  1078. guild := this.GetGuild(guildId)
  1079. if guild == nil {
  1080. return
  1081. }
  1082. var isMember bool = false
  1083. //个人活跃度增加//上限在Game能判定
  1084. for _, member := range guild.GuildMember.MemberInfo {
  1085. if member.MemberId == uid {
  1086. var bFind bool = false
  1087. for index, active := range member.ActiveInfo {
  1088. isSameDay := model.IsSameDay(int64(active.Key))
  1089. if isSameDay == false {
  1090. member.ActiveInfo[index].Value += activity
  1091. bFind = true
  1092. break
  1093. }
  1094. }
  1095. if bFind == false {
  1096. nowTime := int64(util.GetCurrentTime())
  1097. member.ActiveInfo = append(member.ActiveInfo, &serverproto.KeyValueType64{
  1098. Key: uint64(nowTime),
  1099. Value: activity,
  1100. })
  1101. }
  1102. if len(member.ActiveInfo) > 5 {
  1103. this.RemoveGuildActive(member)
  1104. }
  1105. isMember = true
  1106. this.SaveGuildMember(guild)
  1107. break
  1108. }
  1109. }
  1110. //公会活跃度增加
  1111. if isMember == false {
  1112. return
  1113. }
  1114. //检查当日公会活跃度是否满
  1115. cfgData, ok := serverproto.GuildLvCfgLoader[guild.GuildBase.GuildBrief.GuildLevel]
  1116. if !ok {
  1117. return
  1118. }
  1119. //公会经验增加
  1120. this.AddGuildExp(guild, int32(activity))
  1121. //增加公会活跃度
  1122. if guild.GuildBase.GuildBrief.GuildActive < uint32(cfgData.ActiveLimit) {
  1123. // addActivity := uint32(cfgData.ActiveLimit) - guild.GuildBase.DayActive
  1124. addActivity := uint32(cfgData.ActiveLimit) - guild.GuildBase.GuildBrief.GuildActive
  1125. if addActivity >= uint32(activity) {
  1126. addActivity = uint32(activity)
  1127. }
  1128. globalData, ok := serverproto.GlobalCfgLoader[int32(serverproto.GlobalType_Global_Guild_Activi_To_GuildActive)]
  1129. if !ok {
  1130. return
  1131. }
  1132. per1, per2 := model.Str2Res(globalData.SVal)
  1133. addActivity = (addActivity * uint32(per2)) / uint32(per1)
  1134. // guild.GuildBase.DayActive += addActivity
  1135. guild.GuildBase.GuildBrief.GuildActive += addActivity
  1136. }
  1137. //只要有活跃度或者经验变动则记为活跃变动
  1138. guild.GuildBase.ActiveTime = int64(util.GetCurrentTime())
  1139. this.CheckAddRecommendGuild(guild)
  1140. this.SaveGuildBase(guild)
  1141. }
  1142. func (this *GuildManager) AddGuildExp(guild *GuildData, activity int32) {
  1143. if guild == nil {
  1144. return
  1145. }
  1146. globalData, ok := serverproto.GlobalCfgLoader[int32(serverproto.GlobalType_Global_Guild_Max_Level)]
  1147. if !ok {
  1148. return
  1149. }
  1150. if globalData.IVal <= guild.GuildBase.GuildBrief.GuildLevel {
  1151. return
  1152. }
  1153. globalData2, ok2 := serverproto.GlobalCfgLoader[int32(serverproto.GlobalType_Global_Guild_Activi_To_GuildExp)]
  1154. if !ok2 {
  1155. return
  1156. }
  1157. per1, per2 := model.Str2Res(globalData2.SVal)
  1158. addExp := (activity / int32(per1)) * per2
  1159. guild.GuildBase.GuildExp += uint32(addExp)
  1160. //判定是否升级
  1161. level := guild.GuildBase.GuildBrief.GuildLevel
  1162. for ; level < globalData.IVal; level++ {
  1163. cfgData, ok := serverproto.GuildLvCfgLoader[guild.GuildBase.GuildBrief.GuildLevel]
  1164. if !ok {
  1165. return
  1166. }
  1167. if guild.GuildBase.GuildExp < uint32(cfgData.ExpRequire) {
  1168. return
  1169. }
  1170. guild.GuildBase.GuildBrief.GuildLevel++
  1171. guild.GuildBase.GuildExp = guild.GuildBase.GuildExp - uint32(cfgData.ExpRequire)
  1172. }
  1173. //到达最大等级,修正经验
  1174. if guild.GuildBase.GuildBrief.GuildLevel >= globalData.IVal {
  1175. guild.GuildBase.GuildExp = 0
  1176. }
  1177. this.SaveGuildBase(guild)
  1178. }
  1179. func (this *GuildManager) GetGuildLogs(guildId uint64, logTime int64, ev rocommon.ProcEvent) {
  1180. ackMsg := &serverproto.SCGuildLogInfoAck{}
  1181. guild := this.GetGuild(guildId)
  1182. if guild == nil {
  1183. model.ServiceReplay(ev, ackMsg)
  1184. return
  1185. }
  1186. if guild.GuildLogs == nil {
  1187. this.GetGuildLog(guildId, guild)
  1188. if guild.GuildLogs == nil {
  1189. model.ServiceReplay(ev, ackMsg)
  1190. return
  1191. }
  1192. }
  1193. var count int32 = 0
  1194. for _, data := range guild.GuildLogs.GuildLog {
  1195. if logTime != 0 && data.EventTime >= uint64(logTime) {
  1196. continue
  1197. }
  1198. if count >= 10 {
  1199. break
  1200. }
  1201. ackMsg.Log = append(ackMsg.Log, data)
  1202. count++
  1203. }
  1204. if count < 10 {
  1205. ackMsg.IsEnd = true
  1206. }
  1207. model.ServiceReplay(ev, ackMsg)
  1208. }
  1209. func (this *GuildManager) OnGuildChat(ntfMsg *serverproto.SSGuildChatMessageNtf) {
  1210. guild := this.GetGuild(ntfMsg.GuildId)
  1211. if guild == nil {
  1212. return
  1213. }
  1214. if len(guild.GuildMsg) >= 10 {
  1215. guild.GuildMsg = guild.GuildMsg[1:len(guild.GuildMsg)]
  1216. }
  1217. guild.GuildMsg = append(guild.GuildMsg, &serverproto.MessageContentInfo{
  1218. Type: ntfMsg.Type,
  1219. FromId: ntfMsg.FromId,
  1220. Message: ntfMsg.Message,
  1221. //TargetId: ntfMsg.TargetId,
  1222. })
  1223. for _, data := range guild.GuildMember.MemberInfo {
  1224. if data.OfflineTime == 0 {
  1225. ntfMsg.UidList = append(ntfMsg.UidList, data.MemberId)
  1226. }
  1227. }
  1228. SendSocial(ntfMsg)
  1229. }
  1230. //公会公告
  1231. const SystemMessageType_Guild = 7 //公会公告
  1232. func (this *GuildManager) SendGuildNotice(guild *GuildData, uid uint64, eventType, title, bossId int32) {
  1233. if guild == nil {
  1234. return
  1235. }
  1236. //发送给所有game服务器
  1237. ssMsgNtf := &serverproto.SSGuildNoticeMessageNtf{}
  1238. ssMsg := &serverproto.SystemMessage{
  1239. Type: SystemMessageType_Guild,
  1240. ParamId: []int32{eventType, title, bossId},
  1241. SendTime: util.GetTimeMilliseconds(),
  1242. }
  1243. brief := &serverproto.CommonPlayerBriefInfo{}
  1244. err := model2.GetSystemDataFromRedis(model2.RolePlayerBriefPrefix, uid, brief)
  1245. if err == nil {
  1246. ssMsg.NickName = brief.NickName
  1247. }
  1248. ssMsgNtf.SysMsg = append(ssMsgNtf.SysMsg, ssMsg)
  1249. ssMsgNtf.GuildId = guild.GuildBase.GuildBrief.GuildId
  1250. for _, member := range guild.GuildMember.MemberInfo {
  1251. if member.OfflineTime == 0 {
  1252. ssMsgNtf.UidList = append(ssMsgNtf.UidList, member.MemberId)
  1253. }
  1254. }
  1255. SendSocial(ssMsgNtf)
  1256. }