From d4d6631435f3a5870fecc870ffe5be84d980ab4c Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Mon, 16 Sep 2024 20:39:15 +0200 Subject: [PATCH] [bugfix] Be more lenient when parsing mastodown following.csv (#3311) * [bugfix] Be more lenient when parsing mastodown following.csv * use follow.Notify --- internal/api/client/exports/exports_test.go | 6 +-- internal/processing/account/import.go | 5 ++ internal/typeutils/csv.go | 57 ++++++++++++++++++--- 3 files changed, 58 insertions(+), 10 deletions(-) diff --git a/internal/api/client/exports/exports_test.go b/internal/api/client/exports/exports_test.go index 303361b86..3759ec6c1 100644 --- a/internal/api/client/exports/exports_test.go +++ b/internal/api/client/exports/exports_test.go @@ -160,9 +160,9 @@ func (suite *ExportsTestSuite) TestExports() { token: suite.testTokens["local_account_1"], user: suite.testUsers["local_account_1"], account: suite.testAccounts["local_account_1"], - expect: `Account address,Show boosts -admin@localhost:8080,true -1happyturtle@localhost:8080,true + expect: `Account address,Show boosts,Notify on new posts,Languages +admin@localhost:8080,true,false, +1happyturtle@localhost:8080,true,false, `, }, // Export Followers. diff --git a/internal/processing/account/import.go b/internal/processing/account/import.go index 200d971b8..68e843cfa 100644 --- a/internal/processing/account/import.go +++ b/internal/processing/account/import.go @@ -188,6 +188,10 @@ func importFollowingAsyncF( // Show reblogs on // the new follow. showReblogs = follow.ShowReblogs + + // Notify when new + // follow posts. + notify = follow.Notify ) if overwrite { @@ -218,6 +222,7 @@ func importFollowingAsyncF( &apimodel.AccountFollowRequest{ ID: targetAcct.ID, Reblogs: showReblogs, + Notify: notify, }, ); errWithCode != nil { log.Errorf(ctx, "could not follow account: %v", errWithCode.Unwrap()) diff --git a/internal/typeutils/csv.go b/internal/typeutils/csv.go index b1e35ef1a..ae080a63f 100644 --- a/internal/typeutils/csv.go +++ b/internal/typeutils/csv.go @@ -90,6 +90,8 @@ func (c *Converter) FollowingToCSV( records[0] = []string{ "Account address", "Show boosts", + "Notify on new posts", + "Languages", } // We need to know our own domain for this. @@ -130,6 +132,10 @@ func (c *Converter) FollowingToCSV( follow.TargetAccount.Username + "@" + domain, // Show boosts: eg., true strconv.FormatBool(*follow.ShowReblogs), + // Notify on new posts, eg., true + strconv.FormatBool(*follow.Notify), + // Languages: compat only, leave blank. + "", }) } @@ -387,12 +393,20 @@ func (c *Converter) CSVToFollowing( ) for _, record := range records { - if len(record) != 2 { + recordLen := len(record) + + // Older versions of this Masto CSV + // schema may not include "Show boosts", + // "Notify on new posts", or "Languages", + // so be lenient here in what we accept. + if recordLen == 0 || + recordLen > 4 { // Badly formatted, // skip this one. continue } + // "Account address" namestring := record[0] if namestring == "" { // Badly formatted, @@ -400,6 +414,12 @@ func (c *Converter) CSVToFollowing( continue } + if namestring == "Account address" { + // CSV header row, + // skip this one. + continue + } + // Prepend with "@" // if not included. if namestring[0] != '@' { @@ -419,20 +439,43 @@ func (c *Converter) CSVToFollowing( domain = "" } - showReblogs, err := strconv.ParseBool(record[1]) - if err != nil { - // Badly formatted, - // skip this one. - continue + // "Show boosts" + var showReblogs *bool + if recordLen > 1 { + b, err := strconv.ParseBool(record[1]) + if err != nil { + // Badly formatted, + // skip this one. + continue + } + showReblogs = &b } + // "Notify on new posts" + var notify *bool + if recordLen > 2 { + b, err := strconv.ParseBool(record[2]) + if err != nil { + // Badly formatted, + // skip this one. + continue + } + notify = &b + } + + // TODO: "Languages" + // + // Ignore this for now as we + // don't do anything with it. + // Looks good, whack it in the slice. follows = append(follows, >smodel.Follow{ TargetAccount: >smodel.Account{ Username: username, Domain: domain, }, - ShowReblogs: &showReblogs, + ShowReblogs: showReblogs, + Notify: notify, }) }