This commit is contained in:
aozhiwei 2020-10-10 19:40:43 +08:00
parent a234e85917
commit af8009344b
4 changed files with 136 additions and 60 deletions

View File

@ -62,7 +62,8 @@ enum GuildMemberQuitReason
{
kGuildKick = 0,
kGuildQuit = 1,
kGuildDismisss = 2
kGuildDismisss = 2,
kGuildUpdate = 3,
};
enum GuildMemberUpdateReason
@ -71,6 +72,7 @@ enum GuildMemberUpdateReason
kGuildUpdateReasonAgree = 1,
kGuildUpdateReasonSetJob = 2,
kGuildUpdateReasonInherit = 3,
kGuildUpdateReasonUpdate = 4,
};
const char* const PROJ_NAME_FMT = "friend_imserver";

View File

@ -261,7 +261,7 @@ void Guild::_CMGuildJoin(f8::MsgHdr& hdr, const cs::CMGuildJoin& msg)
GuildMember* member = GetMember(forward_msg->context().user_info().base_data().account_id());
if (member) {
SyncHelper::Instance()->SyncGuildMemberUpdate(this, member, kGuildUpdateReasonJoin);
SyncHelper::Instance()->SyncGuildMemberUpdateOnlyOnline(this, member, kGuildUpdateReasonJoin);
} else {
DBHelper::Instance()->AddGuildApply(this, forward_msg->context().user_info());
}
@ -274,7 +274,7 @@ void Guild::_CMGuildAgree(f8::MsgHdr& hdr, const cs::CMGuildAgree& msg)
cs::SMGuildAgree respmsg;
GuildMember* member = GetMember(msg.apply().base_data().account_id());
if (member) {
SyncHelper::Instance()->SyncGuildMemberUpdate(this, member, kGuildUpdateReasonAgree);
SyncHelper::Instance()->SyncGuildMemberUpdateOnlyOnline(this, member, kGuildUpdateReasonAgree);
GuildMgr::Instance()->ForwardGuildSMMsg(hdr.socket_handle,
forward_msg->context(),
respmsg);
@ -462,6 +462,14 @@ void Guild::_CMGuildQuit(f8::MsgHdr& hdr, const cs::CMGuildQuit& msg)
}
}
SaveToDB();
} else {
SyncHelper::Instance()->SyncGuildMemberQuitOnlyOnline
(
this,
forward_msg->context().user_info().base_data().account_id(),
forward_msg->context().user_info().base_data().account_id(),
kGuildUpdate
);
}
}
@ -836,6 +844,7 @@ void Guild::_CMGuildMemberSetJob(f8::MsgHdr& hdr, const cs::CMGuildMemberSetJob&
}
{
SyncHelper::Instance()->SyncGuildMemberUpdate(this, sender, kGuildUpdateReasonSetJob);
SyncHelper::Instance()->SyncGuildMemberUpdate(this, member, kGuildUpdateReasonSetJob);
}
{
auto p = respmsg.add_chged_members();
@ -963,6 +972,17 @@ void Guild::UpdateMemberInfo(const cs::MFUserInfo& user_info)
member->online = user_info.base_data()._online();
TypeConvert::Convert(user_info.temp_custom_data(), member->temp_custom_data);
member->last_update_time = App::Instance()->nowtime;
if (GetMemberJob(member->account_id) != user_info.base_data().guild_job()) {
SyncHelper::Instance()->SyncGuildMemberUpdateOnlyOnline(this, member, kGuildUpdateReasonUpdate);
}
} else {
SyncHelper::Instance()->SyncGuildMemberQuitOnlyOnline
(
this,
user_info.base_data().account_id(),
user_info.base_data().account_id(),
kGuildUpdate
);
}
}

View File

