Skip to content

Commit 06c8ea8

Browse files
committed
feat: batch post artwork by send txt file
1 parent e50bddc commit 06c8ea8

File tree

3 files changed

+129
-2
lines changed

3 files changed

+129
-2
lines changed

bot/bot.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ func RunPolling() {
1515
}
1616
Logger.Info("Start polling")
1717
updates, err := telegram.Bot.UpdatesViaLongPolling(&telego.GetUpdatesParams{
18-
Offset: -100,
18+
Offset: -1,
1919
AllowedUpdates: []string{
2020
telego.MessageUpdates,
2121
telego.ChannelPostUpdates,
@@ -52,6 +52,8 @@ func RunPolling() {
5252
baseGroup.HandleMessageCtx(processPictures, telegohandler.CommandEqual("process_pictures"))
5353
baseGroup.HandleMessageCtx(setArtworkR18, telegohandler.CommandEqual("r18"))
5454
baseGroup.HandleMessageCtx(setArtworkTags, telegohandler.Or(telegohandler.CommandEqual("tags"), telegohandler.CommandEqual("addtags"), telegohandler.CommandEqual("deltags")))
55+
baseGroup.HandleMessageCtx(batchPostArtwork, telegohandler.CommandEqual("batch_post"))
56+
5557
baseGroup.HandleCallbackQueryCtx(postArtwork, telegohandler.CallbackDataContains("post_artwork"))
5658
baseGroup.HandleInlineQueryCtx(inlineQuery)
5759

bot/handlers_admin.go

+125
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@ import (
99
"ManyACG/storage"
1010
"ManyACG/telegram"
1111
"ManyACG/types"
12+
"bufio"
13+
"bytes"
1214
"context"
1315
"errors"
1416
"fmt"
17+
"io"
1518
"strconv"
1619
"strings"
1720
"time"
@@ -416,3 +419,125 @@ func setArtworkTags(ctx context.Context, bot *telego.Bot, message telego.Message
416419
})
417420
telegram.ReplyMessage(bot, message, "更新作品标签成功")
418421
}
422+
423+
func batchPostArtwork(ctx context.Context, bot *telego.Bot, message telego.Message) {
424+
if !service.CheckAdminPermission(ctx, message.From.ID, types.PermissionPostArtwork) {
425+
telegram.ReplyMessage(bot, message, "你没有发布作品的权限")
426+
return
427+
}
428+
if message.ReplyToMessage == nil || message.ReplyToMessage.Document == nil {
429+
telegram.ReplyMessage(bot, message, "请回复一个批量作品链接的文件")
430+
return
431+
}
432+
433+
count, startIndex, sleepTime := 10, 0, 1
434+
_, _, args := telegoutil.ParseCommand(message.Text)
435+
if len(args) >= 1 {
436+
var err error
437+
count, err = strconv.Atoi(args[0])
438+
if err != nil {
439+
telegram.ReplyMessage(bot, message, "参数错误"+err.Error())
440+
return
441+
}
442+
}
443+
if len(args) >= 2 {
444+
var err error
445+
startIndex, err = strconv.Atoi(args[1])
446+
if err != nil {
447+
telegram.ReplyMessage(bot, message, "参数错误"+err.Error())
448+
return
449+
}
450+
}
451+
452+
if len(args) >= 3 {
453+
var err error
454+
sleepTime, err = strconv.Atoi(args[2])
455+
if err != nil {
456+
telegram.ReplyMessage(bot, message, "参数错误"+err.Error())
457+
return
458+
}
459+
}
460+
461+
tgFile, err := bot.GetFile(&telego.GetFileParams{
462+
FileID: message.ReplyToMessage.Document.FileID,
463+
})
464+
if err != nil {
465+
telegram.ReplyMessage(bot, message, "获取文件失败: "+err.Error())
466+
return
467+
}
468+
file, err := telegoutil.DownloadFile(bot.FileDownloadURL(tgFile.FilePath))
469+
if err != nil {
470+
telegram.ReplyMessage(bot, message, "下载文件失败: "+err.Error())
471+
return
472+
}
473+
474+
callbackMessage, err := telegram.ReplyMessage(bot, message, fmt.Sprintf("开始发布作品...\n总数: %d\n起始索引: %d\n间隔时间: %d秒", count, startIndex, sleepTime))
475+
if err != nil {
476+
Logger.Warnf("回复消息失败: %s", err)
477+
callbackMessage = nil
478+
}
479+
480+
failed := 0
481+
reader := bufio.NewReader(bytes.NewReader(file))
482+
for i := startIndex; i < count+startIndex; i++ {
483+
line, _, err := reader.ReadLine()
484+
if err == io.EOF {
485+
telegram.ReplyMessage(bot, message, "文件已读取完毕")
486+
break
487+
}
488+
if err != nil {
489+
telegram.ReplyMessage(bot, message, "读取文件失败: "+err.Error())
490+
return
491+
}
492+
sourceURL := sources.FindSourceURL(string(line))
493+
if sourceURL == "" {
494+
Logger.Warnf("不支持的链接: %s", string(line))
495+
failed++
496+
continue
497+
}
498+
Logger.Infof("posting artwork: %s", sourceURL)
499+
500+
artwork, _ := service.GetArtworkByURL(ctx, sourceURL)
501+
if artwork != nil {
502+
Logger.Debugf("作品已存在: %s", sourceURL)
503+
failed++
504+
continue
505+
}
506+
cachedArtwork, _ := service.GetCachedArtworkByURL(ctx, sourceURL)
507+
if cachedArtwork != nil {
508+
artwork = cachedArtwork.Artwork
509+
} else {
510+
artwork, err = sources.GetArtworkInfo(sourceURL)
511+
if err != nil {
512+
Logger.Errorf("获取作品信息失败: %s", err)
513+
failed++
514+
continue
515+
}
516+
}
517+
if err := fetcher.PostAndCreateArtwork(ctx, artwork, bot, storage.GetStorage(), message.Chat.ID); err != nil {
518+
Logger.Errorf("发布失败: %s", err)
519+
failed++
520+
telegram.ReplyMessage(bot, message, "发布失败: "+err.Error())
521+
return
522+
}
523+
if callbackMessage != nil {
524+
if i-startIndex == 0 || (i-startIndex)%10 == 0 {
525+
bot.EditMessageText(&telego.EditMessageTextParams{
526+
ChatID: message.Chat.ChatID(),
527+
MessageID: callbackMessage.MessageID,
528+
Text: fmt.Sprintf("总数: %d\n起始索引: %d\n间隔时间: %d秒\n已发布: %d\n失败: %d", count, startIndex, sleepTime, i, failed),
529+
})
530+
}
531+
}
532+
time.Sleep(time.Duration(sleepTime) * time.Second)
533+
}
534+
if callbackMessage != nil {
535+
text := fmt.Sprintf("发布完成\n\n总数: %d\n起始索引: %d\n已发布: %d\n失败: %d", count, startIndex, count, failed)
536+
bot.EditMessageCaption(&telego.EditMessageCaptionParams{
537+
ChatID: message.Chat.ChatID(),
538+
MessageID: callbackMessage.MessageID,
539+
Caption: text,
540+
})
541+
}
542+
telegram.ReplyMessage(bot, message, "批量发布作品完成")
543+
}

cmd/version.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
)
88

99
const (
10-
Version string = "0.7.8"
10+
Version string = "0.7.9"
1111
)
1212

1313
var VersionCmd = &cobra.Command{

0 commit comments

Comments
 (0)