From 86df80be843f367a34304af955aced07ccb31d14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B7=E5=8B=87?= Date: Tue, 19 Sep 2023 15:49:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=80=80=E5=87=BA=E5=B7=A5?= =?UTF-8?q?=E4=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/frienddb.sql | 2 +- server/imserver/constant.go | 2 +- server/imserver/guild.go | 4 +- server/imserver/guilddbmgr.go | 4 +- server/imserver/guildmgr.go | 69 ++++++++++++++++++++++++++++++++--- server/imserver/player.go | 2 +- 6 files changed, 70 insertions(+), 13 deletions(-) diff --git a/database/frienddb.sql b/database/frienddb.sql index c3fec924..84c68ca4 100644 --- a/database/frienddb.sql +++ b/database/frienddb.sql @@ -43,7 +43,7 @@ CREATE TABLE `t_guild` ( `name` varchar(48) NOT NULL, `leader_account_id` varchar(60) NOT NULL, `avatar` int(11) DEFAULT '0' COMMENT '公会头像', -`notice` mediumtext DEFAULT '', +`notice` varchar(20000) NOT NULL DEFAULT '', `join_cond` tinyint(4) DEFAULT '0' COMMENT '公会加入类型 0 需要审批, 1 自由加入, 2 成员星星数条件', `join_cond_value` int(11) DEFAULT '0' COMMENT '星星数条件值', `total_stars` int(11) DEFAULT '0', diff --git a/server/imserver/constant.go b/server/imserver/constant.go index 12bbdf51..39abd745 100644 --- a/server/imserver/constant.go +++ b/server/imserver/constant.go @@ -50,7 +50,7 @@ const ( // im server guild const ( RandomGuildCount = 10 - MembersMax = 30 + MaxMembers = 30 MaxPendingReqs = 10 DefaultLogs = 20 LogTypeApprove = 1 // 公会日志类型, 批准加入 diff --git a/server/imserver/guild.go b/server/imserver/guild.go index 4442bfa6..f55177f1 100644 --- a/server/imserver/guild.go +++ b/server/imserver/guild.go @@ -17,7 +17,7 @@ type Guild struct { TotalStars int32 // 公会统计信息, 总星星数量 TotalKills int32 // 公会统计信息, 单局总击杀数 ChickenDinners int32 // 公会统计信息, 单局第一名数 - MembersMax int32 // 公会最大成员数 default 30 + MaxMembers int32 // 公会最大成员数 default 30 Members []*GuildMember PendingReqs map[string]int32 // pendingAccountId -> status 0,1,2,3 pending, accept, reject, leave } @@ -74,7 +74,7 @@ func (g *Guild) IsMember(accountId string) bool { // IsFull 成员是否已满 func (g *Guild) IsFull() bool { - return int32(len(g.Members)) >= g.MembersMax + return int32(len(g.Members)) >= g.MaxMembers } // AddMember 添加成员 diff --git a/server/imserver/guilddbmgr.go b/server/imserver/guilddbmgr.go index 80326148..8a78f03a 100644 --- a/server/imserver/guilddbmgr.go +++ b/server/imserver/guilddbmgr.go @@ -54,7 +54,7 @@ func (gm *GuildMgr) loadGuildFromDBResult(err error, rows *f5.DataSet) { TotalStars: q5.ToInt32(*rows.GetByIndex(8)), TotalKills: q5.ToInt32(*rows.GetByIndex(9)), ChickenDinners: q5.ToInt32(*rows.GetByIndex(10)), - MembersMax: q5.ToInt32(*rows.GetByIndex(11)), + MaxMembers: q5.ToInt32(*rows.GetByIndex(11)), } gm.guildIds = append(gm.guildIds, guildId) } @@ -200,7 +200,7 @@ func (gm *GuildMgr) createGuildDB(g *Guild) { {"guild_id", q5.ToString(g.GuildId)}, {"name", g.Name}, {"leader_account_id", g.LeaderId}, - {"max_members", q5.ToString(g.MembersMax)}, + {"max_members", q5.ToString(g.MaxMembers)}, } var insertError error var lastInsertId int64 diff --git a/server/imserver/guildmgr.go b/server/imserver/guildmgr.go index 29d1210d..304df762 100644 --- a/server/imserver/guildmgr.go +++ b/server/imserver/guildmgr.go @@ -6,6 +6,7 @@ import ( "fmt" "math/rand" "q5" + "sort" "time" ) @@ -77,7 +78,7 @@ func (gm *GuildMgr) CreateGuild(avatar int32, name *string, leaderId string, {"name", *name}, {"leader_account_id", leaderId}, {"avatar", q5.ToString(avatar)}, - {"max_members", q5.ToString(MembersMax)}, + {"max_members", q5.ToString(MaxMembers)}, {"createtime", q5.ToString(unixSec)}, {"modifytime", q5.ToString(unixSec)}, } @@ -110,7 +111,7 @@ func (gm *GuildMgr) CreateGuild(avatar int32, name *string, leaderId string, TotalStars: 0, TotalKills: 0, ChickenDinners: 0, - MembersMax: MembersMax, + MaxMembers: MaxMembers, PendingReqs: make(map[string]int32, MaxPendingReqs), } guild.AddMember(newMember) @@ -386,15 +387,48 @@ func (gm *GuildMgr) LeaveGuild(accountId string, cb func(errCode int32, errMsg s cb(ERR_CODE_GUILD_NO_EXISTS, "LeaveGuild guild no exists") return } - if guild.LeaderId == accountId { - cb(ERR_CODE_GUILD_BLOCKED_LEADER, "LeaveGuild Blocked leader") - return - } member := guild.GetMember(accountId) if member == nil { cb(ERR_CODE_GUILD_MEMBER_NO_EXISTS, "LeaveGuild member no exists") return } + //guildId := guild.GuildId + //guildName := guild.Name + + membersCount := guild.GetMembersCount() + // 解散公会 + if membersCount <= 1 { + gm.Disband(accountId, cb) + return + } + + // 重新选举公长 + if accountId == guild.LeaderId { + newLeader := ElectNewGuildLeader(guild) + if newLeader == nil { + cb(ERR_CODE_UPDATE_GUILD_DB_FAIL, "error") + return + } + guild.LeaderId = newLeader.AccountId + updateFields := [][]string{ + {"leader_account_id", q5.ToString(guild.LeaderId)}, + } + gm.updateGuild(guild, updateFields, func(err error) { + if err != nil { + cb(ERR_CODE_UPDATE_GUILD_DB_FAIL, err.Error()) + return + } + // 新会长 + newMemberFields := [][]string{{"level", q5.ToString(newLeader.Level)}} + gm.updateGuildMember(guild, newLeader.AccountId, newMemberFields, + func(err error) { + if err != nil { + cb(ERR_CODE_UPDATE_GUILD_MEMBER_DB_FAIL, err.Error()) + return + } + }) + }) + } fields := [][]string{{"is_leave_guild", q5.ToString(1)}} gm.updateGuildMember(guild, member.AccountId, fields, @@ -977,3 +1011,26 @@ func (gm *GuildMgr) GetGuildLogs(guildId int64) []*GuildLog { } return nil } + +func ElectNewGuildLeader(guild *Guild) *GuildMember { + sort.Slice(guild.Members, func(i, j int) bool { + return guild.Members[i].Level < guild.Members[j].Level + }) + // 找到级别最低的成员 + lowestLevel := guild.Members[0].Level + + var potentialLeaders []*GuildMember + for _, member := range guild.Members { + if member.Level == lowestLevel { + potentialLeaders = append(potentialLeaders, member) + } else { + break + } + } + + newLeader := potentialLeaders[rand.Intn(len(potentialLeaders))] + newLeader.Level = GuildMemberLevelLeader + return newLeader + //newLeader.Level = GuildMemberLevelLeader + //return newLeader.AccountId +} diff --git a/server/imserver/player.go b/server/imserver/player.go index fa89d8f6..3c2575bd 100644 --- a/server/imserver/player.go +++ b/server/imserver/player.go @@ -663,7 +663,7 @@ func (p *Player) FillMFGuild(guild *Guild) *cs.MFGuild { TotalStars: &totalStar, TotalKills: &guild.TotalKills, ChickenDinners: &guild.ChickenDinners, - MaxMembers: &guild.MembersMax, + MaxMembers: &guild.MaxMembers, Members: guildMembers, } return resGuild