Skip to content

Commit 997ed10

Browse files
committed
feat: set tags manually
1 parent a3be31d commit 997ed10

File tree

8 files changed

+139
-14
lines changed

8 files changed

+139
-14
lines changed

bot/bot.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ func RunPolling() {
5050
baseGroup.HandleMessageCtx(deletePicture, telegohandler.Or(telegohandler.CommandEqual("del"), telegohandler.CommandEqual("delete")))
5151
baseGroup.HandleMessageCtx(fetchArtwork, telegohandler.CommandEqual("fetch"))
5252
baseGroup.HandleMessageCtx(processPictures, telegohandler.CommandEqual("process_pictures"))
53-
baseGroup.HandleMessageCtx(setR18, telegohandler.CommandEqual("r18"))
53+
baseGroup.HandleMessageCtx(setArtworkR18, telegohandler.CommandEqual("r18"))
54+
baseGroup.HandleMessageCtx(setArtworkTags, telegohandler.Or(telegohandler.CommandEqual("tags"), telegohandler.CommandEqual("addtags"), telegohandler.CommandEqual("deltags")))
5455
baseGroup.HandleCallbackQueryCtx(postArtwork, telegohandler.CallbackDataContains("post_artwork"))
5556
baseGroup.HandleInlineQueryCtx(inlineQuery)
5657

bot/handlers_admin.go

+68-10
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,12 @@ func deletePicture(ctx context.Context, bot *telego.Bot, message telego.Message)
156156
telegram.ReplyMessage(bot, message, "从数据库中删除失败: "+err.Error())
157157
return
158158
}
159-
go telegram.ReplyMessage(bot, message, fmt.Sprintf("删除成功: %d", channelMessageID))
160-
go bot.DeleteMessage(telegoutil.Delete(telegram.ChannelChatID, channelMessageID))
159+
telegram.ReplyMessage(bot, message, fmt.Sprintf("在数据库中已删除消息id为 %d 的图片", channelMessageID))
160+
bot.DeleteMessage(telegoutil.Delete(telegram.ChannelChatID, channelMessageID))
161161

