74 lines
2.7 KiB
Go
74 lines
2.7 KiB
Go
// 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
|
||
}
|