Bluesky app fork with some witchin' additions 💫 forked from jollywhoppers.com/witchsky.app
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108import { AppBskyFeedDefs, type AppBskyFeedGetAuthorFeed as GetAuthorFeed, type BskyAgent,} from '@atproto/api'
import {type FeedAPI, type FeedAPIResponse} from './types'
export class AuthorFeedAPI implements FeedAPI { agent: BskyAgent _params: GetAuthorFeed.QueryParams
constructor({ agent, feedParams, }: { agent: BskyAgent feedParams: GetAuthorFeed.QueryParams }) { this.agent = agent this._params = feedParams }
get params() { const params = {...this._params} params.includePins = params.filter === 'posts_and_author_threads' return params }
async peekLatest(): Promise<AppBskyFeedDefs.FeedViewPost> { const res = await this.agent.getAuthorFeed({ ...this.params, limit: 1, }) return res.data.feed[0] }
async fetch({ cursor, limit, }: { cursor: string | undefined limit: number }): Promise<FeedAPIResponse> { const res = await this.agent.getAuthorFeed({ ...this.params, cursor, limit, }) if (res.success) { return { cursor: res.data.cursor, feed: this._filter(res.data.feed), } } return { feed: [], } }
_filter(feed: AppBskyFeedDefs.FeedViewPost[]) { if (this.params.filter === 'posts_and_author_threads') { return feed.filter(post => { const isReply = post.reply const isRepost = AppBskyFeedDefs.isReasonRepost(post.reason) const isPin = AppBskyFeedDefs.isReasonPin(post.reason) if (!isReply) return true if (isRepost || isPin) return true return isReply && isAuthorReplyChain(this.params.actor, post, feed) }) }
return feed }}
function isAuthorReplyChain( actor: string, post: AppBskyFeedDefs.FeedViewPost, posts: AppBskyFeedDefs.FeedViewPost[],): boolean { // current post is by a different user (shouldn't happen) if (post.post.author.did !== actor) return false
const replyParent = post.reply?.parent
if (AppBskyFeedDefs.isPostView(replyParent)) { // reply parent is by a different user if (replyParent.author.did !== actor) return false
// A top-level post that matches the parent of the current post. const parentPost = posts.find(p => p.post.uri === replyParent.uri)
/* * Either we haven't fetched the parent at the top level, or the only * record we have is on feedItem.reply.parent, which we've already checked * above. */ if (!parentPost) return true
// Walk up to parent return isAuthorReplyChain(actor, parentPost, posts) }
// Just default to showing it return true}