@notidotbot/noti-api-client 1.9.74 → 1.9.75

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 (55) hide show
  1. package/dist/classes/@me.d.ts +45 -0
  2. package/dist/classes/@me.js +25 -0
  3. package/dist/classes/guildInGame.d.ts +259 -0
  4. package/dist/classes/guildInGame.js +114 -0
  5. package/dist/classes/guildInfluencerPanel.d.ts +13 -0
  6. package/dist/classes/guildMessageScheduler.d.ts +15 -1
  7. package/dist/classes/publicGiveaways.d.ts +1 -1
  8. package/dist/classes/publicGiveaways.js +1 -1
  9. package/dist/core/manager.d.ts +2 -0
  10. package/dist/core/manager.js +2 -0
  11. package/dist/index.d.ts +4 -0
  12. package/dist/index.js +12 -1
  13. package/dist/other/bitfields.d.ts +7 -4
  14. package/dist/other/bitfields.js +3 -0
  15. package/dist/other/features.d.ts +1 -1
  16. package/dist/other/features.js +1 -0
  17. package/dist/other/inGameAlerts.d.ts +83 -0
  18. package/dist/other/inGameAlerts.js +65 -0
  19. package/dist/other/inGameMiniMessage.d.ts +14 -0
  20. package/dist/other/inGameMiniMessage.js +135 -0
  21. package/dist/other/types.d.ts +2 -0
  22. package/dist/other/zod/clubStreamer.zod.d.ts +5 -0
  23. package/dist/other/zod/clubStreamer.zod.js +7 -0
  24. package/dist/other/zod/giveaways.zod.d.ts +17 -0
  25. package/dist/other/zod/giveaways.zod.js +8 -0
  26. package/dist/other/zod/kickStreamer.zod.d.ts +6 -0
  27. package/dist/other/zod/kickStreamer.zod.js +7 -0
  28. package/dist/other/zod/rumbleStreamer.zod.d.ts +7 -0
  29. package/dist/other/zod/rumbleStreamer.zod.js +7 -0
  30. package/dist/other/zod/scheduledMessage.zod.d.ts +10 -2
  31. package/dist/other/zod/scheduledMessage.zod.js +29 -5
  32. package/dist/other/zod/schema.zod.d.ts +6 -0
  33. package/dist/other/zod/schema.zod.js +7 -1
  34. package/dist/other/zod/tiktokStreamer.zod.d.ts +7 -0
  35. package/dist/other/zod/tiktokStreamer.zod.js +7 -0
  36. package/dist/other/zod/twitchStreamer.zod.d.ts +6 -0
  37. package/dist/other/zod/twitchStreamer.zod.js +7 -0
  38. package/dist/other/zod/twitterStreamer.zod.d.ts +7 -0
  39. package/dist/other/zod/twitterStreamer.zod.js +7 -0
  40. package/dist/other/zod/youtubeStreamer.zod.d.ts +7 -0
  41. package/dist/other/zod/youtubeStreamer.zod.js +7 -0
  42. package/dist/tsconfig.tsbuildinfo +1 -1
  43. package/package.json +1 -1
  44. package/prisma/generated/ts-prisma.d.ts +129 -0
  45. package/prisma/schema/models/clubStreamer.prisma +5 -0
  46. package/prisma/schema/models/giveaways.prisma +9 -0
  47. package/prisma/schema/models/inGame.prisma +77 -0
  48. package/prisma/schema/models/kickStreamer.prisma +5 -0
  49. package/prisma/schema/models/rumbleStreamer.prisma +5 -0
  50. package/prisma/schema/models/scheduledMessage.prisma +10 -1
  51. package/prisma/schema/models/tiktokStreamer.prisma +5 -0
  52. package/prisma/schema/models/twitchStreamer.prisma +5 -0
  53. package/prisma/schema/models/twitterStreamer.prisma +5 -0
  54. package/prisma/schema/models/youtubeStreamer.prisma +5 -0
  55. package/prisma/schema/schema.prisma +16 -0
@@ -130,6 +130,7 @@ export declare const GuildFeatures: {
130
130
  YouTubeReplayChannel: bigint;
131
131
  LivePostUpdates: bigint;
132
132
  MultiDestination: bigint;
133
+ InGameRewards: bigint;
133
134
  };
134
135
  export declare const GuildFeaturesText: Record<keyof typeof GuildFeatures, string>;
135
136
  export declare const UserFeatures: {
@@ -247,8 +248,9 @@ export declare class GuildFeaturesManager extends BitFieldManager<typeof GuildFe
247
248
  YouTubeReplayChannel: bigint;
248
249
  LivePostUpdates: bigint;
249
250
  MultiDestination: bigint;
251
+ InGameRewards: bigint;
250
252
  };
