diff --git a/server/imserver/chatmgr.cc b/server/imserver/chatmgr.cc index e655bf9..71e00fe 100644 --- a/server/imserver/chatmgr.cc +++ b/server/imserver/chatmgr.cc @@ -5,6 +5,7 @@ #include "playermgr.h" #include "guild.h" #include "guildmgr.h" +#include "typeconvert.h" void ChatMgr::Init() { @@ -73,8 +74,11 @@ void ChatMgr::ProcWorldChat(Player* hum, const cs::CMSendChatMsg& msg) void ChatMgr::ProcPrivateChat(Player* hum, const cs::CMSendChatMsg& msg) { - Player* target_hum = PlayerMgr::Instance()->GetPlayerByAccountId(msg.target()); - if (!target_hum) { + if (hum->AccountId() == msg.target()) { + return; + } + Friend* target = hum->GetFriendById(msg.target()); + if (!target) { return; } ++private_msg_id_; @@ -82,12 +86,20 @@ void ChatMgr::ProcPrivateChat(Player* hum, const cs::CMSendChatMsg& msg) cs::MFChatMsg* p = new cs::MFChatMsg(); p->set_msg_uuid(private_msg_id_); hum->FillMFUserInfo(p->mutable_sender()); + { + TypeConvert::Convert(target->base_data, *p->mutable_sender()->mutable_base_data()); + TypeConvert::Convert(target->temp_custom_data, *p->mutable_sender()->mutable_temp_custom_data()); + } p->set_chat_channel(msg.chat_channel()); p->set_msg_type(msg.msg_type()); p->set_msg_body(msg.msg_body()); p->set_send_time(time(nullptr)); + AddChatedUser(hum->AccountId(), msg.target(), p, private_msg_id_); + AddChatedUser(msg.target(), hum->AccountId(), p, private_msg_id_); + ChatMgr::Instance()->SyncPrivateChatMsg(hum); + Player* target_hum = PlayerMgr::Instance()->GetPlayerByAccountId(msg.target()); if (target_hum) { ChatMgr::Instance()->SyncPrivateChatMsg(target_hum); } @@ -203,3 +215,22 @@ void ChatMgr::SyncGuildChatMsg(Player* hum) } } } + +void ChatMgr::AddChatedUser(const std::string& sender_id, const std::string& receiver_id, + cs::MFChatMsg* chat_msg, long long last_id) +{ + auto itr = private_chated_users_.find(sender_id); + if (itr == private_chated_users_.end()) { + private_chated_users_[sender_id] = ChatedUserRec(); + itr = private_chated_users_.find(sender_id); + } + itr->second.has_unread_msg = true; + auto itr2 = itr->second.users.find(receiver_id); + if (itr2 != itr->second.users.end()) { + itr->second.users[receiver_id] = ChatMsgRec(); + itr2 = itr->second.users.find(receiver_id); + } + itr2->second.last_id = last_id; + itr2->second.msg_list.push_back(chat_msg); + itr2->second.PopAndDelete(50); +} diff --git a/server/imserver/chatmgr.h b/server/imserver/chatmgr.h index 207e73a..fc6149e 100644 --- a/server/imserver/chatmgr.h +++ b/server/imserver/chatmgr.h @@ -56,6 +56,8 @@ class ChatMgr : public a8::Singleton void SyncWorldChatMsg(Player* hum); void SyncPrivateChatMsg(Player* hum); void SyncGuildChatMsg(Player* hum); + void AddChatedUser(const std::string& sender_id, const std::string& receiver_id, + cs::MFChatMsg* chat_msg, long long last_id); private: long long private_msg_id_ = 1000; diff --git a/server/imserver/player.cc b/server/imserver/player.cc index ee18256..8b5e0b6 100644 --- a/server/imserver/player.cc +++ b/server/imserver/player.cc @@ -579,18 +579,6 @@ void Player::_CMSendChatMsg(f8::MsgHdr& hdr, const cs::CMSendChatMsg& msg) default: return; } - #if 0 - ss::SS_IM_SendChatMsg ss_msg; - FillIMMsgConext(ss_msg.mutable_context()); - ss_msg.set_chat_channel(msg.chat_channel()); - ss_msg.set_target(msg.target()); - ss_msg.set_msg_type(msg.msg_type()); - ss_msg.set_msg_body(msg.msg_body()); - Friend* friend_data = GetFriendById(msg.target()); - if (friend_data) { - SendSSMsg(*friend_data, ss_msg); - } - #endif } void Player::_CMReadMsgAndOpenChatNotify(f8::MsgHdr& hdr, const cs::CMReadMsgAndOpenChatNotify& msg)