Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Community Product Design #897

Merged
merged 1 commit into from
Sep 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
162 changes: 162 additions & 0 deletions docs/product/community.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
# Community

Purpose of Building a Community:

* Foster creative enthusiasm: Experience excellent projects created by others
* Lower the barrier to creation: Continue creating based on other projects
* Improve creative abilities: Learn how other projects implement functionalities

The term "Community" in this document refers to a series of capabilities built to establish a community and achieve the aforementioned purposes, including but not limited to:

* Operations related to Projects, such as publishing, running, commenting, liking, remixing, etc.
* Operations related to Users, such as personal information management, following, etc.
* Operations related to teams, such as creation, management, and even benefit distribution.

## Basic Concepts

### Follow

Users can follow other users to receive their news in a timely manner. When A follows B, A is considered a follower of B, and B is considered a followee of A.

In the long run, "news" may include but is not limited to:

* New projects from followees
* New releases from followees
* New followees of followees

Channels for obtaining news may include but are not limited to:

* Recommended content on the follower's homepage
* Message notifications (in-site messages, emails, etc.) for the follower

### Like

Users can like projects they enjoy. In addition to expressing their admiration for the project, it also allows them to easily find it in the future. In the long run, we may also use a user's like information to recommend content to them.

### User

On top of the [Go+ Builder](./index.md), the basic information of a user is expanded as follows:

* Description: A description of oneself

### Project

On top of the [Go+ Builder](./index.md), the information of a project is expanded as follows:

* Description: A description of the project
* Instructions: Instructions for playing the game
* RemixFrom: Information about the source of the remix, if the current project is created by remixing based on another project, this records the original project and release information
* Thumbnail: A thumbnail image
* Other community interaction-related information, such as visit counts, etc.

### Release

A release is a snapshot of a project's state at a certain moment, representing a fixed and immutable game content.

Each project can have zero or more releases.

A release includes the following information:

* Version: A version number used to identify the release; for releases under the same project, the version is unique
* Description: A description of the release
* Game: The game content
* Thumbnail: A thumbnail image
* Others, such as creation time, etc.

Whether another user or an anonymous user can access a release depends on whether its corresponding project is public. Only when a project is public can its releases be accessed by other users or anonymous users.

In the simplest implementation, the game information in a release is a copy of the game information in the project. In the long run, we may do more work during the release creation phase, such as compression, compilation, etc. Therefore, the game information in a release actually contains two parts:

1. Source code, consistent with the game information in the project
2. Executable file generated based on the source code

The process of creating a release for one's own project includes:

* Automatically generating (or user inputting) version and description information
* Copying the game and thumbnail from the current project as the game and thumbnail of the release
* Creating the release using the above information

### Publish

Publishing is an action that:

1. If the current project is not public, sets it to public
2. Allows the user to update the description, instructions, and other information of the current project
3. Creates a release based on the current project
4. Provides the operator with a successful publish prompt and the URL of the project page for sharing with others

### Unpublish

Unpublishing is an action that:

1. If the current project is public, sets it to private

### Remix

Users can create their own projects based on other people's projects and continue editing them. This process is called remixing.

Note that when remixing a project, it is always necessary to specify one of its releases (by default, the latest release). When remixing a release R of project P, we will:

1. Create a project P2 for the current user (private)
2. Copy the description, instructions, and other information of P to P2
3. Copy the game information (source code part) of R to P2
4. Set the RemixFrom of P2 as P & R

## User Story

### Edit Project

In addition to the actions mentioned in [Go+ Builder](./index.md), users can also perform the following actions in the editor:

* Publish / Unpublish a project

### View Others' Public Project Homepage

Logged-in or anonymous users can visit the homepage of others' public projects to:

* View basic information about the project, such as owner, name, description, instructions, remix source, etc.
* View release records, such as creation time, version, description, etc.
* View community interaction information of the project
* Run the game, where the game content is the latest release of the project
* Share the project with others
* Like (if logged in)
* Remix the project (if logged in)

Remixing is based on the latest release of the project only when the project has releases.

