Comment on page
🗞
Forum
An immutable, auditable, public forum is the main communication and coordination forum among platform members.
The forum is the primary place for community-wide asynchronous written communication about all topics relevant to the platform among members. It is hierarchically organized into a tree of categories, each with designated moderators responsible for policing and encouraging effective and beneficial interactions among members. The moderators are part of a designated forum working group, and the lead of that working group can decide what moderators are responsible for what categories. Categories contain subcategories, and threaded topic-based discussions, called threads, where any member can open a thread, and others can come and make replies in the form of posts. Some threads can also include a poll, allowing any member to weight in on a question. To create a thread an initial deposit is needed that goes into a thread account, all posts also requires a deposit that goes into the thread account related to the post, whenever a thread is deleted the funds from the thread account are transferred to the caller of the delete extrinsic.
The community maintains a dedicated Notion space to the operational activities of the forum working group.
- Monitor and supervise public communication channels for compliance with usage policies as decided through the governance system
- Communicate with end users about any possible violations and sanctions
- Collaborate to come up with new policies as circumstances change
- A deep understanding of the Joystream platform structure and function
- Clear written communicator, ideally with good command of more than one language
- Hold sufficient amount of the native platform token to put at stake
wip
The relevant actors in the forum are
- Member: A members participate as normal forum users, creating and responding to threads, participating in polls, and so on.
- Moderator: A moderator is assigned to one or more categories. Importantly, when assigned to a category, the moderator can act as a moderator in any descendant category. The root category is an exception where moderator can act, only the lead can moderate. Lastly, a moderator cannot participate in normal forum activities as a moderator, only in distinct moderator activities.
- Lead: The forum lead is a member occupying the lead role in the forum working group. Beyond the normal working group lead obligations, the lead can act as a moderator as well, including in the root category.
Both categories and threads can be archived. When a category is directly archived, or is an ancestor of a directly archived category, it is considered archived. If not, its considered active. If not, its considered active. In either case, being archived prevents normal users from updating any associated forum state, for example through user level interactions like creating threads, creating posts, reacting to posts, etc. However, actions associated with moderators and the lead are still unconstrained.
Any non-root category is defined by the following
- Id: A global unique category identifier, effectively the number of categories created in the forum prior to this one.
- Parent: An optional reference to a parent category. When not set, it indicates this is a root level category.
- Title: A human-readable category name.
- Description: A human-readable description.
- Stickied Threads: A list of threads in this category that have been designated as having long-run importance to the category.
- Subcategories: The categories with this category as its parent.
- Threads: The threads directly contained in this category.
- Moderators: The moderator directly assigned to this category.
- Archival Status: Whether the category is archived or not. This impacts whether one can use the category, such as creating threads or posts directly, or recursively, within the category.
A thread is defined by the following
- Id: A global unique thread identifier, effectively the number of threads created in forum prior to this one. From this one can infer a chronological ordering of threads within the category. Importantly, because of the way information is organized in the blockchain state, the identifier for the category is also also required when identifying a thread.
- Title: The human readable title.
- Author: Member who created the thread.
- Poll: An optional poll for the thread, defined by the following
- Description: A human readable description of what question is being polled.
- Deadline: Some block before which is the only time anyone can participate in the poll.
- Alternatives: A list of alternatives, each with its own explainer text, vote count and members who have voted in favor of it.
- Number of posts: Number of posts in thread
- Cleanup Payoff: Payoff for deleting thread from storage.
A post in a thread is defined by the following
- Id: A global unique post identifier, effectively the number of posts created in the forum prior to this one. From this one can infer a chronological ordering of posts within the thread. Importantly, because of the way information is organized in the blockchain state, the identifiers for the category and thread are also also required when identifying a post.
- Text: The post thread
- Author: Member who created the pot.
- Last edited: Last time the post was modified by the author
- Cleanup Payoff: Payoff for deleting thread from storage.
A thread and a post can be either editable or not editable. A non-editable thread/post doesn't take any space in the runtime's storage. When a thread or post is being deleted it just indicates that you no longer want to edit it. To indicate that you want it to be hidden, similar to deletion in a classical forum, you need to set
hidden
to true. The first post in a thread is by default editable as well as any thread at creation. To create a thread or an editable post you require an initial deposit for the usage of storage space. Non-editable posts doesn't require an initial deposit. Furthermore, by deleting a thread/post you can reclaim the initial deposit.A reaction is a signal a member can send to associate a sentiment, in the form of a non-negative integer called a reaction value, with a forum post. Importantly, it is only possible to react, not unreact, that is to withdraw a reaction. The semantics of different values, or of submitting the same value more than once, will require social consensus.
The following constants are hard coded into the system, they can only be updated with a runtime upgrade.
Name | Description | Value |
---|---|---|
MAX_SUBCATEGORIES | Maximum allowed subcategories in any
category to be created. | fill-in |
MAX_THREADS_IN_CATEGORY | Maximum number of threads in any category for
any new thread. | fill-in |
MAX_POSTS_IN_THREAD | Maximum number of posts allowed in any thread for any new post. | fill-in |
MAX_MODERATORS_IN_CATEGORY | Maximum number of moderators allowed in a category for any new assignment of the moderator to category. | fill-in |
MAX_NUM_CATEGORIES | Maximum number of categories allowed in total for any new category to be created. | fill-in |
MAX_POLL_ALTERNATIVES | Upper bound on the number of alternatives in a new poll. | fill-in |
MAX_CATEGORY_TREE_DEPTH | Maximum category tree depth allowed for any new category to be created. | fill-in |
MAX_NUMBER_OF_WORKERS | | fill-in |
BASE_PAY_OFF_FOR_THREAD_CLEANUP | Base deposit for a thread | fill-in |
THREAD_DEPOSIT | Base deposit for creating a thread | fill-in |
POST_DEPOSIT | Base deposit for creating a post | fill-in |
Notice that a lot of the limits are forward-looking. In the even to of a runtime upgrade, it may be that the limits are changed in a more restrictive direction, in which case it should not be expected that there is a migration that throws out the storage state, instead, the limit should only be understood to have bearing on future actions.
Parameters
Name | Description |
---|---|
parent | Optional parent category identifier. |
title | Title of category. |
description | Category description. |
- Signer is working group lead.
- If provided,
parent
corresponds to valid category. [Remove: , and it is not directly or indirectly archived.] - Limit
MAX_NUM_CATEGORIES
is respected. - Limit
MAX_CATEGORY_TREE_DEPTH
is respected.
A new category is created.
Parameters
Name | Description |
---|---|
actor | Either lead or working group identifier of moderator. |
category_id | Category identifier. |
new_archival_status | Whether new status is archived or active. |
- Signer uses role account of
actor
. category_id
corresponds to an existing category.- If signer is moderator, then this moderator must be assigned have control of the category.
- The category has archival status different from
new_archival_status
.
Archival status of category corresponding to
category_id
is updated to new_archival_status
.Parameters
Name | Description |
---|---|
actor | Either lead or working group identifier of moderator. |
category_id | Category identifier. |
new_title | New title for category. |
- Signer uses role account of
actor
. category_id
corresponds to an existing category.- If signer is moderator, then this moderator must be assigned have control of the category.
The title of the category corresponding to
category_id
is set to new_title
.Parameters
Name | Description |
---|---|
actor | Either lead or working group identifier of moderator. |
category_id | Category identifier. |
new_description | New description for category. |
- Signer uses role account of
actor
. category_id
corresponds to an existing category.- If signer is moderator, then this moderator must be assigned have control of the category.
The description of the category corresponding to
category_id
is set to new_description
.Parameters
Name | Description |
---|---|
actor | Either lead or working group identifier of moderator. |
category_id | Category identifier. |
threads | List of thread identifiers. |
- Signer uses role account of
actor
. category_id
corresponds to an existing category.- If signer is moderator, then this moderator must be assigned have control of the category.
- All thread identifiers must have existed at some point in time.
The stickied threads of the category corresponding to
category_id
is set to threads
.Parameters
Name | Description |
---|---|
category_id | Category identifier. |
moderator | Working group identifier of moderator. |
is_member | Whether moderator should be member. |
- Signer is working group lead.
category_id
corresponds to an existing category.
Note: There is no check that the provided moderator identifier corresponds to a genuine working group moderator.
If
is_member
is true, then the moderator
identifier is added to the category moderators for category corresponding to category_id
so long as the MAX_MODERATORS_IN_CATEGORY
limit is respected. If is_member
is not true, then the moderator
is removed if present.Parameters
Name | Description |
---|---|
actor | Either lead or working group identifier of moderator. |
category_id | Category identifier. |
- Signer uses role account of
actor
. category_id
corresponds to an existing category.- There are no threads in the category.
- There are no subcategories in the category.
- If the parent of the category is the root, then
actor
must be the lead, otherwise for other categoriesactor
must be lead, or moderator must be assigned have control of the category.
The category is dropped.
Parameters
Name | Description |
---|---|
member_id | Identifier of member. |
category_id | Category identifier. |
title | Thread title. |
text | Body text of thread. |
poll | Optional poll information for thread. |
- Signer uses role account of member corresponding to
member_id
. - Signer has enough balance to cover deposit for thread creation and post creation(
ThreadDeposit
+PostDeposit
) category_id
corresponds to an existing category.- Limit
MAX_THREADS_IN_CATEGORY
is respected. - The category is not archived.
- If poll information is provided, make sure
- limit
MAX_POLL_ALTERNATIVES
is respected, and that there are at least two alternatives. - the end time is in the future.
- Signer's account has at least
THREAD_DEPOSIT + POST_DEPOSIT
free balance.
- A thread is created.
- The first post is created.
- Post + Thread deposit is substracted from signer account,
ThreadDeposit
is added to thread'scleanup_payoff
andPostDeposit
is added to post'scleanup_payoff
.
Parameters
Name | Description |
---|---|
member_id | Member identifier. |
category_id | Category identifier. |
thread_id | Thread identifier. |
new_title | Thread title. |
- Signer uses role account of member corresponding to
member_id
. category_id
corresponds to an existing category.thread_id
corresponds to an existing thread.member_id
corresponds to the author of the thread.- The thread is not deleted from storage.
- The category is not archived. [WIP]
- The thread is not archived. [WIP]
The title of the thread is set to
new_title
.Parameters
Name | Description |
---|---|
actor | Either lead or working group identifier of moderator. |
category_id | Category identifier. |
thread_id | Thread identifier. |
new_category_id | Category identifier. |
- Signer uses role account of
actor
. category_id
corresponds to an existing category.new_category_id
corresponds to an existing category.category_id
andnew_category_id
are distinct.thread_id
corresponds to an existing thread that's not deleted from storage.- If signer is moderator, then this moderator must be assigned have control of the category corresponding to
category_id
. - If signer is moderator, then this moderator must be assigned have control of the category corresponding to
new_category_id
. - Limit
MAX_THREADS_IN_CATEGORY
is respected for category corresponding tonew_category_id
. [WIP]
The thread has relocated to category corresponding to
new_category_id
.Parameters
Name | Description |
---|---|
forum_member_id | Forum member identifier. |
category_id | Category identifier. |
thread_id | Thread identifier. |
rationale | Human-readable text. |
hidden | Indicates whether the thread should be hidden or just removed from storage. |
- Signer corresponds to
forum_member_id
. category_id
corresponds to an existing category.thread_id
corresponds to an existing thread that's not deleted from storage.forum_member_id
corresponds to thread creator.
- The thread is removed from storage.
cleanup_payoff
is paid to the thread deleter account.
Parameters
Name | Description |
---|---|
actor | Either member identifier, lead or working group identifier of moderator. |
category_id | Category identifier. |
thread_id | Thread identifier. |
rationale | Human-readable text. |
- Signer corresponds to
forum_member_id
. category_id
corresponds to an existing category.thread_id
corresponds to an existing thread that's not deleted from storage.- If signer is moderator then this moderator must be assigned have control of the category corresponding to
category_id
.
- The thread is removed from storage.
- Thread's
cleanup_payoff
is slashed from thread account.
Parameters
Name | Description |
---|---|
member_id | Member identifier. |
category_id | Category identifier. |
thread_id | Thread identifier. |
text | Human-readable text. |
editable | Whether or not the post is editable. |
- Signer uses role account of member corresponding to
member_id
. category_id
corresponds to an existing category.thread_id
corresponds to an existing thread that's not deleted from storage.- Signer has at least
PostDeposit
usable balance. - category is not archived.
- thread is not archived.
- A new post is created in thread with text
text
and author ismember_id
andcleanup_payoff
isPostDeposit
. PostDeposit
is transferred from signer's account to thread's account.
Parameters
Name | Description |
---|---|
member_id | Member identifier. |
category_id | Category identifier. |
thread_id | Thread identifier. |
post_id | Post identifier. |
new_text | Human-readable text. |
- Signer uses role account of member corresponding to
member_id
. category_id
corresponds to an existing category.thread_id
corresponds to an existing thread that's not deleted.post_id
corresponds to an existing post that is in storage.- member is author of post.
- category is not archived.
- thread is not archived.
Post text is set to
new_text
.Parameters
Name | Description |
---|---|
member_id | Member identifier. |
category_id | Category identifier. |
thread_id | Thread identifier. |
post_id | Post identifier. |
reaction_value | Reaction value. |
- Signer uses role account of member corresponding to
member_id
. category_id
corresponds to an existing category.thread_id
corresponds to an existing thread that is not deleted.- member is author of post.
- category is not archived.
- thread is not archived.
Reaction with value
reaction_value
is accepted.Parameters
Name | Description |
---|---|
forum_user_id | Member identifier. |
category_id | Category identifier. |
thread_id | Thread identifier. |
post_id | Post identifier. |
hidden | Whether post should be also be hidden. |
- Signer uses role account of
actor
. category_id
corresponds to an existing category.thread_id
corresponds to an existing thread.post_id
corresponds to an existing post.- post is not first post in thread.
forum_user_id
is member of forum and is either- Post author
- Or Post's thread has been deleted and
PostLifeTime
has happened since post'slast_edited
- If
forum_user_id
is not authorhidden
must be false.
- Post is deleted from storage.
- Post original deposit is transferred into the Signer's account.
Parameters
Name | Description |
---|---|
actor | lead or working group identifier of moderator. |
category_id | Category identifier. |
thread_id | Thread identifier. |
post_id | Post identifier. |
reaction_value | Reaction value. |
- Signer uses role account of
actor
. category_id
corresponds to an existing category.post_id
corresponds to an existing post.- post is not first post in thread.
- If moderator, then this moderator must be assigned have control of the category corresponding to
category_id
.
- Post is deleted from storage.
- Post original deposit is slashed from thread account.
Parameters
Name | Description |
---|---|
member_id | Member identifier. |
category_id | Category identifier. |
thread_id | Thread identifier. |
alternative_index | Index of a poll alternative. |
- Signer uses role account of member corresponding to
member_id
. category_id
corresponds to an existing category.thread_id
corresponds to an existing thread.- thread has poll which has not expired.
- member has not already voted in poll.
alternative-index
identifies an alternative in the poll.
The member is registered as having voted for alternative
aleternative_index
WIP
Last modified 1yr ago