summaryrefslogtreecommitdiff
path: root/internal/processing/status/context.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/processing/status/context.go')
-rw-r--r--internal/processing/status/context.go33
1 files changed, 27 insertions, 6 deletions
diff --git a/internal/processing/status/context.go b/internal/processing/status/context.go
index 19c6cac18..58977e4ae 100644
--- a/internal/processing/status/context.go
+++ b/internal/processing/status/context.go
@@ -19,6 +19,7 @@ package status
import (
"context"
+ "errors"
"slices"
"strings"
@@ -402,6 +403,10 @@ func (p *Processor) WebContextGet(
// We should mark the next **VISIBLE**
// reply as the first reply.
markNextVisibleAsFirstReply bool
+
+ // Map of statuses that didn't pass visi
+ // checks and won't be shown via the web.
+ hiddenStatuses = make(map[string]struct{})
)
for idx, status := range wholeThread {
@@ -427,11 +432,16 @@ func (p *Processor) WebContextGet(
}
}
- // Ensure status is actually
- // visible to just anyone, and
- // hide / don't include it if not.
+ // Ensure status is actually visible to just
+ // anyone, and hide / don't include it if not.
+ //
+ // Include a check to see if the parent status
+ // is hidden; if so, we shouldn't show the child
+ // as it leads to weird-looking threading where
+ // a status seems to reply to nothing.
+ _, parentHidden := hiddenStatuses[status.InReplyToID]
v, err := p.visFilter.StatusVisible(ctx, nil, status)
- if err != nil || !v {
+ if err != nil || !v || parentHidden {
if !inReplies {
// Main thread entry hidden.
wCtx.ThreadHidden++
@@ -439,12 +449,15 @@ func (p *Processor) WebContextGet(
// Reply hidden.
wCtx.ThreadRepliesHidden++
}
+
+ hiddenStatuses[status.ID] = struct{}{}
continue
}
// Prepare visible status to add to thread context.
webStatus, err := p.converter.StatusToWebStatus(ctx, status)
if err != nil {
+ hiddenStatuses[status.ID] = struct{}{}
continue
}
@@ -512,9 +525,17 @@ func (p *Processor) WebContextGet(
wCtx.ThreadLength = threadLength
}
- // Jot down number of hidden posts so template doesn't have to do it.
+ // Jot down number of "main" thread entries shown.
wCtx.ThreadShown = wCtx.ThreadLength - wCtx.ThreadHidden
+ // If there's no posts visible in the
+ // "main" thread we shouldn't show replies
+ // via the web as that's just weird.
+ if wCtx.ThreadShown < 1 {
+ const text = "no statuses visible in main thread"
+ return nil, gtserror.NewErrorNotFound(errors.New(text))
+ }
+
// Mark the last "main" visible status.
wCtx.Statuses[wCtx.ThreadShown-1].ThreadLastMain = true
@@ -523,7 +544,7 @@ func (p *Processor) WebContextGet(
// part of the "main" thread.
wCtx.ThreadReplies = threadLength - wCtx.ThreadLength
- // Jot down number of hidden replies so template doesn't have to do it.
+ // Jot down number of "replies" shown.
wCtx.ThreadRepliesShown = wCtx.ThreadReplies - wCtx.ThreadRepliesHidden
// Return the finished context.