### View Own Project Homepage

Logged-in users can visit their own project homepage to:

* View basic information about the project, such as owner, name, description, instructions, remix source, etc.
* View release records, such as creation time, version, description, etc.
* View community interaction information of the project
* Run the game, where the game content is the latest release of the project
* Edit basic information about the project, such as description, instructions, etc.
* Edit the game content of the project (redirect to the editor page)
* Unpublish the project

### View Others' Personal Homepage

Logged-in or anonymous users can visit other users' personal homepage to:

* View basic information about the user, such as name, description, etc.
* View the list of the user's public projects
* View community interaction information of the user, such as followers, followees, likes, etc.
* Follow / Unfollow the user (if logged in)

### View Own Personal Homepage

Logged-in users can visit their own personal homepage to:

* View their own basic information, such as name, description, etc.
* View the list of their own public projects
* View community interaction information of themselves, such as followers, followees, likes, etc.
* Edit their own basic information

### Access the Community Homepage

Logged-in or anonymous users can access the community homepage to:

* View a list of recommended public projects (based on recent likes and remixes across the platform)
* View news from followed users
162 changes: 162 additions & 0 deletions docs/product/community.zh.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
# 社区 Community

搭建社区的目的:

* 促进创作热情:体验别人创作的优秀项目
* 降低创作门槛:在别的项目基础上继续创作
* 提高创作能力:学习别的项目如何实现功能

本文档中说的社区 Community 指为搭建社区、实现上述目的而构建的一系列能力,包括但不限于

* 围绕 Project 的操作,如发布、运行、评论、点赞、改编等
* 围绕 User 的操作,如个人信息管理、关注等
* 围绕团队的操作,如创建、管理、甚至利益分配等

## 基本概念

### 关注 Follow

用户可以通过 Follow 其他用户以及时获取其动态信息。当 A Follow B 后,记 A 为 B 的 Follower,B 为 A 的 Followee。

长期来看,“动态信息”可能包括但不限于:

* Followee 的新 Project
* Followee 的新 Release
* Followee 的新 Followee

获取动态信息的渠道可能包括但不限于:

* Follower 的首页推荐内容
* Follower 的消息通知(站内信、邮件、...)

### 喜欢 Like

用户可以 Like 他喜欢的 Project,除了对 Project 表示喜爱外,还可以方便自己日后查找。长期来看,我们也可能根据用户的 Like 信息为用户推荐内容。

### 用户 User

在 [Go+ Builder Product](./index.zh.md) 基础上,对 User 的基本信息进行扩充如下:

* Description: 对自己的描述

### 项目 Project

在 [Go+ Builder Product](./index.zh.md) 基础上,对 Project 信息进行扩充如下:

* Description: 描述,对 Project 的描述
* Instructions: 游戏的操作说明
* RemixFrom: Remix 来源信息,如果当前 Project 是基于其他 Project Remix 而来,这里记录原 Project & Release 的信息
* Thumbnail: 缩略图
* 其他 Community 交互相关信息,如访问次数等

### 版本 Release

一个 Release 是 Project 某个时刻状态的快照,确定的 Release 对应于确定的、不可变更的游戏内容。

每个 Project 可以有 0 个或多个 Release。

Release 包含以下信息:

* Version: 版本号,用于标识 Release 的版本;对于同一个 Project 下的 Release,其 Version 是唯一的
* Description: 对该 Release 的描述
* Game: 游戏内容
* Thumbnail: 缩略图
* 其他,如创建时间等

某个 Release 是否可被其他用户或未登录用户读取,取决于其对应的 Project 是否公开,仅当 Project 为公开时,其 Release 可以被其他用户或未登录用户读取。

在最简单的实现方案下,Release 中的 Game 信息是对 Project 中 Game 信息的拷贝。长期来看,我们可能会在创建 Release 阶段做更多的工作,比如压缩、编译等。因此,Release 的 Game 信息实际上会包含两部分内容:

1. 源码,与 Project 中的 Game 信息一致
2. 可执行文件,基于源码生成的可执行文件

