From af8009344b35d8569f4210fef8c9553c14054b1c Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 10 Oct 2020 19:40:43 +0800 Subject: [PATCH] 1 --- server/imserver/constant.h | 4 +- server/imserver/guild.cc | 24 +++++- server/imserver/synchelper.cc | 150 +++++++++++++++++++++------------- server/imserver/synchelper.h | 18 ++++ 4 files changed, 136 insertions(+), 60 deletions(-) diff --git a/server/imserver/constant.h b/server/imserver/constant.h index b69dd22..470de52 100644 --- a/server/imserver/constant.h +++ b/server/imserver/constant.h @@ -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"; diff --git a/server/imserver/guild.cc b/server/imserver/guild.cc index d1facd1..027198d 100644 --- a/server/imserver/guild.cc +++ b/server/imserver/guild.cc @@ -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 + ); } } diff --git a/server/imserver/synchelper.cc b/server/imserver/synchelper.cc index 93232df..a3ba937 100644 --- a/server/imserver/synchelper.cc +++ b/server/imserver/synchelper.cc @@ -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); + } + ); + } +} diff --git a/server/imserver/synchelper.h b/server/imserver/synchelper.h index aca25e2..afd1a88 100644 --- a/server/imserver/synchelper.h +++ b/server/imserver/synchelper.h @@ -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 void BroadcastIMConnMsg(T& msg)