diff --git a/server/imserver/constant.h b/server/imserver/constant.h index 407044d..b69dd22 100644 --- a/server/imserver/constant.h +++ b/server/imserver/constant.h @@ -70,6 +70,7 @@ enum GuildMemberUpdateReason kGuildUpdateReasonJoin = 0, kGuildUpdateReasonAgree = 1, kGuildUpdateReasonSetJob = 2, + kGuildUpdateReasonInherit = 3, }; const char* const PROJ_NAME_FMT = "friend_imserver"; diff --git a/server/imserver/guild.cc b/server/imserver/guild.cc index 2f07afd..9c4135c 100644 --- a/server/imserver/guild.cc +++ b/server/imserver/guild.cc @@ -362,7 +362,25 @@ void Guild::_CMGuildQuit(f8::MsgHdr& hdr, const cs::CMGuildQuit& msg) if (member_hash_.empty()) { guild_status_ = kGuildDismissed; } else { - + std::vector jobs = {kGuildAdmin, kGuildElite, kGuildMember}; + for (int job : jobs) { + std::set* members = GetJobMembers(job); + if (members && !members->empty()) { + GuildMember* new_leader = ChooseLeader(members); + if (new_leader) { + member_job_hash_[new_leader->account_id] = kGuildOwner; + job_hash_[job].erase(new_leader->account_id); + job_hash_[kGuildOwner].insert(new_leader->account_id); + SyncHelper::Instance()->SyncGuildMemberUpdate + ( + this, + new_leader, + kGuildUpdateReasonInherit + ); + break; + } + } + } } } SaveToDB(); @@ -1112,3 +1130,18 @@ void Guild::GenGuildData(Player* hum, long long guild_id, std::string& guild_dat } guild_db.SerializeToString(&guild_data); } + +GuildMember* Guild::ChooseLeader(std::set* members) +{ + GuildMember* leader = nullptr; + if (members && !members->empty()) { + for (const std::string& member_id : *members) { + leader = GetMember(member_id); + if (leader) { + break; + } + + } + } + return leader; +} diff --git a/server/imserver/guild.h b/server/imserver/guild.h index ca6314e..1951958 100644 --- a/server/imserver/guild.h +++ b/server/imserver/guild.h @@ -62,6 +62,7 @@ private: const std::string& guild_log); void SendErrorMsg(int sokcet_handle, const ss::MFIMMsgConext& context, const std::string& errmsg); void QueryMemberOnlineState(); + GuildMember* ChooseLeader(std::set* members); private: bool dirty_ = false;