group

package
v1.8.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 4, 2026 License: Apache-2.0 Imports: 49 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// GroupStatusDisabled 已禁用
	GroupStatusDisabled = 0
	// GroupStatusNormal 正常
	GroupStatusNormal = 1
	// GroupStatusDisband 解散
	GroupStatusDisband = 2
)

群状态

View Source
const (
	// MemberRoleCommon 普通成员
	MemberRoleCommon = 0
	// MemberRoleCreator 创建者
	MemberRoleCreator = 1
	// MemberRoleManager 管理者
	MemberRoleManager = 2
)

群成员角色

View Source
const (
	// InviteStatusWait 等待确认
	InviteStatusWait = 0
	// InviteStatusOK 已确认
	InviteStatusOK = 1
)
View Source
const (
	ChannelServiceName = "channel"
)
View Source
const GroupAttrKeyAllowExternal = "allow_external"

GroupAttrKeyAllowExternal 是否允许外部成员加入群的群属性 key。 定义在本模块而非 dmwork-lib.common,因为这是 OCTO 扩展属性,未进入上游 lib。

View Source
const GroupAttrKeyAllowNoMention = "allow_no_mention"

GroupAttrKeyAllowNoMention 群级「允许免@生效」总开关的群属性 key。群主/管理员可控, 与 bot 主人的 bot_mention_pref 两轴 AND:最终免@ = bot主人开了本群免@ AND 群管理员允许本群免@。 同为 OCTO 扩展属性,未进入上游 lib。

View Source
const MaxGroupNameLen = 50

MaxGroupNameLen 群名最大长度(按 rune 计)。Web / Bot / Integration 建群与改名共用, 超长一律静默截断到此长度(API 层可前置 reject 给出明确错误)。配套的 `group`.`name` 列宽由迁移加宽到 VARCHAR(50),两者必须一致,否则 MySQL 严格模式下会报 Data too long。

Variables

View Source
var ErrBotOwnershipDenied = errors.New("no permission to invite this bot")

ErrBotOwnershipDenied is returned when the inviter is not the creator of a bot they are trying to add to a group.

