diff --git a/server/imserver/constant.h b/server/imserver/constant.h index c192890..998b882 100644 --- a/server/imserver/constant.h +++ b/server/imserver/constant.h @@ -18,8 +18,8 @@ enum GuildStatus_e enum GuildJob_e { kGuildMember = 0, - kGuildOwner = 1, - kGuildAdmin = 2, + kGuildOwner = 1, //只能1个 + kGuildAdmin = 2, //只能1个 kGuildElite = 3, kGuildJobMax }; diff --git a/server/imserver/guild.cc b/server/imserver/guild.cc index 951e55f..8fdeee1 100644 --- a/server/imserver/guild.cc +++ b/server/imserver/guild.cc @@ -119,18 +119,67 @@ void Guild::MarkDirty() } } -void Guild::Deserialize(const std::string& guild_data, const std::string& guild_log) -{ - logdb_->ParseFromString(guild_log); +void Guild::Deserialize(const std::string& guild_data, + const std::string& guild_members, + const std::string& guild_log) - ss::MFGuildDB guilddb; - guilddb.ParseFromString(guild_data); - for (auto& member_pb : guilddb.members()) { - GuildMember* member = new GuildMember; - TypeConvert::Convert(member_pb.base_data(), *member); - member_hash_[member->account_id] = member; +{ + { + logdb_->ParseFromString(guild_log); + } + + { + ss::MFGuildDB guilddb; + guilddb.ParseFromString(guild_data); + for (auto& member_pb : guilddb.members()) { + GuildMember* member = new GuildMember; + TypeConvert::Convert(member_pb.base_data(), *member); + member_hash_[member->account_id] = member; + } + GenSortedMembers(); + } + + { + a8::XObject xobj; + xobj.ReadFromJsonString(guild_members); + if (xobj.GetType() == a8::XOT_ARRAY) { + for (int i = 0; i < xobj.Size(); ++i) { + std::shared_ptr item = xobj.At(i); + if (item && item->GetType() == a8::XOT_OBJECT) { + if (item->HasKey("account_id") && item->At("account_id")->GetType() == a8::XOT_SIMPLE && + item->HasKey("guild_job") && item->At("guild_job")->GetType() == a8::XOT_SIMPLE + ) { + std::string account_id = item->At("account_id")->AsXValue().GetString(); + int job = item->At("guild_job")->AsXValue(); + if (GetMember(account_id) && IsValidGuildJob(job)) { + if (job == kGuildOwner) { + continue; + } + if (job == kGuildAdmin && GetJobMemberNum(job) > 0) { + continue; + } + member_job_hash_[account_id] = job; + std::set* members = GetJobMembers(job); + if (!members) { + members = new std::set(); + job_hash_[job] = members; + } + members->insert(account_id); + } + } + } + }//end for + } + { + member_job_hash_[owner_id_] = kGuildOwner; + std::set* members = GetJobMembers(kGuildOwner); + if (!members) { + members = new std::set(); + job_hash_[kGuildOwner] = members; + } + members->insert(owner_id_); + } } - GenSortedMembers(); } void Guild::_CMGuildInfo(f8::MsgHdr& hdr, const cs::CMGuildInfo& msg) @@ -500,12 +549,18 @@ int Guild::GetMemberJob(const std::string& account_id) std::set* Guild::GetJobMembers(int job) { - if (job < 0 || job > (int)job_hash_.size()) { + if (!IsValidGuildJob(job)) { return nullptr; } return job_hash_[job]; } +int Guild::GetJobMemberNum(int job) +{ + std::set* members = GetJobMembers(job); + return members ? members->size() : 0; +} + void Guild::FillGuildBasic(cs::MFGuildBasic* guild_basic) { guild_basic->set_guild_id(guild_id_); @@ -537,7 +592,6 @@ void Guild::SerializeMembers(std::string& guild_members) for (auto& pair : member_hash_) { a8::MutableXObject* member_xobj = a8::MutableXObject::NewObject(); member_xobj->SetVal("account_id", pair.second->account_id); - member_xobj->SetVal("nickname", pair.second->nickname); member_xobj->SetVal("guild_job", GetMemberJob(pair.second->account_id)); members_xobj->Push(*member_xobj); delete member_xobj; @@ -580,7 +634,8 @@ void Guild::SaveToDB() " guild_apply_num=%d, guild_members='%s', guild_notice='%s', guild_declaration='%s', " " guild_log='%s', owner_id='%s', owner_name='%s', owner_avatar_url='%s', " " creator_id='%s', creator_name='%s', creator_avatar_url='%s', guild_data='%s', " - " guild_status='%d', modifytime=%d " + " guild_status='%d', join_unlimited=%d, join_cond1=%d, join_cond1=%d, guild_member_num=%d, " + " modifytime=%d " "WHERE guild_id=%d;", { guild_name_, @@ -600,6 +655,10 @@ void Guild::SaveToDB() creator_avatar_url_, guild_data, guild_status_, + join_unlimited_, + join_cond1_, + join_cond2_, + member_hash_.size(), App::Instance()->nowtime, guild_id_ }, @@ -728,8 +787,7 @@ Guild* Guild::CreateGuild(int gameid, guild->join_cond1_ = join_cond1; guild->join_cond2_ = join_cond2; guild->createtime_ = createtime; - //guild_members - guild->Deserialize(guild_data, guild_log); + guild->Deserialize(guild_data, guild_members, guild_log); return guild; } diff --git a/server/imserver/guild.h b/server/imserver/guild.h index ed21289..11caf20 100644 --- a/server/imserver/guild.h +++ b/server/imserver/guild.h @@ -32,6 +32,7 @@ public: long long GuildId() { return guild_id_; } int GetMemberJob(const std::string& account_id); std::set* GetJobMembers(int job); + int GetJobMemberNum(int job); private: bool IsFull(); @@ -51,7 +52,9 @@ private: void FillApplyList(const std::string& account_id, cs::MFPaging& paging, cs::SMGuildApplyList& respmsg); void ClearApplyBySenderId(const std::string& sender_id); void ClearApplyByIdx(long long idx); - void Deserialize(const std::string& guild_data, const std::string& guild_log); + void Deserialize(const std::string& guild_data, + const std::string& guild_members, + const std::string& guild_log); void SendErrorMsg(int sokcet_handle, const ss::MFIMMsgConext& context, const std::string& errmsg); private: diff --git a/server/imserver/utils.cc b/server/imserver/utils.cc index 3dbfdd6..280bdd7 100644 --- a/server/imserver/utils.cc +++ b/server/imserver/utils.cc @@ -22,3 +22,8 @@ void AdjustPaging(cs::MFPaging* paging, int total_count) } } } + +bool IsValidGuildJob(int job) +{ + return job >= kGuildMember && job < kGuildJobMax; +} diff --git a/server/imserver/utils.h b/server/imserver/utils.h index 1a7baae..7287547 100644 --- a/server/imserver/utils.h +++ b/server/imserver/utils.h @@ -6,3 +6,4 @@ namespace cs } void AdjustPaging(cs::MFPaging* paging, int total_count); +bool IsValidGuildJob(int job); diff --git a/server/rankserver/guildmgr.cc b/server/rankserver/guildmgr.cc index af3038a..f785a6e 100644 --- a/server/rankserver/guildmgr.cc +++ b/server/rankserver/guildmgr.cc @@ -55,10 +55,10 @@ void GuildMgr::__GuildCreate(f8::JsonHttpRequest* request) conn, "INSERT INTO `guild`(gameid, guild_id, guild_name, guild_lv, guild_exp, guild_badge, " " guild_apply_num, guild_notice, guild_declaration, guild_log, owner_id, " - " owner_name, owner_avatar_url, creator_id, creator_name, creator_avatar_url, " + " owner_name, owner_avatar_url, creator_id, creator_name, creator_avatar_url, guild_member_num" " guild_data, guild_status, join_unlimited, join_cond1, join_cond2, createtime, modifytime)" "VALUES(%d, %d, '%s', %d, %d, %d, %d, '%s', '%s', '%s', '%s', " - " '%s', '%s', '%s', '%s', '%s', " + " '%s', '%s', '%s', '%s', '%s', 1, " " '%s', %d, %d, %d, %d, %d, %d);", { guild->_gameid(), diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 67a45fb..1063307 100644 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -24,7 +24,7 @@ message MFStringTuple //分页信息 message MFPaging { - optional int64 curr_page = 1; //当前页(第一页是0) + optional int32 curr_page = 1; //当前页(第一页是0) optional int32 page_size = 2; //每页记录数 optional int32 _total_page = 3; //总页数(服务器填充该字段) optional int32 _total_count = 4; //总记录数(服务器填充该字段) diff --git a/sql/relationdb_n.sql b/sql/relationdb_n.sql index 5a1534f..2c5f61b 100644 --- a/sql/relationdb_n.sql +++ b/sql/relationdb_n.sql @@ -97,6 +97,7 @@ CREATE TABLE `guild` ( `guild_badge` int(11) NOT NULL DEFAULT '0' COMMENT '公会徽章', `guild_apply_num` int(11) NOT NULL DEFAULT '0' COMMENT '申请人数', `guild_members` blob COMMENT '公会管理员', + `guild_member_num` int(11) NOT NULL DEFAULT '0' COMMENT '公会成员数量', `guild_notice` tinyblob COMMENT '公会公告', `guild_declaration` tinyblob COMMENT '公会宣言', `guild_log` mediumblob COMMENT '公会日志',