This commit is contained in:
aozhiwei 2020-09-28 17:27:15 +08:00
parent 951676bcd8
commit d7c6dcde53
8 changed files with 89 additions and 21 deletions

View File

@ -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
};

View File

@ -119,10 +119,16 @@ void Guild::MarkDirty()
}
}
void Guild::Deserialize(const std::string& guild_data, const std::string& guild_log)
void Guild::Deserialize(const std::string& guild_data,
const std::string& guild_members,
const std::string& guild_log)
{
{
logdb_->ParseFromString(guild_log);
}
{
ss::MFGuildDB guilddb;
guilddb.ParseFromString(guild_data);
for (auto& member_pb : guilddb.members()) {
@ -133,6 +139,49 @@ void Guild::Deserialize(const std::string& guild_data, const std::string& guild_
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<a8::XObject> 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<std::string>* members = GetJobMembers(job);
if (!members) {
members = new std::set<std::string>();
job_hash_[job] = members;
}
members->insert(account_id);
}
}
}
}//end for
}
{
member_job_hash_[owner_id_] = kGuildOwner;
std::set<std::string>* members = GetJobMembers(kGuildOwner);
if (!members) {
members = new std::set<std::string>();
job_hash_[kGuildOwner] = members;
}
members->insert(owner_id_);
}
}
}
void Guild::_CMGuildInfo(f8::MsgHdr& hdr, const cs::CMGuildInfo& msg)
{
ss::SS_IM_ForwardGuildCMMsg *forward_msg = (ss::SS_IM_ForwardGuildCMMsg*)hdr.user_data;
@ -500,12 +549,18 @@ int Guild::GetMemberJob(const std::string& account_id)
std::set<std::string>* 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<std::string>* 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;
}

View File

@ -32,6 +32,7 @@ public:
long long GuildId() { return guild_id_; }
int GetMemberJob(const std::string& account_id);
std::set<std::string>* 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:

View File

@ -22,3 +22,8 @@ void AdjustPaging(cs::MFPaging* paging, int total_count)
}
}
}
bool IsValidGuildJob(int job)
{
return job >= kGuildMember && job < kGuildJobMax;
}

View File

@ -6,3 +6,4 @@ namespace cs
}
void AdjustPaging(cs::MFPaging* paging, int total_count);
bool IsValidGuildJob(int job);

View File

@ -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(),

View File

@ -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; //

View File

@ -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 '公会日志',