diff --git a/server/imserver/app.cc b/server/imserver/app.cc index ddad45c..eba0fed 100644 --- a/server/imserver/app.cc +++ b/server/imserver/app.cc @@ -27,6 +27,7 @@ #include "GGListener.h" #include "selfchecker.h" #include "httpproxy.h" +#include "playermgr.h" #include "mt/MetaMgr.h" @@ -96,6 +97,7 @@ bool App::Init(int argc, char* argv[]) uuid.SetMachineId((node_id - 1) * MAX_NODE_ID + instance_id); GGListener::Instance()->Init(); HttpProxy::Instance()->Init(); + PlayerMgr::Instance()->Init(); #if 0 f8::UdpLog::Instance()->Info("imserver starting instance_id:%d pid:%d debug_mode:%d channel:%d", @@ -134,6 +136,7 @@ bool App::Init(int argc, char* argv[]) void App::UnInit() { + PlayerMgr::Instance()->UnInit(); HttpProxy::Instance()->UnInit(); GGListener::Instance()->UnInit(); SelfChecker::UnInit(); diff --git a/server/imserver/player.cc b/server/imserver/player.cc new file mode 100644 index 0000000..1d63f13 --- /dev/null +++ b/server/imserver/player.cc @@ -0,0 +1 @@ +#include "precompile.h" diff --git a/server/imserver/player.h b/server/imserver/player.h new file mode 100644 index 0000000..380485b --- /dev/null +++ b/server/imserver/player.h @@ -0,0 +1,8 @@ +#pragma once + +class Player +{ + public: + int socket_handle = 0; + +}; diff --git a/server/imserver/playermgr.cc b/server/imserver/playermgr.cc new file mode 100644 index 0000000..7d2f5de --- /dev/null +++ b/server/imserver/playermgr.cc @@ -0,0 +1,117 @@ +#include "precompile.h" + +#include + +#include "playermgr.h" +#include "player.h" + +#include +#include + +void PlayerMgr::Init() +{ + f8::MsgQueue::Instance()->RegisterCallBack + ( + IM_ClientSocketDisconnect, + [this] (const a8::Args& args) + { + int gg_socket = args.Get(0); + OnClientDisconnect(gg_socket); + }); +} + +void PlayerMgr::UnInit() +{ +} + +int PlayerMgr::OnlineNum() +{ + return socket_hash_.size(); +} + +Player* PlayerMgr::GetPlayerBySocket(int socket) +{ + auto itr = socket_hash_.find(socket); + return itr != socket_hash_.end() ? itr->second : nullptr; +} + +void PlayerMgr::OnClientDisconnect(int gg_socket) +{ + + std::vector socket_list; + for (auto& pair : socket_hash_) { + unsigned short parent_socket_handle = (pair.first >> 16) & 0xFFFF; + if (parent_socket_handle == gg_socket) { + socket_list.push_back(pair.first); + } + } + for (int socket_handle : socket_list) { + Player* hum = GetPlayerBySocket(socket_handle); + if (hum) { + RemovePlayerBySocket(socket_handle); + } + } +} + +void PlayerMgr::RemovePlayerBySocket(int socket_handle) +{ + auto itr = socket_hash_.find(socket_handle); + if (itr != socket_hash_.end()) { + itr->second->socket_handle = 0; + socket_hash_.erase(itr); + } +} + +void PlayerMgr::IncAccountNum(const std::string& account_id) +{ + auto itr = account_num_hash_.find(account_id); + if (itr != account_num_hash_.end()) { + ++(itr->second); + if (itr->second > 3) { + f8::UdpLog::Instance()->Warning + ( + "IncAccountNum account_id:%s num:%d > 3", + { + account_id, + itr->second + } + ); + } + } else { + account_num_hash_[account_id] = 1; + } +} + +void PlayerMgr::DecAccountNum(const std::string& account_id) +{ + auto itr = account_num_hash_.find(account_id); + if (itr != account_num_hash_.end()) { + --(itr->second); + if (itr->second < 0) { + f8::UdpLog::Instance()->Warning + ( + "DecAccountNum account_id:%s num:%d < 0", + { + account_id, + itr->second + } + ); + } + if (itr->second <= 0) { + account_num_hash_.erase(itr); + } + } else { + f8::UdpLog::Instance()->Warning + ( + "DecAccountNum account_id:%s not exits", + { + account_id + } + ); + } +} + +void PlayerMgr::ReBindSocket(Player* hum) +{ + socket_hash_[hum->socket_handle] = hum; +} diff --git a/server/imserver/playermgr.h b/server/imserver/playermgr.h new file mode 100644 index 0000000..2e8df14 --- /dev/null +++ b/server/imserver/playermgr.h @@ -0,0 +1,47 @@ +#pragma once + +#include + +namespace cs +{ + class CMJoin; +} + +namespace ss +{ + class SS_WSP_SocketDisconnect; + class SS_Ping; +} + +class Player; +class PlayerMgr : public a8::Singleton +{ + public: + enum { HID = HID_PlayerMgr }; + + private: + PlayerMgr() {}; + friend class a8::Singleton; + + public: + void Init(); + void UnInit(); + + void _SS_WSP_SocketDisconnect(f8::MsgHdr& hdr, const ss::SS_WSP_SocketDisconnect& msg); + void _SS_Ping(f8::MsgHdr& hdr, const ss::SS_Ping& msg); + + int OnlineNum(); + Player* GetPlayerBySocket(int socket); + Player* CreatePlayerByCMJoin(Player* hum, long ip_saddr, int socket, const cs::CMJoin& msg); + void RemovePlayerBySocket(int socket_handle); + size_t GetAccountNum() { return account_num_hash_.size(); } + void IncAccountNum(const std::string& account_id); + void DecAccountNum(const std::string& account_id); + void ReBindSocket(Player* hum); + +private: + void OnClientDisconnect(int gg_socket); + private: + std::map socket_hash_; + std::map account_num_hash_; +};