384 lines
8.6 KiB
Go
384 lines
8.6 KiB
Go
|
/**
|
|||
|
* @Author: Echo
|
|||
|
* @Author:1711788888@qq.com
|
|||
|
* @Date: 2021/9/7 17:11
|
|||
|
* @Desc: TODO
|
|||
|
*/
|
|||
|
|
|||
|
package group
|
|||
|
|
|||
|
import (
|
|||
|
"time"
|
|||
|
|
|||
|
"git.echol.cn/loser/tencent-im/internal/core"
|
|||
|
"git.echol.cn/loser/tencent-im/internal/enum"
|
|||
|
)
|
|||
|
|
|||
|
var (
|
|||
|
errNotSetGroupType = core.NewError(enum.InvalidParamsCode, "group type is not set")
|
|||
|
errNotSetGroupName = core.NewError(enum.InvalidParamsCode, "group name is not set")
|
|||
|
errGroupNameTooLong = core.NewError(enum.InvalidParamsCode, "group name is too long")
|
|||
|
errInvalidGroupType = core.NewError(enum.InvalidParamsCode, "invalid group type")
|
|||
|
errGroupIntroductionTooLong = core.NewError(enum.InvalidParamsCode, "group introduction is too long")
|
|||
|
errGroupNotificationTooLong = core.NewError(enum.InvalidParamsCode, "group notification is too long")
|
|||
|
)
|
|||
|
|
|||
|
type (
|
|||
|
// Type 群类型
|
|||
|
Type string
|
|||
|
|
|||
|
// ApplyJoinOption 申请加群处理方式
|
|||
|
ApplyJoinOption string
|
|||
|
|
|||
|
// ShutUpStatus 全员禁言状态
|
|||
|
ShutUpStatus string
|
|||
|
)
|
|||
|
|
|||
|
const (
|
|||
|
TypePublic Type = "Public" // Public(陌生人社交群)
|
|||
|
TypePrivate Type = "Private" // Private(即 Work,好友工作群)
|
|||
|
TypeChatRoom Type = "ChatRoom" // ChatRoom(即 Meeting,会议群)
|
|||
|
TypeLiveRoom Type = "AVChatRoom" // AVChatRoom(直播群)
|
|||
|
|
|||
|
ApplyJoinOptionFreeAccess ApplyJoinOption = "FreeAccess" // 自由加入
|
|||
|
ApplyJoinOptionNeedPermission ApplyJoinOption = "NeedPermission" // 需要验证
|
|||
|
ApplyJoinOptionDisableApply ApplyJoinOption = "DisableApply" // 禁止加群
|
|||
|
|
|||
|
ShutUpStatusOn ShutUpStatus = "On" // 开启
|
|||
|
ShutUpStatusOff ShutUpStatus = "Off" // 关闭
|
|||
|
)
|
|||
|
|
|||
|
type Group struct {
|
|||
|
err error
|
|||
|
id string // 群ID
|
|||
|
name string // 群名称
|
|||
|
groupType Type // 群类型
|
|||
|
owner string // 群主ID
|
|||
|
introduction string // 群简介
|
|||
|
notification string // 群公告
|
|||
|
avatar string // 群头像
|
|||
|
memberNum uint // 群成员数
|
|||
|
maxMemberNum uint // 最大群成员数量
|
|||
|
applyJoinOption string // 申请加群处理方式
|
|||
|
members []*Member // 群成员
|
|||
|
customData map[string]interface{} // 群自定义数据
|
|||
|
createTime int64 // 群创建时间
|
|||
|
lastInfoTime int64 // 最后群资料变更时间
|
|||
|
lastMsgTime int64 // 群内最后一条消息的时间
|
|||
|
nextMsgSeq int // 群内下一条消息的Seq
|
|||
|
shutUpStatus string // 群全员禁言状态
|
|||
|
}
|
|||
|
|
|||
|
func NewGroup(id ...string) *Group {
|
|||
|
group := &Group{}
|
|||
|
if len(id) > 0 {
|
|||
|
group.SetGroupId(id[0])
|
|||
|
}
|
|||
|
return group
|
|||
|
}
|
|||
|
|
|||
|
// SetGroupId 设置群ID
|
|||
|
func (g *Group) SetGroupId(id string) {
|
|||
|
g.id = id
|
|||
|
}
|
|||
|
|
|||
|
// GetGroupId 获取群ID
|
|||
|
func (g *Group) GetGroupId() string {
|
|||
|
return g.id
|
|||
|
}
|
|||
|
|
|||
|
// SetOwner 设置群主ID
|
|||
|
func (g *Group) SetOwner(owner string) {
|
|||
|
g.owner = owner
|
|||
|
}
|
|||
|
|
|||
|
// GetOwner 获取群主ID
|
|||
|
func (g *Group) GetOwner() string {
|
|||
|
return g.owner
|
|||
|
}
|
|||
|
|
|||
|
// SetName 设置群名称
|
|||
|
func (g *Group) SetName(name string) {
|
|||
|
g.name = name
|
|||
|
}
|
|||
|
|
|||
|
// GetName 获取群名称
|
|||
|
func (g *Group) GetName() string {
|
|||
|
return g.name
|
|||
|
}
|
|||
|
|
|||
|
// SetGroupType 设置群类型
|
|||
|
func (g *Group) SetGroupType(groupType Type) {
|
|||
|
g.groupType = groupType
|
|||
|
}
|
|||
|
|
|||
|
// GetGroupType 获取群类型
|
|||
|
func (g *Group) GetGroupType() Type {
|
|||
|
return g.groupType
|
|||
|
}
|
|||
|
|
|||
|
// SetIntroduction 设置群简介
|
|||
|
func (g *Group) SetIntroduction(introduction string) {
|
|||
|
g.introduction = introduction
|
|||
|
}
|
|||
|
|
|||
|
// GetIntroduction 获取群简介
|
|||
|
func (g *Group) GetIntroduction() string {
|
|||
|
return g.introduction
|
|||
|
}
|
|||
|
|
|||
|
// SetNotification 设置群公告
|
|||
|
func (g *Group) SetNotification(notification string) {
|
|||
|
g.notification = notification
|
|||
|
}
|
|||
|
|
|||
|
// GetNotification 获取群公告
|
|||
|
func (g *Group) GetNotification() string {
|
|||
|
return g.notification
|
|||
|
}
|
|||
|
|
|||
|
// SetAvatar 设置群头像
|
|||
|
func (g *Group) SetAvatar(avatar string) {
|
|||
|
g.avatar = avatar
|
|||
|
}
|
|||
|
|
|||
|
// GetAvatar 获取群头像
|
|||
|
func (g *Group) GetAvatar() string {
|
|||
|
return g.avatar
|
|||
|
}
|
|||
|
|
|||
|
// SetMaxMemberNum 设置最大群成员数量
|
|||
|
func (g *Group) SetMaxMemberNum(maxMemberNum uint) {
|
|||
|
g.maxMemberNum = maxMemberNum
|
|||
|
}
|
|||
|
|
|||
|
// GetMaxMemberNum 获取最大群成员数量
|
|||
|
func (g *Group) GetMaxMemberNum() uint {
|
|||
|
return g.maxMemberNum
|
|||
|
}
|
|||
|
|
|||
|
// GetMemberNum 获取群成员数
|
|||
|
func (g *Group) GetMemberNum() uint {
|
|||
|
return g.memberNum
|
|||
|
}
|
|||
|
|
|||
|
// SetApplyJoinOption 设置申请加群处理方式
|
|||
|
func (g *Group) SetApplyJoinOption(applyJoinOption ApplyJoinOption) {
|
|||
|
g.applyJoinOption = string(applyJoinOption)
|
|||
|
}
|
|||
|
|
|||
|
// GetApplyJoinOption 获取申请加群处理方式
|
|||
|
func (g *Group) GetApplyJoinOption() string {
|
|||
|
return g.applyJoinOption
|
|||
|
}
|
|||
|
|
|||
|
// AddMembers 添加群成员
|
|||
|
func (g *Group) AddMembers(member ...*Member) {
|
|||
|
if g.members == nil {
|
|||
|
g.members = make([]*Member, 0)
|
|||
|
}
|
|||
|
|
|||
|
g.members = append(g.members, member...)
|
|||
|
}
|
|||
|
|
|||
|
// SetMembers 设置群成员
|
|||
|
func (g *Group) SetMembers(member ...*Member) {
|
|||
|
if g.members != nil {
|
|||
|
g.members = g.members[0:0]
|
|||
|
}
|
|||
|
|
|||
|
g.AddMembers(member...)
|
|||
|
}
|
|||
|
|
|||
|
// SetCustomData 设置自定义数据
|
|||
|
func (g *Group) SetCustomData(name string, value interface{}) {
|
|||
|
if g.customData == nil {
|
|||
|
g.customData = make(map[string]interface{})
|
|||
|
}
|
|||
|
|
|||
|
g.customData[name] = value
|
|||
|
}
|
|||
|
|
|||
|
// GetCustomData 获取自定义数据
|
|||
|
func (g *Group) GetCustomData(name string) (val interface{}, exist bool) {
|
|||
|
if g.customData == nil {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
val, exist = g.customData[name]
|
|||
|
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// GetAllCustomData 获取所有自定义数据
|
|||
|
func (g *Group) GetAllCustomData() map[string]interface{} {
|
|||
|
return g.customData
|
|||
|
}
|
|||
|
|
|||
|
// GetMembers 获取群成员
|
|||
|
func (g *Group) GetMembers() []*Member {
|
|||
|
return g.members
|
|||
|
}
|
|||
|
|
|||
|
// GetGroupCreateTime 获取群创建时间
|
|||
|
func (g *Group) GetGroupCreateTime() time.Time {
|
|||
|
return time.Unix(g.createTime, 0)
|
|||
|
}
|
|||
|
|
|||
|
// GetLastInfoTime 获取最后群资料变更时间
|
|||
|
func (g *Group) GetLastInfoTime() time.Time {
|
|||
|
return time.Unix(g.lastInfoTime, 0)
|
|||
|
}
|
|||
|
|
|||
|
// GetLastMsgTime 获取群内最后一条消息的时间
|
|||
|
func (g *Group) GetLastMsgTime() time.Time {
|
|||
|
return time.Unix(g.lastMsgTime, 0)
|
|||
|
}
|
|||
|
|
|||
|
// GetNextMsgSeq 获取群内下一条消息的Seq
|
|||
|
func (g *Group) GetNextMsgSeq() int {
|
|||
|
return g.nextMsgSeq
|
|||
|
}
|
|||
|
|
|||
|
// SetShutUpStatus 设置全员禁言状态
|
|||
|
func (g *Group) SetShutUpStatus(shutUpStatus ShutUpStatus) {
|
|||
|
g.shutUpStatus = string(shutUpStatus)
|
|||
|
}
|
|||
|
|
|||
|
// GetShutUpStatus 获取群全员禁言状态
|
|||
|
func (g *Group) GetShutUpStatus() string {
|
|||
|
return g.shutUpStatus
|
|||
|
}
|
|||
|
|
|||
|
// SetCreateTime 设置群组创建时间
|
|||
|
func (g *Group) SetCreateTime(createTime int64) {
|
|||
|
g.createTime = createTime
|
|||
|
}
|
|||
|
|
|||
|
// GetCreateTime 获取群组创建时间
|
|||
|
func (g *Group) GetCreateTime() int64 {
|
|||
|
return g.createTime
|
|||
|
}
|
|||
|
|
|||
|
// IsValid 检测用户是否有效
|
|||
|
func (g *Group) IsValid() bool {
|
|||
|
return g.err == nil
|
|||
|
}
|
|||
|
|
|||
|
// GetError 获取异常错误
|
|||
|
func (g *Group) GetError() error {
|
|||
|
return g.err
|
|||
|
}
|
|||
|
|
|||
|
// 设置异常错误
|
|||
|
func (g *Group) setError(code int, message string) {
|
|||
|
if code != enum.SuccessCode {
|
|||
|
g.err = core.NewError(code, message)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 检测创建错误
|
|||
|
func (g *Group) checkCreateError() (err error) {
|
|||
|
if err = g.checkTypeArgError(); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if err = g.checkNameArgError(); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if err = g.checkIntroductionArgError(); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if err = g.checkNotificationArgError(); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// 检测导入错误
|
|||
|
func (g *Group) checkImportError() (err error) {
|
|||
|
if err = g.checkTypeArgError(); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if err = g.checkNameArgError(); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if err = g.checkIntroductionArgError(); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if err = g.checkNotificationArgError(); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// 检测更新错误
|
|||
|
func (g *Group) checkUpdateError() (err error) {
|
|||
|
if err = g.checkNameArgError(); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if err = g.checkIntroductionArgError(); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if err = g.checkNotificationArgError(); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// 检测群名称参数错误
|
|||
|
func (g *Group) checkNameArgError() error {
|
|||
|
if g.name == "" {
|
|||
|
return errNotSetGroupName
|
|||
|
}
|
|||
|
|
|||
|
if len(g.name) > 30 {
|
|||
|
return errGroupNameTooLong
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// 检测群类型参数错误
|
|||
|
func (g *Group) checkTypeArgError() error {
|
|||
|
if g.groupType == "" {
|
|||
|
return errNotSetGroupType
|
|||
|
}
|
|||
|
|
|||
|
switch Type(g.groupType) {
|
|||
|
case TypePublic, TypePrivate, TypeChatRoom, TypeLiveRoom:
|
|||
|
default:
|
|||
|
return errInvalidGroupType
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// 检测群简介参数错误
|
|||
|
func (g *Group) checkIntroductionArgError() error {
|
|||
|
if len(g.introduction) > 240 {
|
|||
|
return errGroupIntroductionTooLong
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// 检测群公告参数错误
|
|||
|
func (g *Group) checkNotificationArgError() error {
|
|||
|
if len(g.notification) > 300 {
|
|||
|
return errGroupNotificationTooLong
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|