diff --git a/server/imserver/app.cc b/server/imserver/app.cc index 285a3f9..ed70e25 100644 --- a/server/imserver/app.cc +++ b/server/imserver/app.cc @@ -656,3 +656,14 @@ long long App::NewSeqId() { return ++seq_id_; } + +time_t App::BetweenDays(time_t time1, time_t time2) +{ + const int g_time_zone = 8; + return (time1 + g_time_zone*3600)/3600/24 - (time2 + g_time_zone*3600)/3600/24; +} + +bool App::IsTimeToReset(int time) +{ + return BetweenDays(nowtime - 60 * SYS_RESET_TIME, time - 60 * SYS_RESET_TIME) > 0; +} diff --git a/server/imserver/app.h b/server/imserver/app.h index 3c9fb69..7d2b1bf 100644 --- a/server/imserver/app.h +++ b/server/imserver/app.h @@ -34,6 +34,8 @@ class App : public a8::Singleton bool HasFlag(int flag); long long NewUUID(); long long NewSeqId(); + time_t BetweenDays(time_t time1, time_t time2); + bool IsTimeToReset(int time); private: void QuickExecute(); diff --git a/server/imserver/constant.h b/server/imserver/constant.h index dbd6f56..fa5ed18 100644 --- a/server/imserver/constant.h +++ b/server/imserver/constant.h @@ -44,3 +44,6 @@ const int MAX_INSTANCE_ID = 1023; const int MAX_FRIEND_NUM = 50; const int DAILY_JOIN_FRIEND_TIMES = 100; +const int DAILY_APPLY_FRIEND_TIMES = 100; + +const int SYS_RESET_TIME = 2*60; //每日两点重置 diff --git a/server/imserver/player.cc b/server/imserver/player.cc index 9cbc2c9..2c37ac8 100644 --- a/server/imserver/player.cc +++ b/server/imserver/player.cc @@ -48,6 +48,9 @@ void Player::Init() red_point_flags_ = 1; SyncRedPoint(); #endif + if (App::Instance()->IsTimeToReset(role_data.last_save_time)) { + OnDailyReset(); + } } void Player::UnInit() @@ -71,6 +74,9 @@ void Player::Deserialize(const ss::MFUserDB& user_db) TypeConvert::Convert(friend_db.base_data(), friendobj->base_data); AddFriend(friendobj); } + role_data.today_apply_times = user_db.role_data().today_apply_times(); + role_data.save_count = user_db.role_data().save_count(); + role_data.last_save_time = user_db.role_data().last_save_time(); } void Player::Serialize(ss::MFUserDB& user_db) @@ -79,6 +85,9 @@ void Player::Serialize(ss::MFUserDB& user_db) auto p = user_db.add_friends(); TypeConvert::Convert(pair.second->base_data, *(p->mutable_base_data())); } + user_db.mutable_role_data()->set_today_apply_times(role_data.today_apply_times); + user_db.mutable_role_data()->set_save_count(role_data.save_count); + user_db.mutable_role_data()->set_last_save_time(role_data.last_save_time); } void Player::_CMPing(f8::MsgHdr& hdr, const cs::CMPing& msg) @@ -139,11 +148,25 @@ void Player::_CMFriendApply(f8::MsgHdr& hdr, const cs::CMFriendApply& msg) return; } if (msg.friend_id() == AccountId()) { - respmsg.set_errcode(21); + respmsg.set_errcode(2); respmsg.set_errmsg("不能邀请自己"); SendMsg(respmsg); return; } + if (f8::ExtractGameIdFromAccountId(AccountId()) != + f8::ExtractGameIdFromAccountId(msg.friend_id())) { + respmsg.set_errcode(3); + respmsg.set_errmsg("不能邀请其他游戏玩家"); + SendMsg(respmsg); + return; + } + if (role_data.today_apply_times > DAILY_APPLY_FRIEND_TIMES) { + respmsg.set_errcode(4); + respmsg.set_errmsg("今天邀请次数已经用完不能再邀请"); + SendMsg(respmsg); + return; + } + ++role_data.today_apply_times; SendMsg(respmsg); DBHelper::Instance()->AddFriendApply(this, msg.friend_id()); } @@ -616,6 +639,8 @@ void Player::SaveToDB(a8::XParams param, f8::AsyncDBOnOkFunc on_ok, f8::AsyncDBO on_error, myself.crc32_code ); + ++role_data.save_count; + role_data.last_save_time = App::Instance()->nowtime; } Friend* Player::GetFriendById(const std::string& friend_id) @@ -789,6 +814,10 @@ void Player::Update(long long tick) { last_run_tick_ = tick; ProcessEvent(); + if (App::Instance()->nowtime - role_data.last_save_time > 1000 * 60) { + role_data.last_save_time = App::Instance()->nowtime; + SaveToDB(a8::XParams(), nullptr, nullptr); + } } const std::string Player::AccountId() @@ -882,7 +911,9 @@ void Player::ProcessEventTimerFunc() { std::string account_id = param.sender.GetString(); long long curr_max_event_idx = param.param1; + #if 0 long long last_event_idx = param.param2; + #endif Player* hum = PlayerMgr::Instance()->GetPlayerByAccountId(account_id); if (hum) { hum->OnFetchEvent(curr_max_event_idx, data_set); @@ -1005,3 +1036,8 @@ void Player::SyncRedPoint() notifymsg.set_red_point_flags(red_point_flags_); SendMsg(notifymsg); } + +void Player::OnDailyReset() +{ + role_data.today_apply_times = 0; +} diff --git a/server/imserver/player.h b/server/imserver/player.h index 68adb62..3eb8098 100644 --- a/server/imserver/player.h +++ b/server/imserver/player.h @@ -128,6 +128,7 @@ private: void OnFriendDeleteEvent(Event& event); bool CanAddFriend(const std::string& account_id); void SyncRedPoint(); + void OnDailyReset(); private: bool dirty_ = false;