From 191c12cd0336ece55f566652a517db1fa8b50f0f Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 30 Jun 2020 17:55:17 +0800 Subject: [PATCH] 1 --- server/imserver/app.cc | 3 ++ server/imserver/asynctaskmgr.cc | 46 ++++++++++++++++++++++++++ server/imserver/asynctaskmgr.h | 32 ++++++++++++++++++ server/imserver/player.cc | 9 +++-- server/imserver/playermgr.cc | 2 ++ server/tools/protobuild/ss_proto.proto | 4 ++- 6 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 server/imserver/asynctaskmgr.cc create mode 100644 server/imserver/asynctaskmgr.h diff --git a/server/imserver/app.cc b/server/imserver/app.cc index d6128b9..2ab65a0 100644 --- a/server/imserver/app.cc +++ b/server/imserver/app.cc @@ -25,6 +25,7 @@ #include "synchelper.h" #include "perfmonitor.h" #include "gamelog.h" +#include "asynctaskmgr.h" #include "MSConnMgr.h" #include "IMConnMgr.h" @@ -101,6 +102,7 @@ bool App::Init(int argc, char* argv[]) DBEngine::Instance()->Init(); DBHelper::Instance()->Init(); SyncHelper::Instance()->Init(); + AsyncTaskMgr::Instance()->Init(); a8::UdpLog::Instance()->Info("friend_imserver starting instance_id:%d pid:%d ", { @@ -135,6 +137,7 @@ bool App::Init(int argc, char* argv[]) void App::UnInit() { a8::XPrintf("friend_imserver terminating instance_id:%d pid:%d\n", {instance_id, getpid()}); + AsyncTaskMgr::Instance()->UnInit(); SyncHelper::Instance()->UnInit(); DBHelper::Instance()->UnInit(); DBEngine::Instance()->UnInit(); diff --git a/server/imserver/asynctaskmgr.cc b/server/imserver/asynctaskmgr.cc new file mode 100644 index 0000000..b73134e --- /dev/null +++ b/server/imserver/asynctaskmgr.cc @@ -0,0 +1,46 @@ +#include "precompile.h" + +#include "asynctaskmgr.h" +#include "app.h" +#include "player.h" + +#include "cs_proto.pb.h" +#include "ss_proto.pb.h" + +struct QueryUserStatusTask +{ + std::vector account_ids; +}; + +void AsyncTaskMgr::Init() +{ + +} + +void AsyncTaskMgr::UnInit() +{ + +} + +void AsyncTaskMgr::CreateQueryUserStatusTask(Player* hum, std::vector& account_ids) +{ + long long seqid = App::Instance()->NewSeqId(); + QueryUserStatusTask* task = new QueryUserStatusTask(); + task->account_ids = account_ids; + query_user_status_tasks_[seqid] = task; + + { + ss::SS_IM_QueryUserOnlineState msg; + hum->FillIMMsgConext(msg.mutable_context()); + for (auto& account_id : account_ids) { + msg.add_account_ids(account_id); + } + hum->SendSSMsg(hum->myself, msg); + } + +} + +void AsyncTaskMgr::_SS_IM_PushUserOnlineState(f8::MsgHdr& hdr, const ss::SS_IM_PushUserOnlineState& msg) +{ + +} diff --git a/server/imserver/asynctaskmgr.h b/server/imserver/asynctaskmgr.h new file mode 100644 index 0000000..f485a77 --- /dev/null +++ b/server/imserver/asynctaskmgr.h @@ -0,0 +1,32 @@ +#pragma once + +namespace ss +{ + class SS_IM_PushUserOnlineState; +} + +enum AsyncTaskType +{ + kAttQueryUserStatus = 0, + kAttMax +}; + +struct QueryUserStatusTask; +class Player; +class AsyncTaskMgr : public a8::Singleton +{ + private: + AsyncTaskMgr() {}; + friend class a8::Singleton; + +public: + void Init(); + void UnInit(); + + void CreateQueryUserStatusTask(Player* hum, std::vector& account_ids); + + void _SS_IM_PushUserOnlineState(f8::MsgHdr& hdr, const ss::SS_IM_PushUserOnlineState& msg); + +private: + std::map query_user_status_tasks_; +}; diff --git a/server/imserver/player.cc b/server/imserver/player.cc index cd1925b..b7c05d5 100644 --- a/server/imserver/player.cc +++ b/server/imserver/player.cc @@ -16,6 +16,7 @@ #include "typeconvert.h" #include "playermgr.h" #include "gamelog.h" +#include "asynctaskmgr.h" #include "IMConn.h" #include "IMConnMgr.h" @@ -344,7 +345,6 @@ void Player::_CMFriendDelete(f8::MsgHdr& hdr, const cs::CMFriendDelete& msg) void Player::_CMFriendBlackList(f8::MsgHdr& hdr, const cs::CMFriendBlackList& msg) { - } void Player::_CMFriendAddBlack(f8::MsgHdr& hdr, const cs::CMFriendAddBlack& msg) @@ -359,7 +359,11 @@ void Player::_CMFriendDeleteBlack(f8::MsgHdr& hdr, const cs::CMFriendDeleteBlack void Player::_CMQueryUserStatus(f8::MsgHdr& hdr, const cs::CMQueryUserStatus& msg) { - + std::vector account_ids; + for (auto& account_id : msg.user_list()) { + account_ids.push_back(account_id); + } + AsyncTaskMgr::Instance()->CreateQueryUserStatusTask(this, account_ids); } void Player::_CMRecommandFriend(f8::MsgHdr& hdr, const cs::CMRecommandFriend& msg) @@ -756,6 +760,7 @@ void Player::NotifyOnline() } { ss::SS_IM_QueryUserOnlineState msg; + FillIMMsgConext(msg.mutable_context()); for (auto& pair : friend_hash_) { msg.add_account_ids(pair.second->base_data.account_id); } diff --git a/server/imserver/playermgr.cc b/server/imserver/playermgr.cc index d0cf602..06ed6b6 100644 --- a/server/imserver/playermgr.cc +++ b/server/imserver/playermgr.cc @@ -13,6 +13,7 @@ #include "IMListener.h" #include "typeconvert.h" #include "perfmonitor.h" +#include "asynctaskmgr.h" #include "framework/cpp/utils.h" @@ -126,6 +127,7 @@ 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) { + AsyncTaskMgr::Instance()->_SS_IM_PushUserOnlineState(hdr, msg); for (auto& user_info : msg.user_infos()) { auto itr = watch_players_.find(user_info.base_data().account_id()); if (itr != watch_players_.end()) { diff --git a/server/tools/protobuild/ss_proto.proto b/server/tools/protobuild/ss_proto.proto index b0d94ff..e10e41a 100755 --- a/server/tools/protobuild/ss_proto.proto +++ b/server/tools/protobuild/ss_proto.proto @@ -238,12 +238,14 @@ message SS_IM_FriendApply message SS_IM_QueryUserOnlineState { + optional MFIMMsgConext context = 1; repeated string account_ids = 3; } message SS_IM_PushUserOnlineState { - repeated cs.MFUserInfo user_infos = 1; + optional MFIMMsgConext context = 1; + repeated cs.MFUserInfo user_infos = 2; } message SS_IM_OnUserOnline