@openora/core 0.4.1-canary.71 → 0.4.1-canary.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/admin-console/__tests__/backoffice.service.int.test.js +30 -12
  3. package/dist/admin-console/__tests__/backoffice.service.int.test.js.map +1 -1
  4. package/dist/admin-console/contract/index.d.ts +4 -0
  5. package/dist/admin-console/contract/index.d.ts.map +1 -1
  6. package/dist/admin-console/contract/index.js +3 -2
  7. package/dist/admin-console/contract/index.js.map +1 -1
  8. package/dist/admin-console/plugin.d.ts +1 -0
  9. package/dist/admin-console/plugin.d.ts.map +1 -1
  10. package/dist/admin-console/router/index.d.ts +2 -0
  11. package/dist/admin-console/router/index.d.ts.map +1 -1
  12. package/dist/admin-console/service/backoffice.service.d.ts +2 -0
  13. package/dist/admin-console/service/backoffice.service.d.ts.map +1 -1
  14. package/dist/admin-console/service/backoffice.service.js +2 -0
  15. package/dist/admin-console/service/backoffice.service.js.map +1 -1
  16. package/dist/analytics/plugin.d.ts +1 -0
  17. package/dist/analytics/plugin.d.ts.map +1 -1
  18. package/dist/audit/plugin.d.ts +1 -0
  19. package/dist/audit/plugin.d.ts.map +1 -1
  20. package/dist/audit/plugin.js +6 -0
  21. package/dist/audit/plugin.js.map +1 -1
  22. package/dist/casino/gaming/plugin.d.ts +1 -0
  23. package/dist/casino/gaming/plugin.d.ts.map +1 -1
  24. package/dist/casino/lobby/plugin.d.ts +1 -0
  25. package/dist/casino/lobby/plugin.d.ts.map +1 -1
  26. package/dist/cms/plugin.d.ts +1 -0
  27. package/dist/cms/plugin.d.ts.map +1 -1
  28. package/dist/compliance/plugin.d.ts +1 -0
  29. package/dist/compliance/plugin.d.ts.map +1 -1
  30. package/dist/contracts/adapters/admin-user-directory.d.ts +4 -2
  31. package/dist/contracts/adapters/admin-user-directory.d.ts.map +1 -1
  32. package/dist/contracts/adapters/admin-user-directory.js.map +1 -1
  33. package/dist/contracts/adapters/chat-moderation.d.ts +75 -0
  34. package/dist/contracts/adapters/chat-moderation.d.ts.map +1 -0
  35. package/dist/contracts/adapters/chat-moderation.js +3 -0
  36. package/dist/contracts/adapters/chat-moderation.js.map +1 -0
  37. package/dist/contracts/adapters/index.d.ts +2 -0
  38. package/dist/contracts/adapters/index.d.ts.map +1 -1
  39. package/dist/contracts/adapters/index.js +1 -0
  40. package/dist/contracts/adapters/index.js.map +1 -1
  41. package/dist/contracts/adapters/realtime.d.ts +9 -1
  42. package/dist/contracts/adapters/realtime.d.ts.map +1 -1
  43. package/dist/contracts/adapters/realtime.js.map +1 -1
  44. package/dist/contracts/schemas/events.d.ts +19 -4
  45. package/dist/contracts/schemas/events.d.ts.map +1 -1
  46. package/dist/contracts/schemas/events.js +12 -5
  47. package/dist/contracts/schemas/events.js.map +1 -1
  48. package/dist/engagement/chat/__tests__/chat.service.int.test.js +315 -19
  49. package/dist/engagement/chat/__tests__/chat.service.int.test.js.map +1 -1
  50. package/dist/engagement/chat/contract/constants.d.ts +1 -1
  51. package/dist/engagement/chat/contract/constants.d.ts.map +1 -1
  52. package/dist/engagement/chat/contract/constants.js +1 -1
  53. package/dist/engagement/chat/contract/constants.js.map +1 -1
  54. package/dist/engagement/chat/contract/index.d.ts +764 -18
  55. package/dist/engagement/chat/contract/index.d.ts.map +1 -1
  56. package/dist/engagement/chat/contract/index.js +236 -5
  57. package/dist/engagement/chat/contract/index.js.map +1 -1
  58. package/dist/engagement/chat/drizzle/migrations/0005_tranquil_gwen_stacy.sql +100 -0
  59. package/dist/engagement/chat/drizzle/migrations/0006_tiny_ultron.sql +3 -0
  60. package/dist/engagement/chat/drizzle/migrations/meta/0005_snapshot.json +1422 -0
  61. package/dist/engagement/chat/drizzle/migrations/meta/0006_snapshot.json +1456 -0
  62. package/dist/engagement/chat/drizzle/migrations/meta/_journal.json +14 -0
  63. package/dist/engagement/chat/plugin.d.ts +2 -1
  64. package/dist/engagement/chat/plugin.d.ts.map +1 -1
  65. package/dist/engagement/chat/plugin.js +25 -13
  66. package/dist/engagement/chat/plugin.js.map +1 -1
  67. package/dist/engagement/chat/router/index.d.ts +518 -18
  68. package/dist/engagement/chat/router/index.d.ts.map +1 -1
  69. package/dist/engagement/chat/router/index.js +140 -20
  70. package/dist/engagement/chat/router/index.js.map +1 -1
  71. package/dist/engagement/chat/schema/index.d.ts +1017 -16
  72. package/dist/engagement/chat/schema/index.d.ts.map +1 -1
  73. package/dist/engagement/chat/schema/index.js +110 -4
  74. package/dist/engagement/chat/schema/index.js.map +1 -1
  75. package/dist/engagement/chat/service/chat-ban.service.d.ts +26 -0
  76. package/dist/engagement/chat/service/chat-ban.service.d.ts.map +1 -0
  77. package/dist/engagement/chat/service/chat-ban.service.js +139 -0
  78. package/dist/engagement/chat/service/chat-ban.service.js.map +1 -0
  79. package/dist/engagement/chat/service/chat-message-moderation.service.d.ts +14 -0
  80. package/dist/engagement/chat/service/chat-message-moderation.service.d.ts.map +1 -0
  81. package/dist/engagement/chat/service/chat-message-moderation.service.js +48 -0
  82. package/dist/engagement/chat/service/chat-message-moderation.service.js.map +1 -0
  83. package/dist/engagement/chat/service/chat-moderation.service.d.ts +30 -0
  84. package/dist/engagement/chat/service/chat-moderation.service.d.ts.map +1 -0
  85. package/dist/engagement/chat/service/chat-moderation.service.js +40 -0
  86. package/dist/engagement/chat/service/chat-moderation.service.js.map +1 -0
  87. package/dist/engagement/chat/service/chat-mute.service.d.ts +26 -0
  88. package/dist/engagement/chat/service/chat-mute.service.d.ts.map +1 -0
  89. package/dist/engagement/chat/service/chat-mute.service.js +143 -0
  90. package/dist/engagement/chat/service/chat-mute.service.js.map +1 -0
  91. package/dist/engagement/chat/service/chat-room-ban.service.d.ts +29 -0
  92. package/dist/engagement/chat/service/chat-room-ban.service.d.ts.map +1 -0
  93. package/dist/engagement/chat/service/chat-room-ban.service.js +105 -0
  94. package/dist/engagement/chat/service/chat-room-ban.service.js.map +1 -0
  95. package/dist/engagement/chat/service/chat-room-membership.service.d.ts +72 -0
  96. package/dist/engagement/chat/service/chat-room-membership.service.d.ts.map +1 -0
  97. package/dist/engagement/chat/service/chat-room-membership.service.js +176 -0
  98. package/dist/engagement/chat/service/chat-room-membership.service.js.map +1 -0
  99. package/dist/engagement/chat/service/chat-room-mute.service.d.ts +25 -0
  100. package/dist/engagement/chat/service/chat-room-mute.service.d.ts.map +1 -0
  101. package/dist/engagement/chat/service/chat-room-mute.service.js +89 -0
  102. package/dist/engagement/chat/service/chat-room-mute.service.js.map +1 -0
  103. package/dist/engagement/chat/service/chat.service.d.ts +348 -61
  104. package/dist/engagement/chat/service/chat.service.d.ts.map +1 -1
  105. package/dist/engagement/chat/service/chat.service.js +460 -194
  106. package/dist/engagement/chat/service/chat.service.js.map +1 -1
  107. package/dist/engagement/chat/service/errors/chat-moderation.errors.d.ts +21 -0
  108. package/dist/engagement/chat/service/errors/chat-moderation.errors.d.ts.map +1 -0
  109. package/dist/engagement/chat/service/errors/chat-moderation.errors.js +31 -0
  110. package/dist/engagement/chat/service/errors/chat-moderation.errors.js.map +1 -0
  111. package/dist/engagement/chat-commands/contract/index.js +1 -1
  112. package/dist/engagement/chat-commands/contract/index.js.map +1 -1
  113. package/dist/engagement/chat-commands/drizzle/migrations/0001_sturdy_barracuda.sql +1 -0
  114. package/dist/engagement/chat-commands/drizzle/migrations/meta/0001_snapshot.json +83 -0
  115. package/dist/engagement/chat-commands/drizzle/migrations/meta/_journal.json +7 -0
  116. package/dist/engagement/chat-commands/plugin.d.ts +1 -0
  117. package/dist/engagement/chat-commands/plugin.d.ts.map +1 -1
  118. package/dist/engagement/chat-commands/schema/index.d.ts +0 -199
  119. package/dist/engagement/chat-commands/schema/index.d.ts.map +1 -1
  120. package/dist/engagement/chat-commands/schema/index.js +1 -19
  121. package/dist/engagement/chat-commands/schema/index.js.map +1 -1
  122. package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.js +15 -1
  123. package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.js.map +1 -1
  124. package/dist/engagement/chat-commands/service/chat-commands.service.d.ts +1 -0
  125. package/dist/engagement/chat-commands/service/chat-commands.service.d.ts.map +1 -1
  126. package/dist/engagement/chat-commands/service/chat-commands.service.js +38 -3
  127. package/dist/engagement/chat-commands/service/chat-commands.service.js.map +1 -1
  128. package/dist/engagement/notifications/plugin.d.ts +1 -0
  129. package/dist/engagement/notifications/plugin.d.ts.map +1 -1
  130. package/dist/engagement/social/plugin.d.ts +1 -0
  131. package/dist/engagement/social/plugin.d.ts.map +1 -1
  132. package/dist/engagement/social-transfers/plugin.d.ts +1 -0
  133. package/dist/engagement/social-transfers/plugin.d.ts.map +1 -1
  134. package/dist/engagement/social-transfers/schema/index.d.ts +1 -2
  135. package/dist/engagement/social-transfers/schema/index.d.ts.map +1 -1
  136. package/dist/engagement/social-transfers/schema/index.js +1 -2
  137. package/dist/engagement/social-transfers/schema/index.js.map +1 -1
  138. package/dist/engagement/social-transfers/service/__tests__/social-transfers.service.test.js +19 -0
  139. package/dist/engagement/social-transfers/service/__tests__/social-transfers.service.test.js.map +1 -1
  140. package/dist/iam/plugin.d.ts +1 -0
  141. package/dist/iam/plugin.d.ts.map +1 -1
  142. package/dist/iam/seed/data/default-admin-roles.d.ts.map +1 -1
  143. package/dist/iam/seed/data/default-admin-roles.js +3 -0
  144. package/dist/iam/seed/data/default-admin-roles.js.map +1 -1
  145. package/dist/pam/identity/__tests__/admin-user-directory.int.test.js +33 -3
  146. package/dist/pam/identity/__tests__/admin-user-directory.int.test.js.map +1 -1
  147. package/dist/pam/identity/admin-user-directory.d.ts +12 -0
  148. package/dist/pam/identity/admin-user-directory.d.ts.map +1 -1
  149. package/dist/pam/identity/admin-user-directory.js +25 -25
  150. package/dist/pam/identity/admin-user-directory.js.map +1 -1
  151. package/dist/pam/identity/plugin.d.ts +1 -0
  152. package/dist/pam/identity/plugin.d.ts.map +1 -1
  153. package/dist/pam/player-management/__tests__/player.service.int.test.js +4 -0
  154. package/dist/pam/player-management/__tests__/player.service.int.test.js.map +1 -1
  155. package/dist/pam/player-management/plugin.d.ts +1 -0
  156. package/dist/pam/player-management/plugin.d.ts.map +1 -1
  157. package/dist/pam/player-note/plugin.d.ts +1 -0
  158. package/dist/pam/player-note/plugin.d.ts.map +1 -1
  159. package/dist/pam/profile/plugin.d.ts +1 -0
  160. package/dist/pam/profile/plugin.d.ts.map +1 -1
  161. package/dist/pam/tag/plugin.d.ts +1 -0
  162. package/dist/pam/tag/plugin.d.ts.map +1 -1
  163. package/dist/server/auth/permissions.d.ts +12 -12
  164. package/dist/server/auth/permissions.js +2 -2
  165. package/dist/server/auth/permissions.js.map +1 -1
  166. package/dist/server/kernel/__tests__/realtime-transport.test.js +7 -0
  167. package/dist/server/kernel/__tests__/realtime-transport.test.js.map +1 -1
  168. package/dist/server/kernel/orpc-error-map.d.ts.map +1 -1
  169. package/dist/server/kernel/orpc-error-map.js +4 -1
  170. package/dist/server/kernel/orpc-error-map.js.map +1 -1
  171. package/dist/server/kernel/realtime-transport.d.ts +3 -1
  172. package/dist/server/kernel/realtime-transport.d.ts.map +1 -1
  173. package/dist/server/kernel/realtime-transport.js +22 -4
  174. package/dist/server/kernel/realtime-transport.js.map +1 -1
  175. package/dist/server/runtime/core-token-catalog.d.ts +1 -0
  176. package/dist/server/runtime/core-token-catalog.d.ts.map +1 -1
  177. package/dist/server/runtime/core-token-catalog.js +2 -1
  178. package/dist/server/runtime/core-token-catalog.js.map +1 -1
  179. package/dist/testing/realtime-transport-conformance.d.ts.map +1 -1
  180. package/dist/testing/realtime-transport-conformance.js +4 -0
  181. package/dist/testing/realtime-transport-conformance.js.map +1 -1
  182. package/dist/wallet/__tests__/wallet.service.int.test.js +19 -2
  183. package/dist/wallet/__tests__/wallet.service.int.test.js.map +1 -1
  184. package/dist/wallet/contract/index.d.ts +2 -0
  185. package/dist/wallet/contract/index.d.ts.map +1 -1
  186. package/dist/wallet/contract/index.js +1 -0
  187. package/dist/wallet/contract/index.js.map +1 -1
  188. package/dist/wallet/plugin.d.ts +1 -0
  189. package/dist/wallet/plugin.d.ts.map +1 -1
  190. package/dist/wallet/router/index.d.ts +1 -0
  191. package/dist/wallet/router/index.d.ts.map +1 -1
  192. package/dist/wallet/service/wallet.service.d.ts +1 -0
  193. package/dist/wallet/service/wallet.service.d.ts.map +1 -1
  194. package/dist/wallet/service/wallet.service.js +1 -0
  195. package/dist/wallet/service/wallet.service.js.map +1 -1
  196. package/package.json +1 -1
