Nubis, een opensource-framework van Eytak
Nubis is een TypeScript-framework voor Discord-bots. Schrijf een bestand en je hebt een slash-commando, getypeerd op basis van wat je schreef, met tests die zonder Discord draaien.
$ npx create-nubis my-botimport { command, hasPermission, option } from "nubis";
import { PermissionFlagsBits } from "discord-api-types/v10";
import { confirmBan } from "../../components/confirm-ban";
export default command({
description: "Ban a member",
ephemeral: true,
options: {
user: option.user({ required: true }),
days: option.integer({
choices: [
{ name: "One day", value: 1 },
{ name: "A week", value: 7 },
],
}),
},
guards: [hasPermission(PermissionFlagsBits.BanMembers)],
run: ({ options, reply }) =>
reply({
content: `Ban ${options.user.username}?`,
components: [confirmBan({ userId: options.user.id })],
}),
});
adagebruikte /mod ban
my-botApp
Ban alice?
Alleen jij kunt dit zien
commands/mod/ban.ts/mod ban
Kies een bestand. Het pad is het commando.Types
Optiewaarden, keuze-unions, componentstatus en modalvelden worden afgeleid uit hun definities. Je zoekt niets op met een string.
days: option.integer({
choices: [
{ name: "One day", value: 1 },
{ name: "A week", value: 7 },
],
}),afgeleid
options.days: 1 | 7 | undefined
export const confirmBan = button({
id: "confirm-ban",
label: "Confirm",
state: z.object({ userId: z.string() }),
onClick: ({ state }) => …afgeleid
state.userId: string
fields: {
reason: textInput({
label: "Reason",
required: true,
}),
contact: textInput({ label: "Contact" }),
},afgeleid
values.contact: string | undefined
De regels van Discord
Commandonamen van hoogstens 32 tekens, maximaal 25 opties en 25 keuzes, custom_ids van 100 tekens, 5 rijen componenten. Een definitie die Discord zou weigeren, faalt zodra ze geladen wordt, en de fout zegt waar.
days: option.integer({
choices: [
{ name: "One day", value: 1 },
{ name: "A week and a half", value: 7.5 },
],
}),$ nubis dev
[nubis] Synced commands:
+ ping
+ mod
[nubis] commands/mod/ban.ts changed, restarting.
[nubis] /mod ban option "days": integer choices must be whole numbers.
[nubis] Fix the error and save; I'll try again.
Testen
nubis/testing voert commando’s, knoppen, selectiemenu’s, modals en menu’s uit zoals Discord dat zou doen. Geen token, geen netwerk, geen testserver.
import { PermissionFlagsBits } from "discord-api-types/v10";
import { fake, testCommand } from "nubis/testing";
import ban from "../commands/mod/ban";
test("asks for confirmation", async () => {
const result = await testCommand(ban)
.as({ permissions: PermissionFlagsBits.BanMembers })
.run({ user: fake.user("alice") });
expect(result.replies).toEqual(["Ban alice?"]);
expect(result.ephemeral).toBe(true);
});
test("members without the permission are turned away", async () => {
const result = await testCommand(ban).run({ user: fake.user("alice") });
expect(result.status).toBe("denied");
});$ bun test
tests/ban.test.ts:
✓ asks for confirmation
✓ members without the permission are turned away
2 pass
0 fail
Antwoorden
Discord geeft een bot 3 seconden om te antwoorden. Roep reply() aan en Nubis doet de rest: het wachtbericht, de bewerking en de vervolgberichten.
0 s
Je handler begint aan het rapport.
2 s
Na 2 seconden zonder antwoord, voordat de limiet van 3 seconden van Discord verloopt.
Zodra het klaar is
Het eerste antwoord vervangt „denkt na…”.
Binnen 15 min
Latere antwoorden zijn nieuwe berichten, in de volgorde waarin je ze stuurt.
Limiet van Discord · 3 s