117 lines
2.3 KiB
Go
117 lines
2.3 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"log"
|
||
|
"net/url"
|
||
|
"os"
|
||
|
"strings"
|
||
|
|
||
|
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
|
||
|
"nulo.in/dlbot/common"
|
||
|
"nulo.in/dlbot/instagram"
|
||
|
"nulo.in/dlbot/tiktok"
|
||
|
)
|
||
|
|
||
|
type Responder func(bot *tgbotapi.BotAPI, update tgbotapi.Update, url *url.URL) common.Result
|
||
|
type Config struct {
|
||
|
Responders []Responder
|
||
|
}
|
||
|
|
||
|
func (config Config) handleMessage(bot *tgbotapi.BotAPI, update tgbotapi.Update) {
|
||
|
var explicit bool
|
||
|
|
||
|
msg := update.Message
|
||
|
if strings.HasPrefix(msg.Text, "/dl") || msg.Chat.IsPrivate() {
|
||
|
explicit = true
|
||
|
}
|
||
|
|
||
|
searchMsg := msg
|
||
|
if msg.ReplyToMessage != nil && explicit {
|
||
|
searchMsg = msg.ReplyToMessage
|
||
|
}
|
||
|
|
||
|
hasDownloadables := false
|
||
|
|
||
|
for i := 0; i < len(searchMsg.Entities); i++ {
|
||
|
e := searchMsg.Entities[i]
|
||
|
if e.Type != "url" {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
urlString := searchMsg.Text[e.Offset : e.Offset+e.Length]
|
||
|
url, err := url.Parse(urlString)
|
||
|
if err != nil {
|
||
|
if explicit {
|
||
|
bot.Send(common.RespondWithMany(msg, "No se pudo detectar la URL ", urlString, "."))
|
||
|
}
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
var result common.Result
|
||
|
for _, respond := range config.Responders {
|
||
|
result = respond(bot, update, url)
|
||
|
if result != common.NotValid {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if explicit && result == common.NotValid {
|
||
|
bot.Send(common.RespondWithMany(msg, "La URL ", urlString, " no es compatible con este bot."))
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if result == common.HadError || result == common.Uploaded {
|
||
|
hasDownloadables = true
|
||
|
}
|
||
|
|
||
|
if result == common.HadError {
|
||
|
bot.Send(common.RespondWithMany(update.Message, "Hubo un error al descargar ", urlString, "."))
|
||
|
continue
|
||
|
}
|
||
|
}
|
||
|
if !hasDownloadables && explicit {
|
||
|
bot.Send(common.RespondWithMany(msg, "No encontré URLs descargables en ese mensaje."))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
config := Config{
|
||
|
Responders: []Responder{
|
||
|
instagram.Respond,
|
||
|
tiktok.Respond,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
token := os.Getenv("TELEGRAM_TOKEN")
|
||
|
if token == "" {
|
||
|
log.Panic("No telegram token")
|
||
|
}
|
||
|
|
||
|
var debug bool
|
||
|
if os.Getenv("DEBUG") != "" {
|
||
|
debug = true
|
||
|
}
|
||
|
|
||
|
bot, err := tgbotapi.NewBotAPI(token)
|
||
|
if err != nil {
|
||
|
log.Panic(err)
|
||
|
}
|
||
|
|
||
|
bot.Debug = debug
|
||
|
|
||
|
log.Printf("Authorized on account %s", bot.Self.UserName)
|
||
|
|
||
|
u := tgbotapi.NewUpdate(0)
|
||
|
u.Timeout = 60
|
||
|
|
||
|
updates := bot.GetUpdatesChan(u)
|
||
|
|
||
|
for update := range updates {
|
||
|
if update.Message == nil {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
go config.handleMessage(bot, update)
|
||
|
}
|
||
|
}
|