Telegram/Discord: honor outbound mediaMaxMb uploads (#38065)

* Telegram: default media cap to 100MB

* Telegram: honor outbound mediaMaxMb

* Discord: add shared media upload cap

* Discord: pass mediaMaxMb to outbound sends

* Telegram: cover outbound media cap sends

* Discord: cover media upload cap config

* Docs: update Telegram media cap guide

* Docs: update Telegram config reference

* Changelog: note media upload cap fix

* Docs: note Discord upload cap behavior
This commit is contained in:
Vincent Koc
2026-03-06 10:53:06 -05:00
committed by GitHub
parent 9917a3fb77
commit 9c1786bdd6
10 changed files with 112 additions and 6 deletions

View File

@@ -262,7 +262,7 @@ export function createTelegramBot(opts: TelegramBotOptions) {
});
const useAccessGroups = cfg.commands?.useAccessGroups !== false;
const ackReactionScope = cfg.messages?.ackReactionScope ?? "group-mentions";
const mediaMaxBytes = (opts.mediaMaxMb ?? telegramCfg.mediaMaxMb ?? 5) * 1024 * 1024;
const mediaMaxBytes = (opts.mediaMaxMb ?? telegramCfg.mediaMaxMb ?? 100) * 1024 * 1024;
const logger = getChildLogger({ module: "telegram-auto-reply" });
const streamMode = resolveTelegramStreamMode(telegramCfg);
const resolveGroupPolicy = (chatId: string | number) =>

View File

@@ -1149,6 +1149,69 @@ describe("sendMessageTelegram", () => {
});
expect(res.messageId).toBe("59");
});
it("defaults outbound media uploads to 100MB", async () => {
const chatId = "123";
const sendPhoto = vi.fn().mockResolvedValue({
message_id: 60,
chat: { id: chatId },
});
const api = { sendPhoto } as unknown as {
sendPhoto: typeof sendPhoto;
};
mockLoadedMedia({
buffer: Buffer.from("fake-image"),
contentType: "image/jpeg",
fileName: "photo.jpg",
});
await sendMessageTelegram(chatId, "photo", {
token: "tok",
api,
mediaUrl: "https://example.com/photo.jpg",
});
expect(loadWebMedia).toHaveBeenCalledWith(
"https://example.com/photo.jpg",
expect.objectContaining({ maxBytes: 100 * 1024 * 1024 }),
);
});
it("uses configured telegram mediaMaxMb for outbound uploads", async () => {
const chatId = "123";
const sendPhoto = vi.fn().mockResolvedValue({
message_id: 61,
chat: { id: chatId },
});
const api = { sendPhoto } as unknown as {
sendPhoto: typeof sendPhoto;
};
loadConfig.mockReturnValue({
channels: {
telegram: {
mediaMaxMb: 42,
},
},
});
mockLoadedMedia({
buffer: Buffer.from("fake-image"),
contentType: "image/jpeg",
fileName: "photo.jpg",
});
await sendMessageTelegram(chatId, "photo", {
token: "tok",
api,
mediaUrl: "https://example.com/photo.jpg",
});
expect(loadWebMedia).toHaveBeenCalledWith(
"https://example.com/photo.jpg",
expect.objectContaining({ maxBytes: 42 * 1024 * 1024 }),
);
});
});
describe("reactMessageTelegram", () => {

View File

@@ -473,6 +473,9 @@ export async function sendMessageTelegram(
verbose: opts.verbose,
});
const mediaUrl = opts.mediaUrl?.trim();
const mediaMaxBytes =
opts.maxBytes ??
(typeof account.config.mediaMaxMb === "number" ? account.config.mediaMaxMb : 100) * 1024 * 1024;
const replyMarkup = buildInlineKeyboard(opts.buttons);
const threadParams = buildTelegramThreadReplyParams({
@@ -563,7 +566,7 @@ export async function sendMessageTelegram(
const media = await loadWebMedia(
mediaUrl,
buildOutboundMediaLoadOptions({
maxBytes: opts.maxBytes,
maxBytes: mediaMaxBytes,
mediaLocalRoots: opts.mediaLocalRoots,
}),
);