CI / Build & Quality Checks (pull_request) Successful in 1m52s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 8s
CI / Playwright smoke (e2e) (pull_request) Successful in 10m59s
DND was sent as presence unavailable with the literal status text "dnd": it replaced your status, and other clients showed "dnd". Where the server supports MSC3026 (busy_presence), DND now sends presence org.matrix.msc3026.busy and leaves the status alone (Synapse keeps busy across /sync set_presence=online). Busy renders as red "Do Not Disturb" with the real status line; the legacy unavailable + "dnd" encoding is still recognised and still used on servers without it. Status saves / clears no longer downgrade busy. The SDK rejects non-spec presences, so busy goes through a direct authed PUT. Fixes #283 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
22 lines
967 B
TypeScript
22 lines
967 B
TypeScript
/**
|
|
* [Gitea #283] Do Not Disturb as a real presence state: MSC3026 "busy"
|
|
* (Synapse `experimental_features.msc3026_enabled`). Before, DND was sent as
|
|
* presence `unavailable` with the literal status text "dnd", which replaced
|
|
* your status and showed as "dnd" in other clients.
|
|
*/
|
|
export const BUSY_PRESENCE = 'org.matrix.msc3026.busy';
|
|
export const BUSY_PRESENCE_FEATURE = 'org.matrix.msc3026.busy_presence';
|
|
|
|
let busySupported = false;
|
|
|
|
/** Recorded by the presence updater from the server's unstable_features. */
|
|
export const setBusyPresenceSupported = (supported: boolean): void => {
|
|
busySupported = supported;
|
|
};
|
|
|
|
export const isBusyPresenceSupported = (): boolean => busySupported;
|
|
|
|
/** Pure: whether a presence means Do Not Disturb (busy, or the legacy "dnd" text). */
|
|
export const isDndPresence = (presence: string | undefined, status: string | undefined): boolean =>
|
|
presence === BUSY_PRESENCE || (presence === 'unavailable' && status === 'dnd');
|