251
- t: Record<"BaseSyncableRoles" | "FullSyncableRoles" | "LiveRole" | "StatCounters" | "VoteSkipping" | "KickAuditLogs" | "LeaderboardCommand" | "RefreshingLeaderboard" | "LeaderBoardSyncRoles" | "BetaAccess" | "PriorityNotifications" | "KickClips" | "KickNotifications" | "TwitchNotifications" | "ImportEmojis" | "ImportEmojisWithSub" | "CustomWebhooks" | "AnyMessageEditor" | "SyncSocialUsernames" | "AutoDeleteNotifications" | "TestNotificationCommand" | "CustomCooldowns" | "WelcomeAndLeaveNotifications" | "NotificationPingRoleId" | "SwitchStreamerAndGuildEmbeds" | "BirthdayNotifications" | "AllowNotSendingOfflineNotifications" | "AutoStatusLiveRoles" | "RumbleNotifications" | "AllowAutoPublishNotifications" | "NotificationOverrides" | "UseCustomButtons" | "AllowVodFeatures" | "TikTokNotifications" | "StatusRoles" | "ManageBranding" | "StickyMessages" | "Starboards" | "CustomStarboards" | "AutoThreadOnStarboard" | "StarboardRewardRole" | "Giveaways" | "GiveawayLogs" | "ModifyGiveawayWhileRunning" | "ScheduleGiveaways" | "GiveawayRequirements" | "GiveawayBonusEntries" | "GiveawayEntryLimit" | "DisableDoubleVoteEntry" | "YouTubeNotifications" | "LinkedRoles" | "RandomMessages" | "WeeklyBirthdayPanel" | "GameNotifications" | "GameCategoryRouting" | "GameAllTimeLowAlerts" | "GameChangelogs" | "GameRobloxTracking" | "FixUrlWebhook" | "FixUrlCustomRules" | "KickClipperSubscribe" | "WhatnotNotifications" | "ScheduledEventMessages" | "ScheduledMessageWebhooks" | "ReactionRoles" | "AdvancedRolePanels" | "KickClipForwarding" | "TwitchClipForwarding" | "ClubNotifications" | "RolePanelWebhooks" | "Fishing" | "FishingCustomization" | "FishingWebhooks" | "StreamRoles" | "RoleFilters" | "TwitterNotifications" | "TwitterLiveNotifications" | "BadgeAllGames" | "AutoRoles" | "AutoRoleTimers" | "AutoRoleInvites" | "StickyMessageRoleFilters" | "GiveawayClaims" | "GiveawayWinnerRole" | "InfluencerPanel" | "InfluencerPanelPremium" | "InfluencerPanelPlus" | "StatusRoleKeepOnOffline" | "YouTubeReplayChannel" | "LivePostUpdates" | "MultiDestination", string>;
253
+ t: Record<"StickyMessages" | "LinkedRoles" | "StatusRoles" | "Starboards" | "KickClips" | "StatCounters" | "BaseSyncableRoles" | "FullSyncableRoles" | "LiveRole" | "VoteSkipping" | "KickAuditLogs" | "LeaderboardCommand" | "RefreshingLeaderboard" | "LeaderBoardSyncRoles" | "BetaAccess" | "PriorityNotifications" | "KickNotifications" | "TwitchNotifications" | "ImportEmojis" | "ImportEmojisWithSub" | "CustomWebhooks" | "AnyMessageEditor" | "SyncSocialUsernames" | "AutoDeleteNotifications" | "TestNotificationCommand" | "CustomCooldowns" | "WelcomeAndLeaveNotifications" | "NotificationPingRoleId" | "SwitchStreamerAndGuildEmbeds" | "BirthdayNotifications" | "AllowNotSendingOfflineNotifications" | "AutoStatusLiveRoles" | "RumbleNotifications" | "AllowAutoPublishNotifications" | "NotificationOverrides" | "UseCustomButtons" | "AllowVodFeatures" | "TikTokNotifications" | "ManageBranding" | "CustomStarboards" | "AutoThreadOnStarboard" | "StarboardRewardRole" | "Giveaways" | "GiveawayLogs" | "ModifyGiveawayWhileRunning" | "ScheduleGiveaways" | "GiveawayRequirements" | "GiveawayBonusEntries" | "GiveawayEntryLimit" | "DisableDoubleVoteEntry" | "YouTubeNotifications" | "RandomMessages" | "WeeklyBirthdayPanel" | "GameNotifications" | "GameCategoryRouting" | "GameAllTimeLowAlerts" | "GameChangelogs" | "GameRobloxTracking" | "FixUrlWebhook" | "FixUrlCustomRules" | "KickClipperSubscribe" | "WhatnotNotifications" | "ScheduledEventMessages" | "ScheduledMessageWebhooks" | "ReactionRoles" | "AdvancedRolePanels" | "KickClipForwarding" | "TwitchClipForwarding" | "ClubNotifications" | "RolePanelWebhooks" | "Fishing" | "FishingCustomization" | "FishingWebhooks" | "StreamRoles" | "RoleFilters" | "TwitterNotifications" | "TwitterLiveNotifications" | "BadgeAllGames" | "AutoRoles" | "AutoRoleTimers" | "AutoRoleInvites" | "StickyMessageRoleFilters" | "GiveawayClaims" | "GiveawayWinnerRole" | "InfluencerPanel" | "InfluencerPanelPremium" | "InfluencerPanelPlus" | "StatusRoleKeepOnOffline" | "YouTubeReplayChannel" | "LivePostUpdates" | "MultiDestination" | "InGameRewards", string>;
252
254
  all: bigint;
253
255
  static b: {
254
256
  BaseSyncableRoles: bigint;
@@ -342,8 +344,9 @@ export declare class GuildFeaturesManager extends BitFieldManager<typeof GuildFe
342
344
  YouTubeReplayChannel: bigint;
343
345
  LivePostUpdates: bigint;
344
346
  MultiDestination: bigint;
347
+ InGameRewards: bigint;
345
348
  };
346
- static t: Record<"BaseSyncableRoles" | "FullSyncableRoles" | "LiveRole" | "StatCounters" | "VoteSkipping" | "KickAuditLogs" | "LeaderboardCommand" | "RefreshingLeaderboard" | "LeaderBoardSyncRoles" | "BetaAccess" | "PriorityNotifications" | "KickClips" | "KickNotifications" | "TwitchNotifications" | "ImportEmojis" | "ImportEmojisWithSub" | "CustomWebhooks" | "AnyMessageEditor" | "SyncSocialUsernames" | "AutoDeleteNotifications" | "TestNotificationCommand" | "CustomCooldowns" | "WelcomeAndLeaveNotifications" | "NotificationPingRoleId" | "SwitchStreamerAndGuildEmbeds" | "BirthdayNotifications" | "AllowNotSendingOfflineNotifications" | "AutoStatusLiveRoles" | "RumbleNotifications" | "AllowAutoPublishNotifications" | "NotificationOverrides" | "UseCustomButtons" | "AllowVodFeatures" | "TikTokNotifications" | "StatusRoles" | "ManageBranding" | "StickyMessages" | "Starboards" | "CustomStarboards" | "AutoThreadOnStarboard" | "StarboardRewardRole" | "Giveaways" | "GiveawayLogs" | "ModifyGiveawayWhileRunning" | "ScheduleGiveaways" | "GiveawayRequirements" | "GiveawayBonusEntries" | "GiveawayEntryLimit" | "DisableDoubleVoteEntry" | "YouTubeNotifications" | "LinkedRoles" | "RandomMessages" | "WeeklyBirthdayPanel" | "GameNotifications" | "GameCategoryRouting" | "GameAllTimeLowAlerts" | "GameChangelogs" | "GameRobloxTracking" | "FixUrlWebhook" | "FixUrlCustomRules" | "KickClipperSubscribe" | "WhatnotNotifications" | "ScheduledEventMessages" | "ScheduledMessageWebhooks" | "ReactionRoles" | "AdvancedRolePanels" | "KickClipForwarding" | "TwitchClipForwarding" | "ClubNotifications" | "RolePanelWebhooks" | "Fishing" | "FishingCustomization" | "FishingWebhooks" | "StreamRoles" | "RoleFilters" | "TwitterNotifications" | "TwitterLiveNotifications" | "BadgeAllGames" | "AutoRoles" | "AutoRoleTimers" | "AutoRoleInvites" | "StickyMessageRoleFilters" | "GiveawayClaims" | "GiveawayWinnerRole" | "InfluencerPanel" | "InfluencerPanelPremium" | "InfluencerPanelPlus" | "StatusRoleKeepOnOffline" | "YouTubeReplayChannel" | "LivePostUpdates" | "MultiDestination", string>;
349
+ static t: Record<"StickyMessages" | "LinkedRoles" | "StatusRoles" | "Starboards" | "KickClips" | "StatCounters" | "BaseSyncableRoles" | "FullSyncableRoles" | "LiveRole" | "VoteSkipping" | "KickAuditLogs" | "LeaderboardCommand" | "RefreshingLeaderboard" | "LeaderBoardSyncRoles" | "BetaAccess" | "PriorityNotifications" | "KickNotifications" | "TwitchNotifications" | "ImportEmojis" | "ImportEmojisWithSub" | "CustomWebhooks" | "AnyMessageEditor" | "SyncSocialUsernames" | "AutoDeleteNotifications" | "TestNotificationCommand" | "CustomCooldowns" | "WelcomeAndLeaveNotifications" | "NotificationPingRoleId" | "SwitchStreamerAndGuildEmbeds" | "BirthdayNotifications" | "AllowNotSendingOfflineNotifications" | "AutoStatusLiveRoles" | "RumbleNotifications" | "AllowAutoPublishNotifications" | "NotificationOverrides" | "UseCustomButtons" | "AllowVodFeatures" | "TikTokNotifications" | "ManageBranding" | "CustomStarboards" | "AutoThreadOnStarboard" | "StarboardRewardRole" | "Giveaways" | "GiveawayLogs" | "ModifyGiveawayWhileRunning" | "ScheduleGiveaways" | "GiveawayRequirements" | "GiveawayBonusEntries" | "GiveawayEntryLimit" | "DisableDoubleVoteEntry" | "YouTubeNotifications" | "RandomMessages" | "WeeklyBirthdayPanel" | "GameNotifications" | "GameCategoryRouting" | "GameAllTimeLowAlerts" | "GameChangelogs" | "GameRobloxTracking" | "FixUrlWebhook" | "FixUrlCustomRules" | "KickClipperSubscribe" | "WhatnotNotifications" | "ScheduledEventMessages" | "ScheduledMessageWebhooks" | "ReactionRoles" | "AdvancedRolePanels" | "KickClipForwarding" | "TwitchClipForwarding" | "ClubNotifications" | "RolePanelWebhooks" | "Fishing" | "FishingCustomization" | "FishingWebhooks" | "StreamRoles" | "RoleFilters" | "TwitterNotifications" | "TwitterLiveNotifications" | "BadgeAllGames" | "AutoRoles" | "AutoRoleTimers" | "AutoRoleInvites" | "StickyMessageRoleFilters" | "GiveawayClaims" | "GiveawayWinnerRole" | "InfluencerPanel" | "InfluencerPanelPremium" | "InfluencerPanelPlus" | "StatusRoleKeepOnOffline" | "YouTubeReplayChannel" | "LivePostUpdates" | "MultiDestination" | "InGameRewards", string>;
347
350
  static all: bigint;
