diff --git a/server/imserver/group.cc b/server/imserver/group.cc index 4e39f1e..c6e593e 100644 --- a/server/imserver/group.cc +++ b/server/imserver/group.cc @@ -11,3 +11,40 @@ void Group::UnInit() { } + +GroupMember* Group::GetMember(const std::string& account_id) +{ + auto itr = member_hash_.find(account_id); + return itr != member_hash_.end() ? itr->second : nullptr; +} + +bool Group::IsFull() +{ + return member_hash_.size() < 100; +} + +void Group::Rename(const std::string& new_group_name) +{ + +} + +void Group::AddMember(GroupMember* member) +{ + if (member_hash_.find(member->account_id) != member_hash_.end()) { + abort(); + } + member_hash_[member->account_id] = member; +} + +void Group::RemoveMember(const std::string& account_id) +{ + GroupMember* member = GetMember(account_id); + if (member) { + member_hash_.erase(account_id); + } +} + +void Group::MakrDirty() +{ + +} diff --git a/server/imserver/group.h b/server/imserver/group.h index 83d5dad..3e8bcff 100644 --- a/server/imserver/group.h +++ b/server/imserver/group.h @@ -1,10 +1,35 @@ #pragma once +struct GroupMember +{ + std::string account_id; + std::string nickname; + std::string avatar_url; + int sex = 0; + int online = 0; + long long group_id = 0; + int data_version1 = 0; +}; + class Group { public: long long group_id = 0; + std::string group_name; + std::string owner_id; + std::string creator_id; + int createtime = 0; void Init(); void UnInit(); + + bool IsFull(); + void Rename(const std::string& new_group_name); + GroupMember* GetMember(const std::string& account_id); + void AddMember(GroupMember* member); + void RemoveMember(const std::string& account_id); + void MakrDirty(); + +private: + std::map member_hash_; }; diff --git a/server/imserver/groupmgr.cc b/server/imserver/groupmgr.cc index 334ff3c..95a315e 100644 --- a/server/imserver/groupmgr.cc +++ b/server/imserver/groupmgr.cc @@ -1,9 +1,11 @@ #include "precompile.h" +#include "group.h" #include "groupmgr.h" #include "cs_msgid.pb.h" #include "cs_proto.pb.h" #include "ss_proto.pb.h" +#include "MSConnMgr.h" void GroupMgr::Init() { @@ -20,7 +22,7 @@ void GroupMgr::_SS_MS_LoadGroup(f8::MsgHdr& hdr, const ss::SS_MS_LoadGroup& msg) } -void GroupMgr::_SS_MS_ForwardGroupMsg(f8::MsgHdr& hdr, const ss::SS_MS_ForwardGroupMsg& msg) +void GroupMgr::_SS_MS_ForwardGroupCMMsg(f8::MsgHdr& hdr, const ss::SS_MS_ForwardGroupCMMsg& msg) { switch (hdr.msgid) { case cs::CMMessageId_e::_CMGroupCreate: @@ -81,34 +83,141 @@ void GroupMgr::_SS_MS_ForwardGroupMsg(f8::MsgHdr& hdr, const ss::SS_MS_ForwardGr void GroupMgr::_CMGroupCreate(const ss::MFIMMsgConext& context, const cs::CMGroupCreate& msg) { + Group* group = GetGroup(context.group_id()); + if (group) { + cs::SMGroupCreate respmsg; + respmsg.set_error_code(1); + respmsg.set_error_msg("群id已经存在"); + ForwardGroupSMMsg(context, respmsg); + return; + } } void GroupMgr::_CMGroupJoin(const ss::MFIMMsgConext& context, const cs::CMGroupJoin& msg) { - + Group* group = GetGroup(msg.group_id()); + if (!group) { + cs::SMGroupJoin respmsg; + respmsg.set_error_code(1); + respmsg.set_error_msg("群id已经存在"); + ForwardGroupSMMsg(context, respmsg); + return; + } + GroupMember* member = group->GetMember(context.account_id()); + if (member) { + cs::SMGroupJoin respmsg; + ForwardGroupSMMsg(context, respmsg); + return; + } + if (group->IsFull()) { + cs::SMGroupJoin respmsg; + respmsg.set_error_code(2); + respmsg.set_error_msg("群已满"); + ForwardGroupSMMsg(context, respmsg); + return; + } + member = new GroupMember(); + member->account_id = context.account_id(); + member->nickname = context.nickname(); + member->avatar_url = context.avatar_url(); + member->sex = context.sex(); + member->online = 1; + member->group_id = group->group_id; + member->data_version1 = context.data_version1(); + group->AddMember(member); } void GroupMgr::_CMGroupAgree(const ss::MFIMMsgConext& context, const cs::CMGroupAgree& msg) { - + Group* group = GetGroup(context.group_id()); + if (!group) { + return; + } } void GroupMgr::_CMGroupKick(const ss::MFIMMsgConext& context, const cs::CMGroupKick& msg) { - + Group* group = GetGroup(context.group_id()); + if (!group) { + cs::SMGroupKick respmsg; + respmsg.set_error_code(1); + respmsg.set_error_msg("群id错误"); + ForwardGroupSMMsg(context, respmsg); + return; + } + if (!group->GetMember(msg.account_id())) { + cs::SMGroupKick respmsg; + ForwardGroupSMMsg(context, respmsg); + return; + } + group->RemoveMember(msg.account_id()); + cs::SMGroupKick respmsg; + ForwardGroupSMMsg(context, respmsg); + return; } void GroupMgr::_CMGroupQuit(const ss::MFIMMsgConext& context, const cs::CMGroupQuit& msg) { - + Group* group = GetGroup(context.group_id()); + if (!group) { + cs::SMGroupQuit respmsg; + respmsg.set_error_code(1); + respmsg.set_error_msg("群id错误"); + ForwardGroupSMMsg(context, respmsg); + return; + } + if (!group->GetMember(context.account_id())) { + cs::SMGroupQuit respmsg; + ForwardGroupSMMsg(context, respmsg); + return; + } + group->RemoveMember(context.account_id()); + cs::SMGroupQuit respmsg; + ForwardGroupSMMsg(context, respmsg); } void GroupMgr::_CMGroupDismiss(const ss::MFIMMsgConext& context, const cs::CMGroupDismiss& msg) { - + Group* group = GetGroup(context.group_id()); + if (!group) { + return; + } } void GroupMgr::_CMGroupRename(const ss::MFIMMsgConext& context, const cs::CMGroupRename& msg) { - + Group* group = GetGroup(context.group_id()); + if (!group) { + cs::SMGroupRename respmsg; + respmsg.set_error_code(1); + respmsg.set_error_msg("群id错误"); + ForwardGroupSMMsg(context, respmsg); + return; + } + GroupMember* member = group->GetMember(context.account_id()); + if (!member) { + cs::SMGroupRename respmsg; + respmsg.set_error_code(2); + respmsg.set_error_msg("没有权限"); + ForwardGroupSMMsg(context, respmsg); + return; + } + group->RemoveMember(msg.new_group_name()); + cs::SMGroupRename respmsg; + ForwardGroupSMMsg(context, respmsg); +} + +Group* GroupMgr::GetGroup(long long group_id) +{ + auto itr = id_hash_.find(group_id); + return itr != id_hash_.end() ? itr->second : nullptr; +} + +void GroupMgr::ForwardGroupSMMsg(const ss::MFIMMsgConext& context, + const ::google::protobuf::Message& smmsg) +{ + ss::SS_MS_ForwardGroupSMMsg msg; + *msg.mutable_context() = context; + smmsg.SerializeToString(msg.mutable_payload()); + MSConnMgr::Instance()->SendMsg(msg, 0); } diff --git a/server/imserver/groupmgr.h b/server/imserver/groupmgr.h index ba939ac..2f4180b 100644 --- a/server/imserver/groupmgr.h +++ b/server/imserver/groupmgr.h @@ -15,7 +15,15 @@ namespace ss { class MFIMMsgConext; class SS_MS_LoadGroup; - class SS_MS_ForwardGroupMsg; + class SS_MS_ForwardGroupCMMsg; +} + +namespace google +{ + namespace protobuf + { + class Message; + } } class Group; @@ -33,7 +41,7 @@ class GroupMgr : public a8::Singleton void UnInit(); void _SS_MS_LoadGroup(f8::MsgHdr& hdr, const ss::SS_MS_LoadGroup& msg); - void _SS_MS_ForwardGroupMsg(f8::MsgHdr& hdr, const ss::SS_MS_ForwardGroupMsg& msg); + void _SS_MS_ForwardGroupCMMsg(f8::MsgHdr& hdr, const ss::SS_MS_ForwardGroupCMMsg& msg); private: void _CMGroupCreate(const ss::MFIMMsgConext& context, const cs::CMGroupCreate& msg); @@ -44,6 +52,10 @@ class GroupMgr : public a8::Singleton void _CMGroupDismiss(const ss::MFIMMsgConext& context, const cs::CMGroupDismiss& msg); void _CMGroupRename(const ss::MFIMMsgConext& context, const cs::CMGroupRename& msg); + Group* GetGroup(long long group_id); + void ForwardGroupSMMsg(const ss::MFIMMsgConext& context, + const ::google::protobuf::Message& smmsg); + private: std::map id_hash_; }; diff --git a/server/imserver/handlermgr.cc b/server/imserver/handlermgr.cc index a341e1e..d98b430 100644 --- a/server/imserver/handlermgr.cc +++ b/server/imserver/handlermgr.cc @@ -38,7 +38,7 @@ void HandlerMgr::RegisterNetMsgHandlers() RegisterNetMsgHandler(&mscmsghandler, &PlayerMgr::_SS_MS_PushUserList); RegisterNetMsgHandler(&mscmsghandler, &GroupMgr::_SS_MS_LoadGroup); - RegisterNetMsgHandler(&mscmsghandler, &GroupMgr::_SS_MS_ForwardGroupMsg); + RegisterNetMsgHandler(&mscmsghandler, &GroupMgr::_SS_MS_ForwardGroupCMMsg); RegisterNetMsgHandler(&imcmsghandler, &PlayerMgr::_SS_IM_SendChatMsg); diff --git a/server/imserver/player.cc b/server/imserver/player.cc index 7e35b90..3062d10 100644 --- a/server/imserver/player.cc +++ b/server/imserver/player.cc @@ -65,7 +65,7 @@ void Player::_CMGroupCreate(f8::MsgHdr& hdr, const cs::CMGroupCreate& msg) SendMsg(respmsg); return; } - ForwardMsgToMasterServer(hdr, App::Instance()->NewUUID()); + ForwardGroupCMMsg(hdr, App::Instance()->NewUUID()); } void Player::_CMGroupJoin(f8::MsgHdr& hdr, const cs::CMGroupJoin& msg) @@ -77,7 +77,7 @@ void Player::_CMGroupJoin(f8::MsgHdr& hdr, const cs::CMGroupJoin& msg) SendMsg(respmsg); return; } - ForwardMsgToMasterServer(hdr, group_id); + ForwardGroupCMMsg(hdr, group_id); } void Player::_CMGroupAgree(f8::MsgHdr& hdr, const cs::CMGroupAgree& msg) @@ -89,7 +89,7 @@ void Player::_CMGroupAgree(f8::MsgHdr& hdr, const cs::CMGroupAgree& msg) SendMsg(respmsg); return; } - ForwardMsgToMasterServer(hdr, group_id); + ForwardGroupCMMsg(hdr, group_id); } void Player::_CMGroupKick(f8::MsgHdr& hdr, const cs::CMGroupKick& msg) @@ -101,7 +101,7 @@ void Player::_CMGroupKick(f8::MsgHdr& hdr, const cs::CMGroupKick& msg) SendMsg(respmsg); return; } - ForwardMsgToMasterServer(hdr, group_id); + ForwardGroupCMMsg(hdr, group_id); } void Player::_CMGroupQuit(f8::MsgHdr& hdr, const cs::CMGroupQuit& msg) @@ -113,7 +113,7 @@ void Player::_CMGroupQuit(f8::MsgHdr& hdr, const cs::CMGroupQuit& msg) SendMsg(respmsg); return; } - ForwardMsgToMasterServer(hdr, group_id); + ForwardGroupCMMsg(hdr, group_id); } void Player::_CMGroupDismiss(f8::MsgHdr& hdr, const cs::CMGroupDismiss& msg) @@ -125,7 +125,7 @@ void Player::_CMGroupDismiss(f8::MsgHdr& hdr, const cs::CMGroupDismiss& msg) SendMsg(respmsg); return; } - ForwardMsgToMasterServer(hdr, group_id); + ForwardGroupCMMsg(hdr, group_id); } void Player::_CMGroupRename(f8::MsgHdr& hdr, const cs::CMGroupRename& msg) @@ -137,7 +137,7 @@ void Player::_CMGroupRename(f8::MsgHdr& hdr, const cs::CMGroupRename& msg) SendMsg(respmsg); return; } - ForwardMsgToMasterServer(hdr, group_id); + ForwardGroupCMMsg(hdr, group_id); } void Player::ReLogin(f8::MsgHdr& hdr, const cs::CMLogin& msg) @@ -194,9 +194,9 @@ void Player::FillIMMsgConext(f8::MsgHdr& hdr, ss::MFIMMsgConext* conext) conext->set_msgid(hdr.msgid); } -void Player::ForwardMsgToMasterServer(f8::MsgHdr& hdr, long long hash_code) +void Player::ForwardGroupCMMsg(f8::MsgHdr& hdr, long long hash_code) { - ss::SS_IM_ForwardMsg msg; + ss::SS_MS_ForwardGroupCMMsg msg; FillIMMsgConext(hdr, msg.mutable_context()); if (hdr.buflen > 0) { msg.mutable_payload()->assign(hdr.buf, hdr.buflen); diff --git a/server/imserver/player.h b/server/imserver/player.h index 2f6cdc2..ddb6b05 100644 --- a/server/imserver/player.h +++ b/server/imserver/player.h @@ -55,7 +55,7 @@ private: void AsyncGetFriendList(); void FillFriendList(::google::protobuf::RepeatedPtrField< ::cs::MFUserInfo >* friend_list); void FillIMMsgConext(f8::MsgHdr& hdr, ss::MFIMMsgConext* conext); - void ForwardMsgToMasterServer(f8::MsgHdr& hdr, long long hash_code); + void ForwardGroupCMMsg(f8::MsgHdr& hdr, long long hash_code); private: std::map friend_hash_; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 061abd0..141f462 100644 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -90,24 +90,28 @@ message SMFriendDelete optional string error_msg = 2; } +//建群 message CMGroupCreate { - optional string group_name = 1; + optional string group_name = 1; //群名称 } +//建群返回 message SMGroupCreate { - optional int32 error_code = 1; - optional string error_msg = 2; + optional int32 error_code = 1; //1:群已存在 2: 你已经有群 + optional string error_msg = 2; //错误消息 } +//加群 message CMGroupJoin { - optional int64 group_id = 1; + optional int64 group_id = 1; //群id } +//加群返回 message SMGroupJoin { - optional int32 error_code = 1; - optional string error_msg = 2; + optional int32 error_code = 1; //1:群id不存在 2:群已满 + optional string error_msg = 2; //错误消息 } message CMGroupAgree @@ -119,13 +123,17 @@ message SMGroupAgree optional string error_msg = 2; } +//踢人 message CMGroupKick { + optional string account_id = 1; } + +//踢人回复 message SMGroupKick { - optional int32 error_code = 1; - optional string error_msg = 2; + optional int32 error_code = 1; //1:群id错误 + optional string error_msg = 2; //错误消息 } message CMGroupQuit diff --git a/server/tools/protobuild/ss_proto.proto b/server/tools/protobuild/ss_proto.proto index 8e972a3..a8fdce0 100755 --- a/server/tools/protobuild/ss_proto.proto +++ b/server/tools/protobuild/ss_proto.proto @@ -9,6 +9,8 @@ message MFIMMsgConext optional int32 sex = 5; optional int32 online = 6; optional int32 msgid = 7; + optional int64 group_id = 8; + optional int32 data_version1 = 9; } message SS_WSP_SocketDisconnect @@ -75,7 +77,13 @@ message SS_IM_ForwardMsg optional bytes payload = 2; } -message SS_MS_ForwardGroupMsg +message SS_MS_ForwardGroupCMMsg +{ + optional MFIMMsgConext context = 1; + optional bytes payload = 2; +} + +message SS_MS_ForwardGroupSMMsg { optional MFIMMsgConext context = 1; optional bytes payload = 2; diff --git a/sql/relationdb_n.sql b/sql/relationdb_n.sql index fd9dc24..ae1a09d 100644 --- a/sql/relationdb_n.sql +++ b/sql/relationdb_n.sql @@ -63,6 +63,7 @@ DROP TABLE IF EXISTS `group`; CREATE TABLE `group` ( `idx` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id', `group_id` bigint NOT NULL COMMENT 'group_id', + `group_name` tinyblob COMMENT 'group_name', `owner_id` varchar(60) CHARACTER SET utf8 NOT NULL COMMENT '群主', `creator_id` varchar(60) CHARACTER SET utf8 NOT NULL COMMENT '群创建者', `group_data` mediumblob COMMENT '群数据',