This commit is contained in:
aozhiwei 2020-06-24 13:04:59 +08:00
parent f87ade8108
commit 9178841c23
7 changed files with 96 additions and 10 deletions

View File

@ -407,6 +407,9 @@ void App::ProcessIMServerMsg(f8::MsgHdr& hdr)
case HID_SyncHelper: case HID_SyncHelper:
ProcessNetMsg(handler, SyncHelper::Instance(), hdr); ProcessNetMsg(handler, SyncHelper::Instance(), hdr);
break; break;
case HID_PlayerMgr:
ProcessNetMsg(handler, PlayerMgr::Instance(), hdr);
break;
default: default:
{ {
} }

View File

@ -40,6 +40,7 @@ void HandlerMgr::RegisterNetMsgHandlers()
RegisterNetMsgHandler(&immsghandler, &SyncHelper::_SS_IM_FriendAgreeResponse); RegisterNetMsgHandler(&immsghandler, &SyncHelper::_SS_IM_FriendAgreeResponse);
RegisterNetMsgHandler(&immsghandler, &SyncHelper::_SS_IM_FriendDeleteResponse); RegisterNetMsgHandler(&immsghandler, &SyncHelper::_SS_IM_FriendDeleteResponse);
RegisterNetMsgHandler(&immsghandler, &PlayerMgr::_SS_IM_PushUserOnlineState);
RegisterNetMsgHandler(&mscmsghandler, &PlayerMgr::_SS_MS_PushUserList); RegisterNetMsgHandler(&mscmsghandler, &PlayerMgr::_SS_MS_PushUserList);
RegisterNetMsgHandler(&mscmsghandler, &GroupMgr::_SS_MS_LoadGroup); RegisterNetMsgHandler(&mscmsghandler, &GroupMgr::_SS_MS_LoadGroup);
@ -57,7 +58,7 @@ void HandlerMgr::RegisterNetMsgHandlers()
RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_IM_OnUserOnline); RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_IM_OnUserOnline);
RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_IM_OnUserOffline); RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_IM_OnUserOffline);
RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_IM_QueryUserOnlineState); RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_IM_QueryUserOnlineState);
RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_IM_PushUserOnlineState);
RegisterNetMsgHandler(&wsmsghandler, &WSListener::_SS_Ping); RegisterNetMsgHandler(&wsmsghandler, &WSListener::_SS_Ping);

View File

@ -31,7 +31,6 @@ void Player::Init()
(unsigned char*)myself.base_data.account_id.data(), (unsigned char*)myself.base_data.account_id.data(),
myself.base_data.account_id.size() myself.base_data.account_id.size()
); );
NotifyOnline();
a8::Timer::Instance()->AddRepeatTimerAndAttach a8::Timer::Instance()->AddRepeatTimerAndAttach
( (
1000 * 3 + (rand() % 3000), 1000 * 3 + (rand() % 3000),
@ -49,6 +48,7 @@ void Player::Init()
} }
RecalcRedPoint(); RecalcRedPoint();
RefreshFriendData(); RefreshFriendData();
NotifyOnline();
} }
void Player::UnInit() void Player::UnInit()
@ -1132,7 +1132,25 @@ void Player::ClearApplyByTarget(const std::string& target_id)
void Player::RefreshFriendData() 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() void Player::RemoveHandledApply()
@ -1169,3 +1187,62 @@ void Player::QueryUserOnline(std::vector<std::string> account_ids)
} }
SendSSMsg(myself, msg); 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
);
}
}
}

View File

@ -99,6 +99,7 @@ class Player
void NotifyUserInfoUpdate(Friend* friend_data); void NotifyUserInfoUpdate(Friend* friend_data);
void FillIMMsgConext(ss::MFIMMsgConext* context); void FillIMMsgConext(ss::MFIMMsgConext* context);
void Update(long long tick); void Update(long long tick);
void FillMFUserInfo(cs::MFUserInfo* user_info);
const std::string AccountId(); const std::string AccountId();
const std::string SessionId(); const std::string SessionId();
@ -106,7 +107,6 @@ class Player
private: private:
void FillFriendList(::google::protobuf::RepeatedPtrField< ::cs::MFUserInfo >* friend_list); 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 ForwardGroupCMMsg(f8::MsgHdr& hdr, long long hash_code);
void SaveToDB(a8::XParams param, f8::AsyncDBOnOkFunc on_ok, f8::AsyncDBOnErrorFunc on_error); void SaveToDB(a8::XParams param, f8::AsyncDBOnOkFunc on_ok, f8::AsyncDBOnErrorFunc on_error);
Friend* GetFriendById(const std::string& friend_id); Friend* GetFriendById(const std::string& friend_id);
@ -136,6 +136,7 @@ private:
void RefreshFriendData(); void RefreshFriendData();
void RemoveHandledApply(); void RemoveHandledApply();
void QueryUserOnline(std::vector<std::string> account_ids); void QueryUserOnline(std::vector<std::string> account_ids);
void QueryUserFromDB();
private: private:
bool dirty_ = false; bool dirty_ = false;

View File

@ -11,6 +11,7 @@
#include "app.h" #include "app.h"
#include "gamelog.h" #include "gamelog.h"
#include "IMListener.h" #include "IMListener.h"
#include "typeconvert.h"
#include "framework/cpp/utils.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; ss::SS_IM_PushUserOnlineState respmsg;
for (auto& account_id : msg.account_ids()) { for (auto& account_id : msg.account_ids()) {
if (GetPlayerByAccountId(account_id)) { Player* hum = GetPlayerByAccountId(account_id);
respmsg.add_online_account_ids(account_id); if (hum) {
hum->FillMFUserInfo(respmsg.add_user_infos());
} }
} }
IMListener::Instance()->SendMsg(hdr.socket_handle, respmsg); 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) void PlayerMgr::_SS_IM_PushUserOnlineState(f8::MsgHdr& hdr, const ss::SS_IM_PushUserOnlineState& msg)
{ {
for (auto& account_id : msg.online_account_ids()) { for (auto& user_info : msg.user_infos()) {
auto itr = watch_players_.find(account_id); auto itr = watch_players_.find(user_info.base_data().account_id());
if (itr != watch_players_.end()) { if (itr != watch_players_.end()) {
struct Friend *node, *tmp; struct Friend *node, *tmp;
list_for_each_entry_safe(node, tmp, &itr->second, watch_node) { list_for_each_entry_safe(node, tmp, &itr->second, watch_node) {
if (!node->base_data.online) { 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); node->hum->NotifyUserInfoUpdate(node);
} }
} }

View File

@ -58,6 +58,7 @@ void TypeConvert::Convert(const cs::MFBaseUserData& base_data_pb, BaseUserData&
base_data.nickname = base_data_pb.nickname(); base_data.nickname = base_data_pb.nickname();
base_data.avatar_url = base_data_pb.avatar_url(); base_data.avatar_url = base_data_pb.avatar_url();
base_data.sex = base_data_pb.sex(); base_data.sex = base_data_pb.sex();
base_data.online = base_data_pb._online();
#if 0 #if 0
base_data.group_id = base_data_pb.group_id(); base_data.group_id = base_data_pb.group_id();
#endif #endif

View File

@ -242,7 +242,7 @@ message SS_IM_QueryUserOnlineState
message SS_IM_PushUserOnlineState message SS_IM_PushUserOnlineState
{ {
repeated string online_account_ids = 3; repeated cs.MFUserInfo user_infos = 1;
} }
message SS_IM_OnUserOnline message SS_IM_OnUserOnline