This commit is contained in:
aozhiwei 2020-05-12 15:32:31 +08:00
parent 2295c54556
commit 7e0aec0938
10 changed files with 229 additions and 29 deletions

View File

@ -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()
{
}

View File

@ -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<std::string, GroupMember*> member_hash_;
};

View File

@ -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);
}

View File

@ -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<GroupMgr>
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<GroupMgr>
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<long long, Group*> id_hash_;
};

View File

@ -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);

View File

@ -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);

View File

@ -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<std::string, Friend> friend_hash_;

View File

@ -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

View File

@ -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;

View File

@ -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 '群数据',