fix(discord): land proxy/media/reaction/model-picker regressions

Reimplements core Discord fixes from #25277 #25523 #25575 #25588 #25731 with expanded tests.

- thread proxy-aware fetch into inbound attachment/sticker downloads
- fetch /gateway/bot via proxy dispatcher before ws connect
- wire statusReactions emojis/timing overrides into controller
- compact model-picker custom_id keys with backward-compatible parsing

Co-authored-by: openperf <openperf@users.noreply.github.com>
Co-authored-by: chilu18 <chilu18@users.noreply.github.com>
Co-authored-by: Yipsh <Yipsh@users.noreply.github.com>
Co-authored-by: lbo728 <lbo728@users.noreply.github.com>
Co-authored-by: s1korrrr <s1korrrr@users.noreply.github.com>
This commit is contained in:
Peter Steinberger
2026-02-25 00:03:21 +00:00
parent 55cf92578d
commit 97e56cb73c
12 changed files with 265 additions and 23 deletions

View File

@@ -2,7 +2,7 @@ import type { ChannelType, Client, Message } from "@buape/carbon";
import { StickerFormatType, type APIAttachment, type APIStickerItem } from "discord-api-types/v10";
import { buildMediaPayload } from "../../channels/plugins/media-payload.js";
import { logVerbose } from "../../globals.js";
import { fetchRemoteMedia } from "../../media/fetch.js";
import { fetchRemoteMedia, type FetchLike } from "../../media/fetch.js";
import { saveMediaBuffer } from "../../media/store.js";
export type DiscordMediaInfo = {
@@ -161,6 +161,7 @@ export function hasDiscordMessageStickers(message: Message): boolean {
export async function resolveMediaList(
message: Message,
maxBytes: number,
fetchImpl?: FetchLike,
): Promise<DiscordMediaInfo[]> {
const out: DiscordMediaInfo[] = [];
await appendResolvedMediaFromAttachments({
@@ -168,12 +169,14 @@ export async function resolveMediaList(
maxBytes,
out,
errorPrefix: "discord: failed to download attachment",
fetchImpl,
});
await appendResolvedMediaFromStickers({
stickers: resolveDiscordMessageStickers(message),
maxBytes,
out,
errorPrefix: "discord: failed to download sticker",
fetchImpl,
});
return out;
}
@@ -181,6 +184,7 @@ export async function resolveMediaList(
export async function resolveForwardedMediaList(
message: Message,
maxBytes: number,
fetchImpl?: FetchLike,
): Promise<DiscordMediaInfo[]> {
const snapshots = resolveDiscordMessageSnapshots(message);
if (snapshots.length === 0) {
@@ -193,12 +197,14 @@ export async function resolveForwardedMediaList(
maxBytes,
out,
errorPrefix: "discord: failed to download forwarded attachment",
fetchImpl,
});
await appendResolvedMediaFromStickers({
stickers: snapshot.message ? resolveDiscordSnapshotStickers(snapshot.message) : [],
maxBytes,
out,
errorPrefix: "discord: failed to download forwarded sticker",
fetchImpl,
});
}
return out;
@@ -209,6 +215,7 @@ async function appendResolvedMediaFromAttachments(params: {
maxBytes: number;
out: DiscordMediaInfo[];
errorPrefix: string;
fetchImpl?: FetchLike;
}) {
const attachments = params.attachments;
if (!attachments || attachments.length === 0) {
@@ -220,6 +227,7 @@ async function appendResolvedMediaFromAttachments(params: {
url: attachment.url,
filePathHint: attachment.filename ?? attachment.url,
maxBytes: params.maxBytes,
fetchImpl: params.fetchImpl,
});
const saved = await saveMediaBuffer(
fetched.buffer,
@@ -296,6 +304,7 @@ async function appendResolvedMediaFromStickers(params: {
maxBytes: number;
out: DiscordMediaInfo[];
errorPrefix: string;
fetchImpl?: FetchLike;
}) {
const stickers = params.stickers;
if (!stickers || stickers.length === 0) {
@@ -310,6 +319,7 @@ async function appendResolvedMediaFromStickers(params: {
url: candidate.url,
filePathHint: candidate.fileName,
maxBytes: params.maxBytes,
fetchImpl: params.fetchImpl,
});
const saved = await saveMediaBuffer(
fetched.buffer,