mirror of
https://github.com/Ernous/TorrServerJellyfin.git
synced 2025-12-20 14:06:09 +05:00
154 lines
3.7 KiB
Go
154 lines
3.7 KiB
Go
package tgbot
|
||
|
||
import (
|
||
"errors"
|
||
tele "gopkg.in/telebot.v4"
|
||
"gopkg.in/telebot.v4/middleware"
|
||
"net/http"
|
||
"server/log"
|
||
"server/tgbot/config"
|
||
up "server/tgbot/upload"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
func Start(token string) {
|
||
config.LoadConfig()
|
||
|
||
pref := tele.Settings{
|
||
URL: config.Cfg.HostTG,
|
||
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
|
||
}
|
||
|
||
if len(config.Cfg.WhiteIds) > 0 {
|
||
b.Use(middleware.Whitelist(config.Cfg.WhiteIds...))
|
||
}
|
||
if len(config.Cfg.BlackIds) > 0 {
|
||
b.Use(middleware.Blacklist(config.Cfg.BlackIds...))
|
||
}
|
||
|
||
//Commands
|
||
b.Handle("help", help)
|
||
b.Handle("Help", help)
|
||
b.Handle("/help", help)
|
||
b.Handle("/Help", help)
|
||
b.Handle("/start", help)
|
||
b.Handle("/id", help)
|
||
|
||
b.Handle("/list", list)
|
||
b.Handle("/clear", clear)
|
||
|
||
//Text
|
||
b.Handle(tele.OnText, func(c tele.Context) error {
|
||
txt := c.Text()
|
||
if strings.HasPrefix(strings.ToLower(txt), "magnet:") || isHash(txt) {
|
||
err := addTorrent(c, txt)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
return list(c)
|
||
} else if c.Message().ReplyTo != nil && c.Message().ReplyTo.ReplyMarkup != nil && len(c.Message().ReplyTo.ReplyMarkup.InlineKeyboard) > 0 {
|
||
data := c.Message().ReplyTo.ReplyMarkup.InlineKeyboard[0][0].Data
|
||
if strings.HasPrefix(strings.ToLower(data), "\fall|") {
|
||
hash := strings.TrimPrefix(data, "\fall|")
|
||
from, to, err := ParseRange(c.Message().Text)
|
||
if err != nil {
|
||
c.Send("Ошибка, нужно указывать числа, пример: 2-12")
|
||
return err
|
||
}
|
||
up.AddRange(c, hash, from, to)
|
||
}
|
||
return nil
|
||
} else {
|
||
return c.Send("Вставьте магнет/хэш торрента чтоб добавить его на сервер")
|
||
}
|
||
})
|
||
|
||
b.Handle(tele.OnCallback, func(c tele.Context) error {
|
||
args := c.Args()
|
||
if len(args) > 0 {
|
||
if args[0] == "\ffiles" {
|
||
return files(c)
|
||
}
|
||
if args[0] == "\fdelete" {
|
||
deleteTorrent(c)
|
||
return list(c)
|
||
}
|
||
if args[0] == "\fupload" {
|
||
return upload(c)
|
||
}
|
||
if args[0] == "\fuploadall" {
|
||
uploadall(c)
|
||
return nil
|
||
}
|
||
if args[0] == "\fcancel" {
|
||
if num, err := strconv.Atoi(args[1]); err == nil {
|
||
up.Cancel(num)
|
||
c.Bot().Delete(c.Callback().Message)
|
||
return nil
|
||
}
|
||
}
|
||
}
|
||
return errors.New("Ошибка кнопка не распознана")
|
||
})
|
||
|
||
up.Start()
|
||
|
||
go b.Start()
|
||
}
|
||
|
||
func help(c tele.Context) error {
|
||
id := strconv.FormatInt(c.Sender().ID, 10)
|
||
return c.Send("Бот для управления TorrServer\n\n" +
|
||
"Список комманд:\n" +
|
||
" /help - Эта справка\n" +
|
||
" /list - Показать список торрентов на сервере\n" +
|
||
" /clear - Удалить все торренты\n\n" +
|
||
"Ваш id: <code>" + id + "</code>, " + strings.Join([]string{c.Sender().Username, c.Sender().FirstName, c.Sender().LastName}, ", "))
|
||
}
|
||
|
||
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
|
||
}
|
||
|
||
func ParseRange(rng string) (int, int, error) {
|
||
parts := strings.Split(rng, "-")
|
||
|
||
if len(parts) != 2 {
|
||
return -1, -1, errors.New("Неверный формат строки")
|
||
}
|
||
|
||
num1, err1 := strconv.Atoi(strings.TrimSpace(parts[0]))
|
||
if err1 != nil {
|
||
return -1, -1, err1
|
||
}
|
||
|
||
num2, err2 := strconv.Atoi(strings.TrimSpace(parts[1]))
|
||
if err2 != nil {
|
||
return -1, -1, err2
|
||
}
|
||
return num1, num2, nil
|
||
}
|