// Package tgbot — Telegram-адаптер: приём magnet/пересланных сообщений // торрент-бота, подтверждение раскладки кнопками и исходящие пинги. package tgbot import ( "regexp" "strings" ) var ( magnetRe = regexp.MustCompile(`magnet:\?[^\s]+`) // parenURL — markdown-хвост " (https://…)" в строках сообщения бота. parenURL = regexp.MustCompile(`\s*\(https?://[^)]+\)`) ) // noisePrefixes — начала строк UI торрент-бота, которые в контекст не несём. var noisePrefixes = []string{ "Открыть magnet", "или получить .torrent", "Оценить", "Следить", "В закладки", "Добавить в закладки", "cправка", "справка", "[список файлов]", "[список файлов]", "⚡", "сохранённая копия", } // ParseMessage извлекает из текста magnet-ссылку и человекочитаемый контекст // (заголовок релиза без ссылок, команд и UI-мусора бота). ok=false, если // magnet не найден. Текст может быть как «сырым» magnet, так и пересланным // сообщением торрент-бота (формат — см. tmp/examples.md). func ParseMessage(text string) (source, context string, ok bool) { m := magnetRe.FindString(text) if m == "" { return "", "", false } return m, cleanContext(text, m), true } // cleanContext оставляет содержательные строки (заголовок, метаданные), // выкидывая ссылки, команды (/...) и UI-строки бота. func cleanContext(text, magnet string) string { var keep []string for _, line := range strings.Split(text, "\n") { line = strings.TrimSpace(line) if line == "" || strings.Contains(line, magnet) { continue } if isNoise(line) { continue } line = strings.TrimSpace(parenURL.ReplaceAllString(line, "")) if line != "" { keep = append(keep, line) } } return strings.Join(keep, "\n") } func isNoise(line string) bool { if strings.HasPrefix(line, "/") { return true } // Строки-ссылки и строки рейтинга/команд бота (содержат /g_ /r_ /us_ …). if strings.Contains(line, "hashurl.ru") || strings.Contains(line, "exfreedomist.com") { return true } for _, p := range noisePrefixes { if strings.HasPrefix(line, p) { return true } } // Строки вида "👍: /g_ad035f или 👎🏿: /r_ad035f". if strings.Contains(line, ": /") { return true } return false }