Релиз 1.3.6: фото из MAX, которое Telegram не берёт как фото, приходит файлом, а не «[фото]»; подпись пересылки — название чата-источника (личный — собеседник) без «MAX chat N»; комментарии — HEIC из MAX приходит WebP (проверено вживую), ветка форматов — подстраховка; новость на сайте

This commit is contained in:
Folist 2026-10-13 12:12:36 +03:00
parent 6f89576896
commit 7e50dcd810
9 changed files with 46 additions and 21 deletions

View file

@ -2,6 +2,11 @@
Пользовательские описания релизов. Именно ЭТОТ файл (не заголовки коммитов) показывается в уведомлении об обновлении: раздел на версию, пункты — строки, начинающиеся с «- ». Заполняется ПЕРЕД тегированием релиза — scripts/release.sh откажется публиковать версию без её раздела здесь. Коммиты остаются техническими и пользователям не показываются.
## 1.3.6 — 2026-10-13
- Фото из MAX, которое Telegram не принимает как фото (слишком большое по габаритам или в формате, который Telegram не показывает), приходит файлом, а не заглушкой «[фото]»
- Пересланное сообщение подписано названием чата, откуда переслали: личный чат — именем собеседника. Вместо непонятного «MAX chat …» — просто «Переслано (от …)»
## 1.3.5 — 2026-10-13
- «➕ В контакты MAX» — в карточке найденного человека (поиск по номеру, MAX ID или контакт из Telegram) и в /info: в личке собеседник добавляется сразу, в группе — выбранный участник. Контакт из Telegram сохраняется под тем же именем, что у вас в Telegram

View file

@ -32,7 +32,7 @@
"downloadUrl": "https://github.com/Trollobot/Telemax",
"license": "https://www.gnu.org/licenses/agpl-3.0.html",
"image": "https://telemax.svnest.ru/og.png",
"softwareVersion": "1.3.5",
"softwareVersion": "1.3.6",
"dateModified": "2026-10-13",
"offers": { "@type": "Offer", "price": "0", "priceCurrency": "RUB" }
}
@ -294,7 +294,7 @@
<a class="btn btn-ghost" href="https://github.com/Trollobot/Telemax">Открыть на GitHub</a>
</div>
<!-- news:latest -->
<a class="newsbar" href="news/#v1.3.5"><span class="nb-tag">Новое · v1.3.5</span><span class="nb-text">📡 Трансляция чатов и контакты MAX</span><span class="nb-go" aria-hidden="true">→</span></a>
<a class="newsbar" href="news/#v1.3.6"><span class="nb-tag">Новое · v1.3.6</span><span class="nb-text">🖼️ Фото из MAX больше не теряются</span><span class="nb-go" aria-hidden="true">→</span></a>
<!-- /news:latest -->
<div class="flow" id="flow" data-scene="chat" role="region" aria-label="Как работает Telemax: MAX, ваш сервер и Telegram">

View file

@ -7,6 +7,13 @@
<description>Что нового в Telemax — бесплатном мосте MAX ↔ Telegram с открытым кодом</description>
<language>ru</language>
<lastBuildDate>Tue, 13 Oct 2026 09:00:00 GMT</lastBuildDate>
<item>
<title>Telemax 1.3.6: Фото из MAX больше не теряются</title>
<link>https://telemax.svnest.ru/news/#v1.3.6</link>
<guid isPermaLink="false">telemax-1.3.6</guid>
<pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
<description><![CDATA[<ul><li>Фото из MAX, которое Telegram не принимает как фото (слишком большое по габаритам или в формате, который Telegram не показывает), приходит файлом, а не заглушкой «[фото]»</li><li><b>Пересланное сообщение подписано названием чата, откуда переслали:</b> личный чат — именем собеседника. Вместо непонятного «MAX chat …» — просто «Переслано (от …)»</li></ul>]]></description>
</item>
<item>
<title>Telemax 1.3.5: Трансляция чатов и контакты MAX</title>
<link>https://telemax.svnest.ru/news/#v1.3.5</link>
@ -210,12 +217,5 @@
<pubDate>Sat, 22 Aug 2026 09:00:00 GMT</pubDate>
<description><![CDATA[<ul><li><b>Ростер группы:</b> кнопка «Открыть личку» → список участников → тап открывает 1:1</li></ul>]]></description>
</item>
<item>
<title>Telemax 0.4.4: Состав группы в карточке</title>
<link>https://telemax.svnest.ru/news/#v0.4.4</link>
<guid isPermaLink="false">telemax-0.4.4</guid>
<pubDate>Sat, 22 Aug 2026 09:00:00 GMT</pubDate>
<description><![CDATA[<ul><li>Ростер участников группы в карточке + свои сообщения метятся «Вы» при синхронизации</li></ul>]]></description>
</item>
</channel>
</rss>