@@ -0,0 +1,89 @@
1
+ import { and, eq, isNull } from 'drizzle-orm';
2
+ import { withAdvisoryXactLock } from '@openora/core/server';
3
+ import { chatRoomMember, chatRoomMute } from '../schema/index.js';
4
+ import { ChatRoomNotModeratorError, ChatRoomSelfModerationError, } from './errors/chat-moderation.errors.js';
5
+ export class ChatRoomMuteService {
6
+ drizzle;
7
+ audit;
8
+ constructor(drizzle, audit) {
9
+ this.drizzle = drizzle;
10
+ this.audit = audit;
11
+ }
12
+ async assertModerator(roomId, actorId, targetId) {
13
+ const [actor] = await this.drizzle.db
14
+ .select({ role: chatRoomMember.role })
15
+ .from(chatRoomMember)
16
+ .where(and(eq(chatRoomMember.roomId, roomId), eq(chatRoomMember.userId, actorId)))
17
+ .limit(1);
18
+ if (!actor || (actor.role !== 'moderator' && actor.role !== 'owner')) {
19
+ throw new ChatRoomNotModeratorError(roomId);
20
+ }
21
+ if (targetId) {
22
+ const [target] = await this.drizzle.db
23
+ .select({ role: chatRoomMember.role })
24
+ .from(chatRoomMember)
25
+ .where(and(eq(chatRoomMember.roomId, roomId), eq(chatRoomMember.userId, targetId)))
26
+ .limit(1);
27
+ if (actor.role !== 'owner' && target && target.role !== 'member') {
28
+ throw new ChatRoomNotModeratorError(roomId);
29
+ }
30
+ }
31
+ }
32
+ async muteRoomMember({ roomId, userId, moderatorId, durationSeconds = null, reason = '', }) {
33
+ if (moderatorId === userId) {
34
+ throw new ChatRoomSelfModerationError();
35
+ }
36
+ await this.assertModerator(roomId, moderatorId, userId);
37
+ const expiresAt = durationSeconds === null ? null : new Date(Date.now() + durationSeconds * 1000);
38
+ const created = await this.drizzle.db.transaction((t) => withAdvisoryXactLock(t, `chat-room-mute:${roomId}:${userId}`, async () => {
39
+ const now = new Date();
40
+ const [active] = await t
41
+ .select({ id: chatRoomMute.id, expiresAt: chatRoomMute.expiresAt })
42
+ .from(chatRoomMute)
43
+ .where(and(eq(chatRoomMute.roomId, roomId), eq(chatRoomMute.userId, userId), isNull(chatRoomMute.liftedAt)))
44
+ .limit(1);
45
+ if (active && (!active.expiresAt || active.expiresAt > now)) {
46
+ return null;
47
+ }
48
+ if (active) {
49
+ await t
50
+ .update(chatRoomMute)
51
+ .set({ liftedAt: now, liftedBy: moderatorId })
52
+ .where(eq(chatRoomMute.id, active.id));
53
+ }
54
+ const [inserted] = await t
55
+ .insert(chatRoomMute)
56
+ .values({ roomId, userId, mutedBy: moderatorId, reason, expiresAt })
57
+ .returning({ id: chatRoomMute.id });
58
+ return inserted;
59
+ }));
60
+ if (created) {
61
+ await this.audit.record({
62
+ actorId: moderatorId,
63
+ actorType: 'player',
64
+ action: 'chat.room.mute.created',
65
+ resourceType: 'chat_room_mute',
66
+ resourceId: created?.id ?? null,
67
+ after: { roomId, userId, durationSeconds, reason },
68
+ });
69
+ }
70
+ return { success: true };
71
+ }
72
+ async unmuteRoomMember({ roomId, userId, moderatorId, }) {
73
+ await this.assertModerator(roomId, moderatorId, userId);
74
+ await this.drizzle.db
75
+ .update(chatRoomMute)
76
+ .set({ liftedAt: new Date(), liftedBy: moderatorId })
77
+ .where(and(eq(chatRoomMute.roomId, roomId), eq(chatRoomMute.userId, userId), isNull(chatRoomMute.liftedAt)));
78
+ await this.audit.record({
79
+ actorId: moderatorId,
80
+ actorType: 'player',
81
+ action: 'chat.room.mute.lifted',
82
+ resourceType: 'chat_room_mute',
83
+ resourceId: null,
84
+ after: { roomId, userId },
85
+ });
86
+ return { success: true };
87
+ }
88
+ }
89
+ //# sourceMappingURL=chat-room-mute.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-room-mute.service.js","sourceRoot":"","sources":["../../../../src/engagement/chat/service/chat-room-mute.service.ts"],"names":[],"mappings":"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"}
@@ -1,29 +1,26 @@
1
1
  import { type EventBus, DrizzleService } from '@openora/core/server';
