优化退出工会

This commit is contained in:
殷勇 2023-09-19 15:49:25 +08:00
parent 27ee9040fd
commit 86df80be84
6 changed files with 70 additions and 13 deletions

View File

@ -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',

View File

@ -50,7 +50,7 @@ const (
// im server guild
const (
RandomGuildCount = 10
MembersMax = 30
MaxMembers = 30
MaxPendingReqs = 10
DefaultLogs = 20
LogTypeApprove = 1 // 公会日志类型, 批准加入

View File

@ -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 添加成员

View File

@ -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

View File

@ -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
}

View File

@ -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