From 9178841c2356330c272ac687a681784669580e2e Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 24 Jun 2020 13:04:59 +0800 Subject: [PATCH] 1 --- server/imserver/app.cc | 3 + server/imserver/handlermgr.cc | 3 +- server/imserver/player.cc | 81 +++++++++++++++++++++++++- server/imserver/player.h | 3 +- server/imserver/playermgr.cc | 13 +++-- server/imserver/typeconvert.cc | 1 + server/tools/protobuild/ss_proto.proto | 2 +- 7 files changed, 96 insertions(+), 10 deletions(-) diff --git a/server/imserver/app.cc b/server/imserver/app.cc index ed70e25..d6128b9 100644 --- a/server/imserver/app.cc +++ b/server/imserver/app.cc @@ -407,6 +407,9 @@ void App::ProcessIMServerMsg(f8::MsgHdr& hdr) case HID_SyncHelper: ProcessNetMsg(handler, SyncHelper::Instance(), hdr); break; + case HID_PlayerMgr: + ProcessNetMsg(handler, PlayerMgr::Instance(), hdr); + break; default: { } diff --git a/server/imserver/handlermgr.cc b/server/imserver/handlermgr.cc index 3842225..c5d57c1 100644 --- a/server/imserver/handlermgr.cc +++ b/server/imserver/handlermgr.cc @@ -40,6 +40,7 @@ void HandlerMgr::RegisterNetMsgHandlers() RegisterNetMsgHandler(&immsghandler, &SyncHelper::_SS_IM_FriendAgreeResponse); RegisterNetMsgHandler(&immsghandler, &SyncHelper::_SS_IM_FriendDeleteResponse); + RegisterNetMsgHandler(&immsghandler, &PlayerMgr::_SS_IM_PushUserOnlineState); RegisterNetMsgHandler(&mscmsghandler, &PlayerMgr::_SS_MS_PushUserList); RegisterNetMsgHandler(&mscmsghandler, &GroupMgr::_SS_MS_LoadGroup); @@ -57,7 +58,7 @@ void HandlerMgr::RegisterNetMsgHandlers() RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_IM_OnUserOnline); RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_IM_OnUserOffline); RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_IM_QueryUserOnlineState); - RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_IM_PushUserOnlineState); + RegisterNetMsgHandler(&wsmsghandler, &WSListener::_SS_Ping); diff --git a/server/imserver/player.cc b/server/imserver/player.cc index f7dee6a..91a4d76 100644 --- a/server/imserver/player.cc +++ b/server/imserver/player.cc @@ -31,7 +31,6 @@ void Player::Init() (unsigned char*)myself.base_data.account_id.data(), myself.base_data.account_id.size() ); - NotifyOnline(); a8::Timer::Instance()->AddRepeatTimerAndAttach ( 1000 * 3 + (rand() % 3000), @@ -49,6 +48,7 @@ void Player::Init() } RecalcRedPoint(); RefreshFriendData(); + NotifyOnline(); } void Player::UnInit() @@ -1132,7 +1132,25 @@ void Player::ClearApplyByTarget(const std::string& target_id) void Player::RefreshFriendData() { - + { + ss::SS_IM_QueryUserOnlineState msg; + for (auto& pair : friend_hash_) { + msg.add_account_ids(pair.second->base_data.account_id); + } + SendSSMsg(myself, msg); + } + a8::Timer::Instance()->AddDeadLineTimerAndAttach + ( + 1000 * 3, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Player* hum = (Player*)param.sender.GetUserData(); + hum->QueryUserFromDB(); + }, + &timer_attacher.timer_list_ + ); } void Player::RemoveHandledApply() @@ -1169,3 +1187,62 @@ void Player::QueryUserOnline(std::vector account_ids) } SendSSMsg(myself, msg); } + +void Player::QueryUserFromDB() +{ + auto on_ok = + [] (a8::XParams& param, const f8::DataSet* data_set) + { + Player* hum = PlayerMgr::Instance()->GetPlayerByAccountId(param.sender.GetString()); + if (hum && data_set && !data_set->empty()) { + for (auto& row : *data_set) { + std::string account_id = row[0]; + std::string nickname = row[1]; + std::string avatar_url = row[2]; + int sex = a8::XValue(row[3]); + long long data_version1 = a8::XValue(row[4]); + long long user_value1 = a8::XValue(row[5]); + long long user_value2 = a8::XValue(row[6]); + long long user_value3 = a8::XValue(row[7]); + Friend* friend_data = hum->GetFriendById(account_id); + if (friend_data && friend_data->base_data.base_data_version != data_version1) { + friend_data->base_data.nickname = nickname; + friend_data->base_data.avatar_url = avatar_url; + friend_data->base_data.sex = sex; + friend_data->base_data.base_data_version = data_version1; + friend_data->base_data.user_value1 = user_value1; + friend_data->base_data.user_value2 = user_value2; + friend_data->base_data.user_value3 = user_value3; + hum->NotifyUserInfoUpdate(friend_data); + } + } + } + }; + auto on_error = + [] (a8::XParams& param, int error_code, const std::string& error_msg) + { + }; + + for (auto& pair : friend_hash_) { + Friend* friend_data = pair.second; + if (!friend_data->base_data.online) { + a8::XObject conn_info = DBEngine::Instance()->GetConnInfo(friend_data->crc32_code); + DBEngine::Instance()->ExecAsyncQuery + ( + conn_info, + "SELECT account_id, nickname, avatar_url, sex, " + " data_version1, user_value1, user_value2, user_value3 " + "FROM `user` WHERE account_id='%s';", + { + friend_data->base_data.account_id + }, + a8::XParams() + .SetSender(myself.base_data.account_id) + .SetParam1(friend_data->base_data.account_id), + on_ok, + on_error, + friend_data->crc32_code + ); + } + } +} diff --git a/server/imserver/player.h b/server/imserver/player.h index 4518921..218d833 100644 --- a/server/imserver/player.h +++ b/server/imserver/player.h @@ -99,6 +99,7 @@ class Player void NotifyUserInfoUpdate(Friend* friend_data); void FillIMMsgConext(ss::MFIMMsgConext* context); void Update(long long tick); + void FillMFUserInfo(cs::MFUserInfo* user_info); const std::string AccountId(); const std::string SessionId(); @@ -106,7 +107,6 @@ class Player private: void FillFriendList(::google::protobuf::RepeatedPtrField< ::cs::MFUserInfo >* friend_list); - void FillMFUserInfo(cs::MFUserInfo* user_info); void ForwardGroupCMMsg(f8::MsgHdr& hdr, long long hash_code); void SaveToDB(a8::XParams param, f8::AsyncDBOnOkFunc on_ok, f8::AsyncDBOnErrorFunc on_error); Friend* GetFriendById(const std::string& friend_id); @@ -136,6 +136,7 @@ private: void RefreshFriendData(); void RemoveHandledApply(); void QueryUserOnline(std::vector account_ids); + void QueryUserFromDB(); private: bool dirty_ = false; diff --git a/server/imserver/playermgr.cc b/server/imserver/playermgr.cc index 0c685c2..d298447 100644 --- a/server/imserver/playermgr.cc +++ b/server/imserver/playermgr.cc @@ -11,6 +11,7 @@ #include "app.h" #include "gamelog.h" #include "IMListener.h" +#include "typeconvert.h" #include "framework/cpp/utils.h" @@ -114,8 +115,9 @@ void PlayerMgr::_SS_IM_QueryUserOnlineState(f8::MsgHdr& hdr, const ss::SS_IM_Que { ss::SS_IM_PushUserOnlineState respmsg; for (auto& account_id : msg.account_ids()) { - if (GetPlayerByAccountId(account_id)) { - respmsg.add_online_account_ids(account_id); + Player* hum = GetPlayerByAccountId(account_id); + if (hum) { + hum->FillMFUserInfo(respmsg.add_user_infos()); } } IMListener::Instance()->SendMsg(hdr.socket_handle, respmsg); @@ -123,13 +125,14 @@ void PlayerMgr::_SS_IM_QueryUserOnlineState(f8::MsgHdr& hdr, const ss::SS_IM_Que void PlayerMgr::_SS_IM_PushUserOnlineState(f8::MsgHdr& hdr, const ss::SS_IM_PushUserOnlineState& msg) { - for (auto& account_id : msg.online_account_ids()) { - auto itr = watch_players_.find(account_id); + for (auto& user_info : msg.user_infos()) { + auto itr = watch_players_.find(user_info.base_data().account_id()); if (itr != watch_players_.end()) { struct Friend *node, *tmp; list_for_each_entry_safe(node, tmp, &itr->second, watch_node) { if (!node->base_data.online) { - node->base_data.online = true; + TypeConvert::Convert(user_info.base_data(), node->base_data); + TypeConvert::Convert(user_info.temp_custom_data(), node->temp_custom_data); node->hum->NotifyUserInfoUpdate(node); } } diff --git a/server/imserver/typeconvert.cc b/server/imserver/typeconvert.cc index d06bca0..d6dbd19 100644 --- a/server/imserver/typeconvert.cc +++ b/server/imserver/typeconvert.cc @@ -58,6 +58,7 @@ void TypeConvert::Convert(const cs::MFBaseUserData& base_data_pb, BaseUserData& base_data.nickname = base_data_pb.nickname(); base_data.avatar_url = base_data_pb.avatar_url(); base_data.sex = base_data_pb.sex(); + base_data.online = base_data_pb._online(); #if 0 base_data.group_id = base_data_pb.group_id(); #endif diff --git a/server/tools/protobuild/ss_proto.proto b/server/tools/protobuild/ss_proto.proto index a06923d..581a734 100755 --- a/server/tools/protobuild/ss_proto.proto +++ b/server/tools/protobuild/ss_proto.proto @@ -242,7 +242,7 @@ message SS_IM_QueryUserOnlineState message SS_IM_PushUserOnlineState { - repeated string online_account_ids = 3; + repeated cs.MFUserInfo user_infos = 1; } message SS_IM_OnUserOnline