diff --git a/server/imserver/constant.go b/server/imserver/constant.go index 069711da..718bb6b2 100644 --- a/server/imserver/constant.go +++ b/server/imserver/constant.go @@ -16,6 +16,18 @@ const ( GAME_ID = 206 ) +// im server chat +const ( + kCCBegin = iota + kCCWorld = 1 + kCCPrivate = 2 + kCCGuild = 3 + kCCTeam = 4 + kCCBigHorn = 5 + kCCLoopMsg = 6 + kCCEnd +) + // im server friend const ( MaxFriendMembers = 200 @@ -36,21 +48,11 @@ const ( OnlineStatus = 1 // 在线状态 在线 ) -const ( - kCCBegin = iota - kCCWorld = 1 - kCCPrivate = 2 - kCCGuild = 3 - kCCTeam = 4 - kCCBigHorn = 5 - kCCLoopMsg = 6 - kCCEnd -) - // im server guild const ( RandomGuildCount = 10 MaxMembers = 30 + MaxMembersViceLeader = 2 MaxPendingReqs = 10 DefaultLogs = 20 LogTypeApprove = 1 // 公会日志类型, 批准加入 @@ -105,21 +107,22 @@ const ( ERR_CODE_SEARCH_NO_RESULT = 11016 // Guild - ERR_CODE_GUILD_NO_EXISTS = 12001 - ERR_CODE_JOINED_GUILD = 12002 - ERR_CODE_CREATE_GUILD_FAIL = 12003 - ERR_CODE_APPLY_GUILD_FAIL = 12004 - ERR_CODE_GUILD_MEMBER_NO_EXISTS = 12005 - ERR_CODE_GUILD_MEMBER_FULL = 12006 - ERR_CODE_GUILD_PENDING_REQUEST_NO_EXISTS = 12007 - ERR_CODE_GUILD_NO_LEADER_PERM = 12008 - ERR_CODE_GUILD_BLOCKED_LEADER = 12009 - ERR_CODE_GUILD_OPERATOR_MEMBER_NO_PERM = 12010 - ERR_CODE_GUILD_DISMISS_MEMBER_NO_PERM = 12011 - ERR_CODE_CREATE_GUILD_DB_FAIL = 12013 - ERR_CODE_CREATE_GUILD_MEMBER_DB_FAIL = 12014 - ERR_CODE_UPDATE_GUILD_DB_FAIL = 12015 - ERR_CODE_UPDATE_GUILD_MEMBER_DB_FAIL = 12016 - ERR_CODE_UPDATE_GUILD_PENDING_REQUEST_DB_FAIL = 12017 - ERR_CODE_REQUEST_PARAMS_ERROR = 12018 + ERR_CODE_GUILD_NO_EXISTS = 12001 + ERR_CODE_JOINED_GUILD = 12002 + ERR_CODE_CREATE_GUILD_FAIL = 12003 + ERR_CODE_APPLY_GUILD_FAIL = 12004 + ERR_CODE_GUILD_MEMBER_NO_EXISTS = 12005 + ERR_CODE_GUILD_MEMBER_FULL = 12006 + ERR_CODE_GUILD_PENDING_REQUEST_NO_EXISTS = 12007 + ERR_CODE_GUILD_NO_LEADER_PERM = 12008 + ERR_CODE_GUILD_BLOCKED_LEADER = 12009 + ERR_CODE_GUILD_OPERATOR_MEMBER_NO_PERM = 12010 + ERR_CODE_GUILD_DISMISS_MEMBER_NO_PERM = 12011 + ERR_CODE_CREATE_GUILD_DB_FAIL = 12013 + ERR_CODE_CREATE_GUILD_MEMBER_DB_FAIL = 12014 + ERR_CODE_UPDATE_GUILD_DB_FAIL = 12015 + ERR_CODE_UPDATE_GUILD_MEMBER_DB_FAIL = 12016 + ERR_CODE_UPDATE_GUILD_PENDING_REQUEST_DB_FAIL = 12017 + ERR_CODE_REQUEST_PARAMS_ERROR = 12018 + ERR_CODE_GUILD_SETMEMBERLEVEL_VICE_LEADER_MAX_LIMIT = 12019 ) diff --git a/server/imserver/guild.go b/server/imserver/guild.go index de453473..bdaa9f69 100644 --- a/server/imserver/guild.go +++ b/server/imserver/guild.go @@ -46,6 +46,16 @@ func (g *Guild) GetMembersCount() int { return len(g.Members) } +func (g *Guild) GetMembersViceLeaderCount() int { + count := 0 + for _, member := range g.Members { + if member.Level == GuildMemberLevelViceLeader { + count++ + } + } + return count +} + // GetMember 根据 AccountId 获取成员信息 func (g *Guild) GetMember(accountId string) *GuildMember { if member, exists := g.Members[accountId]; exists { diff --git a/server/imserver/guildmgr.go b/server/imserver/guildmgr.go index cf885495..fe75445b 100644 --- a/server/imserver/guildmgr.go +++ b/server/imserver/guildmgr.go @@ -524,7 +524,7 @@ func (gm *GuildMgr) DismissMember(operatorAccountId, accountId string, cb func(e } // SetMemberLevel 设置公会成员等级 -func (gm *GuildMgr) SetMemberLevel(operatorAccountId, accountId string, level int32, cb func(errCode int32, errMsg string)) { +func (gm *GuildMgr) SetMemberLevel(operatorAccountId, accountId string, newLevel int32, cb func(errCode int32, errMsg string)) { // 干部, 精英, 副会长 guild := gm.GetGuildByAccountId(operatorAccountId) if guild == nil { @@ -544,24 +544,26 @@ func (gm *GuildMgr) SetMemberLevel(operatorAccountId, accountId string, level in } beforeLevel := member.Level - if member.Level == level { + if member.Level == newLevel { cb(ERR_CODE_GUILD_OPERATOR_MEMBER_NO_PERM, "SetMemberLevel error") return } - fields := [][]string{{"level", q5.ToString(level)}} + // 副会长上限2个 + if newLevel == GuildMemberLevelViceLeader && guild.GetMembersViceLeaderCount() >= MaxMembersViceLeader { + cb(ERR_CODE_GUILD_SETMEMBERLEVEL_VICE_LEADER_MAX_LIMIT, "SetMemberLevel Vice leader max limit") + return + } + + fields := [][]string{{"level", q5.ToString(newLevel)}} gm.updateGuildMember(guild, member.AccountId, fields, func(err error) { if err != nil { cb(ERR_CODE_UPDATE_GUILD_MEMBER_DB_FAIL, err.Error()) return } - member.Level = level // 转让会长的操作 - if level == GuildMemberLevelLeader { - operatorMember := guild.GetMember(operatorAccountId) - operatorMember.Level = GuildMemberLevelDefault - + if newLevel == GuildMemberLevelLeader { guild.LeaderId = member.AccountId updateFields := [][]string{ {"leader_account_id", q5.ToString(guild.LeaderId)}, @@ -571,19 +573,32 @@ func (gm *GuildMgr) SetMemberLevel(operatorAccountId, accountId string, level in cb(ERR_CODE_UPDATE_GUILD_DB_FAIL, err.Error()) return } - // 新会长 - newMemberFields := [][]string{{"level", q5.ToString(member.Level)}} - gm.updateGuildMember(guild, member.AccountId, newMemberFields, + + // 旧会长 -> 普通成员 + oldMember := guild.GetMember(operatorAccountId) + oldMemberFields := [][]string{{"level", q5.ToString(GuildMemberLevelDefault)}} + gm.updateGuildMember(guild, oldMember.AccountId, oldMemberFields, func(err error) { if err != nil { cb(ERR_CODE_UPDATE_GUILD_MEMBER_DB_FAIL, err.Error()) return } + oldMember.Level = GuildMemberLevelDefault }) }) } - logContent := fmt.Sprintf("SetMemberLevel[%d-%s-%s-%d-%d]", guild.GuildId, operatorAccountId, accountId, beforeLevel, level) + newMemberFields := [][]string{{"level", q5.ToString(newLevel)}} + gm.updateGuildMember(guild, member.AccountId, newMemberFields, + func(err error) { + if err != nil { + cb(ERR_CODE_UPDATE_GUILD_MEMBER_DB_FAIL, err.Error()) + return + } + member.Level = newLevel + }) + + logContent := fmt.Sprintf("SetMemberLevel[%d-%s-%s-%d-%d]", guild.GuildId, operatorAccountId, accountId, beforeLevel, newLevel) gm.WriteLog(guild.GuildId, accountId, LogTypeChangeLevel, logContent) // Add event @@ -591,7 +606,7 @@ func (gm *GuildMgr) SetMemberLevel(operatorAccountId, accountId string, level in prop["guild_id"] = q5.ToString(guild.GuildId) prop["accountId"] = q5.ToString(accountId) prop["beforeMemberLevel"] = q5.ToString(beforeLevel) - prop["afterMemberLevel"] = q5.ToString(level) + prop["afterMemberLevel"] = q5.ToString(newLevel) prop["members_count"] = q5.ToString(guild.GetMembersCount()) f5.GetTgLog().AddTrackLog( GAME_ID, diff --git a/server/imserver/handlermgr.go b/server/imserver/handlermgr.go index e44c6586..e401c77b 100644 --- a/server/imserver/handlermgr.go +++ b/server/imserver/handlermgr.go @@ -43,6 +43,7 @@ func (this *HandlerMgr) init() { cs.RegHandlerId(int(cs.CMMessageIdE__CMSetName), PLAYER_HANDLER_ID) cs.RegHandlerId(int(cs.CMMessageIdE__CMSetAvatar), PLAYER_HANDLER_ID) cs.RegHandlerId(int(cs.CMMessageIdE__CMSetJoinCond), PLAYER_HANDLER_ID) + cs.RegHandlerId(int(cs.CMMessageIdE__CMSetMemberLevel), PLAYER_HANDLER_ID) } func (this *HandlerMgr) unInit() {