diff --git a/server/imserver/group.cc b/server/imserver/group.cc index c6e593e..55bec94 100644 --- a/server/imserver/group.cc +++ b/server/imserver/group.cc @@ -1,6 +1,12 @@ #include "precompile.h" +#include + #include "group.h" +#include "cs_proto.pb.h" +#include "ss_proto.pb.h" +#include "dbengine.h" +#include "app.h" void Group::Init() { @@ -9,7 +15,10 @@ void Group::Init() void Group::UnInit() { - + for (auto& pair : member_hash_) { + delete pair.second; + } + member_hash_.clear(); } GroupMember* Group::GetMember(const std::string& account_id) @@ -25,7 +34,8 @@ bool Group::IsFull() void Group::Rename(const std::string& new_group_name) { - + group_name = new_group_name; + MarkDirty(); } void Group::AddMember(GroupMember* member) @@ -34,6 +44,11 @@ void Group::AddMember(GroupMember* member) abort(); } 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) @@ -42,9 +57,86 @@ void Group::RemoveMember(const std::string& account_id) if (member) { 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 + ); +} diff --git a/server/imserver/group.h b/server/imserver/group.h index 3e8bcff..6ce13f1 100644 --- a/server/imserver/group.h +++ b/server/imserver/group.h @@ -1,5 +1,7 @@ #pragma once +#include + struct GroupMember { std::string account_id; @@ -11,6 +13,12 @@ struct GroupMember int data_version1 = 0; }; +namespace cs +{ + class MFGroupDB; +} + +struct timer_list; class Group { public: @@ -19,6 +27,7 @@ class Group std::string owner_id; std::string creator_id; int createtime = 0; + a8::TimerAttacher timer_attacher; void Init(); void UnInit(); @@ -28,8 +37,14 @@ class Group GroupMember* GetMember(const std::string& account_id); void AddMember(GroupMember* member); void RemoveMember(const std::string& account_id); - void MakrDirty(); + void MarkDirty(); private: + void FillGroupDB(cs::MFGroupDB& group_dto); + void SaveToDB(); + +private: + bool dirty_ = false; + timer_list* dirty_timer_ = nullptr; std::map member_hash_; }; diff --git a/server/imserver/player.cc b/server/imserver/player.cc index 3062d10..1a095f7 100644 --- a/server/imserver/player.cc +++ b/server/imserver/player.cc @@ -5,8 +5,9 @@ #include "player.h" #include "playermgr.h" #include "dbengine.h" -#include "app.h" #include "MSConnMgr.h" +#include "dbengine.h" +#include "app.h" void Player::Init() { @@ -203,3 +204,49 @@ void Player::ForwardGroupCMMsg(f8::MsgHdr& hdr, long long 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 + ); +} diff --git a/server/imserver/player.h b/server/imserver/player.h index ddb6b05..d8bc57f 100644 --- a/server/imserver/player.h +++ b/server/imserver/player.h @@ -4,6 +4,7 @@ #include "ss_proto.pb.h" #include "WSListener.h" +struct timer_list; class Player { public: @@ -50,14 +51,20 @@ class Player void SyncLocToMasterServer(); void NotifyOnline(); void NotifyOffline(); + void MarkDirty(); private: void AsyncGetFriendList(); void FillFriendList(::google::protobuf::RepeatedPtrField< ::cs::MFUserInfo >* friend_list); void FillIMMsgConext(f8::MsgHdr& hdr, ss::MFIMMsgConext* conext); void ForwardGroupCMMsg(f8::MsgHdr& hdr, long long hash_code); + void FillFriendDB(cs::MFFriendDB& friend_db); + void SaveToDB(); private: + bool dirty_ = false; + timer_list* dirty_timer_ = nullptr; + std::map friend_hash_; bool reading_friends_list_ = false; bool friend_list_syncok_ = false; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 141f462..c85b3d9 100644 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -24,6 +24,26 @@ message MFUserInfo 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 {