feat(platform): add Discord onboarding and Velocity gate

This commit is contained in:
dmg
2026-08-01 13:45:18 -04:00
parent 9d305e5dc9
commit c5de0a1810
80 changed files with 4840 additions and 1572 deletions
+28
View File
@@ -0,0 +1,28 @@
import { describe, expect, it, vi } from "vitest";
import { updateGuildNickname } from "../src/index";
describe("Discord nickname updates", () => {
it("updates a member in the configured guild using bot authentication", async () => {
const request = vi.fn<typeof fetch>().mockResolvedValue(new Response(null, { status: 204 }));
await updateGuildNickname(
{ guildId: "123456789012345678", discordUserId: "987654321098765432", nickname: "Sam (Notch)", botToken: "secret" },
request,
);
expect(request).toHaveBeenCalledWith(
"https://discord.com/api/v10/guilds/123456789012345678/members/987654321098765432",
expect.objectContaining({ method: "PATCH", body: JSON.stringify({ nick: "Sam (Notch)" }) }),
);
});
it("reports Discord permission failures without pretending the nickname changed", async () => {
const request = vi.fn<typeof fetch>().mockResolvedValue(new Response("Missing Permissions", { status: 403 }));
await expect(
updateGuildNickname(
{ guildId: "123456789012345678", discordUserId: "987654321098765432", nickname: "Sam (Notch)", botToken: "secret" },
request,
),
).rejects.toThrow("Discord nickname update failed (403)");
});
});
+30
View File
@@ -0,0 +1,30 @@
import { describe, expect, it, vi } from "vitest";
import { formatDiscordNickname, lookupJavaProfile } from "../src/index";
describe("Java Edition profiles", () => {
it("returns Mojang's canonical UUID and username", async () => {
const request = vi.fn<typeof fetch>().mockResolvedValue(
new Response(JSON.stringify({ id: "069a79f444e94726a5befca90e38aaf5", name: "Notch" }), {
status: 200,
headers: { "content-type": "application/json" },
}),
);
await expect(lookupJavaProfile("notch", request)).resolves.toEqual({
uuid: "069a79f444e94726a5befca90e38aaf5",
username: "Notch",
});
});
it("returns null when Mojang does not recognize the username", async () => {
const request = vi.fn<typeof fetch>().mockResolvedValue(new Response(null, { status: 204 }));
await expect(lookupJavaProfile("UnknownPlayer", request)).resolves.toBeNull();
});
it("preserves the Minecraft username while fitting Discord's nickname limit", () => {
expect(formatDiscordNickname("Alexandria Catherine", "SixteenCharName1")).toBe(
"Alexandria Ca (SixteenCharName1)",
);
expect(formatDiscordNickname("Sam", "Notch")).toBe("Sam (Notch)");
});
});