From cf7a3f542f035317b6242e25c34532a6f882e353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B7=E5=8B=87?= Date: Wed, 30 Aug 2023 14:31:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=AC=E4=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/imserver/guild.go | 20 ++++++++------ server/imserver/guildmgr.go | 53 +++++++++++++++++++++---------------- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/server/imserver/guild.go b/server/imserver/guild.go index dc94493a..0946476f 100644 --- a/server/imserver/guild.go +++ b/server/imserver/guild.go @@ -26,6 +26,10 @@ type GuildLog struct { Content string } +func (g *Guild) GetGuildId() int64 { + return g.GuildId +} + // findMemberIndex 根据 AccountId 查找成员在 Members 切片中的索引 func (g *Guild) findMemberIndex(AccountId string) int { for i, member := range g.Members { @@ -46,15 +50,20 @@ func (g *Guild) GetMember(accountId string) (*GuildMember, error) { return g.Members[index], nil } -// isMember 是否是公会成员 -func (g *Guild) isMember(accountId string) bool { +// IsMember 是否是公会成员 +func (g *Guild) IsMember(accountId string) bool { index := g.findMemberIndex(accountId) return index >= 0 } +// IsFull 成员是否已满 +func (g *Guild) IsFull() bool { + return len(g.Members) >= g.MaxMembers +} + // AddMember 添加成员 func (g *Guild) AddMember(member *GuildMember) error { - if len(g.Members) >= g.MaxMembers { + if g.IsFull() { return fmt.Errorf("guild is full") } g.Members = append(g.Members, member) @@ -71,7 +80,6 @@ func (g *Guild) RemoveMember(accountId string) error { if index == -1 { return fmt.Errorf("member not found") } - //g.Members = append(g.Members[:index], g.Members[index+1:]...) // 使用 copy 方法来删除切片中的元素,保证数据一致性 copy(g.Members[index:], g.Members[index+1:]) @@ -80,7 +88,3 @@ func (g *Guild) RemoveMember(accountId string) error { return nil } - -func (g *Guild) GetGuildId() int64 { - return g.GuildId -} diff --git a/server/imserver/guildmgr.go b/server/imserver/guildmgr.go index 8de55833..dea3591a 100644 --- a/server/imserver/guildmgr.go +++ b/server/imserver/guildmgr.go @@ -90,7 +90,8 @@ func (gm *GuildMgr) CreateGuild(name string, leaderId string) (int64, error) { // ApplyToGuild 申请加入公会 func (gm *GuildMgr) ApplyToGuild(guildId int64, applicantAccountId string) error { - if _, exists := gm.Guilds[guildId]; !exists { + guild := gm.GetGuild(guildId) + if guild == nil { return fmt.Errorf("guild not found") } @@ -100,8 +101,7 @@ func (gm *GuildMgr) ApplyToGuild(guildId int64, applicantAccountId string) error return err } - guild := gm.Guilds[guildId] - if len(guild.Members) >= guild.MaxMembers { + if guild.IsFull() { return fmt.Errorf("guild is full") } @@ -118,8 +118,8 @@ func (gm *GuildMgr) ApplyToGuild(guildId int64, applicantAccountId string) error // Approve 同意申请者加入公会 func (gm *GuildMgr) Approve(guildId int64, operatorAccountId, accountId string) error { - guild, exists := gm.Guilds[guildId] - if !exists { + guild := gm.GetGuild(guildId) + if guild == nil { return fmt.Errorf("guild not found") } @@ -134,12 +134,14 @@ func (gm *GuildMgr) Approve(guildId int64, operatorAccountId, accountId string) return err } + // 是否加入其他公会 _, err = gm.checkJoinGuild(accountId) if err != nil { return err } - _, exists = gm.pendingReqs[guildId][accountId] + // 是否在申请队列中 + _, exists := gm.pendingReqs[guildId][accountId] if !exists { return fmt.Errorf("no pending applications for this guild") } @@ -199,8 +201,8 @@ func (gm *GuildMgr) JoinGuild(guildId int64, accountId string) error { // LeaveGuild 离开公会 func (gm *GuildMgr) LeaveGuild(guildId int64, accountId string) error { - guild, exists := gm.Guilds[guildId] - if !exists { + guild := gm.GetGuild(guildId) + if guild == nil { return fmt.Errorf("guild not found") } @@ -225,8 +227,8 @@ func (gm *GuildMgr) LeaveGuild(guildId int64, accountId string) error { // DismissMember 开除成员 踢出 func (gm *GuildMgr) DismissMember(guildId int64, operatorAccountId, accountId string) error { - guild, exists := gm.Guilds[guildId] - if !exists { + guild := gm.GetGuild(guildId) + if guild == nil { return fmt.Errorf("guild not found") } @@ -270,8 +272,8 @@ func (gm *GuildMgr) DismissMember(guildId int64, operatorAccountId, accountId st // PromoteMember 提升成员为干部 func (gm *GuildMgr) PromoteMember(guildId int64, operatorAccountId, accountId string) error { - guild, exists := gm.Guilds[guildId] - if !exists { + guild := gm.GetGuild(guildId) + if guild == nil { return fmt.Errorf("guild not found") } @@ -314,8 +316,8 @@ func (gm *GuildMgr) PromoteMember(guildId int64, operatorAccountId, accountId st // DemoteMember 解除成员干部身份 func (gm *GuildMgr) DemoteMember(guildId int64, operatorAccountId, accountId string) error { - guild, exists := gm.Guilds[guildId] - if !exists { + guild := gm.GetGuild(guildId) + if guild == nil { return fmt.Errorf("guild not found") } @@ -358,8 +360,8 @@ func (gm *GuildMgr) DemoteMember(guildId int64, operatorAccountId, accountId str // Disband 解散公会 func (gm *GuildMgr) Disband(guildId int64, accountId string) error { - guild, exists := gm.Guilds[guildId] - if !exists { + guild := gm.GetGuild(guildId) + if guild == nil { return fmt.Errorf("guild not found") } @@ -396,6 +398,11 @@ func (gm *GuildMgr) Disband(guildId int64, accountId string) error { // WriteLog 记录公会日志 func (gm *GuildMgr) WriteLog(guildId int64, accountId string, logType uint16, content string) { + guild := gm.GetGuild(guildId) + if guild == nil { + return + } + _, exists := gm.Logs[guildId] if !exists { gm.Logs[guildId] = make([]*GuildLog, DefaultLogs) @@ -454,6 +461,13 @@ func (gm *GuildMgr) RandomGuilds() []Guild { return results } +func (gm *GuildMgr) GetGuild(guildId int64) *Guild { + if guild, exists := gm.Guilds[guildId]; exists { + return guild + } + return nil +} + // GetGuildByAccountId 查询我的工会 func (gm *GuildMgr) GetGuildByAccountId(accountId string) *Guild { for _, guild := range gm.Guilds { @@ -466,13 +480,6 @@ func (gm *GuildMgr) GetGuildByAccountId(accountId string) *Guild { return nil } -func (gm *GuildMgr) getGuild(guildId int64) *Guild { - if guild, ok := gm.Guilds[guildId]; ok { - return guild - } - return nil -} - // Info 工会信息 func (gm *GuildMgr) Info(accountId string) (*Guild, map[string]bool, []*GuildLog) { guild := gm.GetGuildByAccountId(accountId)