diff --git a/server/imserver/player.cc b/server/imserver/player.cc index 8efa3b3..1f78667 100644 --- a/server/imserver/player.cc +++ b/server/imserver/player.cc @@ -169,6 +169,7 @@ void Player::_CMFriendApply(f8::MsgHdr& hdr, const cs::CMFriendApply& msg) } ++role_data.today_apply_times; SendMsg(respmsg); + QueryUserOnline({msg.friend_id()}); DBHelper::Instance()->AddFriendApply(this, msg.friend_id()); } @@ -488,6 +489,7 @@ void Player::_SS_IM_FriendAgreeRequest(f8::MsgHdr& hdr, const ss::SS_IM_FriendAg delete friendobj; return; } + QueryUserOnline({friendobj->base_data.account_id}); } RemoveHandledApply(); f8::MsgHdr* hdr_copy = hdr.Clone(); @@ -1060,6 +1062,7 @@ void Player::OnFriendAgreeEvent(Event& event) user_db.ParseFromString(event.event_data); TypeConvert::Convert(user_db.base_data(), friendobj->base_data); } + QueryUserOnline({friendobj->base_data.account_id}); friendobj->base_data.account_id = event.sender_id; AddFriend(friendobj); } @@ -1195,3 +1198,12 @@ void Player::RemoveHandledApply() } } } + +void Player::QueryUserOnline(std::vector account_ids) +{ + ss::SS_IM_QueryUserOnlineState msg; + for (auto& account_id : account_ids) { + msg.add_account_ids(account_id); + } + SendSSMsg(myself, msg); +} diff --git a/server/imserver/player.h b/server/imserver/player.h index 8c2f9b7..4518921 100644 --- a/server/imserver/player.h +++ b/server/imserver/player.h @@ -135,6 +135,7 @@ private: void ClearApplyByTarget(const std::string& target_id); void RefreshFriendData(); void RemoveHandledApply(); + void QueryUserOnline(std::vector account_ids); private: bool dirty_ = false; diff --git a/server/imserver/playermgr.cc b/server/imserver/playermgr.cc index 31a4506..c840bb6 100644 --- a/server/imserver/playermgr.cc +++ b/server/imserver/playermgr.cc @@ -10,6 +10,7 @@ #include "WSListener.h" #include "app.h" #include "gamelog.h" +#include "IMListener.h" #include "framework/cpp/utils.h" @@ -83,22 +84,57 @@ void PlayerMgr::_SS_IM_FriendApply(f8::MsgHdr& hdr, const ss::SS_IM_FriendApply& void PlayerMgr::_SS_IM_OnUserOnline(f8::MsgHdr& hdr, const ss::SS_IM_OnUserOnline& msg) { - + for (auto& account_id : msg.account_ids()) { + auto itr = watch_players_.find(account_id); + if (itr != watch_players_.end()) { + struct Friend *node, *tmp; + list_for_each_entry_safe(node, tmp, &itr->second, watch_node) { + node->base_data.online = true; + node->hum->NotifyUserInfoUpdate(node); + } + } + } } void PlayerMgr::_SS_IM_OnUserOffline(f8::MsgHdr& hdr, const ss::SS_IM_OnUserOffline& msg) { - + for (auto& account_id : msg.account_ids()) { + auto itr = watch_players_.find(account_id); + if (itr != watch_players_.end()) { + struct Friend *node, *tmp; + list_for_each_entry_safe(node, tmp, &itr->second, watch_node) { + node->base_data.online = false; + node->hum->NotifyUserInfoUpdate(node); + } + } + } } void PlayerMgr::_SS_IM_QueryUserOnlineState(f8::MsgHdr& hdr, const ss::SS_IM_QueryUserOnlineState& msg) { - + ss::SS_IM_PushUserOnlineState respmsg; + for (auto& account_id : msg.account_ids()) { + if (GetPlayerByAccountId(account_id)) { + respmsg.add_online_account_ids(account_id); + } + } + IMListener::Instance()->SendMsg(hdr.socket_handle, respmsg); } 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); + 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; + node->hum->NotifyUserInfoUpdate(node); + } + } + } + } } void PlayerMgr::_SS_IM_UpdateUserInfo(f8::MsgHdr& hdr, const ss::SS_IM_UpdateUserInfo& msg)