This commit is contained in:
aozhiwei 2020-10-08 12:42:01 +08:00
parent 45d40a8b02
commit a47743f91b
3 changed files with 36 additions and 1 deletions

View File

@ -70,6 +70,7 @@ enum GuildMemberUpdateReason
kGuildUpdateReasonJoin = 0, kGuildUpdateReasonJoin = 0,
kGuildUpdateReasonAgree = 1, kGuildUpdateReasonAgree = 1,
kGuildUpdateReasonSetJob = 2, kGuildUpdateReasonSetJob = 2,
kGuildUpdateReasonInherit = 3,
}; };
const char* const PROJ_NAME_FMT = "friend_imserver"; const char* const PROJ_NAME_FMT = "friend_imserver";

View File

@ -362,7 +362,25 @@ void Guild::_CMGuildQuit(f8::MsgHdr& hdr, const cs::CMGuildQuit& msg)
if (member_hash_.empty()) { if (member_hash_.empty()) {
guild_status_ = kGuildDismissed; guild_status_ = kGuildDismissed;
} else { } else {
std::vector<int> jobs = {kGuildAdmin, kGuildElite, kGuildMember};
for (int job : jobs) {
std::set<std::string>* 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(); SaveToDB();
@ -1112,3 +1130,18 @@ void Guild::GenGuildData(Player* hum, long long guild_id, std::string& guild_dat
} }
guild_db.SerializeToString(&guild_data); guild_db.SerializeToString(&guild_data);
} }
GuildMember* Guild::ChooseLeader(std::set<std::string>* members)
{
GuildMember* leader = nullptr;
if (members && !members->empty()) {
for (const std::string& member_id : *members) {
leader = GetMember(member_id);
if (leader) {
break;
}
}
}
return leader;
}

View File

@ -62,6 +62,7 @@ private:
const std::string& guild_log); const std::string& guild_log);
void SendErrorMsg(int sokcet_handle, const ss::MFIMMsgConext& context, const std::string& errmsg); void SendErrorMsg(int sokcet_handle, const ss::MFIMMsgConext& context, const std::string& errmsg);
void QueryMemberOnlineState(); void QueryMemberOnlineState();
GuildMember* ChooseLeader(std::set<std::string>* members);
private: private:
bool dirty_ = false; bool dirty_ = false;