View file

@ -4,13 +4,13 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Новости Telemax — что нового в мосте MAX ↔ Telegram</title>
<meta name="description" content="Что нового в Telemax: все версии моста MAX ↔ Telegram по-человечески. Последняя — 1.3.5 от 13 октября 2026: Трансляция чатов и контакты MAX.">
<meta name="description" content="Что нового в Telemax: все версии моста MAX ↔ Telegram по-человечески. Последняя — 1.3.6 от 13 октября 2026: Фото из MAX больше не теряются.">
<link rel="canonical" href="https://telemax.svnest.ru/news/">
<link rel="alternate" type="application/rss+xml" title="Новости Telemax" href="https://telemax.svnest.ru/news/feed.xml">
<meta property="og:type" content="website">
<meta property="og:locale" content="ru_RU">
<meta property="og:site_name" content="Telemax">
<meta property="og:title" content="Новости Telemax — Трансляция чатов и контакты MAX">
<meta property="og:title" content="Новости Telemax — Фото из MAX больше не теряются">
<meta property="og:description" content="Все версии моста MAX ↔ Telegram: что появилось и что починили.">
<meta property="og:url" content="https://telemax.svnest.ru/news/">
<meta property="og:image" content="https://telemax.svnest.ru/og.png">
@ -24,6 +24,16 @@
"url": "https://telemax.svnest.ru/news/",
"inLanguage": "ru",
"blogPost": [
{
"@type": "BlogPosting",
"headline": "Telemax 1.3.6: Фото из MAX больше не теряются",
"datePublished": "2026-10-13",
"url": "https://telemax.svnest.ru/news/#v1.3.6",
"author": {
"@type": "Organization",
"name": "Telemax"
}
},
{
"@type": "BlogPosting",
"headline": "Telemax 1.3.5: Трансляция чатов и контакты MAX",
@ -260,18 +270,26 @@
<h1>Что нового в Telemax</h1>
<p class="lead">Каждая версия моста — коротко и по-человечески. О новой версии бот сам скажет в группе, а обновиться можно одной кнопкой «Обновить» в <code>/version</code>.</p>
<div class="actions">
<a class="btn btn-primary" href="#v1.3.5">📡 Версия 1.3.5</a>
<a class="btn btn-primary" href="#v1.3.6">🖼️ Версия 1.3.6</a>
<a class="btn btn-ghost" href="feed.xml">📡 RSS-лента</a>
<a class="btn btn-ghost" href="../#how">Как установить</a>
</div>
<div class="facts">
<span class="fact">Последняя версия — <b>1.3.5</b>, 13 октября 2026</span>
<span class="fact"><b>33</b> версий с 22 августа 2026</span>
<span class="fact">Последняя версия — <b>1.3.6</b>, 13 октября 2026</span>
<span class="fact"><b>34</b> версий с 22 августа 2026</span>
</div>
</div>
<div class="feed">
<div class="month"><h2 class="mh">Октябрь 2026</h2>
<article class="rel" id="v1.3.6">
<div class="meta"><a class="ver" href="#v1.3.6" title="Ссылка на эту новость">v1.3.6</a><time datetime="2026-10-13">13 октября</time></div>
<h3><span class="em" aria-hidden="true">🖼️</span> Фото из MAX больше не теряются</h3>
<ul>
<li>Фото из MAX, которое Telegram не принимает как фото (слишком большое по габаритам или в формате, который Telegram не показывает), приходит файлом, а не заглушкой «[фото]»</li>
<li><b>Пересланное сообщение подписано названием чата, откуда переслали:</b> личный чат — именем собеседника. Вместо непонятного «MAX chat …» — просто «Переслано (от …)»</li>
</ul>
</article>
<article class="rel" id="v1.3.5">
<div class="meta"><a class="ver" href="#v1.3.5" title="Ссылка на эту новость">v1.3.5</a><time datetime="2026-10-13">13 октября</time></div>
<h3><span class="em" aria-hidden="true">📡</span> Трансляция чатов и контакты MAX</h3>

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "telemax",
"version": "1.3.6-beta.1",
"version": "1.3.6",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "telemax",
"version": "1.3.6-beta.1",
"version": "1.3.6",
"license": "AGPL-3.0-only",
"dependencies": {
"dotenv": "^17.2.3",

View file

@ -2,7 +2,7 @@
"name": "telemax",
"private": true,
"license": "AGPL-3.0-only",
"version": "1.3.6-beta.1",
"version": "1.3.6",
"type": "module",
"scripts": {
"dev": "tsx watch src/server/app.ts",

View file

@ -1,4 +1,5 @@
{
"1.3.6": { "emoji": "🖼️", "title": "Фото из MAX больше не теряются" },
"1.3.5": { "emoji": "📡", "title": "Трансляция чатов и контакты MAX" },
"1.3.4": { "emoji": "🔑", "title": "Вход в MAX снова работает" },
"1.3.3": { "emoji": "🧭", "title": "Большие файлы: понятные причины сбоев и отправка с сервера" },

View file

@ -236,7 +236,7 @@ export function imageExtension(buf: Uint8Array): string {
return 'jpg';
}
/** Image formats Telegram doesn't take as a photo — they go as a file straight away instead of a doomed sendPhoto. */
/** Image formats Telegram doesn't take as a photo — they go as a file straight away instead of a doomed sendPhoto. A safety net: MAX serves its photos as its own WebP/JPEG copies (a HEIC came as WebP, live 2026-10-13). */
export const PHOTO_AS_FILE = new Set(['heic', 'tiff', 'avif']);
async function downloadAttachmentOrThrow(att: MaxAttachment, ctx: DownloadContext): Promise<DownloadedAttachment | null> {

View file

@ -699,9 +699,10 @@ async function sendOneAttachment(
}
const source = { source: downloaded.buffer, filename: downloaded.filename };
if (kind === 'photo') {
// MAX takes images Telegram won't show as a photo: HEIC/TIFF (format), or past sendPhoto's
// 10 000 px (width + height) or 20:1 — MAX allows 7680×7680. Such a picture goes as a file
// instead of a «[фото]» placeholder (seen live 2026-10-13 on a user's bridge).
// A safety net: MAX takes images Telegram won't show as a photo — past sendPhoto's 10 000 px
// (width + height) or 20:1 (MAX allows 7680×7680), or in a format like TIFF. Such a picture goes
// as a file instead of a «[фото]» placeholder. In practice MAX hands out its own compressed copy:
// a HEIC sent from the MAX app came as a 78 KB WebP (live 2026-10-13), so HEIC never gets here.
const ext = downloaded.filename.split('.').pop() ?? 'jpg';
if (ext !== 'jpg') logger.info(`MAX photo arrived as ${ext} (${downloaded.buffer.byteLength} bytes)`);
if (PHOTO_AS_FILE.has(ext)) return withFloodRetry(() => bot.telegram.sendDocument(groupId, source, opts));