@ -6,17 +6,22 @@ import (
"encoding/json"
"fmt"
"path/filepath"
"slices"
"strconv"
"time"
"unicode/utf16"
"github.com/lithammer/shortuuid/v4"
"github.com/pkg/errors"
"github.com/yourselfhosted/gomark/ast"
"github.com/yourselfhosted/gomark/parser"
"github.com/yourselfhosted/gomark/parser/tokenizer"
"github.com/usememos/memos/plugin/telegram"
"github.com/usememos/memos/plugin/webhook"
storepb "github.com/usememos/memos/proto/gen/store"
apiv1 "github.com/usememos/memos/server/route/api/v1"
apiv2 "github.com/usememos/memos/server/route/api/v2"
"github.com/usememos/memos/store"
)
@ -48,6 +53,7 @@ func (t *TelegramHandler) MessageHandle(ctx context.Context, bot *telegram.Bot,
return errors . Wrap ( err , "Failed to SendReplyMessage" )
}
messageSenderID := strconv . FormatInt ( message . From . ID , 10 )
var creatorID int32
userSettingList , err := t . store . ListUserSettings ( ctx , & store . FindUserSetting {
Key : storepb . UserSettingKey_USER_SETTING_TELEGRAM_USER_ID ,
@ -56,11 +62,12 @@ func (t *TelegramHandler) MessageHandle(ctx context.Context, bot *telegram.Bot,
return errors . Wrap ( err , "Failed to find userSettingList" )
}
for _ , userSetting := range userSettingList {
if userSetting . GetTelegramUserId ( ) == strconv. FormatInt ( message . From . ID , 10 ) {
if userSetting . GetTelegramUserId ( ) == messageSenderID {
creatorID = userSetting . UserId
}
}
// If creatorID is not found, ask the user to set the telegram userid in UserSetting of memos.
if creatorID == 0 {
_ , err := bot . EditMessage ( ctx , message . Chat . ID , reply . MessageID , fmt . Sprintf ( "Please set your telegram userid %d in UserSetting of memos" , message . From . ID ) , nil )
return err
@ -71,26 +78,46 @@ func (t *TelegramHandler) MessageHandle(ctx context.Context, bot *telegram.Bot,
CreatorID : creatorID ,
Visibility : store . Private ,
}
if message . Text != nil {
create . Content = convertToMarkdown ( * message . Text , message . Entities )
}
if message . Caption != nil {
create . Content = convertToMarkdown ( * message . Caption , message . CaptionEntities )
}
if message . ForwardFromChat != nil {
create . Content += fmt . Sprintf ( "\n\n[Message link](%s)" , message . GetMessageLink ( ) )
}
memoMessage , err := t . store . CreateMemo ( ctx , create )
if err != nil {
_ , err := bot . EditMessage ( ctx , message . Chat . ID , reply . MessageID , fmt . Sprintf ( "Failed to CreateMemo: %s" , err ) , nil )
return err
}
// create resources
// Dynamically upsert tags from memo content.
nodes , err := parser . Parse ( tokenizer . Tokenize ( create . Content ) )
if err != nil {
return errors . Wrap ( err , "Failed to parse content" )
}
tags := [ ] string { }
apiv2 . TraverseASTNodes ( nodes , func ( node ast . Node ) {
if tagNode , ok := node . ( * ast . Tag ) ; ok {
tag := tagNode . Content
if ! slices . Contains ( tags , tag ) {
tags = append ( tags , tag )
}
}
} )
for _ , tag := range tags {
_ , err := t . store . UpsertTag ( ctx , & store . Tag {
Name : tag ,
CreatorID : creatorID ,
} )
if err != nil {
return errors . Wrap ( err , "Failed to upsert tag" )
}
}
// Create memo related resources.
for _ , attachment := range attachments {
// Fill the common field of create
create := store . Resource {
@ -117,9 +144,7 @@ func (t *TelegramHandler) MessageHandle(ctx context.Context, bot *telegram.Bot,
keyboard := generateKeyboardForMemoID ( memoMessage . ID )
_ , err = bot . EditMessage ( ctx , message . Chat . ID , reply . MessageID , fmt . Sprintf ( "Saved as %s Memo %d" , memoMessage . Visibility , memoMessage . ID ) , keyboard )
_ = t . dispatchMemoRelatedWebhook ( ctx , * memoMessage , "memos.memo.created" )
return err
}
@ -233,6 +258,9 @@ func convertToMarkdown(text string, messageEntities []telegram.MessageEntity) st
case telegram . TextLink :
before = "["
after = fmt . Sprintf ( ` ](%s) ` , e . URL )
case telegram . Spoiler :
before = "||"
after = "||"
}
if before != "" {