From fae06002f725fdb1d1d0390a69d9aae08ca9f65d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B7=E5=8B=87?= Date: Thu, 31 Aug 2023 17:15:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=85=AC=E4=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/frienddb.sql | 11 +++- server/imserver/chatmgr.go | 4 +- server/imserver/constant.go | 3 +- server/imserver/cs/cs_proto.pb.go | 81 +++++++++++++++++----------- server/imserver/guild.go | 31 ++++++++--- server/imserver/guilddbmgr.go | 52 ++++++++++-------- server/imserver/guildmgr.go | 63 ++++++++++++++-------- server/imserver/player.go | 5 ++ server/imserver/proto/cs_proto.proto | 12 +++-- 9 files changed, 171 insertions(+), 91 deletions(-) diff --git a/database/frienddb.sql b/database/frienddb.sql index fc61083d..9e2acdb9 100644 --- a/database/frienddb.sql +++ b/database/frienddb.sql @@ -54,15 +54,22 @@ CREATE TABLE `t_guild` ( `guild_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '公会id', `name` varchar(48) NOT NULL, `leader_account_id` varchar(60) NOT NULL, +`avatar` int(11) DEFAULT '0' COMMENT '公会头像', +`notice` mediumtext DEFAULT '', +`join_cond` tinyint(4) DEFAULT '0' COMMENT '公会加入类型 0 需要审批, 1 自由加入, 2 成员星星数条件', +`join_cond_value` int(11) DEFAULT '0' COMMENT '星星数条件值', +`total_stars` int(11) DEFAULT '0', +`total_kills` int(11) DEFAULT '0', +`chicken_dinners` int(11) DEFAULT '0', `max_members` int(11) DEFAULT '0', `is_deleted` tinyint(4) DEFAULT '0' COMMENT '是否已解散公会 0 正常, 1 已解散', `createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间', `modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间', PRIMARY KEY (`idx`), UNIQUE KEY `idx_guild_id` (`guild_id`), -KEY `idx_guild_name` (name), +UNIQUE KEY `idx_guild_name` (name), KEY `idx_guild_leader` (leader_account_id) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='公会表'; +) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='公会表'; drop table if exists `t_guild_members`; CREATE TABLE `t_guild_members` ( diff --git a/server/imserver/chatmgr.go b/server/imserver/chatmgr.go index 4f711aa6..21a0afc1 100644 --- a/server/imserver/chatmgr.go +++ b/server/imserver/chatmgr.go @@ -11,7 +11,7 @@ type ChatMgr struct { fm *FriendsMgr gm *GuildMgr - worldMsgRec ChatMsgRec + worldMsgRec *ChatMsgRec guildMsgRec map[int64]*ChatMsgRec privateChatUsers map[string]*ChatUserRec @@ -25,7 +25,7 @@ func NewChatMgr(pm *PlayerMgr, fm *FriendsMgr, gm *GuildMgr) *ChatMgr { pm: pm, fm: fm, gm: gm, - worldMsgRec: ChatMsgRec{}, + worldMsgRec: &ChatMsgRec{}, guildMsgRec: make(map[int64]*ChatMsgRec), privateChatUsers: make(map[string]*ChatUserRec), } diff --git a/server/imserver/constant.go b/server/imserver/constant.go index d37db24d..90cc0d10 100644 --- a/server/imserver/constant.go +++ b/server/imserver/constant.go @@ -56,7 +56,8 @@ const ( LogTypeDemote = 5 LogTypeDisband = 6 GuildMemberLevelLeader = 1 // 成员等级, 会长 - GuildMemberLevelCadre = 2 // 成员等级, 干部 + GuildMemberLevelViceLeader = 2 // 成员等级, 副会长 + GuildMemberLevelElite = 3 // 成员等级, 精英 GuildMemberLevelDefault = 3 // 成员等级, 普通成员 PendingReqIsJoinGuildStatusDefault = 0 // 等待验证请求状态, 0 等待审核 PendingReqIsJoinGuildStatusJoined = 1 // 等待验证请求状态, 1 已加入 diff --git a/server/imserver/cs/cs_proto.pb.go b/server/imserver/cs/cs_proto.pb.go index 1e5b0f31..edf329ce 100644 --- a/server/imserver/cs/cs_proto.pb.go +++ b/server/imserver/cs/cs_proto.pb.go @@ -3670,11 +3670,13 @@ type MFGuild struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - GuildId *int64 `protobuf:"varint,1,opt,name=guild_id,json=guildId" json:"guild_id,omitempty"` - Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` - LeaderId *string `protobuf:"bytes,3,opt,name=leader_id,json=leaderId" json:"leader_id,omitempty"` - Members *int32 `protobuf:"varint,4,opt,name=members" json:"members,omitempty"` - MaxMembers *int32 `protobuf:"varint,5,opt,name=max_members,json=maxMembers" json:"max_members,omitempty"` + AutoId *int64 `protobuf:"varint,1,opt,name=auto_id,json=autoId" json:"auto_id,omitempty"` + GuildId *int64 `protobuf:"varint,2,opt,name=guild_id,json=guildId" json:"guild_id,omitempty"` + Name *string `protobuf:"bytes,3,opt,name=name" json:"name,omitempty"` + LeaderId *string `protobuf:"bytes,4,opt,name=leader_id,json=leaderId" json:"leader_id,omitempty"` + Members *int32 `protobuf:"varint,5,opt,name=members" json:"members,omitempty"` + MaxMembers *int32 `protobuf:"varint,6,opt,name=max_members,json=maxMembers" json:"max_members,omitempty"` + Notice *string `protobuf:"bytes,7,opt,name=notice" json:"notice,omitempty"` } func (x *MFGuild) Reset() { @@ -3709,6 +3711,13 @@ func (*MFGuild) Descriptor() ([]byte, []int) { return file_cs_proto_proto_rawDescGZIP(), []int{68} } +func (x *MFGuild) GetAutoId() int64 { + if x != nil && x.AutoId != nil { + return *x.AutoId + } + return 0 +} + func (x *MFGuild) GetGuildId() int64 { if x != nil && x.GuildId != nil { return *x.GuildId @@ -3744,6 +3753,13 @@ func (x *MFGuild) GetMaxMembers() int32 { return 0 } +func (x *MFGuild) GetNotice() string { + if x != nil && x.Notice != nil { + return *x.Notice + } + return "" +} + // 请求公会日志 type CMGuildLogs struct { state protoimpl.MessageState @@ -4199,32 +4215,35 @@ var file_cs_proto_proto_rawDesc = []byte{ 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x35, 0x0a, 0x0e, 0x53, 0x4d, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x06, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x63, 0x73, 0x2e, 0x4d, - 0x46, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x06, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x22, 0x90, - 0x01, 0x0a, 0x07, 0x4d, 0x46, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, - 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x75, - 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x22, 0x0d, 0x0a, 0x0b, 0x43, 0x4d, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x73, - 0x22, 0x3b, 0x0a, 0x0b, 0x53, 0x4d, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x73, 0x12, - 0x2c, 0x0a, 0x09, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x73, 0x2e, 0x4d, 0x46, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4c, - 0x6f, 0x67, 0x52, 0x09, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x7b, 0x0a, - 0x0a, 0x4d, 0x46, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x67, - 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, - 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2a, 0x22, 0x0a, 0x0a, 0x43, 0x6f, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x65, 0x12, 0x14, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0xd1, 0xa2, 0xd5, 0xc4, 0x07, 0x42, 0x06, - 0x5a, 0x04, 0x2e, 0x3b, 0x63, 0x73, + 0x46, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x06, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x22, 0xc1, + 0x01, 0x0a, 0x07, 0x4d, 0x46, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x75, + 0x74, 0x6f, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x75, 0x74, + 0x6f, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, + 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, + 0x74, 0x69, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x74, 0x69, + 0x63, 0x65, 0x22, 0x0d, 0x0a, 0x0b, 0x43, 0x4d, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, + 0x73, 0x22, 0x3b, 0x0a, 0x0b, 0x53, 0x4d, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x73, + 0x12, 0x2c, 0x0a, 0x09, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x73, 0x2e, 0x4d, 0x46, 0x47, 0x75, 0x69, 0x6c, 0x64, + 0x4c, 0x6f, 0x67, 0x52, 0x09, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x7b, + 0x0a, 0x0a, 0x4d, 0x46, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x6f, 0x67, 0x12, 0x19, 0x0a, 0x08, + 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, + 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2a, 0x22, 0x0a, 0x0a, 0x43, + 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x65, 0x12, 0x14, 0x0a, 0x0c, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0xd1, 0xa2, 0xd5, 0xc4, 0x07, 0x42, + 0x06, 0x5a, 0x04, 0x2e, 0x3b, 0x63, 0x73, } var ( diff --git a/server/imserver/guild.go b/server/imserver/guild.go index 7f8154c1..466fce57 100644 --- a/server/imserver/guild.go +++ b/server/imserver/guild.go @@ -4,18 +4,25 @@ import ( "fmt" ) -// GuildMember 公会成员 type GuildMember struct { AccountId string - Level int // 1: 会长, 2: 干部, 3: 成员 + Level int // 1: 会长, 2: 副会长, 3: 精英, 4 成员 } type Guild struct { - GuildId int64 - Name string - LeaderId string - Members []*GuildMember - MaxMembers int + AutoId int64 // 公会自增id + GuildId int64 // 公会id + Name string // 公会名称 + LeaderId string // 公会leader + Avatar int32 // 头像 + Notice string // 公告 + JoinCond int32 // 公会加入条件 + JoinCondValue int32 // 公会加入条件值 + TotalStars int32 // 总星星数量 + TotalKills int32 // 单局总击杀数 + ChickenDinners int32 // 单局第一名数 + MaxMembers int32 // 公会最大成员数 default 30 + Members []*GuildMember } // GuildLog 公会日志 @@ -58,7 +65,7 @@ func (g *Guild) IsMember(accountId string) bool { // IsFull 成员是否已满 func (g *Guild) IsFull() bool { - return len(g.Members) >= g.MaxMembers + return int32(len(g.Members)) >= g.MaxMembers } // AddMember 添加成员 @@ -88,3 +95,11 @@ func (g *Guild) RemoveMember(accountId string) error { return nil } + +func (g *Guild) SetNotice(notice *string) { + g.Notice = *notice +} + +func (g *Guild) GetNotice() string { + return g.Notice +} diff --git a/server/imserver/guilddbmgr.go b/server/imserver/guilddbmgr.go index 16c5d009..9f62b7c1 100644 --- a/server/imserver/guilddbmgr.go +++ b/server/imserver/guilddbmgr.go @@ -7,7 +7,20 @@ import ( // loadGuildFromDB 加载公会 func (gm *GuildMgr) loadGuildFromDB() { - fields := []string{"guild_id", "name", "leader_account_id", "max_members"} + fields := []string{ + "idx", + "guild_id", + "name", + "leader_account_id", + "avatar", + "notice", + "join_cond", + "join_cond_value", + "total_stars", + "total_kills", + "chicken_dinners", + "max_members", + } where := [][]string{ {"is_deleted", "0"}, } @@ -25,25 +38,22 @@ func (gm *GuildMgr) loadGuildFromDBResult(err error, rows *f5.DataSet) { return } for rows.Next() { - var ( - guildId int64 - name string - leaderAccountId string - maxMembers int - ) - guildId = q5.ToInt64(*rows.GetByIndex(0)) - name = q5.ToString(*rows.GetByIndex(1)) - leaderAccountId = q5.ToString(*rows.GetByIndex(2)) - maxMembers = int(q5.ToInt32(*rows.GetByIndex(3))) - - newGuild := &Guild{ - GuildId: guildId, - Name: name, - LeaderId: leaderAccountId, - MaxMembers: maxMembers, + guildId := q5.ToInt64(*rows.GetByIndex(1)) + // put to gm.guilds + gm.guilds[guildId] = &Guild{ + AutoId: q5.ToInt64(*rows.GetByIndex(0)), + GuildId: q5.ToInt64(*rows.GetByIndex(1)), + Name: q5.ToString(*rows.GetByIndex(2)), + LeaderId: q5.ToString(*rows.GetByIndex(3)), + Avatar: q5.ToInt32(*rows.GetByIndex(4)), + Notice: q5.ToString(*rows.GetByIndex(5)), + JoinCond: q5.ToInt32(*rows.GetByIndex(6)), + JoinCondValue: q5.ToInt32(*rows.GetByIndex(7)), + TotalStars: q5.ToInt32(*rows.GetByIndex(8)), + TotalKills: q5.ToInt32(*rows.GetByIndex(9)), + ChickenDinners: q5.ToInt32(*rows.GetByIndex(10)), + MaxMembers: q5.ToInt32(*rows.GetByIndex(11)), } - // push to gm.guilds - gm.guilds[guildId] = newGuild // init pendingReqs gm.pendingReqs[guildId] = make(map[string]bool) } @@ -187,8 +197,8 @@ func (gm *GuildMgr) createGuildDB(g *Guild) { "t_guild", fields, func(err error, lastInsertId int64, rowsAffected int64) { - if err != nil { - f5.GetSysLog().Info("error:%v\n", err) + if err != nil || rowsAffected != 1 { + f5.GetSysLog().Info("createGuildDB:%v\n", err) } f5.GetSysLog().Info("lastInsertId:%d\n", lastInsertId) f5.GetSysLog().Info("rowsAffected:%d\n", rowsAffected) diff --git a/server/imserver/guildmgr.go b/server/imserver/guildmgr.go index 7c590c35..9e9f4dcf 100644 --- a/server/imserver/guildmgr.go +++ b/server/imserver/guildmgr.go @@ -131,7 +131,7 @@ func (gm *GuildMgr) Approve(guildId int64, operatorAccountId, accountId string) } // 公会干部及以上仅可操作 - err = gm.checkOperatorPerm(operatorMember, GuildMemberLevelCadre) + err = gm.checkOperatorPerm(operatorMember, GuildMemberLevelViceLeader) if err != nil { return err } @@ -184,7 +184,7 @@ func (gm *GuildMgr) JoinGuild(guildId int64, accountId string) error { return fmt.Errorf("guild not found") } - if len(guild.Members) >= guild.MaxMembers { + if guild.IsFull() { return fmt.Errorf("guild is full") } @@ -248,7 +248,7 @@ func (gm *GuildMgr) DismissMember(guildId int64, operatorAccountId, accountId st } // 公会干部及以上仅可操作 - err = gm.checkOperatorPerm(operatorMember, GuildMemberLevelCadre) + err = gm.checkOperatorPerm(operatorMember, GuildMemberLevelViceLeader) if err != nil { return err } @@ -302,12 +302,12 @@ func (gm *GuildMgr) PromoteMember(guildId int64, operatorAccountId, accountId st return fmt.Errorf("member not found in the guild") } - if member.Level == GuildMemberLevelCadre { + if member.Level == GuildMemberLevelViceLeader { return nil } - member.Level = GuildMemberLevelCadre - fields := [][]string{{"level", q5.ToString(GuildMemberLevelCadre)}} + 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) @@ -399,19 +399,25 @@ func (gm *GuildMgr) Disband(guildId int64, accountId string) error { return nil } -func (gm *GuildMgr) RemoveGuildsId(guildId int64) { - guildIndex := -1 - for i, gId := range gm.guildIds { - if gId == guildId { - guildIndex = i - } +// SetNotice 设置公告 +func (gm *GuildMgr) SetNotice(guildId int64, accountId string, notice *string) error { + guild := gm.GetGuild(guildId) + if guild == nil { + return fmt.Errorf("guild not found") } - if guildIndex < 0 { - return + + // 仅会长可操作 + if accountId != guild.LeaderId { + return fmt.Errorf("cannot disband guild") } - copy(gm.guildIds[guildIndex:], gm.guildIds[guildIndex+1:]) - gm.guildIds[len(gm.guildIds)-1] = 0 - gm.guildIds = gm.guildIds[:len(gm.guildIds)-1] + guild.SetNotice(notice) + + updateFields := [][]string{ + {"notice", *notice}, + } + gm.updateGuild(guild, updateFields) + + return nil } // WriteLog 记录公会日志 @@ -537,12 +543,23 @@ func (gm *GuildMgr) loadGuildIds() { } } -func (gm *GuildMgr) addGuildIds(guildId int64) { - gm.guildIds = append(gm.guildIds, guildId) +func (gm *GuildMgr) RemoveGuildsId(guildId int64) { + guildIndex := -1 + for i, gId := range gm.guildIds { + if gId == guildId { + guildIndex = i + } + } + if guildIndex < 0 { + return + } + copy(gm.guildIds[guildIndex:], gm.guildIds[guildIndex+1:]) + gm.guildIds[len(gm.guildIds)-1] = 0 + gm.guildIds = gm.guildIds[:len(gm.guildIds)-1] } -func containsSubstring(s, substr string) bool { - return len(s) >= len(substr) && s[len(s)-len(substr):] == substr +func (gm *GuildMgr) addGuildIds(guildId int64) { + gm.guildIds = append(gm.guildIds, guildId) } func (gm *GuildMgr) GetAllPendingReqs(guildId int64) map[string]bool { @@ -558,3 +575,7 @@ func (gm *GuildMgr) GetGuildLogs(guildId int64) []*GuildLog { } return nil } + +func containsSubstring(s, substr string) bool { + return len(s) >= len(substr) && s[len(s)-len(substr):] == substr +} diff --git a/server/imserver/player.go b/server/imserver/player.go index 3de17789..c1aa30b7 100644 --- a/server/imserver/player.go +++ b/server/imserver/player.go @@ -300,14 +300,17 @@ func (p *Player) CMGuildInfo(hdr *f5.MsgHdr, msg *cs.CMGuildInfo) { wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg) return } + members := q5.ToInt32(len(g.Members)) maxMembers := q5.ToInt32(g.MaxMembers) currGuild := &cs.MFGuild{ + AutoId: &g.AutoId, GuildId: &g.GuildId, Name: &g.Name, LeaderId: &g.LeaderId, Members: &members, MaxMembers: &maxMembers, + Notice: &g.Notice, } rspMsg.Guild = currGuild rspMsg.RandomGuilds = nil @@ -514,11 +517,13 @@ func (p *Player) FillGuild(guilds []*Guild) []*cs.MFGuild { members := q5.ToInt32(len(g.Members)) maxMembers := q5.ToInt32(g.MaxMembers) guild := &cs.MFGuild{ + AutoId: &g.AutoId, GuildId: &g.GuildId, Name: &g.Name, LeaderId: &g.LeaderId, Members: &members, MaxMembers: &maxMembers, + Notice: &g.Notice, } resGuilds = append(resGuilds, guild) } diff --git a/server/imserver/proto/cs_proto.proto b/server/imserver/proto/cs_proto.proto index f7d2d6eb..99877ba4 100644 --- a/server/imserver/proto/cs_proto.proto +++ b/server/imserver/proto/cs_proto.proto @@ -487,11 +487,13 @@ message SMSearchGuilds repeated MFGuild guilds = 1; } message MFGuild { - optional int64 guild_id = 1; - optional string name = 2; - optional string leader_id = 3; - optional int32 members = 4; - optional int32 max_members = 5; + optional int64 auto_id = 1; + optional int64 guild_id = 2; + optional string name = 3; + optional string leader_id = 4; + optional int32 members = 5; + optional int32 max_members = 6; + optional string notice = 7; } // 请求公会日志