Security context: YUJ-46 (github.com/Mininglamp-OSS/octo-server issue #1181). Before this check, any group member could add any bot to any group, bypassing the bot creator's consent. The strict default enforced here is that **only a bot's creator can invite their bot into any group**; group admins/owners and arbitrary members cannot invite other people's bots.

Product rules currently deferred (see PR / issue for decision trail):

  • Group admins do NOT get a pass for cross-creator bot invites.
  • No system-bot / public-bot whitelist exists yet.
  • Whether a bot is auto-kicked when its creator leaves is out of scope.

Functions

func GetGroupMdMaxSize

func GetGroupMdMaxSize() int

GetGroupMdMaxSize returns the max GROUP.md size from env or default (10240)

Types

type AddGroupMembersServiceReq

type AddGroupMembersServiceReq struct {
	GroupNo      string   // 群编号
	Members      []string // 待添加成员 UID 列表
	OperatorUID  string   // 操作者 UID
	OperatorName string   // 操作者名称
	TraceID      string   // 请求级 trace_id(reqid),用于串联 handler/service/auth/GIN 分段慢日志
}

AddGroupMembersServiceReq 添加群成员请求

type AddGroupMembersServiceResp

type AddGroupMembersServiceResp struct {
	Added int // 实际添加成功的数量
}

AddGroupMembersServiceResp 添加群成员响应

type AddGroupReq

type AddGroupReq struct {
	GroupNo string
	Name    string
}

AddGroupReq 添加群

type AddMemberReq

type AddMemberReq struct {
	GroupNo   string
	MemberUID string
}

AddMemberReq 添加群成员

type CategoryRow

type CategoryRow struct {
	CategoryID string `db:"category_id"`
	UID        string `db:"uid"`
	SpaceID    string `db:"space_id"`
	Status     int    `db:"status"`
}

type CreateGroupServiceReq

type CreateGroupServiceReq struct {
	Creator     string   // 创建者 UID
	Members     []string // 成员 UID 列表(不含创建者,Service 内部会自动加入)
	Name        string   // 群名称(可为空,Service 会自动生成)
	SpaceID     string   // Space ID(可为空)
	BotUID      string   // Bot UID(可为空;非空时自动加入群并设为 bot_admin)
	CategoryID  string   // 群聊分组 ID(可为空;非空时自动设置创建者的 group_setting)
	AvatarText  string   // 自定义群头像文字(可为空;空=按 is_named 回退:老群渲染群名/新群双人图标)
	AvatarColor *int     // 自定义群头像色板下标(nil=渲染时按 group_no 派生)
}

CreateGroupServiceReq 创建群请求

type CreateGroupServiceResp

type CreateGroupServiceResp struct {
	GroupNo        string   // 群编号
	Name           string   // 群名称
	SkippedMembers []string // 因不在 Space 而被过滤的成员 UID
}

CreateGroupServiceResp 创建群响应

type DB

type DB struct {
	// contains filtered or unexported fields
}

DB DB

func NewDB

func NewDB(ctx *config.Context) *DB

NewDB NewDB

func (*DB) DeleteGroupMd

func (d *DB) DeleteGroupMd(groupNo string) (int64, error)

DeleteGroupMd sets group_md=NULL and increments version. Uses a transaction to ensure UPDATE and SELECT LAST_INSERT_ID() share the same connection.

func (*DB) DeleteMember

func (d *DB) DeleteMember(groupNo string, uid string, version int64) error

DeleteMember 删除群成员

func (*DB) DeleteMemberTx

func (d *DB) DeleteMemberTx(groupNo string, uid string, version int64, tx *dbr.Tx) error

DeleteMemberTx 删除群成员

func (*DB) ExistMember

func (d *DB) ExistMember(uid string, groupNo string) (bool, error)

ExistMember 群成员是否在群内

func (*DB) ExistMemberActive

func (d *DB) ExistMemberActive(uid string, groupNo string) (bool, error)

ExistMemberActive 群成员是否在群内且处于正常状态(白名单语义,fail closed)。 与 ExistMember 的差别:额外要求 status=GroupMemberStatusNormal,明确排除 Blacklist 以及未来可能新增的非正常状态。 用于绕过 IM 层(直接读本地分表)的接口,避免被拉黑用户通过本地直查 拿到本应被 IM datasource 拦截的消息。

func (*DB) ExistMemberDelete

func (d *DB) ExistMemberDelete(uid string, groupNo string) (bool, error)

ExistMemberDelete 存在已删除的群成员数据

func (*DB) Insert

func (d *DB) Insert(m *Model) error

Insert 插入群信息

func (*DB) InsertInviteItemTx

func (d *DB) InsertInviteItemTx(model *InviteItemModel, tx *dbr.Tx) error

InsertInviteItemTx 添加邀请项

func (*DB) InsertInviteTx

func (d *DB) InsertInviteTx(model *InviteModel, tx *dbr.Tx) error

InsertInviteTx 添加邀请信息

func (*DB) InsertMember

func (d *DB) InsertMember(m *MemberModel) error

InsertMember 插入群成员信息

func (*DB) InsertMemberTx

func (d *DB) InsertMemberTx(m *MemberModel, tx *dbr.Tx) error

InsertMemberTx 插入群成员信息(带事务)

func (*DB) InsertTx

func (d *DB) InsertTx(m *Model, tx *dbr.Tx) error

InsertTx 插入群信息(含事务)

func (*DB) QueryBotMemberUIDs

func (d *DB) QueryBotMemberUIDs(groupNo string) ([]string, error)

QueryBotMemberUIDs returns UIDs of robot=1 members in the group

func (*DB) QueryBotUIDsOwnedByUIDs added in v1.6.1

func (d *DB) QueryBotUIDsOwnedByUIDs(groupNo string, ownerUIDs []string) ([]string, error)

QueryBotUIDsOwnedByUIDs 查询群内由 ownerUIDs 中任一用户名下(robot.creator_uid) 的未删除 bot 成员 UID 列表。与 QueryBotsInvitedByUIDTx 同口径:只命中 group_member.robot=1 AND is_deleted=0 且 robot.status=1 的 bot;孤儿(无 robot 行) 或禁用(status=0)bot 不视为任何人的 bot,不被级联。

非事务、无行锁版本,供拉黑/解除拉黑级联(#354)这类不开事务的路径使用: 被拉黑用户的 bot 若不连带拉黑,用户可经 bot 旁路读群/子区内容, 绕过 ExistMemberActive 加固线(#343/#345)。 故意不过滤 group_member.status:解除拉黑时需要把已是 Blacklist 状态的 bot 一并恢复。

func (*DB) QueryBotsInvitedByUIDTx

func (d *DB) QueryBotsInvitedByUIDTx(groupNo string, inviterUID string, tx *dbr.Tx) ([]string, error)

QueryBotsInvitedByUIDTx 事务内查询群里由 inviterUID 所拥有的活跃 bot 成员 UID 列表,带 FOR UPDATE 行锁。

D-2 cascade 语义(YUJ-49 / Mininglamp-OSS/octo-server#1186):

  • Bot 进群本质是邀请关系延伸(#1182 已强制 inviter == robot.creator_uid)
  • inviter 离群(主动退 / 被踢)时,应同事务级联移除其所有 bot

只返回同时满足以下条件的 bot UID:

  • group_member.robot = 1 AND is_deleted = 0(仍在群内的 bot 成员)
  • robot.creator_uid = inviterUID AND robot.status = 1(仍活跃、且属于 inviter)

为什么是 INNER JOIN + status=1:与 checkBotOwnership(bot_ownership.go)保持一致, 没有活跃 robot 行的 bot(孤儿 / 禁用)不视为任何人的 bot,不被级联。 群主 / 其他管理员仍可通过常规移除成员接口清理它们。

func (*DB) QueryCategoryByID

func (d *DB) QueryCategoryByID(categoryID string) (*CategoryRow, error)

func (*DB) QueryDetailWithGroupNo

func (d *DB) QueryDetailWithGroupNo(groupNo string, uid string) (*DetailModel, error)

QueryDetailWithGroupNo 查询群详情

func (*DB) QueryDetailWithGroupNos

func (d *DB) QueryDetailWithGroupNos(groupNos []string, uid string) ([]*DetailModel, error)

QueryDetailWithGroupNos 查询群集合

func (*DB) QueryExternalGroupNosForUser

func (d *DB) QueryExternalGroupNosForUser(uid string) (map[string]string, error)

QueryExternalGroupNosForUser 查询用户作为外部成员加入的群列表,返回 groupNo -> sourceSpaceID

func (*DB) QueryExternalMemberCountTx

func (d *DB) QueryExternalMemberCountTx(groupNo string, tx *dbr.Tx) (int64, error)

QueryExternalMemberCountTx 事务内查询群内「人类」外部成员数量(FOR UPDATE 行锁防并发)。 排除 robot=1 的 bot 成员:is_external_group 的语义只反映人类外部成员是否存在, bot 的 is_external + source_space_id 字段仅用于能力路由,不影响群的外部属性。 详见 YUJ-48 / Mininglamp-OSS/octo-server#1184。

func (*DB) QueryGroupManagerOrCreatorUIDS

func (d *DB) QueryGroupManagerOrCreatorUIDS(groupNo string) ([]string, error)

QueryGroupManagerOrCreatorUIDS 查询管理者或创建者的uid

func (*DB) QueryGroupMd

func (d *DB) QueryGroupMd(groupNo string) (*GroupMdResult, error)

QueryGroupMd queries GROUP.md content for a group

func (*DB) QueryGroupsWithGroupNos

func (d *DB) QueryGroupsWithGroupNos(groupNos []string) ([]*Model, error)

QueryGroupsWithGroupNos 通过群ID查询一批群信息

func (*DB) QueryInviteDetail

func (d *DB) QueryInviteDetail(inviteNo string) (*InviteDetailModel, error)

QueryInviteDetail 查询邀请详情

func (*DB) QueryInviteDetailForUpdateTx

func (d *DB) QueryInviteDetailForUpdateTx(inviteNo string, tx *dbr.Tx) (*InviteDetailModel, error)

QueryInviteDetailForUpdateTx 在事务内使用 FOR UPDATE 锁定邀请记录,防止并发修改

func (*DB) QueryInviteItemDetail

func (d *DB) QueryInviteItemDetail(inviteNo string) ([]*InviteItemDetailModel, error)

QueryInviteItemDetail 查询邀请item详情

func (*DB) QueryIsBotAdmin

func (d *DB) QueryIsBotAdmin(groupNo string, uid string) (bool, error)

QueryIsBotAdmin checks if a member is a bot admin in the group

func (*DB) QueryIsGroupCreator

func (d *DB) QueryIsGroupCreator(groupNo string, uid string) (bool, error)

QueryIsGroupCreator 是否是群创建者

func (*DB) QueryIsGroupManagerOrCreator

func (d *DB) QueryIsGroupManagerOrCreator(groupNo string, uid string) (bool, error)

QueryIsGroupManagerOrCreator 是否是群管理者或创建者

Fail-safe 过滤:

  • is_external=0:外部成员即使在 DB 中残留 role=creator/manager(历史脏数据或 绕过 managerAdd 入口校验写入),也不视为该群的管理者。与 managerAdd / transferGrouper 的前置 is_external 校验构成双层防御(YUJ-231 / GH#1289, ReviewBot YUJ-230 P1)。
  • status=GroupMemberStatusNormal:黑名单 / 已退出但 is_deleted 仍为 0 的成员 即便保留 role=creator/manager,也不视为有效管理者,避免被踢出的管理者继续 调用敏感 API(PR #31 round-3,Jerry-Xin)。

func (*DB) QueryMemberCount

func (d *DB) QueryMemberCount(groupNo string) (int64, error)

QueryMemberCount 查询群成员数量

func (*DB) QueryMemberWithUID

func (d *DB) QueryMemberWithUID(uid string, groupNo string) (*MemberModel, error)

QueryMemberWithUID 查询群成员

func (*DB) QueryMemberWithUIDAndGroupNos

func (d *DB) QueryMemberWithUIDAndGroupNos(uid string, groupNos []string) ([]*MemberModel, error)

QueryMemberWithUIDAndGroupNos

func (*DB) QueryMembersFirstNine

func (d *DB) QueryMembersFirstNine(groupNo string) ([]*MemberModel, error)

QueryMembersFirstNine 查询最先加入群聊的九为群成员

func (*DB) QueryMembersFirstNineExclude

func (d *DB) QueryMembersFirstNineExclude(groupNo string, excludeUIDs []string) ([]*MemberModel, error)

QueryMembersFirstNineExclude 查询最先加入群聊的九位群成员 【excludeUIDs】为排除的用户

func (*DB) QueryMembersWithStatus

func (d *DB) QueryMembersWithStatus(groupNo string, status int) ([]*MemberModel, error)

QueryMembersWithStatus 通过成员状态查询成员

func (*DB) QueryMembersWithUids

func (d *DB) QueryMembersWithUids(uids []string, groupNo string) ([]*MemberModel, error)

QueryMembersWithUids 查询群内的指定成员

func (*DB) QuerySecondOldestMemberExcludingBotsOf added in v1.6.1

func (d *DB) QuerySecondOldestMemberExcludingBotsOf(groupNo string, leaverUID string) (*MemberModel, error)

QuerySecondOldestMemberExcludingBotsOf 选出第二元老成员(群主退群时的新群主人选), 在 QuerySecondOldestMember 的基础上额外排除 leaverUID 名下(robot.creator_uid)的 活跃 bot:#354 起群主退群也会级联带走自己的 bot,这些 bot 在同一事务内即将离群, 不能被选为新群主(否则会出现「新群主刚上任就被级联删除」的孤儿群)。 其他人的 bot 不受影响,保持与旧选主逻辑一致。

func (*DB) QuerySourceSpaceIDForMember

func (d *DB) QuerySourceSpaceIDForMember(groupNo, uid string) (string, error)

QuerySourceSpaceIDForMember 查询某用户作为外部成员在指定群的 source_space_id 非外部成员或不存在时返回空字符串

func (*DB) QueryWithGroupNo

func (d *DB) QueryWithGroupNo(groupNo string) (*Model, error)

QueryWithGroupNo 根据群编号查询群信息

func (*DB) QueryWithGroupNos

func (d *DB) QueryWithGroupNos(groupNos []string) ([]*Model, error)

QueryWithGroupNo 根据群编号查询群信息

func (*DB) SyncMembers

func (d *DB) SyncMembers(groupNo string, version int64, limit uint64) ([]*MemberDetailModel, error)

SyncMembers 同步群成员

func (*DB) Update

func (d *DB) Update(model *Model) error

Update 更新群信息

func (*DB) UpdateBotAdmin

func (d *DB) UpdateBotAdmin(groupNo string, uid string, isBotAdmin int, version int64) error

UpdateBotAdmin sets or unsets bot_admin for a group member

func (*DB) UpdateGroupMd

func (d *DB) UpdateGroupMd(groupNo string, content string, updatedBy string) (int64, error)

UpdateGroupMd updates GROUP.md content and auto-increments version. Uses a transaction to ensure UPDATE and SELECT LAST_INSERT_ID() share the same connection.

func (*DB) UpdateGroupType

func (d *DB) UpdateGroupType(groupNo string, groupType GroupType) error

修改群类型

func (*DB) UpdateGroupTypeTx

func (d *DB) UpdateGroupTypeTx(groupNo string, groupType GroupType, tx *dbr.Tx) error

修改群类型

func (*DB) UpdateInviteItemStatusTx

func (d *DB) UpdateInviteItemStatusTx(status int, inviteNo string, tx *dbr.Tx) error

UpdateInviteItemStatusTx 更新邀请信息状态

func (*DB) UpdateInviteStatusTx

func (d *DB) UpdateInviteStatusTx(allower string, status int, inviteNo string, tx *dbr.Tx) error

UpdateInviteStatusTx 更新邀请信息状态

func (*DB) UpdateInviteTx added in v1.8.0

func (d *DB) UpdateInviteTx(groupNo string, invite int, version int64, tx *dbr.Tx) error

UpdateInviteTx 仅更新「进群邀请开关」与群版本(列级写,事务内)。 不能用 UpdateTx 整行回写:groupUpdate 在同一请求里若同时带 name 与 invite,name 分支 已通过 UpdateGroupInfo(独立 fresh load)提交了新 name,而 invite 分支若再用建链时载入 的旧快照经 UpdateTx 全列回写,会把刚提交的 name 用旧值覆盖回去(改名被静默回滚)。 列级写只动 invite/version,与并发的改名互不踩踏,也消除该读改写竞态。

func (*DB) UpdateIsExternalGroup

func (d *DB) UpdateIsExternalGroup(groupNo string, value int) error

UpdateIsExternalGroup 更新群的 is_external_group 标记

func (*DB) UpdateIsExternalGroupTx

func (d *DB) UpdateIsExternalGroupTx(groupNo string, value int, tx *dbr.Tx) error

UpdateIsExternalGroupTx 事务内更新群的 is_external_group 标记

func (*DB) UpdateManagersToMember

func (d *DB) UpdateManagersToMember(groupNo string, members []string, version int64) error

UpdateManagersToMember 更新指定管理员为普通成员

func (*DB) UpdateMember

func (d *DB) UpdateMember(member *MemberModel) error

UpdateMember 更新群成员

func (*DB) UpdateMemberRoleTx

func (d *DB) UpdateMemberRoleTx(groupNo string, uid string, role int, version int64, tx *dbr.Tx) error

UpdateMemberRoleTx 更新群成员角色

func (*DB) UpdateMemberTx

func (d *DB) UpdateMemberTx(member *MemberModel, tx *dbr.Tx) error

UpdateMemberTx 更新成员信息

func (*DB) UpdateMembersToManager

func (d *DB) UpdateMembersToManager(groupNo string, members []string, version int64) error

UpdateMembersToManager 更新指定群成员为管理员

func (*DB) UpdateStatusTx added in v1.8.0

func (d *DB) UpdateStatusTx(groupNo string, status int, version int64, tx *dbr.Tx) error

UpdateStatusTx 仅更新「群状态」与群版本(列级写,事务内)。 disband() 不能用 UpdateTx 整行回写:行 183 的 SELECT 无锁,FOR UPDATE 行 233 只读 status 不刷新其他列,若并发 groupUpdate(改名/公告/禁言等)在窗口内提交了新值, UpdateTx 全列回写会用旧快照覆盖并发修改(lost-update)。列级写只动 status/version, 与并发的群设置变更互不踩踏,对齐 UpdateInviteTx 的设计。

func (*DB) UpdateTx

func (d *DB) UpdateTx(model *Model, tx *dbr.Tx) error

UpdateTx 更新群信息(带事务)

type DetailModel

type DetailModel struct {
	Model
	Mute            int    // 免打扰
	Top             int    // 置顶
	ShowNick        int    // 显示昵称
	Save            int    // 是否保存
	ChatPwdOn       int    //是否开启聊天密码
	RevokeRemind    int    //撤回提醒
	JoinGroupRemind int    // 进群提醒
	Screenshot      int    //截屏通知
	Receipt         int    //消息是否回执
	Flame           int    // 是否开启阅后即焚
	FlameSecond     int    // 阅后即焚秒数
	Remark          string // 群备注
}

DetailModel 群详情

type Group

type Group struct {
	log.Log
	// contains filtered or unexported fields
}

Group 群组相关API

func New

func New(ctx *config.Context) *Group

New New

func (*Group) CheckForbiddenLoop

func (g *Group) CheckForbiddenLoop()

func (*Group) GetGroupByGroupNo

func (g *Group) GetGroupByGroupNo(groupNo string) (*source.GroupModel, error)

GetGroupByGroupNo 查询群详情

func (*Group) GetGroupMemberByUID

func (g *Group) GetGroupMemberByUID(uid string, groupNo string) (*source.GroupMember, error)

func (*Group) GetGroupMemberByVercode

func (g *Group) GetGroupMemberByVercode(vercode string) (*source.GroupMember, error)

GetGroupMemberByVercode 通过vercode获取群成员

func (*Group) GetGroupMemberByVercodes

func (g *Group) GetGroupMemberByVercodes(vercodes []string) ([]*source.GroupMember, error)

func (*Group) Route

func (g *Group) Route(r *wkhttp.WKHttp)

Route 路由配置

type GroupMdResult

type GroupMdResult struct {
	Content   string     `json:"content"`
	Version   int64      `json:"version"`
	UpdatedAt *time.Time `json:"updated_at"`
	UpdatedBy string     `json:"updated_by"`
}

GroupMdResult GROUP.md query result

type GroupResp

type GroupResp struct {
	GroupNo                  string    `json:"group_no"`                    // 群编号
	GroupType                GroupType `json:"group_type"`                  // 群类型
	Category                 string    `json:"category"`                    // 群分类
	Name                     string    `json:"name"`                        // 群名称
	IsNamed                  int       `json:"is_named"`                    // 1=改版前老群(默认渲染群名文字)/0=新群(默认双人图标);由 #500 迁移回填,新群恒为 0;客户端可据此本地预判默认头像取群名文字 vs 双人图标
	AvatarText               string    `json:"avatar_text"`                 // 自定义群头像文字(空=按 is_named 回退:老群渲染群名/新群双人图标)
	AvatarColor              *int      `json:"avatar_color"`                // 自定义群头像色板下标(null=按 group_no 派生)
	Remark                   string    `json:"remark"`                      // 群备注
	Notice                   string    `json:"notice"`                      // 群公告
	Mute                     int       `json:"mute"`                        // 免打扰
	Top                      int       `json:"top"`                         // 置顶
	ShowNick                 int       `json:"show_nick"`                   // 显示昵称
	Save                     int       `json:"save"`                        // 是否保存
	Forbidden                int       `json:"forbidden"`                   // 是否全员禁言
	Invite                   int       `json:"invite"`                      // 群聊邀请确认
	ChatPwdOn                int       `json:"chat_pwd_on"`                 //是否开启聊天密码
	Screenshot               int       `json:"screenshot"`                  //截屏通知
	RevokeRemind             int       `json:"revoke_remind"`               //撤回提醒
	JoinGroupRemind          int       `json:"join_group_remind"`           //进群提醒
	ForbiddenAddFriend       int       `json:"forbidden_add_friend"`        //群内禁止加好友
	Status                   int       `json:"status"`                      //群状态
	Receipt                  int       `json:"receipt"`                     //消息是否回执
	Flame                    int       `json:"flame"`                       // 阅后即焚
	FlameSecond              int       `json:"flame_second"`                // 阅后即焚秒数
	AllowViewHistoryMsg      int       `json:"allow_view_history_msg"`      // 是否允许新成员查看历史消息
	MemberCount              int       `json:"member_count"`                // 成员数量
	OnlineCount              int       `json:"online_count"`                // 在线数量
	Quit                     int       `json:"quit"`                        // 我是否已退出群聊
	Role                     int       `json:"role"`                        // 我在群聊里的角色
	ForbiddenExpirTime       int64     `json:"forbidden_expir_time"`        // 我在此群的禁言过期时间
	AllowMemberPinnedMessage int       `json:"allow_member_pinned_message"` //是否允许群成员置顶消息
	HasGroupMd               bool      `json:"has_group_md"`                // 是否有GROUP.md
	GroupMdVersion           int64     `json:"group_md_version"`            // GROUP.md版本
	GroupMdUpdatedAt         *string   `json:"group_md_updated_at"`         // GROUP.md最后更新时间
	CanEditGroupMd           bool      `json:"can_edit_group_md"`           // 是否可编辑GROUP.md
	CanManageBotAdmin        bool      `json:"can_manage_bot_admin"`        // 是否可管理Bot管理员
	SpaceID                  string    `json:"space_id"`                    // Space ID
	IsExternalGroup          int       `json:"is_external_group"`           // 是否外部群 0.否 1.是
	AllowExternal            int       `json:"allow_external"`              // 是否允许外部成员 1.允许(默认) 0.禁止
	AllowNoMention           int       `json:"allow_no_mention"`            // 群级是否允许免@生效 1.允许(默认) 0.禁止
	CreatedAt                string    `json:"created_at"`
	UpdatedAt                string    `json:"updated_at"`
	Version                  int64     `json:"version"` // 群数据版本
}

func (*GroupResp) SetEffectiveSpaceID

func (g *GroupResp) SetEffectiveSpaceID(loginUID string, db *DB)

SetEffectiveSpaceID 对外部群的外部成员替换 SpaceID 为其来源 Space, 这样 Web 端依赖 space_id 的会话过滤逻辑无需修改即可自然匹配。

func (*GroupResp) SetEffectiveSpaceIDFromMap

func (g *GroupResp) SetEffectiveSpaceIDFromMap(externalMap map[string]string)

SetEffectiveSpaceIDFromMap 与 SetEffectiveSpaceID 等价,但使用调用方预先批量查询的 groupNo -> sourceSpaceID 映射,避免列表场景下的 N+1 查询。

type GroupType

type GroupType int

群类型

const (
	GroupTypeCommon GroupType = iota // 普通群
	GroupTypeSuper                   // 超大群
)

type IService

type IService interface {
	// 获取群总数
	GetAllGroupCount() (int64, error)
	// 查询某天的新建群数量
	GetCreatedCountWithDate(date string) (int64, error)
	// 添加一个群
	AddGroup(model *AddGroupReq) error
	// 某个时间段的建群数据
	GetGroupWithDateSpace(startDate, endDate string) (map[string]int64, error)
	// 查询某个群信息
	GetGroupWithGroupNo(groupNo string) (*InfoResp, error)
	// GetGroups 获取群集合
	GetGroups(groupNos []string) ([]*InfoResp, error)
	// 获取某一批群与指定用户的详情(包括用户对群的设置等等)
	GetGroupDetails(groupNos []string, uid string) ([]*GroupResp, error)
	// 获取群详情
	GetGroupDetail(groupNo string, uid string) (*GroupResp, error)

	// -------------------- 群设置 --------------------
	// GetSettings 获取群的设置
	GetSettings(groupNos []string, uid string) ([]*SettingResp, error)
	// GetSettingsWithUids 获取一批用户对某个群的设置
	GetSettingsWithUIDs(groupNo string, uids []string) ([]*SettingResp, error)

	// -------------------- 群成员 --------------------
	// 获取指定群的群成员列表
	GetMembers(groupNo string) ([]*MemberResp, error)
	// GetMemberExternalMarkers 批量获取指定群所有非删除成员的外部来源标识。
	// 返回 uid -> MemberExternalMarker 的映射,供消息同步等热路径 O(1) 查找,避免 N+1 JOIN。
	GetMemberExternalMarkers(groupNo string) (map[string]MemberExternalMarker, error)
	// GetMemberExternalFields 单成员版外部来源 / 归属 Space 字段查询(YUJ-206),
	// 供 /users/{uid}?group_no= 路径补齐 GroupMemberResp 的 is_external / source_space_* /
	// home_space_* 字段。语义与 GetMemberExternalMarkers 保持一致。
	GetMemberExternalFields(groupNo, uid string) (
		isExternal int,
		sourceSpaceID, sourceSpaceName string,
		homeSpaceID, homeSpaceName string,
		err error,
	)
	// 获取指定群的指定成员信息
	GetMember(groupNo, uid string) (*MemberResp, error)
	// 获取黑名单成员uid集合
	GetBlacklistMemberUIDs(groupNo string) ([]string, error)
	// GetSubscribableMemberUIDs 返回可订阅成员 uid 集合(status=normal AND is_deleted=0,
	// 即排除被拉黑成员),供子区/父群的 IM Subscribers 数据源使用。与 GetMembers
	// (“所有非删除成员”)语义不同,不可互换。
	GetSubscribableMemberUIDs(groupNo string) ([]string, error)
	// 查询管理员成员uid列表(包括创建者)
	GetMemberUIDsOfManager(groupNo string) ([]string, error)
	// 是否是创建者或管理者
	IsCreatorOrManager(groupNo string, uid string) (bool, error)
	// 获取成员总数量和在线数量
	// 第一个返回参数为成员总数量
	// 第二个返回参数为在线数量
	GetMemberTotalAndOnlineCount(groupNo string) (int, int, error)
	// 是否存在群成员
	ExistMember(groupNo string, uid string) (bool, error)
	// ExistMemberActive 是否存在「活跃」群成员(is_deleted=0 AND status=Normal,
	// 白名单语义、fail-closed),排除被拉黑成员。供绕过 IM 直查本地分表的读/发门禁,
	// 以及子区(CommunityTopic)解析父群后的读/写门禁使用,防止被拉黑用户越权读子区内容。
	ExistMemberActive(groupNo string, uid string) (bool, error)
	// 成员是否在某群里存在 返回对应在群里的群编号
	ExistMembers(groupNos []string, uid string) ([]string, error)
	// ExistMembersActive 批量版 ExistMemberActive:返回 uid 处于「活跃」状态
	// (is_deleted=0 AND status=Normal)的群编号集合,排除被拉黑成员
	ExistMembersActive(groupNos []string, uid string) ([]string, error)
	// GetGroupsWithMemberUID 获取某个用户的所有群
	GetGroupsWithMemberUID(uid string) ([]*InfoResp, error)
	// 获取指定群的群成员的最大数据版本
	GetGroupMemberMaxVersion(groupNo string) (int64, error)
	// 获取用户所有超级群信息
	GetUserSupers(uid string) ([]*InfoResp, error)
	// 新增群成员
	AddMember(model *AddMemberReq) error
	// 获取指定一批群的指定成员信息
	GetMembersWithUIDAndGroupIds(uid string, groupNos []string) ([]*MemberResp, error)
	// 查询一批群的管理员及群主
	GetManagersWithGroupNos(groupNos []string) ([]*MemberResp, error)
	// GetGroupMd returns GROUP.md content for a group
	GetGroupMd(groupNo string) (*GroupMdResult, error)
	// UpdateGroupMd updates GROUP.md content
	UpdateGroupMd(groupNo string, content string, updatedBy string) (int64, error)
	// DeleteGroupMd deletes GROUP.md content
	DeleteGroupMd(groupNo string) (int64, error)
	// IsBotAdmin checks if a member is a bot admin
	IsBotAdmin(groupNo string, uid string) (bool, error)
	// GetBotMemberUIDs returns UIDs of robot members in the group
	GetBotMemberUIDs(groupNo string) ([]string, error)

	// CreateGroup 创建群(统一入口,Web 和 Bot 共用)
	CreateGroup(req *CreateGroupServiceReq) (*CreateGroupServiceResp, error)
	// AddGroupMembers 添加群成员
	AddGroupMembers(req *AddGroupMembersServiceReq) (*AddGroupMembersServiceResp, error)
	// RemoveGroupMembers 移除群成员
	RemoveGroupMembers(req *RemoveGroupMembersServiceReq) (*RemoveGroupMembersServiceResp, error)
	// RemoveUserFromGroupThreads 清理某用户在某群所有子区的 thread_member 记录、IM 订阅和置顶。
	// 供 botfather 删除 Bot 等“父群成员已移除、需对齐摘除子区订阅”的外部路径调用(Issue #27)。
	RemoveUserFromGroupThreads(groupNo, uid, spaceID string)
	// UpdateGroupInfo 更新群信息
	UpdateGroupInfo(req *UpdateGroupInfoServiceReq) error
	// UpdateGroupAvatarCustom 更新自定义群头像文字/颜色
	UpdateGroupAvatarCustom(req *UpdateGroupAvatarCustomServiceReq) error
}

IService 群相关

func NewService

func NewService(ctx *config.Context) IService

NewService NewService

type InfoResp

type InfoResp struct {
	GroupNo             string    `json:"group_no"`               // 群编号
	GroupType           GroupType `json:"group_type"`             // 群类型
	Name                string    `json:"name"`                   // 群名称
	Notice              string    `json:"notice"`                 // 群公告
	Creator             string    `json:"creator"`                // 创建者uid
	Status              int       `json:"status"`                 // 群状态
	Forbidden           int       `json:"forbidden"`              // 是否全员禁言
	Invite              int       `json:"invite"`                 // 是否开启邀请确认 0.否 1.是
	ForbiddenAddFriend  int       `json:"forbidden_add_friend"`   //群内禁止加好友
	AllowViewHistoryMsg int       `json:"allow_view_history_msg"` // 是否允许新成员查看历史记录
	CreatedAt           string    `json:"created_at"`
	UpdatedAt           string    `json:"updated_at"`
	Version             int64     `json:"version"`           // 群数据版本
	SpaceID             string    `json:"space_id"`          // Space ID
	IsExternalGroup     int       `json:"is_external_group"` // 是否外部群
	AllowExternal       int       `json:"allow_external"`    // 是否允许外部成员 1.允许(默认) 0.禁止
	AllowNoMention      int       `json:"allow_no_mention"`  // 群级是否允许免@生效 1.允许(默认) 0.禁止
}

InfoResp 群信息

type InviteDetailModel

type InviteDetailModel struct {
	InviteModel
	InviterName string `json:"inviter_name"` // 邀请者名称

}

InviteDetailModel 邀请者详情

type InviteDetailResp

type InviteDetailResp struct {
	InviteNo    string                 `json:"invite_no"`    // 邀请唯一编号
	GroupNo     string                 `json:"group_no"`     // 群唯一编号
	Inviter     string                 `json:"inviter"`      // 邀请者
	Remark      string                 `json:"remark"`       // 邀请备注
	InviterName string                 `json:"inviter_name"` // 邀请者名称
	Status      int                    `json:"status"`       // 状态 0.未确认 1.已确认
	Items       []InviteItemDetailResp `json:"items"`        // 邀请项详情
	// YUJ-168 / GH #1243: 外部群 H5 邀请 landing 的信任锚点字段。
	// SpaceName 始终下发(前端判断非空才渲染"来自 xx"),
	// IsExternal 仅在当前登录用户不属于该 Space 时置 1。
	SpaceName  string `json:"space_name"`  // 群所属 Space 名称(空字符串表示无 Space)
	IsExternal int    `json:"is_external"` // 访问者视角:0=内部/未登录,1=跨 Space 外部访问者
}

InviteDetailResp 邀请详情返回

func (InviteDetailResp) From

From From

type InviteItemDetailModel

type InviteItemDetailModel struct {
	InviteItemModel
	Name string // 被邀请者名称
}

InviteItemDetailModel item详情

type InviteItemDetailResp

type InviteItemDetailResp struct {
	UID  string `json:"uid"`  // 被邀请uid
	Name string `json:"name"` // 被邀请者名称
}

InviteItemDetailResp 邀请item

type InviteItemModel

type InviteItemModel struct {
	InviteNo string `json:"invite_no"` // 邀请唯一编号
	GroupNo  string `json:"group_no"`  // 群唯一编号
	Inviter  string `json:"inviter"`   // 邀请者
	UID      string `json:"uid"`       // 被邀请uid
	Status   int    `json:"status"`    // 状态 0.未确认 1.已确认
	db.BaseModel
}

InviteItemModel InviteItemModel

type InviteModel

type InviteModel struct {
	InviteNo string `json:"invite_no"` // 邀请唯一编号
	GroupNo  string `json:"group_no"`  // 群唯一编号
	Inviter  string `json:"inviter"`   // 邀请者
	Remark   string `json:"remark"`    // 邀请备注
	Status   int    `json:"status"`    // 状态 0.未确认 1.已确认
	Allower  string `json:"allower"`   // 确认者
	db.BaseModel
}

InviteModel InviteModel

type InviteReq

type InviteReq struct {
	UIDS   []string `json:"uids"`
	Remark string   `json:"remark"`
}

InviteReq 群邀请

func (InviteReq) Check

func (i InviteReq) Check() error

Check Check

type Manager

type Manager struct {
	log.Log
	// contains filtered or unexported fields
}

Manager 群后台管理api

func NewManager

func NewManager(ctx *config.Context) *Manager

NewManager NewManager

func (*Manager) Route

func (m *Manager) Route(r *wkhttp.WKHttp)

Route 配置路由规则

type MemberDetailModel

type MemberDetailModel struct {
	UID                string // 成员uid
	GroupNo            string // 群编号
	Name               string // 群成员名称
	Remark             string // 成员备注
	Role               int    // 成员角色
	Version            int64
	Vercode            string //验证码
	InviteUID          string // 邀请人
	IsDeleted          int    // 是否删除
	Status             int    // 1.正常 2.黑名单
	Username           string
	Robot              int    // 机器人标识0.否1.是
	ForbiddenExpirTime int64  // 禁言时长
	BotAdmin           int    // Bot管理员 0.否 1.是
	IsExternal         int    // 外部成员 0.否 1.是
	SourceSpaceID      string // 来源 Space ID(外部成员使用)
	db.BaseModel
}

MemberDetailModel 成员详情model

type MemberExternalMarker

type MemberExternalMarker struct {
	IsExternal      int    // 1 = 外部成员
	SourceSpaceName string // 来源 Space 名称;非外部成员或无来源时为空
	// HomeSpaceID / HomeSpaceName 是为了前端"相对当前查看 Space"渲染外部徽标
	// 而新增的视图字段(YUJ-63 / #1208)。后端 IsExternal / SourceSpace* 语义不变。
	// 规则:外部成员 → home = source space;内部成员 → home = 群自身 space。
	HomeSpaceID   string
	HomeSpaceName string
}

MemberExternalMarker 描述群成员的外部来源标识,用于消息同步等热路径。

type MemberGroupDetailModel

type MemberGroupDetailModel struct {
	GroupName string // 群名称
	MemberModel
}

type MemberModel

type MemberModel struct {
	GroupNo            string // 群编号
	UID                string // 成员uid
	Remark             string // 成员备注
	Role               int    // 成员角色 1. 创建者	 2.管理员
	Version            int64
	Status             int    // 1.正常 2.黑名单
	Vercode            string //验证码
	IsDeleted          int    // 是否删除
	InviteUID          string // 邀请者
	Robot              int    // 机器人
	ForbiddenExpirTime int64  // 禁言时长
	IsExternal         int    // 外部成员 0.否 1.是
	SourceSpaceID      string // 来源 Space ID(外部成员使用)
	db.BaseModel
}

MemberModel 成员model

type MemberResp

type MemberResp struct {
	GroupNo            string // 群编号
	UID                string // 成员uid
	Name               string // 群成员名称
	Remark             string // 成员备注
	Role               int    // 成员角色
	Version            int64
	Vercode            string //验证码
	InviteUID          string // 邀请人uid
	CreatedAt          int64  // 注册时间 10位时间戳
	IsDeleted          int    //是否已删除
	ForbiddenExpirTime int64  // 禁言时长
	Status             int    // 成员状态
}

type Model

type Model struct {
	GroupNo                  string     // 群编号
	GroupType                int        // 群类型 0.普通群 1.超大群
	Name                     string     // 群名称
	IsNamed                  int        // 1=改版前老群/0=新群;由 #500 迁移回填,新群恒为 0。默认头像取群名文字仅对 1 生效(grandfather 老群),新群一律双人图标
	Avatar                   string     // 群头像
	AvatarVersion            int64      // 群头像对象版本,0 表示旧版稳定路径
	IsUploadAvatar           int        // 群头像是否已经被用户上传
	AvatarText               string     // 自定义群头像文字;空时按 is_named 回退(老群取群名前2字,新群双人图标)
	AvatarColor              *int       // 自定义群头像色板下标,nil(NULL) 表示按 group_no 派生
	Notice                   string     // 群公告
	Creator                  string     // 创建者uid
	Status                   int        // 群状态
	Version                  int64      // 版本号
	Forbidden                int        // 是否全员禁言
	Invite                   int        // 是否开启邀请确认 0.否 1.是
	ForbiddenAddFriend       int        //群内禁止加好友
	AllowViewHistoryMsg      int        // 是否允许新成员查看历史消息
	AllowMemberPinnedMessage int        // 是否允许群成员置顶消息
	Category                 string     // 群分类
	SpaceID                  string     // Space ID
	IsExternalGroup          int        // 外部群 0.否 1.是(自动维护)
	AllowExternal            int        // 是否允许外部成员加入 1.允许(默认) 0.禁止
	AllowNoMention           int        // 群级是否允许免@生效 1.允许(默认) 0.禁止(bot 在本群必须被@)
	GroupMd                  *string    // GROUP.md content
	GroupMdVersion           int64      // GROUP.md version
	GroupMdUpdatedAt         *time.Time // GROUP.md last update time
	GroupMdUpdatedBy         string     // GROUP.md last updater UID
	db.BaseModel
}

Model 群db model

type MsgGroupMemberScanJoinExt

type MsgGroupMemberScanJoinExt struct {
	config.MsgGroupMemberScanJoin
	IsExternal int `json:"is_external"`
}

MsgGroupMemberScanJoinExt 在 config.MsgGroupMemberScanJoin 基础上扩展 is_external 字段, 供事件 handler 区分内部/外部成员加入时的系统消息文案。

type RemoveGroupMembersServiceReq

type RemoveGroupMembersServiceReq struct {
	GroupNo      string   // 群编号
	Members      []string // 待移除成员 UID 列表
	OperatorUID  string   // 操作者 UID
	OperatorName string   // 操作者名称
}

RemoveGroupMembersServiceReq 移除群成员请求

type RemoveGroupMembersServiceResp

type RemoveGroupMembersServiceResp struct {
	Removed     int      // 实际移除数量
	RemovedUIDs []string // 实际移除的 UID 列表
}

RemoveGroupMembersServiceResp 移除群成员响应

type Service

type Service struct {
	log.Log
	// contains filtered or unexported fields
}

Service Service

func (*Service) AddGroup

func (s *Service) AddGroup(model *AddGroupReq) error

AddGroup 添加一个群

func (*Service) AddGroupMembers

AddGroupMembers 添加群成员

func (*Service) AddMember

func (s *Service) AddMember(model *AddMemberReq) error

func (*Service) CreateGroup

func (s *Service) CreateGroup(req *CreateGroupServiceReq) (*CreateGroupServiceResp, error)

CreateGroup 创建群(统一入口,Web 和 Bot 共用)

func (*Service) DeleteGroupMd

func (s *Service) DeleteGroupMd(groupNo string) (int64, error)

func (*Service) ExistMember

func (s *Service) ExistMember(groupNo string, uid string) (bool, error)

func (*Service) ExistMemberActive added in v1.6.1

func (s *Service) ExistMemberActive(groupNo string, uid string) (bool, error)

ExistMemberActive 是 ExistMember 的白名单(fail closed)变体:除 is_deleted=0 外还 要求 status=GroupMemberStatusNormal,明确排除被拉黑及未来新增的非正常状态成员。 子区(CommunityTopic)读/发门禁用它替代 ExistMember,避免被拉黑用户越权读/发(YUJ-4185 CR 整改)。

func (*Service) ExistMembers

func (s *Service) ExistMembers(groupNos []string, uid string) ([]string, error)

func (*Service) ExistMembersActive added in v1.6.1

func (s *Service) ExistMembersActive(groupNos []string, uid string) ([]string, error)

ExistMembersActive 是 ExistMembers 的白名单(fail closed)批量变体:在 is_deleted=0 之外额外要求 status=GroupMemberStatusNormal,把被拉黑成员从“仍是成员”的集合里排除。 子区(CommunityTopic)批量读门禁用它替代 ExistMembers(YUJ-4185 CR 整改)。

func (*Service) GetAllGroupCount

func (s *Service) GetAllGroupCount() (int64, error)

GetAllGroupCount 获取群总数

func (*Service) GetBlacklistMemberUIDs

func (s *Service) GetBlacklistMemberUIDs(groupNo string) ([]string, error)

func (*Service) GetBotMemberUIDs

func (s *Service) GetBotMemberUIDs(groupNo string) ([]string, error)

func (*Service) GetCreatedCountWithDate

func (s *Service) GetCreatedCountWithDate(date string) (int64, error)

GetCreatedCountWithDate 获取某天的新建群数量

func (*Service) GetGroupDetail

func (s *Service) GetGroupDetail(groupNo string, uid string) (*GroupResp, error)

func (*Service) GetGroupDetails

func (s *Service) GetGroupDetails(groupNos []string, uid string) ([]*GroupResp, error)

func (*Service) GetGroupMd

func (s *Service) GetGroupMd(groupNo string) (*GroupMdResult, error)

func (*Service) GetGroupMemberMaxVersion

func (s *Service) GetGroupMemberMaxVersion(groupNo string) (int64, error)

func (*Service) GetGroupWithDateSpace

func (s *Service) GetGroupWithDateSpace(startDate, endDate string) (map[string]int64, error)

GetGroupWithDateSpace 某个时间段的建群数据

func (*Service) GetGroupWithGroupNo

func (s *Service) GetGroupWithGroupNo(groupNo string) (*InfoResp, error)

GetGroupWithGroupNo 查询一个群信息

func (*Service) GetGroups

func (s *Service) GetGroups(groupNos []string) ([]*InfoResp, error)

func (*Service) GetGroupsWithMemberUID

func (s *Service) GetGroupsWithMemberUID(uid string) ([]*InfoResp, error)

func (*Service) GetManagersWithGroupNos

func (s *Service) GetManagersWithGroupNos(groupNos []string) ([]*MemberResp, error)

GetManagersWithGroupNos 查询一批群的管理员及群主

func (*Service) GetMember

func (s *Service) GetMember(groupNo, uid string) (*MemberResp, error)

func (*Service) GetMemberExternalFields

func (s *Service) GetMemberExternalFields(groupNo, uid string) (
	isExternal int,
	sourceSpaceID, sourceSpaceName string,
	homeSpaceID, homeSpaceName string,
	err error,
)

GetMemberExternalFields 返回单成员的外部来源/归属 Space 字段,供 /users/{uid}?group_no= 路径(user 模块 GroupMemberResp)补齐。语义与批量版 GetMemberExternalMarkers 一致:

  • isExternal==1: 成员相对群 Space 为外部 sourceSpaceID = 来源 Space(原语义,保留) homeSpaceID = sourceSpaceID(相对视角,对齐企微)
  • isExternal==0: 内部成员 homeSpaceID = 群自身 space_id

未注册 Space(群未挂 Space / 字段为空)时返回空字符串,而非 error。 成员不存在或已删除时返回全零值 + nil error,避免 /users/{uid} 热路径抖动。

开销:1 次 group_member LEFT JOIN space(点查,命中 PRIMARY KEY)

  • 至多 1 次 group+space 回查(仅内部成员且需要 home_space_name 时)。

func (*Service) GetMemberExternalMarkers

func (s *Service) GetMemberExternalMarkers(groupNo string) (map[string]MemberExternalMarker, error)

GetMemberExternalMarkers 返回群内所有未删除成员的外部来源标识映射 uid -> MemberExternalMarker。 实现上用一条 LEFT JOIN 语句同时取出 is_external / source_space_id / space.name, 再(仅当群本身存在 space_id 时)一次性取出群归属 Space 的名称, 调用方在遍历消息时即可 O(1) lookup,避免每条消息再去 JOIN group_member。 groupNo 为空直接返回空 map,方便调用方统一处理 DM 场景。

func (*Service) GetMemberTotalAndOnlineCount

func (s *Service) GetMemberTotalAndOnlineCount(groupNo string) (int, int, error)

func (*Service) GetMemberUIDsOfManager

func (s *Service) GetMemberUIDsOfManager(groupNo string) ([]string, error)

func (*Service) GetMembers

func (s *Service) GetMembers(groupNo string) ([]*MemberResp, error)

func (*Service) GetMembersWithUIDAndGroupIds

func (s *Service) GetMembersWithUIDAndGroupIds(uid string, groupNos []string) ([]*MemberResp, error)

GetMembersWithUIDAndGroupIds

func (*Service) GetSettings

func (s *Service) GetSettings(groupNos []string, uid string) ([]*SettingResp, error)

func (*Service) GetSettingsWithUIDs

func (s *Service) GetSettingsWithUIDs(groupNo string, uids []string) ([]*SettingResp, error)

GetSettingsWithUIDs 查询一批用户对某个群的设置

func (*Service) GetSubscribableMemberUIDs added in v1.6.1

func (s *Service) GetSubscribableMemberUIDs(groupNo string) ([]string, error)

GetSubscribableMemberUIDs 返回可订阅成员 uid(status=normal AND is_deleted=0)。 子区/父群 IM Subscribers 数据源专用:排除被拉黑成员,避免 WuKongIM 重载订阅时 把黑名单用户加回订阅列表(YUJ-4185 P0-2)。

func (*Service) GetUserSupers

func (s *Service) GetUserSupers(uid string) ([]*InfoResp, error)

func (*Service) IsBotAdmin

func (s *Service) IsBotAdmin(groupNo string, uid string) (bool, error)

func (*Service) IsCreatorOrManager

func (s *Service) IsCreatorOrManager(groupNo string, uid string) (bool, error)

func (*Service) RemoveGroupMembers

RemoveGroupMembers 移除群成员

func (*Service) RemoveUserFromGroupThreads added in v1.6.1

func (s *Service) RemoveUserFromGroupThreads(groupNo, uid, spaceID string)

RemoveUserFromGroupThreads 导出版,供其他模块(botfather)对齐摘除子区订阅,见接口注释。

func (*Service) UpdateGroupAvatarCustom added in v1.7.0

func (s *Service) UpdateGroupAvatarCustom(req *UpdateGroupAvatarCustomServiceReq) error

UpdateGroupAvatarCustom 更新自定义群头像文字/颜色(二次弹窗保存)。未提供的字段 保持现值;落库后 bump 群版本并通知客户端刷新频道信息——头像 URL 稳定,客户端据此 重新拉取,靠 avatarGet 的内容相关 ETag 取到新图。校验由 API 层完成。

func (*Service) UpdateGroupInfo

func (s *Service) UpdateGroupInfo(req *UpdateGroupInfoServiceReq) error

UpdateGroupInfo 更新群信息

func (*Service) UpdateGroupMd

func (s *Service) UpdateGroupMd(groupNo string, content string, updatedBy string) (int64, error)

type Setting

type Setting struct {
	UID             string // 用户uid
	GroupNo         string // 群编号
	Mute            int    // 免打扰
	Top             int    // 置顶
	ShowNick        int    // 显示昵称
	Save            int    // 是否保存
	ChatPwdOn       int    //是否开启聊天密码
	Screenshot      int    //截屏通知
	RevokeRemind    int    //撤回通知
	JoinGroupRemind int    //进群提醒
	Receipt         int    //消息是否回执
	Flame           int    // 是否开启阅后即焚
	FlameSecond     int    // 阅后即焚秒数
	Remark          string // 群备注
	Version         int64  // 版本
	db.BaseModel
}

Setting 群设置

type SettingResp

type SettingResp struct {
	UID             string
	GroupNo         string // 群编号
	Mute            int    // 免打扰
	Top             int    // 置顶
	ShowNick        int    // 显示昵称
	Save            int    // 是否保存
	ChatPwdOn       int    //是否开启聊天密码
	Screenshot      int    //截屏通知
	RevokeRemind    int    //撤回通知
	JoinGroupRemind int    //进群提醒
	Receipt         int    //消息是否回执
	Remark          string // 群备注
	Version         int64  // 版本
}

SettingResp 群设置

type UpdateGroupAvatarCustomServiceReq added in v1.7.0

type UpdateGroupAvatarCustomServiceReq struct {
	GroupNo      string
	OperatorUID  string
	OperatorName string
	// AvatarText:nil 表示不更新文字;非 nil(含 "")表示设置,"" 即清除自定义文字(回退 is_named 规则:老群群名/新群双人图标)。
	AvatarText *string
	// SetAvatarColor:是否更新颜色。为 true 时按 AvatarColor 设置:nil 清除(NULL,回退派生),
	// 非 nil 为色板下标。为 false 时不动颜色。
	SetAvatarColor bool
	AvatarColor    *int
}

UpdateGroupAvatarCustomServiceReq 更新自定义群头像文字/颜色(二次弹窗保存)。

type UpdateGroupInfoServiceReq

type UpdateGroupInfoServiceReq struct {
	GroupNo      string  // 群编号
	OperatorUID  string  // 操作者 UID
	OperatorName string  // 操作者名称
	Name         *string // 新群名(nil 表示不更新)
	Notice       *string // 新公告(nil 表示不更新)
}

UpdateGroupInfoServiceReq 更新群信息请求

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL