From 991674071515ecb162678ac76a7f3a4ab5482d26 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 1 Jul 2020 14:40:29 +0800 Subject: [PATCH] 1 --- server/imserver/asynctaskmgr.cc | 96 ++++++++++++++++++++------ server/imserver/asynctaskmgr.h | 9 +-- server/imserver/player.cc | 6 +- server/tools/protobuild/ss_proto.proto | 10 +++ 4 files changed, 94 insertions(+), 27 deletions(-) diff --git a/server/imserver/asynctaskmgr.cc b/server/imserver/asynctaskmgr.cc index 0670931..62ff8fb 100644 --- a/server/imserver/asynctaskmgr.cc +++ b/server/imserver/asynctaskmgr.cc @@ -10,38 +10,52 @@ #include "cs_proto.pb.h" #include "ss_proto.pb.h" -struct QueryUserStatusTask +struct AsyncTaskContext { long long seqid = 0; std::string account_id; int socket_handle = 0; Player* hum = nullptr; + + bool IsValid() + { + if (PlayerMgr::Instance()->GetPlayerByAccountId(account_id) != hum) { + return false; + } + if (hum->socket_handle != socket_handle) { + return false; + } + return true; + } +}; + +struct QueryUserStatusTask +{ + AsyncTaskContext context; std::map users; void Done() { - if (PlayerMgr::Instance()->GetPlayerByAccountId(account_id) != hum) { - return; + if (context.IsValid()) { + cs::SMQueryUserStatus msg; + for (auto& pair : users) { + cs::MFUserStatus* user = msg.add_status_list(); + user->set_account_id(pair.first); + user->set__online(pair.second ? 1 : 0); + } + context.hum->SendMsg(msg); } - if (hum->socket_handle != socket_handle) { - return; - } - cs::SMQueryUserStatus msg; - for (auto& pair : users) { - cs::MFUserStatus* user = msg.add_status_list(); - user->set_account_id(pair.first); - user->set__online(pair.second ? 1 : 0); - } - hum->SendMsg(msg); } }; struct RecommandFriendTask { + AsyncTaskContext context; void Done() { - + if (context.IsValid()) { + } } }; @@ -58,9 +72,6 @@ void AsyncTaskMgr::UnInit() void AsyncTaskMgr::CreateQueryUserStatusTask(Player* hum, std::vector& account_ids) { QueryUserStatusTask* task = new QueryUserStatusTask(); - task->account_id = hum->AccountId(); - task->socket_handle = hum->socket_handle; - task->hum = hum; { ss::SS_IM_QueryUserOnlineState msg; hum->FillIMMsgConext(msg.mutable_context()); @@ -72,8 +83,8 @@ void AsyncTaskMgr::CreateQueryUserStatusTask(Player* hum, std::vectorusers[account_id] = false; } - task->seqid = msg.context().seqid(); - query_user_status_tasks_[task->seqid] = task; + FillAsyncTaskContext(hum, &task->context, msg.context().seqid()); + query_user_status_tasks_[task->context.seqid] = task; } a8::Timer::Instance()->AddDeadLineTimer ( @@ -88,7 +99,44 @@ void AsyncTaskMgr::CreateQueryUserStatusTask(Player* hum, std::vectorRemoveQueryUserStatusTask(task->seqid); + AsyncTaskMgr::Instance()->RemoveQueryUserStatusTask(task->context.seqid); + } + ); +} + +void AsyncTaskMgr::CreateRecommandFriendTask(Player* hum) +{ + RecommandFriendTask* task = new RecommandFriendTask(); + { + #if 0 + 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); + + for (auto& account_id : account_ids) { + task->users[account_id] = false; + } + FillAsyncTaskContext(hum, &task->context, msg.context().seqid()); + #endif + recommand_friend_tasks_[task->context.seqid] = task; + } + a8::Timer::Instance()->AddDeadLineTimer + ( + 200, + a8::XParams() + .SetSender(task), + [] (const a8::XParams& param) + { + RecommandFriendTask* task = (RecommandFriendTask*)param.sender.GetUserData(); + task->Done(); + }, + [] (const a8::XParams& param) + { + RecommandFriendTask* task = (RecommandFriendTask*)param.sender.GetUserData(); + AsyncTaskMgr::Instance()->RemoveRecommandFriendTask(task->context.seqid); } ); } @@ -135,3 +183,11 @@ void AsyncTaskMgr::RemoveRecommandFriendTask(long long seqid) recommand_friend_tasks_.erase(itr); } } + +void AsyncTaskMgr::FillAsyncTaskContext(Player* hum, AsyncTaskContext* context, long long seqid) +{ + context->seqid = seqid; + context->account_id = hum->AccountId(); + context->socket_handle = hum->socket_handle; + context->hum = hum; +} diff --git a/server/imserver/asynctaskmgr.h b/server/imserver/asynctaskmgr.h index a0cc6f7..78b6053 100644 --- a/server/imserver/asynctaskmgr.h +++ b/server/imserver/asynctaskmgr.h @@ -5,14 +5,9 @@ namespace ss class SS_IM_PushUserOnlineState; } -enum AsyncTaskType -{ - kAttQueryUserStatus = 0, - kAttMax -}; - struct QueryUserStatusTask; struct RecommandFriendTask; +struct AsyncTaskContext; class Player; class AsyncTaskMgr : public a8::Singleton { @@ -25,6 +20,7 @@ public: void UnInit(); void CreateQueryUserStatusTask(Player* hum, std::vector& account_ids); + void CreateRecommandFriendTask(Player* hum); void _SS_IM_PushUserOnlineState(f8::MsgHdr& hdr, const ss::SS_IM_PushUserOnlineState& msg); @@ -33,6 +29,7 @@ private: void RemoveQueryUserStatusTask(long long seqid); RecommandFriendTask* GetRecommandFriendTask(long long seqid); void RemoveRecommandFriendTask(long long seqid); + void FillAsyncTaskContext(Player* hum, AsyncTaskContext* context, long long seqid); private: std::map query_user_status_tasks_; diff --git a/server/imserver/player.cc b/server/imserver/player.cc index dfdf2f5..3ddbdc5 100644 --- a/server/imserver/player.cc +++ b/server/imserver/player.cc @@ -401,6 +401,8 @@ void Player::_CMFriendAddBlack(f8::MsgHdr& hdr, const cs::CMFriendAddBlack& msg) SendMsg(notifymsg); } } + cs::SMFriendAddBlack respmsg; + SendMsg(respmsg); } void Player::_CMFriendDeleteBlack(f8::MsgHdr& hdr, const cs::CMFriendDeleteBlack& msg) @@ -416,6 +418,8 @@ void Player::_CMFriendDeleteBlack(f8::MsgHdr& hdr, const cs::CMFriendDeleteBlack black_hash_.erase(friend_data->base_data.account_id); A8_SAFE_DELETE(friend_data); MarkDirty(); + cs::SMFriendDeleteBlack respmsg; + SendMsg(respmsg); } } @@ -430,7 +434,7 @@ void Player::_CMQueryUserStatus(f8::MsgHdr& hdr, const cs::CMQueryUserStatus& ms void Player::_CMRecommandFriend(f8::MsgHdr& hdr, const cs::CMRecommandFriend& msg) { - + AsyncTaskMgr::Instance()->CreateRecommandFriendTask(this); } void Player::_CMSendChatMsg(f8::MsgHdr& hdr, const cs::CMSendChatMsg& msg) diff --git a/server/tools/protobuild/ss_proto.proto b/server/tools/protobuild/ss_proto.proto index 2921664..ad554e0 100755 --- a/server/tools/protobuild/ss_proto.proto +++ b/server/tools/protobuild/ss_proto.proto @@ -258,3 +258,13 @@ message SS_IM_OnUserOffline { repeated string account_ids = 3; } + +message SS_IM_RandomUsersRequest +{ + repeated string exclude_account_ids = 3; +} + +message SS_IM_RandomUsersResponse +{ + repeated string exclude_account_ids = 3; +}