This commit is contained in:
殷勇 2023-08-22 19:34:48 +08:00
parent 6dbfc4d22a
commit e5adb3e3d0
4 changed files with 46 additions and 43 deletions

View File

@ -68,7 +68,7 @@ CREATE TABLE `t_guild_members` (
`guild_id` bigint(20) NOT NULL, `guild_id` bigint(20) NOT NULL,
`account_id` varchar(60) COLLATE utf8_bin NOT NULL, `account_id` varchar(60) COLLATE utf8_bin NOT NULL,
`level` tinyint(4) DEFAULT '0' COMMENT '成员阶级1会长,2干部,3群众', `level` tinyint(4) DEFAULT '0' COMMENT '成员阶级1会长,2干部,3群众',
`is_deleted` tinyint(4) DEFAULT '0' COMMENT '是否已离开公会 0 正常, 1 已离开', `is_leave_guild` tinyint(4) DEFAULT '0' COMMENT '是否已离开公会 0 正常, 1 已离开',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间', `createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间', `modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`idx`), PRIMARY KEY (`idx`),

View File

@ -57,7 +57,7 @@ func (gm *GuildMgr) loadGuildFromDBResult(err error, rows *f5.DataSet) {
func (gm *GuildMgr) loadGuildMemberFromDB() { func (gm *GuildMgr) loadGuildMemberFromDB() {
fields := []string{"guild_id", "account_id", "level"} fields := []string{"guild_id", "account_id", "level"}
where := [][]string{ where := [][]string{
{"is_deleted", "0"}, {"is_leave_guild", "0"},
} }
f5.GetJsStyleDb().Select( f5.GetJsStyleDb().Select(
FRIEND_DB, FRIEND_DB,
@ -207,7 +207,7 @@ func (gm *GuildMgr) insertGuildMember(guildId int64, member *GuildMember) {
{"account_id", member.AccountId}, {"account_id", member.AccountId},
{"level", q5.ToString(member.Level)}, {"level", q5.ToString(member.Level)},
} }
f5.GetJsStyleDb().Insert( f5.GetJsStyleDb().Replace(
FRIEND_DB, FRIEND_DB,
"t_guild_members", "t_guild_members",
fields, fields,

View File

@ -2,7 +2,6 @@ package main
import ( import (
"cs" "cs"
"errors"
"f5" "f5"
"fmt" "fmt"
"math/rand" "math/rand"
@ -37,10 +36,16 @@ func (gm *GuildMgr) init() {
// CreateGuild 创建公会 // CreateGuild 创建公会
func (gm *GuildMgr) CreateGuild(name string, leaderID string) (int64, error) { func (gm *GuildMgr) CreateGuild(name string, leaderID string) (int64, error) {
guildId := f5.GetApp().NewUuid() // check join guild
otherGuildId, isJoin := gm.checkJoinGuild(leaderID)
if isJoin {
errMsg := fmt.Sprintf("Player:%s has joined other guild:%d", leaderID, otherGuildId)
return 0, fmt.Errorf(errMsg)
}
guildId := f5.GetApp().NewUuid()
if _, exists := gm.Guilds[guildId]; exists { if _, exists := gm.Guilds[guildId]; exists {
return 0, errors.New("guild already exists") return 0, fmt.Errorf("guild already exists")
} }
maxMembers := 10 maxMembers := 10
guild := &Guild{ guild := &Guild{
@ -53,7 +58,7 @@ func (gm *GuildMgr) CreateGuild(name string, leaderID string) (int64, error) {
newLevel := 1 // 会长 newLevel := 1 // 会长
newMember := GuildMember{AccountId: leaderID, Level: newLevel} newMember := GuildMember{AccountId: leaderID, Level: newLevel}
guild.AddMember(&newMember) _ = guild.AddMember(&newMember)
gm.insertGuildMember(guildId, &newMember) gm.insertGuildMember(guildId, &newMember)
gm.Guilds[guildId] = guild gm.Guilds[guildId] = guild
@ -63,21 +68,20 @@ func (gm *GuildMgr) CreateGuild(name string, leaderID string) (int64, error) {
// ApplyToGuild 申请加入公会 // ApplyToGuild 申请加入公会
func (gm *GuildMgr) ApplyToGuild(guildId int64, applicantAccountId string) error { func (gm *GuildMgr) ApplyToGuild(guildId int64, applicantAccountId string) error {
if _, exists := gm.Guilds[guildId]; !exists { if _, exists := gm.Guilds[guildId]; !exists {
return errors.New("guild not found") return fmt.Errorf("guild not found")
} }
// check join guild // check join guild
otherGuildId, isJoin := gm.checkJoinGuild(applicantAccountId) otherGuildId, isJoin := gm.checkJoinGuild(applicantAccountId)
if isJoin { if isJoin {
errMsg := fmt.Sprintf("Player:%s has joined other guild:%d", applicantAccountId, otherGuildId) errMsg := fmt.Sprintf("Player:%s has joined other guild:%d", applicantAccountId, otherGuildId)
return errors.New(errMsg) return fmt.Errorf(errMsg)
} }
guild := gm.Guilds[guildId] guild := gm.Guilds[guildId]
if len(guild.Members) >= guild.MaxMembers { if len(guild.Members) >= guild.MaxMembers {
return errors.New("guild is full") return fmt.Errorf("guild is full")
} }
// IF exists, then replace // IF exists, then replace it
gm.insertPendingReqs(guildId, applicantAccountId) gm.insertPendingReqs(guildId, applicantAccountId)
gm.pendingReqs[guildId][applicantAccountId] = true gm.pendingReqs[guildId][applicantAccountId] = true
return nil return nil
@ -87,7 +91,7 @@ func (gm *GuildMgr) ApplyToGuild(guildId int64, applicantAccountId string) error
func (gm *GuildMgr) Approve(guildId int64, operatorAccountId, accountId string) error { func (gm *GuildMgr) Approve(guildId int64, operatorAccountId, accountId string) error {
guild, exists := gm.Guilds[guildId] guild, exists := gm.Guilds[guildId]
if !exists { if !exists {
return errors.New("guild not found") return fmt.Errorf("guild not found")
} }
// 公会干部及以上仅可操作 // 公会干部及以上仅可操作
@ -100,12 +104,12 @@ func (gm *GuildMgr) Approve(guildId int64, operatorAccountId, accountId string)
otherGuildId, isJoin := gm.checkJoinGuild(accountId) otherGuildId, isJoin := gm.checkJoinGuild(accountId)
if isJoin { if isJoin {
errMsg := fmt.Sprintf("Player:%s has joined other guild:%d", accountId, otherGuildId) errMsg := fmt.Sprintf("Player:%s has joined other guild:%d", accountId, otherGuildId)
return errors.New(errMsg) return fmt.Errorf(errMsg)
} }
_, exists = gm.pendingReqs[guildId][accountId] _, exists = gm.pendingReqs[guildId][accountId]
if !exists { if !exists {
return errors.New("no pending applications for this guild") return fmt.Errorf("no pending applications for this guild")
} }
newMember := GuildMember{AccountId: accountId, Level: 3} newMember := GuildMember{AccountId: accountId, Level: 3}
@ -125,7 +129,7 @@ func (gm *GuildMgr) Approve(guildId int64, operatorAccountId, accountId string)
func (gm *GuildMgr) Reject(guildId int64, applicantAccountId string) error { func (gm *GuildMgr) Reject(guildId int64, applicantAccountId string) error {
_, exists := gm.pendingReqs[guildId] _, exists := gm.pendingReqs[guildId]
if !exists { if !exists {
return errors.New("no pending applications for this guild") return fmt.Errorf("no pending applications for this guild")
} }
//delete(gm.pendingReqs[guildId], applicantAccountId) //delete(gm.pendingReqs[guildId], applicantAccountId)
@ -139,11 +143,11 @@ func (gm *GuildMgr) Reject(guildId int64, applicantAccountId string) error {
//func (gm *GuildMgr) JoinGuild(guildId int64, memberID string) error { //func (gm *GuildMgr) JoinGuild(guildId int64, memberID string) error {
// guild, exists := gm.Guilds[guildId] // guild, exists := gm.Guilds[guildId]
// if !exists { // if !exists {
// return errors.New("guild not found") // return fmt.Errorf("guild not found")
// } // }
// //
// if len(guild.Members) >= guild.MaxMembers { // if len(guild.Members) >= guild.MaxMembers {
// return errors.New("guild is full") // return fmt.Errorf("guild is full")
// } // }
// //
// newMember := GuildMember{AccountId: memberID, Level: 3} // newMember := GuildMember{AccountId: memberID, Level: 3}
@ -155,20 +159,20 @@ func (gm *GuildMgr) Reject(guildId int64, applicantAccountId string) error {
func (gm *GuildMgr) LeaveGuild(guildId int64, memberID string) error { func (gm *GuildMgr) LeaveGuild(guildId int64, memberID string) error {
guild, exists := gm.Guilds[guildId] guild, exists := gm.Guilds[guildId]
if !exists { if !exists {
return errors.New("guild not found") return fmt.Errorf("guild not found")
}
if guild.LeaderId == memberID {
return fmt.Errorf("leader not leave guild")
} }
member, err := guild.GetMember(memberID) member, err := guild.GetMember(memberID)
if err != nil { if err != nil {
return errors.New("member not found in the guild") return fmt.Errorf("member not found in the guild")
}
if guild.LeaderId == memberID {
return errors.New("leader not leave guild")
} }
_ = guild.RemoveMember(memberID) _ = guild.RemoveMember(memberID)
fields := [][]string{{"is_deleted", q5.ToString(1)}} fields := [][]string{{"is_leave_guild", q5.ToString(1)}}
where := []string{"account_id", q5.ToString(member.AccountId)} where := []string{"account_id", q5.ToString(member.AccountId)}
gm.updateGuildMember(guild, fields, where) gm.updateGuildMember(guild, fields, where)
@ -179,32 +183,31 @@ func (gm *GuildMgr) LeaveGuild(guildId int64, memberID string) error {
func (gm *GuildMgr) DismissMember(guildId int64, operatorAccountId, memberID string) error { func (gm *GuildMgr) DismissMember(guildId int64, operatorAccountId, memberID string) error {
guild, exists := gm.Guilds[guildId] guild, exists := gm.Guilds[guildId]
if !exists { if !exists {
return errors.New("guild not found") return fmt.Errorf("guild not found")
} }
if memberID == guild.LeaderId { if memberID == guild.LeaderId {
return errors.New("cannot dismiss the leader") return fmt.Errorf("cannot dismiss the leader")
} }
operatorMember, err := guild.GetMember(operatorAccountId) operatorMember, err := guild.GetMember(operatorAccountId)
if err != nil { if err != nil {
return errors.New("cannot dismiss the leader") return fmt.Errorf("cannot dismiss the leader")
} }
if operatorMember.Level >= 2 { if operatorMember.Level >= 2 {
return errors.New("no permission") return fmt.Errorf("no permission")
} }
dismissMember, err := guild.GetMember(memberID) dismissMember, err := guild.GetMember(memberID)
if err != nil { if err != nil {
return errors.New("member not found in the guild") return fmt.Errorf("member not found in the guild")
} }
if dismissMember.Level <= 2 { if dismissMember.Level <= 2 {
return errors.New("no permission") return fmt.Errorf("no permission")
} }
_ = guild.RemoveMember(memberID) _ = guild.RemoveMember(memberID)
fields := [][]string{{"is_leave_guild", q5.ToString(1)}}
fields := [][]string{{"is_deleted", q5.ToString(1)}}
where := []string{"account_id", q5.ToString(dismissMember.AccountId)} where := []string{"account_id", q5.ToString(dismissMember.AccountId)}
gm.updateGuildMember(guild, fields, where) gm.updateGuildMember(guild, fields, where)
@ -215,16 +218,16 @@ func (gm *GuildMgr) DismissMember(guildId int64, operatorAccountId, memberID str
func (gm *GuildMgr) PromoteMember(guildId int64, operatorAccountId, memberID string) error { func (gm *GuildMgr) PromoteMember(guildId int64, operatorAccountId, memberID string) error {
guild, exists := gm.Guilds[guildId] guild, exists := gm.Guilds[guildId]
if !exists { if !exists {
return errors.New("guild not found") return fmt.Errorf("guild not found")
} }
if memberID == guild.LeaderId { if memberID == guild.LeaderId {
return errors.New("cannot promote the leader") return fmt.Errorf("cannot promote the leader")
} }
member, err := guild.GetMember(memberID) member, err := guild.GetMember(memberID)
if err != nil { if err != nil {
return errors.New("member not found in the guild") return fmt.Errorf("member not found in the guild")
} }
newLevel := 2 newLevel := 2
member.Level = newLevel member.Level = newLevel
@ -240,16 +243,16 @@ func (gm *GuildMgr) PromoteMember(guildId int64, operatorAccountId, memberID str
func (gm *GuildMgr) DemoteMember(guildId int64, operatorAccountId, memberID string) error { func (gm *GuildMgr) DemoteMember(guildId int64, operatorAccountId, memberID string) error {
guild, exists := gm.Guilds[guildId] guild, exists := gm.Guilds[guildId]
if !exists { if !exists {
return errors.New("guild not found") return fmt.Errorf("guild not found")
} }
if memberID == guild.LeaderId { if memberID == guild.LeaderId {
return errors.New("cannot demote the leader") return fmt.Errorf("cannot demote the leader")
} }
member, err := guild.GetMember(memberID) member, err := guild.GetMember(memberID)
if err != nil { if err != nil {
return errors.New("member not found in the guild") return fmt.Errorf("member not found in the guild")
} }
newLevel := 3 newLevel := 3
member.Level = newLevel member.Level = newLevel
@ -279,11 +282,11 @@ func (gm *GuildMgr) WriteLog(guildId int64, accountId string, logType uint16, co
func (gm *GuildMgr) Disband(guildId int64, accountId string) error { func (gm *GuildMgr) Disband(guildId int64, accountId string) error {
guild, exists := gm.Guilds[guildId] guild, exists := gm.Guilds[guildId]
if !exists { if !exists {
return errors.New("guild not found") return fmt.Errorf("guild not found")
} }
if accountId != guild.LeaderId { if accountId != guild.LeaderId {
return errors.New("cannot disband guild") return fmt.Errorf("cannot disband guild")
} }
guildName := guild.Name guildName := guild.Name
@ -384,7 +387,7 @@ func containsSubstring(s, substr string) bool {
func (gm *GuildMgr) checkOperatorPerm(guild *Guild, operatorAccountId string, level int) error { func (gm *GuildMgr) checkOperatorPerm(guild *Guild, operatorAccountId string, level int) error {
operatorMember, err := guild.GetMember(operatorAccountId) operatorMember, err := guild.GetMember(operatorAccountId)
if err != nil { if err != nil {
//return errors.New("checkOperatorPerm: no member") //return fmt.Errorf("checkOperatorPerm: no member")
return fmt.Errorf("checkOperatorPerm: no member[%s]", operatorAccountId) return fmt.Errorf("checkOperatorPerm: no member[%s]", operatorAccountId)
} }
if operatorMember.Level > level { if operatorMember.Level > level {

View File

@ -264,7 +264,7 @@ func (p *Player) CMLeaveGuild(hdr *f5.MsgHdr, msg *cs.CMLeaveGuild) {
rspMsg := new(cs.SMLeaveGuild) rspMsg := new(cs.SMLeaveGuild)
guildId := msg.GetGuildId() guildId := msg.GetGuildId()
err := guildMgr.Reject( err := guildMgr.LeaveGuild(
guildId, guildId,
p.accountId, p.accountId,
) )