添加序列化处理group friend

This commit is contained in:
aozhiwei 2020-05-12 17:39:01 +08:00
parent 7e0aec0938
commit ddd0dffd5b
5 changed files with 186 additions and 5 deletions

View File

@ -1,6 +1,12 @@
#include "precompile.h" #include "precompile.h"
#include <a8/timer.h>
#include "group.h" #include "group.h"
#include "cs_proto.pb.h"
#include "ss_proto.pb.h"
#include "dbengine.h"
#include "app.h"
void Group::Init() void Group::Init()
{ {
@ -9,7 +15,10 @@ void Group::Init()
void Group::UnInit() void Group::UnInit()
{ {
for (auto& pair : member_hash_) {
delete pair.second;
}
member_hash_.clear();
} }
GroupMember* Group::GetMember(const std::string& account_id) GroupMember* Group::GetMember(const std::string& account_id)
@ -25,7 +34,8 @@ bool Group::IsFull()
void Group::Rename(const std::string& new_group_name) void Group::Rename(const std::string& new_group_name)
{ {
group_name = new_group_name;
MarkDirty();
} }
void Group::AddMember(GroupMember* member) void Group::AddMember(GroupMember* member)
@ -34,6 +44,11 @@ void Group::AddMember(GroupMember* member)
abort(); abort();
} }
member_hash_[member->account_id] = member; member_hash_[member->account_id] = member;
MarkDirty();
if (dirty_timer_) {
a8::Timer::Instance()->ModifyTimer(dirty_timer_, 100);
}
} }
void Group::RemoveMember(const std::string& account_id) void Group::RemoveMember(const std::string& account_id)
@ -42,9 +57,86 @@ void Group::RemoveMember(const std::string& account_id)
if (member) { if (member) {
member_hash_.erase(account_id); member_hash_.erase(account_id);
} }
MarkDirty();
if (dirty_timer_) {
a8::Timer::Instance()->ModifyTimer(dirty_timer_, 100);
}
} }
void Group::MakrDirty() void Group::MarkDirty()
{
if (!dirty_) {
dirty_ = true;
dirty_timer_ = a8::Timer::Instance()->
AddDeadLineTimerAndAttach(1000 * 60,
a8::XParams()
.SetSender((void*)this),
[] (const a8::XParams& param)
{
Group* group = (Group*)param.sender.GetUserData();
group->SaveToDB();
},
&timer_attacher.timer_list_,
[] (const a8::XParams& param)
{
Group* group = (Group*)param.sender.GetUserData();
group->dirty_timer_ = nullptr;
}
);
}
}
void Group::FillGroupDB(cs::MFGroupDB& group_dto)
{ {
} }
void Group::SaveToDB()
{
cs::MFGroupDB group_db;
FillGroupDB(group_db);
std::string group_data;
group_db.SerializeToString(&group_data);
auto on_ok =
[] (a8::XParams& param, const f8::DataSet* data_set)
{
};
auto on_error =
[] (a8::XParams& param, int error_code, const std::string& error_msg)
{
};
a8::XObject conn_info = DBEngine::Instance()->GetConnInfo(group_id);
DBEngine::Instance()->
ExecAsyncScript(
conn_info,
"INSERT `group`(group_id, group_name, owner_id, creator_id, group_data "
" createtime, modifytime) "
"VALUES(%d, '%s', %d, %d, '%s', %d, %d) "
"ON DUPLICATE KEY UPDATE group_name='%s', owner_id=%d, creator_id=%d, "
" group_data='%s', modifytime=%d;",
{
group_id,
group_name,
owner_id,
creator_id,
group_data,
App::Instance()->nowtime,
App::Instance()->nowtime,
group_name,
owner_id,
creator_id,
group_data,
App::Instance()->nowtime
},
a8::XParams(),
on_ok,
on_error,
group_id
);
}

View File

@ -1,5 +1,7 @@
#pragma once #pragma once
#include <a8/timer_attacher.h>
struct GroupMember struct GroupMember
{ {
std::string account_id; std::string account_id;
@ -11,6 +13,12 @@ struct GroupMember
int data_version1 = 0; int data_version1 = 0;
}; };
namespace cs
{
class MFGroupDB;
}
struct timer_list;
class Group class Group
{ {
public: public:
@ -19,6 +27,7 @@ class Group
std::string owner_id; std::string owner_id;
std::string creator_id; std::string creator_id;
int createtime = 0; int createtime = 0;
a8::TimerAttacher timer_attacher;
void Init(); void Init();
void UnInit(); void UnInit();
@ -28,8 +37,14 @@ class Group
GroupMember* GetMember(const std::string& account_id); GroupMember* GetMember(const std::string& account_id);
void AddMember(GroupMember* member); void AddMember(GroupMember* member);
void RemoveMember(const std::string& account_id); void RemoveMember(const std::string& account_id);
void MakrDirty(); void MarkDirty();
private: private:
void FillGroupDB(cs::MFGroupDB& group_dto);
void SaveToDB();
private:
bool dirty_ = false;
timer_list* dirty_timer_ = nullptr;
std::map<std::string, GroupMember*> member_hash_; std::map<std::string, GroupMember*> member_hash_;
}; };

