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, kGuildKick = 0,
kGuildQuit = 1, kGuildQuit = 1,
kGuildDismisss = 2 kGuildDismisss = 2,
kGuildUpdate = 3,
}; };
enum GuildMemberUpdateReason enum GuildMemberUpdateReason
@ -71,6 +72,7 @@ enum GuildMemberUpdateReason
kGuildUpdateReasonAgree = 1, kGuildUpdateReasonAgree = 1,
kGuildUpdateReasonSetJob = 2, kGuildUpdateReasonSetJob = 2,
kGuildUpdateReasonInherit = 3, kGuildUpdateReasonInherit = 3,
kGuildUpdateReasonUpdate = 4,
}; };
const char* const PROJ_NAME_FMT = "friend_imserver"; 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()); GuildMember* member = GetMember(forward_msg->context().user_info().base_data().account_id());
if (member) { if (member) {
SyncHelper::Instance()->SyncGuildMemberUpdate(this, member, kGuildUpdateReasonJoin); SyncHelper::Instance()->SyncGuildMemberUpdateOnlyOnline(this, member, kGuildUpdateReasonJoin);
} else { } else {
DBHelper::Instance()->AddGuildApply(this, forward_msg->context().user_info()); 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; cs::SMGuildAgree respmsg;
GuildMember* member = GetMember(msg.apply().base_data().account_id()); GuildMember* member = GetMember(msg.apply().base_data().account_id());
if (member) { if (member) {
SyncHelper::Instance()->SyncGuildMemberUpdate(this, member, kGuildUpdateReasonAgree); SyncHelper::Instance()->SyncGuildMemberUpdateOnlyOnline(this, member, kGuildUpdateReasonAgree);
GuildMgr::Instance()->ForwardGuildSMMsg(hdr.socket_handle, GuildMgr::Instance()->ForwardGuildSMMsg(hdr.socket_handle,
forward_msg->context(), forward_msg->context(),
respmsg); respmsg);
@ -462,6 +462,14 @@ void Guild::_CMGuildQuit(f8::MsgHdr& hdr, const cs::CMGuildQuit& msg)
} }
} }
SaveToDB(); 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, sender, kGuildUpdateReasonSetJob);
SyncHelper::Instance()->SyncGuildMemberUpdate(this, member, kGuildUpdateReasonSetJob);
} }
{ {
auto p = respmsg.add_chged_members(); 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(); member->online = user_info.base_data()._online();
TypeConvert::Convert(user_info.temp_custom_data(), member->temp_custom_data); TypeConvert::Convert(user_info.temp_custom_data(), member->temp_custom_data);
member->last_update_time = App::Instance()->nowtime; 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, GuildMember* member,
int reason) int reason)
{ {
ss::SS_IM_GuildMemberUpdateRequest* notifymsg = new ss::SS_IM_GuildMemberUpdateRequest; InternalSyncGuildMemberUpdate(guild, member, reason, false);
notifymsg->set_seqid(App::Instance()->NewUUID()); }
notifymsg->set_guild_id(guild->GuildId());
notifymsg->set_guild_job(guild->GetMemberJob(member->account_id)); void SyncHelper::SyncGuildMemberUpdateOnlyOnline(Guild* guild,
notifymsg->set_sender_id(member->account_id); GuildMember* member,
notifymsg->set_target_id(member->account_id); int reason)
notifymsg->set_reason(reason); {
BroadcastIMConnMsg(*notifymsg); InternalSyncGuildMemberUpdate(guild, member, reason, true);
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::SyncGuildMemberQuit(Guild* guild, void SyncHelper::SyncGuildMemberQuit(Guild* guild,
@ -137,34 +116,15 @@ void SyncHelper::SyncGuildMemberQuit(Guild* guild,
const std::string& target_id, const std::string& target_id,
int reason) int reason)
{ {
ss::SS_IM_GuildMemberQuitRequest* notifymsg = new ss::SS_IM_GuildMemberQuitRequest; InternalSyncGuildMemberQuit(guild, sender_id, target_id, reason, false);
notifymsg->set_seqid(App::Instance()->NewUUID()); }
notifymsg->set_guild_id(guild->GuildId());
notifymsg->set_sender_id(sender_id); void SyncHelper::SyncGuildMemberQuitOnlyOnline(Guild* guild,
notifymsg->set_target_id(target_id); const std::string& sender_id,
notifymsg->set_reason(reason); const std::string& target_id,
BroadcastIMConnMsg(*notifymsg); int reason)
pending_request_hash_[notifymsg->seqid()] = {
a8::Timer::Instance()->AddDeadLineTimer InternalSyncGuildMemberQuit(guild, sender_id, target_id, reason, true);
(
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);
}
);
} }
void SyncHelper::BroadcastIMConnMsg(int msgid, ::google::protobuf::Message& msg) 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, void SyncGuildMemberUpdate(Guild* guild,
GuildMember* member, GuildMember* member,
int reason); int reason);
void SyncGuildMemberUpdateOnlyOnline(Guild* guild,
GuildMember* member,
int reason);
void SyncGuildMemberQuit(Guild* guild, void SyncGuildMemberQuit(Guild* guild,
const std::string& sender_id, const std::string& sender_id,
const std::string& target_id, const std::string& target_id,
int reason); 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_FriendAgreeResponse(f8::MsgHdr& hdr, const ss::SS_IM_FriendAgreeResponse& msg);
void _SS_IM_FriendDeleteResponse(f8::MsgHdr& hdr, const ss::SS_IM_FriendDeleteResponse& 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_GuildMemberQuitRequest_TimeOut(ss::SS_IM_GuildMemberQuitRequest* msg);
void SS_IM_GuildMemberUpdateRequest_TimeOut(ss::SS_IM_GuildMemberUpdateRequest* 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: public:
template <typename T> template <typename T>
void BroadcastIMConnMsg(T& msg) void BroadcastIMConnMsg(T& msg)