w3c / activitystreams

Activity Streams 2.0
https://www.w3.org/TR/activitystreams-core/
Other
281 stars 61 forks source link

How to indicate a post is locked? #523

Closed prettykool closed 1 year ago

prettykool commented 2 years ago

Please Indicate One:

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?

gobengo commented 2 years ago

how does a post become 'locked'?

prettykool commented 2 years ago

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.

sebilasse commented 2 years ago

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 ]

gobengo commented 1 year ago

noting distinction between declaring rights of

evanp commented 1 year ago

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.