2
- import type { ClientMeta, RealtimeTransport, CommandMetadata, ChatSystemMessage, CommandChatMessage, AdminUserDirectory, IdentityReader } from '@openora/core/contracts';
2
+ import type { ClientMeta, ChatModeration, RealtimeTransport, CommandMetadata, ChatSystemMessage, CommandChatMessage, AdminUserDirectory, AuditWritePort, IdentityReader, Uuid } from '@openora/core/contracts';
3
+ import { GLOBAL_CHAT_ROOM_ID } from '@openora/core/contracts';
3
4
  import type { User } from '@openora/core/pam/schema/identity';
5
+ export { ChatRoomNotMemberError, ChatRoomNotModeratorError, ChatRoomSelfModerationError, ChatRoomLastModeratorError, ChatRoomJoinCodeNotFoundError, ChatRoomBannedError, ChatPlayerBannedError, } from './errors/chat-moderation.errors.js';
4
6
  import type { AdminRoomSortBy, BlockedUserSortBy, IgnoredUserSortBy, ChatRoom, ChatMessage, ChatRoomCategory, SortOrder } from '../contract/index.js';
5
- export declare const ChatRoomNotFoundError: new (id: string) => Error;
6
7
  export declare const ChatRoomOwnershipError: new () => Error;
7
- export declare const ChatMessageNotFoundError: new (id: string) => Error;
8
- export declare const ChatMessageOwnershipError: new () => Error;
9
8
  export declare const ChatMessageBlockedError: new () => Error;
