@notidotbot/noti-api-client 1.9.80 → 1.9.81

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 (49) hide show
  1. package/cname.js +17 -0
  2. package/dist/classes/guildBoosts.d.ts +122 -0
  3. package/dist/classes/guildBoosts.js +75 -0
  4. package/dist/classes/guildMembers.d.ts +56 -0
  5. package/dist/classes/guildMembers.js +37 -0
  6. package/dist/classes/guildPlatform.d.ts +35 -7
  7. package/dist/classes/guildPlatform.js +15 -0
  8. package/dist/core/manager.d.ts +4 -0
  9. package/dist/core/manager.js +4 -0
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.js +2 -0
  12. package/dist/other/bitfields.d.ts +13 -4
  13. package/dist/other/bitfields.js +9 -0
  14. package/dist/other/features.d.ts +1 -1
  15. package/dist/other/features.js +2 -0
  16. package/dist/other/templates.d.ts +37 -0
  17. package/dist/other/templates.js +39 -0
  18. package/dist/other/zod/clubStreamer.zod.d.ts +3 -0
  19. package/dist/other/zod/clubStreamer.zod.js +4 -0
  20. package/dist/other/zod/guild.zod.d.ts +8 -0
  21. package/dist/other/zod/guild.zod.js +1 -0
  22. package/dist/other/zod/kickStreamer.zod.d.ts +4 -0
  23. package/dist/other/zod/kickStreamer.zod.js +5 -0
  24. package/dist/other/zod/rumbleStreamer.zod.d.ts +3 -0
  25. package/dist/other/zod/rumbleStreamer.zod.js +4 -0
  26. package/dist/other/zod/schema.zod.d.ts +2 -0
  27. package/dist/other/zod/schema.zod.js +2 -0
  28. package/dist/other/zod/tiktokStreamer.zod.d.ts +3 -0
  29. package/dist/other/zod/tiktokStreamer.zod.js +4 -0
  30. package/dist/other/zod/twitchStreamer.zod.d.ts +3 -0
  31. package/dist/other/zod/twitchStreamer.zod.js +4 -0
  32. package/dist/other/zod/twitterStreamer.zod.d.ts +3 -0
  33. package/dist/other/zod/twitterStreamer.zod.js +4 -0
  34. package/dist/other/zod/whatnotStreamer.zod.d.ts +3 -0
  35. package/dist/other/zod/whatnotStreamer.zod.js +4 -0
  36. package/dist/other/zod/youtubeStreamer.zod.d.ts +3 -0
  37. package/dist/other/zod/youtubeStreamer.zod.js +4 -0
  38. package/dist/tsconfig.tsbuildinfo +1 -1
  39. package/package.json +1 -1
  40. package/prisma/schema/models/clubStreamer.prisma +6 -0
  41. package/prisma/schema/models/guild.prisma +2 -0
  42. package/prisma/schema/models/kickStreamer.prisma +6 -0
  43. package/prisma/schema/models/rumbleStreamer.prisma +6 -0
  44. package/prisma/schema/models/tiktokStreamer.prisma +6 -0
  45. package/prisma/schema/models/twitchStreamer.prisma +6 -0
  46. package/prisma/schema/models/twitterStreamer.prisma +6 -0
  47. package/prisma/schema/models/whatnotStreamer.prisma +6 -0
  48. package/prisma/schema/models/youtubeStreamer.prisma +6 -0
  49. package/prisma/schema/schema.prisma +3 -0
package/cname.js CHANGED
@@ -1,3 +1,20 @@
1
1
  const fs = require('node:fs');
2
+ const path = require('node:path');
2
3
 
3
4
  fs.writeFileSync('./docs/CNAME', 'api-docs.noti.bot');
