需求分析
群聊是很基础的功能需求,在进行群组聊天前,逃不过创建群组的这么一个过程。
接下来,我们对微信进行一个简单的分析,然后设计一套类似于微信操作体验的业务。
主动方:
被动方:
所以,根据上面的图,分析可得:
- 创建群组的时候,需要能指定成员列表
- 创建成功后,要自动创建会话,并产生一条群提示,广播给其他人,被邀请加入了群聊。
模块交互设计
- app发送创建群组请求,附带群组名称(为空时,自动生成群名)和成员列表
- 转发
- 插入群组
- 添加成员
- 为每个人创建群聊会话
- 插入一条群聊消息,消息类型为tips,内容为"xx邀请你,yy和zz加入群聊",并添加到attach_notificatino_msg字段中,以便gate网关,直接广播系统通知消息给对应的群成员
- 返回
- 给客户端响应,客户端读取会话ID和加载tips内容“你邀请xx,yy和zz加入了群聊”
- 广播群聊消息
- 广播群聊消息
协议设计
创建群
// 创建讨论组群请求(类似微信):
// 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