IM开发——群组创建业务设计

需求分析

群聊是很基础的功能需求,在进行群组聊天前,逃不过创建群组的这么一个过程。

接下来,我们对微信进行一个简单的分析,然后设计一套类似于微信操作体验的业务。

主动方:
在这里插入图片描述

被动方:
在这里插入图片描述
所以,根据上面的图,分析可得:

  1. 创建群组的时候,需要能指定成员列表
  2. 创建成功后,要自动创建会话,并产生一条群提示,广播给其他人,被邀请加入了群聊。

模块交互设计

在这里插入图片描述

  1. app发送创建群组请求,附带群组名称(为空时,自动生成群名)和成员列表
  2. 转发
  3. 插入群组
  4. 添加成员
  5. 为每个人创建群聊会话
  6. 插入一条群聊消息,消息类型为tips,内容为"xx邀请你,yy和zz加入群聊",并添加到attach_notificatino_msg字段中,以便gate网关,直接广播系统通知消息给对应的群成员
  7. 返回
  8. 给客户端响应,客户端读取会话ID和加载tips内容“你邀请xx,yy和zz加入了群聊”
  9. 广播群聊消息
  10. 广播群聊消息

协议设计

创建群

// 创建讨论组群请求(类似微信):
// 1.无需对方同意
// 2.群成员可邀请任何人进群
// 3.创建人默认为群主,群主可转让,群主退出默认随机一个成员自动成为群主
// 4.只有群主可修改群公告,踢人
message CIMGroupCreateReq {
  // cmd id: 		0x501
  uint64 user_id = 1;
  string group_name = 2;              // 群名,不指定则由服务端生成
  repeated uint64 member_id_list = 3; // 群成员列表
}

// 群组创建响应
message CIMGroupCreateRsp {
  // cmd id: 		0x502
  uint64 user_id = 1;
  uint32 result_code = 2;
  CIMGroupInfo group_info = 3;        // 群信息
  repeated uint64 member_id_list = 4; // 群成员列表
  bytes attach_notificatino_msg = 10; // 群创建系统通知,需要广播
}

// 群组类型
enum CIMGroupType {
  kCIM_GROUP_TYPE_UNKNOWN = 0;
  kCIM_GROUP_TYPE_GROUP_NORMAL = 1; // 普通群(200人)
  kCIM_GROUP_TYPE_GROUP_SUPER = 2;  // 超级群(2000人)
}

// 加群模式
enum CIMGroupJoinModel {
  kCIM_GROUP_JOIN_MODEL_DEFAULT = 0;   // 所有人可邀请别人加入
  kCIM_GROUP_JOIN_MODEL_NEED_AUTH = 1; // 需要管理员验证
  kCIM_GROUP_JOIN_MODEL_REJECT = 2;    // 拒绝所有人
}

// 被邀请人同意方式
enum CIMGroupBeInviteMode {
  kCIM_GROUP_BE_INVITE_MODEL_DEFAULT = 0;    // 不需要同意
  kCIM_GROUP_BE_INVITE_MODEL_NEED_AGREE = 1; // 需要同意
}

// 禁言方式
enum CIMGroupMuteModel {
  kCIM_GROUP_MUTE_MODEL_DEFAULT = 0; // 不禁言
  kCIM_GROUP_MUTE_MODEL_ALL = 1;     // 全体禁言
}

// 群组信息
message CIMGroupInfo {
  uint64 group_id = 1;                      // 群组ID
  string group_name = 2;                    // 群组名称(最大128字符)
  CIMGroupType group_type = 3;              // 群类型
  CIMGroupJoinModel join_model = 4;         // 入群模式
  CIMGroupBeInviteMode be_invite_model = 5; // 被邀请人同意方式
  CIMGroupMuteModel mute_model = 6;         // 禁言模式
  uint64 group_owner_id = 7;                // 群主
  uint32 create_time = 8;                   // 创建时间
  uint32 update_time = 9;                   // 群信息更新时间
  string group_intro = 10;  // 群介绍,别人搜索入群的时候显示
  string announcement = 11; // 群公告
  string group_avatar = 12; // 群头像
}

