aozhiwei aa804c9371 1
2020-05-13 10:27:31 +08:00

292 lines
8.1 KiB
C++

#include "precompile.h"
#include <a8/openssl.h>
#include <a8/timer.h>
#include "player.h"
#include "playermgr.h"
#include "dbengine.h"
#include "MSConnMgr.h"
#include "dbengine.h"
#include "app.h"
void Player::Init()
{
crc32_code = a8::openssl::Crc32(
(unsigned char*)account_id.data(),
account_id.size()
);
SyncLocToMasterServer();
NotifyOnline();
}
void Player::UnInit()
{
timer_attacher.ClearTimerList();
}
void Player::Deserialize(const cs::MFUserDB& user_db)
{
for (auto& friend_db : user_db.friends()) {
Friend friendobj;
friendobj.account_id = friend_db.account_id();
friendobj.nickname = friend_db.nickname();
friendobj.avatar_url = friend_db.avatar_url();
friendobj.sex = friend_db.sex();
friendobj.data_version1 = friend_db.data_version1();
friendobj.group_id = friend_db.group_id();
friendobj.crc32_code = a8::openssl::Crc32(
(unsigned char*)account_id.data(),
account_id.size()
);;
friend_hash_[friendobj.account_id] = friendobj;
}
}
void Player::Serialize(cs::MFUserDB& user_db)
{
for (auto& pair : friend_hash_) {
auto p = user_db.add_friends();
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_data_version1(pair.second.data_version1);
p->set_group_id(pair.second.group_id);
}
}
void Player::_CMFriendList(f8::MsgHdr& hdr, const cs::CMFriendList& msg)
{
cs::SMFriendList respmsg;
FillFriendList(respmsg.mutable_friend_list());
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)
{
if (group_id != 0) {
cs::SMGroupCreate respmsg;
respmsg.set_error_code(1);
respmsg.set_error_msg("你已经有群");
SendMsg(respmsg);
return;
}
ForwardGroupCMMsg(hdr, App::Instance()->NewUUID());
}
void Player::_CMGroupJoin(f8::MsgHdr& hdr, const cs::CMGroupJoin& msg)
{
if (group_id != 0) {
cs::SMGroupJoin respmsg;
respmsg.set_error_code(1);
respmsg.set_error_msg("你已经有群");
SendMsg(respmsg);
return;
}
ForwardGroupCMMsg(hdr, group_id);
}
void Player::_CMGroupAgree(f8::MsgHdr& hdr, const cs::CMGroupAgree& msg)
{
if (group_id == 0) {
cs::SMGroupAgree respmsg;
respmsg.set_error_code(2);
respmsg.set_error_msg("你还没有群");
SendMsg(respmsg);
return;
}
ForwardGroupCMMsg(hdr, group_id);
}
void Player::_CMGroupKick(f8::MsgHdr& hdr, const cs::CMGroupKick& msg)
{
if (group_id == 0) {
cs::SMGroupKick respmsg;
respmsg.set_error_code(2);
respmsg.set_error_msg("你还没有群");
SendMsg(respmsg);
return;
}
ForwardGroupCMMsg(hdr, group_id);
}
void Player::_CMGroupQuit(f8::MsgHdr& hdr, const cs::CMGroupQuit& msg)
{
if (group_id == 0) {
cs::SMGroupQuit respmsg;
respmsg.set_error_code(2);
respmsg.set_error_msg("你还没有群");
SendMsg(respmsg);
return;
}
ForwardGroupCMMsg(hdr, group_id);
}
void Player::_CMGroupDismiss(f8::MsgHdr& hdr, const cs::CMGroupDismiss& msg)
{
if (group_id == 0) {
cs::SMGroupQuit respmsg;
respmsg.set_error_code(2);
respmsg.set_error_msg("你还没有群");
SendMsg(respmsg);
return;
}
ForwardGroupCMMsg(hdr, group_id);
}
void Player::_CMGroupRename(f8::MsgHdr& hdr, const cs::CMGroupRename& msg)
{
if (group_id == 0) {
cs::SMGroupRename respmsg;
respmsg.set_error_code(2);
respmsg.set_error_msg("你还没有群");
SendMsg(respmsg);
return;
}
ForwardGroupCMMsg(hdr, group_id);
}
void Player::ReLogin(f8::MsgHdr& hdr, const cs::CMLogin& msg)
{
cs::SMLogin respmsg;
WSListener::Instance()->SendToClient(hdr.socket_handle, 0, respmsg);
PlayerMgr::Instance()->ReBindSocket(hdr.socket_handle, this);
SyncLocToMasterServer();
}
void Player::SyncLocToMasterServer()
{
}
void Player::NotifyOnline()
{
}
void Player::NotifyOffline()
{
}
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);
}
}
void Player::FillIMMsgConext(f8::MsgHdr& hdr, ss::MFIMMsgConext* conext)
{
conext->set_socket_handle(hdr.socket_handle);
conext->set_account_id(account_id);
conext->set_nickname(nickname);
conext->set_avatar_url(avatar_url);
conext->set_sex(sex);
#if 1
conext->set_online(true);
#else
conext->set_online(online);
#endif
conext->set_msgid(hdr.msgid);
}
void Player::ForwardGroupCMMsg(f8::MsgHdr& hdr, long long hash_code)
{
ss::SS_MS_ForwardGroupCMMsg msg;
FillIMMsgConext(hdr, msg.mutable_context());
if (hdr.buflen > 0) {
msg.mutable_payload()->assign(hdr.buf, hdr.buflen);
}
MSConnMgr::Instance()->SendMsg(msg, hash_code);
}
void Player::MarkDirty()
{
if (!dirty_) {
dirty_ = true;
dirty_timer_ = a8::Timer::Instance()->
AddDeadLineTimerAndAttach(1000 * 60,
a8::XParams()
.SetSender((void*)this),
[] (const a8::XParams& param)
{
Player* hum = (Player*)param.sender.GetUserData();
hum->SaveToDB();
},
&timer_attacher.timer_list_,
[] (const a8::XParams& param)
{
Player* hum = (Player*)param.sender.GetUserData();
hum->dirty_timer_ = nullptr;
}
);
}
}
void Player::SaveToDB()
{
cs::MFUserDB user_db;
Serialize(user_db);
std::string friend_data;
user_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,
"UPDATE `user` SET friend_data='%s', modifytime=%d, "
" nickname='%s', avatar_url='%s', sex=%d, group_id=%d, data_version1=%d "
"WHERE account_id='%s';",
{
friend_data,
App::Instance()->nowtime,
nickname,
avatar_url,
sex,
group_id,
data_version1,
account_id
},
a8::XParams(),
on_ok,
on_error,
crc32_code
);
}