diff --git a/server/imserver/guild.cc b/server/imserver/guild.cc index cb73a79..3ccc059 100644 --- a/server/imserver/guild.cc +++ b/server/imserver/guild.cc @@ -808,6 +808,14 @@ void Guild::UpdateMemberOffline(const std::string& account_id) } } +void Guild::Active() +{ + if (App::Instance()->nowtime - last_query_member_time_ > 15) { + QueryMemberOnlineState(); + last_query_member_time_ = App::Instance()->nowtime; + } +} + int Guild::GetJobMemberNum(int job) { std::set* members = GetJobMembers(job); @@ -1058,6 +1066,20 @@ void Guild::SendErrorMsg(int socket_handle, const ss::MFIMMsgConext& context, co notifymsg); } +void Guild::QueryMemberOnlineState() +{ + ss::SS_GS_QueryGuildUserOnlineState msg; + msg.set_seqid(App::Instance()->NewUUID()); + msg.set_guild_id(GuildId()); + for (auto& pair : member_hash_) { + GuildMember* member = pair.second; + if (App::Instance()->nowtime - member->last_update_time > 30) { + msg.add_account_ids(member->account_id); + } + } + GuildMgr::Instance()->SendMsg(0, msg); +} + void Guild::GenGuildData(Player* hum, long long guild_id, std::string& guild_data) { ss::MFGuildDB guild_db; diff --git a/server/imserver/guild.h b/server/imserver/guild.h index 660ebbe..ca6314e 100644 --- a/server/imserver/guild.h +++ b/server/imserver/guild.h @@ -37,6 +37,7 @@ public: void UpdateMemberInfo(const cs::MFUserInfo& user_info); void UpdateMemberOnline(const std::string& account_id); void UpdateMemberOffline(const std::string& account_id); + void Active(); private: bool IsFull(); @@ -60,6 +61,7 @@ private: const std::string& guild_members, const std::string& guild_log); void SendErrorMsg(int sokcet_handle, const ss::MFIMMsgConext& context, const std::string& errmsg); + void QueryMemberOnlineState(); private: bool dirty_ = false; @@ -94,6 +96,7 @@ private: int join_cond2_ = 0; int createtime_ = 0; + time_t last_query_member_time_ = 0; a8::TimerAttacher timer_attacher_; public: diff --git a/server/imserver/guildmgr.cc b/server/imserver/guildmgr.cc index cc860de..422daa9 100644 --- a/server/imserver/guildmgr.cc +++ b/server/imserver/guildmgr.cc @@ -44,6 +44,7 @@ public: hdr.offset = 0; hdr.hum = nullptr; hdr.user_data = &forward_msg; + guild->Active(); ProcessNetMsg(handler, guild, hdr); } } @@ -283,3 +284,32 @@ void GuildMgr::ForwardGuildSMMsg(int socket_handle, IMListener::Instance()->SendMsg(socket_handle, msg); } } + +void GuildMgr::SendMsg(int socket_handle, + int msgid, + const ::google::protobuf::Message& msg) +{ + if (socket_handle == 0) { + int packlen = msg.ByteSize(); + char* buff = nullptr; + if (packlen > 0) { + buff = (char*)malloc(packlen); + msg.SerializeToArray(buff, packlen); + } + App::Instance()->AddSocketMsg + ( + SF_IMServer, + 0, + 0, + msgid, + 0, + buff, + packlen + ); + if (buff) { + free(buff); + } + } else { + IMListener::Instance()->SendMsg(socket_handle, msg); + } +} diff --git a/server/imserver/guildmgr.h b/server/imserver/guildmgr.h index d6a3597..3c63b2d 100644 --- a/server/imserver/guildmgr.h +++ b/server/imserver/guildmgr.h @@ -35,6 +35,15 @@ class GuildMgr : public a8::Singleton const ss::MFIMMsgConext& context, int msgid, const ::google::protobuf::Message& smmsg); + template + void SendMsg(int socket_handle, T& msg) + { + static int msgid = f8::Net_GetMessageId(msg); + SendMsg(socket_handle, msgid, msg); + } + void SendMsg(int socket_handle, + int msgid, + const ::google::protobuf::Message& msg); void _SS_IM_ForwardGuildCMMsg(f8::MsgHdr& hdr, const ss::SS_IM_ForwardGuildCMMsg& msg); void _SS_IM_ForwardGuildSMMsg(f8::MsgHdr& hdr, const ss::SS_IM_ForwardGuildSMMsg& msg); void _SS_IM_RefeshGuildMemberInfo(f8::MsgHdr& hdr, const ss::SS_IM_RefeshGuildMemberInfo& msg);