diff --git a/package.json b/package.json index b34f2cc9..c914a83b 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@vladfrangu/async_event_emitter": "^2.4.7", "json-with-bigint": "^3.4.4", "solid-js": "^1.9.14", - "stoat-api": "0.15.3", + "stoat-api": "0.16.0", "ulid": "^3.0.2" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f9b0197..40904017 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: ^1.9.14 version: 1.9.14 stoat-api: - specifier: 0.15.3 - version: 0.15.3 + specifier: 0.16.0 + version: 0.16.0 ulid: specifier: ^3.0.2 version: 3.0.2 @@ -832,8 +832,8 @@ packages: solid-js@1.9.14: resolution: {integrity: sha512-sAEXC0Kk0S1EDg+8ysEWJDbYhA3RRoEjwuySUGlKIemeo0I5YZfOyumNjNs9Sv3y2nmhD+0rW66ag2HsMuQiGQ==} - stoat-api@0.15.3: - resolution: {integrity: sha512-r08FplgeZWft4Hd2CK1tZ7EEzhocUyy/aeeOGBrKC6vy3ANsDhcMzGdJioYQ3jpzH+jFIPLQJzBaJK27Wf3Vug==} + stoat-api@0.16.0: + resolution: {integrity: sha512-HC5+UluvnmCPYacuJh3LUh6Lpfe0gLVpoEjRBpt4BzZUPlA7Pe5inuvEYo/a1MLwTmVpzxF4S9D+QFIADHroTg==} strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -1685,7 +1685,7 @@ snapshots: seroval: 1.5.6 seroval-plugins: 1.5.6(seroval@1.5.6) - stoat-api@0.15.3: + stoat-api@0.16.0: dependencies: json-with-bigint: 3.4.4 diff --git a/src/classes/Bot.ts b/src/classes/Bot.ts index 7256b8a1..e3150f74 100644 --- a/src/classes/Bot.ts +++ b/src/classes/Bot.ts @@ -124,6 +124,13 @@ export class Bot { return this.#collection.getUnderlyingObject(this.id).flags; } + /** + * Bot default permissions + */ + get defaultPermissions(): number | undefined { + return this.#collection.getUnderlyingObject(this.id).defaultPermissions; + } + /** * Instantiate `PublicBot` class from this bot */ @@ -132,6 +139,10 @@ export class Bot { _id: this.id, username: this.user?.username ?? "", avatar: this.user?.avatar?.id, + default_permissions: + this.defaultPermissions !== undefined + ? Number(this.defaultPermissions) + : undefined, }); } diff --git a/src/classes/PublicBot.ts b/src/classes/PublicBot.ts index ef9b0c1f..6e197be9 100644 --- a/src/classes/PublicBot.ts +++ b/src/classes/PublicBot.ts @@ -16,6 +16,10 @@ export class PublicBot { readonly username: string; readonly avatar?: File; readonly description?: string; + /** + * Permissions the bot asks for (0n when unset or the instance doesn't send them) + */ + readonly defaultPermissions: bigint; /** * Construct Public Bot @@ -33,15 +37,20 @@ export class PublicBot { } as APIFile) : undefined; this.description = data.description!; + + const requested = data.default_permissions as number | null | undefined; + this.defaultPermissions = requested != null ? BigInt(requested) : 0n; } /** * Add the bot to a server * @param server Server + * @param permissions Permissions to grant the bot (requires Manage Roles) */ - addToServer(server: Server | string): void { + addToServer(server: Server | string, permissions?: bigint): void { this.#client.api.post(`/bots/${this.id as ""}/invite`, { server: server instanceof Server ? server.id : server, + permissions: permissions ? Number(permissions) : undefined, }); } diff --git a/src/classes/ServerRole.ts b/src/classes/ServerRole.ts index b2cf3793..ca7c6dd4 100644 --- a/src/classes/ServerRole.ts +++ b/src/classes/ServerRole.ts @@ -21,6 +21,7 @@ export class ServerRole { readonly colour?: string; readonly hoist: boolean; readonly rank: number; + readonly owner: string; /** * Construct server role @@ -43,6 +44,7 @@ export class ServerRole { this.colour = data.colour ?? undefined; this.hoist = data.hoist || false; this.rank = data.rank ?? 0; + this.owner = data.owner ?? ""; } /** diff --git a/src/hydration/bot.ts b/src/hydration/bot.ts index 0d63b176..e66fa747 100644 --- a/src/hydration/bot.ts +++ b/src/hydration/bot.ts @@ -13,6 +13,7 @@ export type HydratedBot = { termsOfServiceUrl?: string; privacyPolicyUrl?: string; flags: BotFlags; + defaultPermissions?: number; }; export const botHydration: Hydrate = { @@ -22,6 +23,7 @@ export const botHydration: Hydrate = { interactions_url: "interactionsUrl", terms_of_service_url: "termsOfServiceUrl", privacy_policy_url: "privacyPolicyUrl", + default_permissions: "defaultPermissions", }, functions: { id: (bot) => bot._id, @@ -34,6 +36,7 @@ export const botHydration: Hydrate = { termsOfServiceUrl: (bot) => bot.terms_of_service_url!, privacyPolicyUrl: (bot) => bot.privacy_policy_url!, flags: (bot) => bot.flags!, + defaultPermissions: (bot) => bot.default_permissions!, }, initialHydration: () => ({}), };