diff --git a/server/imserver/player.cc b/server/imserver/player.cc index 472e802..a9f87da 100644 --- a/server/imserver/player.cc +++ b/server/imserver/player.cc @@ -4,7 +4,7 @@ #include "player.h" #include "playermgr.h" -#include "WSListener.h" +#include "dbengine.h" void Player::Init() { @@ -14,6 +14,7 @@ void Player::Init() ); SyncLocToMasterServer(); NotifyOnline(); + AsyncGetFriendList(); } void Player::UnInit() @@ -23,22 +24,34 @@ void Player::UnInit() void Player::_CMFriendList(f8::MsgHdr& hdr, const cs::CMFriendList& msg) { - + cs::SMFriendList respmsg; + if (friend_list_syncok_) { + FillFriendList(respmsg.mutable_friend_list()); + } else { + if (!reading_friends_list_) { + AsyncGetFriendList(); + } + respmsg.set_error_code(1); + } + SendMsg(respmsg); } void Player::_CMFriendInvite(f8::MsgHdr& hdr, const cs::CMFriendInvite& msg) { - + cs::SMFriendInvite respmsg; + SendMsg(respmsg); } void Player::_CMFriendIgnore(f8::MsgHdr& hdr, const cs::CMFriendIgnore& msg) { - + cs::SMFriendIgnore respmsg; + SendMsg(respmsg); } void Player::_CMFriendDelete(f8::MsgHdr& hdr, const cs::CMFriendDelete& msg) { - + cs::SMFriendDelete respmsg; + SendMsg(respmsg); } void Player::_CMGroupCreate(f8::MsgHdr& hdr, const cs::CMGroupCreate& msg) @@ -98,3 +111,19 @@ void Player::NotifyOffline() { } + +void Player::AsyncGetFriendList() +{ +} + +void Player::FillFriendList(::google::protobuf::RepeatedPtrField< ::cs::MFUserInfo >* friend_list) +{ + for (auto& pair : friend_hash_) { + auto p = friend_list->Add(); + p->set_account_id(pair.second.account_id); + p->set_nickname(pair.second.nickname); + p->set_avatar_url(pair.second.avatar_url); + p->set_sex(pair.second.sex); + p->set_online(pair.second.online); + } +} diff --git a/server/imserver/player.h b/server/imserver/player.h index 9ccd333..7b90e44 100644 --- a/server/imserver/player.h +++ b/server/imserver/player.h @@ -1,6 +1,7 @@ #pragma once #include "cs_proto.pb.h" +#include "WSListener.h" class Player { @@ -17,12 +18,20 @@ class Player std::string avatar_url; int sex = 0; long long group_id = 0; + int today_invite_times = 0; + int last_invite_time = 0; int data_version1 = 0; public: void Init(); void UnInit(); + template + void SendMsg(T& msg) + { + WSListener::Instance()->SendToClient(socket_handle, 0, msg); + } + void _CMFriendList(f8::MsgHdr& hdr, const cs::CMFriendList& msg); void _CMFriendInvite(f8::MsgHdr& hdr, const cs::CMFriendInvite& msg); void _CMFriendIgnore(f8::MsgHdr& hdr, const cs::CMFriendIgnore& msg); @@ -40,4 +49,13 @@ class Player void SyncLocToMasterServer(); void NotifyOnline(); void NotifyOffline(); + +private: + void AsyncGetFriendList(); + void FillFriendList(::google::protobuf::RepeatedPtrField< ::cs::MFUserInfo >* friend_list); + +private: + std::map friend_hash_; + bool reading_friends_list_ = false; + bool friend_list_syncok_ = false; }; diff --git a/server/imserver/types.h b/server/imserver/types.h index a6061ab..57f6d92 100644 --- a/server/imserver/types.h +++ b/server/imserver/types.h @@ -11,3 +11,16 @@ struct PerfMonitor long long in_data_size = 0; long long read_count = 0; }; + + +struct Friend +{ + std::string account_id; + std::string nickname; + std::string avatar_url; + int sex = 0; + int online = 0; + + int data_version1 = 0; + unsigned int crc32_code = 0; +}; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 82067af..44a258b 100644 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -21,7 +21,7 @@ message MFUserInfo optional string nickname = 2; optional string avatar_url = 3; optional int32 sex = 4; - optional int32 status = 5; + optional int32 online = 5; } // @@ -44,7 +44,9 @@ message CMFriendList } message SMFriendList { - repeated MFUserInfo user_infos = 1; + optional int32 error_code = 1; + optional string error_msg = 2; + repeated MFUserInfo friend_list = 3; } message CMFriendInvite