diff --git a/server/server.go b/server/server.go index 88fe35b..8779f90 100644 --- a/server/server.go +++ b/server/server.go @@ -4,6 +4,7 @@ import ( "net" "os" "path/filepath" + "server/tgbot" "strconv" "server/log" @@ -11,7 +12,7 @@ import ( "server/web" ) -func Start(port, ip, sslport, sslCert, sslKey string, sslEnabled, roSets, searchWA bool) { +func Start(port, ip, sslport, sslCert, sslKey string, sslEnabled, roSets, searchWA bool, tgtoken string) { settings.InitSets(roSets, searchWA) // https checks if sslEnabled { @@ -66,6 +67,8 @@ func Start(port, ip, sslport, sslCert, sslKey string, sslEnabled, roSets, search settings.Port = port settings.SslPort = sslport settings.IP = ip + + tgbot.Start(tgtoken) web.Start() } diff --git a/server/tgbot/bot.go b/server/tgbot/bot.go new file mode 100644 index 0000000..53e9252 --- /dev/null +++ b/server/tgbot/bot.go @@ -0,0 +1,102 @@ +package tgbot + +import ( + "errors" + tele "gopkg.in/telebot.v4" + "net/http" + "server/log" + "server/torr" + "strings" + "time" +) + +func Start(token string) { + pref := tele.Settings{ + Token: token, + Poller: &tele.LongPoller{Timeout: 5 * time.Minute}, + ParseMode: tele.ModeHTML, + Client: &http.Client{Timeout: 5 * time.Minute}, + } + + log.TLogln("Starting Telegram Bot") + + b, err := tele.NewBot(pref) + if err != nil { + log.TLogln("Error start tg bot:", err) + return + } + + //Commands + + b.Handle("help", help) + b.Handle("Help", help) + b.Handle("/help", help) + b.Handle("/Help", help) + b.Handle("/start", help) + + b.Handle("/list", list) + + //Text + b.Handle(tele.OnText, func(c tele.Context) error { + txt := c.Text() + if strings.HasPrefix(strings.ToLower(txt), "magnet:") || isHash(txt) { + return addTorrent(c, txt) + } else { + return c.Send("Вставьте магнет/хэш торрента чтоб добавить его на сервер") + } + }) + + b.Handle(tele.OnCallback, func(c tele.Context) error { + args := c.Args() + if len(args) > 0 { + if args[0] == "\ffiles" { + t := torr.GetTorrent(args[1]) + if t == nil { + c.Send("Torrent not connected:", args[1]) + } else { + + } + return nil + } + if args[0] == "\fdelete" { + return nil + } + } + return errors.New("Ошибка кнопка не распознана") + }) + + go b.Start() +} + +func help(c tele.Context) error { + return c.Send("Бот для управления TorrServer\n\n" + + "Список комманд:\n" + + " /help - эта справка\n" + + " /list - показать список торрентов на сервере") +} + +func list(c tele.Context) error { + list := torr.ListTorrent() + + for _, t := range list { + btnFiles := tele.InlineButton{Text: "Файлы", Unique: "files", Data: t.Hash().String()} + btnDelete := tele.InlineButton{Text: "Удалить", Unique: "delete", Data: t.Hash().String()} + torrKbd := &tele.ReplyMarkup{InlineKeyboard: [][]tele.InlineButton{{btnFiles, btnDelete}}} + c.Send(t.Title, torrKbd) + } + return nil +} + +func isHash(txt string) bool { + if len(txt) == 40 { + for _, c := range strings.ToLower(txt) { + switch c { + case 'a', 'b', 'c', 'd', 'e', 'f', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + default: + return false + } + } + return true + } + return false +} diff --git a/server/tgbot/tshelper.go b/server/tgbot/tshelper.go new file mode 100644 index 0000000..2734498 --- /dev/null +++ b/server/tgbot/tshelper.go @@ -0,0 +1,58 @@ +package tgbot + +import ( + tele "gopkg.in/telebot.v4" + "server/log" + set "server/settings" + "server/torr" + "server/web/api/utils" + "strings" +) + +func addTorrent(c tele.Context, link string) error { + log.TLogln("tg add torrent", link) + link = strings.ReplaceAll(link, "&", "&") + torrSpec, err := utils.ParseLink(link) + + if err != nil { + log.TLogln("tg error parse link:", err) + return err + } + + tor, err := torr.AddTorrent(torrSpec, "", "", "", "") + + if tor.Data != "" && set.BTsets.EnableDebug { + log.TLogln("torrent data:", tor.Data) + } + if tor.Category != "" && set.BTsets.EnableDebug { + log.TLogln("torrent category:", tor.Category) + } + + if err != nil { + log.TLogln("tg error add torrent:", err) + return err + } + + go func() { + if !tor.GotInfo() { + log.TLogln("tg error add torrent: timeout connection get torrent info") + c.Send("Ошибка при добаваления торрента: timeout connection get torrent info") + return + } + + if tor.Title == "" { + tor.Title = torrSpec.DisplayName // prefer dn over name + tor.Title = strings.ReplaceAll(tor.Title, "rutor.info", "") + tor.Title = strings.ReplaceAll(tor.Title, "_", " ") + tor.Title = strings.Trim(tor.Title, " ") + if tor.Title == "" { + tor.Title = tor.Name() + } + } + + torr.SaveTorrentToDB(tor) + c.Send("Торрент добавлен: " + link + "") + }() + + return nil +}