348
351
  convertBitToField<T extends EnumValues<typeof GuildFeatures>>(bit: T): string | null;
349
352
  }
@@ -379,7 +382,7 @@ export declare class UserFlagsManager extends BitFieldManager<typeof UserFlags,
379
382
  Beta: bigint;
380
383
  Owner: bigint;
381
384
  };
382
- t: Record<"Partner" | "Premium" | "Staff" | "Developer" | "Beta" | "Owner", string>;
385
+ t: Record<"Premium" | "Partner" | "Staff" | "Developer" | "Beta" | "Owner", string>;
383
386
  all: bigint;
384
387
  static b: {
385
388
  Partner: bigint;
@@ -389,7 +392,7 @@ export declare class UserFlagsManager extends BitFieldManager<typeof UserFlags,
389
392
  Beta: bigint;
390
393
  Owner: bigint;
391
394
  };
392
- static t: Record<"Partner" | "Premium" | "Staff" | "Developer" | "Beta" | "Owner", string>;
395
+ static t: Record<"Premium" | "Partner" | "Staff" | "Developer" | "Beta" | "Owner", string>;
393
396
  static all: bigint;
394
397
  convertBitToField<T extends EnumValues<typeof UserFlags>>(bit: T): string | null;
395
398
  }
@@ -237,6 +237,8 @@ exports.GuildFeatures = {
237
237
  LivePostUpdates: 1n << 90n,
238
238
  // Multiple notification channels: up to 2 extra channels per creator, each with its own ping role. Premium Plus.
239
239
  MultiDestination: 1n << 91n,
240
+ // Minecraft reward commands: a giveaway runs a preset command on the winner's game server. Premium.
241
+ InGameRewards: 1n << 92n,
240
242
  };