用户为自己的 Project 创建 Release,过程包括:

* 系统自动生成(或用户输入) Version & Description 信息
* 拷贝当前 Project 中的 Game、Thumbnail 作为 Release 的 Game & Thumbnail
* 使用上述信息创建 Release

### 发布 Publish

Publish 是这样的动作:

1. 如果当前 Project 不是公开的,则将其设置为公开
2. 允许用户更新当前 Project 的 Description、Instructions 等信息
3. 基于当前 Project 创建一个 Release
4. 操作者会得到 Publish 成功的提示 & Project 详情页的 URL,以便分享给他人

### 取消发布 Unpublish

Unpublish 是这样的动作:

1. 如果当前 Project 是公开的,则将其设置为非公开

### 改编 Remix

用户可以在其他人的 Project 基础上创建属于自己的 Project,并继续编辑,这个过程称为 Remix。

注意当对某个 Project 进行 Remix 操作时,总是需要指定其某一个 Release(默认是最新 Release)。当对 Project P 的一个 Release R 进行 Remix 时,我们会:

1. 为当前 User 创建一个 Project P2(非公开)
2. 将 P 的 Description、Instructions 等信息拷贝到 P2 中
3. 将 R 的 Game 信息(源码部分)拷贝到 P2 中
4. 设置 P2 的 RemixFrom 为 P & R

## User Story

### 编辑 Project

除了在 [Go+ Builder Product](./index.zh.md) 中提到的编辑 Project 的动作,用户还可以在编辑器中:

* Publish / Unpublish Project

### 查看他人公开 Project 主页

已登录或未登录用户可以在他人公开 Project 对应的主页:

* 查看 Project 的基本信息,如拥有者、Name、Description、Instructions、RemixFrom 等
* 查看 Release 记录,如创建时间、Version、Description 等
* 查看 Project 的 Community 交互信息
* 运行游戏,游戏内容为 Project 的最新 Release 的 Game 信息
* 分享 Project 给他人
* Like(若已登录)
* Remix Project(若已登录)

仅当 Project 有 Release 时,Remix 操作基于的是当前 Project 的最新 Release

### 查看自己的 Project 主页

已登录用户可以在自己的 Project 主页:

* 查看 Project 的基本信息,如拥有者、Name、Description、Instructions、RemixFrom 等
* 查看 Release 记录,如创建时间、Version、Description 等
* 查看 Project 的 Community 交互信息
* 运行游戏,游戏内容为 Project 的最新 Release 的 Game 信息
* 编辑 Project 的基本信息,如 Description、Instructions 等
* 编辑 Project 游戏内容(跳转到编辑器页面)
* Unpublish Project

### 查看他人个人主页

已登录或未登录用户可以通过访问其他 User 的个人主页:

* 查看 User 的基本信息,如 Name、Description 等
* 查看 User 的公开 Project 列表
* 查看 User 的 Community 交互信息,如 Followers、Followees、Like 等
* Follow / Unfollow 该 User(若已登录)

### 查看自己的个人主页

已登录用户可以通过访问自己的个人主页:

* 查看自己的基本信息,如 Name、Description 等
* 查看自己的公开 Project 列表
* 查看自己的 Community 交互信息,如 Followers、Followees、Like 等
* 编辑自己的基本信息

### 访问 Community 首页

已登录或未登录用户可以访问 Community 首页:

* 查看推荐的公开 Project 列表(基于全网最近的 Like 信息 & Remix 信息)
* 查看关注的 User 的动态信息
22 changes: 3 additions & 19 deletions docs/product/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,7 @@ When saving, the changes made this time should be appended to the existing Proje

### Editing Based on Public Projects of Others

Users can view and filter all public Projects saved by others, and continue editing based on them. It should be noted that when users edit based on public Projects of others, they are not actually modifying the Projects of others, and cannot modify them.

From a theoretical point of view, this process should be: create a new Project and copy the Game of the target Project. Therefore, when saving, the changes made this time should not be appended to the existing Project in the cloud, but a new Project should be added to the cloud.
See "Remix" in the [Community](./community.md) section for more details.

