diff options
| -rw-r--r-- | cmd/gos/main.go | 15 | ||||
| -rw-r--r-- | internal/config/args.go | 4 | ||||
| -rw-r--r-- | internal/entry/entry.go | 12 | ||||
| -rw-r--r-- | internal/platforms/linkedin/linkedin.go | 14 | ||||
| -rw-r--r-- | internal/platforms/mastodon/mastodon.go | 4 | ||||
| -rw-r--r-- | internal/queue/queue.go | 2 | ||||
| -rw-r--r-- | internal/queue/sharetags.go | 4 | ||||
| -rw-r--r-- | internal/queue/sharetags_test.go | 8 | ||||
| -rw-r--r-- | internal/run.go | 10 |
9 files changed, 49 insertions, 24 deletions
diff --git a/cmd/gos/main.go b/cmd/gos/main.go index 6ea4995..3a4a676 100644 --- a/cmd/gos/main.go +++ b/cmd/gos/main.go @@ -7,6 +7,7 @@ import ( "log" "os" "path/filepath" + "strconv" "strings" "time" @@ -23,7 +24,7 @@ func main() { browser := flag.String("browser", "firefox", "OAuth2 browser") secretsConfigPath := filepath.Join(os.Getenv("HOME"), ".config/gos/gosec.json") secretsConfigPath = *flag.String("secretsConfig", secretsConfigPath, "Gos' secret config") - platforms := flag.String("platforms", "Mastodon,LinkedIn", "Platforms enabled") + platforms := flag.String("platforms", "Mastodon:500,LinkedIn:1000", "Platforms enabled plus their post size limits") target := flag.Int("target", 2, "How many posts per week are the target?") lookback := flag.Int("lookback", 30, "How many days look back in time for posting history") flag.Parse() @@ -36,13 +37,23 @@ func main() { args := config.Args{ DryRun: *dry, GosDir: *gosDir, - Platforms: strings.Split(*platforms, ","), + Platforms: make(map[string]int), Target: *target, Lookback: time.Duration(*lookback) * time.Hour * 24, SecretsConfigPath: secretsConfigPath, Secrets: secrets, OAuth2Browser: *browser, } + for _, platform := range strings.Split(*platforms, ",") { + // E.g. Mastodon:500 + parts := strings.Split(platform, ":") + var err error + // E.g. args.Platform["mastodon"] = 500 + args.Platforms[parts[0]], err = strconv.Atoi(parts[1]) + if err != nil { + log.Fatalln(err) + } + } if err := args.Validate(); err != nil { log.Fatal(err) diff --git a/internal/config/args.go b/internal/config/args.go index 3bfa78e..47712f9 100644 --- a/internal/config/args.go +++ b/internal/config/args.go @@ -12,7 +12,7 @@ var validPlatforms = []string{"mastodon", "linkedin"} type Args struct { GosDir string DryRun bool - Platforms []string + Platforms map[string]int // Platform name and post size limits Target int Lookback time.Duration SecretsConfigPath string @@ -21,7 +21,7 @@ type Args struct { } func (a Args) Validate() error { - for _, platform := range a.Platforms { + for platform := range a.Platforms { if !slices.Contains(validPlatforms, strings.ToLower(platform)) { return fmt.Errorf("Platform %s not supported", platform) } diff --git a/internal/entry/entry.go b/internal/entry/entry.go index 5a9c0fb..e1d9696 100644 --- a/internal/entry/entry.go +++ b/internal/entry/entry.go @@ -80,6 +80,18 @@ func (e Entry) Content() (string, error) { return string(bytes), err } +func (e Entry) ContentWithLimit(sizeLimit int) (string, error) { + content, err := e.Content() + if err != nil { + return "", err + } + if len(content) > sizeLimit { + return "", fmt.Errorf("entry content exceeds size limit: %d > %d: %v", + len(content), sizeLimit, e) + } + return content, nil +} + func (e *Entry) MarkPosted() error { if e.State != Queued { return errors.New("entry is not queued") diff --git a/internal/platforms/linkedin/linkedin.go b/internal/platforms/linkedin/linkedin.go index 401d5a3..5f68edf 100644 --- a/internal/platforms/linkedin/linkedin.go +++ b/internal/platforms/linkedin/linkedin.go @@ -19,18 +19,18 @@ import ( var errUnauthorized = errors.New("unauthorized access, refresh or create token?") // TODO: Also implemebt a Text Platform output, which then laster can be -// processed by Gemtexter as a page -func Post(ctx context.Context, args config.Args, ent entry.Entry) error { - err := post(ctx, args, ent) +// processed by Gemtexter as a page. Or not? +func Post(ctx context.Context, args config.Args, sizeLimit int, ent entry.Entry) error { + err := post(ctx, args, sizeLimit, ent) if errors.Is(err, errUnauthorized) { log.Println(err, "=> trying to refresh LinkedIn access token") args.Secrets.LinkedInAccessToken = "" // Reset the token - return post(ctx, args, ent) + return post(ctx, args, sizeLimit, ent) } return err } -func post(ctx context.Context, args config.Args, ent entry.Entry) error { +func post(ctx context.Context, args config.Args, sizeLimit int, ent entry.Entry) error { if args.DryRun { log.Println("Not posting", ent, "to LinkedIn as dry-run enabled") return nil @@ -39,9 +39,9 @@ func post(ctx context.Context, args config.Args, ent entry.Entry) error { if err != err { return err } - content, err := ent.Content() + content, err := ent.ContentWithLimit(sizeLimit) if err != nil { - return nil + return err } return callLinkedInAPI(personID, accessToken, content) } diff --git a/internal/platforms/mastodon/mastodon.go b/internal/platforms/mastodon/mastodon.go index 7cdb513..ce9a765 100644 --- a/internal/platforms/mastodon/mastodon.go +++ b/internal/platforms/mastodon/mastodon.go @@ -13,8 +13,8 @@ import ( "codeberg.org/snonux/gos/internal/prompt" ) -func Post(ctx context.Context, args config.Args, ent entry.Entry) error { - content, err := ent.Content() +func Post(ctx context.Context, args config.Args, sizeLimit int, ent entry.Entry) error { + content, err := ent.ContentWithLimit(sizeLimit) if err != nil { return err } diff --git a/internal/queue/queue.go b/internal/queue/queue.go index 73d5789..ddd3136 100644 --- a/internal/queue/queue.go +++ b/internal/queue/queue.go @@ -65,7 +65,7 @@ func queuePlatforms(args config.Args) error { } for filePath := range ch { - for _, platform := range args.Platforms { + for platform := range args.Platforms { if newShareTags(args, filePath).IsExcluded(platform) { log.Println("Not queueing entry", filePath, "to platform", platform, "as it is excluded") continue diff --git a/internal/queue/sharetags.go b/internal/queue/sharetags.go index 53d6306..b8088c0 100644 --- a/internal/queue/sharetags.go +++ b/internal/queue/sharetags.go @@ -32,7 +32,9 @@ func newShareTags(args config.Args, filePath string) shareTags { if len(s.includes) == 0 && len(s.excludes) == 0 { // If nothing found, include all of them - s.includes = args.Platforms + for platform := range args.Platforms { + s.includes = append(s.includes, platform) + } } return s diff --git a/internal/queue/sharetags_test.go b/internal/queue/sharetags_test.go index b2dbeec..2a2a6aa 100644 --- a/internal/queue/sharetags_test.go +++ b/internal/queue/sharetags_test.go @@ -10,10 +10,10 @@ import ( func TestShareTagsPositive(t *testing.T) { t.Parallel() - args := config.Args{Platforms: []string{"mastodon", "linkedin"}} + args := config.Args{Platforms: map[string]int{"mastodon": 100, "linkedin": 100}} testTable := map[string]shareTags{ "./foo/bar.without.tags.txt": { - includes: args.Platforms, // No tags: default platforms + includes: []string{"mastodon", "linkedin"}, }, "./foo/bar.share:linkedin.txt": { includes: []string{"linkedin"}, @@ -46,7 +46,7 @@ func TestShareTagsPositive(t *testing.T) { func TestShareTagsNegative(t *testing.T) { t.Parallel() - args := config.Args{Platforms: []string{"mastodon", "linkedin"}} + args := config.Args{Platforms: map[string]int{"mastodon": 100, "linkedin": 100}} testTable := map[string]shareTags{ "./foo/bar.without.tags.txt": { includes: []string{"linkedin"}, @@ -101,7 +101,7 @@ func TestShareTagsIsIncluded(t *testing.T) { } } } - args := config.Args{Platforms: []string{"mastodon", "linkedin"}} + args := config.Args{Platforms: map[string]int{"mastodon": 100, "linkedin": 100}} filePath := "foo/bar/baz.txt" t.Run(filePath, func(t *testing.T) { diff --git a/internal/run.go b/internal/run.go index acf0525..ed70511 100644 --- a/internal/run.go +++ b/internal/run.go @@ -20,8 +20,8 @@ func Run(ctx context.Context, args config.Args) error { return err } - for _, platform := range args.Platforms { - if err := runPlatform(ctx, args, platform); err != nil { + for platform, sizeLimit := range args.Platforms { + if err := runPlatform(ctx, args, platform, sizeLimit); err != nil { if errors.Is(err, prompt.ErrAborted) { log.Println("Aborted posting to", platform) continue @@ -33,7 +33,7 @@ func Run(ctx context.Context, args config.Args) error { return nil } -func runPlatform(ctx context.Context, args config.Args, platform string) error { +func runPlatform(ctx context.Context, args config.Args, platform string, sizeLimit int) error { ent, err := schedule.Run(args, platform) switch { case errors.Is(err, schedule.ErrNothingToSchedule): @@ -47,7 +47,7 @@ func runPlatform(ctx context.Context, args config.Args, platform string) error { } log.Println("Scheduling", ent) - var postCB func(context.Context, config.Args, entry.Entry) error + var postCB func(context.Context, config.Args, int, entry.Entry) error switch strings.ToLower(platform) { case "mastodon": postCB = mastodon.Post @@ -57,7 +57,7 @@ func runPlatform(ctx context.Context, args config.Args, platform string) error { log.Fatal("Platform", platform, "(not yet) implemented") } - if err := postCB(ctx, args, ent); err != nil { + if err := postCB(ctx, args, sizeLimit, ent); err != nil { return err } |
