Files
tg_exporter/internal/cmd_publish.go
2024-09-04 13:29:15 +08:00

113 lines
2.6 KiB
Go

package internal
import (
"context"
"encoding/json"
"fmt"
"os"
"path/filepath"
"exporter/config"
"exporter/database/telegram_resource/public/model"
"exporter/database/telegram_resource/public/table"
"exporter/pkg/memos"
. "github.com/go-jet/jet/v2/postgres"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
func PublishCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "publish",
Short: "publish posts",
RunE: func(cmd *cobra.Command, args []string) error {
return publishCmd(context.Background())
},
}
return cmd
}
type publishMsg struct {
model.ChannelMessages
model.Channels
}
func publishCmd(ctx context.Context) error {
var msg publishMsg
tbl := table.ChannelMessages
tblC := table.Channels
stmt := tbl.SELECT(tbl.AllColumns, tblC.Title).
WHERE(tbl.Published.IS_FALSE()).
LIMIT(1).
FROM(tbl.LEFT_JOIN(tblC, tbl.ChannelID.EQ(tblC.UUID)))
if err := stmt.QueryContext(context.Background(), db, &msg); err != nil {
return errors.Wrap(err, "failed to get message")
}
// publish item
if err := publish(ctx, msg); err != nil {
return errors.Wrap(err, "failed to publish")
}
_, err := tbl.UPDATE().SET(tbl.Published.SET(Bool(true))).WHERE(tbl.ID.EQ(Int64(msg.ChannelMessages.ID))).ExecContext(ctx, db)
if err != nil {
return err
}
return nil
}
func publish(_ context.Context, msg publishMsg) error {
memos.InitClient(config.C.PublishHost, config.C.PublishToken)
data := memos.PostData{
Content: *msg.ChannelMessages.Content,
ChannelID: msg.ChannelMessages.ChannelID,
ChannelTitle: msg.Channels.Title,
Resources: []memos.Resource{},
}
var medias []ChannelMessageMedia
if err := json.Unmarshal([]byte(msg.ChannelMessages.Media), &medias); err != nil {
return errors.Wrap(err, "failed to unmarshal media")
}
for _, media := range medias {
res := memos.Resource{}
var file string
if media.Photo != nil {
res.Type = "image/jpeg"
res.Filename = *media.Photo
file = fmt.Sprintf("%d/%s", data.ChannelID, *media.Photo)
} else if media.Document != nil {
res.Type = media.Document.MimeType
res.Filename = media.Document.Filename
file = fmt.Sprintf("%d/%d%s", data.ChannelID, media.AssetID, media.Document.Ext)
} else if media.WebPage != nil {
data.Content += fmt.Sprintf("\n\n[%s](%s)", media.WebPage.Title, media.WebPage.URL)
} else {
return errors.New("unknown media type")
}
filepath := filepath.Join(config.C.Output, file)
b, err := os.ReadFile(filepath)
if err != nil {
return err
}
res.Content = b
resource, err := memos.Upload(res)
if err != nil {
return err
}
data.Resources = append(data.Resources, resource)
}
return memos.Post(data)
}