### Importing and Exporting Projects

Expand Down Expand Up @@ -209,23 +207,9 @@ Users can choose to import a Scratch project file (obtained from the export func

The subsequent editing of Assets is the same as normal editing and will not be repeated here.

### Sharing Links

In the editor, we will guide users to share their Projects with others. Only saved and public Projects can be shared.

The complete process when the owner A of a certain Project shares the Project with another user B is as follows:

1. A has already opened a certain Project in the editor and can obtain a sharing link through a button or guidance.
2. If the Project currently has unsaved changes or is not public, guide A to save the changes to the Project and make it public before obtaining a meaningful sharing link.
3. A sends the link to B through other channels (such as IM, email, QR code, etc.).
4. B opens the link in a browser, and the link corresponds to an independent game running page (unrelated to the editor). The page will load the shared Project and run it.

Please note that users can only run the game through this interface or see some basic information about the Project (such as the owner, creation time, update time, etc.). These actions are for reading Project information, not for editing. Therefore, opening the game running page does not require the current user to log in.

5. In addition to allowing B to play the game, we guide B to add their own changes based on the current Project.
6. The guided link will enter the editor, and the subsequent process is the same as "Editing Based on Public Projects of Others" mentioned above.
### Sharing Projects

Note that because the editor does not currently support unauthenticated users to perform operations through the editor, we will check the user's login status. The logic is the same as mentioned in "Editing in Unauthenticated State".
See [Community](./community.md) for more details.

### Embedding in Third-Party Websites

Expand Down
22 changes: 3 additions & 19 deletions docs/product/index.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,7 @@ Asset 包含以下信息:

### 在其他人的公开 Project 基础上编辑

用户可以查看并筛选所有人保存的公开 Project,并在其基础上继续编辑。需要注意,当用户在其他人的公开 Project 基础上编辑时,他编辑的并不是其他人的 Project,也无法真的修改其他人的 Project。

这个过程从原理上看应当是:创建一个新的 Project,并把目标 Project 的 Game 拷贝过来。因此在保存时,不应当将本次做的变更追加到云端已有的 Project 上,而是在云端添加新的 Project。
详见 [社区 Community](./community.zh.md) 中的“改编 Remix”。

### 导入、导出 Project

Expand Down Expand Up @@ -209,23 +207,9 @@ Asset 包含以下信息:

后续对于 Asset 的编辑与普通的编辑相同,这里不做赘述。

### 分享链接

在编辑器中,我们会引导用户分享他的 Project 给他人。只有已保存且公开的 Project 才可以被分享。

某个 Project 的拥有者 A 分享该 Project 给另外一个用户 B 时,完整的流程如下:

1. A 在编辑器中已经打开了某个 Project,通过某个按钮或引导可以得到分享链接
2. 如果该 Project 当前有未保存的变更或未公开,引导 A 保存 Project 的变更并公开,然后才能得到有意义的分享链接
3. A 将链接通过其他渠道(如 IM、邮件、二维码等)发送给 B
4. B 在浏览器中打开链接,链接对应的是一个独立的游戏运行页面(与编辑器无关),页面会去加载被分享的 Project,并运行

需要注意用户通过这个界面只能去运行游戏,或者看到一些 Project 本身的基本信息(比如拥有者、创建时间、更新时间等);这些动作都是对于 Project 信息的读取,而不是编辑。因此打开游戏运行页面不要求当前用户登录

5. 除了允许 B 进行游戏外,我们通过在运行界面引导 B 在当前 Project 基础上添加自己的改动
6. 引导链接会进入到编辑器,后续流程与上述“在其他人的公开 Project 基础上编辑”一致
### 分享

注意,因为编辑器暂不支持未登录用户通过编辑器进行操作,因此这里我们会检查用户登录状态,逻辑相见上述“未登录状态编辑”
详见 [社区 Community](./community.zh.md)

### 嵌入到第三方站点

Expand Down