Skip to content

Commit c369c1d

Browse files
committed
fix: Correctly handle message id == 0
1 parent 0f9df67 commit c369c1d

File tree

9 files changed

+48
-11
lines changed

9 files changed

+48
-11
lines changed

dao/picture.go

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ func CreatePictures(ctx context.Context, pictures []*model.PictureModel) (*mongo
2929
return pictureCollection.InsertMany(ctx, docs)
3030
}
3131

32+
// Deprecated: MessageID 现在可能为 0
3233
func GetPictureByMessageID(ctx context.Context, messageID int) (*model.PictureModel, error) {
3334
var picture model.PictureModel
3435
err := pictureCollection.FindOne(ctx, bson.M{"telegram_info.message_id": messageID}).Decode(&picture)

service/artwork.go

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ func GetArtworkByURL(ctx context.Context, sourceURL string, opts ...*adapter.Ada
154154
return adapter.ConvertToArtwork(ctx, artworkModel, opts...)
155155
}
156156

157+
// Deprecated: MessageID 现在可能为 0
157158
func GetArtworkByMessageID(ctx context.Context, messageID int, opts ...*adapter.AdapterOption) (*types.Artwork, error) {
158159
pictureModel, err := dao.GetPictureByMessageID(ctx, messageID)
159160
if err != nil {

service/picture.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"go.mongodb.org/mongo-driver/mongo"
1313
)
1414

15+
// Deprecated: MessageID 现在可能为 0
1516
func GetPictureByMessageID(ctx context.Context, messageID int) (*types.Picture, error) {
1617
pictureModel, err := dao.GetPictureByMessageID(ctx, messageID)
1718
if err != nil {
@@ -52,7 +53,7 @@ func UpdatePictureTelegramInfo(ctx context.Context, picture *types.Picture, tele
5253
}
5354

5455
/*
55-
删除 Picture
56+
通过消息删除 Picture
5657
5758
如果删除后 Artwork 中没有 Picture , 则也删除 Artwork
5859

telegram/bot.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ var (
2020
BotUsername string // 没有 @
2121
ChannelChatID telego.ChatID
2222
GroupChatID telego.ChatID // 附属群组
23-
IsChannelAvailable bool
23+
IsChannelAvailable bool // 是否可以发布到频道
2424
)
2525

2626
var (

telegram/handlers/admin_delete_artwork.go

+5
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ func DeletePicture(ctx context.Context, bot *telego.Bot, message telego.Message)
4040
}
4141
channelMessageID = originChannel.MessageID
4242
}
43+
44+
if channelMessageID == 0 {
45+
return
46+
}
47+
4348
if cmd == "del" {
4449
picture, err := service.GetPictureByMessageID(ctx, channelMessageID)
4550
if err != nil {

telegram/handlers/help.go

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ func Help(ctx context.Context, bot *telego.Bot, message telego.Message) {
1616
/search - 搜索相似图片
1717
/info - 计算图片信息
1818
/stats - 获取统计数据
19-
2019
`
2120

2221
if IsChannelAvailable {

telegram/handlers/search_picture.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package handlers
22

33
import (
44
"ManyACG/common"
5+
. "ManyACG/logger"
56
"ManyACG/service"
67
"ManyACG/telegram/utils"
78
"ManyACG/types"
@@ -10,6 +11,7 @@ import (
1011

1112
"github.com/mymmrac/telego"
1213
"github.com/mymmrac/telego/telegoutil"
14+
"go.mongodb.org/mongo-driver/bson/primitive"
1315
)
1416

1517
func SearchPicture(ctx context.Context, bot *telego.Bot, message telego.Message) {
@@ -66,16 +68,22 @@ func getSearchResult(ctx context.Context, hasPermission bool, fileBytes []byte)
6668
if len(pictures) > 0 {
6769
text := fmt.Sprintf("找到%d张相似的图片\n\n", len(pictures))
6870
for _, picture := range pictures {
69-
artwork, err := service.GetArtworkByMessageID(ctx, picture.TelegramInfo.MessageID)
71+
artworkObjectID, err := primitive.ObjectIDFromHex(picture.ArtworkID)
7072
if err != nil {
73+
Logger.Errorf("无效的ObjectID: %s", picture.ID)
74+
continue
75+
}
76+
artwork, err := service.GetArtworkByID(ctx, artworkObjectID)
77+
if err != nil {
78+
Logger.Errorf("获取作品信息失败: %s", err)
7179
continue
7280
}
7381
text += fmt.Sprintf("[%s\\_%d](%s)\n",
7482
common.EscapeMarkdown(artwork.Title),
7583
picture.Index+1,
7684
common.EscapeMarkdown(artwork.SourceURL),
7785
)
78-
if channelMessageAvailable {
86+
if channelMessageAvailable && picture.TelegramInfo != nil && picture.TelegramInfo.MessageID != 0 {
7987
text += fmt.Sprintf("[频道消息](%s)\n", utils.GetArtworkPostMessageURL(picture.TelegramInfo.MessageID, ChannelChatID))
8088
}
8189
text += common.EscapeMarkdown(fmt.Sprintf("模糊度: %.2f\n\n", picture.BlurScore))

telegram/utils/post_artwork.go

+27-5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717

1818
"github.com/mymmrac/telego"
1919
"github.com/mymmrac/telego/telegoutil"
20+
"go.mongodb.org/mongo-driver/bson/primitive"
2021
"go.mongodb.org/mongo-driver/mongo"
2122
)
2223

@@ -213,7 +214,12 @@ func afterCreate(ctx context.Context, artwork *types.Artwork, bot *telego.Bot, f
213214
Logger.Errorf("error when getting artwork by URL: %s", err)
214215
if sendNotify {
215216
bot.SendMessage(telegoutil.Messagef(telegoutil.ID(fromID),
216-
"刚刚发布的作品 [%s](%s) 后续处理失败\\: \n无法获取作品信息\\: %s", artworkTitleMarkdown, GetArtworkPostMessageURL(artwork.Pictures[0].TelegramInfo.MessageID, ChannelChatID), err).
217+
"刚刚发布的作品 [%s](%s) 后续处理失败\\: \n无法获取作品信息\\: %s", artworkTitleMarkdown, func() string {
218+
if artwork.Pictures[0].TelegramInfo.MessageID != 0 {
219+
return GetArtworkPostMessageURL(artwork.Pictures[0].TelegramInfo.MessageID, ChannelChatID)
220+
}
221+
return artwork.SourceURL
222+
}(), err).
217223
WithParseMode(telego.ModeMarkdownV2))
218224
}
219225
return
@@ -252,20 +258,36 @@ func afterCreate(ctx context.Context, artwork *types.Artwork, bot *telego.Bot, f
252258

253259
text := fmt.Sprintf("*刚刚发布的作品 [%s](%s) 中第 %d 张图片搜索到有%d个相似图片*\n",
254260
artworkTitleMarkdown,
255-
common.EscapeMarkdown(GetArtworkPostMessageURL(picture.TelegramInfo.MessageID, ChannelChatID)),
261+
common.EscapeMarkdown(func() string {
262+
if picture.TelegramInfo.MessageID != 0 {
263+
return GetArtworkPostMessageURL(picture.TelegramInfo.MessageID, ChannelChatID)
264+
}
265+
return artwork.SourceURL
266+
}()),
256267
picture.Index+1,
257268
len(similarPictures))
258269
text += common.EscapeMarkdown(fmt.Sprintf("该图像模糊度: %.2f\n搜索到的相似图片列表:\n\n", picture.BlurScore))
259270
for _, similarPicture := range similarPictures {
260-
artworkOfSimilarPicture, err := service.GetArtworkByMessageID(ctx, similarPicture.TelegramInfo.MessageID)
271+
pictureObjectID, err := primitive.ObjectIDFromHex(similarPicture.ID)
261272
if err != nil {
262-
text += common.EscapeMarkdown(fmt.Sprintf("%s 模糊度: %.2f\n\n", GetArtworkPostMessageURL(picture.TelegramInfo.MessageID, ChannelChatID), similarPicture.BlurScore))
273+
Logger.Errorf("invalid ObjectID: %s", similarPicture.ID)
274+
continue
275+
}
276+
277+
artworkOfSimilarPicture, err := service.GetArtworkByID(ctx, pictureObjectID)
278+
if err != nil {
279+
Logger.Warnf("error when getting artwork by ID: %s", err)
263280
continue
264281
}
265282
text += fmt.Sprintf("[%s\\_%d](%s) ",
266283
common.EscapeMarkdown(artworkOfSimilarPicture.Title),
267284
similarPicture.Index+1,
268-
common.EscapeMarkdown(GetArtworkPostMessageURL(similarPicture.TelegramInfo.MessageID, ChannelChatID)))
285+
common.EscapeMarkdown(func() string {
286+
if similarPicture.TelegramInfo.MessageID != 0 {
287+
return GetArtworkPostMessageURL(similarPicture.TelegramInfo.MessageID, ChannelChatID)
288+
}
289+
return artworkOfSimilarPicture.SourceURL
290+
}()))
269291
text += common.EscapeMarkdown(fmt.Sprintf("模糊度: %.2f\n\n", similarPicture.BlurScore))
270292
}
271293
text += "_模糊度使用原图文件计算得出, 越小图像质量越好_"

telegram/utils/utils.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ func SendPictureFileByID(ctx context.Context, bot *telego.Bot, message telego.Me
218218
WithReplyParameters(&telego.ReplyParameters{
219219
MessageID: message.MessageID,
220220
})
221-
if IsChannelAvailable {
221+
if IsChannelAvailable && picture.TelegramInfo != nil && picture.TelegramInfo.MessageID != 0 {
222222
document.WithReplyMarkup(telegoutil.InlineKeyboard([]telego.InlineKeyboardButton{
223223
telegoutil.InlineKeyboardButton("详情").WithURL(GetArtworkPostMessageURL(picture.TelegramInfo.MessageID, channelChatID)),
224224
}))

0 commit comments

Comments
 (0)