解散群

// 解散群请求
message CIMGroupDisbandingReq {
  // cmd id: 		0x503
  uint64 user_id = 1;
  uint64 group_id = 2;
}

message CIMGroupDisbandingRsp {
  // cmd id: 		0x504
  uint64 user_id = 1;
  uint64 group_id = 2;
  uint32 result_code = 3;
  bytes attach_notificatino_msg = 10; // 群解散系统通知,需要广播
}

退群

// 退出群
message CIMGroupExitReq {
  // cmd id: 		0x505
  uint64 user_id = 1;
  uint64 group_id = 2;
}

// 退出群
message CIMGroupExitRsp {
  // cmd id: 		0x506
  uint64 user_id = 1;
  uint64 group_id = 2;
  uint32 result_code = 3;
  bytes attach_notificatino_msg = 10; // 群成员退出群系统通知,需要广播
}

查询群列表

// 查询群列表请求
message CIMGroupListReq {
  // cmd id: 		0x507
  uint64 user_id = 1;
}

// 查询群列表响应
message CIMGroupListRsp {
  // cmd id: 		0x508
  uint64 user_id = 1;
  repeated CIMGroupVersionInfo group_version_list = 2;
}

// 群版本信息
message CIMGroupVersionInfo {
  uint64 group_id = 1;
  uint32 group_version = 2;
}

注意,这里返回的是ID+群版本号,可以方便将来扩展。具体的群信息,还需要查询一次。

群信息

// 查询群信息请求
message CIMGroupInfoReq {
  // cmd id: 		0x509
  uint64 user_id = 1;
  repeated CIMGroupVersionInfo group_version_list = 2;
}

// 查询群信息响应
message CIMGroupInfoRsp {
  // cmd id: 		0x510
  uint64 user_id = 1;
  uint32 result_code = 2;
  repeated CIMGroupInfo group_info_list = 3;
}

拉人

// 邀请人入群请求
message CIMGroupInviteMemberReq {
  // cmd id: 		0x511
  uint64 user_id = 1;
  uint64 group_id = 2;
  repeated uint64 member_id_list = 3; // 成员ID列表
}

// 邀请人入群响应
message CIMGroupInviteMemberRsp {
  // cmd id: 		0x512
  uint64 user_id = 1;
  uint64 group_id = 2;
  uint32 result_code = 3;
  bytes attach_notificatino_msg = 10; // 入群系统通知,需要广播
}

为了简化,这里没有验证机制,而是直接把对方加入到群内。

踢人

// 踢人请求
message CIMGroupKickOutMemberReq {
  // cmd id: 		0x513
  uint64 user_id = 1;
  uint64 group_id = 2;
  repeated uint64 member_id_list = 3; // 成员ID列表
}

// 踢人响应
message CIMGroupKickOutMemberRsp {
  // cmd id: 		0x514
  uint64 user_id = 1;
  uint64 group_id = 2;
  uint32 result_code = 3;
  bytes attach_notificatino_msg = 10; // 踢人系统通知,需要广播
}

效果

待实现后更新。

关于作者

推荐下自己的开源IM,纯Golang编写:

CoffeeChat:
https://github.com/xmcy0011/CoffeeChat
opensource im with server(go) and client(flutter+swift)

参考了TeamTalk、瓜子IM等知名项目,包含服务端(go)和客户端(flutter+swift),单聊和机器人(小微、图灵、思知)聊天功能已完成,目前正在研发群聊功能,欢迎对golang和跨平台开发flutter技术感兴趣的小伙伴Star加关注。

————————————————
版权声明:本文为CSDN博主「许非」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xmcy001122/article/details/109451167

猜你喜欢

转载自blog.csdn.net/xmcy001122/article/details/109451167