Files
SaveAny-Bot/bot/bot.go
2024-10-10 23:40:47 +08:00

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 为个人使用设计, 您可以部署自己的 SaveAnyBot 实例: 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"))
}