From 3aa1e2eaed88317de02ed32ad15c95024396a46c Mon Sep 17 00:00:00 2001 From: krau <71133316+krau@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:17:56 +0800 Subject: [PATCH] feat: enhance text message handling and parser configuration --- client/bot/handlers/parse.go | 22 ++++++++------ parsers/parser.go | 56 ++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 30 deletions(-) diff --git a/client/bot/handlers/parse.go b/client/bot/handlers/parse.go index a732c19..95ef911 100644 --- a/client/bot/handlers/parse.go +++ b/client/bot/handlers/parse.go @@ -20,7 +20,16 @@ import ( func handleTextMessage(ctx *ext.Context, u *ext.Update) error { logger := log.FromContext(ctx) text := u.EffectiveMessage.Text - item, err := parsers.ParseWithContext(ctx, text) + ok, pser := parsers.CanHandle(text) + if !ok { + return dispatcher.EndGroups + } + msg, err := ctx.Reply(u, ext.ReplyTextString("正在解析..."), nil) + if err != nil { + return err + } + + item, err := pser.Parse(ctx, text) if errors.Is(err, parsers.ErrNoParserFound) { return dispatcher.EndGroups } @@ -29,7 +38,7 @@ func handleTextMessage(ctx *ext.Context, u *ext.Update) error { ctx.Reply(u, ext.ReplyTextString("Failed to parse text: "+err.Error()), nil) return dispatcher.EndGroups } - logger.Debug("Parsed item from text message", "text", text, "item", item) + logger.Debug("Parsed item from text message", "title", item.Title, "url", item.URL) userID := u.GetUserChat().GetID() markup, err := msgelem.BuildAddSelectStorageKeyboard(storage.GetUserStorages(ctx, userID), tcbdata.Add{ TaskType: tasktype.TaskTypeParseditem, @@ -46,14 +55,11 @@ func handleTextMessage(ctx *ext.Context, u *ext.Update) error { ctx.Reply(u, ext.ReplyTextString("Failed to build parsed text entity: "+err.Error()), nil) return dispatcher.EndGroups } - ctx.SendMessage(userID, &tg.MessagesSendMessageRequest{ + ctx.EditMessage(userID, &tg.MessagesEditMessageRequest{ Message: text, ReplyMarkup: markup, Entities: entities, - ReplyTo: &tg.InputReplyToMessage{ - ReplyToMsgID: u.EffectiveMessage.ID, - ReplyToPeerID: u.GetUserChat().AsInputPeer(), - }, + ID: msg.ID, }) return dispatcher.EndGroups @@ -80,7 +86,7 @@ func handleSilentSaveText(ctx *ext.Context, u *ext.Update) error { ctx.Reply(u, ext.ReplyTextString("Failed to parse text: "+err.Error()), nil) return dispatcher.EndGroups } - logger.Debug("Parsed item from text message", "text", text, "item", item) + logger.Debug("Parsed item from text message", "title", item.Title, "url", item.URL) userID := u.GetUserChat().GetID() text, entities, err := msgelem.BuildParsedTextEntity(*item) if err != nil { diff --git a/parsers/parser.go b/parsers/parser.go index 60c0882..f05db3e 100644 --- a/parsers/parser.go +++ b/parsers/parser.go @@ -6,32 +6,16 @@ import ( "sync" "github.com/krau/SaveAny-Bot/config" + "github.com/krau/SaveAny-Bot/parsers/kemono" "github.com/krau/SaveAny-Bot/parsers/twitter" "github.com/krau/SaveAny-Bot/pkg/parser" ) var ( - parsers []parser.Parser - parsersMu sync.Mutex - doConfig sync.Once -) - -func AddParser(p ...parser.Parser) { - parsersMu.Lock() - defer parsersMu.Unlock() - parsers = append(parsers, p...) -} - -func init() { - AddParser(new(twitter.TwitterParser)) -} - -var ( - ErrNoParserFound = fmt.Errorf("no parser found for the given URL") -) - -func ParseWithContext(ctx context.Context, url string) (*parser.Item, error) { - doConfig.Do(func() { + parsers []parser.Parser + parsersMu sync.Mutex + doConfig sync.Once + configParsers = func() { if len(parsers) == 0 { return } @@ -45,7 +29,25 @@ func ParseWithContext(ctx context.Context, url string) (*parser.Item, error) { } } } - }) + } +) + +func AddParser(p ...parser.Parser) { + parsersMu.Lock() + defer parsersMu.Unlock() + parsers = append(parsers, p...) +} + +func init() { + AddParser(new(twitter.TwitterParser), new(kemono.KemonoParser)) +} + +var ( + ErrNoParserFound = fmt.Errorf("no parser found for the given URL") +) + +func ParseWithContext(ctx context.Context, url string) (*parser.Item, error) { + doConfig.Do(configParsers) ch := make(chan *parser.Item, 1) errCh := make(chan error, 1) @@ -74,3 +76,13 @@ func ParseWithContext(ctx context.Context, url string) (*parser.Item, error) { return nil, ctx.Err() } } + +func CanHandle(url string) (bool, parser.Parser) { + doConfig.Do(configParsers) + for _, pser := range parsers { + if pser.CanHandle(url) { + return true, pser + } + } + return false, nil +}