From d32dc250aacdbdef2669f19c4666d594e9693ec6 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Oct 2020 19:34:10 +0800 Subject: [PATCH] 1 --- server/imserver/guild.cc | 167 ++++++++++++++----------- server/imserver/guild.h | 2 + server/tools/protobuild/cs_proto.proto | 1 - 3 files changed, 93 insertions(+), 77 deletions(-) diff --git a/server/imserver/guild.cc b/server/imserver/guild.cc index 8a98144..8c762bd 100644 --- a/server/imserver/guild.cc +++ b/server/imserver/guild.cc @@ -18,6 +18,7 @@ #include "framework/cpp/httpclientpool.h" const int GUILD_MAX_MEMBER_NUM = 5; +const int GUILD_MAX_ADMIN_NUM = 1; enum GuildApplyStatus_e { @@ -517,6 +518,7 @@ void Guild::_CMGuildQuit(f8::MsgHdr& hdr, const cs::CMGuildQuit& msg) new_leader, kGuildUpdateReasonInherit ); + SetNewLeader(new_leader); break; } } @@ -882,83 +884,25 @@ void Guild::_CMGuildMemberSetJob(f8::MsgHdr& hdr, const cs::CMGuildMemberSetJob& respmsg); return; } + if (GetMemberJob(member->account_id) == msg.job()) { + GuildMgr::Instance()->ForwardGuildSMMsg(hdr.socket_handle, + forward_msg->context(), + respmsg); + return; + } + if (msg.job() == kGuildAdmin) { + if (GetJobMemberNum(msg.job()) >= GUILD_MAX_ADMIN_NUM) { + SendErrorMsg(hdr.socket_handle, forward_msg->context(), "副队长数量已达上限"); + respmsg.set_errcode(3); + respmsg.set_errmsg("副队长数量已达上限"); + GuildMgr::Instance()->ForwardGuildSMMsg(hdr.socket_handle, + forward_msg->context(), + respmsg); + return; + } + } - int src_job = GetMemberJob(member->account_id); - if (src_job != msg.job()) { - { - std::set* noraml_members = GetJobMembers(src_job); - noraml_members->erase(member->account_id); - } - switch (msg.job()) { - case kGuildOwner: - { - owner_id_ = member->account_id; - owner_name_ = member->nickname; - owner_avatar_url_ = member->avatar_url; - member_job_hash_[sender->account_id] = kGuildMember; - member_job_hash_[member->account_id] = kGuildOwner; - { - std::set* members = GetJobMembers(kGuildOwner); - members->clear(); - members->insert(member->account_id); - } - { - std::set* members = GetJobMembers(kGuildMember); - members->insert(sender->account_id); - } - { - SyncHelper::Instance()->SyncGuildMemberUpdate(this, sender, kGuildUpdateReasonSetJob); - SyncHelper::Instance()->SyncGuildMemberUpdate(this, member, kGuildUpdateReasonSetJob); - } - { - auto p = respmsg.add_chged_members(); - p->add_values(sender->account_id); - p->add_values(a8::XValue(GetMemberJob(sender->account_id)).GetString()); - } - } - break; - case kGuildAdmin: - { - member_job_hash_[member->account_id] = kGuildAdmin; - { - std::set* members = GetJobMembers(kGuildAdmin); - for (const std::string& old_member_id : *members) { - GuildMember* old_member = GetMember(old_member_id); - if (old_member) { - member_job_hash_[old_member_id] = kGuildMember; - std::set* noraml_members = GetJobMembers(kGuildMember); - noraml_members->insert(old_member_id); - SyncHelper::Instance()->SyncGuildMemberUpdate(this, - old_member, - kGuildUpdateReasonSetJob); - } - } - members->clear(); - members->insert(member->account_id); - } - } - break; - case kGuildElite: - { - member_job_hash_[member->account_id] = kGuildElite; - } - break; - default: - { - member_job_hash_[member->account_id] = kGuildMember; - } - break; - } - GameLog::Instance()->GuildSetJob(this, - sender, - src_job); - } - { - auto p = respmsg.add_chged_members(); - p->add_values(member->account_id); - p->add_values(a8::XValue(GetMemberJob(member->account_id)).GetString()); - SyncHelper::Instance()->SyncGuildMemberUpdate(this, member, kGuildUpdateReasonSetJob); - } + ForceSetJob(member, msg.job()); GuildMgr::Instance()->ForwardGuildSMMsg(hdr.socket_handle, forward_msg->context(), respmsg); @@ -1641,3 +1585,74 @@ void Guild::RecalcRedPoint() }); } } + +void Guild::SetNewLeader(GuildMember* member) +{ + owner_id_ = member->account_id; + owner_name_ = member->nickname; + owner_avatar_url_ = member->avatar_url; +} + +void Guild::ForceSetJob(GuildMember* member, int new_job) +{ + if (!IsValidGuildJob(new_job)) { + return; + } + GuildMember* old_owner = GetMember(owner_id_); + if (!old_owner || GetMemberJob(owner_id_) != kGuildOwner) { + return; + } + if (old_owner == member) { + return; + } + + int old_job = GetMemberJob(member->account_id); + switch (new_job) { + case kGuildOwner: + { + { + std::set* members = GetJobMembers(kGuildOwner); + members->clear(); + members->insert(member->account_id); + } + { + std::set* members = GetJobMembers(kGuildMember); + members->insert(old_owner->account_id); + } + member_job_hash_[old_owner->account_id] = kGuildMember; + member_job_hash_[member->account_id] = kGuildOwner; + SyncHelper::Instance()->SyncGuildMemberUpdate(this, old_owner, kGuildUpdateReasonSetJob); + SetNewLeader(member); + } + break; + case kGuildAdmin: + { + if (GetJobMemberNum(new_job) >= GUILD_MAX_ADMIN_NUM) { + return; + } + std::set* members = GetJobMembers(new_job); + members->insert(member->account_id); + member_job_hash_[member->account_id] = new_job; + } + break; + case kGuildElite: + case kGuildMember: + { + std::set* members = GetJobMembers(new_job); + members->insert(member->account_id); + member_job_hash_[member->account_id] = new_job; + } + break; + default: + { + return; + } + break; + } + { + std::set* members = GetJobMembers(old_job); + members->erase(member->account_id); + } + GameLog::Instance()->GuildSetJob(this, member, old_job); + SyncHelper::Instance()->SyncGuildMemberUpdate(this, member, kGuildUpdateReasonSetJob); +} diff --git a/server/imserver/guild.h b/server/imserver/guild.h index 20c0aed..d453a98 100644 --- a/server/imserver/guild.h +++ b/server/imserver/guild.h @@ -74,6 +74,8 @@ private: void CombineRepeatApply(); void GuildAgreeCb(int socket_handle, const ss::MFIMMsgConext& context, const cs::CMGuildAgree& msg); void RecalcRedPoint(); + void SetNewLeader(GuildMember* member); + void ForceSetJob(GuildMember* member, int new_job); private: bool dirty_ = false; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 2985db0..21f0b9d 100644 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -554,7 +554,6 @@ message SMGuildMemberSetJob { optional int32 errcode = 1; //错误码 optional string errmsg = 2; //错误信息 - repeated MFStringTuple chged_members = 3; //发生职位变更的玩家 values[0]: account_id values[1]: job } //同意邀请