当前位置: 首页 > 工具软件 > TeamTalk5 > 使用案例 >

TeamTalk GroupModel详解

都昊乾
2023-12-01

1. 简介

该模块用于群组管理;
redis group_member库里key为group_member_nGroupId的哈希表存储了相应nGroupId里所有的成员id及加入时间戳;
redis group_set库里key为group_set_nGroupId的哈希表存储了群消息屏蔽状态信息
mysql IMGroup表主要存储了所有群组的创建者 成员数 版本和状态等信息,可以参考源码ttopen.sql里IMGroup表结构;IMGroupMember主要存储了某个群组成员 状态等信息,可以参考源码ttopen.sql里IMGroupMember表结构;

2. 类与接口

CGroupModel

① bool insertNewGroup(uint32_t nUserId, const string& strGroupName, const
string& strGroupAvatar, uint32_t nGroupType, uint32_t nMemberCnt, uint32_t& nGroupId)
向mysql IMGroup插入群组信息

② bool insertNewMember(uint32_t nGroupId, set<uint32_t>& setUsers)
向mysql IMGroupMember id为nGroupId的群组里插入setUsers里的所有userId,并更新IMGroup里userCnt;
若已经在setUsers中则更新状态,同时更新一份到redis group_member库中,key为group_member_nGroupId,field为setUsers里的userId,value为时间戳

③ void getGroupVersion(list<uint32_t>&lsGroupId, list<IM::BaseDefine::GroupVersionInfo>& lsGroup, uint32_t nGroupType)
从mysql IMGrup里获取id在lsGroupId里所有群组版本信息,存入lsGroup

④ bool hasModifyPermission(uint32_t nUserId, uint32_t nGroupId, IM::BaseDefine::GroupModifyType nType)
判断群组是否具有修改权限;
若群组类型为GROUP_TYPE_TMP且nType为GROUP_MODIFY_TYPE_ADD则返回true;
当上述条件不满足但creator为nUserId时也返回true;
其他情况返回false

⑤ bool removeMember(uint32_t nGroupId, set<uint32_t>& setUser,list<uint32_t>& lsCurUserId)
更新mysql IMGroupMember里groupId为nGroupId, userId在setUser里的成员状态为1(0-正常,1-已退出);
将redis group_member库里哈希表key为group_member_nGroupId field在setUser里的字段删除

⑥ void removeRepeatUser(uint32_t nGroupId, set<uint32_t>& setUser)
若setUser里userid在redis里则剔除

⑦ void removeSession(uint32_t nGroupId, const set<uint32_t>& lsUser)

⑧ bool incGroupVersion(uint32_t nGroupId)
将mysql IMGroup里id为nGroupId的version加1

⑨ void clearGroupMember(uint32_t nGroupId)
删除mysql IMGroupMember里groupId为nGroupId的记录,
同时删除redis里group_member库里相关哈希表key为group_member_nGroupId的相关字段

⑩ void getGroupUser(uint32_t nGroupId, list<uint32_t>& lsUserId)
从redis group_member库里哈希表key为group_member_nGroupId的所有字段,将该key的所有filed存入lsUserId

⑪ void getUserGroupIds(uint32_t nUserId, list<uint32_t>& lsGroupId, uint32_t nLimited = 100)
从mysql获取成员nUserId所加入的群组
从mysql IMGroupMember里获取userId为nUserId 状态正常 前nLimited条记录的groupId,存入lsGroupId

⑫ bool isInGroup(uint32_t nUserId, uint32_t nGroupId)
判断nUserId是否在群组nGroupId里
通过查找redis group_member库哈希表key为group_member_nGroupId filed为nUserId的字段判断成员是否存在

⑬ void removeRepeatUser(uint32_t nGroupId, set<uint32_t>& setUser)
若setUser里userid在redis里则剔除

⑭ bool setPush(uint32_t nUserId, uint32_t nGroupId, uint32_t nType, uint32_t nStatus)
若nUserId在群组nGroupId里则向redis group_set库 key为group_set_nGroupId的哈希表插入nUserId的屏蔽状态信息;
0屏蔽 1显示

⑮ void getPush(uint32_t nGroupId, list<uint32_t>& lsUser, list<IM::BaseDefine::ShieldStatus>& lsPush)
获取redis group_set库里key为group_set_nGroupId的哈希表里用户在lsUser的屏蔽状态信息,将获取到的信息存入lsPush

⑯ void updateGroupChat(uint32_t nGroupId)
更新mysql IMGroup表里id为nGroupId的群组lastChated信息

⑰ bool isValidateGroupId(uint32_t nGroupId)
判断群组nGroupId是否存在(判断是否在redis group_member库里)

⑱ uint32_t getUserJoinTime(uint32_t nGroupId, uint32_t nUserId)
获取成员nUserId加入群组nGroupId时间戳(通过查阅redis group_member库 key为group_member_nGroupId的哈希表获取)

其余接口函数基本都是利用上述接口实现更复杂的业务功能

3. test_groupmodel.cpp说明

① test_create_group模拟win_client 点击创建群组,成员有3个,id分别是1 17 18;
② test_getnormalgrouplist模拟win client获取该用户所在永久(GROUP_TYPE_NORMAL)群组列表信息;
③ test_modifymember模拟win client移除指定群组里指定成员;
④ test_setgrouppush模拟win client显示群消息;

4. 源码

链接:TeamTalk_BlueBling
测试demo:tests/test_groupmodel.cpp

 类似资料: