From 9c71885dabd9a15d3afb9d35e867debe10bb16c6 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Oct 2020 11:38:20 +0800 Subject: [PATCH] 1 --- server/imserver/guild.cc | 169 ++++++++++++++++++++++++++++++++------- server/imserver/guild.h | 1 + 2 files changed, 140 insertions(+), 30 deletions(-) diff --git a/server/imserver/guild.cc b/server/imserver/guild.cc index 4d585fa..b55a659 100644 --- a/server/imserver/guild.cc +++ b/server/imserver/guild.cc @@ -1,6 +1,7 @@ #include "precompile.h" #include +#include #include #include "guild.h" @@ -272,21 +273,6 @@ void Guild::_CMGuildAgree(f8::MsgHdr& hdr, const cs::CMGuildAgree& msg) ss::SS_IM_ForwardGuildCMMsg *forward_msg = (ss::SS_IM_ForwardGuildCMMsg*)hdr.user_data; cs::SMGuildAgree respmsg; - GuildMember* member = GetMember(msg.apply().base_data().account_id()); - if (member) { - SyncHelper::Instance()->SyncGuildMemberUpdateOnlyOnline(this, member, kGuildUpdateReasonAgree); - GuildMgr::Instance()->ForwardGuildSMMsg(hdr.socket_handle, - forward_msg->context(), - respmsg); - DBHelper::Instance()->SetGuildApplyStatus - ( - msg.apply().base_data().account_id(), - guild_id_, - kGuildApplyAgree - ); - ClearApplyBySenderId(msg.apply().base_data().account_id()); - return; - } if (IsFull()) { SendErrorMsg(hdr.socket_handle, forward_msg->context(), "公会人数已达上限"); respmsg.set_errcode(1); @@ -318,25 +304,78 @@ void Guild::_CMGuildAgree(f8::MsgHdr& hdr, const cs::CMGuildAgree& msg) respmsg); return; } - GuildMgr::Instance()->ForwardGuildSMMsg(hdr.socket_handle, - forward_msg->context(), - respmsg); - member = new GuildMember(); - TypeConvert::Convert(msg.apply().base_data(), *member); - AddMember(member); - member_job_hash_[member->account_id] = kGuildMember; - std::set* members = GetJobMembers(kGuildMember); - members->insert(member->account_id); + ss::SS_IM_ForwardGuildCMMsg *forward_msg_copy = new ss::SS_IM_ForwardGuildCMMsg; + *forward_msg_copy = *forward_msg; + cs::CMGuildAgree* msg_copy = new cs::CMGuildAgree; + *msg_copy = msg; - SyncHelper::Instance()->SyncGuildMemberUpdate(this, member, kGuildUpdateReasonAgree); - DBHelper::Instance()->SetGuildApplyStatus + unsigned int crc32_code = a8::openssl::Crc32 ( - msg.apply().base_data().account_id(), - guild_id_, - kGuildApplyAgree + (unsigned char*)msg.apply().base_data().account_id().data(), + msg.apply().base_data().account_id().size() + ); + a8::XObject conn_info = DBEngine::Instance()->GetConnInfo(crc32_code); + DBEngine::Instance()->ExecAsyncQuery + ( + conn_info, + "SELECT guild_id, guild_job WHERE account_id='%s' AND guild_id != 0;", + { + msg.apply().base_data().account_id() + }, + a8::XParams() + .SetSender(guild_id_) + .SetParam1(forward_msg_copy) + .SetParam2(hdr.socket_handle) + .SetParam3(msg_copy), + [] (a8::XParams& param, const f8::DataSet* data_set) + { + ss::SS_IM_ForwardGuildCMMsg *forward_msg_copy = (ss::SS_IM_ForwardGuildCMMsg*)param.param1.GetUserData(); + cs::CMGuildAgree* msg_copy = (cs::CMGuildAgree*)param.param3.GetUserData(); + + Guild* guild = GuildMgr::Instance()->GetGuild(param.sender); + if (guild) { + if (!data_set || data_set->empty()) { + guild->GuildAgreeCb(param.param2, + forward_msg_copy->context(), + *msg_copy); + } else if (data_set && !data_set->empty()) { + const auto& row = (*data_set)[0]; + long long guild_id = a8::XValue(row[0]); + if (guild_id == guild->GuildId()) { + cs::SMGuildAgree respmsg; + GuildMgr::Instance()->ForwardGuildSMMsg(param.param2, + forward_msg_copy->context(), + respmsg); + DBHelper::Instance()->SetGuildApplyStatus + ( + msg_copy->apply().base_data().account_id(), + guild->GuildId(), + kGuildApplyAgree + ); + guild->ClearApplyBySenderId(msg_copy->apply().base_data().account_id()); + } else { + guild->SendErrorMsg(param.param2, forward_msg_copy->context(), "对方已经有公会"); + } + } + } + + delete msg_copy; + delete forward_msg_copy; + }, + [] (a8::XParams& param, int error_code, const std::string& error_msg) + { + ss::SS_IM_ForwardGuildCMMsg *forward_msg_copy = (ss::SS_IM_ForwardGuildCMMsg*)param.param1.GetUserData(); + cs::CMGuildAgree* msg_copy = (cs::CMGuildAgree*)param.param3.GetUserData(); + Guild* guild = GuildMgr::Instance()->GetGuild(param.sender); + if (guild) { + guild->SendErrorMsg(param.param2, forward_msg_copy->context(), "服务器内部错误"); + } + delete msg_copy; + delete forward_msg_copy; + }, + crc32_code ); - ClearApplyBySenderId(msg.apply().base_data().account_id()); } void Guild::_CMGuildRefuse(f8::MsgHdr& hdr, const cs::CMGuildRefuse& msg) @@ -1380,3 +1419,73 @@ void Guild::CombineRepeatApply() } } } + +void Guild::GuildAgreeCb(int socket_handle, const ss::MFIMMsgConext& context, const cs::CMGuildAgree& msg) +{ + cs::SMGuildAgree respmsg; + GuildMember* member = GetMember(msg.apply().base_data().account_id()); + if (member) { + SyncHelper::Instance()->SyncGuildMemberUpdateOnlyOnline(this, member, kGuildUpdateReasonAgree); + GuildMgr::Instance()->ForwardGuildSMMsg(socket_handle, + context, + respmsg); + DBHelper::Instance()->SetGuildApplyStatus + ( + msg.apply().base_data().account_id(), + guild_id_, + kGuildApplyAgree + ); + ClearApplyBySenderId(msg.apply().base_data().account_id()); + return; + } + if (IsFull()) { + SendErrorMsg(socket_handle, context, "公会人数已达上限"); + respmsg.set_errcode(1); + respmsg.set_errmsg("公会人数已达上限"); + GuildMgr::Instance()->ForwardGuildSMMsg(socket_handle, + context, + respmsg); + return; + } + GuildMember* sender = GetMember(context.user_info().base_data().account_id()); + if (!sender) { + SendErrorMsg(socket_handle, context, "服务器内部错误"); + respmsg.set_errcode(2); + respmsg.set_errmsg("服务器内部错误"); + GuildMgr::Instance()->ForwardGuildSMMsg(socket_handle, + context, + respmsg); + return; + } + if (!( + GetMemberJob(sender->account_id) == kGuildOwner || + GetMemberJob(sender->account_id) == kGuildAdmin) + ) { + SendErrorMsg(socket_handle, context, "权限不够"); + respmsg.set_errcode(3); + respmsg.set_errmsg("权限不够"); + GuildMgr::Instance()->ForwardGuildSMMsg(socket_handle, + context, + respmsg); + return; + } + GuildMgr::Instance()->ForwardGuildSMMsg(socket_handle, + context, + respmsg); + + member = new GuildMember(); + TypeConvert::Convert(msg.apply().base_data(), *member); + AddMember(member); + member_job_hash_[member->account_id] = kGuildMember; + std::set* members = GetJobMembers(kGuildMember); + members->insert(member->account_id); + + SyncHelper::Instance()->SyncGuildMemberUpdate(this, member, kGuildUpdateReasonAgree); + DBHelper::Instance()->SetGuildApplyStatus + ( + msg.apply().base_data().account_id(), + guild_id_, + kGuildApplyAgree + ); + ClearApplyBySenderId(msg.apply().base_data().account_id()); +} diff --git a/server/imserver/guild.h b/server/imserver/guild.h index 854d7bf..0b7dd48 100644 --- a/server/imserver/guild.h +++ b/server/imserver/guild.h @@ -69,6 +69,7 @@ private: void GuildRenameCb(int socket_handle, const ss::MFIMMsgConext& context, const cs::CMGuildChange& msg); void RemoveHandledApply(); void CombineRepeatApply(); + void GuildAgreeCb(int socket_handle, const ss::MFIMMsgConext& context, const cs::CMGuildAgree& msg); private: bool dirty_ = false;