162162
if err := storage.GetStorage().DeletePicture(picture.StorageInfo); err != nil {
163163
Logger.Warnf("删除图片失败: %s", err)
164-
bot.SendMessage(telegoutil.Message(telegoutil.ID(message.From.ID), "删除图片失败: "+err.Error()))
164+
bot.SendMessage(telegoutil.Message(telegoutil.ID(message.From.ID), "在存储中删除图片文件失败: "+err.Error()))
165165
}
166166
return
167167
}
@@ -178,12 +178,12 @@ func deletePicture(ctx context.Context, bot *telego.Bot, message telego.Message)
178178
telegram.ReplyMessage(bot, message, "从数据库中删除失败: "+err.Error())
179179
return
180180
}
181-
go telegram.ReplyMessage(bot, message, fmt.Sprintf("删除成功: %d", channelMessageID))
181+
telegram.ReplyMessage(bot, message, fmt.Sprintf("在数据库中已删除消息id为 %d 的作品", channelMessageID))
182182
artworkMessageIDs := make([]int, len(artwork.Pictures))
183183
for i, picture := range artwork.Pictures {
184184
artworkMessageIDs[i] = picture.TelegramInfo.MessageID
185185
}
186-
go bot.DeleteMessages(&telego.DeleteMessagesParams{
186+
bot.DeleteMessages(&telego.DeleteMessagesParams{
187187
ChatID: telegram.ChannelChatID,
188188
MessageIDs: artworkMessageIDs,
189189
})
@@ -273,7 +273,7 @@ func postArtwork(ctx context.Context, bot *telego.Bot, query telego.CallbackQuer
273273
if service.CheckDeletedByURL(ctx, sourceURL) {
274274
if err := service.DeleteDeletedByURL(ctx, sourceURL); err != nil {
275275
Logger.Errorf("取消删除记录失败: %s", err)
276-
go bot.EditMessageCaption(&telego.EditMessageCaptionParams{
276+
bot.EditMessageCaption(&telego.EditMessageCaptionParams{
277277
ChatID: telegoutil.ID(query.Message.GetChat().ID),
278278
MessageID: query.Message.GetMessageID(),
279279
Caption: "取消删除记录失败: " + err.Error(),
@@ -286,7 +286,7 @@ func postArtwork(ctx context.Context, bot *telego.Bot, query telego.CallbackQuer
286286
}
287287
if err := fetcher.PostAndCreateArtwork(ctx, artwork, bot, storage.GetStorage(), query.From.ID); err != nil {
288288
Logger.Errorf("发布失败: %s", err)
289-
go bot.EditMessageCaption(&telego.EditMessageCaptionParams{
289+
bot.EditMessageCaption(&telego.EditMessageCaptionParams{
290290
ChatID: telegoutil.ID(query.Message.GetChat().ID),
291291
MessageID: query.Message.GetMessageID(),
292292
Caption: "发布失败: " + err.Error() + "\n\n" + time.Now().Format("2006-01-02 15:04:05"),
@@ -296,15 +296,15 @@ func postArtwork(ctx context.Context, bot *telego.Bot, query telego.CallbackQuer
296296
artwork, err = service.GetArtworkByURL(ctx, sourceURL)
297297
if err != nil {
298298
Logger.Errorf("获取发布后的作品信息失败: %s", err)
299-
go bot.EditMessageCaption(&telego.EditMessageCaptionParams{
299+
bot.EditMessageCaption(&telego.EditMessageCaptionParams{
300300
ChatID: telegoutil.ID(query.Message.GetChat().ID),
301301
MessageID: query.Message.GetMessageID(),
302302
Caption: "发布成功, 但获取作品信息失败: " + err.Error(),
303303
ReplyMarkup: nil,
304304
})
305305
return
306306
}
307-
go bot.EditMessageCaption(&telego.EditMessageCaptionParams{
307+
bot.EditMessageCaption(&telego.EditMessageCaptionParams{
308308
ChatID: telegoutil.ID(query.Message.GetChat().ID),
309309
MessageID: query.Message.GetMessageID(),
310310
Caption: "发布成功: " + artwork.Title + "\n\n发布时间: " + artwork.CreatedAt.Format("2006-01-02 15:04:05"),
@@ -331,7 +331,7 @@ func processPictures(ctx context.Context, bot *telego.Bot, message telego.Messag
331331
telegram.ReplyMessage(bot, message, "开始处理了")
332332
}
333333

334-
func setR18(ctx context.Context, bot *telego.Bot, message telego.Message) {
334+
func setArtworkR18(ctx context.Context, bot *telego.Bot, message telego.Message) {
335335
if !service.CheckAdminPermission(ctx, message.From.ID, types.PermissionEditArtwork) {
336336
telegram.ReplyMessage(bot, message, "你没有编辑作品的权限")
337337
return
@@ -355,3 +355,61 @@ func setR18(ctx context.Context, bot *telego.Bot, message telego.Message) {
355355
}
356356
telegram.ReplyMessage(bot, message, "该作品 R18 已标记为 "+strconv.FormatBool(!artwork.R18))
357357
}
358+
359+
func setArtworkTags(ctx context.Context, bot *telego.Bot, message telego.Message) {
360+
if !service.CheckAdminPermission(ctx, message.From.ID, types.PermissionEditArtwork) {
361+
telegram.ReplyMessage(bot, message, "你没有编辑作品的权限")
362+
return
363+
}
364+
365+
messageOrigin, ok := telegram.GetMessageOriginChannelArtworkPost(ctx, bot, message)
366+
if !ok {
367+
telegram.ReplyMessage(bot, message, "请回复一条频道的图片消息")
368+
return
369+
}
370+
371+
artwork, err := service.GetArtworkByMessageID(ctx, messageOrigin.MessageID)
372+
if err != nil {
373+
telegram.ReplyMessage(bot, message, "获取作品信息失败: "+err.Error())
374+
return
375+
}
376+
377+
cmd, _, args := telegoutil.ParseCommand(message.Text)
378+
if len(args) == 0 {
379+
telegram.ReplyMessage(bot, message, "请提供标签, 以空格分隔.\n不存在的标签将自动创建")
380+
return
381+
}
382+
tags := make([]string, 0)
383+
switch cmd {
384+
case "tags":
385+
tags = args
386+
case "addtags":
387+
tags = append(artwork.Tags, args...)
388+
case "deltags":
389+
tags = artwork.Tags[:]
390+
for _, arg := range args {
391+
for i, tag := range tags {
392+
if tag == arg {
393+
tags = append(tags[:i], tags[i+1:]...)
394+
break
395+
}
396+
}
397+
}
398+
}
399+
if err := service.UpdateArtworkTagsByURL(ctx, artwork.SourceURL, tags); err != nil {
400+
telegram.ReplyMessage(bot, message, "更新作品标签失败: "+err.Error())
401+
return
402+
}
403+
artwork, err = service.GetArtworkByURL(ctx, artwork.SourceURL)
404+
if err != nil {
405+
telegram.ReplyMessage(bot, message, "获取更新后的作品信息失败: "+err.Error())
406+
return
407+
}
408+
bot.EditMessageCaption(&telego.EditMessageCaptionParams{
409+
ChatID: telegram.ChannelChatID,
410+
MessageID: artwork.Pictures[0].TelegramInfo.MessageID,
411+
Caption: telegram.GetArtworkMarkdownCaption(artwork),
412+
ParseMode: telego.ModeMarkdownV2,
413+
})
414+
telegram.ReplyMessage(bot, message, "更新作品标签成功")
415+
}

bot/handlers_common.go

+3
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ Inline 查询支持同样的参数格式.
6565
/del - 删除图片 <消息id>
6666
/delete - 删除整个作品
6767
/r18 - 设置作品R18标记
68+
/tags - 更新作品标签(覆盖原有标签)
69+
/addtags - 添加作品标签
70+
/deltags - 删除作品标签
6871
/fetch - 手动开始一次抓取
6972
/process_pictures - 处理无哈希的图片
7073

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.6.7"
10+
Version string = "0.6.8"
1111
)
1212

1313
var VersionCmd = &cobra.Command{

common/strings.go

+13
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,16 @@ func ParseStringTo2DArray(str, sep, sep2 string) ([][]string, error) {
8989

9090
return result, nil
9191
}
92+
93+
// 去除字符串切片中的重复元素
94+
func RemoveDuplicateStringSlice(s []string) []string {
95+
encountered := map[string]bool{}
96+
result := []string{}
97+
for _, str := range s {
98+
if !encountered[str] {
99+
encountered[str] = true
100+
result = append(result, str)
101+
}
102+
}
103+
return result
104+
}

dao/artwork.go

+4
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ func UpdateArtworkR18ByID(ctx context.Context, id primitive.ObjectID, r18 bool)
138138
return artworkCollection.UpdateOne(ctx, bson.M{"_id": id}, bson.M{"$set": bson.M{"r18": r18}})
139139
}
140140

141+
func UpdateArtworkTagsByID(ctx context.Context, id primitive.ObjectID, tags []primitive.ObjectID) (*mongo.UpdateResult, error) {
142+
return artworkCollection.UpdateOne(ctx, bson.M{"_id": id}, bson.M{"$set": bson.M{"tags": tags}})
143+
}
144+
141145
func DeleteArtworkByID(ctx context.Context, id primitive.ObjectID) (*mongo.DeleteResult, error) {
142146
return artworkCollection.DeleteOne(ctx, bson.M{"_id": id})
143147
}

service/artwork.go

+46
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package service
22

33
import (
44
"ManyACG/adapter"
5+
"ManyACG/common"
56
"ManyACG/dao"
67
es "ManyACG/errors"
78
"ManyACG/model"
@@ -241,6 +242,51 @@ func UpdateArtworkR18ByURL(ctx context.Context, sourceURL string, r18 bool) erro
241242
return nil
242243
}
243244

245+
func UpdateArtworkTagsByURL(ctx context.Context, sourceURL string, tags []string) error {
246+
artworkModel, err := dao.GetArtworkByURL(ctx, sourceURL)
247+
if err != nil {
248+
return err
249+
}
250+
251+
session, err := dao.Client.StartSession()
252+
if err != nil {
253+
return err
254+
}
255+
defer session.EndSession(ctx)
256+
tags = common.RemoveDuplicateStringSlice(tags)
257+
tagIDs := make([]primitive.ObjectID, len(tags))
258+
_, err = session.WithTransaction(ctx, func(ctx mongo.SessionContext) (interface{}, error) {
259+
for i, tag := range tags {
260+
tagModel, err := dao.GetTagByName(ctx, tag)
261+
if err != nil && !errors.Is(err, mongo.ErrNoDocuments) {
262+
return nil, err
263+
}
264+
if tagModel != nil {
265+
tagIDs[i] = tagModel.ID
266+
continue
267+
}
268+
tagModel = &model.TagModel{
269+
Name: tag,
270+
}
271+
res, err := dao.CreateTag(ctx, tagModel)
272+
if err != nil {
273+
return nil, err
274+
}
275+
tagIDs[i] = res.InsertedID.(primitive.ObjectID)
276+
}
277+
278+
_, err = dao.UpdateArtworkTagsByID(ctx, artworkModel.ID, tagIDs)
279+
if err != nil {
280+
return nil, err
281+
}
282+
return nil, nil
283+
})
284+
if err != nil {
285+
return err
286+
}
287+
return nil
288+
}
289+
244290
func DeleteArtworkByURL(ctx context.Context, sourceURL string) error {
245291
artworkModel, err := dao.GetArtworkByURL(ctx, sourceURL)
246292
if err != nil {

telegram/telegram.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ func InitBot() {
5252
},
5353
{
5454
Command: "setu",
55-
Description: "来点涩图 <tag1> <tag2> ...",
55+
Description: "来点涩图",
5656
},
5757
{
5858
Command: "random",
59-
Description: "随机1张全年龄图片 <tag1> <tag2> ...",
59+
Description: "随机1张全年龄图片",
6060
},
6161
{
6262
Command: "search",

0 commit comments

Comments
 (0)