10
9
  export declare const ChatSelfBlockError: new () => Error;
11
10
  export declare const ChatSelfIgnoreError: new () => Error;
12
11
  export declare const ChatRoomSlugConflictError: new () => Error;
13
12
  export declare const ChatRoomLimitReachedError: new () => Error;
14
- export declare const ChatRoomLastModeratorError: new () => Error;
15
- export declare const ChatRoomJoinCodeNotFoundError: new (code: string) => Error;
16
- export declare const ChatRoomBannedError: new (roomId: string) => Error;
17
- export declare const ChatRoomNotMemberError: new (roomId: string) => Error;
18
- export declare const ChatRoomNotModeratorError: new (roomId: string) => Error;
19
- export declare const ChatRoomSelfModerationError: new () => Error;
13
+ export declare const ChatRoomRuleNotFoundError: new (id: string) => Error;
14
+ export declare const ChatRoomConfigurationNotFoundError: new (id: string) => Error;
20
15
  export declare class ChatService {
21
16
  private readonly drizzle;
22
17
  private readonly events;
23
18
  private readonly transport;
24
19
  private readonly directory;
20
+ private readonly audit;
21
+ private readonly moderation;
25
22
  private readonly identityReader;
26
- constructor(drizzle: DrizzleService, events: EventBus, transport: RealtimeTransport, directory: AdminUserDirectory, identityReader: IdentityReader);
23
+ constructor(drizzle: DrizzleService, events: EventBus, transport: RealtimeTransport, directory: AdminUserDirectory, audit: AuditWritePort, moderation: ChatModeration, identityReader: IdentityReader);
27
24
  subscribeMessages(roomId: ChatRoom['id'] | null, listener: (message: ChatMessage) => void, viewerId?: User['id'], connectionId?: string): () => void;
28
25
  getOnlineCount(roomId: ChatRoom['id'] | null): Promise<{
29
26
  count: number;
@@ -37,39 +34,69 @@ export declare class ChatService {
37
34
  id: string;
38
35
  name: string;
39
36
  slug: string;
40
- category: "games-sports" | "regions" | "languages" | "private-channels";
37
+ category: "games-sports" | "regions" | "languages" | "private-channels" | null;
41
38
  isPublic: boolean;
42
39
  joinCode: string | null;
43
40
  creatorId: string | null;
44
41
  createdAt: Date;
45
42
  deletedAt: Date | null;
46
43
  }>;
44
+ verifyGlobalAccess(viewerId?: User['id']): Promise<void>;
47
45
  listRooms(viewerId?: User['id']): Promise<import("@openora/core/server").SerializedRow<{
46
+ isBanned: boolean;
47
+ bannedUntil: null;
48
48
  id: string;
49
49
  createdAt: Date;
50
50
  name: string;
51
51
  slug: string;
52
- category: "games-sports" | "regions" | "languages" | "private-channels";
52
+ category: "games-sports" | "regions" | "languages" | "private-channels" | null;
53
53
  creatorId: string | null;
54
54
  isPublic: boolean;
55
55
  joinCode: string | null;
56
- }, "createdAt">[]>;
57
- listAdminRooms({ page, limit, sortBy, sortOrder, }: {
56
+ }, "createdAt" | "bannedUntil">[]>;
57
+ listAdminRooms({ page, limit, name, sortBy, sortOrder, }: {
58
58
  page: number;
59
59
  limit: number;
60
+ name?: string;
60
61
  sortBy: AdminRoomSortBy;
61
62
  sortOrder: SortOrder;
62
63
  }): Promise<{
63
64
  items: import("@openora/core/server").SerializedRow<{
65
+ isBanned: boolean;
66
+ bannedUntil: null;
64
67
  id: string;
65
68
  createdAt: Date;
66
69
  name: string;
67
70
  slug: string;
68
- category: "games-sports" | "regions" | "languages" | "private-channels";
71
+ category: "games-sports" | "regions" | "languages" | "private-channels" | null;
69
72
  creatorId: string | null;
70
73
  isPublic: boolean;
71
74
  joinCode: string | null;
72
- }, "createdAt">[];
75
+ }, "createdAt" | "bannedUntil">[];
76
+ total: number;
77
+ page: number;
78
+ limit: number;
79
+ }>;
80
+ listModeratedRooms({ viewerId, page, limit, name, sortBy, sortOrder, }: {
81
+ viewerId: User['id'];
82
+ page: number;
83
+ limit: number;
84
+ name?: string;
85
+ sortBy: 'name' | 'createdAt';
86
+ sortOrder: SortOrder;
87
+ }): Promise<{
88
+ items: import("@openora/core/server").SerializedRow<{
89
+ isBanned: boolean;
90
+ bannedUntil: null;
91
+ id: string;
92
+ createdAt: Date;
93
+ name: string;
94
+ slug: string;
95
+ category: "games-sports" | "regions" | "languages" | "private-channels" | null;
96
+ creatorId: string | null;
97
+ isPublic: boolean;
98
+ joinCode: string | null;
99
+ }, "createdAt" | "bannedUntil">[];
73
100
  total: number;
74
101
  page: number;
75
102
  limit: number;
@@ -78,15 +105,122 @@ export declare class ChatService {
78
105
  roomId: ChatRoom['id'];
79
106
  viewerId?: User['id'];
80
107
  }): Promise<import("@openora/core/server").SerializedRow<{
108
+ isBanned: boolean;
109
+ bannedUntil: null;
81
110
  id: string;
82
111
  createdAt: Date;
83
112
  name: string;
84
113
  slug: string;
85
- category: "games-sports" | "regions" | "languages" | "private-channels";
114
+ category: "games-sports" | "regions" | "languages" | "private-channels" | null;
86
115
  creatorId: string | null;
87
116
  isPublic: boolean;
88
117
  joinCode: string | null;
89
- }, "createdAt">>;
118
+ }, "createdAt" | "bannedUntil">>;
119
+ private assertRoomModerator;
120
+ listRoomRules(roomReference: ChatRoom['id'] | typeof GLOBAL_CHAT_ROOM_ID, viewerId?: User['id']): Promise<import("@openora/core/server").SerializedRow<{
121
+ id: string;
122
+ createdAt: Date;
123
+ updatedAt: Date;
124
+ roomId: string;
125
+ content: string;
126
+ createdBy: string;
127
+ orderNum: number;
128
+ }, "createdAt" | "updatedAt">[]>;
129
+ createRoomRule({ roomId, actorId, orderNum, content, }: {
130
+ roomId: ChatRoom['id'];
131
+ actorId: User['id'];
132
+ orderNum?: number;
133
+ content: string;
134
+ }): Promise<import("@openora/core/server").SerializedRow<{
135
+ id: string;
136
+ createdAt: Date;
137
+ updatedAt: Date;
138
+ roomId: string;
139
+ content: string;
140
+ createdBy: string;
141
+ orderNum: number;
142
+ }, "createdAt" | "updatedAt">>;
143
+ updateRoomRule({ roomId, id, actorId, orderNum, content, }: {
144
+ roomId: ChatRoom['id'];
145
+ id: string;
146
+ actorId: User['id'];
147
+ orderNum?: number;
148
+ content?: string;
149
+ }): Promise<import("@openora/core/server").SerializedRow<{
150
+ id: string;
151
+ createdAt: Date;
152
+ updatedAt: Date;
153
+ roomId: string;
154
+ content: string;
155
+ createdBy: string;
156
+ orderNum: number;
157
+ }, "createdAt" | "updatedAt">>;
158
+ deleteRoomRule({ roomId, id, actorId, }: {
159
+ roomId: ChatRoom['id'];
160
+ id: string;
161
+ actorId: User['id'];
162
+ }): Promise<{
163
+ readonly success: true;
164
+ }>;
165
+ getRoomConfiguration(roomId: ChatRoom['id'], viewerId?: User['id']): Promise<import("@openora/core/server").SerializedRow<{
166
+ id: string;
167
+ createdAt: Date;
168
+ updatedAt: Date;
169
+ roomId: string;
170
+ slowMode: boolean;
171
+ slowModeSeconds: number;
172
+ readOnlyMode: boolean;
173
+ onlyInvitedCanJoin: boolean;
174
+ lockRoom: boolean;
175
+ moderatorInvite: boolean;
176
+ }, "createdAt" | "updatedAt">>;
177
+ updateRoomConfiguration({ roomId, actorId, ...patch }: {
178
+ roomId: ChatRoom['id'];
179
+ actorId: User['id'];
180
+ slowMode?: boolean;
181
+ slowModeSeconds?: number;
182
+ readOnlyMode?: boolean;
183
+ onlyInvitedCanJoin?: boolean;
184
+ lockRoom?: boolean;
185
+ moderatorInvite?: boolean;
186
+ }): Promise<import("@openora/core/server").SerializedRow<{
187
+ id: string;
188
+ createdAt: Date;
189
+ updatedAt: Date;
190
+ roomId: string;
191
+ slowMode: boolean;
192
+ slowModeSeconds: number;
193
+ readOnlyMode: boolean;
194
+ onlyInvitedCanJoin: boolean;
195
+ lockRoom: boolean;
196
+ moderatorInvite: boolean;
197
+ }, "createdAt" | "updatedAt">>;
198
+ listRoomUsers({ roomId, actorId, status, }: {
199
+ roomId: ChatRoom['id'];
200
+ actorId: User['id'];
201
+ status: 'all' | 'member' | 'owner';
202
+ }): Promise<import("@openora/core/server").SerializedRow<{
203
+ userId: string;
204
+ username: string | null;
205
+ role: "owner" | "member" | "moderator";
206
+ joinedAt: Date;
207
+ blocked: boolean;
208
+ banId: string | null;
209
+ banExpiresAt: Date | null;
210
+ }, "joinedAt" | "banExpiresAt">[]>;
211
+ listRoomBlockedUsers({ roomId, actorId }: {
212
+ roomId: ChatRoom['id'];
213
+ actorId: User['id'];
214
+ }): Promise<import("@openora/core/server").SerializedRow<{
215
+ id: string;
216
+ roomId: string;
217
+ userId: string;
218
+ bannedBy: string;
219
+ createdAt: Date;
220
+ expiresAt: Date | null;
221
+ liftedAt: Date | null;
222
+ liftedBy: string | null;
223
+ }, "createdAt" | "expiresAt" | "liftedAt">[]>;
90
224
  getRoomMessages({ roomId, limit, before, viewerId, }: {
91
225
  roomId: ChatRoom['id'];
92
226
  limit?: number;
@@ -218,6 +352,169 @@ export declare class ChatService {
218
352
  isDeleted: boolean;
219
353
  createdAt: string;
220
354
  })[]>;
355
+ listAdminRoomMessages({ roomId, page, limit, senderId, playerId, includeDeleted, }: {
356
+ roomId: ChatRoom['id'] | typeof GLOBAL_CHAT_ROOM_ID;
357
+ page: number;
358
+ limit: number;
359
+ senderId?: User['id'];
360
+ playerId?: Uuid;
361
+ includeDeleted: boolean;
362
+ }): Promise<{
363
+ items: ({
364
+ playerId: string | null;
365
+ id: string;
366
+ roomId: string | null;
367
+ actorId: string;
368
+ userId: string;
369
+ username: string;
370
+ content: string;
371
+ type: "system";
372
+ metadata: {
373
+ command: "profile";
374
+ targetUserId: string;
375
+ displayName: string;
376
+ level: number;
377
+ } | {
378
+ command: "gift";
379
+ giftId: string;
380
+ senderId: string;
381
+ senderUsername: string;
382
+ amount: string;
383
+ currency: string;
384
+ status?: "available" | "claimed" | undefined;
385
+ claimedBy?: string | null | undefined;
386
+ claimedByUsername?: string | null | undefined;
387
+ claimedAt?: string | null | undefined;
388
+ } | {
389
+ command: "rain";
390
+ fromUserId: string;
391
+ amount: string;
392
+ currency: string;
393
+ recipientCount: number;
394
+ perRecipient: string;
395
+ fromUsername?: string | undefined;
396
+ recipients?: {
397
+ userId: string;
398
+ username: string;
399
+ }[] | undefined;
400
+ } | {
401
+ command: "block";
402
+ targetUserId: string;
403
+ displayName: string;
404
+ } | {
405
+ command: "unblock";
406
+ targetUserId: string;
407
+ displayName: string;
408
+ } | {
409
+ command: "ignore";
410
+ targetUserId: string;
411
+ displayName: string;
412
+ } | {
413
+ command: "unignore";
414
+ targetUserId: string;
415
+ displayName: string;
416
+ } | {
417
+ command: "donate";
418
+ recipientId: string;
419
+ recipientUsername: string;
420
+ amount: string;
421
+ currency: string;
422
+ senderId?: string | undefined;
423
+ senderUsername?: string | undefined;
424
+ };
425
+ isDeleted: boolean;
426
+ createdAt: string;
427
+ } | {
428
+ playerId: string | null;
429
+ id: string;
430
+ roomId: string | null;
431
+ userId: string;
432
+ username: string;
433
+ content: string;
434
+ type: "user";
435
+ metadata: {
436
+ command: "profile";
437
+ targetUserId: string;
438
+ displayName: string;
439
+ level: number;
440
+ } | {
441
+ command: "gift";
442
+ giftId: string;
443
+ senderId: string;
444
+ senderUsername: string;
445
+ amount: string;
446
+ currency: string;
447
+ status?: "available" | "claimed" | undefined;
448
+ claimedBy?: string | null | undefined;
449
+ claimedByUsername?: string | null | undefined;
450
+ claimedAt?: string | null | undefined;
451
+ } | {
452
+ command: "rain";
453
+ fromUserId: string;
454
+ amount: string;
455
+ currency: string;
456
+ recipientCount: number;
457
+ perRecipient: string;
458
+ fromUsername?: string | undefined;
459
+ recipients?: {
460
+ userId: string;
461
+ username: string;
462
+ }[] | undefined;
463
+ } | {
464
+ command: "block";
465
+ targetUserId: string;
466
+ displayName: string;
467
+ } | {
468
+ command: "unblock";
469
+ targetUserId: string;
470
+ displayName: string;
471
+ } | {
472
+ command: "ignore";
473
+ targetUserId: string;
474
+ displayName: string;
475
+ } | {
476
+ command: "unignore";
477
+ targetUserId: string;
478
+ displayName: string;
479
+ } | {
480
+ command: "donate";
481
+ recipientId: string;
482
+ recipientUsername: string;
483
+ amount: string;
484
+ currency: string;
485
+ senderId?: string | undefined;
486
+ senderUsername?: string | undefined;
487
+ } | null;
488
+ isDeleted: boolean;
489
+ createdAt: string;
490
+ })[];
491
+ total: number;
492
+ page: number;
493
+ limit: number;
494
+ }>;
495
+ listAdminMessages({ page, limit, roomId, senderId, playerId, search, includeDeleted, sortOrder, }: {
496
+ page: number;
497
+ limit: number;
498
+ roomId?: ChatRoom['id'] | typeof GLOBAL_CHAT_ROOM_ID;
499
+ senderId?: User['id'];
500
+ playerId?: Uuid;
501
+ search?: string;
502
+ includeDeleted: boolean;
503
+ sortOrder: SortOrder;
504
+ }): Promise<{
505
+ items: {
506
+ id: string;
507
+ date: string;
508
+ roomId: string;
509
+ playerId: string | null;
510
+ roomName: string;
511
+ content: string;
512
+ time: string;
513
+ }[];
514
+ total: number;
515
+ page: number;
516
+ limit: number;
517
+ }>;
221
518
  private appendExcludedSendersFilter;
222
519
  sendRoomMessage({ userId, username, roomId, content, }: {
223
520
  userId: User['id'];
@@ -350,8 +647,8 @@ export declare class ChatService {
350
647
  isDeleted: boolean;
351
648
  createdAt: string;
352
649
  }>;
353
- deleteMessage(id: ChatMessage['id'], userId: User['id']): Promise<{
354
- readonly success: true;
650
+ deleteMessage(id: ChatMessage['id'], userId: User['id'], meta?: ClientMeta): Promise<{
651
+ success: true;
355
652
  }>;
356
653
  getGlobalMessages(limit?: number, viewerId?: User['id']): Promise<({
357
654
  id: string;
@@ -686,15 +983,17 @@ export declare class ChatService {
686
983
  category: ChatRoomCategory;
687
984
  actorId?: User['id'];
688
985
  } & ClientMeta): Promise<import("@openora/core/server").SerializedRow<{
986
+ isBanned: boolean;
987
+ bannedUntil: null;
689
988
  id: string;
690
989
  createdAt: Date;
691
990
  name: string;
692
991
  slug: string;
693
- category: "games-sports" | "regions" | "languages" | "private-channels";
992
+ category: "games-sports" | "regions" | "languages" | "private-channels" | null;
694
993
  creatorId: string | null;
695
994
  isPublic: boolean;
696
995
  joinCode: string | null;
697
- }, "createdAt">>;
996
+ }, "createdAt" | "bannedUntil">>;
698
997
  updateRoom({ id, name, slug, category, actorId, ip, userAgent, }: {
699
998
  id: ChatRoom['id'];
700
999
  name?: string;
@@ -702,15 +1001,33 @@ export declare class ChatService {
702
1001
  category?: ChatRoomCategory;
703
1002
  actorId?: User['id'];
704
1003
  } & ClientMeta): Promise<import("@openora/core/server").SerializedRow<{
1004
+ isBanned: boolean;
1005
+ bannedUntil: null;
1006
+ id: string;
1007
+ createdAt: Date;
1008
+ name: string;
1009
+ slug: string;
1010
+ category: "games-sports" | "regions" | "languages" | "private-channels" | null;
1011
+ creatorId: string | null;
1012
+ isPublic: boolean;
1013
+ joinCode: string | null;
1014
+ }, "createdAt" | "bannedUntil">>;
1015
+ updatePrivateRoom({ id, name, actorId, ip, userAgent, }: {
1016
+ id: ChatRoom['id'];
1017
+ name: string;
1018
+ actorId: User['id'];
1019
+ } & ClientMeta): Promise<import("@openora/core/server").SerializedRow<{
1020
+ isBanned: boolean;
1021
+ bannedUntil: null;
705
1022
  id: string;
706
1023
  createdAt: Date;
707
1024
  name: string;
708
1025
  slug: string;
709
- category: "games-sports" | "regions" | "languages" | "private-channels";
1026
+ category: "games-sports" | "regions" | "languages" | "private-channels" | null;
710
1027
  creatorId: string | null;
711
1028
  isPublic: boolean;
712
1029
  joinCode: string | null;
713
- }, "createdAt">>;
1030
+ }, "createdAt" | "bannedUntil">>;
714
1031
  deletePrivateRoom({ roomId, userId, ip, userAgent, }: {
715
1032
  roomId: ChatRoom['id'];
716
1033
  userId: User['id'];
@@ -724,48 +1041,17 @@ export declare class ChatService {
724
1041
  userId: User['id'];
725
1042
  name: string;
726
1043
  } & ClientMeta): Promise<import("@openora/core/server").SerializedRow<{
1044
+ isBanned: boolean;
1045
+ bannedUntil: null;
727
1046
  id: string;
728
1047
  createdAt: Date;
729
1048
  name: string;
730
1049
  slug: string;
731
- category: "games-sports" | "regions" | "languages" | "private-channels";
1050
+ category: "games-sports" | "regions" | "languages" | "private-channels" | null;
732
1051
  creatorId: string | null;
733
1052
  isPublic: boolean;
734
1053
  joinCode: string | null;
735
- }, "createdAt">>;
736
- joinRoom({ userId, joinCode, ip, userAgent, }: {
737
- userId: User['id'];
738
- joinCode: string;
739
- } & ClientMeta): Promise<import("@openora/core/server").SerializedRow<{
740
- id: string;
741
- createdAt: Date;
742
- name: string;
743
- slug: string;
744
- category: "games-sports" | "regions" | "languages" | "private-channels";
745
- creatorId: string | null;
746
- isPublic: boolean;
747
- joinCode: string | null;
748
- }, "createdAt">>;
749
- leaveRoom({ userId, roomId, ip, userAgent, }: {
750
- userId: User['id'];
751
- roomId: ChatRoom['id'];
752
- } & ClientMeta): Promise<{
753
- readonly success: true;
754
- }>;
755
- kickMember({ moderatorId, roomId, userId, ip, userAgent, }: {
756
- moderatorId: User['id'];
757
- roomId: ChatRoom['id'];
758
- userId: User['id'];
759
- } & ClientMeta): Promise<{
760
- readonly success: true;
761
- }>;
762
- banMember({ moderatorId, roomId, userId, ip, userAgent, }: {
763
- moderatorId: User['id'];
764
- roomId: ChatRoom['id'];
765
- userId: User['id'];
766
- } & ClientMeta): Promise<{
767
- readonly success: true;
768
- }>;
1054
+ }, "createdAt" | "bannedUntil">>;
769
1055
  postSystemMessage(args: {
770
1056
  roomId: ChatRoom['id'] | null;
771
1057
  actorId: User['id'];
@@ -784,8 +1070,9 @@ export declare class ChatService {
784
1070
  }): Promise<import("@openora/core/server").SerializedRow<{
785
1071
  username: string | null;
786
1072
  userId: string;
787
- role: "member" | "moderator";
1073
+ role: "owner" | "member" | "moderator";
788
1074
  joinedAt: Date;
789
1075
  }, "joinedAt">[]>;
1076
+ private canSeeAdminUsers;
790
1077
  }
791
1078
  //# sourceMappingURL=chat.service.d.ts.map