@ -101,35 +101,14 @@ void SyncHelper::SyncGuildMemberUpdate(Guild* guild,
GuildMember* member,
int reason)
{
ss::SS_IM_GuildMemberUpdateRequest* notifymsg = new ss::SS_IM_GuildMemberUpdateRequest;
notifymsg->set_seqid(App::Instance()->NewUUID());
notifymsg->set_guild_id(guild->GuildId());
notifymsg->set_guild_job(guild->GetMemberJob(member->account_id));
notifymsg->set_sender_id(member->account_id);
notifymsg->set_target_id(member->account_id);
notifymsg->set_reason(reason);
BroadcastIMConnMsg(*notifymsg);
pending_request_hash_[notifymsg->seqid()] =
a8::Timer::Instance()->AddDeadLineTimer
(
1000 * 10,
a8::XParams()
.SetSender(notifymsg)
.SetParam1(notifymsg->seqid()),
[] (const a8::XParams& param)
{
ss::SS_IM_GuildMemberUpdateRequest* notifymsg =
(ss::SS_IM_GuildMemberUpdateRequest*)param.sender.GetUserData();
SyncHelper::Instance()->SS_IM_GuildMemberUpdateRequest_TimeOut(notifymsg);
},
[] (const a8::XParams& param)
{
ss::SS_IM_GuildMemberUpdateRequest* notifymsg =
(ss::SS_IM_GuildMemberUpdateRequest*)param.sender.GetUserData();
delete notifymsg;
SyncHelper::Instance()->RemovePendingRequest(param.param1);
}
);
InternalSyncGuildMemberUpdate(guild, member, reason, false);
}
void SyncHelper::SyncGuildMemberUpdateOnlyOnline(Guild* guild,
GuildMember* member,
int reason)
{
InternalSyncGuildMemberUpdate(guild, member, reason, true);
}
void SyncHelper::SyncGuildMemberQuit(Guild* guild,
@ -137,34 +116,15 @@ void SyncHelper::SyncGuildMemberQuit(Guild* guild,
const std::string& target_id,
int reason)
{
ss::SS_IM_GuildMemberQuitRequest* notifymsg = new ss::SS_IM_GuildMemberQuitRequest;
notifymsg->set_seqid(App::Instance()->NewUUID());
notifymsg->set_guild_id(guild->GuildId());
notifymsg->set_sender_id(sender_id);
notifymsg->set_target_id(target_id);
notifymsg->set_reason(reason);
BroadcastIMConnMsg(*notifymsg);
pending_request_hash_[notifymsg->seqid()] =
a8::Timer::Instance()->AddDeadLineTimer
(
1000 * 10,
a8::XParams()
.SetSender(notifymsg)
.SetParam1(notifymsg->seqid()),
[] (const a8::XParams& param)
{
ss::SS_IM_GuildMemberQuitRequest* notifymsg =
(ss::SS_IM_GuildMemberQuitRequest*)param.sender.GetUserData();
SyncHelper::Instance()->SS_IM_GuildMemberQuitRequest_TimeOut(notifymsg);
},
[] (const a8::XParams& param)
{
ss::SS_IM_GuildMemberQuitRequest* notifymsg =
(ss::SS_IM_GuildMemberQuitRequest*)param.sender.GetUserData();
delete notifymsg;
SyncHelper::Instance()->RemovePendingRequest(param.param1);
}
);
InternalSyncGuildMemberQuit(guild, sender_id, target_id, reason, false);
}
void SyncHelper::SyncGuildMemberQuitOnlyOnline(Guild* guild,
const std::string& sender_id,
const std::string& target_id,
int reason)
{
InternalSyncGuildMemberQuit(guild, sender_id, target_id, reason, true);
}
void SyncHelper::BroadcastIMConnMsg(int msgid, ::google::protobuf::Message& msg)
@ -311,3 +271,79 @@ void SyncHelper::SendIMConnMsg(int instance_id, int msgid, const ::google::proto
}
}
}
void SyncHelper::InternalSyncGuildMemberUpdate(Guild* guild,
GuildMember* member,
int reason,
bool only_online)
{
ss::SS_IM_GuildMemberUpdateRequest* notifymsg = new ss::SS_IM_GuildMemberUpdateRequest;
notifymsg->set_seqid(App::Instance()->NewUUID());
notifymsg->set_guild_id(guild->GuildId());
notifymsg->set_guild_job(guild->GetMemberJob(member->account_id));
notifymsg->set_sender_id(member->account_id);
notifymsg->set_target_id(member->account_id);
notifymsg->set_reason(reason);
BroadcastIMConnMsg(*notifymsg);
if (!only_online) {
pending_request_hash_[notifymsg->seqid()] =
a8::Timer::Instance()->AddDeadLineTimer
(
1000 * 10,
a8::XParams()
.SetSender(notifymsg)
.SetParam1(notifymsg->seqid()),
[] (const a8::XParams& param)
{
ss::SS_IM_GuildMemberUpdateRequest* notifymsg =
(ss::SS_IM_GuildMemberUpdateRequest*)param.sender.GetUserData();
SyncHelper::Instance()->SS_IM_GuildMemberUpdateRequest_TimeOut(notifymsg);
},
[] (const a8::XParams& param)
{
ss::SS_IM_GuildMemberUpdateRequest* notifymsg =
(ss::SS_IM_GuildMemberUpdateRequest*)param.sender.GetUserData();
delete notifymsg;
SyncHelper::Instance()->RemovePendingRequest(param.param1);
}
);
}
}
void SyncHelper::InternalSyncGuildMemberQuit(Guild* guild,
const std::string& sender_id,
const std::string& target_id,
int reason,
bool only_online)
{
ss::SS_IM_GuildMemberQuitRequest* notifymsg = new ss::SS_IM_GuildMemberQuitRequest;
notifymsg->set_seqid(App::Instance()->NewUUID());
notifymsg->set_guild_id(guild->GuildId());
notifymsg->set_sender_id(sender_id);
notifymsg->set_target_id(target_id);
notifymsg->set_reason(reason);
BroadcastIMConnMsg(*notifymsg);
if (!only_online) {
pending_request_hash_[notifymsg->seqid()] =
a8::Timer::Instance()->AddDeadLineTimer
(
1000 * 10,
a8::XParams()
.SetSender(notifymsg)
.SetParam1(notifymsg->seqid()),
[] (const a8::XParams& param)
{
ss::SS_IM_GuildMemberQuitRequest* notifymsg =
(ss::SS_IM_GuildMemberQuitRequest*)param.sender.GetUserData();
SyncHelper::Instance()->SS_IM_GuildMemberQuitRequest_TimeOut(notifymsg);
},
[] (const a8::XParams& param)
{
ss::SS_IM_GuildMemberQuitRequest* notifymsg =
(ss::SS_IM_GuildMemberQuitRequest*)param.sender.GetUserData();
delete notifymsg;
SyncHelper::Instance()->RemovePendingRequest(param.param1);
}
);
}
}

