tencent-im/group/group.go
2022-09-27 11:31:23 +08:00

384 lines
8.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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
}