241
243
  exports.GuildFeaturesText = {
242
244
  BaseSyncableRoles: 'Basic Syncable Roles',
@@ -332,6 +334,7 @@ exports.GuildFeaturesText = {
332
334
  YouTubeReplayChannel: 'YouTube: Replay Channel',
333
335
  LivePostUpdates: 'Live Post Updates',
334
336
  MultiDestination: 'Multiple Notification Channels',
337
+ InGameRewards: 'Minecraft: Reward Commands',
335
338
  };
336
339
  exports.UserFeatures = {
337
340
  HasOneServerPremium: 1n << 0n,
@@ -1,4 +1,4 @@
1
- export declare const FEATURE_NAMES: readonly ["freeGames", "gameChangelogs", "robloxNotifications", "fixLinks", "clipperNotifications", "scheduledMessages", "linkedRoles", "reactionRoles", "clipForwarding", "club", "whatnot", "fishing", "giveaways", "starboards", "syncedRoles", "birthdays", "statusRoles", "autoStatusLiveRoles", "streamRoles", "badgeNotifications", "kickBounties", "autoRoles", "giveawayClaims", "influencerPanel", "publicGiveaways", "publicDrops", "sitePolls", "siteAnnouncements", "offlineGracePeriod", "youtubeReplays", "livePostUpdates", "multiDestination", "twitter", "voteToTest", "voteToAddSocial", "aiAssistant", "voteToUseAssistant", "assistantShareChat", "emotes", "liveRoles", "stickyMessages", "welcomeLeave", "statCounters", "voteSkipping"];
1
+ export declare const FEATURE_NAMES: readonly ["freeGames", "gameChangelogs", "robloxNotifications", "fixLinks", "clipperNotifications", "scheduledMessages", "linkedRoles", "reactionRoles", "clipForwarding", "club", "whatnot", "fishing", "giveaways", "starboards", "syncedRoles", "birthdays", "statusRoles", "autoStatusLiveRoles", "streamRoles", "badgeNotifications", "kickBounties", "autoRoles", "giveawayClaims", "influencerPanel", "publicGiveaways", "publicDrops", "sitePolls", "siteAnnouncements", "offlineGracePeriod", "youtubeReplays", "livePostUpdates", "multiDestination", "inGame", "twitter", "voteToTest", "voteToAddSocial", "aiAssistant", "voteToUseAssistant", "assistantShareChat", "emotes", "liveRoles", "stickyMessages", "welcomeLeave", "statCounters", "voteSkipping"];
2
2
  export type FeatureName = (typeof FEATURE_NAMES)[number];
3
3
  export type FeatureStatus = 'off' | 'beta' | 'public';
4
4
  export type ResolvedFeature = 'public' | 'beta' | 'hidden';
@@ -37,6 +37,7 @@ exports.FEATURE_NAMES = [
37
37
  'youtubeReplays',
38
38
  'livePostUpdates',
39
39
  'multiDestination',
40
+ 'inGame',
40
41
  'twitter',
41
42
  'voteToTest',
42
43
  'voteToAddSocial',
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Which notifications can show in Minecraft, per platform (phases/in-game/ P3, TRACKER G3/G3c/G3d).
3
+ *
4
+ * Mirrors `src/modules/inGame/alertTypes.ts` in Noti-v3; the server's `sdkDrift` test diffs everything below this
5
+ * header against it.
6
+ *
7
+ * Deliberately has NO imports, like `multiDestination.ts`: the zod schemas and the SDK mirror pull from here. The
8
+ * client's copy (`src/other/inGameAlerts.ts`) is diffed against this file by `sdkDrift`.
9
+ *
10
+ * What each platform's send paths really emit. YouTube has no offline, ever (`src/modules/manager/CLAUDE.md`); its
11
+ * `replay` is the "stream replay is up" post. Whatnot is not here: its creators cannot be saved (G3c). Clips,
12
+ * clip forwarding, drops and VODs are not in v1 - no creator-row producer.
13
+ */
14
+ export declare const IN_GAME_TYPES: {
15
+ readonly kick: readonly ["live", "offline"];
16
+ readonly twitch: readonly ["live", "offline"];
17
+ readonly rumble: readonly ["live", "offline", "video"];
18
+ readonly tiktok: readonly ["live", "offline", "video"];
19
+ readonly youtube: readonly ["live", "video", "replay"];
20
+ readonly twitter: readonly ["live", "offline", "post"];
21
+ readonly club: readonly ["post"];
22
+ };
23
+ export type InGamePlatform = keyof typeof IN_GAME_TYPES;
24
+ export type InGameAlertType = (typeof IN_GAME_TYPES)[InGamePlatform][number];
25
+ /** A creator may pick at most this many connected servers to show on (plan max is 10). */
26
+ export declare const MAX_IN_GAME_SERVER_PICKS = 10;
27
+ /** What the cluster needs to fan one notification out: which connected servers. Empty = every active one. */
28
+ export type InGameTarget = {
29
+ serverIds: string[];
30
+ };
31
+ /**
32
+ * The creator columns, as the manager reads them. REQUIRED, not optional: a manager query that forgot to select them
33
+ * must be a type error, not a creator who silently never shows in Minecraft.
34
+ */
35
+ export type InGameColumns = {
36
+ inGame: boolean;
37
+ inGameTypes: string[];
38
+ inGameServerIds: string[];
39
+ };
40
+ /** The stored type list for a platform: only types it has, no repeats. Empty means every type it has. */
41
+ export declare function normalizeInGameTypes(platform: string, input: unknown): InGameAlertType[];
42
+ /** The stored server picks: ids only, no repeats, capped. */
43
+ export declare function normalizeInGameServerIds(input: unknown): string[];
44
+ /**
45
+ * The ONE decision for whether a notification may go in-game (P3 `shouldFanOut`), made on the manager when the
46
+ * payload is built. Null means "not in-game": a setup test, the switch off, or a type this creator did not pick.
47
+ *
48
+ * `isTest`: a live, upload or post dispatched to a single guild is always a setup test (`functions.ts`, the /test
49
+ * dispatch). A single-guild OFFLINE is a held offline being delivered - real - so offline callers pass false.
50
+ */
51
+ export declare function inGameTarget(platform: string, type: InGameAlertType, row: InGameColumns, isTest: boolean): InGameTarget | null;
52
+ /** The creator fields only an `inGame`-enabled user may send. The creator routes 403 a body that names any of them. */
53
+ export declare const IN_GAME_CREATOR_FIELDS: readonly ["inGame", "inGameTypes", "inGameServerIds"];
54
+ export declare const bodyTouchesInGame: (body: unknown) => boolean;
55
+ /**
56
+ * One alert as it is sent to a game server (`event.payload`). Codes and raw values, never prose: the plugin words
57
+ * and formats everything (TRACKER G5). Untrusted text (titles, names) is inserted by the plugin as UNPARSED text, so a
58
+ * title cannot inject markup or commands (R8).
59
+ *
60
+ * Never carries a ping role, the random message or a Discord member - those are Discord's.
61
+ */
62
+ export type InGameAlert = {
63
+ platform: InGamePlatform;
64
+ type: InGameAlertType;
65
+ /** The creator's name as the platform shows it (not Discord-escaped). */
66
+ streamerName: string;
67
+ /** Stream title, video title, or the post's text. */
68
+ title: string | null;
69
+ /** Where a click should go: the stream, the video, the post. */
70
+ url: string | null;
71
+ /** May be empty: Kick often has no thumbnail at go-live. */
72
+ thumbnail: string | null;
73
+ category?: string | null;
74
+ viewers?: number | null;
75
+ followers?: number | null;
76
+ /** Offline: how long the stream ran, in ms. */
77
+ durationMs?: number | null;
78
+ totalViews?: number | null;
79
+ /** Offline: the stream's VOD when the platform gives one. */
80
+ vodUrl?: string | null;
81
+ /** Live/offline pairing for replay: the platform's id for this stream when there is one. */
82
+ streamId?: string | null;
83
+ };
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bodyTouchesInGame = exports.IN_GAME_CREATOR_FIELDS = exports.MAX_IN_GAME_SERVER_PICKS = exports.IN_GAME_TYPES = void 0;
4
+ exports.normalizeInGameTypes = normalizeInGameTypes;
5
+ exports.normalizeInGameServerIds = normalizeInGameServerIds;
6
+ exports.inGameTarget = inGameTarget;
7
+ /**
8
+ * Which notifications can show in Minecraft, per platform (phases/in-game/ P3, TRACKER G3/G3c/G3d).
9
+ *
10
+ * Mirrors `src/modules/inGame/alertTypes.ts` in Noti-v3; the server's `sdkDrift` test diffs everything below this
11
+ * header against it.
12
+ *
13
+ * Deliberately has NO imports, like `multiDestination.ts`: the zod schemas and the SDK mirror pull from here. The
14
+ * client's copy (`src/other/inGameAlerts.ts`) is diffed against this file by `sdkDrift`.
15
+ *
16
+ * What each platform's send paths really emit. YouTube has no offline, ever (`src/modules/manager/CLAUDE.md`); its
17
+ * `replay` is the "stream replay is up" post. Whatnot is not here: its creators cannot be saved (G3c). Clips,
18
+ * clip forwarding, drops and VODs are not in v1 - no creator-row producer.
19
+ */
20
+ exports.IN_GAME_TYPES = {
21
+ kick: ['live', 'offline'],
22
+ twitch: ['live', 'offline'],
23
+ rumble: ['live', 'offline', 'video'],
24
+ tiktok: ['live', 'offline', 'video'],
25
+ youtube: ['live', 'video', 'replay'],
26
+ twitter: ['live', 'offline', 'post'],
27
+ club: ['post'],
28
+ };
29
+ /** A creator may pick at most this many connected servers to show on (plan max is 10). */
30
+ exports.MAX_IN_GAME_SERVER_PICKS = 10;
31
+ const isPlatform = (p) => Object.prototype.hasOwnProperty.call(exports.IN_GAME_TYPES, p);
32
+ /** The stored type list for a platform: only types it has, no repeats. Empty means every type it has. */
33
+ function normalizeInGameTypes(platform, input) {
34
+ if (!isPlatform(platform) || !Array.isArray(input))
35
+ return [];
36
+ const allowed = exports.IN_GAME_TYPES[platform];
37
+ return [...new Set(input.filter((t) => typeof t === 'string' && allowed.includes(t)))];
38
+ }
39
+ /** The stored server picks: ids only, no repeats, capped. */
40
+ function normalizeInGameServerIds(input) {
41
+ if (!Array.isArray(input))
42
+ return [];
43
+ return [...new Set(input.filter((id) => typeof id === 'string' && /^[0-9a-f-]{36}$/i.test(id)))].slice(0, exports.MAX_IN_GAME_SERVER_PICKS);
44
+ }
45
+ /**
46
+ * The ONE decision for whether a notification may go in-game (P3 `shouldFanOut`), made on the manager when the
47
+ * payload is built. Null means "not in-game": a setup test, the switch off, or a type this creator did not pick.
48
+ *
49
+ * `isTest`: a live, upload or post dispatched to a single guild is always a setup test (`functions.ts`, the /test
50
+ * dispatch). A single-guild OFFLINE is a held offline being delivered - real - so offline callers pass false.
51
+ */
52
+ function inGameTarget(platform, type, row, isTest) {
53
+ if (isTest || !row.inGame || !isPlatform(platform))
54
+ return null;
55
+ if (!exports.IN_GAME_TYPES[platform].includes(type))
56
+ return null;
57
+ const types = normalizeInGameTypes(platform, row.inGameTypes);
58
+ if (types.length && !types.includes(type))
59
+ return null;
60
+ return { serverIds: normalizeInGameServerIds(row.inGameServerIds) };
61
+ }
62
+ /** The creator fields only an `inGame`-enabled user may send. The creator routes 403 a body that names any of them. */
63
+ exports.IN_GAME_CREATOR_FIELDS = ['inGame', 'inGameTypes', 'inGameServerIds'];
64
+ const bodyTouchesInGame = (body) => !!body && typeof body === 'object' && exports.IN_GAME_CREATOR_FIELDS.some((key) => key in body);
65
+ exports.bodyTouchesInGame = bodyTouchesInGame;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The MiniMessage a dashboard user may write for Minecraft (Noti in-game P5): colours, formatting, hover text and
3
+ * http(s) links only. `forbiddenMiniMessageTag(text)` names the first tag the API would refuse, or returns null.
4
+ *
5
+ * Mirrors `src/modules/inGame/miniMessage.ts` in Noti-v3; the server's `sdkDrift` test diffs everything below this
6
+ * header against it.
7
+ */
8
+ export declare const NAMED_COLOURS: readonly ["black", "dark_blue", "dark_green", "dark_aqua", "dark_red", "dark_purple", "gold", "gray", "grey", "dark_gray", "dark_grey", "blue", "green", "aqua", "red", "light_purple", "yellow", "white"];
9
+ /** Escape text so MiniMessage shows it as written: a backslash before every tag opener (and before backslashes). */
10
+ export declare const escapeMiniMessage: (text: string) => string;
11
+ /** An http(s) URL safe inside `<click:open_url:'...'>`, or null. Same rule as the plugin's `safeUrl`. */
12
+ export declare function safeMiniMessageUrl(url: string | null | undefined): string | null;
13
+ /** The first tag a dashboard user may not use, as they wrote it, or null when the text is fine. */
14
+ export declare const forbiddenMiniMessageTag: (text: string) => string | null;
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.forbiddenMiniMessageTag = exports.escapeMiniMessage = exports.NAMED_COLOURS = void 0;
4
+ exports.safeMiniMessageUrl = safeMiniMessageUrl;
5
+ /**
6
+ * The MiniMessage a dashboard user may write for Minecraft (Noti in-game P5): colours, formatting, hover text and
7
+ * http(s) links only. `forbiddenMiniMessageTag(text)` names the first tag the API would refuse, or returns null.
8
+ *
9
+ * Mirrors `src/modules/inGame/miniMessage.ts` in Noti-v3; the server's `sdkDrift` test diffs everything below this
10
+ * header against it.
11
+ */
12
+ exports.NAMED_COLOURS = [
13
+ 'black', 'dark_blue', 'dark_green', 'dark_aqua', 'dark_red', 'dark_purple', 'gold', 'gray', 'grey', 'dark_gray', 'dark_grey',
14
+ 'blue', 'green', 'aqua', 'red', 'light_purple', 'yellow', 'white',
15
+ ];
16
+ const DECORATIONS = ['bold', 'b', 'italic', 'i', 'em', 'underlined', 'u', 'strikethrough', 'st', 'obfuscated', 'obf'];
17
+ const SIMPLE = new Set([...exports.NAMED_COLOURS, ...DECORATIONS, 'reset', 'newline', 'br', 'rainbow', 'gradient', 'color', 'colour', 'c']);
18
+ const HEX = /^#[0-9a-f]{6}$/i;
19
+ /** Escape text so MiniMessage shows it as written: a backslash before every tag opener (and before backslashes). */
20
+ const escapeMiniMessage = (text) => text.replace(/§./g, '').replace(/\\/g, '\\\\').replace(/</g, '\\<');
21
+ exports.escapeMiniMessage = escapeMiniMessage;
22
+ /** An http(s) URL safe inside `<click:open_url:'...'>`, or null. Same rule as the plugin's `safeUrl`. */
23
+ function safeMiniMessageUrl(url) {
24
+ const u = (url ?? '').trim();
25
+ if (!/^https?:\/\/\S+$/i.test(u))
26
+ return null;
27
+ return u.replace(/\\/g, '%5C').replace(/'/g, '%27').replace(/"/g, '%22').replace(/</g, '%3C').replace(/>/g, '%3E');
28
+ }
29
+ /** Split a tag body on `:`, keeping quoted arguments ('...' or "...") whole and unquoted. */
30
+ function splitArgs(body) {
31
+ const out = [];
32
+ let cur = '';
33
+ let quote = null;
34
+ for (let i = 0; i < body.length; i++) {
35
+ const ch = body[i];
36
+ if (quote) {
37
+ if (ch === '\\' && i + 1 < body.length) {
38
+ cur += body[++i];
39
+ continue;
40
+ }
41
+ if (ch === quote) {
42
+ quote = null;
43
+ continue;
44
+ }
45
+ cur += ch;
46
+ }
47
+ else if (ch === '\'' || ch === '"') {
48
+ quote = ch;
49
+ }
50
+ else if (ch === ':') {
51
+ out.push(cur);
52
+ cur = '';
53
+ }
54
+ else {
55
+ cur += ch;
56
+ }
57
+ }
58
+ out.push(cur);
59
+ return out;
60
+ }
61
+ /** The index of the `>` closing the tag that opens at `start`, honouring quotes; -1 when it never closes. */
62
+ function tagEnd(text, start) {
63
+ let quote = null;
64
+ for (let i = start + 1; i < text.length; i++) {
65
+ const ch = text[i];
66
+ if (quote) {
67
+ if (ch === '\\') {
68
+ i++;
69
+ continue;
70
+ }
71
+ if (ch === quote)
72
+ quote = null;
73
+ }
74
+ else if (ch === '\'' || ch === '"') {
75
+ quote = ch;
76
+ }
77
+ else if (ch === '<') {
78
+ return -1; // a second opener first: the first `<` is plain text to MiniMessage
79
+ }
80
+ else if (ch === '>') {
81
+ return i;
82
+ }
83
+ }
84
+ return -1;
85
+ }
86
+ /** Why one tag is not allowed, or null when it is. */
87
+ function checkTag(body, depth) {
88
+ const closing = body.startsWith('/');
89
+ const args = splitArgs(closing ? body.slice(1) : body);
90
+ const rawName = (args[0] ?? '').trim().toLowerCase();
91
+ const name = rawName.startsWith('!') ? rawName.slice(1) : rawName;
92
+ if (closing)
93
+ return name === '' || SIMPLE.has(name) || HEX.test(name) || name === 'hover' || name === 'click' ? null : `<${body}>`;
94
+ if (HEX.test(name))
95
+ return null;
96
+ if (rawName.startsWith('!'))
97
+ return DECORATIONS.includes(name) ? null : `<${body}>`;
98
+ if (SIMPLE.has(name))
99
+ return null;
100
+ if (name === 'click') {
101
+ if ((args[1] ?? '').toLowerCase() !== 'open_url')
102
+ return `<${body}> (only open_url links)`;
103
+ return safeMiniMessageUrl(args.slice(2).join(':')) ? null : `<${body}> (links must start with http:// or https://)`;
104
+ }
105
+ if (name === 'hover') {
106
+ if ((args[1] ?? '').toLowerCase() !== 'show_text')
107
+ return `<${body}> (only show_text)`;
108
+ if (depth > 3)
109
+ return `<${body}> (nested too deep)`;
110
+ return firstForbiddenTag(args.slice(2).join(':'), depth + 1);
111
+ }
112
+ return `<${body}>`;
113
+ }
114
+ function firstForbiddenTag(text, depth) {
115
+ for (let i = 0; i < text.length; i++) {
116
+ const ch = text[i];
117
+ if (ch === '\\') {
118
+ i++;
119
+ continue;
120
+ }
121
+ if (ch !== '<')
122
+ continue;
123
+ const end = tagEnd(text, i);
124
+ if (end < 0)
125
+ continue;
126
+ const problem = checkTag(text.slice(i + 1, end), depth);
127
+ if (problem)
128
+ return problem;
129
+ i = end;
130
+ }
131
+ return null;
132
+ }
133
+ /** The first tag a dashboard user may not use, as they wrote it, or null when the text is fine. */
134
+ const forbiddenMiniMessageTag = (text) => firstForbiddenTag(text, 0);
135
+ exports.forbiddenMiniMessageTag = forbiddenMiniMessageTag;
@@ -23,6 +23,8 @@ export type GuildPlanType = {
23
23
  defaultAutoRoles: number | null;
24
24
  /** Scheduled messages a server may keep (switched-off one-time messages count). Checked on create. */
25
25
  defaultScheduledMessages: number | null;
26
+ /** Minecraft: connected game servers kept active; the rest are paused (pinned + oldest stay). */
27
+ defaultInGameServers: number | null;
26
28
  defaultStatusRoles: number | null;
27
29
  defaultStreamRoles: number | null;
28
30
  maxOfflineGraceMinutes: number | null;
@@ -17,6 +17,11 @@ export declare const ClubStreamerZod: {
17
17
  post: "post";
18
18
  }>>;
19
19
  }, z.core.$strip>>>;
20
+ inGame: z.ZodBoolean;
21
+ inGameTypes: z.ZodArray<z.ZodEnum<{
22
+ post: "post";
23
+ }>>;
24
+ inGameServerIds: z.ZodArray<z.ZodString>;
20
25
  customMessages: z.ZodArray<z.ZodLazy<z.ZodObject<{
21
26
  content: z.ZodNullable<z.ZodString>;
22
27
  showInviteButton: z.ZodNullable<z.ZodBoolean>;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ClubStreamerZodPartial = exports.ClubStreamerZod = void 0;
4
4
  const schema_zod_1 = require("./schema.zod");
5
5
  const multiDestination_1 = require("../multiDestination");
6
+ const inGameAlerts_1 = require("../inGameAlerts");
6
7
  const zod_1 = require("./zod");
7
8
  const zod_2 = require("zod");
8
9
  const ClubStreamerSchema = zod_2.z.object({
@@ -12,6 +13,12 @@ const ClubStreamerSchema = zod_2.z.object({
12
13
  autoPublishIfAnnouncmentChannel: zod_2.z.boolean().nullable(),
13
14
  /** Premium Plus (`MultiDestination`): up to 2 extra channels, each with its own ping role and post types. */
14
15
  extraDestinations: zod_1.CentralZod.ExtraDestinations(multiDestination_1.DESTINATION_TYPES.club).nullable(),
16
+ /** Minecraft (`inGame` launch flag): show this creator's notifications on connected game servers. Off by default. */
17
+ inGame: zod_2.z.boolean(),
18
+ /** Which notifications show in Minecraft; empty = every type in `IN_GAME_TYPES.club`. */
19
+ inGameTypes: (0, zod_1.NoDuplicate)(zod_2.z.array(zod_2.z.enum(inGameAlerts_1.IN_GAME_TYPES.club))),
20
+ /** Which connected servers (InGameServer.id); empty = every active one. Max 10. */
21
+ inGameServerIds: (0, zod_1.NoDuplicate)(zod_2.z.array(zod_2.z.string().uuid())).max(inGameAlerts_1.MAX_IN_GAME_SERVER_PICKS),
15
22
  customMessages: (0, zod_1.NoDuplicate)(zod_2.z.array(zod_2.z.lazy(() => CSCustomMessageSchema)), ['type']),
16
23
  notificationChannelId: zod_1.SnowFlake.nullable(),
17
24
  showNotifyButton: zod_2.z.boolean().nullable(),
@@ -50,6 +50,7 @@ export declare const GuildGiveawayZod: {
50
50
  messageCount: z.ZodNullable<z.ZodNumber>;
51
51
  roles: z.ZodArray<z.ZodString>;
52
52
  minAccountAgeDays: z.ZodNullable<z.ZodNumber>;
53
+ minecraftLinked: z.ZodNullable<z.ZodBoolean>;
53
54
  }, z.core.$strip>>>>;
54
55
  bypassRequirementsRoles: z.ZodOptional<z.ZodArray<z.ZodString>>;
55
56
  claimWindowMinutes: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodLiteral<number>, z.ZodLiteral<number>, ...z.ZodLiteral<number>[]]>>>;
@@ -60,6 +61,13 @@ export declare const GuildGiveawayZod: {
60
61
  winnerRoleRemoveAfterDays: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
61
62
  dmWinners: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
62
63
  publicListing: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
64
+ inGameMode: z.ZodOptional<z.ZodEnum<{
65
+ off: "off";
66
+ announce: "announce";
67
+ enter: "enter";
68
+ }>>;
69
+ inGameRewardPreset: z.ZodOptional<z.ZodNullable<z.ZodString>>;
70
+ inGameRewardServerId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
63
71
  }, z.core.$strip>;
64
72
  readonly GuildGiveawaySchema: z.ZodObject<{
65
73
  giveawayId: z.ZodString;
@@ -106,6 +114,7 @@ export declare const GuildGiveawayZod: {
106
114
  messageCount: z.ZodNullable<z.ZodNumber>;
107
115
  roles: z.ZodArray<z.ZodString>;
108
116
  minAccountAgeDays: z.ZodNullable<z.ZodNumber>;
117
+ minecraftLinked: z.ZodNullable<z.ZodBoolean>;
109
118
  }, z.core.$strip>>>;
110
119
  bypassRequirementsRoles: z.ZodArray<z.ZodString>;
111
120
  claimWindowMinutes: z.ZodNullable<z.ZodUnion<[z.ZodLiteral<number>, z.ZodLiteral<number>, ...z.ZodLiteral<number>[]]>>;
@@ -116,6 +125,13 @@ export declare const GuildGiveawayZod: {
116
125
  winnerRoleRemoveAfterDays: z.ZodNullable<z.ZodNumber>;
117
126
  dmWinners: z.ZodNullable<z.ZodBoolean>;
118
127
  publicListing: z.ZodNullable<z.ZodBoolean>;
128
+ inGameMode: z.ZodEnum<{
129
+ off: "off";
130
+ announce: "announce";
131
+ enter: "enter";
132
+ }>;
133
+ inGameRewardPreset: z.ZodNullable<z.ZodString>;
134
+ inGameRewardServerId: z.ZodNullable<z.ZodString>;
119
135
  }, z.core.$strip>;
120
136
  readonly GuildGiveawayFilterSchema: z.ZodObject<{
121
137
  roleMode: z.ZodEnum<{
@@ -135,6 +151,7 @@ export declare const GuildGiveawayZod: {
135
151
  messageCount: z.ZodNullable<z.ZodNumber>;
136
152
  roles: z.ZodArray<z.ZodString>;
137
153
  minAccountAgeDays: z.ZodNullable<z.ZodNumber>;
154
+ minecraftLinked: z.ZodNullable<z.ZodBoolean>;
138
155
  }, z.core.$strip>;
139
156
  };
140
157
  export declare const GuildGiveawayZodPartial: PartialZodObject<typeof GuildGiveawayZod>;
@@ -39,6 +39,12 @@ const mainSchemaFields = {
39
39
  dmWinners: zod_2.z.boolean().nullable(),
40
40
  // Public giveaways page: null follows the server, true/false overrides it.
41
41
  publicListing: zod_2.z.boolean().nullable(),
42
+ // Minecraft (in-game P7). The `inGame` flag gates setting them; a preset also needs InGameRewards.
43
+ inGameMode: schema_zod_1.GiveawayInGameModeEnum,
44
+ // A preset name from a connected server's rewards.yml.
45
+ inGameRewardPreset: zod_2.z.string().max(32).regex(/^[a-z0-9_-]+$/, 'A reward preset name is lowercase letters, digits, _ and -.').nullable(),
46
+ // Which connected server pays; null = the guild's only one.
47
+ inGameRewardServerId: zod_2.z.string().uuid().nullable(),
42
48
  };
43
49
  const GuildGiveawaySchema = zod_2.z.object({
44
50
  ...mainSchemaFields,
@@ -73,6 +79,8 @@ const GuildGiveawayRequirementsSchema = zod_2.z.object({
73
79
  messageCount: zod_2.z.number().min(1).nullable(),
74
80
  roles: (0, zod_1.NoDuplicate)(zod_2.z.array(zod_1.SnowFlake)),
75
81
  minAccountAgeDays: zod_2.z.number().int().min(1).max(giveawayClaims_1.GIVEAWAY_MIN_ACCOUNT_AGE_MAX_DAYS).nullable(),
82
+ // The entrant linked a Minecraft account in this server (in-game P7).
83
+ minecraftLinked: zod_2.z.boolean().nullable(),
76
84
  });
77
85
  exports.GuildGiveawayZod = {
78
86
  GuildGiveawayCreateSchema,
@@ -21,6 +21,12 @@ export declare const KickStreamerZod: {
21
21
  live: "live";
22
22
  }>>;
23
23
  }, z.core.$strip>>>;
24
+ inGame: z.ZodBoolean;
25
+ inGameTypes: z.ZodArray<z.ZodEnum<{
26
+ live: "live";
27
+ offline: "offline";
28
+ }>>;
29
+ inGameServerIds: z.ZodArray<z.ZodString>;
24
30
  customMessages: z.ZodArray<z.ZodLazy<z.ZodObject<{
25
31
  content: z.ZodNullable<z.ZodString>;
26
32
  showInviteButton: z.ZodNullable<z.ZodBoolean>;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.KickStreamerZodPartial = exports.KickStreamerZod = void 0;
4
4
  const schema_zod_1 = require("./schema.zod");
5
5
  const multiDestination_1 = require("../multiDestination");
6
+ const inGameAlerts_1 = require("../inGameAlerts");
6
7
  const zod_1 = require("./zod");
7
8
  const offlineGrace_1 = require("../offlineGrace");
8
9
  const zod_2 = require("zod");
@@ -17,6 +18,12 @@ const KickStreamerSchema = zod_2.z.object({
17
18
  autoPublishIfAnnouncmentChannel: zod_2.z.boolean().nullable(),
18
19
  /** Premium Plus (`MultiDestination`): up to 2 extra channels, each with its own ping role and post types. */
19
20
  extraDestinations: zod_1.CentralZod.ExtraDestinations(multiDestination_1.DESTINATION_TYPES.kick).nullable(),
21
+ /** Minecraft (`inGame` launch flag): show this creator's notifications on connected game servers. Off by default. */
22
+ inGame: zod_2.z.boolean(),
23
+ /** Which notifications show in Minecraft; empty = every type in `IN_GAME_TYPES.kick`. */
24
+ inGameTypes: (0, zod_1.NoDuplicate)(zod_2.z.array(zod_2.z.enum(inGameAlerts_1.IN_GAME_TYPES.kick))),
25
+ /** Which connected servers (InGameServer.id); empty = every active one. Max 10. */
26
+ inGameServerIds: (0, zod_1.NoDuplicate)(zod_2.z.array(zod_2.z.string().uuid())).max(inGameAlerts_1.MAX_IN_GAME_SERVER_PICKS),
20
27
  customMessages: (0, zod_1.NoDuplicate)(zod_2.z.array(zod_2.z.lazy(() => KSCustomMessageSchema)), ['type']),
21
28
  clipEnabled: zod_2.z.boolean().nullable(),
22
29
  clipChannelId: zod_1.SnowFlake.nullable(),
@@ -25,6 +25,13 @@ export declare const RumbleStreamerZod: {
25
25
  video: "video";
26
26
  }>>;
27
27
  }, z.core.$strip>>>;
28
+ inGame: z.ZodBoolean;
29
+ inGameTypes: z.ZodArray<z.ZodEnum<{
30
+ live: "live";
31
+ video: "video";
32
+ offline: "offline";
33
+ }>>;
34
+ inGameServerIds: z.ZodArray<z.ZodString>;
28
35
  customMessages: z.ZodArray<z.ZodLazy<z.ZodObject<{
29
36
  content: z.ZodNullable<z.ZodString>;
30
37
  showInviteButton: z.ZodNullable<z.ZodBoolean>;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RumbleStreamerZodPartial = exports.RumbleStreamerZod = void 0;
4
4
  const schema_zod_1 = require("./schema.zod");
5
5
  const multiDestination_1 = require("../multiDestination");
6
+ const inGameAlerts_1 = require("../inGameAlerts");
6
7
  const zod_1 = require("./zod");
7
8
  const offlineGrace_1 = require("../offlineGrace");
8
9
  const zod_2 = require("zod");
@@ -22,6 +23,12 @@ const RumbleStreamerSchema = zod_2.z.object({
22
23
  updateLivePost: zod_2.z.boolean().nullable(),
23
24
  /** Premium Plus (`MultiDestination`): up to 2 extra channels, each with its own ping role and post types. */
24
25
  extraDestinations: zod_1.CentralZod.ExtraDestinations(multiDestination_1.DESTINATION_TYPES.rumble).nullable(),
26
+ /** Minecraft (`inGame` launch flag): show this creator's notifications on connected game servers. Off by default. */
27
+ inGame: zod_2.z.boolean(),
28
+ /** Which notifications show in Minecraft; empty = every type in `IN_GAME_TYPES.rumble`. */
29
+ inGameTypes: (0, zod_1.NoDuplicate)(zod_2.z.array(zod_2.z.enum(inGameAlerts_1.IN_GAME_TYPES.rumble))),
30
+ /** Which connected servers (InGameServer.id); empty = every active one. Max 10. */
31
+ inGameServerIds: (0, zod_1.NoDuplicate)(zod_2.z.array(zod_2.z.string().uuid())).max(inGameAlerts_1.MAX_IN_GAME_SERVER_PICKS),
25
32
  customMessages: (0, zod_1.NoDuplicate)(zod_2.z.array(zod_2.z.lazy(() => RSCustomMessageSchema)), ['type']),
26
33
  notificationChannelId: zod_1.SnowFlake.nullable(),
27
34
  videoNotificationChannelId: zod_1.SnowFlake.nullable(),
@@ -12,9 +12,12 @@ export declare const ScheduledMessageZod: {
12
12
  readonly GuildScheduledMessageSchema: z.ZodObject<{
13
13
  messageId: z.ZodString;
14
14
  guildId: z.ZodString;
15
- channelId: z.ZodString;
15
+ channelId: z.ZodNullable<z.ZodString>;
16
16
  creatorId: z.ZodString;
17
17
  content: z.ZodString;
18
+ sendToDiscord: z.ZodBoolean;
19
+ sendToInGame: z.ZodBoolean;
20
+ minecraftContent: z.ZodNullable<z.ZodString>;
18
21
  trigger: z.ZodEnum<{
19
22
  time: "time";
20
23
  stage: "stage";
@@ -42,7 +45,10 @@ export declare const ScheduledMessageZod: {
42
45
  createdAt: z.ZodDate;
43
46
  }, z.core.$strip>;
44
47
  readonly ScheduledMessageCreateSchema: z.ZodObject<{
45
- channelId: z.ZodString;
48
+ channelId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
49
+ sendToDiscord: z.ZodDefault<z.ZodBoolean>;
50
+ sendToInGame: z.ZodDefault<z.ZodBoolean>;
51
+ minecraftContent: z.ZodPipe<z.ZodDefault<z.ZodNullable<z.ZodString>>, z.ZodTransform<string | null, string | null>>;
46
52
  content: z.ZodDefault<z.ZodString>;
47
53
  embed: z.ZodPipe<z.ZodDefault<z.ZodNullable<z.ZodObject<{
48
54
  title: z.ZodDefault<z.ZodNullable<z.ZodString>>;
@@ -126,6 +132,8 @@ export declare const ScheduledMessageZod: {
126
132
  }, z.core.$strip>;
127
133
  readonly ScheduledMessageEditSchema: z.ZodObject<{
128
134
  content: z.ZodOptional<z.ZodString>;
135
+ sendToInGame: z.ZodOptional<z.ZodBoolean>;
136
+ minecraftContent: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string | null | undefined, string | null | undefined>>;
129
137
  embed: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodObject<{
130
138
  title: z.ZodDefault<z.ZodNullable<z.ZodString>>;
131
139
  url: z.ZodDefault<z.ZodNullable<z.ZodString>>;