5
+
6
+ // Keep api-docs.noti.bot out of search results. GitHub Pages cannot send an X-Robots-Tag header, so every generated
7
+ // page gets the meta tag instead. No robots.txt Disallow: a blocked page is never re-crawled, so the noindex would
8
+ // never be seen and already-indexed pages would stay listed.
9
+ const NOINDEX = '<meta name="robots" content="noindex, nofollow">';
10
+ const addNoindex = (dir) => {
11
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
12
+ const file = path.join(dir, entry.name);
13
+ if (entry.isDirectory()) addNoindex(file);
14
+ else if (entry.name.endsWith('.html')) {
15
+ const html = fs.readFileSync(file, 'utf8');
16
+ if (!html.includes(NOINDEX)) fs.writeFileSync(file, html.replace(/<head>/i, `<head>${NOINDEX}`));
17
+ }
18
+ }
19
+ };
20
+ addNoindex('./docs');
@@ -0,0 +1,122 @@
1
+ import { WebDataManager } from '../core/manager';
2
+ import { CancelOutWebResponses, WebResponse } from '../types';
3
+ /**
4
+ * Boost notifications - what Noti does when a member boosts the server or stops boosting.
5
+ *
6
+ * - **Posts (free):** a "boosted" message and a "stopped boosting" message, each with its own channel and switch.
7
+ * Their text is edited with the guild message editor: `createOrUpdateGuildMessage` with `messageType`
8
+ * `'boost'` / `'unboost'`. Placeholders: `{guild} {username} {userId} {userMention} {userAvatar} {boostCount}
9
+ * {boostLevel}`, plus `{boostDuration}` ("3 months") on the un-boost.
10
+ * - **Log and boost roles (Premium):** `logChannelId` gets a line for every boost, second boost, un-boost, level
11
+ * change and role change. `milestones` give a role once a member has boosted for that many months (30-day
12
+ * months); all of them come off when the member stops boosting. Roles are given by a daily pass, so a new
13
+ * milestone applies within a day.
14
+ * - **Booster board (Premium Plus):** `boardChannelId` gets a message listing everyone boosting, kept up to date.
15
+ *
16
+ * Behind the `boostNotifications` launch flag: every method answers 403 until it is beta/public for the caller.
17
+ * `data.access` says which parts the server's plan includes, so the page can lock the rest.
18
+ */
19
+ export declare class APIGuildBoosts {
20
+ private web;
21
+ constructor(web: WebDataManager);
22
+ /** The server's boost settings, its milestone roles (shortest first), what its plan allows, and the limits. */
23
+ getGuildBoosts({ auth, guildId }: GuildBoostsFunctionsInput['getGuildBoosts']): Promise<WebResponse<GuildBoostsData>>;
24
+ /**
25
+ * Change the settings, field by field - omit one to leave it unchanged. `milestones`, when sent, REPLACES the
26
+ * whole list (`[]` clears it). Returns the same shape as `getGuildBoosts`.
27
+ *
28
+ * 400 names the problem: a bad value, a duplicate month, a channel Noti cannot post in (View Channel, Send
29
+ * Messages, Embed Links), or a role Noti cannot give (missing, managed, @everyone, above Noti's role, or no
30
+ * Manage Roles). **403** when setting a part the plan does not include - the log or milestones without
31
+ * Premium, the board without Premium Plus. Clearing (`null`, `false`, `[]`) is always accepted, so a server
32
+ * that lost its plan can switch things off.
33
+ *
34
+ * Changing `boardChannelId` deletes the old board message and draws the board in the new channel at once;
35
+ * `data.boardError` is null, or why the new board could not be drawn (the settings are saved either way).
36
+ */
37
+ updateGuildBoosts({ auth, guildId, ...body }: GuildBoostsFunctionsInput['updateGuildBoosts']): Promise<WebResponse<GuildBoostsUpdateData>>;
38
+ /**
39
+ * Post the booster board now, or redraw it (Premium Plus). It also redraws itself after every boost and
40
+ * un-boost (within ~30s) and once a day, and members can press its Refresh button. 400 says why it could not be
41
+ * drawn: no channel set, the channel is gone, or Noti cannot post there.
42
+ */
43
+ refreshGuildBoostBoard({ auth, guildId }: GuildBoostsFunctionsInput['refreshGuildBoostBoard']): Promise<WebResponse<GuildBoostsData>>;
44
+ /**
45
+ * Send the real boost or un-boost post to its channel, with the caller as the booster. Rate limited per server
46
+ * (429 with Retry-After) and vote gated like every Test button (403). 400 says why nothing was sent: switched
47
+ * off, no channel, missing permissions, or Discord refused it.
48
+ */
49
+ testGuildBoostMessage({ auth, guildId, type }: GuildBoostsFunctionsInput['testGuildBoostMessage']): Promise<WebResponse<string>>;
50
+ }
51
+ /** Which post a test sends. */
52
+ export type GuildBoostMessageType = 'boost' | 'unboost';
53
+ export type GuildBoostSettings = {
54
+ boostEnabled: boolean;
55
+ boostChannelId: string | null;
56
+ unboostEnabled: boolean;
57
+ unboostChannelId: string | null;
58
+ /** Premium. Null = no log. */
59
+ logChannelId: string | null;
60
+ /** Premium Plus. Null = no board. */
61
+ boardChannelId: string | null;
62
+ /** The board message Noti last posted. Read only. */
63
+ boardMessageId: string | null;
64
+ };
65
+ /** A boost-length role: given once a member has boosted for `months` (30-day) months. Premium. */
66
+ export type GuildBoostMilestone = {
67
+ months: number;
68
+ roleId: string;
69
+ };
70
+ export type GuildBoostsAccess = {
71
+ /** The boost and un-boost posts (free). */
72
+ posts: boolean;
73
+ /** The log channel and milestone roles (Premium). */
74
+ logAndRoles: boolean;
75
+ /** The booster board (Premium Plus). */
76
+ board: boolean;
77
+ };
78
+ export type GuildBoostsLimits = {
79
+ maxMilestones: number;
80
+ maxMonths: number;
81
+ };
82
+ export type GuildBoostsData = {
83
+ settings: GuildBoostSettings;
84
+ milestones: GuildBoostMilestone[];
85
+ access: GuildBoostsAccess;
86
+ limits: GuildBoostsLimits;
87
+ };
88
+ export type GuildBoostsUpdateData = GuildBoostsData & {
89
+ boardError: string | null;
90
+ };
91
+ export type GuildBoostsUpdate = Partial<Omit<GuildBoostSettings, 'boardMessageId'>> & {
92
+ milestones?: GuildBoostMilestone[];
93
+ };
94
+ export type GuildBoostsFunctionsInput = {
95
+ 'getGuildBoosts': {
96
+ auth: string;
97
+ guildId: string;
98
+ };
99
+ 'updateGuildBoosts': {
100
+ auth: string;
101
+ guildId: string;
102
+ } & GuildBoostsUpdate;
103
+ 'refreshGuildBoostBoard': {
104
+ auth: string;
105
+ guildId: string;
106
+ };
107
+ 'testGuildBoostMessage': {
108
+ auth: string;
109
+ guildId: string;
110
+ type: GuildBoostMessageType;
111
+ };
112
+ };
113
+ export type GuildBoostsReturnTypes = {
114
+ 'getGuildBoostsRaw': Awaited<ReturnType<APIGuildBoosts['getGuildBoosts']>>;
115
+ 'getGuildBoostsSuccess': CancelOutWebResponses<Awaited<ReturnType<APIGuildBoosts['getGuildBoosts']>>>;
116
+ 'updateGuildBoostsRaw': Awaited<ReturnType<APIGuildBoosts['updateGuildBoosts']>>;
117
+ 'updateGuildBoostsSuccess': CancelOutWebResponses<Awaited<ReturnType<APIGuildBoosts['updateGuildBoosts']>>>;
118
+ 'refreshGuildBoostBoardRaw': Awaited<ReturnType<APIGuildBoosts['refreshGuildBoostBoard']>>;
119
+ 'refreshGuildBoostBoardSuccess': CancelOutWebResponses<Awaited<ReturnType<APIGuildBoosts['refreshGuildBoostBoard']>>>;
120
+ 'testGuildBoostMessageRaw': Awaited<ReturnType<APIGuildBoosts['testGuildBoostMessage']>>;
121
+ 'testGuildBoostMessageSuccess': CancelOutWebResponses<Awaited<ReturnType<APIGuildBoosts['testGuildBoostMessage']>>>;
122
+ };
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.APIGuildBoosts = void 0;
4
+ /**
5
+ * Boost notifications - what Noti does when a member boosts the server or stops boosting.
6
+ *
7
+ * - **Posts (free):** a "boosted" message and a "stopped boosting" message, each with its own channel and switch.
8
+ * Their text is edited with the guild message editor: `createOrUpdateGuildMessage` with `messageType`
9
+ * `'boost'` / `'unboost'`. Placeholders: `{guild} {username} {userId} {userMention} {userAvatar} {boostCount}
10
+ * {boostLevel}`, plus `{boostDuration}` ("3 months") on the un-boost.
11
+ * - **Log and boost roles (Premium):** `logChannelId` gets a line for every boost, second boost, un-boost, level
12
+ * change and role change. `milestones` give a role once a member has boosted for that many months (30-day
13
+ * months); all of them come off when the member stops boosting. Roles are given by a daily pass, so a new
14
+ * milestone applies within a day.
15
+ * - **Booster board (Premium Plus):** `boardChannelId` gets a message listing everyone boosting, kept up to date.
16
+ *
17
+ * Behind the `boostNotifications` launch flag: every method answers 403 until it is beta/public for the caller.
18
+ * `data.access` says which parts the server's plan includes, so the page can lock the rest.
19
+ */
20
+ class APIGuildBoosts {
21
+ web;
22
+ constructor(web) {
23
+ this.web = web;
24
+ }
25
+ /** The server's boost settings, its milestone roles (shortest first), what its plan allows, and the limits. */
26
+ async getGuildBoosts({ auth, guildId }) {
27
+ return await this.web.request({
28
+ method: 'GET', auth,
29
+ endpoint: this.web.qp(`/data/guild/${guildId}/boosts`),
30
+ });
31
+ }
32
+ /**
33
+ * Change the settings, field by field - omit one to leave it unchanged. `milestones`, when sent, REPLACES the
34
+ * whole list (`[]` clears it). Returns the same shape as `getGuildBoosts`.
35
+ *
36
+ * 400 names the problem: a bad value, a duplicate month, a channel Noti cannot post in (View Channel, Send
37
+ * Messages, Embed Links), or a role Noti cannot give (missing, managed, @everyone, above Noti's role, or no
38
+ * Manage Roles). **403** when setting a part the plan does not include - the log or milestones without
39
+ * Premium, the board without Premium Plus. Clearing (`null`, `false`, `[]`) is always accepted, so a server
40
+ * that lost its plan can switch things off.
41
+ *
42
+ * Changing `boardChannelId` deletes the old board message and draws the board in the new channel at once;
43
+ * `data.boardError` is null, or why the new board could not be drawn (the settings are saved either way).
44
+ */
45
+ async updateGuildBoosts({ auth, guildId, ...body }) {
46
+ return await this.web.request({
47
+ method: 'PATCH', auth,
48
+ endpoint: this.web.qp(`/data/guild/${guildId}/boosts`),
49
+ body,
50
+ });
51
+ }
52
+ /**
53
+ * Post the booster board now, or redraw it (Premium Plus). It also redraws itself after every boost and
54
+ * un-boost (within ~30s) and once a day, and members can press its Refresh button. 400 says why it could not be
55
+ * drawn: no channel set, the channel is gone, or Noti cannot post there.
56
+ */
57
+ async refreshGuildBoostBoard({ auth, guildId }) {
58
+ return await this.web.request({
59
+ method: 'POST', auth,
60
+ endpoint: this.web.qp(`/data/guild/${guildId}/boosts/boards`),
61
+ });
62
+ }
63
+ /**
64
+ * Send the real boost or un-boost post to its channel, with the caller as the booster. Rate limited per server
65
+ * (429 with Retry-After) and vote gated like every Test button (403). 400 says why nothing was sent: switched
66
+ * off, no channel, missing permissions, or Discord refused it.
67
+ */
68
+ async testGuildBoostMessage({ auth, guildId, type }) {
69
+ return await this.web.request({
70
+ method: 'PUT', auth,
71
+ endpoint: this.web.qp(`/data/guild/${guildId}/boosts/tests/${type}`),
72
+ });
73
+ }
74
+ }
75
+ exports.APIGuildBoosts = APIGuildBoosts;
@@ -0,0 +1,56 @@
1
+ import { WebDataManager } from '../core/manager';
2
+ import { CancelOutWebResponses, WebResponse } from '../types';
3
+ /**
4
+ * Member pickers - so settings that store Discord user ids can offer a search box instead of asking owners to paste
5
+ * ids. Used for: users for a live role (`usersForLiveRole` on every creator) and a giveaway's host (`hostId`), and
6
+ * any future member field. Read only.
7
+ *
8
+ * - `searchGuildMembers`: members whose username or server nickname starts with `query`. A pasted id or `<@id>`
9
+ * mention returns that one member. Debounce on the page; results are cached server-side for 30s.
10
+ * - `getGuildMembers`: saved ids back to names and avatars, to show a stored list. Ids that left the server come
11
+ * back in `missing` - show them as "Left the server" rather than dropping them silently.
12
+ *
13
+ * 503 when the server's shard cannot be reached; 400 for an empty query or more than 100 ids.
14
+ */
15
+ export declare class APIGuildMembers {
16
+ private web;
17
+ constructor(web: WebDataManager);
18
+ searchGuildMembers({ auth, guildId, query, limit }: GuildMembersFunctionsInput['searchGuildMembers']): Promise<WebResponse<{
19
+ members: GuildMemberOption[];
20
+ }>>;
21
+ getGuildMembers({ auth, guildId, ids }: GuildMembersFunctionsInput['getGuildMembers']): Promise<WebResponse<GuildMembersLookup>>;
22
+ }
23
+ export type GuildMemberOption = {
24
+ id: string;
25
+ username: string;
26
+ /** Server nickname, else global display name, else username - what Discord shows. */
27
+ displayName: string;
28
+ avatarUrl: string;
29
+ bot: boolean;
30
+ };
31
+ export type GuildMembersLookup = {
32
+ members: GuildMemberOption[];
33
+ missing: string[];
34
+ };
35
+ /** Most results one search returns, and most ids one lookup takes. */
36
+ export declare const MEMBER_SEARCH_LIMIT = 25;
37
+ export declare const MEMBER_LOOKUP_LIMIT = 100;
38
+ export type GuildMembersFunctionsInput = {
39
+ 'searchGuildMembers': {
40
+ auth: string;
41
+ guildId: string;
42
+ query: string;
43
+ limit?: number;
44
+ };
45
+ 'getGuildMembers': {
46
+ auth: string;
47
+ guildId: string;
48
+ ids: string[];
49
+ };
50
+ };
51
+ export type GuildMembersReturnTypes = {
52
+ 'searchGuildMembersRaw': Awaited<ReturnType<APIGuildMembers['searchGuildMembers']>>;
53
+ 'searchGuildMembersSuccess': CancelOutWebResponses<Awaited<ReturnType<APIGuildMembers['searchGuildMembers']>>>;
54
+ 'getGuildMembersRaw': Awaited<ReturnType<APIGuildMembers['getGuildMembers']>>;
55
+ 'getGuildMembersSuccess': CancelOutWebResponses<Awaited<ReturnType<APIGuildMembers['getGuildMembers']>>>;
56
+ };
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MEMBER_LOOKUP_LIMIT = exports.MEMBER_SEARCH_LIMIT = exports.APIGuildMembers = void 0;
4
+ /**
5
+ * Member pickers - so settings that store Discord user ids can offer a search box instead of asking owners to paste
6
+ * ids. Used for: users for a live role (`usersForLiveRole` on every creator) and a giveaway's host (`hostId`), and
7
+ * any future member field. Read only.
8
+ *
9
+ * - `searchGuildMembers`: members whose username or server nickname starts with `query`. A pasted id or `<@id>`
10
+ * mention returns that one member. Debounce on the page; results are cached server-side for 30s.
11
+ * - `getGuildMembers`: saved ids back to names and avatars, to show a stored list. Ids that left the server come
12
+ * back in `missing` - show them as "Left the server" rather than dropping them silently.
13
+ *
14
+ * 503 when the server's shard cannot be reached; 400 for an empty query or more than 100 ids.
15
+ */
16
+ class APIGuildMembers {
17
+ web;
18
+ constructor(web) {
19
+ this.web = web;
20
+ }
21
+ async searchGuildMembers({ auth, guildId, query, limit }) {
22
+ return await this.web.request({
23
+ method: 'GET', auth,
24
+ endpoint: this.web.qp(`/data/guild/${guildId}/members`, { query, ...(limit ? { limit: String(limit) } : {}) }),
25
+ });
26
+ }
27
+ async getGuildMembers({ auth, guildId, ids }) {
28
+ return await this.web.request({
29
+ method: 'GET', auth,
30
+ endpoint: this.web.qp(`/data/guild/${guildId}/members/lookups`, { ids: ids.join(',') }),
31
+ });
32
+ }
33
+ }
34
+ exports.APIGuildMembers = APIGuildMembers;
35
+ /** Most results one search returns, and most ids one lookup takes. */
36
+ exports.MEMBER_SEARCH_LIMIT = 25;
37
+ exports.MEMBER_LOOKUP_LIMIT = 100;
@@ -9,6 +9,18 @@ export declare class APIGuildPlatform {
9
9
  createGuildStreamer<P extends AllPlatforms>({ auth, guildId, streamer, body, platform, rumbleType }: GuildPlatformFunctionsInput<never, P>['createGuildStreamer']): Promise<import("../types").WebResponse<GuildSingleStreamer<P>>>;
10
10
  updateGuildStreamer<P extends AllPlatforms>({ auth, guildId, streamer, body, platform, rumbleType }: GuildPlatformFunctionsInput<never, P>['updateGuildStreamer']): Promise<import("../types").WebResponse<string>>;
11
11
  deleteGuildStreamer<P extends AllPlatforms>({ auth, guildId, streamer, platform, rumbleType }: GuildPlatformFunctionsInput<never, P>['deleteGuildStreamer']): Promise<import("../types").WebResponse<string>>;
12
+ /**
13
+ * Save the dashboard's drag order (API capability `creatorOrder` on `/premium/plans`; an older API has no route).
14
+ * `streamers` is the FULL order top to bottom, by streamerUserName. Names not sent keep their relative order after
15
+ * the sent ones; unknown names are ignored. Cheap and safe to call after every drag (debounce ~1s).
16
+ *
17
+ * The order decides which creators stay on when the server is over its plan's creator limit: the first N post,
18
+ * the rest come back `limitLocked: true` (kept with their settings, silent) until the server is under its limit
19
+ * again or they are dragged above an active one.
20
+ */
21
+ updateGuildStreamerOrder<P extends AllPlatforms>({ auth, guildId, platform, streamers }: GuildPlatformFunctionsInput<never, P>['updateGuildStreamerOrder']): Promise<import("../types").WebResponse<{
22
+ streamers: GuildStreamerOrderEntry[];
23
+ }>>;
12
24
  sendTestNotification({ auth, guildId, streamer, platform, rumbleType, subType }: GuildPlatformFunctionsInput['sendTestNotification']): Promise<import("../types").WebResponse<string>>;
13
25
  }
