@@ -9,9 +9,12 @@ import (
9
9
"ManyACG/storage"
10
10
"ManyACG/telegram"
11
11
"ManyACG/types"
12
+ "bufio"
13
+ "bytes"
12
14
"context"
13
15
"errors"
14
16
"fmt"
17
+ "io"
15
18
"strconv"
16
19
"strings"
17
20
"time"
@@ -416,3 +419,125 @@ func setArtworkTags(ctx context.Context, bot *telego.Bot, message telego.Message
416
419
})
417
420
telegram .ReplyMessage (bot , message , "更新作品标签成功" )
418
421
}
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
+ }
0 commit comments