diff --git a/server/imserver/guild.cc b/server/imserver/guild.cc index 28e05a8..bb16d88 100644 --- a/server/imserver/guild.cc +++ b/server/imserver/guild.cc @@ -33,6 +33,7 @@ void Guild::Init() for (size_t i = 0; i < kGuildJobMax; ++i) { job_hash_.push_back(std::set()); } + RecalcRedPoint(); } void Guild::UnInit() @@ -1082,6 +1083,39 @@ void Guild::Active() } } +bool Guild::CheckRedPoint() +{ + if (has_red_point_) { + return true; + } + if (App::Instance()->nowtime - last_check_red_point_time_ < 15) { + return true; + } + RecalcRedPoint(); + return false; +} + +bool Guild::HasApply() +{ + return has_red_point_; +} + +void Guild::SyncNewApply() +{ + std::vector jobs = {kGuildAdmin, kGuildElite, kGuildMember}; + for (int job : jobs) { + std::set* members = GetJobMembers(job); + if (members) { + for (const std::string& member_id : *members) { + ss::SS_GS_PushGuildRedPoint respmsg; + respmsg.set_account_id(member_id); + respmsg.set_has_apply(1); + GuildMgr::Instance()->SendMsg(0, respmsg); + } + } + } +} + int Guild::GetJobMemberNum(int job) { std::set* members = GetJobMembers(job); @@ -1552,3 +1586,58 @@ void Guild::GuildAgreeCb(int socket_handle, const ss::MFIMMsgConext& context, co msg.apply().base_data().account_id() ); } + +void Guild::RecalcRedPoint() +{ + last_check_red_point_time_ = App::Instance()->nowtime; + { + auto on_ok = + [] (a8::XParams& param, const f8::DataSet* data_set) + { + if (data_set && !data_set->empty()) { + Guild* guild = GuildMgr::Instance()->GetGuild(param.sender); + if (guild) { + guild->has_red_point_ = 1; + } + } + }; + auto on_error = + [] (a8::XParams& param, int error_code, const std::string& error_msg) + { + }; + + a8::XObject conn_info = DBEngine::Instance()->GetConnInfo(GuildId()); + DBEngine::Instance()->ExecAsyncQuery + ( + conn_info, + "SELECT idx, applyid " + "FROM guild_apply " + "WHERE idx > %d AND A.status=0 LIMIT 1;", + { + 0 + }, + a8::XParams() + .SetSender(GuildId()), + on_ok, + on_error, + GuildId() + ); + } + { + a8::Timer::Instance()->AddDeadLineTimerAndAttach + ( + 1000 * 10, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Guild* guild = (Guild*)param.sender.GetUserData(); + guild->has_red_point_ = 0; + }, + &timer_attacher_.timer_list_, + [] (const a8::XParams& param) + { + + }); + } +} diff --git a/server/imserver/guild.h b/server/imserver/guild.h index 0b7dd48..20c0aed 100644 --- a/server/imserver/guild.h +++ b/server/imserver/guild.h @@ -39,6 +39,9 @@ public: void UpdateMemberOnline(const std::string& account_id); void UpdateMemberOffline(const std::string& account_id); void Active(); + bool CheckRedPoint(); + bool HasApply(); + void SyncNewApply(); private: bool IsFull(); @@ -70,9 +73,12 @@ private: void RemoveHandledApply(); void CombineRepeatApply(); void GuildAgreeCb(int socket_handle, const ss::MFIMMsgConext& context, const cs::CMGuildAgree& msg); + void RecalcRedPoint(); private: bool dirty_ = false; + int has_red_point_ = false; + int last_check_red_point_time_ = 0; long long last_apply_idx_ = 0; timer_list* dirty_timer_ = nullptr; timer_list* sync_timer_ = nullptr; diff --git a/server/imserver/guildmgr.cc b/server/imserver/guildmgr.cc index 29117fa..cfdc39c 100644 --- a/server/imserver/guildmgr.cc +++ b/server/imserver/guildmgr.cc @@ -1,6 +1,7 @@ #include "precompile.h" #include +#include #include #include "guild.h" @@ -140,6 +141,41 @@ void GuildMgr::_SS_IM_PushGuildUserOnlineState(f8::MsgHdr& hdr, const ss::SS_IM_ } } +void GuildMgr::_SS_IM_GuildRecalcRedPoint(f8::MsgHdr& hdr, const ss::SS_IM_GuildRecalcRedPoint& msg) +{ + Guild* guild = GetGuild(msg.guild_id()); + if (guild) { + int wait_time = 0; + if (!guild->CheckRedPoint()) { + wait_time = 2; + } + a8::Timer::Instance()->AddDeadLineTimer + ( + 1000 * wait_time, + a8::XParams() + .SetSender(msg.context().user_info().base_data().account_id()) + .SetParam1(msg.guild_id()), + [] (const a8::XParams& param) + { + Guild* guild = GuildMgr::Instance()->GetGuild(param.param1); + if (guild) { + ss::SS_GS_PushGuildRedPoint respmsg; + respmsg.set_account_id(param.sender.GetString()); + respmsg.set_has_apply(guild->HasApply() ? 1 : 0); + GuildMgr::Instance()->SendMsg(0, respmsg); + } + }); + } +} + +void GuildMgr::_SS_IM_GuildNewApply(f8::MsgHdr& hdr, const ss::SS_IM_GuildNewApply& msg) +{ + Guild* guild = GetGuild(msg.guild_id()); + if (guild) { + guild->SyncNewApply(); + } +} + void GuildMgr::CreateAsyncTask(int socket_handle, long long guild_id, AsyncGuildTask* task) { Guild* guild = GetGuild(guild_id); diff --git a/server/imserver/guildmgr.h b/server/imserver/guildmgr.h index 3c63b2d..d5bfeae 100644 --- a/server/imserver/guildmgr.h +++ b/server/imserver/guildmgr.h @@ -7,6 +7,8 @@ namespace ss class SS_IM_ForwardGuildSMMsg; class SS_IM_RefeshGuildMemberInfo; class SS_IM_PushGuildUserOnlineState; + class SS_IM_GuildRecalcRedPoint; + class SS_IM_GuildNewApply; } class Guild; @@ -48,6 +50,8 @@ class GuildMgr : public a8::Singleton void _SS_IM_ForwardGuildSMMsg(f8::MsgHdr& hdr, const ss::SS_IM_ForwardGuildSMMsg& msg); void _SS_IM_RefeshGuildMemberInfo(f8::MsgHdr& hdr, const ss::SS_IM_RefeshGuildMemberInfo& msg); void _SS_IM_PushGuildUserOnlineState(f8::MsgHdr& hdr, const ss::SS_IM_PushGuildUserOnlineState& msg); + void _SS_IM_GuildRecalcRedPoint(f8::MsgHdr& hdr, const ss::SS_IM_GuildRecalcRedPoint& msg); + void _SS_IM_GuildNewApply(f8::MsgHdr& hdr, const ss::SS_IM_GuildNewApply& msg); private: void CreateAsyncTask(int socket_handle, long long guild_id, AsyncGuildTask* task); diff --git a/server/imserver/handlermgr.cc b/server/imserver/handlermgr.cc index 42cbe24..c2073cc 100644 --- a/server/imserver/handlermgr.cc +++ b/server/imserver/handlermgr.cc @@ -68,10 +68,13 @@ void HandlerMgr::RegisterNetMsgHandlers() RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_IM_GuildMemberQuitRequest); RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_IM_GuildMemberUpdateRequest); RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_GS_QueryGuildUserOnlineState); + RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_GS_PushGuildRedPoint); RegisterNetMsgHandler(&imcmsghandler, &GuildMgr::_SS_IM_ForwardGuildCMMsg); RegisterNetMsgHandler(&imcmsghandler, &GuildMgr::_SS_IM_RefeshGuildMemberInfo); RegisterNetMsgHandler(&imcmsghandler, &GuildMgr::_SS_IM_PushGuildUserOnlineState); + RegisterNetMsgHandler(&imcmsghandler, &GuildMgr::_SS_IM_GuildRecalcRedPoint); + RegisterNetMsgHandler(&imcmsghandler, &GuildMgr::_SS_IM_GuildNewApply); RegisterNetMsgHandler(&wsmsghandler, &WSListener::_SS_Ping); diff --git a/server/imserver/player.cc b/server/imserver/player.cc index ec5f990..a2745fa 100644 --- a/server/imserver/player.cc +++ b/server/imserver/player.cc @@ -65,7 +65,7 @@ void Player::Init() } #endif SyncGuildMemberInfo(); - a8::Timer::Instance()->AddRepeatTimerAndAttach + a8::Timer::Instance()->AddDeadLineTimerAndAttach ( 1000 * 2 + (rand() % 3000), a8::XParams() @@ -74,6 +74,7 @@ void Player::Init() { Player* hum = (Player*)param.sender.GetUserData(); hum->SyncGuildMemberInfo(); + hum->SyncGuildRedPoint(); }, &timer_attacher.timer_list_ ); @@ -756,6 +757,19 @@ void Player::_CMGuildJoin(f8::MsgHdr& hdr, const cs::CMGuildJoin& msg) } ++role_data.today_apply_guild_times; ForwardGuildCMMsg(hdr, msg.guild_id()); + a8::Timer::Instance()->AddDeadLineTimerAndAttach + ( + 1000 * 2 + (rand() % 3000), + a8::XParams() + .SetSender(this) + .SetParam1(msg.guild_id()), + [] (const a8::XParams& param) + { + Player* hum = (Player*)param.sender.GetUserData(); + hum->SyncGuildNewApply(param.param1); + }, + &timer_attacher.timer_list_ + ); } void Player::_CMGuildAgree(f8::MsgHdr& hdr, const cs::CMGuildAgree& msg) @@ -1346,6 +1360,14 @@ void Player::FillSMLogin(cs::SMLogin& respmsg) respmsg.mutable_account_info()->set_user_sign(user_sign_); } +void Player::UpdateGuildRedPoint(long long guild_id, int has_apply) +{ + if (has_apply) { + a8::SetBitFlag(hum->red_point_flags_, RPF_GuildApply); + SyncRedPoint(); + } +} + void Player::FillApplyList(const cs::MFPaging& paging, cs::SMFriendApplyList& respmsg) { RemoveHandledApply(); @@ -1542,6 +1564,11 @@ long long Player::GuildId() return myself.base_data.guild_id; } +int Player::GuildJob() +{ + return myself.base_data.guild_job; +} + int Player::GetFriendNum() { return friend_hash_.size(); @@ -2050,3 +2077,21 @@ void Player::SyncGuildMemberInfo() FillIMMsgConext(msg.mutable_context()); SendGSMsg(msg); } + +void Player::SyncGuildRedPoint() +{ + if (GuildId() != 0 && (GuildJob() == kGuildOwner || GuildJob() == kGuildAdmin)) { + ss::SS_IM_GuildRecalcRedPoint msg; + FillIMMsgConext(msg.mutable_context()); + msg.set_guild_id(GuildId()); + SendGSMsg(msg); + } +} + +void Player::SyncGuildNewApply(long long guild_id) +{ + ss::SS_IM_GuildNewApply msg; + FillIMMsgConext(msg.mutable_context()); + msg.set_guild_id(GuildId()); + SendGSMsg(msg); +} diff --git a/server/imserver/player.h b/server/imserver/player.h index 0d66997..de3ef39 100644 --- a/server/imserver/player.h +++ b/server/imserver/player.h @@ -135,12 +135,14 @@ class Player Friend* GetBlackListById(const std::string& friend_id); void UpdateGuildData(long long guild_id, int guild_job); void FillSMLogin(cs::SMLogin& respmsg); + void UpdateGuildRedPoint(long long guild_id, int has_apply); const std::string AccountId(); const std::string SessionId(); const std::string NickName(); const std::string AvatarUrl(); long long GuildId(); + int GuildJob(); int GetFriendNum(); void SaveToDB(a8::XParams param, f8::AsyncDBOnOkFunc on_ok, f8::AsyncDBOnErrorFunc on_error); @@ -184,6 +186,8 @@ private: void ShowErrorMsg(const std::string& msg); void InternalRemoveFriend(const std::string& account_id, bool need_sync, bool auto_delete); void SyncGuildMemberInfo(); + void SyncGuildRedPoint(); + void SyncGuildNewApply(long long guild_id); private: bool dirty_ = false; diff --git a/server/imserver/playermgr.cc b/server/imserver/playermgr.cc index 63ae567..42b4b61 100644 --- a/server/imserver/playermgr.cc +++ b/server/imserver/playermgr.cc @@ -252,6 +252,14 @@ void PlayerMgr::_SS_GS_QueryGuildUserOnlineState(f8::MsgHdr& hdr, const ss::SS_G } +void PlayerMgr::_SS_GS_PushGuildRedPoint(f8::MsgHdr& hdr, const ss::SS_GS_PushGuildRedPoint& msg) +{ + Player* hum = GetPlayerByAccountId(msg.account_id()); + if (hum) { + hum->UpdateGuildRedPoint(msg.guild_id(), msg.has_apply()); + } +} + void PlayerMgr::_CMLoginOld(f8::MsgHdr& hdr, const cs::CMLoginOld& msg) { cs::CMLogin new_msg; diff --git a/server/imserver/playermgr.h b/server/imserver/playermgr.h index d49dce3..5c19575 100644 --- a/server/imserver/playermgr.h +++ b/server/imserver/playermgr.h @@ -27,6 +27,7 @@ namespace ss class SS_IM_GuildMemberUpdateRequest; class SS_IM_GuildMemberUpdateResponse; class SS_GS_QueryGuildUserOnlineState; + class SS_GS_PushGuildRedPoint; } class Player; @@ -62,6 +63,7 @@ class PlayerMgr : public a8::Singleton void _SS_IM_UpdateUserInfo(f8::MsgHdr& hdr, const ss::SS_IM_UpdateUserInfo& msg); void _SS_GS_QueryGuildUserOnlineState(f8::MsgHdr& hdr, const ss::SS_GS_QueryGuildUserOnlineState& msg); + void _SS_GS_PushGuildRedPoint(f8::MsgHdr& hdr, const ss::SS_GS_PushGuildRedPoint& msg); void _CMLoginOld(f8::MsgHdr& hdr, const cs::CMLoginOld& msg); void _CMLogin(f8::MsgHdr& hdr, const cs::CMLogin& msg); diff --git a/server/tools/protobuild/ss_msgid.proto b/server/tools/protobuild/ss_msgid.proto index 3d2d87f..dc9ebe9 100644 --- a/server/tools/protobuild/ss_msgid.proto +++ b/server/tools/protobuild/ss_msgid.proto @@ -50,4 +50,6 @@ enum SSMessageId_e _SS_IM_RefeshGuildMemberInfo = 1035; _SS_GS_QueryGuildUserOnlineState = 1036; _SS_IM_PushGuildUserOnlineState = 1037; + _SS_IM_GuildRecalcRedPoint = 1038; + _SS_GS_PushGuildRedPoint = 1039; } diff --git a/server/tools/protobuild/ss_proto.proto b/server/tools/protobuild/ss_proto.proto index 23a5911..5c5a264 100755 --- a/server/tools/protobuild/ss_proto.proto +++ b/server/tools/protobuild/ss_proto.proto @@ -374,3 +374,22 @@ message SS_IM_PushGuildUserOnlineState optional int64 guild_id = 2; repeated string online_users = 3; } + +message SS_IM_GuildRecalcRedPoint +{ + optional MFIMMsgConext context = 1; + optional int64 guild_id = 2; +} + +message SS_GS_PushGuildRedPoint +{ + optional int64 guild_id = 1; + optional string account_id = 2; + optional int32 has_apply = 3; +} + +message SS_IM_GuildNewApply +{ + optional MFIMMsgConext context = 1; + optional int64 guild_id = 2; +} \ No newline at end of file