111 lines
3.4 KiB
Go
111 lines
3.4 KiB
Go
package bot
|
|
|
|
import (
|
|
"os"
|
|
|
|
"github.com/duke-git/lancet/v2/slice"
|
|
"github.com/krau/SaveAny-Bot/config"
|
|
"github.com/krau/SaveAny-Bot/logger"
|
|
"github.com/mymmrac/telego"
|
|
"github.com/mymmrac/telego/telegohandler"
|
|
"github.com/mymmrac/telego/telegoutil"
|
|
)
|
|
|
|
var (
|
|
Bot *telego.Bot
|
|
)
|
|
|
|
func Init() {
|
|
logger.L.Debug("Initializing bot...")
|
|
var err error
|
|
Bot, err = telego.NewBot(
|
|
config.Cfg.Telegram.Token,
|
|
telego.WithDefaultLogger(false, true),
|
|
telego.WithAPIServer(config.Cfg.Telegram.API),
|
|
)
|
|
if err != nil {
|
|
logger.L.Fatal("Failed to create bot: ", err)
|
|
os.Exit(1)
|
|
}
|
|
Bot.SetMyCommands(&telego.SetMyCommandsParams{
|
|
Commands: []telego.BotCommand{
|
|
{Command: "start", Description: "开始使用"},
|
|
{Command: "help", Description: "显示帮助"},
|
|
{Command: "silent", Description: "静默模式"},
|
|
{Command: "storage", Description: "设置默认存储位置"},
|
|
{Command: "save", Description: "保存文件"},
|
|
{Command: "clean", Description: "清除文件记录"},
|
|
},
|
|
})
|
|
logger.L.Debug("Bot initialized")
|
|
}
|
|
|
|
func Run() {
|
|
if Bot == nil {
|
|
Init()
|
|
}
|
|
logger.L.Info("Start polling...")
|
|
updates, err := Bot.UpdatesViaLongPolling(&telego.GetUpdatesParams{
|
|
Offset: -1,
|
|
AllowedUpdates: []string{
|
|
telego.MessageUpdates,
|
|
telego.CallbackQueryUpdates,
|
|
},
|
|
})
|
|
if err != nil {
|
|
logger.L.Fatal("Failed to start polling: ", err)
|
|
os.Exit(1)
|
|
}
|
|
botHandler, err := telegohandler.NewBotHandler(Bot, updates)
|
|
if err != nil {
|
|
logger.L.Fatal("Failed to create bot handler: ", err)
|
|
os.Exit(1)
|
|
}
|
|
defer botHandler.Stop()
|
|
defer Bot.StopLongPolling()
|
|
|
|
botHandler.Use(telegohandler.PanicRecovery())
|
|
baseGroup := botHandler.BaseGroup()
|
|
|
|
registerHandlers(baseGroup)
|
|
|
|
botHandler.Start()
|
|
}
|
|
|
|
func registerHandlers(hg *telegohandler.HandlerGroup) {
|
|
msgGroup := hg.Group(telegohandler.AnyMessage())
|
|
msgGroup.Use(func(bot *telego.Bot, update telego.Update, next telegohandler.Handler) {
|
|
if !slice.Contain(config.Cfg.Telegram.Admins, update.Message.From.ID) {
|
|
bot.SendMessage(telegoutil.Message(update.Message.Chat.ChatID(), "抱歉, 该 Bot 为个人使用设计, 您可以部署自己的 AnySaveBot 实例: https://github.com/krau/SaveAny-Bot"))
|
|
return
|
|
}
|
|
next(bot, update)
|
|
})
|
|
|
|
msgGroup.HandleMessageCtx(Start, telegohandler.CommandEqual("start"))
|
|
msgGroup.HandleMessageCtx(Help, telegohandler.CommandEqual("help"))
|
|
msgGroup.HandleMessageCtx(ChangeSilentMode, telegohandler.CommandEqual("silent"))
|
|
msgGroup.HandleMessageCtx(SetDefaultStorage, telegohandler.CommandEqual("storage"))
|
|
msgGroup.HandleMessageCtx(SaveFile, telegohandler.CommandEqual("save"))
|
|
msgGroup.HandleMessageCtx(CleanReceivedFile, telegohandler.CommandEqual("clean"))
|
|
|
|
msgGroup.HandleMessageCtx(HandleFileMessage, func(update telego.Update) bool {
|
|
return update.Message.Document != nil || update.Message.Video != nil || update.Message.Audio != nil
|
|
})
|
|
|
|
callbackGroup := hg.Group(telegohandler.AnyCallbackQueryWithMessage())
|
|
callbackGroup.Use(func(bot *telego.Bot, update telego.Update, next telegohandler.Handler) {
|
|
if !slice.Contain(config.Cfg.Telegram.Admins, update.CallbackQuery.From.ID) {
|
|
bot.AnswerCallbackQuery(telegoutil.
|
|
CallbackQuery(update.CallbackQuery.ID).
|
|
WithText("抱歉, 该 Bot 为个人使用设计, 您可以部署自己的 SaveAnyBot 实例: https://github.com/krau/SaveAny-Bot").
|
|
WithShowAlert().
|
|
WithCacheTime(60))
|
|
return
|
|
}
|
|
next(bot, update)
|
|
})
|
|
|
|
callbackGroup.HandleCallbackQueryCtx(AddToQueue, telegohandler.CallbackDataPrefix("add"))
|
|
}
|