diff --git a/internal/cleaner/emoji.go b/internal/cleaner/emoji.go index 6cf194e40..05588ccb2 100644 --- a/internal/cleaner/emoji.go +++ b/internal/cleaner/emoji.go @@ -104,13 +104,14 @@ func (e *Emoji) UncacheRemote(ctx context.Context, olderThan time.Time) (int, er return total, gtserror.Newf("error getting remote emoji: %w", err) } - // If no emojis / same group is returned, we reached the end. + // If no emojis / same group is + // returned, we reached the end. if len(emojis) == 0 || olderThan.Equal(emojis[len(emojis)-1].CreatedAt) { break } - // Use last created-at as the next 'olderThan' value. + // Use last createdAt as next 'olderThan' value. olderThan = emojis[len(emojis)-1].CreatedAt for _, emoji := range emojis { diff --git a/internal/gtsmodel/account.go b/internal/gtsmodel/account.go index 79a35e561..bb07b8b16 100644 --- a/internal/gtsmodel/account.go +++ b/internal/gtsmodel/account.go @@ -31,7 +31,8 @@ "github.com/superseriousbusiness/gotosocial/internal/log" ) -// Account represents either a local or a remote fediverse account, gotosocial or otherwise (mastodon, pleroma, etc). +// Account represents either a local or a remote fediverse +// account, gotosocial or otherwise (mastodon, pleroma, etc). type Account struct { ID string `bun:"type:CHAR(26),pk,nullzero,notnull,unique"` // id of this item in the database CreatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // when was item created. @@ -83,9 +84,19 @@ type Account struct { Stats *AccountStats `bun:"-"` // gtsmodel.AccountStats for this account. } +// UsernameDomain returns account @username@domain (missing domain if local). +func (a *Account) UsernameDomain() string { + if a.IsLocal() { + return "@" + a.Username + } + return "@" + a.Username + "@" + a.Domain +} + // IsLocal returns whether account is a local user account. func (a *Account) IsLocal() bool { - return a.Domain == "" || a.Domain == config.GetHost() || a.Domain == config.GetAccountDomain() + return a.Domain == "" || + a.Domain == config.GetHost() || + a.Domain == config.GetAccountDomain() } // IsRemote returns whether account is a remote user account. diff --git a/internal/gtsmodel/emoji.go b/internal/gtsmodel/emoji.go index 7bf52586c..89cb551f1 100644 --- a/internal/gtsmodel/emoji.go +++ b/internal/gtsmodel/emoji.go @@ -19,7 +19,8 @@ import "time" -// Emoji represents a custom emoji that's been uploaded through the admin UI or downloaded from a remote instance. +// Emoji represents a custom emoji that's been uploaded +// through the admin UI or downloaded from a remote instance. type Emoji struct { ID string `bun:"type:CHAR(26),pk,nullzero,notnull,unique"` // id of this item in the database CreatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // when was item created diff --git a/internal/typeutils/internaltofrontend.go b/internal/typeutils/internaltofrontend.go index 6739d0540..d9c8748f5 100644 --- a/internal/typeutils/internaltofrontend.go +++ b/internal/typeutils/internaltofrontend.go @@ -2641,28 +2641,36 @@ func (c *Converter) FilterStatusToAPIFilterStatus(ctx context.Context, filterSta func (c *Converter) convertEmojisToAPIEmojis(ctx context.Context, emojis []*gtsmodel.Emoji, emojiIDs []string) ([]apimodel.Emoji, error) { var errs gtserror.MultiError + // GTS model attachments were not populated if len(emojis) == 0 && len(emojiIDs) > 0 { - // GTS model attachments were not populated - var err error // Fetch GTS models for emoji IDs emojis, err = c.state.DB.GetEmojisByIDs(ctx, emojiIDs) if err != nil { - errs.Appendf("error fetching emojis from database: %w", err) + return nil, gtserror.Newf("db error fetching emojis: %w", err) } } - // Preallocate expected frontend slice + // Preallocate expected frontend slice of emojis. apiEmojis := make([]apimodel.Emoji, 0, len(emojis)) - - // Convert GTS models to frontend models for _, emoji := range emojis { + + // Skip adding emojis that are + // uncached, the empty URLs can + // cause issues with some clients. + if !*emoji.Cached { + continue + } + + // Convert each to a frontend API model emoji. apiEmoji, err := c.EmojiToAPIEmoji(ctx, emoji) if err != nil { errs.Appendf("error converting emoji %s to api emoji: %w", emoji.ID, err) continue } + + // Append converted emoji to return slice. apiEmojis = append(apiEmojis, apiEmoji) }