feat: Add pm

This commit is contained in:
2026-04-27 00:45:16 +02:00
parent bc2fa7de22
commit 11c2588e45
65 changed files with 3653 additions and 214 deletions

View File

@@ -14,6 +14,7 @@ require coordination.
| `moderation.models.ts` | `BanEntry` |
| `voice-state.models.ts` | `VoiceState`, `ScreenShareState` |
| `chat-events.ts` | `ChatEventType`, `ChatEvent`, `ChatInventoryItem` |
| `direct-message-contracts.ts` | `DirectMessage`, delivery status, P2P DM event payloads |
| `media-preferences.ts` | `LatencyProfile`, `ScreenShareQuality`, quality presets |
| `signaling-contracts.ts` | `SignalingMessage`, `SignalingMessageType` |
| `attachment-contracts.ts` | `ChatAttachmentAnnouncement`, `ChatAttachmentMeta` |

View File

@@ -9,6 +9,11 @@ import type {
import type { VoiceState } from './voice-state.models';
import type { BanEntry } from './moderation.models';
import type { ChatAttachmentAnnouncement, ChatAttachmentMeta } from './attachment-contracts';
import type {
DirectMessageEventPayload,
DirectMessageMutationEventPayload,
DirectMessageStatusEventPayload
} from './direct-message-contracts';
export interface ChatInventoryItem {
id: string;
@@ -77,6 +82,9 @@ export interface ChatEventBase {
bans?: BanEntry[];
banOderId?: string;
expiresAt?: number;
directMessage?: DirectMessageEventPayload;
directMessageStatus?: DirectMessageStatusEventPayload;
directMessageMutation?: DirectMessageMutationEventPayload;
}
export interface ChatMessageEvent extends ChatEventBase {
@@ -360,6 +368,21 @@ export interface ChannelsUpdateEvent extends ChatEventBase {
channels: Channel[];
}
export interface DirectMessagePeerEvent extends ChatEventBase {
type: 'direct-message';
directMessage: DirectMessageEventPayload;
}
export interface DirectMessageStatusPeerEvent extends ChatEventBase {
type: 'direct-message-status';
directMessageStatus: DirectMessageStatusEventPayload;
}
export interface DirectMessageMutationPeerEvent extends ChatEventBase {
type: 'direct-message-mutation';
directMessageMutation: DirectMessageMutationEventPayload;
}
/** Discriminated union of all P2P chat events. Narrow via `event.type`. */
export type ChatEvent =
| ChatMessageEvent
@@ -408,7 +431,10 @@ export type ChatEvent =
| KickEvent
| BanEvent
| UnbanEvent
| ChannelsUpdateEvent;
| ChannelsUpdateEvent
| DirectMessagePeerEvent
| DirectMessageStatusPeerEvent
| DirectMessageMutationPeerEvent;
/** All possible `type` values, derived from the union. */
export type ChatEventType = ChatEvent['type'];

View File

@@ -0,0 +1,54 @@
import type { Reaction } from './message.models';
export type DirectMessageStatus = 'QUEUED' | 'SENT' | 'DELIVERED' | 'ACKNOWLEDGED';
export type DirectMessageMutationType = 'edit' | 'delete' | 'reaction-add' | 'reaction-remove';
export interface DirectMessageParticipant {
userId: string;
username: string;
displayName: string;
description?: string;
avatarUrl?: string;
avatarHash?: string;
avatarMime?: string;
avatarUpdatedAt?: number;
profileUpdatedAt?: number;
}
export interface DirectMessage {
id: string;
conversationId: string;
senderId: string;
recipientId: string;
content: string;
timestamp: number;
status: DirectMessageStatus;
editedAt?: number;
isDeleted?: boolean;
reactions?: Reaction[];
replyToId?: string;
}
export interface DirectMessageEventPayload {
message: DirectMessage;
sender: DirectMessageParticipant;
}
export interface DirectMessageStatusEventPayload {
conversationId: string;
messageId: string;
status: DirectMessageStatus;
updatedAt: number;
}
export interface DirectMessageMutationEventPayload {
conversationId: string;
messageId: string;
type: DirectMessageMutationType;
content?: string;
editedAt?: number;
reaction?: Reaction;
oderId?: string;
emoji?: string;
updatedAt: number;
}

View File

@@ -4,6 +4,7 @@ export * from './access-control.models';
export * from './message.models';
export * from './moderation.models';
export * from './voice-state.models';
export * from './direct-message-contracts';
export * from './chat-events';
export * from './media-preferences';
export * from './signaling-contracts';