activitystreams icon indicating copy to clipboard operation
activitystreams copied to clipboard

How to indicate a post is locked?

Open prettykool opened this issue 2 years ago • 3 comments

Please Indicate One:

  • [ ] Editorial
  • [X] Question
  • [X] Feedback
  • [ ] Blocking Issue
  • [ ] Non-Blocking Issue

Please Describe the Issue: For those who might be confused by the terminology of the title: A 'locked' post is basically something that people can view, but not engage/interact with; I.E, commenting, or liking/disliking it. On sites like Reddit, if you're more familiar with them, they call this action 'archiving'.

Reading through the standard; I realized that there's no proper way to show a post as being locked. There are activities like reject, which, as I understand, prevents anything incoming that may interact with an object. However, there's no real way of indicating that a post is locked to begin with, I.E. something like a "locked":true type.

Is there any way to deal with this problem within the current specification, or will a change be necessary?

prettykool avatar Mar 15 '22 02:03 prettykool

how does a post become 'locked'?

gobengo avatar Mar 15 '22 04:03 gobengo

how does a post become 'locked'?

If you're talking about most sites do it: It really depends. If we're gonna talk about in the most abstract sense possible - I.E, how most casual users probably understand it; A moderator, or the user who uploaded the original post, can set an option to disable anyone from further interacting with the post. Some sites also allow for users to unlock their posts, if they so desire.

If we're going to do something that makes sense within the overall design of ActivityStreams, look at what the Delete Activity type does: It removes most of the original values, and, most importantly in this context, adds a deleted property to the object - Which is just a timestamp of when the post was deleted.

I think what could be done is something like so:

Let's say that a person, BOB, has a post that he doesn't want people to interact with:

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Note",
  "summary": "A thought.",
  "id": "http://bob.example.org/notes/1",
  "attributedTo": "http://bob.example.org",
  "content": "<p>This is just me thinking: Why should you interact with this post?</p>",
  "published": "2014-12-12T12:12:12Z"
}

What BOB can do is send over an object with the Activity type of 'Lock'.

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "BOB locked a note",
  "type": "Lock",
  "actor": {
    "type": "Person",
    "name": "BOB"
  },
  "object": "http://bob.example.org/notes/1",
  "origin": {
    "type": "Collection",
    "name": "BOB's Notes"
  }
}

Let's look at what happened to BOB's original post:

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Note",
  "summary": "A thought.",
  "id": "http://bob.example.org/notes/1",
  "attributedTo": "http://bob.example.org",
  "content": "<p>This is just me thinking: Why should you interact with this post?</p>",
  "published": "2014-12-12T12:12:12Z",
  "locked": "2014-12-12T12:13:13Z"
}

A locked property has been added! This tells us that we can't further interact with the post.

But, what if BOB changes his mind, and wants people to interact with his posts? He can just do the following:

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "BOB unlocked a note",
  "type": "Unlock",
  "actor": {
    "type": "Person",
    "name": "BOB"
  },
  "object": "http://bob.example.org/notes/1",
  "origin": {
    "type": "Collection",
    "name": "BOB's Notes"
  }
}

This removes the locked property from his post, and allows people to interact with his posts once more...

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Note",
  "summary": "A thought.",
  "id": "http://bob.example.org/notes/1",
  "attributedTo": "http://bob.example.org",
  "content": "<p>This is just me thinking: Why should you interact with this post?</p>",
  "published": "2014-12-12T12:12:12Z",
  "replies": {
    "type": "Collection",
    "totalItems": 1,
    "items": [
      {
        "summary": "A response to BOB's post",
        "id": "http://ivan.example.org/notes/2",
        "type": "Note",
        "attributedTo": "http://ivan.example.org",
        "content": "<b>BECAUSE WE CAN!!!</b>",
        "published": "2014-12-12T14:14:14Z",
        "inReplyTo": "http://bob.example.org/notes/1"
      }
  ]
}

Of course, BOB can lock, and unlock the post whenever he sees fit; Freezing the post in time, to when BOB decided to lock it.

If you need me to explain anything further, or if I ended up missing something important, let me know.

prettykool avatar Mar 15 '22 18:03 prettykool

Hello there, please look at this gist: https://gist.github.com/sebilasse/2304017c583ac97f2edefd8f0f922a09 We also talked about it in todays meeting. More and more people are starting their own “inReplyTo”-policies and see the quoted comment by @gobengo (in the gist)

Personally, I think it is needed desperately : People have formats like AMA and they want to give others a hint, who can reply as this can be different from the audience. To be honest, personally sometimes I would like to say “Only reply with Image” … The Policy can then also be locked to anyone except the author.

That said, I would rather like to have a generalistic approach. For your example you can always update the policy. But if we specify such a thing we should be able to say “Who can answer when and how.”


And just btw, also we need a standard way to query things (next meeting) and we want to describe potential resulting Actions [ as initially discussed in https://www.w3.org/wiki/Activity_Streams/Expanded_Vocabulary#Potential_Actions_attached_to_objects ]

sebilasse avatar Jun 14 '22 18:06 sebilasse

noting distinction between declaring rights of

  • who is allowed to post items inReplyTo mine at my inbox
  • who is authorized to have items displayed as a reply to my post on third party websites, or in the social web client that my friend decides to use

gobengo avatar Aug 02 '23 16:08 gobengo

This kind of control is not defined in AS2. However, there is an open FEP for this kind of control, linked here:

https://codeberg.org/fediverse/fep/src/branch/main/fep/5624/fep-5624.md

I think the correct resolution for this problem is to define it in an extension, such as this FEP, and get adoption. As with other extensions, if it becomes popular, we would include it in the AS2 context doc, so it's almost like we extend the vocabulary itself.

Thanks for the good idea, and please collaborate on the FEP for continued discussion.

evanp avatar Aug 02 '23 16:08 evanp