14
26
  export type GuildPlatformFunctionsInput<T extends boolean = never, P extends AllPlatforms = never> = {
@@ -56,8 +68,22 @@ export type GuildPlatformFunctionsInput<T extends boolean = never, P extends All
56
68
  rumbleType?: RumbleType;
57
69
  subType?: SubType;
58
70
  };
71
+ 'updateGuildStreamerOrder': {
72
+ auth: string;
73
+ guildId: string;
74
+ platform: P;
75
+ streamers: string[];
76
+ };
77
+ };
78
+ /** One creator in the saved order: its place, and whether it is past the server's plan limit (kept, silent). */
79
+ export type GuildStreamerOrderEntry = {
80
+ streamerUserName: string;
81
+ position: number;
82
+ limitLocked: boolean;
59
83
  };
60
84
  export type GuildPlatformReturnTypes = {
85
+ 'updateGuildStreamerOrderRaw': Awaited<ReturnType<APIGuildPlatform['updateGuildStreamerOrder']>>;
86
+ 'updateGuildStreamerOrderSuccess': CancelOutWebResponses<Awaited<ReturnType<APIGuildPlatform['updateGuildStreamerOrder']>>>;
61
87
  'getGuildStreamersRaw': Awaited<ReturnType<APIGuildPlatform['getGuildStreamers']>>;
62
88
  'getGuildStreamersSuccess': CancelOutWebResponses<Awaited<ReturnType<APIGuildPlatform['getGuildStreamers']>>>;
63
89
  'getGuildStreamerRaw': Awaited<ReturnType<APIGuildPlatform['getGuildStreamer']>>;
@@ -174,14 +200,16 @@ type ServedPlatform = Exclude<AllPlatforms, 'whatnot'>;
174
200
  * `whatnot` is `never` only to keep this lookup total over `AllPlatforms`. It is `ServedPlatform`
175
201
  * above that actually removes it - `Pick<T, never>` is `{}`, not `never`.
176
202
  */
203
+ /** Every view, short included, carries the creator's place in the order and whether it is over the plan limit. */
204
+ type OrderKeys = 'position' | 'limitLocked';
177
205
  type ShortViewKeySets = {
178
- kick: 'streamerUserName' | 'streamerId' | 'chatRoomId' | 'guildId';
179
- twitch: 'streamerUserName' | 'streamerId' | 'guildId';
180
- rumble: 'streamerUserName' | 'guildId' | 'type';
181
- tiktok: 'streamerUserName' | 'guildId';
182
- youtube: 'streamerUserName' | 'streamerId' | 'guildId';
183
- club: 'streamerUserName' | 'guildId';
184
- twitter: 'streamerUserName' | 'guildId';
206
+ kick: 'streamerUserName' | 'streamerId' | 'chatRoomId' | 'guildId' | OrderKeys;
207
+ twitch: 'streamerUserName' | 'streamerId' | 'guildId' | OrderKeys;
208
+ rumble: 'streamerUserName' | 'guildId' | 'type' | OrderKeys;
209
+ tiktok: 'streamerUserName' | 'guildId' | OrderKeys;
210
+ youtube: 'streamerUserName' | 'streamerId' | 'guildId' | OrderKeys;
211
+ club: 'streamerUserName' | 'guildId' | OrderKeys;
212
+ twitter: 'streamerUserName' | 'guildId' | OrderKeys;
185
213
  whatnot: never;
186
214
  };
187
215
  export type Platformstreamers<T extends boolean, P extends AllPlatforms> = {
@@ -48,6 +48,21 @@ class APIGuildPlatform {
48
48
  }),
49
49
  });
