This commit is contained in:
aozhiwei 2020-10-12 19:34:10 +08:00
parent 443def2ff7
commit d32dc250aa
3 changed files with 93 additions and 77 deletions

View File

@ -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<std::string>* 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<std::string>* members = GetJobMembers(kGuildOwner);
members->clear();
members->insert(member->account_id);
}
{
std::set<std::string>* 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<std::string>* 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<std::string>* 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<std::string>* members = GetJobMembers(kGuildOwner);
members->clear();
members->insert(member->account_id);
}
{
std::set<std::string>* 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<std::string>* members = GetJobMembers(new_job);
members->insert(member->account_id);
member_job_hash_[member->account_id] = new_job;
}
break;
case kGuildElite:
case kGuildMember:
{
std::set<std::string>* members = GetJobMembers(new_job);
members->insert(member->account_id);
member_job_hash_[member->account_id] = new_job;
}
break;
default:
{
return;
}
break;
}
{
std::set<std::string>* members = GetJobMembers(old_job);
members->erase(member->account_id);
}
GameLog::Instance()->GuildSetJob(this, member, old_job);
SyncHelper::Instance()->SyncGuildMemberUpdate(this, member, kGuildUpdateReasonSetJob);
}

View File

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

View File

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