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

TeamTalk GroupModel详解相关推荐

  1. TeamTalk Netlib详解

    1.简介 主要用于处理tcp连接,自己实现了一个网络库 2.类与接口 2.1 CBaseSocket:socket基础类,封装了常用网络api void CBaseSocket::_SetReuseA ...

  2. TeamTalk slog详解

    1.简介 slog模块依赖于log4cxx,实际是对log4cxx的进一步封装. 2.主要类关系说明: CSLog teamtalk日志类,利用内部成员(CSLogObject* m_log)调用CS ...

  3. 【转】WebSocket详解(一):初步认识WebSocket技术

    1.前言 HTML5规范在传统的web交互基础上为我们带来了众多的新特性,随着web技术被广泛用于web APP的开发,这些新特性得以推广和使用,而websocket作为一种新的web通信技术具有巨大 ...

  4. WebSocket详解(一):初步认识WebSocket技术

    WebSocket详解(一):初步认识WebSocket技术 1.前言 HTML5规范在传统的web交互基础上为我们带来了众多的新特性,随着web技术被广泛用于web APP的开发,这些新特性得以推广 ...

  5. P2P技术详解(一):NAT详解——详细原理、P2P简介(转)

    这是一篇介绍NAT技术要点的精华文章,来自华3通信官方资料库,文中对NAT技术原理的介绍很全面也很权威,对网络应用的应用层开发人员而言有很高的参考价值. <P2P技术详解>系列文章 ➊ 本 ...

  6. 015. P2P技术详解(一):NAT详解——详细原理、P2P简介

    http://www.52im.net/thread-50-1-1.html 这是一篇介绍NAT技术要点的精华文章,来自华3通信官方资料库,文中对NAT技术原理的介绍很全面也很权威,对网络应用的应用层 ...

  7. (转)理论经典:TCP协议的3次握手与4次挥手过程详解

    摘要: 本文将分别讲解经典的TCP协议建立连接(所谓的"3次握手")和断开连接(所谓的"4次挥手")的过程. 1.前言 尽管TCP和UDP都使用相同的网络层(I ...

  8. Web端即时通讯技术原理详解

    Web端即时通讯技术原理详解 前言 在web端的IM即时通讯应用,由于浏览器的兼容性以及其固有的"客户端请求服务器处理并响应"的C/S通信模型,造成了要在浏览器中实现一个兼容性较好 ...

  9. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  10. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

最新文章

  1. 关于数据库group by需要注意
  2. Netflix CEO哈斯廷斯:内容为王 公司潜力依然巨大
  3. 当进度对话框和后台线程处于活动状态时,如何处理屏幕方向变化?
  4. 数据中台建设中的得与失
  5. kali-linux虚拟机与主机共享文件
  6. Container View Controller
  7. php ftp 创建文件夹失败,PHP使用FTP函数创建目录
  8. (原+转)使用opencv的DFT计算卷积
  9. raspberry pi_如何使用Raspberry Pi构建数字针Kong相机
  10. 英特尔展示业界首个一体封装光学以太网交换机
  11. java ftp 上传文件到服务器,java实现ftp上传文件到服务器
  12. java 铁路管理信息系统_基于Java铁路售票系统的设计与实现(含录像)(SqlServer)
  13. 计算机毕业设计之流浪宠物管理系统
  14. php 自定义模板标签,自定义模板解析list标签
  15. 学习笔记图片从本地复制到csdn博客出现:外链图片转存失败:解决方法
  16. python实现下载压缩包并且解压
  17. 华为G9怎么找到云相册_华为p9云服务怎样设置自动同步
  18. 星空云协同开发入门(一)
  19. 2021年新安装的Win7系统,Windows Update无法更新,提示错误代码80072EFE
  20. oracle查看表sql语句,oracle查看创造表的sql语句

热门文章

  1. 必备电子技术经典资料汇总:基础入门篇1.6G
  2. 一文读懂RFID射频识别技术
  3. bp神经网络优化算法对比,bp神经网络的优化算法
  4. 三个变量存在一个协整方程_计量经济学第12讲(时间序列计量经济学模型:协整与误差修正模型)...
  5. linux系统桌面放大镜,Ubuntu下怎样使用放大镜辅助功能
  6. 【ant Design vue使用腾讯播放器实现监控视频直播、点播,多个视频同时播放】
  7. macOS Windows版本 Photoshop 下载 AI下载
  8. EGE基础:键盘输入篇
  9. 简单的网页在线咨询代码
  10. GhostScript 沙箱绕过(命令执行)漏洞(CVE-2018-19475)复现