@notidotbot/noti-api-client 1.9.79 → 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.
- package/cname.js +17 -0
- package/dist/classes/guildBoosts.d.ts +122 -0
- package/dist/classes/guildBoosts.js +75 -0
- package/dist/classes/guildInGame.d.ts +5 -0
- package/dist/classes/guildMembers.d.ts +56 -0
- package/dist/classes/guildMembers.js +37 -0
- package/dist/classes/guildPlatform.d.ts +35 -7
- package/dist/classes/guildPlatform.js +15 -0
- package/dist/core/manager.d.ts +4 -0
- package/dist/core/manager.js +4 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/other/bitfields.d.ts +13 -4
- package/dist/other/bitfields.js +9 -0
- package/dist/other/features.d.ts +1 -1
- package/dist/other/features.js +2 -0
- package/dist/other/templates.d.ts +37 -0
- package/dist/other/templates.js +39 -0
- package/dist/other/zod/clubStreamer.zod.d.ts +3 -0
- package/dist/other/zod/clubStreamer.zod.js +4 -0
- package/dist/other/zod/guild.zod.d.ts +8 -0
- package/dist/other/zod/guild.zod.js +1 -0
- package/dist/other/zod/kickStreamer.zod.d.ts +4 -0
- package/dist/other/zod/kickStreamer.zod.js +5 -0
- package/dist/other/zod/rumbleStreamer.zod.d.ts +3 -0
- package/dist/other/zod/rumbleStreamer.zod.js +4 -0
- package/dist/other/zod/schema.zod.d.ts +2 -0
- package/dist/other/zod/schema.zod.js +2 -0
- package/dist/other/zod/tiktokStreamer.zod.d.ts +3 -0
- package/dist/other/zod/tiktokStreamer.zod.js +4 -0
- package/dist/other/zod/twitchStreamer.zod.d.ts +3 -0
- package/dist/other/zod/twitchStreamer.zod.js +4 -0
- package/dist/other/zod/twitterStreamer.zod.d.ts +3 -0
- package/dist/other/zod/twitterStreamer.zod.js +4 -0
- package/dist/other/zod/whatnotStreamer.zod.d.ts +3 -0
- package/dist/other/zod/whatnotStreamer.zod.js +4 -0
- package/dist/other/zod/youtubeStreamer.zod.d.ts +3 -0
- package/dist/other/zod/youtubeStreamer.zod.js +4 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/prisma/schema/models/clubStreamer.prisma +6 -0
- package/prisma/schema/models/guild.prisma +2 -0
- package/prisma/schema/models/kickStreamer.prisma +6 -0
- package/prisma/schema/models/rumbleStreamer.prisma +6 -0
- package/prisma/schema/models/tiktokStreamer.prisma +6 -0
- package/prisma/schema/models/twitchStreamer.prisma +6 -0
- package/prisma/schema/models/twitterStreamer.prisma +6 -0
- package/prisma/schema/models/whatnotStreamer.prisma +6 -0
- package/prisma/schema/models/youtubeStreamer.prisma +6 -0
- 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;
|
|
@@ -186,6 +186,11 @@ export type InGameCreator = {
|
|
|
186
186
|
inGameServerIds: string[];
|
|
187
187
|
/** The types this creator's platform has. */
|
|
188
188
|
availableTypes: InGameAlertType[];
|
|
189
|
+
/**
|
|
190
|
+
* A member added this creator through the Influencer Panel (1.9.80). Its Minecraft switch is normally set by the
|
|
191
|
+
* panel's own per-platform "Show in Minecraft"; a member can hide theirs.
|
|
192
|
+
*/
|
|
193
|
+
fromInfluencerPanel: boolean;
|
|
189
194
|
};
|
|
190
195
|
export type InGameCreatorsData = {
|
|
191
196
|
creators: InGameCreator[];
|
|
@@ -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,
|
package/dist/core/manager.d.ts
CHANGED
|
@@ -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;
|
package/dist/core/manager.js
CHANGED
|
@@ -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<"
|
|
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<"
|
|
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<"
|
|
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<"
|
|
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
|
}
|
package/dist/other/bitfields.js
CHANGED
|
@@ -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,
|
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", "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';
|
package/dist/other/features.js
CHANGED
|
@@ -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',
|