Files
cinny/src/app/utils/scheduledMessages.ts
T

54 lines
1.6 KiB
TypeScript
Raw Normal View History

import { IContent, MatrixClient, Method } from 'matrix-js-sdk';
/**
* Schedule a message via MSC4140 (delayed messages).
* Synapse implementation: pass org.matrix.msc4140.delay on the standard
* /v3/rooms send endpoint. The server stores the event and returns delay_id
* instead of event_id.
*/
export async function scheduleMessage(
mx: MatrixClient,
roomId: string,
content: IContent,
sendAtMs: number,
): Promise<string> {
const delayMs = Math.max(1000, Math.round(sendAtMs - Date.now()));
const txnId = `sched_${Date.now()}_${Math.random().toString(36).slice(2)}`;
const path = `/rooms/${encodeURIComponent(roomId)}/send/m.room.message/${txnId}`;
// Use standard v3 prefix with the MSC4140 delay query param.
const res = (await mx.http.authedRequest(
Method.Put,
path,
{
'org.matrix.msc4140.delay': delayMs,
},
content,
)) as { delay_id: string };
return res.delay_id;
}
/**
* Cancel a scheduled message via MSC4140.
*/
export async function cancelScheduledMessage(mx: MatrixClient, delayId: string): Promise<void> {
const path = `/delayed_events/${encodeURIComponent(delayId)}`;
await mx.http.authedRequest(
Method.Post,
path,
undefined,
{ action: 'cancel' },
{ prefix: '/_matrix/client/unstable/org.matrix.msc4140' },
);
}
export async function restartScheduledMessage(mx: MatrixClient, delayId: string): Promise<void> {
const path = `/delayed_events/${encodeURIComponent(delayId)}`;
await mx.http.authedRequest(
Method.Post,
path,
undefined,
{ action: 'restart' },
{ prefix: '/_matrix/client/unstable/org.matrix.msc4140' },
);
}