layout: непомещающееся целевое имя уводит задачу в review вместо failed

- предел длины компонента (255 байт) проверяется в BuildLinks до первой
  операции с ФС: ни каталога, ни ссылки при отказе не создаётся
- причина пустого предпросмотра считается на показе (ReviewData.PreviewError)
  и печатается в панели действий и в карточке Telegram: у задачи без
  записанной причины взять её больше неоткуда
This commit is contained in:
av
2026-08-10 12:16:44 +03:00
parent 1710e5a9d5
commit b9f0929d0c
31 changed files with 1511 additions and 17 deletions
+15
View File
@@ -89,11 +89,26 @@ func (b *Bot) reviewCard(rd *worker.ReviewData) (string, *tgbotapi.InlineKeyboar
}
if n := len(rd.Preview); n > 0 {
fmt.Fprintf(&sb, "План: %d файлов → %s", n, esc(tailPath(rd.Preview[0].Dst)))
} else if why := previewProblem(rd); why != "" {
// Плана нет — без этой строки карточка молчит о том, почему нет и «Применить».
// Причина показа (PreviewError) старше записанной: она про текущий план, а
// error_msg остался от последнего перехода.
fmt.Fprintf(&sb, "Не удаётся построить план: %s", esc(shorten(why, 120)))
}
return strings.TrimRight(sb.String(), "\n"), b.reviewKeyboard(rd)
}
// previewProblem — почему у задачи в review нет плана: причина, посчитанная на
// показе, либо записанная при последнем переходе. Пусто — объяснять нечего
// (источник ещё не подтверждён).
func previewProblem(rd *worker.ReviewData) string {
if rd.PreviewError != "" {
return rd.PreviewError
}
return rd.Download.ErrorMsg.String
}
func (b *Bot) reviewKeyboard(rd *worker.ReviewData) *tgbotapi.InlineKeyboardMarkup {
id := rd.Download.ID
sid := id