@notidotbot/noti-api-client 1.9.71 → 1.9.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.
@@ -81,6 +81,7 @@ exports.placeholders = {
81
81
  'streamThumbnail': 'https://example.com',
82
82
  'pingRole': '<@&123456789>',
83
83
  'randomMessage': 'Example Message',
84
+ 'member': '<@123456789>',
84
85
  },
85
86
  twitch: {
86
87
  'platform': 'Twitch',
@@ -91,7 +92,9 @@ exports.placeholders = {
91
92
  'streamTitle': 'Example Stream Title',
92
93
  'streamThumbnail': 'https://example.com',
93
94
  'pingRole': '<@&123456789>',
95
+ 'startTime': '<t:1640995200:R>',
94
96
  'randomMessage': 'Example Message',
97
+ 'member': '<@123456789>',
95
98
  },
96
99
  rumble: {
97
100
  'platform': 'Rumble',
@@ -103,7 +106,9 @@ exports.placeholders = {
103
106
  'pingRole': '<@&123456789>',
104
107
  'followers': '239879',
105
108
  'viewers': '239.9K',
109
+ 'startTime': '<t:1640995200:R>',
106
110
  'randomMessage': 'Example Message',
111
+ 'member': '<@123456789>',
107
112
  },
108
113
  tiktok: {
109
114
  'platform': 'TikTok',
@@ -114,7 +119,9 @@ exports.placeholders = {
114
119
  'pingRole': '<@&123456789>',
115
120
  'followers': '239879',
116
121
  'verified': 'Verified / Not Verified',
122
+ 'startTime': '<t:1640995200:R>',
117
123
  'randomMessage': 'Example Message',
124
+ 'member': '<@123456789>',
118
125
  },
119
126
  youtube: {
120
127
  'platform': 'YouTube',
@@ -129,6 +136,7 @@ exports.placeholders = {
129
136
  'views': '239.9K',
130
137
  'saves': '239.9K',
131
138
  'randomMessage': 'Example Message',
139
+ 'member': '<@123456789>',
132
140
  },
133
141
  whatnot: {
134
142
  'platform': 'Whatnot',
@@ -138,7 +146,9 @@ exports.placeholders = {
138
146
  'streamThumbnail': 'https://example.com',
139
147
  'pingRole': '<@&123456789>',
140
148
  'orders': '42',
149
+ 'startTime': '<t:1640995200:R>',
141
150
  'randomMessage': 'Example Message',
151
+ 'member': '<@123456789>',
142
152
  },
143
153
  twitter: {
144
154
  'platform': 'X',
@@ -148,7 +158,9 @@ exports.placeholders = {
148
158
  'streamThumbnail': 'https://example.com',
149
159
  'pingRole': '<@&123456789>',
150
160
  'viewers': '42',
161
+ 'startTime': '<t:1640995200:R>',
151
162
  'randomMessage': 'Example Message',
163
+ 'member': '<@123456789>',
152
164
  },
153
165
  },
154
166
  offline: {
@@ -172,6 +184,9 @@ exports.placeholders = {
172
184
  'streamTitle': 'Example Stream Title',
173
185
  'streamThumbnail': 'https://example.com',
174
186
  'pingRole': '<@&123456789>',
187
+ 'category': 'Example Category',
188
+ // The ended stream's VOD when Twitch matched one, else the channel.
189
+ 'streamUrl': 'https://example.com',
175
190
  'randomMessage': 'Example Message',
176
191
  },
177
192
  rumble: {
@@ -184,6 +199,7 @@ exports.placeholders = {
184
199
  'pingRole': '<@&123456789>',
185
200
  'followers': '239879',
186
201
  'description': 'Example Description',
202
+ 'category': 'Example Category',
187
203
  'randomMessage': 'Example Message',
188
204
  },
189
205
  tiktok: {
@@ -196,6 +212,8 @@ exports.placeholders = {
196
212
  'pingRole': '<@&123456789>',
197
213
  'followers': '239879',
198
214
  'verified': 'Verified / Not Verified',
215
+ 'category': 'Example Category',
216
+ 'description': 'Example Description',
199
217
  'randomMessage': 'Example Message',
200
218
  },
201
219
  whatnot: {
@@ -206,6 +224,7 @@ exports.placeholders = {
206
224
  'duration': '4h 20m',
207
225
  'pingRole': '<@&123456789>',
208
226
  'orders': '42',
227
+ 'streamTitle': 'Example Stream Title',
209
228
  'randomMessage': 'Example Message',
210
229
  },
211
230
  twitter: {
@@ -245,6 +264,7 @@ exports.placeholders = {
245
264
  'comments': '239.9K',
246
265
  'duration': '4h 20m',
247
266
  'randomMessage': 'Example Message',
267
+ 'member': '<@123456789>',
248
268
  },
249
269
  youtube: {
250
270
  'platform': 'YouTube',
@@ -258,7 +278,10 @@ exports.placeholders = {
258
278
  'saves': '239.9K',
259
279
  'comments': '239.9K',
260
280
  'duration': '4h 20m',
281
+ 'title': 'Example Video Title',
282
+ 'uploadDate': '<t:1640995200:R>',
261
283
  'randomMessage': 'Example Message',
284
+ 'member': '<@123456789>',
262
285
  },
263
286
  rumble: {
264
287
  'platform': 'Rumble',
@@ -269,6 +292,7 @@ exports.placeholders = {
269
292
  'thumbnail': 'https://example.com',
270
293
  'uploadDate': '<t:1640995200:R>',
271
294
  'randomMessage': 'Example Message',
295
+ 'member': '<@123456789>',
272
296
  },
273
297
  },
274
298
  post: {
@@ -281,6 +305,7 @@ exports.placeholders = {
281
305
  'thumbnail': 'https://example.com',
282
306
  'publishDate': '<t:1640995200:R>',
283
307
  'randomMessage': 'Example Message',
308
+ 'member': '<@123456789>',
284
309
  },
285
310
  twitter: {
286
311
  'platform': 'X',
@@ -293,6 +318,7 @@ exports.placeholders = {
293
318
  'fxUrl': 'https://fixupx.com/example/status/123',
294
319
  'publishDate': '<t:1640995200:R>',
295
320
  'randomMessage': 'Example Message',
321
+ 'member': '<@123456789>',
296
322
  },
297
323
  },
298
324
  birthday: {
@@ -357,6 +383,165 @@ exports.placeholders = {
357
383
  'userAvatar': 'https://example.com',
358
384
  'guildMemberCount': '123',
359
385
  },
386
+ clipperClip: {
387
+ 'streamerName': 'Example',
388
+ 'clipperName': 'Example',
389
+ 'duration': '4h 20m',
390
+ 'kickBotUrl': 'https://example.com',
391
+ 'downloadUrl': 'https://example.com',
392
+ 'clipThumbnail': 'https://example.com',
393
+ 'pingRole': '<@&123456789>',
394
+ 'streamerUrl': 'https://example.com',
395
+ 'clipperUrl': 'https://example.com',
396
+ },
397
+ clipForward: {
398
+ 'streamerName': 'Example',
399
+ 'clipTitle': 'Example Clip Title',
400
+ 'clipperName': 'Example',
401
+ 'duration': '0m 30s',
402
+ 'views': '239.9K',
403
+ 'category': 'Just Chatting',
404
+ 'clipUrl': 'https://example.com',
405
+ 'clipThumbnail': 'https://example.com',
406
+ 'pingRole': '<@&123456789>',
407
+ 'streamerUrl': 'https://example.com',
408
+ 'clipperUrl': 'https://example.com',
409
+ },
410
+ // The replay of a stream we announced live, once YouTube reports it ended (actualEndTime). YouTube
411
+ // only: the one platform whose replay is a separate, later event. No pingRole on purpose - a replay
412
+ // never pings.
413
+ replay: {
414
+ youtube: {
415
+ 'platform': 'YouTube',
416
+ 'videoUrl': 'https://example.com',
417
+ 'streamerName': 'Example',
418
+ 'streamTitle': 'Example Stream Title',
419
+ 'thumbnail': 'https://example.com',
420
+ 'views': '239.9K',
421
+ 'duration': '4h 20m',
422
+ 'randomMessage': 'Example Message',
423
+ },
424
+ },
425
+ // Claim to win (phases/giveaway-claims/). Not editable in v1 - there is no message-editor surface for it.
426
+ giveawayClaim: {
427
+ 'name': 'Example Giveaway',
428
+ 'pending': '<@123456789>',
429
+ 'status': 'Winners, press **Claim** before <t:1640995200:R> or the prize is rerolled.',
430
+ 'winners': '> ✅ <@123456789>\n> ⏳ <@123456789>',
431
+ 'round': '1',
432
+ },
433
+ giveawayClaimDM: {
434
+ 'claimLink': 'https://discord.com/...',
435
+ 'deadline': '<t:1640995200:R>',
436
+ },
437
+ drops: {
438
+ kick: {
439
+ 'dropName': 'Example Drop',
440
+ 'gameName': 'Example Game',
441
+ 'organizationName': 'Example Organization',
442
+ 'startTime': '<t:1640995200:R>',
443
+ 'endTime': '<t:1640995200:R>',
444
+ 'dropUrl': 'https://example.com',
445
+ 'dropImage': 'https://example.com',
446
+ 'gameImage': 'https://example.com',
447
+ 'pingRole': '<@&123456789>',
448
+ 'status': 'active',
449
+ },
450
+ twitch: {
451
+ 'dropName': 'Example Drop',
452
+ 'gameName': 'Example Game',
453
+ 'organizationName': 'Example Organization',
454
+ 'startTime': '<t:1640995200:R>',
455
+ 'endTime': '<t:1640995200:R>',
456
+ 'dropUrl': 'https://example.com',
457
+ 'dropImage': 'https://example.com',
458
+ 'gameImage': 'https://example.com',
459
+ 'pingRole': '<@&123456789>',
460
+ 'status': 'active',
461
+ },
462
+ },
463
+ liveDrops: {
464
+ kick: {
465
+ 'dropName': 'Example Drop',
466
+ 'gameName': 'Example Game',
467
+ 'gameEmoji': '<:game:1172238670955294790>',
468
+ 'gameImage': 'https://example.com',
469
+ 'startsAt': '<t:1640995200:F>',
470
+ 'endsAt': '<t:1640995200:R>',
471
+ 'streamerName': 'Example',
472
+ 'pingRole': '<@&123456789>',
473
+ 'rewardName': 'Example Reward',
474
+ 'rewardImage': 'https://example.com',
475
+ 'watchtime': '4 Hours',
476
+ 'streamerNames': 'Example, Example2',
477
+ },
478
+ },
479
+ // Mirrors messages.badges key-for-key. Every token a badge template uses is supplied here, and the
480
+ // runtime builder must supply each one (TS1360 if it does not).
481
+ badges: {
482
+ kick: {
483
+ 'pingRole': '<@&123456789>',
484
+ 'rewardName': 'Example Chat Badge',
485
+ 'rewardImage': 'https://example.com',
486
+ 'gameName': 'Example Game',
487
+ 'campaignName': 'Example Campaign',
488
+ 'requirement': '- **Watchtime**: 2 Hours\n',
489
+ 'startsAt': '<t:1640995200:f> (<t:1640995200:R>)',
490
+ 'endsAt': '<t:1643587200:f> (<t:1643587200:R>)',
491
+ 'claimUrl': 'https://example.com',
492
+ // The template's own words, in the server's language (i18n/Main/notifications.json `badges`).
493
+ 'headerText': 'NEW KICK BADGE',
494
+ 'gameLabel': 'Game',
495
+ 'campaignLabel': 'Campaign',
496
+ 'startsLabel': 'Starts',
497
+ 'endsLabel': 'Ends',
498
+ 'getBadgeLabel': 'Get the badge',
499
+ },
500
+ twitch: {
501
+ 'pingRole': '<@&123456789>',
502
+ 'rewardName': 'Example Chat Badge',
503
+ 'rewardImage': 'https://example.com',
504
+ 'gameName': 'Example Game',
505
+ 'campaignName': 'Example Campaign',
506
+ 'requirement': '- **Watchtime**: 2 Hours\n',
507
+ 'startsAt': '<t:1640995200:f> (<t:1640995200:R>)',
508
+ 'endsAt': '<t:1643587200:f> (<t:1643587200:R>)',
509
+ 'claimUrl': 'https://example.com',
510
+ // The template's own words, in the server's language (i18n/Main/notifications.json `badges`).
511
+ 'headerText': 'NEW TWITCH BADGE',
512
+ 'gameLabel': 'Game',
513
+ 'campaignLabel': 'Campaign',
514
+ 'startsLabel': 'Starts',
515
+ 'endsLabel': 'Ends',
516
+ 'getBadgeLabel': 'Get the badge',
517
+ },
518
+ },
519
+ // Mirrors messages.bounties key-for-key. Supplied by src/modules/bounties/render.ts, whose builder
520
+ // `satisfies Placeholders['bounties']['kick']`. `statusLine` is '' while a bounty is open - the renderer
521
+ // drops a field whose value comes out empty.
522
+ bounties: {
523
+ kick: {
524
+ 'pingRole': '<@&123456789>',
525
+ 'bountyName': 'Example Bounty',
526
+ 'bountyUrl': 'https://bounties.kick.com/bounty/1-example',
527
+ 'subheading': 'Clip a streamer doing something great.',
528
+ 'image': 'https://example.com',
529
+ 'endsAt': '<t:1640995200:F> (<t:1640995200:R>)',
530
+ 'prize': '5 x 10,000 KICKs',
531
+ 'gameMode': 'Chance',
532
+ 'playerType': 'Viewer',
533
+ 'statusLine': 'Claimed by [Example](https://kick.com/example)',
534
+ 'postedAt': '2026-09-24T23:46:25.000Z',
535
+ // The template's own words, in the server's language (i18n/Main/notifications.json `bounties`).
536
+ 'headerText': 'KICK BOUNTIES',
537
+ 'endDateLabel': 'End Date',
538
+ 'prizeLabel': 'Prize',
539
+ 'gameModeLabel': 'Game Mode',
540
+ 'playerTypeLabel': 'Player Type',
541
+ 'statusLabel': 'Status',
542
+ 'footerText': 'Noti · Kick Bounties',
543
+ },
544
+ },
360
545
  };
361
546
  exports.randomMessages = {
362
547
  live: [
@@ -494,6 +679,15 @@ exports.statChannels = {
494
679
  'followersFormatted': '239.9K',
495
680
  },
496
681
  },
682
+ // The YouTube subscriber counter's default name. Same tokens as kickFollowers - the count rides in `followers`.
683
+ youtubeSubscribers: {
684
+ name: '{username} • {followersFormatted} Subscribers',
685
+ placeholders: {
686
+ 'username': 'Example',
687
+ 'followers': '239000',
688
+ 'followersFormatted': '239K',
689
+ },
690
+ },
497
691
  };
498
692
  exports.messages = {
499
693
  vod: {
@@ -53,6 +53,7 @@ export declare const GuildZod: {
53
53
  clips: z.ZodNullable<z.ZodBoolean>;
54
54
  vods: z.ZodNullable<z.ZodBoolean>;
55
55
  fixUrl: z.ZodNullable<z.ZodBoolean>;
56
+ roleLogs: z.ZodNullable<z.ZodBoolean>;
56
57
  }, z.core.$strip>>>;
57
58
  birthdayRoleId: z.ZodNullable<z.ZodString>;
58
59
  birthdayChannelId: z.ZodNullable<z.ZodString>;
@@ -185,6 +186,11 @@ export declare const GuildZod: {
185
186
  twitter: "twitter";
186
187
  }>>;
187
188
  applyToStreamers: z.ZodArray<z.ZodString>;
189
+ applyToTypes: z.ZodArray<z.ZodEnum<{
190
+ live: "live";
191
+ video: "video";
192
+ replay: "replay";
193
+ }>>;
188
194
  durationMinutes: z.ZodNullable<z.ZodNumber>;
189
195
  minDurationMinutes: z.ZodNullable<z.ZodNumber>;
190
196
  minFollowers: z.ZodNullable<z.ZodNumber>;
@@ -370,6 +376,7 @@ export declare const GuildZod: {
370
376
  clips: z.ZodNullable<z.ZodBoolean>;
371
377
  vods: z.ZodNullable<z.ZodBoolean>;
372
378
  fixUrl: z.ZodNullable<z.ZodBoolean>;
379
+ roleLogs: z.ZodNullable<z.ZodBoolean>;
373
380
  }, z.core.$strip>;
374
381
  readonly GuildAutoLiveRoleSchema: z.ZodObject<{
375
382
  roleId: z.ZodString;
@@ -425,6 +432,11 @@ export declare const GuildZod: {
425
432
  twitter: "twitter";
426
433
  }>>;
427
434
  applyToStreamers: z.ZodArray<z.ZodString>;
435
+ applyToTypes: z.ZodArray<z.ZodEnum<{
436
+ live: "live";
437
+ video: "video";
438
+ replay: "replay";
439
+ }>>;
428
440
  durationMinutes: z.ZodNullable<z.ZodNumber>;
429
441
  minDurationMinutes: z.ZodNullable<z.ZodNumber>;
430
442
  minFollowers: z.ZodNullable<z.ZodNumber>;
@@ -97,6 +97,7 @@ const GuildDisableBrandingSchema = zod_2.z.object({
97
97
  clips: zod_2.z.boolean().nullable(),
98
98
  vods: zod_2.z.boolean().nullable(),
99
99
  fixUrl: zod_2.z.boolean().nullable(),
100
+ roleLogs: zod_2.z.boolean().nullable(),
100
101
  });
101
102
  const GuildRandomMessageSchema = zod_2.z.object({
102
103
  type: schema_zod_1.GuildMessageTypeEnum,
@@ -186,6 +187,12 @@ const GuildNotificationOverrideSchema = zod_2.z.object({
186
187
  * Best offered as a picker over the guild's tracked streamers, not a free-text box.
187
188
  */
188
189
  applyToStreamers: (0, zod_1.NoDuplicate)(zod_2.z.array(zod_2.z.string())),
190
+ /**
191
+ * Post-type filter: `live`, `video` (an upload) or `replay` (a YouTube stream replay). Empty means every
192
+ * type, so overrides saved before this existed keep applying to everything. Lets an override route,
193
+ * cancel or publish replays without touching uploads.
194
+ */
195
+ applyToTypes: (0, zod_1.NoDuplicate)(zod_2.z.array(schema_zod_1.OverrideTypeEnum)),
189
196
  /** Duration CEILING - matches content shorter than this. */
190
197
  durationMinutes: zod_2.z.number().min(0).nullable(),
191
198
  /** Duration FLOOR - matches content longer than this. Set both for a range. */
@@ -16,6 +16,7 @@ export declare const RumbleStreamerZod: {
16
16
  sendOfflineMessage: z.ZodNullable<z.ZodBoolean>;
17
17
  usePerStreamerEmbeds: z.ZodNullable<z.ZodBoolean>;
18
18
  autoPublishIfAnnouncmentChannel: z.ZodNullable<z.ZodBoolean>;
19
+ updateLivePost: z.ZodNullable<z.ZodBoolean>;
19
20
  customMessages: z.ZodArray<z.ZodLazy<z.ZodObject<{
20
21
  content: z.ZodNullable<z.ZodString>;
21
22
  showInviteButton: z.ZodNullable<z.ZodBoolean>;
@@ -13,6 +13,12 @@ const RumbleStreamerSchema = zod_2.z.object({
13
13
  sendOfflineMessage: zod_2.z.boolean().nullable(),
14
14
  usePerStreamerEmbeds: zod_2.z.boolean().nullable(),
15
15
  autoPublishIfAnnouncmentChannel: zod_2.z.boolean().nullable(),
16
+ /**
17
+ * Premium Plus (`GuildFeatures.LivePostUpdates`, launch flag `livePostUpdates`). `null` = on, `false` = off:
18
+ * edit the live post when the streamer changes their title or category. Without the bit the bot clears
19
+ * this on save and never edits.
20
+ */
21
+ updateLivePost: zod_2.z.boolean().nullable(),
16
22
  customMessages: (0, zod_1.NoDuplicate)(zod_2.z.array(zod_2.z.lazy(() => RSCustomMessageSchema)), ['type']),
17
23
  notificationChannelId: zod_1.SnowFlake.nullable(),
18
24
  videoNotificationChannelId: zod_1.SnowFlake.nullable(),
@@ -89,6 +89,11 @@ export declare const OverridesEnum: z.ZodEnum<{
89
89
  cancel: "cancel";
90
90
  dontPublish: "dontPublish";
91
91
  }>;
92
+ export declare const OverrideTypeEnum: z.ZodEnum<{
93
+ live: "live";
94
+ video: "video";
95
+ replay: "replay";
96
+ }>;
92
97
  export declare const PlatformEnum: z.ZodEnum<{
93
98
  kick: "kick";
94
99
  twitch: "twitch";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ScheduledMessageTriggerEnum = exports.ScheduledMessageRecurrenceEnum = exports.GameRobloxKindEnum = exports.NotificationDeliveryEnum = exports.GameDeliveryEnum = exports.GameFlagEnum = exports.GameKindEnum = exports.GameStoreEnum = exports.UserNotificationSeverityEnum = exports.RoleBonusEnum = exports.MediaShareCommandsEnum = exports.MediaShareTypesEnum = exports.FilterEnum = exports.StreamRoleSourceEnum = exports.QueryInEnum = exports.RumbleTypeEnum = exports.PlatformsWithVideosEnum = exports.UserMediaSharePermissionsEnum = exports.ClipperCategoryEnum = exports.ClipForwardPlatformEnum = exports.PlatformEnum = exports.OverridesEnum = exports.GuildSingleMessageTypeEnum = exports.GuildMessageTypeEnum = exports.StreamerMessageTypeEnum = exports.SingleMessageTypeEnum = exports.LeaderBoardTypesEnum = void 0;
3
+ exports.ScheduledMessageTriggerEnum = exports.ScheduledMessageRecurrenceEnum = exports.GameRobloxKindEnum = exports.NotificationDeliveryEnum = exports.GameDeliveryEnum = exports.GameFlagEnum = exports.GameKindEnum = exports.GameStoreEnum = exports.UserNotificationSeverityEnum = exports.RoleBonusEnum = exports.MediaShareCommandsEnum = exports.MediaShareTypesEnum = exports.FilterEnum = exports.StreamRoleSourceEnum = exports.QueryInEnum = exports.RumbleTypeEnum = exports.PlatformsWithVideosEnum = exports.UserMediaSharePermissionsEnum = exports.ClipperCategoryEnum = exports.ClipForwardPlatformEnum = exports.PlatformEnum = exports.OverrideTypeEnum = exports.OverridesEnum = exports.GuildSingleMessageTypeEnum = exports.GuildMessageTypeEnum = exports.StreamerMessageTypeEnum = exports.SingleMessageTypeEnum = exports.LeaderBoardTypesEnum = void 0;
4
4
  exports.deepPartialify = deepPartialify;
5
5
  const zod_1 = require("zod");
6
6
  function deepPartialify(schema) {
@@ -141,6 +141,11 @@ exports.OverridesEnum = zod_1.z.enum([
141
141
  'cancel',
142
142
  'dontPublish',
143
143
  ]);
144
+ exports.OverrideTypeEnum = zod_1.z.enum([
145
+ 'live',
146
+ 'video',
147
+ 'replay',
148
+ ]);
144
149
  exports.PlatformEnum = zod_1.z.enum([
145
150
  'kick',
146
151
  'twitch',
@@ -14,6 +14,7 @@ export declare const TwitchStreamerZod: {
14
14
  sendOfflineMessage: z.ZodNullable<z.ZodBoolean>;
15
15
  usePerStreamerEmbeds: z.ZodNullable<z.ZodBoolean>;
16
16
  autoPublishIfAnnouncmentChannel: z.ZodNullable<z.ZodBoolean>;
17
+ updateLivePost: z.ZodNullable<z.ZodBoolean>;
17
18
  customMessages: z.ZodArray<z.ZodLazy<z.ZodObject<{
18
19
  content: z.ZodNullable<z.ZodString>;
19
20
  showInviteButton: z.ZodNullable<z.ZodBoolean>;
@@ -14,6 +14,12 @@ const TwitchStreamerSchema = zod_2.z.object({
14
14
  sendOfflineMessage: zod_2.z.boolean().nullable(),
15
15
  usePerStreamerEmbeds: zod_2.z.boolean().nullable(),
16
16
  autoPublishIfAnnouncmentChannel: zod_2.z.boolean().nullable(),
17
+ /**
18
+ * Premium Plus (`GuildFeatures.LivePostUpdates`, launch flag `livePostUpdates`). `null` = on, `false` = off:
19
+ * edit the live post when the streamer changes their title or category. Without the bit the bot clears
20
+ * this on save and never edits.
21
+ */
22
+ updateLivePost: zod_2.z.boolean().nullable(),
17
23
  customMessages: zod_2.z.array(zod_2.z.lazy(() => TSCustomMessageSchema)),
18
24
  notificationChannelId: zod_1.SnowFlake.nullable(),
19
25
  showNotifyButton: zod_2.z.boolean().nullable(),
@@ -76,6 +76,7 @@ export declare const TwitterStreamerZod: {
76
76
  pingRoleId: z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<"everyone">, z.ZodLiteral<"here">]>>;
77
77
  sendOfflineMessage: z.ZodNullable<z.ZodBoolean>;
78
78
  deleteEmbeds: z.ZodNullable<z.ZodBoolean>;
79
+ updateLivePost: z.ZodNullable<z.ZodBoolean>;
79
80
  customCoolDownBeforeNextLive: z.ZodNullable<z.ZodNumber>;
80
81
  offlineGracePeriod: z.ZodNullable<z.ZodUnion<[z.ZodLiteral<number>, z.ZodLiteral<number>, ...z.ZodLiteral<number>[]]>>;
81
82
  liveRoleId: z.ZodNullable<z.ZodString>;
@@ -26,6 +26,12 @@ const TwitterStreamerSchema = zod_2.z.object({
26
26
  pingRoleId: zod_1.SnowFlakeOrEveryone.nullable(),
27
27
  sendOfflineMessage: zod_2.z.boolean().nullable(),
28
28
  deleteEmbeds: zod_2.z.boolean().nullable(),
29
+ /**
30
+ * Premium Plus (`GuildFeatures.LivePostUpdates`, launch flag `livePostUpdates`). `null` = on, `false` = off:
31
+ * edit the live post when the streamer changes their title or category. Without the bit the bot clears
32
+ * this on save and never edits.
33
+ */
34
+ updateLivePost: zod_2.z.boolean().nullable(),
29
35
  customCoolDownBeforeNextLive: zod_2.z.number().min(0).max(360).nullable(),
30
36
  // A literal union, not min/max: it is a dropdown, and 7 minutes is not a value the UI can produce.
31
37
  offlineGracePeriod: zod_2.z.union(offlineGrace_1.OFFLINE_GRACE_CHOICES.map((n) => zod_2.z.literal(n))).nullable(),
@@ -80,6 +80,7 @@ export declare const YoutubeStreamerZod: {
80
80
  usersForLiveRole: z.ZodArray<z.ZodString>;
81
81
  usersWhoHaveLiveRole: z.ZodArray<z.ZodString>;
82
82
  statsChannelIds: z.ZodNullable<z.ZodLazy<z.ZodObject<{
83
+ followers: z.ZodNullable<z.ZodString>;
83
84
  isLive: z.ZodNullable<z.ZodString>;
84
85
  }, z.core.$strip>>>;
85
86
  isCurrentlyLive: z.ZodNullable<z.ZodLazy<z.ZodObject<{
@@ -146,6 +147,7 @@ export declare const YoutubeStreamerZod: {
146
147
  }>;
147
148
  }, z.core.$strip>;
148
149
  readonly YTSStatsChannelIdSchema: z.ZodObject<{
150
+ followers: z.ZodNullable<z.ZodString>;
149
151
  isLive: z.ZodNullable<z.ZodString>;
150
152
  }, z.core.$strip>;
151
153
  readonly YTSCurrentlyLiveSchema: z.ZodObject<{
@@ -17,6 +17,10 @@ const YoutubeStreamerSchema = zod_2.z.object({
17
17
  videoNotificationChannelId: zod_1.SnowFlake.nullable(),
18
18
  showNotifyButton: zod_2.z.boolean().nullable(),
19
19
  postReplays: zod_2.z.boolean().nullable(),
20
+ /**
21
+ * Premium Plus (`GuildFeatures.YouTubeReplayChannel`). Without it the bot clears this on save and ignores it
22
+ * when posting: replays go to the upload channel (`videoNotificationChannelId`), else the live channel.
23
+ */
20
24
  replayNotificationChannelId: zod_1.SnowFlake.nullable(),
21
25
  pingRoleId: zod_1.SnowFlakeOrEveryone.nullable(),
22
26
  videoRoleId: zod_1.SnowFlakeOrEveryone.nullable(),
@@ -34,6 +38,7 @@ const YTSCustomMessageSchema = zod_2.z.object({
34
38
  ...zod_1.CentralZod.Message(),
35
39
  });
36
40
  const YTSStatsChannelIdSchema = zod_2.z.object({
41
+ followers: zod_2.z.string().nullable(),
37
42
  isLive: zod_2.z.string().nullable(),
38
43
  });
39
44
  const YTSCurrentlyLiveSchema = zod_2.z.object({