700 lines
26 KiB
Go
700 lines
26 KiB
Go
package sticker_download
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
"trbot/database"
|
||
"trbot/database/db_struct"
|
||
"trbot/plugins/sticker_download/collect"
|
||
"trbot/plugins/sticker_download/config"
|
||
"trbot/plugins/sticker_download/download"
|
||
"trbot/plugins/sticker_download/lock"
|
||
"trbot/plugins/sticker_download/mpeg4gif"
|
||
"trbot/utils"
|
||
"trbot/utils/configs"
|
||
"trbot/utils/flaterr"
|
||
"trbot/utils/handler_params"
|
||
"trbot/utils/plugin_utils"
|
||
"trbot/utils/task"
|
||
"trbot/utils/type/contain"
|
||
"trbot/utils/type/message_utils"
|
||
|
||
"github.com/go-telegram/bot"
|
||
"github.com/go-telegram/bot/models"
|
||
"github.com/reugn/go-quartz/job"
|
||
"github.com/reugn/go-quartz/quartz"
|
||
"github.com/rs/zerolog"
|
||
)
|
||
|
||
func Init() {
|
||
plugin_utils.AddCallbackQueryHandlers([]plugin_utils.CallbackQuery{
|
||
{
|
||
// 不转换格式,打包下载整个贴纸包
|
||
CallbackDataPrefix: "s_",
|
||
CallbackQueryHandler: stickerPackCallbackHandler,
|
||
},
|
||
{
|
||
// 将贴纸包中的静态贴纸全部转换为 PNG 格式并打包
|
||
CallbackDataPrefix: "S_",
|
||
CallbackQueryHandler: stickerPackCallbackHandler,
|
||
},
|
||
}...)
|
||
plugin_utils.AddHandlerHelpInfo(plugin_utils.HandlerHelp{
|
||
Name: "贴纸下载",
|
||
Description: "向机器人发送任意贴纸或视频 GIF 来下载它\n向机器人发送贴纸包链接来下载整个贴纸包\n\n注意:\n静态贴纸会被转换为 PNG 格式\n视频贴纸和视频 GIF 会被转换为 GIF 格式\n动画贴纸(.tgs 格式)不会被转换,将会添加 .file 后缀以文件形式发回",
|
||
})
|
||
plugin_utils.AddHandlerByMessageTypeHandlers(plugin_utils.ByMessageTypeHandler{
|
||
PluginName: "下载贴纸",
|
||
ChatType: models.ChatTypePrivate,
|
||
MessageType: message_utils.Sticker,
|
||
AllowAutoTrigger: true,
|
||
MessageHandler: stickerHandler,
|
||
})
|
||
plugin_utils.AddInitializer(plugin_utils.Initializer{
|
||
Name: "sticker_download",
|
||
Func: func(ctx context.Context, thebot *bot.Bot) error{
|
||
err := config.ReadStickerConfig(ctx)
|
||
if err != nil {
|
||
return fmt.Errorf("failed to read sticker config: %w", err)
|
||
}
|
||
|
||
err = task.ScheduleTask(ctx, task.Task{
|
||
Name: "save_sticker_config",
|
||
Group: "sticker",
|
||
Job: job.NewFunctionJobWithDesc(
|
||
func(ctx context.Context) (int, error) {
|
||
config.SaveStickerConfig(ctx)
|
||
return 0, nil
|
||
},
|
||
"Save sticker config every 10 minutes",
|
||
),
|
||
Trigger: quartz.NewSimpleTrigger(10 * time.Minute),
|
||
})
|
||
if err != nil {
|
||
return fmt.Errorf("failed to add auto save sticker config task: %w", err)
|
||
}
|
||
|
||
if config.Config.AllowDownloadStickerSet || config.Config.UseCollcetSticker {
|
||
plugin_utils.AddFullCommandHandlers([]plugin_utils.FullCommand{
|
||
{
|
||
FullCommand: "https://t.me/addstickers/",
|
||
ForChatType: []models.ChatType{models.ChatTypePrivate},
|
||
MessageHandler: stickerLinkHandler,
|
||
},
|
||
{
|
||
FullCommand: "t.me/addstickers/",
|
||
ForChatType: []models.ChatType{models.ChatTypePrivate},
|
||
MessageHandler: stickerLinkHandler,
|
||
},
|
||
}...)
|
||
}
|
||
|
||
if config.Config.UseCollcetSticker {
|
||
err = collect.ReadCollectStickerList(ctx)
|
||
if err != nil {
|
||
return fmt.Errorf("failed to init collect sticker: %w", err)
|
||
}
|
||
plugin_utils.AddDataBaseHandler(plugin_utils.DatabaseHandler{
|
||
Name: "collectsitcker",
|
||
Saver: collect.SaveCollectStickerList,
|
||
Loader: collect.ReadCollectStickerList,
|
||
})
|
||
plugin_utils.AddCallbackQueryHandlers(plugin_utils.CallbackQuery{
|
||
// 下载贴纸包中的所有贴纸并打包发送到收藏频道(不转换格式)
|
||
CallbackDataPrefix: "c_",
|
||
CallbackQueryHandler: collect.CollectStickerSet,
|
||
})
|
||
}
|
||
|
||
if !config.Config.DisableConvert && config.Config.FFmpegPath != "" {
|
||
plugin_utils.AddHandlerByMessageTypeHandlers(plugin_utils.ByMessageTypeHandler{
|
||
PluginName: "MP4 转 GIF",
|
||
ChatType: models.ChatTypePrivate,
|
||
MessageType: message_utils.Animation,
|
||
AllowAutoTrigger: true,
|
||
MessageHandler: mpeg4gif.ConvertMP4ToGifHandler,
|
||
})
|
||
}
|
||
return nil
|
||
},
|
||
})
|
||
plugin_utils.AddDataBaseHandler(plugin_utils.DatabaseHandler{
|
||
Name: "sticker_download",
|
||
Saver: config.SaveStickerConfig,
|
||
Loader: config.ReadStickerConfig,
|
||
})
|
||
}
|
||
|
||
func stickerHandler(opts *handler_params.Message) error {
|
||
logger := zerolog.Ctx(opts.Ctx).
|
||
With().
|
||
Str("pluginName", "StickerDownload").
|
||
Str(utils.GetCurrentFuncName()).
|
||
Dict(utils.GetUserDict(opts.Message.From)).
|
||
Logger()
|
||
|
||
var handlerErr flaterr.MultErr
|
||
|
||
logger.Info().
|
||
Str("emoji", opts.Message.Sticker.Emoji).
|
||
Str("setName", opts.Message.Sticker.SetName).
|
||
Msg("Start download sticker")
|
||
|
||
err := database.IncrementalUsageCount(opts.Ctx, opts.Message.From.ID, db_struct.StickerDownloaded)
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Msg("Failed to incremental sticker download count")
|
||
handlerErr.Addf("failed to incremental sticker download count: %w", err)
|
||
}
|
||
|
||
if lock.Download.TryLock() {
|
||
// 成功获取到锁,直接继续下载不发送提示信息
|
||
defer lock.Download.Unlock()
|
||
} else {
|
||
_, err := opts.Thebot.SendMessage(opts.Ctx, &bot.SendMessageParams{
|
||
ChatID: opts.Message.From.ID,
|
||
Text: "已加入贴纸下载队列,请稍候...",
|
||
ReplyParameters: &models.ReplyParameters{ MessageID: opts.Message.ID },
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "sticker download in progress notice").
|
||
Msg(flaterr.SendMessage.Str())
|
||
handlerErr.Addt(flaterr.SendMessage, "sticker download in progress notice", err)
|
||
}
|
||
|
||
// 发送信息提示等待后,阻断等待锁
|
||
lock.Download.Lock()
|
||
defer lock.Download.Unlock()
|
||
}
|
||
|
||
_, err = opts.Thebot.SendChatAction(opts.Ctx, &bot.SendChatActionParams{
|
||
ChatID: opts.Message.From.ID,
|
||
Action: models.ChatActionChooseSticker,
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Msg("failed to send chat action")
|
||
}
|
||
|
||
stickerData, err := download.GetSticker(opts)
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Msg("Error when downloading sticker")
|
||
handlerErr.Addf("error when downloading sticker: %w", err)
|
||
|
||
_, err = opts.Thebot.SendMessage(opts.Ctx, &bot.SendMessageParams{
|
||
ChatID: opts.Message.From.ID,
|
||
Text: fmt.Sprintf("下载贴纸时发生了一些错误\n<blockquote expandable>Failed to download sticker: %s</blockquote>", utils.IgnoreHTMLTags(err.Error())),
|
||
ParseMode: models.ParseModeHTML,
|
||
ReplyParameters: &models.ReplyParameters{ MessageID: opts.Message.ID },
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "sticker download error").
|
||
Msg(flaterr.SendMessage.Str())
|
||
handlerErr.Addt(flaterr.SendMessage, "sticker download error", err)
|
||
}
|
||
} else {
|
||
if stickerData.ZipFile != nil {
|
||
defer stickerData.ZipFile.Close()
|
||
}
|
||
documentParams := &bot.SendDocumentParams{
|
||
ChatID: opts.Message.From.ID,
|
||
ParseMode: models.ParseModeHTML,
|
||
ReplyParameters: &models.ReplyParameters{ MessageID: opts.Message.ID },
|
||
DisableNotification: true,
|
||
DisableContentTypeDetection: true, // Prevent the server convert GIF to MP4
|
||
}
|
||
|
||
var stickerFilePrefix, stickerFileSuffix string
|
||
if opts.Message.Sticker.IsVideo {
|
||
if stickerData.IsConverted {
|
||
stickerFileSuffix = "gif"
|
||
} else {
|
||
documentParams.Caption = "<blockquote>see <a href=\"https://wikipedia.org/wiki/WebM\">wikipedia/WebM</a></blockquote>"
|
||
stickerFileSuffix = "webm"
|
||
}
|
||
} else if opts.Message.Sticker.IsAnimated {
|
||
if stickerData.IsConverted {
|
||
stickerFileSuffix = "gif"
|
||
} else {
|
||
documentParams.Caption = "<blockquote>see <a href=\"https://core.telegram.org/stickers#animated-stickers\">stickers/animated-stickers</a></blockquote>"
|
||
stickerFileSuffix = "tgs.file"
|
||
}
|
||
} else {
|
||
if stickerData.IsConverted {
|
||
stickerFileSuffix = "png"
|
||
} else {
|
||
documentParams.Caption = "<blockquote>see <a href=\"https://wikipedia.org/wiki/WebP\">wikipedia/WebP</a></blockquote>"
|
||
stickerFileSuffix = "webp"
|
||
}
|
||
}
|
||
|
||
if stickerData.IsCustomSticker {
|
||
stickerFilePrefix = "sticker"
|
||
} else {
|
||
var button [][]models.InlineKeyboardButton
|
||
var suffix string = stickerData.StickerSetName
|
||
if len(stickerData.StickerSetName) > 62 {
|
||
id := config.Config.GetOversizeSetIDByName(stickerData.StickerSetName)
|
||
if id == 0 {
|
||
config.Config.OversizeSetCount++
|
||
config.Config.OversizeSets = append(config.Config.OversizeSets, config.OversizeSet{
|
||
SetName: stickerData.StickerSetName,
|
||
SetID: config.Config.OversizeSetCount,
|
||
})
|
||
suffix = fmt.Sprintf("_%d", config.Config.OversizeSetCount)
|
||
} else {
|
||
suffix = fmt.Sprintf("_%d", id)
|
||
}
|
||
}
|
||
|
||
if config.Config.AllowDownloadStickerSet {
|
||
if config.Config.DisableConvert {
|
||
button = [][]models.InlineKeyboardButton{
|
||
{{ Text: "下载整个贴纸包(不转换格式)", CallbackData: fmt.Sprintf("s_%s", suffix) }},
|
||
}
|
||
} else {
|
||
button = [][]models.InlineKeyboardButton{
|
||
{{ Text: "下载转换后的贴纸包", CallbackData: fmt.Sprintf("S_%s", suffix) }},
|
||
{{ Text: "下载整个贴纸包(不转换格式)", CallbackData: fmt.Sprintf("s_%s", suffix) }},
|
||
}
|
||
}
|
||
documentParams.Caption += fmt.Sprintf("<a href=\"https://t.me/addstickers/%s\">%s</a> 贴纸包中一共有 %d 个贴纸\n", stickerData.StickerSetName, stickerData.StickerSetTitle, stickerData.StickerCount)
|
||
stickerFilePrefix = fmt.Sprintf("%s_%d", stickerData.StickerSetName, stickerData.StickerIndex)
|
||
} else {
|
||
stickerFilePrefix = stickerData.StickerSetName
|
||
}
|
||
|
||
if config.Config.UseCollcetSticker {
|
||
collect.AddButton(suffix, stickerData.StickerCount, contain.Int64(opts.Message.From.ID, configs.BotConfig.AdminIDs...), &button)
|
||
}
|
||
|
||
// 仅在不为自定义贴纸时显示下载整个贴纸包按钮
|
||
if len(button) > 0 {
|
||
documentParams.ReplyMarkup = &models.InlineKeyboardMarkup{ InlineKeyboard: button }
|
||
}
|
||
}
|
||
|
||
documentParams.Document = &models.InputFileUpload{ Filename: fmt.Sprintf("%s.%s", stickerFilePrefix, stickerFileSuffix), Data: stickerData.Data }
|
||
|
||
_, err = opts.Thebot.SendDocument(opts.Ctx, documentParams)
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "sticker file").
|
||
Msg(flaterr.SendDocument.Str())
|
||
handlerErr.Addt(flaterr.SendDocument, "sticker file", err)
|
||
}
|
||
}
|
||
|
||
return handlerErr.Flat()
|
||
}
|
||
|
||
func stickerPackCallbackHandler(opts *handler_params.CallbackQuery) error {
|
||
logger := zerolog.Ctx(opts.Ctx).
|
||
With().
|
||
Str("pluginName", "StickerDownload").
|
||
Str(utils.GetCurrentFuncName()).
|
||
Dict(utils.GetUserDict(&opts.CallbackQuery.From)).
|
||
Logger()
|
||
|
||
var handlerErr flaterr.MultErr
|
||
|
||
if !config.Config.AllowDownloadStickerSet {
|
||
_, err := opts.Thebot.AnswerCallbackQuery(opts.Ctx, &bot.AnswerCallbackQueryParams{
|
||
CallbackQueryID: opts.CallbackQuery.ID,
|
||
Text: "机器人当前禁用了贴纸包下载功能",
|
||
ShowAlert: true,
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "stickerset download disabled notice").
|
||
Msg(flaterr.AnswerCallbackQuery.Str())
|
||
handlerErr.Addt(flaterr.AnswerCallbackQuery, "stickerset download disabled notice", err)
|
||
}
|
||
return handlerErr.Flat()
|
||
}
|
||
|
||
err := database.IncrementalUsageCount(opts.Ctx, opts.CallbackQuery.From.ID, db_struct.StickerSetDownloaded)
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Msg("Failed to incremental sticker set download count")
|
||
handlerErr.Addf("failed to incremental sticker set download count: %w", err)
|
||
}
|
||
|
||
var setName string
|
||
var needConvert bool
|
||
if opts.CallbackQuery.Data[0:2] == "S_" {
|
||
setName = strings.TrimPrefix(opts.CallbackQuery.Data, "S_")
|
||
needConvert = true
|
||
if config.Config.DisableConvert {
|
||
_, err := opts.Thebot.AnswerCallbackQuery(opts.Ctx, &bot.AnswerCallbackQueryParams{
|
||
CallbackQueryID: opts.CallbackQuery.ID,
|
||
Text: "机器人当前禁用了贴纸包转换功能",
|
||
ShowAlert: true,
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "stickerset convert disabled notice").
|
||
Msg(flaterr.AnswerCallbackQuery.Str())
|
||
handlerErr.Addt(flaterr.AnswerCallbackQuery, "stickerset convert disabled notice", err)
|
||
}
|
||
return handlerErr.Flat()
|
||
}
|
||
} else {
|
||
setName = strings.TrimPrefix(opts.CallbackQuery.Data, "s_")
|
||
needConvert = false
|
||
}
|
||
|
||
// 有下划线开头即代表这是一个超出了长度的贴纸包,下划线后面的数据是一个 ID
|
||
// 解析这个 ID 并从 config.Config.OversizeSets 中拿到对应的贴纸包名称
|
||
if setName[0:1] == "_" {
|
||
setID, err := strconv.Atoi(strings.TrimPrefix(setName, "_"))
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Msg("Failed to parser oversize sticker set ID")
|
||
handlerErr.Addf("failed to parser oversize sticker set ID [%s]: %w", setName, err)
|
||
_, err = opts.Thebot.AnswerCallbackQuery(opts.Ctx, &bot.AnswerCallbackQueryParams{
|
||
CallbackQueryID: opts.CallbackQuery.ID,
|
||
Text: "解析贴纸包 ID 失败,请重新尝试发送此贴纸再点击按钮",
|
||
ShowAlert: true,
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "failed to parser oversize sticker set ID notice").
|
||
Msg(flaterr.AnswerCallbackQuery.Str())
|
||
handlerErr.Addt(flaterr.AnswerCallbackQuery, "failed to parser oversize sticker set ID notice", err)
|
||
}
|
||
return handlerErr.Flat()
|
||
}
|
||
setName = config.Config.GetOversizeSetNameByID(setID)
|
||
if setName == "" {
|
||
logger.Error().
|
||
Int("setID", setID).
|
||
Msg("Failed to find oversize sticker set")
|
||
handlerErr.Addf("failed to find oversize sticker set [%d]", setID)
|
||
_, err = opts.Thebot.AnswerCallbackQuery(opts.Ctx, &bot.AnswerCallbackQueryParams{
|
||
CallbackQueryID: opts.CallbackQuery.ID,
|
||
Text: "未找到 ID 对应的贴纸包,请重新尝试发送此贴纸再点击按钮",
|
||
ShowAlert: true,
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "no sticker set found for set ID notice").
|
||
Msg(flaterr.AnswerCallbackQuery.Str())
|
||
handlerErr.Addt(flaterr.AnswerCallbackQuery, "no sticker set found for set ID notice", err)
|
||
}
|
||
return handlerErr.Flat()
|
||
}
|
||
}
|
||
|
||
if lock.Download.TryLock() {
|
||
// 成功获取到锁,直接继续下载不发送提示信息
|
||
defer lock.Download.Unlock()
|
||
} else {
|
||
_, err := opts.Thebot.AnswerCallbackQuery(opts.Ctx, &bot.AnswerCallbackQueryParams{
|
||
CallbackQueryID: opts.CallbackQuery.ID,
|
||
Text: "您的下载请求已提交,但由于当前有其他用户正在下载贴纸,可能需要等待一段时间后才能开始下载",
|
||
ShowAlert: true,
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "stickerset download in progress notice").
|
||
Msg(flaterr.AnswerCallbackQuery.Str())
|
||
handlerErr.Addt(flaterr.AnswerCallbackQuery, "stickerset download in progress notice", err)
|
||
}
|
||
|
||
// 发送信息提示等待后,阻断等待锁
|
||
lock.Download.Lock()
|
||
defer lock.Download.Unlock()
|
||
}
|
||
|
||
// 通过贴纸的 packName 获取贴纸集
|
||
stickerSet, err := opts.Thebot.GetStickerSet(opts.Ctx, &bot.GetStickerSetParams{ Name: setName })
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("setName", setName).
|
||
Msg(flaterr.GetStickerSet.Str())
|
||
handlerErr.Addt(flaterr.GetStickerSet, setName, err)
|
||
|
||
_, err = opts.Thebot.SendMessage(opts.Ctx, &bot.SendMessageParams{
|
||
ChatID: opts.CallbackQuery.From.ID,
|
||
Text: fmt.Sprintf("获取贴纸包信息时发生了一些错误\n<blockquote expandable>Failed to get sticker set info: %s</blockquote>", utils.IgnoreHTMLTags(err.Error())),
|
||
ParseMode: models.ParseModeHTML,
|
||
ReplyParameters: &models.ReplyParameters{ MessageID: opts.CallbackQuery.Message.Message.ID },
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "get sticker set info error").
|
||
Msg(flaterr.SendMessage.Str())
|
||
handlerErr.Addt(flaterr.SendMessage, "get sticker set info error", err)
|
||
}
|
||
} else {
|
||
logger.Info().
|
||
Bool("needConvert", needConvert).
|
||
Dict("stickerSet", zerolog.Dict().
|
||
Str("title", stickerSet.Title).
|
||
Str("name", stickerSet.Name).
|
||
Int("allCount", len(stickerSet.Stickers)),
|
||
).
|
||
Msg("Start download sticker set")
|
||
|
||
if len(stickerSet.Stickers) > 120 {
|
||
_, err = opts.Thebot.SendMessage(opts.Ctx, &bot.SendMessageParams{
|
||
ChatID: opts.CallbackQuery.From.ID,
|
||
Text: fmt.Sprintf("抱歉,<a href=\"https://t.me/addstickers/%s\">%s</a> 贴纸包中的贴纸数量过多 (%d),无法使用打包下载功能<blockquote expandable>您可以单独发送要下载的贴纸</blockquote>", stickerSet.Name, stickerSet.Title, len(stickerSet.Stickers)),
|
||
ReplyParameters: &models.ReplyParameters{ MessageID: opts.CallbackQuery.Message.Message.ID },
|
||
LinkPreviewOptions: &models.LinkPreviewOptions{ IsDisabled: bot.True()},
|
||
ParseMode: models.ParseModeHTML,
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "too many stickers").
|
||
Msg(flaterr.SendMessage.Str())
|
||
handlerErr.Addt(flaterr.SendMessage, "too many stickers", err)
|
||
}
|
||
return handlerErr.Flat()
|
||
}
|
||
|
||
if opts.CallbackQuery.Message.Message.Text != "" {
|
||
_, err = opts.Thebot.EditMessageText(opts.Ctx, &bot.EditMessageTextParams{
|
||
ChatID: opts.CallbackQuery.Message.Message.Chat.ID,
|
||
MessageID: opts.CallbackQuery.Message.Message.ID,
|
||
Text: fmt.Sprintf("正在下载%s <a href=\"https://t.me/addstickers/%s\">%s</a> 贴纸包,请稍候...", utils.TextForTrueOrFalse(needConvert, "并转换", ""), stickerSet.Name, stickerSet.Title),
|
||
ParseMode: models.ParseModeHTML,
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "start download stickerset notice").
|
||
Msg(flaterr.EditMessageText.Str())
|
||
handlerErr.Addt(flaterr.EditMessageText, "start download stickerset notice", err)
|
||
}
|
||
} else {
|
||
_, err = opts.Thebot.EditMessageCaption(opts.Ctx, &bot.EditMessageCaptionParams{
|
||
ChatID: opts.CallbackQuery.Message.Message.Chat.ID,
|
||
MessageID: opts.CallbackQuery.Message.Message.ID,
|
||
Caption: fmt.Sprintf("正在下载%s <a href=\"https://t.me/addstickers/%s\">%s</a> 贴纸包,请稍候...", utils.TextForTrueOrFalse(needConvert, "并转换", ""), stickerSet.Name, stickerSet.Title),
|
||
ParseMode: models.ParseModeHTML,
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "start download stickerset notice").
|
||
Msg(flaterr.EditMessageCaption.Str())
|
||
handlerErr.Addt(flaterr.EditMessageCaption, "start download stickerset notice", err)
|
||
}
|
||
}
|
||
|
||
stickerData, err := download.GetStickerPack(opts.Ctx, opts.Thebot, stickerSet, needConvert)
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Msg("Failed to download sticker set")
|
||
handlerErr.Addf("failed to download sticker set: %w", err)
|
||
|
||
_, err = opts.Thebot.SendMessage(opts.Ctx, &bot.SendMessageParams{
|
||
ChatID: opts.CallbackQuery.From.ID,
|
||
Text: fmt.Sprintf("下载贴纸包时发生了一些错误\n<blockquote expandable>Failed to download sticker set: %s</blockquote>", utils.IgnoreHTMLTags(err.Error())),
|
||
ParseMode: models.ParseModeHTML,
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "download sticker set error").
|
||
Msg(flaterr.SendMessage.Str())
|
||
handlerErr.Addt(flaterr.SendMessage, "download sticker set error", err)
|
||
}
|
||
} else {
|
||
var pendingMessage string
|
||
|
||
if needConvert {
|
||
pendingMessage = fmt.Sprintf("<a href=\"https://t.me/addstickers/%s\">%s</a> 已下载\n包含 %d 个贴纸(经过转换)", stickerData.StickerSetName, stickerData.StickerSetTitle, stickerData.StickerCount)
|
||
} else {
|
||
pendingMessage = fmt.Sprintf("<a href=\"https://t.me/addstickers/%s\">%s</a> 已下载\n包含 %d 个贴纸", stickerData.StickerSetName, stickerData.StickerSetTitle, stickerData.StickerCount)
|
||
}
|
||
|
||
// 获取 stickerData.Data 的文件大小
|
||
if stickerData.StickerSetSize > 50 * 1024 * 1024 {
|
||
_, err = opts.Thebot.SendMessage(opts.Ctx, &bot.SendMessageParams{
|
||
ChatID: opts.CallbackQuery.From.ID,
|
||
Text: pendingMessage + "<blockquote>由于文件大小超过 50 MB,请点击下方按钮下载\n注意:此链接并不会一直有效</blockquote>",
|
||
ParseMode: models.ParseModeHTML,
|
||
LinkPreviewOptions: &models.LinkPreviewOptions{ IsDisabled: bot.True() },
|
||
ReplyParameters: &models.ReplyParameters{ MessageID: opts.CallbackQuery.Message.Message.ID },
|
||
ReplyMarkup: &models.InlineKeyboardMarkup{ InlineKeyboard: [][]models.InlineKeyboardButton{{{
|
||
Text: "打开浏览器下载",
|
||
URL: fmt.Sprintf("https://alist.trle5.xyz/d/cache/sticker_compressed/%s_%s", stickerData.StickerSetHash, stickerData.StickerSetFileName),
|
||
}}}},
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "download sticker set error").
|
||
Msg(flaterr.SendMessage.Str())
|
||
handlerErr.Addt(flaterr.SendMessage, "download sticker set error", err)
|
||
}
|
||
} else {
|
||
_, err = opts.Thebot.SendDocument(opts.Ctx, &bot.SendDocumentParams{
|
||
ChatID: opts.CallbackQuery.From.ID,
|
||
Document: &models.InputFileUpload{Filename: stickerData.StickerSetFileName, Data: stickerData.Data},
|
||
Caption: pendingMessage,
|
||
ParseMode: models.ParseModeHTML,
|
||
ReplyParameters: &models.ReplyParameters{ MessageID: opts.CallbackQuery.Message.Message.ID },
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Str("content", "sticker set zip file").
|
||
Msg(flaterr.SendDocument.Str())
|
||
handlerErr.Addt(flaterr.SendDocument, "sticker set zip file", err)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return handlerErr.Flat()
|
||
}
|
||
|
||
// full command for "t.me/addstickers/" or "https://t.me/addstickers/"
|
||
func stickerLinkHandler(opts *handler_params.Message) error {
|
||
if opts.Message == nil || opts.Message.Text == "" {
|
||
return nil
|
||
}
|
||
|
||
logger := zerolog.Ctx(opts.Ctx).
|
||
With().
|
||
Str("pluginName", "StickerDownload").
|
||
Str(utils.GetCurrentFuncName()).
|
||
Logger()
|
||
|
||
var handlerErr flaterr.MultErr
|
||
var stickerSetName string
|
||
|
||
if strings.HasPrefix(opts.Message.Text, "https://t.me/addstickers/") {
|
||
stickerSetName = strings.TrimPrefix(opts.Message.Text, "https://t.me/addstickers/")
|
||
} else if strings.HasPrefix(opts.Message.Text, "t.me/addstickers/") {
|
||
stickerSetName = strings.TrimPrefix(opts.Message.Text, "t.me/addstickers/")
|
||
}
|
||
|
||
if stickerSetName != "" {
|
||
stickerSet, err := opts.Thebot.GetStickerSet(opts.Ctx, &bot.GetStickerSetParams{Name: stickerSetName})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Dict(utils.GetUserDict(opts.Message.From)).
|
||
Str("stickerSetName", stickerSetName).
|
||
Msg(flaterr.GetStickerSet.Str())
|
||
handlerErr.Addt(flaterr.GetStickerSet, stickerSetName, err)
|
||
|
||
_, err = opts.Thebot.SendMessage(opts.Ctx, &bot.SendMessageParams{
|
||
ChatID: opts.Message.From.ID,
|
||
Text: fmt.Sprintf("获取贴纸包信息时发生了一些错误\n<blockquote expandable>%s</blockquote>", utils.IgnoreHTMLTags(err.Error())),
|
||
ParseMode: models.ParseModeHTML,
|
||
ReplyParameters: &models.ReplyParameters{MessageID: opts.Message.ID},
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Dict(utils.GetUserDict(opts.Message.From)).
|
||
Str("content", "get sticker set info error").
|
||
Msg(flaterr.SendMessage.Str())
|
||
handlerErr.Addt(flaterr.SendMessage, "get sticker set info error", err)
|
||
}
|
||
} else {
|
||
var suffix string = stickerSet.Name
|
||
if len(stickerSet.Name) > 62 {
|
||
id := config.Config.GetOversizeSetIDByName(stickerSet.Name)
|
||
if id == 0 {
|
||
config.Config.OversizeSetCount++
|
||
config.Config.OversizeSets = append(config.Config.OversizeSets, config.OversizeSet{
|
||
SetName: stickerSet.Name,
|
||
SetID: config.Config.OversizeSetCount,
|
||
})
|
||
suffix = fmt.Sprintf("_%d", config.Config.OversizeSetCount)
|
||
} else {
|
||
suffix = fmt.Sprintf("_%d", id)
|
||
}
|
||
}
|
||
var button [][]models.InlineKeyboardButton
|
||
|
||
if config.Config.AllowDownloadStickerSet {
|
||
if config.Config.DisableConvert {
|
||
button = [][]models.InlineKeyboardButton{
|
||
{{ Text: "下载整个贴纸包(不转换格式)", CallbackData: fmt.Sprintf("s_%s", suffix) }},
|
||
}
|
||
} else {
|
||
button = [][]models.InlineKeyboardButton{
|
||
{{ Text: "下载转换后的贴纸包", CallbackData: fmt.Sprintf("S_%s", suffix) }},
|
||
{{ Text: "下载整个贴纸包(不转换格式)", CallbackData: fmt.Sprintf("s_%s", suffix) }},
|
||
}
|
||
}
|
||
}
|
||
|
||
if config.Config.UseCollcetSticker {
|
||
collect.AddButton(stickerSet.Name, len(stickerSet.Stickers), contain.Int64(opts.Message.From.ID, configs.BotConfig.AdminIDs...), &button)
|
||
}
|
||
|
||
var ReplyMarkup models.ReplyMarkup
|
||
if len(button) > 0 {
|
||
ReplyMarkup = &models.InlineKeyboardMarkup{
|
||
InlineKeyboard: button,
|
||
}
|
||
}
|
||
|
||
_, err = opts.Thebot.SendMessage(opts.Ctx, &bot.SendMessageParams{
|
||
ChatID: opts.Message.From.ID,
|
||
Text: fmt.Sprintf("<a href=\"https://t.me/addstickers/%s\">%s</a> 贴纸包中一共有 %d 个贴纸\n", stickerSet.Name, stickerSet.Title, len(stickerSet.Stickers)),
|
||
ParseMode: models.ParseModeHTML,
|
||
DisableNotification: true,
|
||
ReplyParameters: &models.ReplyParameters{MessageID: opts.Message.ID},
|
||
ReplyMarkup: ReplyMarkup,
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Dict(utils.GetUserDict(opts.Message.From)).
|
||
Str("content", "sticker set info").
|
||
Msg(flaterr.SendMessage.Str())
|
||
handlerErr.Addt(flaterr.SendMessage, "sticker set info", err)
|
||
}
|
||
}
|
||
} else {
|
||
_, err := opts.Thebot.SendMessage(opts.Ctx, &bot.SendMessageParams{
|
||
ChatID: opts.Message.From.ID,
|
||
Text: "请发送一个有效的贴纸链接",
|
||
ReplyParameters: &models.ReplyParameters{MessageID: opts.Message.ID},
|
||
})
|
||
if err != nil {
|
||
logger.Error().
|
||
Err(err).
|
||
Dict(utils.GetUserDict(opts.Message.From)).
|
||
Str("content", "empty sticker link notice").
|
||
Msg(flaterr.SendMessage.Str())
|
||
handlerErr.Addt(flaterr.SendMessage, "empty sticker link notice", err)
|
||
}
|
||
}
|
||
|
||
return handlerErr.Flat()
|
||
}
|