This commit is contained in:
殷勇 2023-09-04 14:43:01 +08:00
parent 650ad0f3d8
commit 2ea8e5a11f
7 changed files with 945 additions and 798 deletions

View File

@ -45,23 +45,24 @@ const (
// im server guild
const (
RandomGuildCount = 10
MaxMembers = 10
MaxPendingReqs = 10
DefaultLogs = 20
LogTypeApprove = 1 // 公会日志类型, 批准加入
LogTypeLeave = 2
LogTypeDismiss = 3
LogTypePromote = 4
LogTypeDemote = 5
LogTypeDisband = 6
GuildMemberLevelLeader = 1 // 成员等级, 会长
GuildMemberLevelViceLeader = 2 // 成员等级, 副会长
GuildMemberLevelElite = 3 // 成员等级, 精英
GuildMemberLevelDefault = 3 // 成员等级, 普通成员
JoinCondDefault = 0 // 加入条件 0 需要审批
JoinCondFree = 1 // 加入条件 1 可直接加入
JoinCondStar = 2 // 加入条件 2 满足星星条件
RandomGuildCount = 10
MaxMembers = 10
MaxPendingReqs = 10
DefaultLogs = 20
LogTypeApprove = 1 // 公会日志类型, 批准加入
LogTypeLeave = 2
LogTypeDismiss = 3
LogTypePromote = 4
LogTypeDemote = 5
LogTypeDisband = 6
GuildMemberLevelLeader = 1 // 成员等级, 会长
GuildMemberLevelViceLeader = 2 // 成员等级, 副会长
GuildMemberLevelElite = 3 // 成员等级, 精英
GuildMemberLevelDefault = 4 // 成员等级, 普通成员
JoinCondDefault = 0 // 加入条件 0 需要审批
JoinCondFree = 1 // 加入条件 1 可直接加入
JoinCondStar = 2 // 加入条件 2 满足星星条件
PendingReqIsJoinGuildStatusDefault = 0 // 等待验证请求状态, 0 等待审核
PendingReqIsJoinGuildStatusJoined = 1 // 等待验证请求状态, 1 已加入
PendingReqIsJoinGuildStatusReject = 2 // 等待验证请求状态, 2 拒绝

File diff suppressed because it is too large Load Diff

View File

@ -23,6 +23,7 @@ type Guild struct {
ChickenDinners int32 // 单局第一名数
MaxMembers int32 // 公会最大成员数 default 30
Members []*GuildMember
PendingReqs map[string]int32 // pendingAccountId -> status 0,1,2,3 pending, accept, reject, leave
}
// GuildLog 公会日志
@ -35,7 +36,8 @@ type GuildLog struct {
// PendingReq 待审核请求
type PendingReq struct {
Users map[string]bool
AccountId string
Status int32 // 0 pending, 1 ok, 2 reject, 3 disband
}
func (g *Guild) GetGuildId() int64 {
@ -53,13 +55,12 @@ func (g *Guild) findMemberIndex(AccountId string) int {
}
// GetMember 根据 AccountId 获取成员信息
func (g *Guild) GetMember(accountId string) (*GuildMember, error) {
func (g *Guild) GetMember(accountId string) *GuildMember {
index := g.findMemberIndex(accountId)
if index == -1 {
return nil, fmt.Errorf("member[%s] not found in the guild[%d]", accountId, g.GuildId)
return nil
}
return g.Members[index], nil
return g.Members[index]
}
// IsMember 是否是公会成员
@ -84,22 +85,17 @@ func (g *Guild) AddMember(member *GuildMember) {
}
// RemoveMember 移除成员
func (g *Guild) RemoveMember(accountId string) error {
func (g *Guild) RemoveMember(accountId string) {
if accountId == g.LeaderId {
return fmt.Errorf("cannot remove leader")
return
}
index := g.findMemberIndex(accountId)
if index == -1 {
return fmt.Errorf("member not found")
return
}
//g.Members = append(g.Members[:index], g.Members[index+1:]...)
// 使用 copy 方法来删除切片中的元素,保证数据一致性
copy(g.Members[index:], g.Members[index+1:])
g.Members[len(g.Members)-1] = nil // 最后一个元素设置为 nil帮助 GC
g.Members[len(g.Members)-1] = nil
g.Members = g.Members[:len(g.Members)-1]
return nil
}
func (g *Guild) SetNotice(notice *string) {
@ -110,26 +106,26 @@ func (g *Guild) GetNotice() string {
return g.Notice
}
func (p *PendingReq) GetUsers() map[string]bool {
return p.Users
// AddPendingReq 添加等待审核成员
func (g *Guild) AddPendingReq(p *PendingReq) {
g.PendingReqs[p.AccountId] = p.Status
}
func (p *PendingReq) AddUser(accountId string) {
if _, exists := p.Users[accountId]; !exists {
p.Users[accountId] = true
return
func (g *Guild) GetPendingReqStatus(accountId string) int32 {
if pendingReqStatus, exists := g.PendingReqs[accountId]; exists {
if exists {
return pendingReqStatus
}
}
p.Users[accountId] = true
return -1
}
func (p *PendingReq) RemoveUser(accountId string) {
delete(p.Users, accountId)
// RemovePendingReq 移除等待审核成员
func (g *Guild) RemovePendingReq(accountId string) {
delete(g.PendingReqs, accountId)
}
func (p *PendingReq) IsInReq(accountId string) bool {
user, exists := p.Users[accountId]
if exists {
return user == true
}
return false
func (g *Guild) IsInReq(accountId string) bool {
pendingStatus, exists := g.PendingReqs[accountId]
return exists && pendingStatus == PendingReqIsJoinGuildStatusJoined
}

View File

@ -55,8 +55,6 @@ func (gm *GuildMgr) loadGuildFromDBResult(err error, rows *f5.DataSet) {
ChickenDinners: q5.ToInt32(*rows.GetByIndex(10)),
MaxMembers: q5.ToInt32(*rows.GetByIndex(11)),
}
// init pendingReqs
gm.pendingReqs[guildId] = &PendingReq{}
}
q5.UnSetBitFlag(&gm.loadedFlags, LoadGuildFlag)
}
@ -128,10 +126,16 @@ func (gm *GuildMgr) loadPendingReqsFromDBResult(err error, rows *f5.DataSet) {
guildId = q5.ToInt64(*rows.GetByIndex(0))
accountId = q5.ToString(*rows.GetByIndex(1))
pendingReq := &PendingReq{}
pendingReq.Users = make(map[string]bool)
pendingReq.AddUser(accountId)
gm.pendingReqs[guildId] = pendingReq
pendingReq := &PendingReq{
AccountId: accountId,
Status: PendingReqIsJoinGuildStatusDefault,
}
if guild, ok := gm.guilds[guildId]; ok {
if guild.PendingReqs == nil {
guild.PendingReqs = make(map[string]int32)
}
guild.AddPendingReq(pendingReq)
}
}
q5.UnSetBitFlag(&gm.loadedFlags, LoadGuildReqFlag)
}
@ -220,7 +224,7 @@ func (gm *GuildMgr) createGuildDB(g *Guild) {
}
// updateGuild 更新公会信息
func (gm *GuildMgr) updateGuild(g *Guild, fields [][]string) {
func (gm *GuildMgr) updateGuild(g *Guild, fields [][]string, cb func(error)) {
where := [][]string{
{"guild_id", q5.ToString(g.GuildId)},
}
@ -229,7 +233,9 @@ func (gm *GuildMgr) updateGuild(g *Guild, fields [][]string) {
"t_guild",
fields,
where,
func(error, int64, int64) {},
func(err error, lastInsertId int64, rowsAffected int64) {
cb(err)
},
)
}
@ -262,8 +268,8 @@ func (gm *GuildMgr) upsertPendingReqs(guildId int64, accountId string, isJoinGui
})
}
// updatePendingReqs 更新所有申请加入公会记录
func (gm *GuildMgr) updateAllPendingReqs(guildId int64, isJoinGuild int) {
// updateAllPendingReqs 更新所有申请加入公会记录
func (gm *GuildMgr) updateAllPendingReqs(guildId int64, isJoinGuild int, cb func(error)) {
fields := [][]string{
{"is_join_guild", q5.ToString(isJoinGuild)},
}
@ -276,17 +282,13 @@ func (gm *GuildMgr) updateAllPendingReqs(guildId int64, isJoinGuild int) {
fields,
where,
func(err error, lastInsertId int64, rowsAffected int64) {
if err != nil {
f5.GetSysLog().Info("error:%v\n", err)
}
f5.GetSysLog().Info("lastInsertId:%d\n", lastInsertId)
f5.GetSysLog().Info("rowsAffected:%d\n", rowsAffected)
cb(err)
},
)
}
// updatePendingReqs 更新申请加入公会记录
func (gm *GuildMgr) updatePendingReqs(guildId int64, accountId string, isJoinGuild int) {
func (gm *GuildMgr) updatePendingReqs(guildId int64, accountId string, isJoinGuild int, cb func(error)) {
fields := [][]string{
{"is_join_guild", q5.ToString(isJoinGuild)},
}
@ -300,17 +302,13 @@ func (gm *GuildMgr) updatePendingReqs(guildId int64, accountId string, isJoinGui
fields,
where,
func(err error, lastInsertId int64, rowsAffected int64) {
if err != nil {
f5.GetSysLog().Info("error:%v\n", err)
}
f5.GetSysLog().Info("lastInsertId:%d\n", lastInsertId)
f5.GetSysLog().Info("rowsAffected:%d\n", rowsAffected)
cb(err)
},
)
}
// insertPendingReqs 添加公会成员
func (gm *GuildMgr) upsertGuildMember(guildId int64, member *GuildMember) {
func (gm *GuildMgr) upsertGuildMember(guildId int64, member *GuildMember, cb func(error)) {
where := [][]string{
{"guild_id", q5.ToString(guildId)},
{"account_id", member.AccountId},
@ -329,18 +327,14 @@ func (gm *GuildMgr) upsertGuildMember(guildId int64, member *GuildMember) {
updateKv,
insertKv,
func(err error, lastInsertId int64, rowsAffected int64) {
if err != nil {
f5.GetSysLog().Info("error:%v\n", err)
}
f5.GetSysLog().Info("lastInsertId:%d\n", lastInsertId)
f5.GetSysLog().Info("rowsAffected:%d\n", rowsAffected)
cb(err)
},
)
}
func (gm *GuildMgr) updateGuildMembers(g *Guild, fields [][]string) {
func (gm *GuildMgr) updateGuildMembers(guildId int64, fields [][]string, cb func(error)) {
where := [][]string{
{"guild_id", q5.ToString(g.GuildId)},
{"guild_id", q5.ToString(guildId)},
}
f5.GetJsStyleDb().Update(
FRIEND_DB,
@ -348,17 +342,13 @@ func (gm *GuildMgr) updateGuildMembers(g *Guild, fields [][]string) {
fields,
where,
func(err error, lastInsertId int64, rowsAffected int64) {
if err != nil {
f5.GetSysLog().Info("error:%v\n", err)
}
f5.GetSysLog().Info("lastInsertId:%d\n", lastInsertId)
f5.GetSysLog().Info("rowsAffected:%d\n", rowsAffected)
cb(err)
},
)
}
// updateGuildMember 更新成员信息
func (gm *GuildMgr) updateGuildMember(g *Guild, accountId string, fields [][]string) {
func (gm *GuildMgr) updateGuildMember(g *Guild, accountId string, fields [][]string, cb func(error)) {
where := [][]string{
{"guild_id", q5.ToString(g.GuildId)},
{"account_id", accountId},
@ -370,11 +360,7 @@ func (gm *GuildMgr) updateGuildMember(g *Guild, accountId string, fields [][]str
fields,
where,
func(err error, lastInsertId int64, rowsAffected int64) {
if err != nil {
f5.GetSysLog().Info("error:%v\n", err)
}
f5.GetSysLog().Info("lastInsertId:%d\n", lastInsertId)
f5.GetSysLog().Info("rowsAffected:%d\n", rowsAffected)
cb(err)
},
)
}

View File

@ -18,17 +18,15 @@ const (
type GuildMgr struct {
cs.MsgHandlerImpl
guilds map[int64]*Guild // 公会ID -> 公会列表
pendingReqs map[int64]*PendingReq // 公会ID -> PendingReq
guildLogs map[int64][]*GuildLog // 公会ID -> 公会日志
guildLogs map[int64][]*GuildLog // 公会ID -> []公会日志列表
loadedFlags int64
guildIds []int64 // 公会ids
}
func NewGuildMgr() *GuildMgr {
return &GuildMgr{
guilds: make(map[int64]*Guild),
pendingReqs: make(map[int64]*PendingReq),
guildLogs: make(map[int64][]*GuildLog),
guilds: make(map[int64]*Guild),
guildLogs: make(map[int64][]*GuildLog),
}
}
@ -58,146 +56,212 @@ func (gm *GuildMgr) loadFromDB() {
}
// CreateGuild 创建公会
func (gm *GuildMgr) CreateGuild(name string, leaderId string) (int64, error) {
_, err := gm.checkJoinGuild(leaderId)
if err != nil {
return 0, err
func (gm *GuildMgr) CreateGuild(name string, leaderId string,
cb func(errCode int32, errMsg string, guildId int64)) {
if !gm.checkJoinGuild(leaderId) {
cb(1, "xxx", 0)
return
}
guildId := f5.GetApp().NewUuid()
if _, exists := gm.guilds[guildId]; exists {
return 0, fmt.Errorf("CreateGuild fail")
if gm.existsGuild(guildId) {
cb(1, "xxx", 0)
return
}
guild := &Guild{
GuildId: guildId,
Name: name,
LeaderId: leaderId,
MaxMembers: MaxMembers,
fields := [][]string{
{"guild_id", q5.ToString(guildId)},
{"name", name},
{"leader_account_id", leaderId},
{"max_members", q5.ToString(MaxMembers)},
}
newMember := &GuildMember{AccountId: leaderId, Level: GuildMemberLevelLeader}
guild.Members = append(guild.Members, newMember)
gm.createGuildDB(guild)
gm.upsertGuildMember(guildId, newMember)
gm.AddGuild(guildId, guild)
return guildId, nil
f5.GetJsStyleDb().Insert(
FRIEND_DB,
"t_guild",
fields,
func(err error, id int64, affectedRows int64) {
if err != nil {
cb(1, "xxx", 0)
return
}
newMember := &GuildMember{AccountId: leaderId, Level: GuildMemberLevelLeader}
gm.upsertGuildMember(guildId, newMember,
func(err error) {
if err != nil {
cb(1, "xxx", 0)
return
}
guild := &Guild{
AutoId: id,
GuildId: guildId,
Name: name,
LeaderId: leaderId,
MaxMembers: MaxMembers,
}
guild.Members = append(guild.Members, newMember)
gm.AddGuild(guildId, guild)
})
})
}
// ApplyToGuild 申请加入公会
func (gm *GuildMgr) ApplyToGuild(guildId int64, applicantAccountId string) error {
func (gm *GuildMgr) ApplyToGuild(guildId int64, applicantAccountId string, cb func(errCode int32, errMsg string)) {
guild, err := gm.GetGuild(guildId)
if err != nil {
return err
cb(1, "xxx")
}
// 是否加入其他公会
_, err = gm.checkJoinGuild(applicantAccountId)
if err != nil {
return err
if !gm.checkJoinGuild(applicantAccountId) {
cb(1, "xxx")
}
err = guild.IsFull()
if err != nil {
return err
cb(1, "xxx")
}
// 可直接加入
if guild.JoinCond == JoinCondFree {
gm.JoinGuild(guild, applicantAccountId)
return nil
cb(0, "")
}
if guild.JoinCond == JoinCondStar {
var userStar int32 = 200
if userStar >= guild.JoinCondValue {
gm.JoinGuild(guild, applicantAccountId)
return nil
cb(0, "")
}
}
// IF exists, then replace it fields `isJoinGuild` is 0
gm.upsertPendingReqs(guildId, applicantAccountId, PendingReqIsJoinGuildStatusDefault)
pendReq, err := gm.GetPendingReq(guildId)
if err != nil {
pendReq = &PendingReq{}
where := [][]string{
{"guild_id", q5.ToString(guildId)},
{"account_id", applicantAccountId},
}
pendReq.AddUser(applicantAccountId)
insertKv := [][]string{
{"guild_id", q5.ToString(guildId)},
{"account_id", applicantAccountId},
{"is_join_guild", q5.ToString(PendingReqIsJoinGuildStatusDefault)},
}
updateKv := [][]string{
{"is_join_guild", q5.ToString(PendingReqIsJoinGuildStatusDefault)},
}
f5.GetJsStyleDb().Upsert(
FRIEND_DB,
"t_guild_pending_request",
where,
updateKv,
insertKv,
func(err error, lastInsertId int64, rowsAffected int64) {
if err != nil {
cb(0, "")
return
}
if rowsAffected <= 0 {
return
}
return nil
pendingReq := &PendingReq{
applicantAccountId,
PendingReqIsJoinGuildStatusDefault,
}
guild.AddPendingReq(pendingReq)
cb(0, "")
})
}
// Approve 同意申请者加入公会
func (gm *GuildMgr) Approve(guildId int64, operatorAccountId, accountId string) error {
guild, err := gm.GetGuild(guildId)
if err != nil {
return err
func (gm *GuildMgr) Approve(operatorAccountId, accountId string, cb func(errCode int32, errMsg string)) {
guild := gm.GetGuildByAccountId(operatorAccountId)
if guild == nil {
cb(1, "XXX")
}
// 通常默认为审核加入
if guild.JoinCond != JoinCondDefault {
return fmt.Errorf("join cond error")
cb(1, "XXX")
}
operatorMember, err := guild.GetMember(operatorAccountId)
if err != nil {
return err
operatorMember := guild.GetMember(operatorAccountId)
if operatorMember == nil {
cb(1, "XXX")
}
// 公会干部及以上仅可操作
err = gm.checkOperatorPerm(operatorMember, GuildMemberLevelViceLeader)
err := gm.checkOperatorPerm(operatorMember, GuildMemberLevelViceLeader)
if err != nil {
return err
cb(1, "XXX")
}
// 是否加入其他公会
_, err = gm.checkJoinGuild(accountId)
if err != nil {
return err
if !gm.checkJoinGuild(accountId) {
cb(1, "XXX")
}
err = guild.IsFull()
if err != nil {
return err
cb(1, "XXX")
}
guildId := guild.GuildId
// 是否在申请队列中
pendingReq, err := gm.GetPendingReq(guildId)
if err == nil {
return err
}
inReq := pendingReq.IsInReq(accountId)
if !inReq {
return fmt.Errorf("no pending applications for this guild")
pendingReqStatus := guild.GetPendingReqStatus(accountId)
if pendingReqStatus < 0 {
cb(1, "XXX")
}
newMember := &GuildMember{AccountId: accountId, Level: GuildMemberLevelDefault}
guild.AddMember(newMember)
gm.upsertGuildMember(guildId, newMember)
gm.updatePendingReqs(guildId, accountId, PendingReqIsJoinGuildStatusJoined)
logContent := fmt.Sprintf("Approve[operator:%s]", operatorAccountId)
gm.WriteLog(guildId, accountId, LogTypeApprove, logContent)
pendingReq.RemoveUser(accountId)
return nil
gm.upsertGuildMember(guildId, newMember, func(err error) {
if err != nil {
cb(1, "xxx")
return
}
gm.updatePendingReqs(guildId, accountId, PendingReqIsJoinGuildStatusJoined, func(err error) {
logContent := fmt.Sprintf("Approve[operator:%s]", operatorAccountId)
gm.WriteLog(guildId, accountId, LogTypeApprove, logContent)
guild.RemovePendingReq(accountId)
cb(0, "")
})
})
}
// Reject 拒绝申请者加入公会
func (gm *GuildMgr) Reject(guildId int64, accountId string) error {
pendingReq, err := gm.GetPendingReq(guildId)
if err == nil {
return err
func (gm *GuildMgr) Reject(operatorAccountId, accountId string, cb func(errCode int32, errMsg string)) {
guild := gm.GetGuildByAccountId(operatorAccountId)
if guild == nil {
cb(1, "XXX")
}
// 通常默认为审核加入
if guild.JoinCond != JoinCondDefault {
cb(1, "XXX")
}
operatorMember := guild.GetMember(operatorAccountId)
if operatorMember == nil {
cb(1, "XXX")
}
// 公会干部及以上仅可操作
err := gm.checkOperatorPerm(operatorMember, GuildMemberLevelViceLeader)
if err != nil {
cb(1, "XXX")
}
// 是否加入其他公会
if !gm.checkJoinGuild(accountId) {
cb(1, "XXX")
}
// 是否在申请队列中
pendingReqStatus := guild.GetPendingReqStatus(accountId)
if pendingReqStatus < 0 {
cb(1, "XXX")
}
gm.updatePendingReqs(guildId, accountId, PendingReqIsJoinGuildStatusReject)
pendingReq.RemoveUser(accountId)
return nil
gm.updatePendingReqs(guild.GuildId, accountId, PendingReqIsJoinGuildStatusReject, func(err error) {
guild.RemovePendingReq(accountId)
cb(0, "")
})
}
// JoinGuild 直接加入公会
@ -205,225 +269,210 @@ func (gm *GuildMgr) JoinGuild(guild *Guild, accountId string) {
newMember := GuildMember{AccountId: accountId, Level: GuildMemberLevelDefault}
guild.AddMember(&newMember)
guildId := guild.GuildId
gm.upsertGuildMember(guildId, &newMember)
gm.upsertGuildMember(guildId, &newMember,
func(err error) {
})
}
// LeaveGuild 离开公会
func (gm *GuildMgr) LeaveGuild(guildId int64, accountId string) error {
guild, err := gm.GetGuild(guildId)
if err != nil {
return err
func (gm *GuildMgr) LeaveGuild(accountId string, cb func(errCode int32, errMsg string)) {
guild := gm.GetGuildByAccountId(accountId)
if guild == nil {
cb(1, "XXX")
}
if guild.LeaderId == accountId {
return fmt.Errorf("leader not leave guild")
cb(1, "XXX")
}
member := guild.GetMember(accountId)
if member == nil {
cb(1, "XXX")
}
member, err := guild.GetMember(accountId)
if err != nil {
return fmt.Errorf("member not found in the guild")
}
_ = guild.RemoveMember(accountId)
guild.RemoveMember(accountId)
fields := [][]string{{"is_leave_guild", q5.ToString(1)}}
gm.updateGuildMember(guild, member.AccountId, fields)
logContent := fmt.Sprintf("LeaveGuild[%d-%s]", guildId, accountId)
gm.WriteLog(guildId, accountId, LogTypeLeave, logContent)
return nil
gm.updateGuildMember(guild, member.AccountId, fields,
func(err error) {
if err != nil {
logContent := fmt.Sprintf("LeaveGuild[%d-%s]", guild.GuildId, accountId)
gm.WriteLog(guild.GuildId, accountId, LogTypeLeave, logContent)
cb(0, "")
}
})
}
// DismissMember 开除成员 踢出
func (gm *GuildMgr) DismissMember(guildId int64, operatorAccountId, accountId string) error {
guild, err := gm.GetGuild(guildId)
if err != nil {
return err
func (gm *GuildMgr) DismissMember(operatorAccountId, accountId string, cb func(errCode int32, errMsg string)) {
guild := gm.GetGuildByAccountId(operatorAccountId)
if guild == nil {
cb(1, "XXX")
}
if accountId == guild.LeaderId {
return fmt.Errorf("cannot dismiss the leader")
if accountId == guild.LeaderId || accountId == operatorAccountId {
cb(1, "XXX")
}
if operatorAccountId == accountId {
return fmt.Errorf("cannot dismiss yourself")
}
operatorMember, err := guild.GetMember(operatorAccountId)
if err != nil {
return err
operatorMember := guild.GetMember(operatorAccountId)
if operatorMember == nil {
cb(1, "XXX")
}
// 公会干部及以上仅可操作
err = gm.checkOperatorPerm(operatorMember, GuildMemberLevelViceLeader)
err := gm.checkOperatorPerm(operatorMember, GuildMemberLevelViceLeader)
if err != nil {
return err
cb(1, "XXX")
}
dismissMember, err := guild.GetMember(accountId)
if err != nil {
return err
dismissMember := guild.GetMember(accountId)
if dismissMember == nil {
cb(1, "XXX")
}
if dismissMember.Level <= operatorMember.Level {
return fmt.Errorf("no permission")
cb(1, "XXX")
}
guild.RemoveMember(accountId)
_ = guild.RemoveMember(accountId)
fields := [][]string{{"is_leave_guild", q5.ToString(1)}}
gm.updateGuildMember(guild, dismissMember.AccountId, fields)
logContent := fmt.Sprintf("DismissMember[%d-%s-%s]", guildId, operatorAccountId, accountId)
gm.WriteLog(guildId, accountId, LogTypeDismiss, logContent)
return nil
gm.updateGuildMember(guild, dismissMember.AccountId, fields, func(err error) {
logContent := fmt.Sprintf("DismissMember[%d-%s-%s]", guild.GuildId, operatorAccountId, accountId)
gm.WriteLog(guild.GuildId, accountId, LogTypeDismiss, logContent)
cb(0, "")
})
}
// PromoteMember 提升成员为干部
func (gm *GuildMgr) PromoteMember(guildId int64, operatorAccountId, accountId string) error {
guild, err := gm.GetGuild(guildId)
if err != nil {
return err
func (gm *GuildMgr) PromoteMember(operatorAccountId, accountId string, cb func(errCode int32, errMsg string)) {
guild := gm.GetGuildByAccountId(operatorAccountId)
if guild == nil {
cb(1, "XXX")
}
if accountId == guild.LeaderId {
return fmt.Errorf("cannot promote the leader")
if accountId == guild.LeaderId || accountId == operatorAccountId {
cb(1, "XXX")
}
// 仅会长操作
operatorMember, err := guild.GetMember(operatorAccountId)
if err != nil {
return err
}
err = gm.checkOperatorPerm(operatorMember, GuildMemberLevelLeader)
if err != nil {
return err
operatorMember := guild.GetMember(operatorAccountId)
if operatorMember == nil {
cb(1, "XXX")
}
if operatorAccountId != guild.LeaderId {
return fmt.Errorf("PromoteMember: No, leader")
cb(1, "XXX")
}
member, err := guild.GetMember(accountId)
if err != nil {
return fmt.Errorf("member not found in the guild")
member := guild.GetMember(accountId)
if member == nil {
cb(1, "XXX")
}
if member.Level == GuildMemberLevelViceLeader {
return nil
cb(1, "XXX")
}
member.Level = GuildMemberLevelViceLeader
fields := [][]string{{"level", q5.ToString(GuildMemberLevelViceLeader)}}
gm.updateGuildMember(guild, member.AccountId, fields)
logContent := fmt.Sprintf("PromoteMember[%d-%s-%s]", guildId, operatorAccountId, accountId)
gm.WriteLog(guildId, accountId, LogTypePromote, logContent)
return nil
gm.updateGuildMember(guild, member.AccountId, fields, func(err error) {
logContent := fmt.Sprintf("PromoteMember[%d-%s-%s]", guild.GuildId, operatorAccountId, accountId)
gm.WriteLog(guild.GuildId, accountId, LogTypeDismiss, logContent)
cb(0, "")
})
}
// DemoteMember 解除成员干部身份
func (gm *GuildMgr) DemoteMember(guildId int64, operatorAccountId, accountId string) error {
guild, err := gm.GetGuild(guildId)
if err != nil {
return err
func (gm *GuildMgr) DemoteMember(operatorAccountId, accountId string, cb func(errCode int32, errMsg string)) {
guild := gm.GetGuildByAccountId(operatorAccountId)
if guild == nil {
cb(1, "XXX")
}
if accountId == guild.LeaderId {
return fmt.Errorf("cannot demote the leader")
}
// 仅会长操作
operatorMember, err := guild.GetMember(operatorAccountId)
if err != nil {
return err
}
err = gm.checkOperatorPerm(operatorMember, GuildMemberLevelLeader)
if err != nil {
return err
if accountId == guild.LeaderId || accountId == operatorAccountId {
cb(1, "XXX")
}
// 仅会长可操作
if operatorAccountId != guild.LeaderId {
return fmt.Errorf("PromoteMember: No, leader")
cb(1, "XXX")
}
member, err := guild.GetMember(accountId)
if err != nil {
return fmt.Errorf("member not found in the guild")
member := guild.GetMember(accountId)
if member == nil {
cb(1, "XXX")
}
if member.Level == GuildMemberLevelDefault {
return nil
cb(1, "XXX")
}
member.Level = GuildMemberLevelDefault
fields := [][]string{{"level", q5.ToString(GuildMemberLevelDefault)}}
gm.updateGuildMember(guild, member.AccountId, fields)
logContent := fmt.Sprintf("DemoteMember[%d-%s-%s]", guildId, operatorAccountId, accountId)
gm.WriteLog(guildId, accountId, LogTypeDemote, logContent)
return nil
gm.updateGuildMember(guild, member.AccountId, fields, func(err error) {
logContent := fmt.Sprintf("DemoteMember[%d-%s-%s]", guild.GuildId, operatorAccountId, accountId)
gm.WriteLog(guild.GuildId, accountId, LogTypeDismiss, logContent)
cb(0, "")
})
}
// Disband 解散公会
func (gm *GuildMgr) Disband(guildId int64, accountId string) error {
guild, err := gm.GetGuild(guildId)
if err != nil {
return err
func (gm *GuildMgr) Disband(operatorAccountId string, cb func(errCode int32, errMsg string)) {
guild := gm.GetGuildByAccountId(operatorAccountId)
if guild == nil {
cb(1, "XXX")
}
// 仅会长可操作
if accountId != guild.LeaderId {
return fmt.Errorf("cannot disband guild")
if operatorAccountId != guild.LeaderId {
cb(1, "XXX")
}
guildId := guild.GuildId
guildName := guild.Name
// 解散公会
updateFields := [][]string{
{"is_deleted", q5.ToString(1)},
}
gm.updateGuild(guild, updateFields)
gm.updateGuild(guild, updateFields, func(err error) {
fields := [][]string{{"is_leave_guild", q5.ToString(1)}}
gm.updateGuildMembers(guildId, fields, func(err error) {
gm.updateAllPendingReqs(guildId, PendingReqIsJoinGuildStatusDisband, func(err error) {
logContent := fmt.Sprintf("GuildDisbanded[%d-%s]", guildId, guildName)
gm.WriteLog(guildId, operatorAccountId, LogTypeDisband, logContent)
fields := [][]string{{"is_leave_guild", q5.ToString(1)}}
gm.updateGuildMembers(guild, fields)
guild.Members = nil
gm.guilds[guildId] = nil
gm.guildLogs[guildId] = nil
gm.updateAllPendingReqs(guildId, PendingReqIsJoinGuildStatusDisband)
delete(gm.guilds, guildId)
delete(gm.guildLogs, guildId)
gm.RemoveGuild(guildId)
})
})
})
guild.Members = nil
gm.guilds[guildId] = nil
gm.pendingReqs[guildId] = nil
gm.guildLogs[guildId] = nil
delete(gm.guilds, guildId)
delete(gm.pendingReqs, guildId)
delete(gm.guildLogs, guildId)
gm.RemoveGuildsId(guildId)
logContent := fmt.Sprintf("GuildDisbanded[%d-%s]", guildId, guildName)
gm.WriteLog(guildId, accountId, LogTypeDisband, logContent)
return nil
}
// SetNotice 设置公告
func (gm *GuildMgr) SetNotice(guildId int64, accountId string, notice *string) error {
guild, err := gm.GetGuild(guildId)
if err != nil {
return err
func (gm *GuildMgr) SetNotice(operatorAccountId string, notice *string, cb func(errCode int32, errMsg string)) {
guild := gm.GetGuildByAccountId(operatorAccountId)
if guild == nil {
cb(1, "XXX")
}
// 仅会长可操作
if accountId != guild.LeaderId {
return fmt.Errorf("cannot set guild notices, only leader")
if operatorAccountId != guild.LeaderId {
cb(1, "XXX")
}
guild.SetNotice(notice)
updateFields := [][]string{
{"notice", *notice},
}
gm.updateGuild(guild, updateFields)
return nil
gm.updateGuild(guild, updateFields, func(err error) {
if err == nil {
cb(0, "")
}
cb(1, err.Error())
})
}
// WriteLog 记录公会日志
@ -485,6 +534,11 @@ func (gm *GuildMgr) RandomGuilds() []*Guild {
return results
}
func (gm *GuildMgr) existsGuild(guildId int64) bool {
_, ok := gm.guilds[guildId]
return ok
}
func (gm *GuildMgr) AddGuild(guildId int64, guild *Guild) {
if _, exists := gm.guilds[guildId]; !exists {
gm.guilds[guildId] = guild
@ -499,13 +553,6 @@ func (gm *GuildMgr) GetGuild(guildId int64) (*Guild, error) {
return nil, fmt.Errorf("guild not found")
}
func (gm *GuildMgr) GetPendingReq(guildId int64) (*PendingReq, error) {
if pendingReq, exists := gm.pendingReqs[guildId]; exists {
return pendingReq, nil
}
return nil, fmt.Errorf("pendingReq not found, guildId:%d", guildId)
}
// GetGuildByAccountId 查询我的工会
func (gm *GuildMgr) GetGuildByAccountId(accountId string) *Guild {
for _, guild := range gm.guilds {
@ -518,25 +565,6 @@ func (gm *GuildMgr) GetGuildByAccountId(accountId string) *Guild {
return nil
}
// Info 工会信息
func (gm *GuildMgr) Info(accountId string) (*Guild, map[string]bool, []*GuildLog) {
guild := gm.GetGuildByAccountId(accountId)
pendingReqs := make(map[string]bool, MaxPendingReqs)
guildLogs := make([]*GuildLog, DefaultLogs)
if guild != nil {
guildId := guild.GuildId
if p, exists := gm.pendingReqs[guildId]; exists {
pendingReqs = p.GetUsers()
} else {
pendingReqs = nil
}
guildLogs = gm.guildLogs[guildId]
}
return guild, pendingReqs, guildLogs
}
func (gm *GuildMgr) checkOperatorPerm(operatorMember *GuildMember, level int) error {
if operatorMember.Level > level {
return fmt.Errorf("checkOperatorPerm: no permission[%s-%d]", operatorMember.AccountId, operatorMember.Level)
@ -544,13 +572,8 @@ func (gm *GuildMgr) checkOperatorPerm(operatorMember *GuildMember, level int) er
return nil
}
func (gm *GuildMgr) checkJoinGuild(accountId string) (bool, error) {
guild := gm.GetGuildByAccountId(accountId)
if guild != nil {
errMsg := fmt.Sprintf("Player:%s has joined other GuildId:%d", accountId, guild.GuildId)
return true, fmt.Errorf(errMsg)
}
return false, nil
func (gm *GuildMgr) checkJoinGuild(accountId string) bool {
return gm.GetGuildByAccountId(accountId) == nil
}
func (gm *GuildMgr) GetGuildIdByAccountId(accountId string) int64 {
@ -568,7 +591,7 @@ func (gm *GuildMgr) loadGuildIds() {
}
}
func (gm *GuildMgr) RemoveGuildsId(guildId int64) {
func (gm *GuildMgr) RemoveGuild(guildId int64) {
guildIndex := -1
for i, gId := range gm.guildIds {
if gId == guildId {
@ -583,13 +606,6 @@ func (gm *GuildMgr) RemoveGuildsId(guildId int64) {
gm.guildIds = gm.guildIds[:len(gm.guildIds)-1]
}
func (gm *GuildMgr) GetAllPendingReqs(guildId int64) map[string]bool {
if pendingReq, exists := gm.pendingReqs[guildId]; exists {
return pendingReq.GetUsers()
}
return nil
}
func (gm *GuildMgr) GetGuildLogs(guildId int64) []*GuildLog {
if logs, exists := gm.guildLogs[guildId]; exists {
return logs

View File

@ -319,167 +319,169 @@ func (p *Player) CMGuildInfo(hdr *f5.MsgHdr, msg *cs.CMGuildInfo) {
// CMCreateGuild 创建公会
func (p *Player) CMCreateGuild(hdr *f5.MsgHdr, msg *cs.CMCreateGuild) {
rspMsg := new(cs.SMCreateGuild)
guildId, err := guildMgr.CreateGuild(*msg.Name, p.accountId)
if err != nil {
errMsg := err.Error()
rspMsg.ErrMsg = &errMsg
f5.GetSysLog().Info("CMCreateGuild err:%s\n", errMsg)
} else {
rspMsg.GuildId = &guildId
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
guildMgr.CreateGuild(*msg.Name, p.accountId,
func(errCode int32, errMsg string, guildId int64) {
rspMsg := new(cs.SMCreateGuild)
if errCode != 0 {
rspMsg.ErrCode = &errCode
rspMsg.ErrMsg = &errMsg
} else {
rspMsg.GuildId = &guildId
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
})
}
// CMApplyToGuild 申请者加入公会
func (p *Player) CMApplyToGuild(hdr *f5.MsgHdr, msg *cs.CMApplyToGuild) {
rspMsg := new(cs.SMApplyToGuild)
err := guildMgr.ApplyToGuild(
msg.GetGuildId(),
p.accountId,
guildMgr.ApplyToGuild(
msg.GetGuildId(), p.accountId,
func(errCode int32, errMsg string) {
rspMsg := new(cs.SMApplyToGuild)
if errCode != 0 {
rspMsg.ErrCode = &errCode
rspMsg.ErrMsg = &errMsg
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
},
)
if err != nil {
errMsg := err.Error()
rspMsg.ErrMsg = &errMsg
f5.GetSysLog().Info("CMApplyToGuild err:%s\n", errMsg)
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
}
// CMApplyList 请求申请者列表
func (p *Player) CMApplyList(hdr *f5.MsgHdr, msg *cs.CMApplyList) {
rspMsg := new(cs.SMApplyList)
guild := guildMgr.GetGuildByAccountId(p.accountId)
if guild == nil {
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
return
}
for accountId, isPending := range guildMgr.GetAllPendingReqs(guild.GetGuildId()) {
if isPending {
rspMsg.AccountId = append(rspMsg.AccountId, accountId)
if guild != nil {
for accountId, status := range guild.PendingReqs {
applyInfo := &cs.MFApplyInfo{
AccountId: &accountId,
Status: &status,
}
rspMsg.ApplyInfo = append(rspMsg.ApplyInfo, applyInfo)
}
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
}
// CMApprove 同意申请者加入公会
func (p *Player) CMApprove(hdr *f5.MsgHdr, msg *cs.CMApprove) {
rspMsg := new(cs.SMApprove)
applicantAccountId := msg.GetApplicantAccountId()
err := guildMgr.Approve(
msg.GetGuildId(),
p.accountId,
applicantAccountId,
guildMgr.Approve(
p.accountId, msg.GetApplicantAccountId(),
func(errCode int32, errMsg string) {
rspMsg := new(cs.SMApprove)
if errCode != 0 {
rspMsg.ErrCode = &errCode
rspMsg.ErrMsg = &errMsg
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
},
)
if err != nil {
errMsg := err.Error()
rspMsg.ErrMsg = &errMsg
f5.GetSysLog().Info("CMApprove err:%s\n", errMsg)
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
}
// CMReject 拒绝申请者加入公会
func (p *Player) CMReject(hdr *f5.MsgHdr, msg *cs.CMReject) {
rspMsg := new(cs.SMReject)
applicantAccountId := msg.GetApplicantAccountId()
err := guildMgr.Reject(
msg.GetGuildId(),
applicantAccountId,
guildMgr.Reject(
p.accountId, msg.GetApplicantAccountId(),
func(errCode int32, errMsg string) {
rspMsg := new(cs.SMReject)
if errCode != 0 {
rspMsg.ErrCode = &errCode
rspMsg.ErrMsg = &errMsg
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
},
)
if err != nil {
errMsg := err.Error()
rspMsg.ErrMsg = &errMsg
f5.GetSysLog().Info("CMReject err:%s\n", errMsg)
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
}
// CMLeaveGuild 离开公会
func (p *Player) CMLeaveGuild(hdr *f5.MsgHdr, msg *cs.CMLeaveGuild) {
rspMsg := new(cs.SMLeaveGuild)
guildId := msg.GetGuildId()
err := guildMgr.LeaveGuild(
guildId,
guildMgr.LeaveGuild(
p.accountId,
func(errCode int32, errMsg string) {
rspMsg := new(cs.SMLeaveGuild)
if errCode != 0 {
rspMsg.ErrCode = &errCode
rspMsg.ErrMsg = &errMsg
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
},
)
if err != nil {
errMsg := err.Error()
rspMsg.ErrMsg = &errMsg
f5.GetSysLog().Info("CMLeaveGuild err:%s\n", errMsg)
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
}
// CMDismissMember 开除成员
func (p *Player) CMDismissMember(hdr *f5.MsgHdr, msg *cs.CMDismissMember) {
rspMsg := new(cs.SMDismissMember)
err := guildMgr.DismissMember(
msg.GetGuildId(),
guildMgr.DismissMember(
p.accountId,
msg.GetDismissAccountId(),
func(errCode int32, errMsg string) {
rspMsg := new(cs.SMDismissMember)
if errCode != 0 {
rspMsg.ErrCode = &errCode
rspMsg.ErrMsg = &errMsg
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
},
)
if err != nil {
errMsg := err.Error()
rspMsg.ErrMsg = &errMsg
f5.GetSysLog().Info("CMDismissMember err:%s\n", errMsg)
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
}
// CMPromoteMember 提升成员为干部
func (p *Player) CMPromoteMember(hdr *f5.MsgHdr, msg *cs.CMPromoteMember) {
rspMsg := new(cs.SMPromoteMember)
err := guildMgr.PromoteMember(
msg.GetGuildId(),
guildMgr.PromoteMember(
p.accountId,
msg.GetPromoteAccountId(),
)
if err != nil {
errMsg := err.Error()
rspMsg.ErrMsg = &errMsg
f5.GetSysLog().Info("CMPromoteMember err:%s\n", errMsg)
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
func(errCode int32, errMsg string) {
rspMsg := new(cs.SMPromoteMember)
if errCode != 0 {
rspMsg.ErrCode = &errCode
rspMsg.ErrMsg = &errMsg
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
})
}
// CMDemoteMember 解除成员干部身份
func (p *Player) CMDemoteMember(hdr *f5.MsgHdr, msg *cs.CMDemoteMember) {
rspMsg := new(cs.SMDemoteMember)
err := guildMgr.DemoteMember(
msg.GetGuildId(),
guildMgr.DemoteMember(
p.accountId,
msg.GetDemoteAccountId(),
)
if err != nil {
errMsg := err.Error()
rspMsg.ErrMsg = &errMsg
f5.GetSysLog().Info("CMDemoteMember err:%s\n", errMsg)
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
func(errCode int32, errMsg string) {
rspMsg := new(cs.SMDemoteMember)
if errCode != 0 {
rspMsg.ErrCode = &errCode
rspMsg.ErrMsg = &errMsg
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
})
}
// CMDisband 解散公会
func (p *Player) CMDisband(hdr *f5.MsgHdr, msg *cs.CMDisband) {
rspMsg := new(cs.SMDisband)
err := guildMgr.Disband(
msg.GetGuildId(),
guildMgr.Disband(
p.accountId,
)
if err != nil {
errMsg := err.Error()
rspMsg.ErrMsg = &errMsg
f5.GetSysLog().Info("CMDisband err:%s\n", errMsg)
}
func(errCode int32, errMsg string) {
rspMsg := new(cs.SMDisband)
if errCode != 0 {
rspMsg.ErrCode = &errCode
rspMsg.ErrMsg = &errMsg
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
})
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
// CMSetNotice 设置公告
func (p *Player) CMSetNotice(hdr *f5.MsgHdr, msg *cs.CMNotice) {
guildMgr.SetNotice(
p.accountId,
msg.Content,
func(errCode int32, errMsg string) {
rspMsg := new(cs.SMNotice)
if errCode != 0 {
rspMsg.ErrCode = &errCode
rspMsg.ErrMsg = &errMsg
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
})
}
// CMSearchGuilds 搜索公会
@ -510,22 +512,6 @@ func (p *Player) CMGuildLogs(hdr *f5.MsgHdr, msg *cs.CMGuildLogs) {
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
}
// CMSetNotice 设置公告
func (p *Player) CMSetNotice(hdr *f5.MsgHdr, msg *cs.CMNotice) {
rspMsg := new(cs.SMNotice)
err := guildMgr.SetNotice(
msg.GetGuildId(),
p.accountId,
msg.Content,
)
if err != nil {
errMsg := err.Error()
rspMsg.ErrMsg = &errMsg
f5.GetSysLog().Info("CMSetNotice err:%s\n", errMsg)
}
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
}
// FillGuild 填充公共列表
func (p *Player) FillGuild(guilds []*Guild) []*cs.MFGuild {
var resGuilds []*cs.MFGuild

View File

@ -361,8 +361,9 @@ message CMCreateGuild
//
message SMCreateGuild
{
optional int64 guild_id = 1;
optional int32 err_code = 1;
optional string err_msg = 2;
optional int64 guild_id = 3;
}
//
@ -374,7 +375,8 @@ message CMApplyToGuild
//
message SMApplyToGuild
{
optional string err_msg = 1;
optional int32 err_code = 1;
optional string err_msg = 2;
}
//
@ -383,96 +385,102 @@ message CMApplyList{}
//
message SMApplyList
{
repeated string account_id = 1;
optional string err_code = 1;
optional string err_msg = 2;
repeated MFApplyInfo apply_info = 3;
}
message MFApplyInfo {
optional string account_id = 2;
optional int32 status = 3;
}
//
message CMApprove
{
optional int64 guild_id = 1;
optional string applicant_account_id = 2;
optional string applicant_account_id = 1;
}
//
message SMApprove
{
optional string err_msg = 1;
optional int32 err_code = 1;
optional string err_msg = 2;
}
//
message CMReject
{
optional int64 guild_id = 1;
optional string applicant_account_id = 2;
optional string applicant_account_id = 1;
}
//
message SMReject
{
optional string err_msg = 1;
optional int32 err_code = 1;
optional string err_msg = 2;
}
//
message CMLeaveGuild
{
optional int64 guild_id = 1;
}
message CMLeaveGuild{}
//
message SMLeaveGuild
{
optional string err_msg = 1;
optional int32 err_code = 1;
optional string err_msg = 2;
}
//
message CMDismissMember
{
optional int64 guild_id = 1;
optional string dismissAccountId = 2;
optional string dismissAccountId = 1;
}
//
message SMDismissMember
{
optional string err_msg = 1;
optional int32 err_code = 1;
optional string err_msg = 2;
}
//
message CMPromoteMember
{
optional int64 guild_id = 1;
optional string promoteAccountId = 2;
optional string promoteAccountId = 1;
}
//
message SMPromoteMember
{
optional string err_msg = 1;
optional int32 err_code = 1;
optional string err_msg = 2;
}
//
message CMDemoteMember
{
optional int64 guild_id = 1;
optional string demoteAccountId = 2;
optional string demoteAccountId = 1;
}
//
message SMDemoteMember
{
optional string err_msg = 1;
optional int32 err_code = 1;
optional string err_msg = 2;
}
//
message CMDisband
{
optional int64 guild_id = 1;
}
//
message SMDisband
{
optional string err_msg = 1;
optional int32 err_code = 1;
optional string err_msg = 2;
}
//
@ -484,7 +492,9 @@ message CMSearchGuilds
//
message SMSearchGuilds
{
repeated MFGuild guilds = 1;
optional int32 err_code = 1;
optional string err_msg = 2;
repeated MFGuild guilds = 3;
}
message MFGuild {
optional int64 auto_id = 1;
@ -502,7 +512,9 @@ message CMGuildLogs{}
//
message SMGuildLogs
{
repeated MFGuildLog guildLogs = 1;
optional int32 err_code = 1;
optional string err_msg = 2;
repeated MFGuildLog guildLogs = 3;
}
message MFGuildLog {
@ -516,13 +528,13 @@ message MFGuildLog {
//
message CMNotice
{
optional int64 guild_id = 1;
optional string content = 2;
optional string content = 1;
}
//
message SMNotice
{
optional string err_msg = 1;
optional int32 err_code = 1;
optional string err_msg = 2;
}