diff --git a/server/imserver/constant.h b/server/imserver/constant.h index 998b882..407044d 100644 --- a/server/imserver/constant.h +++ b/server/imserver/constant.h @@ -69,6 +69,7 @@ enum GuildMemberUpdateReason { kGuildUpdateReasonJoin = 0, kGuildUpdateReasonAgree = 1, + kGuildUpdateReasonSetJob = 2, }; const char* const PROJ_NAME_FMT = "friend_imserver"; diff --git a/server/imserver/guild.cc b/server/imserver/guild.cc index ce195fd..9654d5e 100644 --- a/server/imserver/guild.cc +++ b/server/imserver/guild.cc @@ -379,17 +379,35 @@ void Guild::_CMGuildMemberList(f8::MsgHdr& hdr, const cs::CMGuildMemberList& msg if (respmsg.paging().page_size() <= 0) { respmsg.mutable_paging()->set_page_size(10); } - AdjustPaging(respmsg.mutable_paging(), sorted_members_.size()); + int total_count = 0; + { + for (size_t i = respmsg.paging().curr_page() * respmsg.paging().page_size(); + i < sorted_members_.size(); + ++i) { + GuildMember* member = sorted_members_[i]; + if (!msg.member_name().empty() && + member->nickname.find(msg.member_name()) == std::string::npos) { + continue; + } + ++total_count; + } + } + AdjustPaging(respmsg.mutable_paging(), total_count); for (size_t i = respmsg.paging().curr_page() * respmsg.paging().page_size(); i < sorted_members_.size(); ++i) { + GuildMember* member = sorted_members_[i]; + if (!msg.member_name().empty() && + member->nickname.find(msg.member_name()) == std::string::npos) { + continue; + } if (respmsg.member_list().size() >= respmsg.paging().page_size()) { break; } auto p = respmsg.add_member_list(); TypeConvert::Convert(guild_id_, - GetMemberJob(sorted_members_[i]->account_id), - *sorted_members_[i], + GetMemberJob(member->account_id), + *member, *(p->mutable_base_data())); } GuildMgr::Instance()->ForwardGuildSMMsg(hdr.socket_handle, @@ -548,32 +566,93 @@ void Guild::_CMGuildMemberSetJob(f8::MsgHdr& hdr, const cs::CMGuildMemberSetJob& respmsg); return; } + GuildMember* member = GetMember(msg.member_id()); + if (!member) { + 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; + } - switch (msg.job()) { - case kGuildOwner: + 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); } - break; - case kGuildAdmin: - { - + 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); + } + { + 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; } - break; - case kGuildElite: - { - - } - break; - default: - { - - } - break; + } + { + 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); } GuildMgr::Instance()->ForwardGuildSMMsg(hdr.socket_handle, forward_msg->context(), respmsg); + SaveToDB(); } int Guild::GetMemberJob(const std::string& account_id) diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 84ec586..0130c43 100644 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -479,7 +479,7 @@ message SMGuildRank message CMGuildMemberList { optional MFPaging paging = 1; //分页信息 - optional string member_id = 2; //成员id + optional string member_name = 2; //成员名字 } message SMGuildMemberList {