diff --git a/server/imserver/guildmgr.cc b/server/imserver/guildmgr.cc index 2632759..0b0ae39 100644 --- a/server/imserver/guildmgr.cc +++ b/server/imserver/guildmgr.cc @@ -8,6 +8,68 @@ #include "MSConnMgr.h" #include "asynctaskmgr.h" +class AsyncGuildTask +{ +public: + long long watch_guild_id = 0; + time_t time = 0; + ss::SS_IM_ForwardGuildCMMsg forward_msg; +}; + +class CMGuildInfoTask : public AsyncGuildTask +{ +private: + cs::CMGuildInfo cmmsg; +}; + +class CMGuildJoinTask : public AsyncGuildTask +{ +private: + cs::CMGuildJoin cmmsg; +}; + +class CMGuildAgreeTask : public AsyncGuildTask +{ +private: + cs::CMGuildAgree cmmsg; +}; + +class CMGuildAgreeKick : public AsyncGuildTask +{ +private: + cs::CMGuildKick cmmsg; +}; + +class CMGuildAgreeTak : public AsyncGuildTask +{ +private: + cs::CMGuildQuit cmmsg; +}; + +class CMGuildDismissTask : public AsyncGuildTask +{ +private: + cs::CMGuildDismiss cmmsg; +}; + +class CMGuildRenameTask : public AsyncGuildTask +{ +private: + cs::CMGuildRename cmmsg; +}; + +class CMGuildMemberListTask : public AsyncGuildTask +{ +private: + cs::CMGuildMemberList cmmsg; +}; + +class CMGuildLogTask : public AsyncGuildTask +{ +private: + cs::CMGuildLog cmmsg; +}; + void GuildMgr::Init() { @@ -20,12 +82,24 @@ void GuildMgr::UnInit() void GuildMgr::_SS_IM_ForwardGuildCMMsg(f8::MsgHdr& hdr, const ss::SS_IM_ForwardGuildCMMsg& msg) { - switch (hdr.msgid) { + if (msg.msgid() < cs::CMMessageId_e::_CMGuildMsgBegin || + msg.msgid() > cs::CMMessageId_e::_CMGuildMsgEnd) { + return; + } + if (!IsValidGuildId(msg.context().user_info().base_data().guild_id())) { + ss::SS_CommonError respmsg; + respmsg.set_errcode(SERVER_INTERNAL_ERROR); + respmsg.set_errmsg("服务器内部错误"); + ForwardGuildSMMsg(msg.context(), msg.msgid(), respmsg); + return; + } + switch (msg.msgid()) { case cs::CMMessageId_e::_CMGuildInfo: { cs::CMGuildInfo cmmsg; cmmsg.ParseFromArray(msg.payload().data(), msg.payload().size()); - _CMGuildInfo(msg.context(), cmmsg); + CMGuildInfoTask* task = new CMGuildInfoTask; + //AddAsyncTask(cmmsg.guild_id(), task); } break; case cs::CMMessageId_e::_CMGuildCreate: @@ -39,42 +113,38 @@ void GuildMgr::_SS_IM_ForwardGuildCMMsg(f8::MsgHdr& hdr, const ss::SS_IM_Forward { cs::CMGuildJoin cmmsg; cmmsg.ParseFromArray(msg.payload().data(), msg.payload().size()); - _CMGuildJoin(msg.context(), cmmsg); + CMGuildJoinTask* task = new CMGuildJoinTask; + //AddAsyncTask(cmmsg.guild_id(), task); } break; case cs::CMMessageId_e::_CMGuildAgree: { cs::CMGuildAgree cmmsg; cmmsg.ParseFromArray(msg.payload().data(), msg.payload().size()); - _CMGuildAgree(msg.context(), cmmsg); } break; case cs::CMMessageId_e::_CMGuildKick: { cs::CMGuildKick cmmsg; cmmsg.ParseFromArray(msg.payload().data(), msg.payload().size()); - _CMGuildKick(msg.context(), cmmsg); } break; case cs::CMMessageId_e::_CMGuildQuit: { cs::CMGuildQuit cmmsg; cmmsg.ParseFromArray(msg.payload().data(), msg.payload().size()); - _CMGuildQuit(msg.context(), cmmsg); } break; case cs::CMMessageId_e::_CMGuildDismiss: { cs::CMGuildDismiss cmmsg; cmmsg.ParseFromArray(msg.payload().data(), msg.payload().size()); - _CMGuildDismiss(msg.context(), cmmsg); } break; case cs::CMMessageId_e::_CMGuildRename: { cs::CMGuildRename cmmsg; cmmsg.ParseFromArray(msg.payload().data(), msg.payload().size()); - _CMGuildRename(msg.context(), cmmsg); } break; case cs::CMMessageId_e::_CMGuildSearch: @@ -95,7 +165,12 @@ void GuildMgr::_SS_IM_ForwardGuildCMMsg(f8::MsgHdr& hdr, const ss::SS_IM_Forward { cs::CMGuildMemberList cmmsg; cmmsg.ParseFromArray(msg.payload().data(), msg.payload().size()); - _CMGuildMemberList(msg.context(), cmmsg); + } + break; + case cs::CMMessageId_e::_CMGuildLog: + { + cs::CMGuildLog cmmsg; + cmmsg.ParseFromArray(msg.payload().data(), msg.payload().size()); } break; default: @@ -105,20 +180,8 @@ void GuildMgr::_SS_IM_ForwardGuildCMMsg(f8::MsgHdr& hdr, const ss::SS_IM_Forward } } -void GuildMgr::_CMGuildInfo(const ss::MFIMMsgConext& context, const cs::CMGuildInfo& msg) -{ - -} - void GuildMgr::_CMGuildCreate(const ss::MFIMMsgConext& context, const cs::CMGuildCreate& msg) { - if (!IsValidGuildId(context.user_info().base_data().guild_id())) { - cs::SMGuildCreate respmsg; - respmsg.set_errcode(SERVER_INTERNAL_ERROR); - respmsg.set_errmsg("服务器内部错误"); - ForwardGuildSMMsg(context, respmsg); - return; - } Guild* guild = GetGuild(context.user_info().base_data().guild_id()); if (guild) { cs::SMGuildCreate respmsg; @@ -130,174 +193,6 @@ void GuildMgr::_CMGuildCreate(const ss::MFIMMsgConext& context, const cs::CMGuil AsyncTaskMgr::Instance()->CreateNewGuildTask(context, msg); } -void GuildMgr::_CMGuildJoin(const ss::MFIMMsgConext& context, const cs::CMGuildJoin& msg) -{ - if (!IsValidGuildId(context.user_info().base_data().guild_id())) { - cs::SMGuildJoin respmsg; - respmsg.set_errcode(SERVER_INTERNAL_ERROR); - respmsg.set_errmsg("服务器内部错误"); - ForwardGuildSMMsg(context, respmsg); - return; - } - #if 0 - Guild* guild = GetGuild(msg.guild_id()); - if (!guild) { - cs::SMGuildJoin respmsg; - respmsg.set_errcode(1); - respmsg.set_errmsg("群id已经存在"); - ForwardGuildSMMsg(context, respmsg); - return; - } - GuildMember* member = guild->GetMember(context.account_id()); - if (member) { - cs::SMGuildJoin respmsg; - ForwardGuildSMMsg(context, respmsg); - return; - } - if (guild->IsFull()) { - cs::SMGuildJoin respmsg; - respmsg.set_errcode(2); - respmsg.set_errmsg("群已满"); - ForwardGuildSMMsg(context, respmsg); - return; - } - member = new GuildMember(); - member->account_id = context.account_id(); - member->nickname = context.nickname(); - member->avatar_url = context.avatar_url(); - member->sex = context.sex(); - member->online = 1; - member->guild_id = guild->guild_id; - member->data_version1 = context.base_data_version(); - guild->AddMember(member); - #endif -} - -void GuildMgr::_CMGuildAgree(const ss::MFIMMsgConext& context, const cs::CMGuildAgree& msg) -{ - if (!IsValidGuildId(context.user_info().base_data().guild_id())) { - cs::SMGuildAgree respmsg; - respmsg.set_errcode(SERVER_INTERNAL_ERROR); - respmsg.set_errmsg("服务器内部错误"); - ForwardGuildSMMsg(context, respmsg); - return; - } -#if 0 - Guild* guild = GetGuild(context.guild_id()); - if (!guild) { - return; - } -#endif -} - -void GuildMgr::_CMGuildKick(const ss::MFIMMsgConext& context, const cs::CMGuildKick& msg) -{ - if (!IsValidGuildId(context.user_info().base_data().guild_id())) { - cs::SMGuildKick respmsg; - respmsg.set_errcode(SERVER_INTERNAL_ERROR); - respmsg.set_errmsg("服务器内部错误"); - ForwardGuildSMMsg(context, respmsg); - return; - } - #if 0 - Guild* guild = GetGuild(context.guild_id()); - if (!guild) { - cs::SMGuildKick respmsg; - respmsg.set_errcode(1); - respmsg.set_errmsg("群id错误"); - ForwardGuildSMMsg(context, respmsg); - return; - } - if (!guild->GetMember(msg.account_id())) { - cs::SMGuildKick respmsg; - ForwardGuildSMMsg(context, respmsg); - return; - } - guild->RemoveMember(msg.account_id()); - cs::SMGuildKick respmsg; - ForwardGuildSMMsg(context, respmsg); - return; - #endif -} - -void GuildMgr::_CMGuildQuit(const ss::MFIMMsgConext& context, const cs::CMGuildQuit& msg) -{ - if (!IsValidGuildId(context.user_info().base_data().guild_id())) { - cs::SMGuildQuit respmsg; - respmsg.set_errcode(SERVER_INTERNAL_ERROR); - respmsg.set_errmsg("服务器内部错误"); - ForwardGuildSMMsg(context, respmsg); - return; - } -#if 0 - Guild* guild = GetGuild(context.guild_id()); - if (!guild) { - cs::SMGuildQuit respmsg; - respmsg.set_errcode(1); - respmsg.set_errmsg("群id错误"); - ForwardGuildSMMsg(context, respmsg); - return; - } - if (!guild->GetMember(context.account_id())) { - cs::SMGuildQuit respmsg; - ForwardGuildSMMsg(context, respmsg); - return; - } - guild->RemoveMember(context.account_id()); - cs::SMGuildQuit respmsg; - ForwardGuildSMMsg(context, respmsg); -#endif -} - -void GuildMgr::_CMGuildDismiss(const ss::MFIMMsgConext& context, const cs::CMGuildDismiss& msg) -{ - if (!IsValidGuildId(context.user_info().base_data().guild_id())) { - cs::SMGuildDismiss respmsg; - respmsg.set_errcode(SERVER_INTERNAL_ERROR); - respmsg.set_errmsg("服务器内部错误"); - ForwardGuildSMMsg(context, respmsg); - return; - } - #if 0 - Guild* guild = GetGuild(context.guild_id()); - if (!guild) { - return; - } - #endif -} - -void GuildMgr::_CMGuildRename(const ss::MFIMMsgConext& context, const cs::CMGuildRename& msg) -{ - if (!IsValidGuildId(context.user_info().base_data().guild_id())) { - cs::SMGuildRename respmsg; - respmsg.set_errcode(SERVER_INTERNAL_ERROR); - respmsg.set_errmsg("服务器内部错误"); - ForwardGuildSMMsg(context, respmsg); - return; - } - #if 0 - Guild* guild = GetGuild(context.guild_id()); - if (!guild) { - cs::SMGuildRename respmsg; - respmsg.set_errcode(1); - respmsg.set_errmsg("群id错误"); - ForwardGuildSMMsg(context, respmsg); - return; - } - GuildMember* member = guild->GetMember(context.account_id()); - if (!member) { - cs::SMGuildRename respmsg; - respmsg.set_errcode(2); - respmsg.set_errmsg("没有权限"); - ForwardGuildSMMsg(context, respmsg); - return; - } - guild->RemoveMember(msg.new_guild_name()); - cs::SMGuildRename respmsg; - ForwardGuildSMMsg(context, respmsg); - #endif -} - void GuildMgr::_CMGuildSearch(const ss::MFIMMsgConext& context, const cs::CMGuildSearch& msg) { @@ -308,12 +203,7 @@ void GuildMgr::_CMGuildRank(const ss::MFIMMsgConext& context, const cs::CMGuildR } -void GuildMgr::_CMGuildMemberList(const ss::MFIMMsgConext& context, const cs::CMGuildMemberList& msg) -{ - -} - -void GuildMgr::_CMGuildLog(const ss::MFIMMsgConext& context, const cs::CMGuildLog& msg) +void GuildMgr::AddAsyncTask(long long guild_id, AsyncGuildTask* task) { } @@ -330,10 +220,12 @@ Guild* GuildMgr::GetGuild(long long guild_id) } void GuildMgr::ForwardGuildSMMsg(const ss::MFIMMsgConext& context, + int msgid, const ::google::protobuf::Message& smmsg) { ss::SS_IM_ForwardGuildSMMsg msg; *msg.mutable_context() = context; + msg.set_msgid(msgid); smmsg.SerializeToString(msg.mutable_payload()); MSConnMgr::Instance()->SendMsg(msg, 0); } diff --git a/server/imserver/guildmgr.h b/server/imserver/guildmgr.h index 04df381..be2a85d 100644 --- a/server/imserver/guildmgr.h +++ b/server/imserver/guildmgr.h @@ -2,18 +2,9 @@ namespace cs { - class CMGuildInfo; class CMGuildCreate; - class CMGuildJoin; - class CMGuildAgree; - class CMGuildKick; - class CMGuildQuit; - class CMGuildDismiss; - class CMGuildRename; class CMGuildSearch; class CMGuildRank; - class CMGuildMemberList; - class CMGuildLog; } namespace ss @@ -31,6 +22,7 @@ namespace google } class Guild; +class AsyncGuildTask; class GuildMgr : public a8::Singleton { public: @@ -47,24 +39,24 @@ class GuildMgr : public a8::Singleton void _SS_IM_ForwardGuildCMMsg(f8::MsgHdr& hdr, const ss::SS_IM_ForwardGuildCMMsg& msg); private: - void _CMGuildInfo(const ss::MFIMMsgConext& context, const cs::CMGuildInfo& msg); void _CMGuildCreate(const ss::MFIMMsgConext& context, const cs::CMGuildCreate& msg); - void _CMGuildJoin(const ss::MFIMMsgConext& context, const cs::CMGuildJoin& msg); - void _CMGuildAgree(const ss::MFIMMsgConext& context, const cs::CMGuildAgree& msg); - void _CMGuildKick(const ss::MFIMMsgConext& context, const cs::CMGuildKick& msg); - void _CMGuildQuit(const ss::MFIMMsgConext& context, const cs::CMGuildQuit& msg); - void _CMGuildDismiss(const ss::MFIMMsgConext& context, const cs::CMGuildDismiss& msg); - void _CMGuildRename(const ss::MFIMMsgConext& context, const cs::CMGuildRename& msg); void _CMGuildSearch(const ss::MFIMMsgConext& context, const cs::CMGuildSearch& msg); void _CMGuildRank(const ss::MFIMMsgConext& context, const cs::CMGuildRank& msg); - void _CMGuildMemberList(const ss::MFIMMsgConext& context, const cs::CMGuildMemberList& msg); - void _CMGuildLog(const ss::MFIMMsgConext& context, const cs::CMGuildLog& msg); + void AddAsyncTask(long long guild_id, AsyncGuildTask* task); bool IsValidGuildId(long long guild_id); Guild* GetGuild(long long group_id); + template + void ForwardGuildSMMsg(const ss::MFIMMsgConext& context, T& smmsg) + { + static int msgid = f8::Net_GetMessageId(smmsg); + ForwardGuildSMMsg(context, msgid, smmsg); + } void ForwardGuildSMMsg(const ss::MFIMMsgConext& context, + int msgid, const ::google::protobuf::Message& smmsg); private: std::map id_hash_; + std::map> task_hash_; }; diff --git a/server/tools/protobuild/ss_proto.proto b/server/tools/protobuild/ss_proto.proto index 4c58895..d85e498 100755 --- a/server/tools/protobuild/ss_proto.proto +++ b/server/tools/protobuild/ss_proto.proto @@ -78,6 +78,12 @@ message SS_CMPing { } +message SS_CommonError +{ + optional int32 errcode = 1; //1:群id错误 + optional string errmsg = 2; //错误消息 +} + message SS_CMLogin_CMReConnect_CommonHead { optional int32 server_id = 1; @@ -154,13 +160,15 @@ message SS_MS_LoadGroup message SS_IM_ForwardGuildCMMsg { optional MFIMMsgConext context = 1; - optional bytes payload = 2; + optional int32 msgid = 2; + optional bytes payload = 3; } message SS_IM_ForwardGuildSMMsg { optional MFIMMsgConext context = 1; - optional bytes payload = 2; + optional int32 msgid = 2; + optional bytes payload = 3; } message SS_IM_ReportServerInfo