Skip to content

Commit 171cd3c

Browse files
author
Olek
committed
feat(chat): moderation api extending
1 parent 65da8c8 commit 171cd3c

18 files changed

Lines changed: 3699 additions & 322 deletions

File tree

docs/catalog.json

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,11 @@
4545
"chat_platform_ban",
4646
"chat_room",
4747
"chat_room_ban",
48+
"chat_room_configuration",
4849
"chat_room_member",
50+
"chat_room_mute",
51+
"chat_room_remove",
52+
"chat_room_rule",
4953
"chat_user_block",
5054
"chat_user_ignore"
5155
],
@@ -59,33 +63,45 @@
5963
"chat.adminMute",
6064
"chat.adminUnban",
6165
"chat.adminUnmute",
62-
"chat.banMember",
66+
"chat.banRoomMember",
6367
"chat.blockUser",
6468
"chat.createPrivateRoom",
6569
"chat.createRoom",
70+
"chat.createRoomRule",
6671
"chat.deleteMessage",
6772
"chat.deletePrivateRoom",
6873
"chat.deleteRoom",
74+
"chat.deleteRoomRule",
6975
"chat.getConnection",
7076
"chat.getGlobalMessages",
7177
"chat.getOnlineCount",
7278
"chat.getRoom",
79+
"chat.getRoomConfiguration",
7380
"chat.getRoomMessages",
81+
"chat.getRoomRules",
7482
"chat.ignoreUser",
83+
"chat.joinPublicRoom",
7584
"chat.joinRoom",
76-
"chat.kickMember",
7785
"chat.leaveRoom",
7886
"chat.listAdminRooms",
7987
"chat.listBlockedUsers",
8088
"chat.listIgnoredUsers",
89+
"chat.listRoomBlockedUsers",
8190
"chat.listRoomMembers",
91+
"chat.listRoomUsers",
8292
"chat.listRooms",
93+
"chat.muteRoomMember",
94+
"chat.removeMember",
8395
"chat.sendGlobalMessage",
8496
"chat.sendRoomMessage",
8597
"chat.streamMessages",
98+
"chat.unbanRoomMember",
8699
"chat.unblockUser",
87100
"chat.unignoreUser",
88-
"chat.updateRoom"
101+
"chat.unmuteRoomMember",
102+
"chat.updateRoom",
103+
"chat.updateRoomConfiguration",
104+
"chat.updateRoomRule"
89105
]
90106
},
91107
{
@@ -486,6 +502,15 @@
486502
"packages/core/src/pam/player-management/plugin.ts"
487503
]
488504
},
505+
{
506+
"category": "chat-moderation",
507+
"interface": "ChatModerationEntry",
508+
"token": "CHAT_MODERATION",
509+
"status": "wired",
510+
"boundIn": [
511+
"packages/core/src/engagement/chat/plugin.ts"
512+
]
513+
},
489514
{
490515
"category": "chat-room-access",
491516
"interface": "ChatRoomAccess",
@@ -748,8 +773,8 @@
748773
"chat.room.deleted",
749774
"chat.room.member.banned",
750775
"chat.room.member.joined",
751-
"chat.room.member.kicked",
752776
"chat.room.member.left",
777+
"chat.room.member.removed",
753778
"chat.room.updated",
754779
"chat.user.blocked",
755780
"chat.user.ignored",
@@ -1024,10 +1049,22 @@
10241049
"name": "ChatPlatformBanSchema",
10251050
"file": "packages/core/src/engagement/chat/contract/index.ts"
10261051
},
1052+
{
1053+
"name": "ChatRoomAccessStatusSchema",
1054+
"file": "packages/core/src/engagement/chat/contract/index.ts"
1055+
},
1056+
{
1057+
"name": "ChatRoomBanSchema",
1058+
"file": "packages/core/src/engagement/chat/contract/index.ts"
1059+
},
10271060
{
10281061
"name": "ChatRoomCategorySchema",
10291062
"file": "packages/core/src/engagement/chat/contract/index.ts"
10301063
},
1064+
{
1065+
"name": "ChatRoomConfigurationSchema",
1066+
"file": "packages/core/src/engagement/chat/contract/index.ts"
1067+
},
10311068
{
10321069
"name": "ChatRoomIdSchema",
10331070
"file": "packages/core/src/contracts/schemas/chat-command.ts"
@@ -1040,6 +1077,10 @@
10401077
"name": "ChatRoomRoleSchema",
10411078
"file": "packages/core/src/engagement/chat/contract/index.ts"
10421079
},
1080+
{
1081+
"name": "ChatRoomRuleSchema",
1082+
"file": "packages/core/src/engagement/chat/contract/index.ts"
1083+
},
10431084
{
10441085
"name": "ChatRoomSchema",
10451086
"file": "packages/core/src/engagement/chat/contract/index.ts"
@@ -1048,6 +1089,10 @@
10481089
"name": "ChatRoomSlugSchema",
10491090
"file": "packages/core/src/engagement/chat/contract/index.ts"
10501091
},
1092+
{
1093+
"name": "ChatRoomUserSchema",
1094+
"file": "packages/core/src/engagement/chat/contract/index.ts"
1095+
},
10511096
{
10521097
"name": "ClaimGiftOutputSchema",
10531098
"file": "packages/core/src/engagement/chat-commands/contract/index.ts"
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { createToken } from './token.js';
2+
3+
export type ChatModerationEntry = {
4+
id: string;
5+
userId: string;
6+
roomId: string | null;
7+
reason: string;
8+
createdAt: string;
9+
expiresAt: string | null;
10+
};
11+
12+
export type ChatPlatformBan = {
13+
id: string;
14+
userId: string;
15+
reason: string;
16+
createdAt: string;
17+
liftedAt: string | null;
18+
};
19+
20+
export type ChatModeration = {
21+
assertCanSend(userId: string, roomId: string | null, isPublic?: boolean): Promise<void>;
22+
deleteMessage(
23+
id: string,
24+
actorId: string,
25+
meta?: { ip: string | null; userAgent: string | null },
26+
): Promise<{ success: true }>;
27+
mute(input: {
28+
userId: string;
29+
roomId: string | null;
30+
durationSeconds: number | null;
31+
reason: string;
32+
actorId: string;
33+
ip: string | null;
34+
userAgent: string | null;
35+
}): Promise<{ success: true }>;
36+
unmute(input: {
37+
userId: string;
38+
roomId: string | null;
39+
actorId: string;
40+
ip: string | null;
41+
userAgent: string | null;
42+
}): Promise<{ success: true }>;
43+
listMutes(userId?: string): Promise<ChatModerationEntry[]>;
44+
ban(input: {
45+
userId: string;
46+
reason: string;
47+
actorId: string;
48+
ip: string | null;
49+
userAgent: string | null;
50+
}): Promise<{ success: true }>;
51+
unban(input: {
52+
userId: string;
53+
actorId: string;
54+
ip: string | null;
55+
userAgent: string | null;
56+
}): Promise<{ success: true }>;
57+
listBans(userId?: string): Promise<ChatPlatformBan[]>;
58+
};
59+
60+
export const CHAT_MODERATION = createToken<ChatModeration>('ChatModeration');

packages/core/src/contracts/adapters/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ export type {
1515
TokenValue,
1616
} from './token.js';
1717
export { createToken, createSealedToken, createClientPageToken } from './token.js';
18+
export type { ChatModeration, ChatModerationEntry, ChatPlatformBan } from './chat-moderation.js';
19+
export { CHAT_MODERATION } from './chat-moderation.js';
1820

1921
export type {
2022
EventEnvelope,

packages/core/src/contracts/schemas/events.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,19 +156,19 @@ export const domainEventSchemas = {
156156
roomId: UuidSchema,
157157
name: z.string(),
158158
slug: z.string(),
159-
category: z.string(),
159+
category: z.string().nullable(),
160160
actorId: UuidSchema.optional(),
161161
}),
162162
'chat.room.deleted': authContextBase.extend({
163163
roomId: UuidSchema,
164164
actorId: UuidSchema.optional(),
165-
before: z.object({ name: z.string(), slug: z.string(), category: z.string() }),
165+
before: z.object({ name: z.string(), slug: z.string(), category: z.string().nullable() }),
166166
}),
167167
'chat.room.updated': authContextBase.extend({
168168
roomId: UuidSchema,
169169
actorId: UuidSchema.optional(),
170-
before: z.object({ name: z.string(), slug: z.string(), category: z.string() }),
171-
after: z.object({ name: z.string(), slug: z.string(), category: z.string() }),
170+
before: z.object({ name: z.string(), slug: z.string(), category: z.string().nullable() }),
171+
after: z.object({ name: z.string(), slug: z.string(), category: z.string().nullable() }),
172172
}),
173173

174174
// Private room lifecycle: creation and member membership changes.
@@ -187,6 +187,11 @@ export const domainEventSchemas = {
187187
userId: UuidSchema,
188188
kickedBy: UuidSchema,
189189
}),
190+
'chat.room.member.removed': authContextBase.extend({
191+
roomId: UuidSchema,
192+
userId: UuidSchema,
193+
removedBy: UuidSchema,
194+
}),
190195
'chat.room.member.banned': authContextBase.extend({
191196
roomId: UuidSchema,
192197
userId: UuidSchema,

0 commit comments

Comments
 (0)