diff --git a/bun.lock b/bun.lock index 829da38..e4c11a1 100644 --- a/bun.lock +++ b/bun.lock @@ -6,9 +6,11 @@ "dependencies": { "discord.js": "^14.21.0", "ky": "^1.8.2", + "msgpack-lite": "^0.1.26", }, "devDependencies": { "@types/bun": "latest", + "@types/msgpack-lite": "^0.1.11", }, "peerDependencies": { "typescript": "^5", @@ -36,6 +38,8 @@ "@types/bun": ["@types/bun@1.2.19", "", { "dependencies": { "bun-types": "1.2.19" } }, "sha512-d9ZCmrH3CJ2uYKXQIUuZ/pUnTqIvLDS0SK7pFmbx8ma+ziH/FRMoAq5bYpRG7y+w1gl+HgyNZbtqgMq4W4e2Lg=="], + "@types/msgpack-lite": ["@types/msgpack-lite@0.1.11", "", { "dependencies": { "@types/node": "*" } }, "sha512-cdCZS/gw+jIN22I4SUZUFf1ZZfVv5JM1//Br/MuZcI373sxiy3eSSoiyLu0oz+BPatTbGGGBO5jrcvd0siCdTQ=="], + "@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], "@types/react": ["@types/react@19.1.9", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA=="], @@ -52,8 +56,16 @@ "discord.js": ["discord.js@14.21.0", "", { "dependencies": { "@discordjs/builders": "^1.11.2", "@discordjs/collection": "1.5.3", "@discordjs/formatters": "^0.6.1", "@discordjs/rest": "^2.5.1", "@discordjs/util": "^1.1.1", "@discordjs/ws": "^1.2.3", "@sapphire/snowflake": "3.5.3", "discord-api-types": "^0.38.1", "fast-deep-equal": "3.1.3", "lodash.snakecase": "4.1.1", "magic-bytes.js": "^1.10.0", "tslib": "^2.6.3", "undici": "6.21.3" } }, "sha512-U5w41cEmcnSfwKYlLv5RJjB8Joa+QJyRwIJz5i/eg+v2Qvv6EYpCRhN9I2Rlf0900LuqSDg8edakUATrDZQncQ=="], + "event-lite": ["event-lite@0.1.3", "", {}, "sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw=="], + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "int64-buffer": ["int64-buffer@0.1.10", "", {}, "sha512-v7cSY1J8ydZ0GyjUHqF+1bshJ6cnEVLo9EnjB8p+4HDRPZc9N5jjmvUV7NvEsqQOKyH0pmIBFWXVQbiS0+OBbA=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + "ky": ["ky@1.8.2", "", {}, "sha512-XybQJ3d4Ea1kI27DoelE5ZCT3bSJlibYTtQuMsyzKox3TMyayw1asgQdl54WroAm+fIA3ZCr8zXW2RpR7qWVpA=="], "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], @@ -62,6 +74,8 @@ "magic-bytes.js": ["magic-bytes.js@1.12.1", "", {}, "sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA=="], + "msgpack-lite": ["msgpack-lite@0.1.26", "", { "dependencies": { "event-lite": "^0.1.1", "ieee754": "^1.1.8", "int64-buffer": "^0.1.9", "isarray": "^1.0.0" }, "bin": { "msgpack": "./bin/msgpack" } }, "sha512-SZ2IxeqZ1oRFGo0xFGbvBJWMp3yLIY9rlIJyxy8CGrwZn1f0ZK4r6jV/AM1r0FZMDUkWkglOk/eeKIL9g77Nxw=="], + "ts-mixer": ["ts-mixer@6.0.4", "", {}, "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], diff --git a/cmd/list.ts b/cmd/list.ts index 619bb26..466ee92 100644 --- a/cmd/list.ts +++ b/cmd/list.ts @@ -46,12 +46,12 @@ export async function renderList(user: User, userId: string, page: number): Prom const row = new ActionRowBuilder() .addComponents( new ButtonBuilder() - .setCustomId(b64encode({ dir: "prev", user: userId, page: pages })) + .setCustomId(b64encode({ direction: -1, user: userId, pages: pages })) .setLabel('<') .setStyle(ButtonStyle.Danger) .setDisabled(pages === 1), new ButtonBuilder() - .setCustomId(b64encode({ dir: "next", user: userId, page: pages })) + .setCustomId(b64encode({ direction: 1, user: userId, pages: pages })) .setLabel('>') .setStyle(ButtonStyle.Danger) .setDisabled(pages === totalPages) @@ -84,12 +84,12 @@ export const on: { // const { flags, ...reply } = dirtyReply; // await interaction.update({ ...reply }); - // new, clean code :sunglasses: + // new, clean code :sunglasses: (minified since discord limits ids to 100 chars) const data = b64decode<{ - dir: "next" | "prev"; + direction: -1 | 1; user: string; - page: number; + pages: number; }>(interaction.customId); if (interaction.user.id !== data.user) { @@ -97,7 +97,7 @@ export const on: { return; } - const page = data.dir === "next" ? data.page + 1 : data.page - 1; + const page = data.pages + data.direction; const dirty = await renderList(interaction.user, interaction.user.id, page); const { flags, ...r } = dirty; await interaction.update({ ...r }); diff --git a/lib/b64.ts b/lib/b64.ts index 485cff1..7f73ead 100644 --- a/lib/b64.ts +++ b/lib/b64.ts @@ -1,11 +1,13 @@ +import m from "msgpack-lite"; + // i actually love this export const b64encode = (obj: object): string => { - return Buffer.from(JSON.stringify(obj)).toString("base64url"); + return Buffer.from(m.encode(obj)).toString("base64url"); } export const b64decode = (str: string): T => { try { - return JSON.parse(Buffer.from(str, "base64url").toString()); + return m.decode(Buffer.from(str, "base64url")); } catch { throw new Error("invalid base64-encoded object string: " + str); } diff --git a/package.json b/package.json index 00a538b..76dd15c 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,15 @@ "type": "module", "private": true, "devDependencies": { - "@types/bun": "latest" + "@types/bun": "latest", + "@types/msgpack-lite": "^0.1.11" }, "peerDependencies": { "typescript": "^5" }, "dependencies": { "discord.js": "^14.21.0", - "ky": "^1.8.2" + "ky": "^1.8.2", + "msgpack-lite": "^0.1.26" } }