优化退出工会
This commit is contained in:
parent
27ee9040fd
commit
86df80be84
@ -43,7 +43,7 @@ CREATE TABLE `t_guild` (
|
|||||||
`name` varchar(48) NOT NULL,
|
`name` varchar(48) NOT NULL,
|
||||||
`leader_account_id` varchar(60) NOT NULL,
|
`leader_account_id` varchar(60) NOT NULL,
|
||||||
`avatar` int(11) DEFAULT '0' COMMENT '公会头像',
|
`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` tinyint(4) DEFAULT '0' COMMENT '公会加入类型 0 需要审批, 1 自由加入, 2 成员星星数条件',
|
||||||
`join_cond_value` int(11) DEFAULT '0' COMMENT '星星数条件值',
|
`join_cond_value` int(11) DEFAULT '0' COMMENT '星星数条件值',
|
||||||
`total_stars` int(11) DEFAULT '0',
|
`total_stars` int(11) DEFAULT '0',
|
||||||
|
@ -50,7 +50,7 @@ const (
|
|||||||
// im server guild
|
// im server guild
|
||||||
const (
|
const (
|
||||||
RandomGuildCount = 10
|
RandomGuildCount = 10
|
||||||
MembersMax = 30
|
MaxMembers = 30
|
||||||
MaxPendingReqs = 10
|
MaxPendingReqs = 10
|
||||||
DefaultLogs = 20
|
DefaultLogs = 20
|
||||||
LogTypeApprove = 1 // 公会日志类型, 批准加入
|
LogTypeApprove = 1 // 公会日志类型, 批准加入
|
||||||
|
@ -17,7 +17,7 @@ type Guild struct {
|
|||||||
TotalStars int32 // 公会统计信息, 总星星数量
|
TotalStars int32 // 公会统计信息, 总星星数量
|
||||||
TotalKills int32 // 公会统计信息, 单局总击杀数
|
TotalKills int32 // 公会统计信息, 单局总击杀数
|
||||||
ChickenDinners int32 // 公会统计信息, 单局第一名数
|
ChickenDinners int32 // 公会统计信息, 单局第一名数
|
||||||
MembersMax int32 // 公会最大成员数 default 30
|
MaxMembers int32 // 公会最大成员数 default 30
|
||||||
Members []*GuildMember
|
Members []*GuildMember
|
||||||
PendingReqs map[string]int32 // pendingAccountId -> status 0,1,2,3 pending, accept, reject, leave
|
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 成员是否已满
|
// IsFull 成员是否已满
|
||||||
func (g *Guild) IsFull() bool {
|
func (g *Guild) IsFull() bool {
|
||||||
return int32(len(g.Members)) >= g.MembersMax
|
return int32(len(g.Members)) >= g.MaxMembers
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddMember 添加成员
|
// AddMember 添加成员
|
||||||
|
@ -54,7 +54,7 @@ func (gm *GuildMgr) loadGuildFromDBResult(err error, rows *f5.DataSet) {
|
|||||||
TotalStars: q5.ToInt32(*rows.GetByIndex(8)),
|
TotalStars: q5.ToInt32(*rows.GetByIndex(8)),
|
||||||
TotalKills: q5.ToInt32(*rows.GetByIndex(9)),
|
TotalKills: q5.ToInt32(*rows.GetByIndex(9)),
|
||||||
ChickenDinners: q5.ToInt32(*rows.GetByIndex(10)),
|
ChickenDinners: q5.ToInt32(*rows.GetByIndex(10)),
|
||||||
MembersMax: q5.ToInt32(*rows.GetByIndex(11)),
|
MaxMembers: q5.ToInt32(*rows.GetByIndex(11)),
|
||||||
}
|
}
|
||||||
gm.guildIds = append(gm.guildIds, guildId)
|
gm.guildIds = append(gm.guildIds, guildId)
|
||||||
}
|
}
|
||||||
@ -200,7 +200,7 @@ func (gm *GuildMgr) createGuildDB(g *Guild) {
|
|||||||
{"guild_id", q5.ToString(g.GuildId)},
|
{"guild_id", q5.ToString(g.GuildId)},
|
||||||
{"name", g.Name},
|
{"name", g.Name},
|
||||||
{"leader_account_id", g.LeaderId},
|
{"leader_account_id", g.LeaderId},
|
||||||
{"max_members", q5.ToString(g.MembersMax)},
|
{"max_members", q5.ToString(g.MaxMembers)},
|
||||||
}
|
}
|
||||||
var insertError error
|
var insertError error
|
||||||
var lastInsertId int64
|
var lastInsertId int64
|
||||||
|
@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"q5"
|
"q5"
|
||||||
|
"sort"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -77,7 +78,7 @@ func (gm *GuildMgr) CreateGuild(avatar int32, name *string, leaderId string,
|
|||||||
{"name", *name},
|
{"name", *name},
|
||||||
{"leader_account_id", leaderId},
|
{"leader_account_id", leaderId},
|
||||||
{"avatar", q5.ToString(avatar)},
|
{"avatar", q5.ToString(avatar)},
|
||||||
{"max_members", q5.ToString(MembersMax)},
|
{"max_members", q5.ToString(MaxMembers)},
|
||||||
{"createtime", q5.ToString(unixSec)},
|
{"createtime", q5.ToString(unixSec)},
|
||||||
{"modifytime", q5.ToString(unixSec)},
|
{"modifytime", q5.ToString(unixSec)},
|
||||||
}
|
}
|
||||||
@ -110,7 +111,7 @@ func (gm *GuildMgr) CreateGuild(avatar int32, name *string, leaderId string,
|
|||||||
TotalStars: 0,
|
TotalStars: 0,
|
||||||
TotalKills: 0,
|
TotalKills: 0,
|
||||||
ChickenDinners: 0,
|
ChickenDinners: 0,
|
||||||
MembersMax: MembersMax,
|
MaxMembers: MaxMembers,
|
||||||
PendingReqs: make(map[string]int32, MaxPendingReqs),
|
PendingReqs: make(map[string]int32, MaxPendingReqs),
|
||||||
}
|
}
|
||||||
guild.AddMember(newMember)
|
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")
|
cb(ERR_CODE_GUILD_NO_EXISTS, "LeaveGuild guild no exists")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if guild.LeaderId == accountId {
|
|
||||||
cb(ERR_CODE_GUILD_BLOCKED_LEADER, "LeaveGuild Blocked leader")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
member := guild.GetMember(accountId)
|
member := guild.GetMember(accountId)
|
||||||
if member == nil {
|
if member == nil {
|
||||||
cb(ERR_CODE_GUILD_MEMBER_NO_EXISTS, "LeaveGuild member no exists")
|
cb(ERR_CODE_GUILD_MEMBER_NO_EXISTS, "LeaveGuild member no exists")
|
||||||
return
|
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)}}
|
fields := [][]string{{"is_leave_guild", q5.ToString(1)}}
|
||||||
gm.updateGuildMember(guild, member.AccountId, fields,
|
gm.updateGuildMember(guild, member.AccountId, fields,
|
||||||
@ -977,3 +1011,26 @@ func (gm *GuildMgr) GetGuildLogs(guildId int64) []*GuildLog {
|
|||||||
}
|
}
|
||||||
return nil
|
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,
|
TotalStars: &totalStar,
|
||||||
TotalKills: &guild.TotalKills,
|
TotalKills: &guild.TotalKills,
|
||||||
ChickenDinners: &guild.ChickenDinners,
|
ChickenDinners: &guild.ChickenDinners,
|
||||||
MaxMembers: &guild.MembersMax,
|
MaxMembers: &guild.MaxMembers,
|
||||||
Members: guildMembers,
|
Members: guildMembers,
|
||||||
}
|
}
|
||||||
return resGuild
|
return resGuild
|
||||||
|
Loading…
x
Reference in New Issue
Block a user