Simple moderated communities flow.

This commit is contained in:
Vitor Pamplona 2023-06-12 18:35:23 -04:00 committed by fiatjaf_
parent 33fcb7c9bc
commit 1912dacd33

85
172.md Normal file
View File

@ -0,0 +1,85 @@
NIP-172
=======
Moderated Communities (Reddit Style)
------------------------------------
`draft` `optional` `author:vitorpamplona`
The goal of this NIP is to create moderator-approved public communities arount a topic. It defines the replaceable event `34550` to define the community and the current list of moderators/administrators. Users that want to post into to the community, simply tag any Nostr event with an `a` tag. Moderators the issue an approval event `34551` that links the community with the new post.
# Community definition
Kind 34550 should include any field that helps define the community and the set of moderators.
```js
{
"id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>",
"pubkey": "<32-bytes lowercase hex-encoded public key of the event creator>",
"created_at": "<Unix timestamp in seconds>",
"kind": "34550",
"tags": [
["d", "<community_name>"],
["description", "<community_description>"],
// moderators
["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>", "moderator"]
["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>", "moderator"]
["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>", "moderator"]
]
}
```
# New Post Request
Any Nostr event can be a post request. Clients should simply add the community's `a` tag to be presented for the moderator's approval.
```js
{
"id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>",
"pubkey": "<32-bytes lowercase hex-encoded public key of the event creator>",
"created_at": "<Unix timestamp in seconds>",
"kind": "1",
"tags": [
["a", "34550:<community event author pubkey>:<d-identifier of the community>", "<optional relay url>"],
],
"content": "<my content>"
}
```
Community management clients can filter all mentions to the kind-34550 event and request moderators to approve each submission. The same moderator can remove his/her approval of the post at anytime.
# Post Approval by moderators
The post approval includes a stringified `new post request` event inside the content's of the approval (NIP-18-style).
```js
{
"id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>",
"pubkey": "<32-bytes lowercase hex-encoded public key of the event creator>",
"created_at": "<Unix timestamp in seconds>",
"kind": "34551",
"tags": [
["a", "34550:<community event author pubkey>:<d-identifier of the community>", "<optional relay url>"],
["e", "<Post Request ID>", "<optional relay url>"],
["p", "<Post Request Author ID>", "<optional relay url>"],
],
"content": "{ <New Post Request JSON> }"
}
```
It's recommended that multiple moderators approve posts to avoid unapproving them when a given moderator is removed from the owner's list. In case the full list of moderators must be rotated, the new moderator set must sign post approvals for the past post or the community will restart.
# Displaying
Community clients can display posts that have been approved by at least 1 moderator or by the community owner.
The following filter displays the approved posts.
```js
{
"authors": ["<author>", "moderator1", "moderator2", "moderator3", ...],
"kinds": 34551,
"#a": ["34550:<community event author pubkey>:<d-identifier of the community>"],
}
```