优化退出工会
This commit is contained in:
parent
27ee9040fd
commit
86df80be84
@ -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',
|
||||
|
@ -50,7 +50,7 @@ const (
|
||||
// im server guild
|
||||
const (
|
||||
RandomGuildCount = 10
|
||||
MembersMax = 30
|
||||
MaxMembers = 30
|
||||
MaxPendingReqs = 10
|
||||
DefaultLogs = 20
|
||||
LogTypeApprove = 1 // 公会日志类型, 批准加入
|
||||
|
@ -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 添加成员
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user