From 387fa32e65974c36a1f61aeb7413d25480c6c97e Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 8 Dec 2020 20:40:30 +0800 Subject: [PATCH] 1 --- server/imserver/chatmgr.cc | 72 +++++++++++++++++++++++++++++++++--- server/imserver/chatmgr.h | 14 +++++++ server/imserver/guild.cc | 7 ++++ server/imserver/guild.h | 1 + server/imserver/playermgr.cc | 7 ++++ server/imserver/playermgr.h | 1 + 6 files changed, 96 insertions(+), 6 deletions(-) diff --git a/server/imserver/chatmgr.cc b/server/imserver/chatmgr.cc index c0d98e6..7b405bd 100644 --- a/server/imserver/chatmgr.cc +++ b/server/imserver/chatmgr.cc @@ -2,6 +2,9 @@ #include "chatmgr.h" #include "player.h" +#include "playermgr.h" +#include "guild.h" +#include "guildmgr.h" void ChatMgr::Init() { @@ -54,12 +57,12 @@ void ChatMgr::ProcWorldChat(Player* hum, const cs::CMSendChatMsg& msg) world_msgrec_.curr_id = world_msg_id_; world_msgrec_.msg_list.push_back(p); - if (hum->chat_channel == kCCWorld) { - cs::SMChatMsgNotify notifymsg; - hum->SendMsg(notifymsg); - } else { - hum->MarkNewMsg(); - } + world_msgrec_.PopAndDelete(50); + PlayerMgr::Instance()->TraversePlayer + ([](Player* hum) + { + ChatMgr::Instance()->SyncWorldChatMsg(hum); + }); } void ChatMgr::ProcPrivateChat(Player* hum, const cs::CMSendChatMsg& msg) @@ -69,6 +72,11 @@ void ChatMgr::ProcPrivateChat(Player* hum, const cs::CMSendChatMsg& msg) cs::MFChatMsg* p = new cs::MFChatMsg(); p->set_msg_uuid(private_msg_id_); + ChatMgr::Instance()->SyncPrivateChatMsg(hum); + Player* target_hum = PlayerMgr::Instance()->GetPlayerByAccountId(msg.target()); + if (target_hum) { + ChatMgr::Instance()->SyncPrivateChatMsg(target_hum); + } } void ChatMgr::ProcGuildChat(Player* hum, const cs::CMSendChatMsg& msg) @@ -77,6 +85,20 @@ void ChatMgr::ProcGuildChat(Player* hum, const cs::CMSendChatMsg& msg) cs::MFChatMsg* p = new cs::MFChatMsg(); p->set_msg_uuid(guild_msg_id_); + + Guild* guild = GuildMgr::Instance()->GetGuild(hum->GuildId()); + if (guild) { + guild->TraverseMember + ( + [] (GuildMember* member) + { + Player* hum = PlayerMgr::Instance()->GetPlayerByAccountId(member->account_id); + if (hum) { + ChatMgr::Instance()->SyncGuildChatMsg(hum); + } + } + ); + } } ChatedUserRec* ChatMgr::GetChatedUser(const std::string& account_id) @@ -84,3 +106,41 @@ ChatedUserRec* ChatMgr::GetChatedUser(const std::string& account_id) auto itr = private_chated_users_.find(account_id); return itr != private_chated_users_.end() ? &itr->second : nullptr; } + +void ChatMgr::SyncWorldChatMsg(Player* hum) +{ + if (hum->chat_channel == kCCWorld) { + cs::SMChatMsgNotify notifymsg; + for (cs::MFChatMsg* chat_msg : world_msgrec_.msg_list) { + if (chat_msg->msg_uuid() > hum->world_channel_last_id) { + *notifymsg.add_msg_list() = *chat_msg; + hum->world_channel_last_id = chat_msg->msg_uuid(); + } + } + hum->SendMsg(notifymsg); + } else { + hum->MarkNewMsg(); + } + +} + +void ChatMgr::SyncPrivateChatMsg(Player* hum) +{ + +} + +void ChatMgr::SyncGuildChatMsg(Player* hum) +{ + if (hum->GuildId() == 0) { + return; + } + auto itr = guild_msgrec_.find(hum->GuildId()); + if (itr != guild_msgrec_.end()) { + if (hum->chat_channel == kCCGuild) { + if (itr->second.curr_id > hum->guild_channel_last_id) { + } + } else { + hum->MarkNewMsg(); + } + } +} diff --git a/server/imserver/chatmgr.h b/server/imserver/chatmgr.h index 52198ac..6573a03 100644 --- a/server/imserver/chatmgr.h +++ b/server/imserver/chatmgr.h @@ -8,6 +8,17 @@ struct ChatMsgRec long long curr_id = 0; long long last_id = 0; std::list msg_list; + + void Pop(int max_num) + { + + } + + void PopAndDelete(int max_num) + { + + } + }; struct ChatedUserRec @@ -36,6 +47,9 @@ class ChatMgr : public a8::Singleton private: ChatedUserRec* GetChatedUser(const std::string& account_id); + void SyncWorldChatMsg(Player* hum); + void SyncPrivateChatMsg(Player* hum); + void SyncGuildChatMsg(Player* hum); private: long long private_msg_id_ = 1000; diff --git a/server/imserver/guild.cc b/server/imserver/guild.cc index 083eb2e..b6a18d3 100644 --- a/server/imserver/guild.cc +++ b/server/imserver/guild.cc @@ -1145,6 +1145,13 @@ void Guild::SyncNewApply() } } +void Guild::TraverseMember(std::function callback) +{ + for (auto& pair : member_hash_) { + callback(pair.second); + } +} + int Guild::GetJobMemberNum(int job) { std::set* members = GetJobMembers(job); diff --git a/server/imserver/guild.h b/server/imserver/guild.h index a110a04..73e66f2 100644 --- a/server/imserver/guild.h +++ b/server/imserver/guild.h @@ -48,6 +48,7 @@ public: bool CheckRedPoint(); bool HasApply(); void SyncNewApply(); + void TraverseMember(std::function callback); private: bool IsFull(); diff --git a/server/imserver/playermgr.cc b/server/imserver/playermgr.cc index e57e576..aef43a4 100644 --- a/server/imserver/playermgr.cc +++ b/server/imserver/playermgr.cc @@ -353,6 +353,13 @@ void PlayerMgr::Update(long long tick) } } +void PlayerMgr::TraversePlayer(std::function callback) +{ + for (auto& pair : accountid_hash_) { + callback(pair.second); + } +} + Player* PlayerMgr::GetPlayerBySocket(int socket) { auto itr = socket_hash_.find(socket); diff --git a/server/imserver/playermgr.h b/server/imserver/playermgr.h index c178390..1f42bcb 100644 --- a/server/imserver/playermgr.h +++ b/server/imserver/playermgr.h @@ -81,6 +81,7 @@ class PlayerMgr : public a8::Singleton int OnlineNum(); int WatchPlayerNum(); void Update(long long tick); + void TraversePlayer(std::function callback); private: void OnClientDisconnect(a8::XParams& param);