Table of Contents

Thread Gates and Post Gates

Thread Gates

Thread gates allow the original author of a thread to control who can reply to the thread, allowing people mentioned in the root post to reply, people the author is following to reply, replies from actors in a list or allow no replies at all. A thread gate can have up to five rules, but allowing no replies is an exclusive rule, no other rules can be applied. A thread gate can also be used to hide replies in a thread.

You can apply a thread gate to an existing using AddThreadGate(). This method requires the AtUri of the post to be gated, and, optionally a collection of gate rules and/or a collection of AtUris of thread replies to be hidden. If you provide no rules then the post will not allow any replies at all.

The following example demonstrates how to gate a thread so that replies are restricted to users the post author follows.

await agent.AddThreadGate(
    postUri,
    new List<ThreadGateRule>()
    {
        new FollowingRule()
    },
    cancellationToken: cancellationToken);

The four types of thread gate rules are FollowerRule, FollowingRule, MentionRule and ListRule. Note that adding, or updating a thread gate replaces any gate already in place. If you want to update rules or hidden posts first get any existing rule with GetThreadGate(), if that is successful update the returnedThreadGate class then apply it with with UpdateThreadGate().

You can use GetPostThread() to see a view over a thread, including replies.

Post Gates

Post gates allow the post author to remove it from someone else's post quoting their post, and also to disable embedding on a post.

await agent.AddPostGate(
    postUri,
    new List<PostGateRule>()
    {
        new DisableEmbeddingRule()
    },
    cancellationToken: cancellationToken);

You can get a view of posts quoting a post with GetQuotes().

You can also specify gates when creating a post:

await agent.Post("New gated post",
    threadGateRules: new List<ThreadGateRule>() { new FollowingRule() },
    postGateRules: new List<PostGateRule>() { new DisableEmbeddingRule() },
    cancellationToken: cancellationToken);

Default user preferences for post and thread gates.

Bluesky allows the users to set a default preference for post. and thread gates. You can retrieve these preferences with agent.GetPreferences().

InteractionPreferences? interactionPreferences = null;
var userPreferences = await agent.GetPreferences(cancellationToken: cancellationToken);
if (userPreferences.Succeeded)
{
    interactionPreferences = userPreferences.Result.InteractionPreferences;
}

You can then pass this into agent.Post()

await agent.Post(
    "Sample text, using default preferences",
    interactionPreferences: interactionPreferences,
    cancellationToken: cancellationToken);

Note that the Bluesky application allows a user to override their preferences on a post by post basis. If you specify a threadGateRules or postGateRules value to agent.Post() they will take precedence.

If you are using a PostBuilder you can apply the user preferences to the builder with PostBuilder.ApplyInteractionPreferences().