View File

@ -5,8 +5,9 @@
#include "player.h" #include "player.h"
#include "playermgr.h" #include "playermgr.h"
#include "dbengine.h" #include "dbengine.h"
#include "app.h"
#include "MSConnMgr.h" #include "MSConnMgr.h"
#include "dbengine.h"
#include "app.h"
void Player::Init() void Player::Init()
{ {
@ -203,3 +204,49 @@ void Player::ForwardGroupCMMsg(f8::MsgHdr& hdr, long long hash_code)
} }
MSConnMgr::Instance()->SendMsg(msg, hash_code); MSConnMgr::Instance()->SendMsg(msg, hash_code);
} }
void Player::FillFriendDB(cs::MFFriendDB& friend_db)
{
}
void Player::SaveToDB()
{
cs::MFFriendDB friend_db;
FillFriendDB(friend_db);
std::string friend_data;
friend_db.SerializeToString(&friend_data);
auto on_ok =
[] (a8::XParams& param, const f8::DataSet* data_set)
{
};
auto on_error =
[] (a8::XParams& param, int error_code, const std::string& error_msg)
{
};
a8::XObject conn_info = DBEngine::Instance()->GetConnInfo(crc32_code);
DBEngine::Instance()->
ExecAsyncScript(
conn_info,
"INSERT `friend`(account_id, friend_data, createtime, modifytime) "
"VALUES('%s', '%s', %d, %d) "
"ON DUPLICATE KEY UPDATE friend_data='%s', modifytime=%d; ",
{
account_id,
friend_data,
App::Instance()->nowtime,
App::Instance()->nowtime,
friend_data,
App::Instance()->nowtime
},
a8::XParams(),
on_ok,
on_error,
crc32_code
);
}

View File

@ -4,6 +4,7 @@
#include "ss_proto.pb.h" #include "ss_proto.pb.h"
#include "WSListener.h" #include "WSListener.h"
struct timer_list;
class Player class Player
{ {
public: public:
@ -50,14 +51,20 @@ class Player
void SyncLocToMasterServer(); void SyncLocToMasterServer();
void NotifyOnline(); void NotifyOnline();
void NotifyOffline(); void NotifyOffline();
void MarkDirty();
private: private:
void AsyncGetFriendList(); void AsyncGetFriendList();
void FillFriendList(::google::protobuf::RepeatedPtrField< ::cs::MFUserInfo >* friend_list); void FillFriendList(::google::protobuf::RepeatedPtrField< ::cs::MFUserInfo >* friend_list);
void FillIMMsgConext(f8::MsgHdr& hdr, ss::MFIMMsgConext* conext); void FillIMMsgConext(f8::MsgHdr& hdr, ss::MFIMMsgConext* conext);
void ForwardGroupCMMsg(f8::MsgHdr& hdr, long long hash_code); void ForwardGroupCMMsg(f8::MsgHdr& hdr, long long hash_code);
void FillFriendDB(cs::MFFriendDB& friend_db);
void SaveToDB();
private: private:
bool dirty_ = false;
timer_list* dirty_timer_ = nullptr;
std::map<std::string, Friend> friend_hash_; std::map<std::string, Friend> friend_hash_;
bool reading_friends_list_ = false; bool reading_friends_list_ = false;
bool friend_list_syncok_ = false; bool friend_list_syncok_ = false;

View File

@ -24,6 +24,26 @@ message MFUserInfo
optional int32 online = 5; optional int32 online = 5;
} }
message MFGroupMemberDB
{
optional string account_id = 1;
optional string nickname = 2;
optional string avatar_url = 3;
optional int32 sex = 4;
optional int64 group_id = 5;
optional int32 data_version1 = 6;
}
message MFGroupDB
{
repeated MFGroupMemberDB members = 1;
}
message MFFriendDB
{
}
// //
message CMLogin message CMLogin
{ {