This commit is contained in:
aozhiwei 2020-10-12 11:38:20 +08:00
parent 3142003862
commit 9c71885dab
2 changed files with 140 additions and 30 deletions

View File

@ -1,6 +1,7 @@
#include "precompile.h"
#include <a8/timer.h>
#include <a8/openssl.h>
#include <a8/mutable_xobject.h>
#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<std::string>* 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<std::string>* 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());
}

View File

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