View File

@ -39,11 +39,18 @@ public:
void SyncGuildMemberUpdate(Guild* guild,
GuildMember* member,
int reason);
void SyncGuildMemberUpdateOnlyOnline(Guild* guild,
GuildMember* member,
int reason);
void SyncGuildMemberQuit(Guild* guild,
const std::string& sender_id,
const std::string& target_id,
int reason);
void SyncGuildMemberQuitOnlyOnline(Guild* guild,
const std::string& sender_id,
const std::string& target_id,
int reason);
void _SS_IM_FriendAgreeResponse(f8::MsgHdr& hdr, const ss::SS_IM_FriendAgreeResponse& msg);
void _SS_IM_FriendDeleteResponse(f8::MsgHdr& hdr, const ss::SS_IM_FriendDeleteResponse& msg);
@ -58,6 +65,17 @@ private:
void SS_IM_GuildMemberQuitRequest_TimeOut(ss::SS_IM_GuildMemberQuitRequest* msg);
void SS_IM_GuildMemberUpdateRequest_TimeOut(ss::SS_IM_GuildMemberUpdateRequest* msg);
void InternalSyncGuildMemberUpdate(Guild* guild,
GuildMember* member,
int reason,
bool only_online);
void InternalSyncGuildMemberQuit(Guild* guild,
const std::string& sender_id,
const std::string& target_id,
int reason,
bool only_online);
public:
template <typename T>
void BroadcastIMConnMsg(T& msg)