@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.
- package/dist/classes/@me.d.ts +45 -0
- package/dist/classes/@me.js +25 -0
- package/dist/classes/guildInGame.d.ts +259 -0
- package/dist/classes/guildInGame.js +114 -0
- package/dist/classes/guildInfluencerPanel.d.ts +13 -0
- package/dist/classes/guildMessageScheduler.d.ts +15 -1
- package/dist/classes/publicGiveaways.d.ts +1 -1
- package/dist/classes/publicGiveaways.js +1 -1
- package/dist/core/manager.d.ts +2 -0
- package/dist/core/manager.js +2 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +12 -1
- package/dist/other/bitfields.d.ts +7 -4
- package/dist/other/bitfields.js +3 -0
- package/dist/other/features.d.ts +1 -1
- package/dist/other/features.js +1 -0
- package/dist/other/inGameAlerts.d.ts +83 -0
- package/dist/other/inGameAlerts.js +65 -0
- package/dist/other/inGameMiniMessage.d.ts +14 -0
- package/dist/other/inGameMiniMessage.js +135 -0
- package/dist/other/types.d.ts +2 -0
- package/dist/other/zod/clubStreamer.zod.d.ts +5 -0
- package/dist/other/zod/clubStreamer.zod.js +7 -0
- package/dist/other/zod/giveaways.zod.d.ts +17 -0
- package/dist/other/zod/giveaways.zod.js +8 -0
- package/dist/other/zod/kickStreamer.zod.d.ts +6 -0
- package/dist/other/zod/kickStreamer.zod.js +7 -0
- package/dist/other/zod/rumbleStreamer.zod.d.ts +7 -0
- package/dist/other/zod/rumbleStreamer.zod.js +7 -0
- package/dist/other/zod/scheduledMessage.zod.d.ts +10 -2
- package/dist/other/zod/scheduledMessage.zod.js +29 -5
- package/dist/other/zod/schema.zod.d.ts +6 -0
- package/dist/other/zod/schema.zod.js +7 -1
- package/dist/other/zod/tiktokStreamer.zod.d.ts +7 -0
- package/dist/other/zod/tiktokStreamer.zod.js +7 -0
- package/dist/other/zod/twitchStreamer.zod.d.ts +6 -0
- package/dist/other/zod/twitchStreamer.zod.js +7 -0
- package/dist/other/zod/twitterStreamer.zod.d.ts +7 -0
- package/dist/other/zod/twitterStreamer.zod.js +7 -0
- package/dist/other/zod/youtubeStreamer.zod.d.ts +7 -0
- package/dist/other/zod/youtubeStreamer.zod.js +7 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/prisma/generated/ts-prisma.d.ts +129 -0
- package/prisma/schema/models/clubStreamer.prisma +5 -0
- package/prisma/schema/models/giveaways.prisma +9 -0
- package/prisma/schema/models/inGame.prisma +77 -0
- package/prisma/schema/models/kickStreamer.prisma +5 -0
- package/prisma/schema/models/rumbleStreamer.prisma +5 -0
- package/prisma/schema/models/scheduledMessage.prisma +10 -1
- package/prisma/schema/models/tiktokStreamer.prisma +5 -0
- package/prisma/schema/models/twitchStreamer.prisma +5 -0
- package/prisma/schema/models/twitterStreamer.prisma +5 -0
- package/prisma/schema/models/youtubeStreamer.prisma +5 -0
- 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<"
|
|
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<"
|
|
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<"
|
|
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<"
|
|
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
|
}
|
package/dist/other/bitfields.js
CHANGED
|
@@ -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,
|
package/dist/other/features.d.ts
CHANGED
|
@@ -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';
|
package/dist/other/features.js
CHANGED
|
@@ -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;
|
package/dist/other/types.d.ts
CHANGED
|
@@ -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>>;
|