50
50
  }
51
+ /**
52
+ * Save the dashboard's drag order (API capability `creatorOrder` on `/premium/plans`; an older API has no route).
53
+ * `streamers` is the FULL order top to bottom, by streamerUserName. Names not sent keep their relative order after
54
+ * the sent ones; unknown names are ignored. Cheap and safe to call after every drag (debounce ~1s).
55
+ *
56
+ * The order decides which creators stay on when the server is over its plan's creator limit: the first N post,
57
+ * the rest come back `limitLocked: true` (kept with their settings, silent) until the server is under its limit
58
+ * again or they are dragged above an active one.
59
+ */
60
+ async updateGuildStreamerOrder({ auth, guildId, platform, streamers }) {
61
+ return await this.web.request({
62
+ method: 'PUT', auth, body: { streamers },
63
+ endpoint: this.web.qp('/data/guild/' + guildId + '/' + platform + '/orders'),
64
+ });
65
+ }
51
66
  async sendTestNotification({ auth, guildId, streamer, platform, rumbleType, subType }) {
52
67
  return await this.web.request({
53
68
  method: 'PUT', auth,
@@ -14,6 +14,8 @@ import { APIGuildInGame } from '../classes/guildInGame';
14
14
  import { APIGuildBounties } from '../classes/guildBounties';
15
15
  import { APIGuildAssistant } from '../classes/guildAssistant';
16
16
  import { APIGuildAutoRoles } from '../classes/guildAutoRoles';
17
+ import { APIGuildBoosts } from '../classes/guildBoosts';
18
+ import { APIGuildMembers } from '../classes/guildMembers';
17
19
  import { APIGuildInfluencerPanel } from '../classes/guildInfluencerPanel';
18
20
  import { APIDropsGames } from '../classes/dropsGames';
19
21
  import { APIGames } from '../classes/games';
@@ -80,6 +82,8 @@ export declare class WebDataManager {
80
82
  readonly guildBounties: APIGuildBounties;
81
83
  readonly guildAssistant: APIGuildAssistant;
82
84
  readonly guildAutoRoles: APIGuildAutoRoles;
85
+ readonly guildBoosts: APIGuildBoosts;
86
+ readonly guildMembers: APIGuildMembers;
83
87
  readonly guildInfluencerPanel: APIGuildInfluencerPanel;
84
88
  readonly dropsGames: APIDropsGames;
85
89
  readonly guildPlatform: APIGuildPlatform;
@@ -20,6 +20,8 @@ const guildInGame_1 = require("../classes/guildInGame");
20
20
  const guildBounties_1 = require("../classes/guildBounties");
21
21
  const guildAssistant_1 = require("../classes/guildAssistant");
22
22
  const guildAutoRoles_1 = require("../classes/guildAutoRoles");
23
+ const guildBoosts_1 = require("../classes/guildBoosts");
24
+ const guildMembers_1 = require("../classes/guildMembers");
23
25
  const guildInfluencerPanel_1 = require("../classes/guildInfluencerPanel");
24
26
  const dropsGames_1 = require("../classes/dropsGames");
25
27
  const games_1 = require("../classes/games");
@@ -84,6 +86,8 @@ class WebDataManager {
84
86
  guildBounties = new guildBounties_1.APIGuildBounties(this);
85
87
  guildAssistant = new guildAssistant_1.APIGuildAssistant(this);
86
88
  guildAutoRoles = new guildAutoRoles_1.APIGuildAutoRoles(this);
89
+ guildBoosts = new guildBoosts_1.APIGuildBoosts(this);
90
+ guildMembers = new guildMembers_1.APIGuildMembers(this);
87
91
  guildInfluencerPanel = new guildInfluencerPanel_1.APIGuildInfluencerPanel(this);
88
92
  dropsGames = new dropsGames_1.APIDropsGames(this);
89
93
  guildPlatform = new guildPlatform_1.APIGuildPlatform(this);
package/dist/index.d.ts CHANGED
@@ -31,6 +31,8 @@ export * from './classes/guildInGame';
31
31
  export * from './classes/guildBounties';
32
32
  export * from './classes/guildAssistant';
33
33
  export * from './classes/guildAutoRoles';
34
+ export * from './classes/guildBoosts';
35
+ export * from './classes/guildMembers';
34
36
  export * from './classes/guildInfluencerPanel';
35
37
  export * from './classes/dropsGames';
36
38
  export * from './classes/guildPlatform';
package/dist/index.js CHANGED
@@ -48,6 +48,8 @@ __exportStar(require("./classes/guildInGame"), exports);
48
48
  __exportStar(require("./classes/guildBounties"), exports);
49
49
  __exportStar(require("./classes/guildAssistant"), exports);
50
50
  __exportStar(require("./classes/guildAutoRoles"), exports);
51
+ __exportStar(require("./classes/guildBoosts"), exports);
52
+ __exportStar(require("./classes/guildMembers"), exports);
51
53
  __exportStar(require("./classes/guildInfluencerPanel"), exports);
52
54
  __exportStar(require("./classes/dropsGames"), exports);
53
55
  __exportStar(require("./classes/guildPlatform"), exports);
@@ -131,6 +131,9 @@ export declare const GuildFeatures: {
131
131
  LivePostUpdates: bigint;
132
132
  MultiDestination: bigint;
133
133
  InGameRewards: bigint;
134
+ BoostNotifications: bigint;
135
+ BoostLogsAndStreaks: bigint;
136
+ BoostBoard: bigint;
134
137
  };
135
138
  export declare const GuildFeaturesText: Record<keyof typeof GuildFeatures, string>;
136
139
  export declare const UserFeatures: {
@@ -249,8 +252,11 @@ export declare class GuildFeaturesManager extends BitFieldManager<typeof GuildFe
249
252
  LivePostUpdates: bigint;
250
253
  MultiDestination: bigint;
251
254
  InGameRewards: bigint;
255
+ BoostNotifications: bigint;
256
+ BoostLogsAndStreaks: bigint;
257
+ BoostBoard: bigint;
252
258
  };
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>;
259
+ 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" | "InGameRewards" | "BoostNotifications" | "BoostLogsAndStreaks" | "BoostBoard", string>;
254
260
  all: bigint;
255
261
  static b: {
256
262
  BaseSyncableRoles: bigint;
@@ -345,8 +351,11 @@ export declare class GuildFeaturesManager extends BitFieldManager<typeof GuildFe
345
351
  LivePostUpdates: bigint;
346
352
  MultiDestination: bigint;
347
353
  InGameRewards: bigint;
354
+ BoostNotifications: bigint;
355
+ BoostLogsAndStreaks: bigint;
356
+ BoostBoard: bigint;
348
357
  };
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>;
358
+ 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" | "InGameRewards" | "BoostNotifications" | "BoostLogsAndStreaks" | "BoostBoard", string>;
350
359
  static all: bigint;
351
360
  convertBitToField<T extends EnumValues<typeof GuildFeatures>>(bit: T): string | null;
352
361
  }
@@ -382,7 +391,7 @@ export declare class UserFlagsManager extends BitFieldManager<typeof UserFlags,
382
391
  Beta: bigint;
383
392
  Owner: bigint;
384
393
  };
385
- t: Record<"Premium" | "Partner" | "Staff" | "Developer" | "Beta" | "Owner", string>;
394
+ t: Record<"Partner" | "Premium" | "Staff" | "Developer" | "Beta" | "Owner", string>;
386
395
  all: bigint;
387
396
  static b: {
388
397
  Partner: bigint;
@@ -392,7 +401,7 @@ export declare class UserFlagsManager extends BitFieldManager<typeof UserFlags,
392
401
  Beta: bigint;
393
402
  Owner: bigint;
394
403
  };
395
- static t: Record<"Premium" | "Partner" | "Staff" | "Developer" | "Beta" | "Owner", string>;
404
+ static t: Record<"Partner" | "Premium" | "Staff" | "Developer" | "Beta" | "Owner", string>;
396
405
  static all: bigint;
397
406
  convertBitToField<T extends EnumValues<typeof UserFlags>>(bit: T): string | null;
398
407
  }
@@ -239,6 +239,12 @@ exports.GuildFeatures = {
239
239
  MultiDestination: 1n << 91n,
240
240
  // Minecraft reward commands: a giveaway runs a preset command on the winner's game server. Premium.
241
241
  InGameRewards: 1n << 92n,
242
+ // Boost notifications: the boost and un-boost posts. Free.
243
+ BoostNotifications: 1n << 93n,
244
+ // Boost notifications: the staff boost log and boost-length roles. Premium.
245
+ BoostLogsAndStreaks: 1n << 94n,
246
+ // Boost notifications: the self-updating booster board. Premium Plus.
247
+ BoostBoard: 1n << 95n,
242
248
  };
243
249
  exports.GuildFeaturesText = {
244
250
  BaseSyncableRoles: 'Basic Syncable Roles',
@@ -335,6 +341,9 @@ exports.GuildFeaturesText = {
335
341
  LivePostUpdates: 'Live Post Updates',
336
342
  MultiDestination: 'Multiple Notification Channels',
337
343
  InGameRewards: 'Minecraft: Reward Commands',
344
+ BoostNotifications: 'Boost Notifications',
345
+ BoostLogsAndStreaks: 'Boost Log & Boost Roles',
346
+ BoostBoard: 'Booster Board',
338
347
  };
339
348
  exports.UserFeatures = {
340
349
  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", "inGame", "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", "vodNotifications", "youtubeReplays", "livePostUpdates", "multiDestination", "inGame", "boostNotifications", "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';
@@ -34,10 +34,12 @@ exports.FEATURE_NAMES = [
34
34
  'sitePolls',
35
35
  'siteAnnouncements',
36
36
  'offlineGracePeriod',
37
+ 'vodNotifications',
37
38
  'youtubeReplays',
38
39
  'livePostUpdates',
39
40
  'multiDestination',
40
41
  'inGame',
42
+ 'boostNotifications',
41
43
  'twitter',
42
44
  'voteToTest',
43
45
  'voteToAddSocial',
@@ -15,6 +15,16 @@ export declare const placeholders: {
15
15
  userAvatar: string;
16
16
  downloadUrl: string;
17
17
  };
18
+ vodNotify: {
19
+ streamerName: string;
20
+ category: string;
21
+ streamTitle: string;
22
+ streamThumbnail: string;
23
+ pingRole: string;
24
+ vodUrl: string;
25
+ duration: string;
26
+ startTime: string;
27
+ };
18
28
  clip: {
19
29
  streamerName: string;
20
30
  clipperName: string;
@@ -374,6 +384,25 @@ export declare const placeholders: {
374
384
  userAvatar: string;
375
385
  guildMemberCount: string;
376
386
  };
387
+ boostMessage: {
388
+ guild: string;
389
+ username: string;
390
+ userId: string;
391
+ userMention: string;
392
+ userAvatar: string;
393
+ boostCount: string;
394
+ boostLevel: string;
395
+ };
396
+ unboostMessage: {
397
+ guild: string;
398
+ username: string;
399
+ userId: string;
400
+ userMention: string;
401
+ userAvatar: string;
402
+ boostCount: string;
403
+ boostLevel: string;
404
+ boostDuration: string;
405
+ };
377
406
  clipperClip: {
378
407
  streamerName: string;
379
408
  clipperName: string;
@@ -1236,6 +1265,14 @@ export declare const messages: {
1236
1265
  content: string;
1237
1266
  embed: {};
1238
1267
  };
1268
+ boostMessage: {
1269
+ content: string;
1270
+ embed: {};
1271
+ };
1272
+ unboostMessage: {
1273
+ content: string;
1274
+ embed: {};
1275
+ };
1239
1276
  };
1240
1277
  export type Placeholders = {
1241
1278
  [x in keyof typeof placeholders]: typeof placeholders[x];