From 96253d24e3aa90fcce41d997d7aa188ebd598931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B7=E5=8B=87?= Date: Thu, 17 Aug 2023 16:50:53 +0800 Subject: [PATCH] Save --- server/imserver/guild.go | 11 ++++++++++- server/imserver/guildmgr.go | 37 +++++++++++++++++++++++++------------ 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/server/imserver/guild.go b/server/imserver/guild.go index a2a3e0a7..4b21c4b8 100644 --- a/server/imserver/guild.go +++ b/server/imserver/guild.go @@ -4,7 +4,6 @@ import "errors" type GuildMember struct { AccountId string - Username string Level int // 1: 会长, 2: 干部, 3: 成员 } @@ -31,6 +30,16 @@ func (g *Guild) findMemberIndex(AccountId string) int { return -1 } +// GetMember 获取成员 +func (g *Guild) GetMember(accountId string) (*GuildMember, error) { + index := g.findMemberIndex(accountId) + if index == -1 { + return nil, errors.New("member not found") + } + + return &g.Members[index], nil +} + // AddMember 添加成员 func (g *Guild) AddMember(member GuildMember) error { if len(g.Members) >= g.MaxMembers { diff --git a/server/imserver/guildmgr.go b/server/imserver/guildmgr.go index b85d2dd1..ce129899 100644 --- a/server/imserver/guildmgr.go +++ b/server/imserver/guildmgr.go @@ -53,7 +53,6 @@ func (gm *GuildMgr) ApplyToGuild(guildID int, applicantAccountId string) error { } guild := gm.Guilds[guildID] - // 获取即时人数, 是否需要锁 if len(guild.Members) >= guild.MaxMembers { return errors.New("guild is full") } @@ -85,7 +84,7 @@ func (gm *GuildMgr) ApproveApplication(guildID int, applicantAccountId string) e for i, accountId := range pendingAccountIds { if accountId == applicantAccountId { - newMember := GuildMember{AccountId: applicantAccountId, Username: applicantAccountId, Level: 3} + newMember := GuildMember{AccountId: applicantAccountId, Level: 3} err := guild.AddMember(newMember) if err != nil { return err @@ -115,7 +114,7 @@ func (gm *GuildMgr) RejectApplication(guildID int, applicantAccountId string) er return errors.New("applicant not found") } -// JoinGuild 加入公会 +// JoinGuild 可直接加入公会 func (gm *GuildMgr) JoinGuild(guildID int, memberID string) error { guild, exists := gm.Guilds[guildID] if !exists { @@ -126,7 +125,7 @@ func (gm *GuildMgr) JoinGuild(guildID int, memberID string) error { return errors.New("guild is full") } - newMember := GuildMember{AccountId: memberID, Username: memberID, Level: 3} + newMember := GuildMember{AccountId: memberID, Level: 3} guild.Members = append(guild.Members, newMember) return nil } @@ -137,6 +136,9 @@ func (gm *GuildMgr) LeaveGuild(guildID int, memberID string) error { if !exists { return errors.New("guild not found") } + if guild.LeaderID == memberID { + return errors.New("leader not leave guild") + } for i, member := range guild.Members { if member.AccountId == memberID { @@ -148,8 +150,8 @@ func (gm *GuildMgr) LeaveGuild(guildID int, memberID string) error { return errors.New("member not found in the guild") } -// DismissMember 开除成员 -func (gm *GuildMgr) DismissMember(guildID int, memberID string) error { +// DismissMember 开除成员 踢出 +func (gm *GuildMgr) DismissMember(guildID int, operatorAccountId, memberID string) error { guild, exists := gm.Guilds[guildID] if !exists { return errors.New("guild not found") @@ -159,14 +161,25 @@ func (gm *GuildMgr) DismissMember(guildID int, memberID string) error { return errors.New("cannot dismiss the leader") } - for i, member := range guild.Members { - if member.AccountId == memberID { - guild.Members = append(guild.Members[:i], guild.Members[i+1:]...) - return nil - } + operatorMember, err := guild.GetMember(operatorAccountId) + if err != nil { + return errors.New("cannot dismiss the leader") + } + if operatorMember.Level >= 2 { + return errors.New("no permission") } - return errors.New("member not found in the guild") + dismissMember, err := guild.GetMember(memberID) + if err != nil { + return errors.New("member not found in the guild") + } + if dismissMember.Level <= 2 { + return errors.New("no permission") + } + + _ = guild.RemoveMember(memberID) + + return nil } // PromoteMember 提升成员为干部