diff --git a/server/imserver/chatmgr.cc b/server/imserver/chatmgr.cc index 25736c3..5eef82a 100644 --- a/server/imserver/chatmgr.cc +++ b/server/imserver/chatmgr.cc @@ -1,5 +1,7 @@ #include "precompile.h" +#include + #include "chatmgr.h" #include "player.h" #include "playermgr.h" @@ -15,6 +17,14 @@ struct ChatedUserRec std::map users; }; +ChatMsgRec::~ChatMsgRec() +{ + for (cs::MFChatMsg* msg : msg_list) { + delete msg; + } + msg_list.clear(); +} + void ChatMsgRec::Pop(size_t max_num) { while (msg_list.size() > max_num) { @@ -307,7 +317,16 @@ void ChatMgr::OnPlayerOnline(Player* hum) void ChatMgr::OnPlayerOffline(Player* hum) { - + a8::Timer::Instance()->AddDeadLineTimer + (1000 * 60 * 5, + a8::XParams() + .SetSender(hum->AccountId()), + [] (const a8::XParams& param) + { + if (!PlayerMgr::Instance()->GetPlayerByAccountId(param.sender)) { + ChatMgr::Instance()->RemoveChatedUser(param.sender); + } + }); } void ChatMgr::AddChatedUser(const std::string& sender_id, const std::string& receiver_id, @@ -349,3 +368,12 @@ void ChatMgr::FillMFChatMsg(cs::MFChatMsg* msg, Player* sender, long long msg_uu msg->set_msg_body(msg_body); msg->set_send_time(time(nullptr)); } + +void ChatMgr::RemoveChatedUser(const std::string& account_id) +{ + auto itr = private_chated_users_.find(account_id); + if (itr != private_chated_users_.end()) { + delete itr->second; + private_chated_users_.erase(account_id); + } +} diff --git a/server/imserver/chatmgr.h b/server/imserver/chatmgr.h index e0be2ba..5ad595e 100644 --- a/server/imserver/chatmgr.h +++ b/server/imserver/chatmgr.h @@ -4,11 +4,11 @@ struct ChatMsgRec { - long long curr_id = 0; long long last_id = 0; std::list msg_list; + ~ChatMsgRec(); void Pop(size_t max_num); void PopAndDelete(size_t max_num); }; @@ -48,6 +48,7 @@ class ChatMgr : public a8::Singleton cs::MFChatMsg* chat_msg, long long last_id); void FillMFChatMsg(cs::MFChatMsg* msg, Player* sender, long long msg_uuid, int chat_channel, int msg_type, const std::string& msg_body); + void RemoveChatedUser(const std::string& account_id); private: long long world_msg_id_ = 1000;