diff --git a/server/masterserver/cachemgr.cc b/server/masterserver/cachemgr.cc index bd569d9..b4ede06 100644 --- a/server/masterserver/cachemgr.cc +++ b/server/masterserver/cachemgr.cc @@ -5,6 +5,9 @@ #include "cachemgr.h" #include "app.h" #include "jsondatamgr.h" +#include "typeconvert.h" +#include "svrmgr.h" +#include "IMListener.h" void CacheMgr::Init() { @@ -18,17 +21,33 @@ void CacheMgr::UnInit() void CacheMgr::_SS_IM_UserOnline(f8::MsgHdr& hdr, const ss::SS_IM_UserOnline& msg) { - for (auto& user_info : msg.user_infos()) { - unsigned int code = a8::openssl::Crc32 - ( - (unsigned char*)user_info.base_data().account_id().data(), - user_info.base_data().account_id().size() - ); - int instance_id = code % JsonDataMgr::Instance()->GetMasterSvrNum() + 1; - if (App::Instance()->instance_id == instance_id) { - Friend* friend_data = GetFriendData(user_info.base_data().account_id()); - if (friend_data) { - + SvrNode* svr_node = SvrMgr::Instance()->GetNodeBySocket(hdr.socket_handle); + if (svr_node) { + for (auto& user_info : msg.user_infos()) { + unsigned int crc32_code = a8::openssl::Crc32 + ( + (unsigned char*)user_info.base_data().account_id().data(), + user_info.base_data().account_id().size() + ); + int instance_id = crc32_code % JsonDataMgr::Instance()->GetMasterSvrNum() + 1; + if (App::Instance()->instance_id == instance_id) { + Friend* friend_data = GetFriendData(user_info.base_data().account_id()); + if (!friend_data) { + friend_data = new Friend(); + list_add_tail(&friend_data->human_entry, &svr_node->human_list); + friend_data->svr_node = svr_node; + friend_hash_[user_info.base_data().account_id()] = friend_data; + } else { + if (friend_data->svr_node != svr_node) { + if (!list_empty(&friend_data->human_entry)) { + list_del_init(&friend_data->human_entry); + } + list_add_tail(&friend_data->human_entry, &svr_node->human_list); + friend_data->svr_node = svr_node; + } + } + TypeConvert::Convert(user_info.base_data(), friend_data->base_data); + TypeConvert::Convert(user_info.temp_custom_data(), friend_data->temp_custom_data); } } } @@ -36,12 +55,33 @@ void CacheMgr::_SS_IM_UserOnline(f8::MsgHdr& hdr, const ss::SS_IM_UserOnline& ms void CacheMgr::_SS_IM_UserOffline(f8::MsgHdr& hdr, const ss::SS_IM_UserOffline& msg) { - + SvrNode* svr_node = SvrMgr::Instance()->GetNodeBySocket(hdr.socket_handle); + if (svr_node) { + for (const std::string& account_id : msg.account_ids()) { + Friend* friend_data = GetFriendData(account_id); + if (friend_data) { + friend_data->base_data.online = false; + if (!list_empty(&friend_data->human_entry)) { + list_del_init(&friend_data->human_entry); + } + friend_data->svr_node = nullptr; + } + } + } } void CacheMgr::_SS_IM_PullUserList(f8::MsgHdr& hdr, const ss::SS_IM_PullUserList& msg) { - + ss::SS_MS_PushUserList respmsg; + for (const std::string& account_id : msg.account_ids()) { + Friend* friend_data = GetFriendData(account_id); + if (friend_data) { + auto p = respmsg.add_user_infos(); + TypeConvert::Convert(friend_data->base_data, *p->mutable_base_data()); + TypeConvert::Convert(friend_data->temp_custom_data, *p->mutable_temp_custom_data()); + } + } + IMListener::Instance()->SendMsg(hdr.socket_handle, respmsg); } Friend* CacheMgr::GetFriendData(const std::string& account_id) diff --git a/server/masterserver/svrmgr.h b/server/masterserver/svrmgr.h index cbeba2b..46761ca 100644 --- a/server/masterserver/svrmgr.h +++ b/server/masterserver/svrmgr.h @@ -42,6 +42,7 @@ class SvrMgr : public a8::Singleton void ___GSList(f8::JsonHttpRequest* request); + SvrNode* GetNodeBySocket(int socket_handle); void OnIMServerDisconnect(a8::XParams& param); private: @@ -49,7 +50,6 @@ class SvrMgr : public a8::Singleton void RearrangeNode(); void ClearTimeOutNode(); SvrNode* GetNodeByKey(const std::string& key); - SvrNode* GetNodeBySocket(int socket_handle); void RemoveNode(SvrNode* node); private: diff --git a/server/masterserver/typeconvert.cc b/server/masterserver/typeconvert.cc index 79dad39..dcdacb3 100644 --- a/server/masterserver/typeconvert.cc +++ b/server/masterserver/typeconvert.cc @@ -14,11 +14,22 @@ void TypeConvert::Convert(const ss::MFBaseUserDataDB& base_data_pb, const BaseUs } +void TypeConvert::Convert(const cs::MFBaseUserData& base_data_pb, BaseUserData& base_data) +{ + +} + void TypeConvert::Convert(const BaseUserData& base_data, cs::MFBaseUserData& base_data_pb) { } +void TypeConvert::Convert(const cs::MFUserTempCustomData& tmpe_custom_data_pb, + UserTempCustomData& temp_custom_data) +{ + +} + void TypeConvert::Convert(const UserTempCustomData& temp_custom_data, cs::MFUserTempCustomData& tmpe_custom_data_pb) { diff --git a/server/masterserver/typeconvert.h b/server/masterserver/typeconvert.h index 342483f..174f26f 100644 --- a/server/masterserver/typeconvert.h +++ b/server/masterserver/typeconvert.h @@ -16,7 +16,10 @@ class TypeConvert public: static void Convert(const BaseUserData& base_data, ss::MFBaseUserDataDB& base_data_pb); static void Convert(const ss::MFBaseUserDataDB& base_data_pb, const BaseUserData& base_data); + static void Convert(const cs::MFBaseUserData& base_data_pb, BaseUserData& base_data); static void Convert(const BaseUserData& base_data, cs::MFBaseUserData& base_data_pb); + static void Convert(const cs::MFUserTempCustomData& tmpe_custom_data_pb, + UserTempCustomData& temp_custom_data); static void Convert(const UserTempCustomData& temp_custom_data, cs::MFUserTempCustomData& tmpe_custom_data_pb); }; diff --git a/server/masterserver/types.h b/server/masterserver/types.h index d5a5e84..0f4465c 100755 --- a/server/masterserver/types.h +++ b/server/masterserver/types.h @@ -36,7 +36,6 @@ struct Friend { BaseUserData base_data; UserTempCustomData temp_custom_data; - unsigned int crc32_code = 0; list_head human_entry; struct SvrNode* svr_node = nullptr;