限额与边界规则
本页汇总 DSH-Guild 的业务限额,并收录那些不体现在限额表里、但会影响使用方式的边界规则。限额全部集中在 packages/server/src/constants.ts 维护(社区加入数上限在社区路由内校验),不通过环境变量注入,需要调整直接改代码。
一、限额总表
| 项目 | 值 | 说明 |
|---|---|---|
| 每用户创建社区 | 5 个 / 24 小时 | 滚动窗口限流,防滥用 |
| 每用户加入社区 | 20 个 | 含自建 |
| 单条消息长度 | 4000 字符 | Markdown 原文 |
| 单条消息附件数 | 4 个 | 图片与文件合计 |
| 单个上传对象 | 50 MiB | 附件与分享包统一,走直写 R2 的单次 PUT |
| 分享包体积 | 50 MiB | 与上传上限同源;客户端可在插件设置 share.maxSizeMb 调小 |
| 附件原始文件名 | 200 字符 | |
| 讨论组名称 | 80 字符 | |
| 讨论组自动归档 | 24 小时 | 无新消息即归档,有人发言自动恢复 |
| 频道名 | 1 ~ 80 字符 | |
| 消息撤回窗口 | 2 分钟 | 超时后作者只能编辑,不能撤回;MANAGE_MESSAGES 不受此限 |
二、边界规则
限额表之外,还有一些规则会实际影响使用方式,但不容易从功能列表看出来。以下逐条列出。
附件上传不走 API 体积上限
普通 API 请求的 body 上限是 5 MiB,但 PUT /api/r2/objects(附件与分享包直传)豁免这一限制,直接按 50 MiB 的单次 PUT 走 R2。所以「附件能传 50 MiB」和「API body 限 5 MiB」并不矛盾 —— 前者不经过后者。
消息撤回与编辑是两个窗口
| 动作 | 作者本人 | 有 MANAGE_MESSAGES |
|---|---|---|
| 编辑 | 随时 | 随时 |
| 撤回 | 发送后 2 分钟内 | 随时,不受限制 |
超窗口撤回会返回 RETRACT_EXPIRED(403),但编辑不受 2 分钟限制 —— 超时后作者仍可改内容。见权限与角色。
未读与提及的计数口径
- 自己发的消息不算未读,否则发完就给自己亮角标
- 未读按
创建时间 > 我的已读位点统计,已读位点存的是毫秒时间戳,不是消息 id - 进不去的私密讨论组不返回未读(既不亮角标,也不泄露该组是否活跃),只返回带
locked标记的元数据
讨论组是惰性归档,没有定时器
自动归档不是在服务端跑定时任务,而是在读写列表时顺带检查:状态为活跃 且 距上次活动超过 24 小时 才归档,同时写入归档时间。所以「归档时间」可能略晚于「最后一次活动 + 24 小时」—— 取决于下次有人打开列表的时机。讨论组内再有人发言即自动恢复活跃。
公告频道的只读是「自动覆盖」
把频道类型切成 公告 时,系统自动为 @everyone 写入一条 deny(禁「发送消息」+「创建讨论组」);切回其他类型时自动撤销。因为 owner 绕过一切频道覆盖,所以 owner 在公告频道依然能发言,无需额外授权。你可以在自动覆盖之上继续手动调整,更新时会保留你已有的 deny 位。
发现页的排序不等于置顶
热门 按成员数排、活跃 按最近发言时间排、最新 按创建时间排。只有在没有搜索关键词时官方社区才会被置顶;一旦输入搜索词,就完全按排序规则返回,不再特殊对待。
邀请有两条路径,行为不同
| 路径 | 对象 | 建邀请记录 | 发站内信 | 发邮件 |
|---|---|---|---|---|
| 站内邀请 | 已注册用户 | 是 | 是 | 是 |
| 站外邀请邮件 | 任意邮箱 | 否 | 否 | 是 |
受理前会拦截两种情况:对方已是成员(409 ALREADY_MEMBER)、对方已有一条待处理邀请(409 INVITE_DUPLICATE)。接受 / 拒绝、或对方通过邀请码或公开社区自行加入时,会把遗留的待处理邀请一并收尾。
在线状态按窗口可见性判定
在线 / 离开只看 document.visibilityState,刻意不用窗口焦点 —— 否则切到别的窗口就会被误标为离开。收到某人「离开本房间」的通知时客户端不会直接删掉他,而是去抖后重拉社区快照,因为他可能正在同一社区的其他频道在线。
讨论组的可见性与连接是两道门
即使讨论组本身可见,建立实时连接仍先要求父频道的「查看频道」权限,通过后才判讨论组可见性。私密讨论组的可进入者 = 发起人 / 组内成员名单 / 持有社区「管理讨论组」权限者。
分享包的可见性跟着来源社区走
isPublic 只在来源社区是公开社区时才为 true。也就是说,在私有社区里创建的分享不会因为「分享本身标记为公开」而对外可见。
三、插件设置
| 键 | 默认 | 说明 |
|---|---|---|
serverUrl | https://dsh-guild-api.huiwang.fun | Server 地址;自托管就改成自己的域名 |
handle | "" | 当前账号用户名(登录后自动写入) |
token | ""(secret) | 会话令牌,登录后自动写入 |
autoReconnect | true | WebSocket 断线自动重连 |
share.maxSizeMb | 50 | 会话分享包体积上限 |
首次启动会把默认 serverUrl 写进 DSH 的 settings 文档($DSH_HOME/settings.yaml 的 guild 段):
yaml
guild:
serverUrl: https://dsh-guild-api.huiwang.fun之后以这份配置为准,启动流程不会覆盖你改过的值。