Skip to content

Commit 935da4e

Browse files
update Open Source Docs from Roblox internal teams
1 parent 94470b8 commit 935da4e

File tree

13 files changed

+179
-166
lines changed

13 files changed

+179
-166
lines changed

content/common/navigation/engine/reference.yaml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3602,6 +3602,11 @@ navigation:
36023602
type: engineapi
36033603
source: /reference/engine/enums/ActionType.yaml
36043604
ignoreTranslation: true
3605+
- title: ActivePayerStatus
3606+
path: /reference/engine/enums/ActivePayerStatus
3607+
type: engineapi
3608+
source: /reference/engine/enums/ActivePayerStatus.yaml
3609+
ignoreTranslation: true
36053610
- title: ActuatorRelativeTo
36063611
path: /reference/engine/enums/ActuatorRelativeTo
36073612
type: engineapi
@@ -5187,6 +5192,11 @@ navigation:
51875192
type: engineapi
51885193
source: /reference/engine/enums/PlayerExitReason.yaml
51895194
ignoreTranslation: true
5195+
- title: PlayerPlatformSpenderStatus
5196+
path: /reference/engine/enums/PlayerPlatformSpenderStatus
5197+
type: engineapi
5198+
source: /reference/engine/enums/PlayerPlatformSpenderStatus.yaml
5199+
ignoreTranslation: true
51905200
- title: PoseEasingDirection
51915201
path: /reference/engine/enums/PoseEasingDirection
51925202
type: engineapi
@@ -6147,6 +6157,11 @@ navigation:
61476157
type: engineapi
61486158
source: /reference/engine/enums/WeldConstraintPreserve.yaml
61496159
ignoreTranslation: true
6160+
- title: WhenUserFirstPlayed
6161+
path: /reference/engine/enums/WhenUserFirstPlayed
6162+
type: engineapi
6163+
source: /reference/engine/enums/WhenUserFirstPlayed.yaml
6164+
ignoreTranslation: true
61506165
- title: WhisperChatPrivacyMode
61516166
path: /reference/engine/enums/WhisperChatPrivacyMode
61526167
type: engineapi

content/en-us/art/characters/manually-update-catalog-heads.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,8 @@ Import your head back into Studio and verify that it passes validation. If valid
140140
1. Select **Save to Roblox** on your asset.
141141
2. Select **Development Item**.
142142
3. Set its **Asset Category** to Model.
143-
4. Set **Asset Privacy** to `Public` (default value is `Private`).
144-
5. Save the model to Roblox (no publishing fees are incurred).
145-
6. After saving to Roblox, save the asset ID provided.
143+
4. Save the model to Roblox (no publishing fees are incurred).
144+
5. After saving to Roblox, save the asset ID provided.
146145
1. While you can submit either the head or body asset, there is no distinction between head and body asset when saving as a development item.
147146
2. For submission to the web form, we prefer that you get the asset ID of the head, but you can use either the head or body asset ID and Roblox will replace the head accordingly.
148147

content/en-us/assets/misc/Webhooks-Example-Message-Body.png

Lines changed: 0 additions & 3 deletions
This file was deleted.

content/en-us/assets/misc/Webhooks-Sample-Notification.png

Lines changed: 0 additions & 3 deletions
This file was deleted.

content/en-us/cloud/webhooks/automate-right-to-erasure.md

Lines changed: 15 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ description: Explains how to automate Right to Erasure requests with webhooks an
55

66
The **General Data Protection Regulation (GDPR)** is a European regulation on data protection and privacy. It grants individuals the right to request the deletion of their personal data, known as the [right to erasure](https://gdpr-info.eu/art-17-gdpr/). If you store any **Personally Identifiable Information (PII)** of your users, such as their User IDs, you must comply with GDPR requirements by deleting this information upon receiving a user's request.
77

8-
Instead of handling requests manually, you can [set up a webhook](../../cloud/webhooks/webhook-notifications.md) and use a bot within a third-party messaging application to automate the process. As [data stores](../../cloud-services/data-stores/index.md) being the most common way for storing PII data, this tutorial provides an example on how to create a bot within Guilded or Discord that uses the [Open Cloud API for data stores](../../cloud/guides/data-stores/index.md) to delete PII data as an automation solution.
8+
Instead of handling requests manually, you can [set up a webhook](../../cloud/webhooks/webhook-notifications.md) and use a bot within a third-party messaging application to automate the process. As [data stores](../../cloud-services/data-stores/index.md) being the most common way for storing PII data, this tutorial provides an example on how to create a bot within Discord that uses the [Open Cloud API for data stores](../../cloud/guides/data-stores/index.md) to delete PII data as an automation solution.
99

1010
## Workflow
1111

@@ -17,7 +17,7 @@ Upon completing this tutorial, you should be able to create a locally-running cu
1717
<Alert severity="warning">
1818
To use this solution, make sure your data store keys are identifiable by User IDs, such as containing User IDs as substrings, or you need to modify the scripts to match your own data schema.
1919
</Alert>
20-
1. The bot responds to the webhook message in Discord or Guilded with the deletion status.
20+
1. The bot responds to the webhook message in Discord with the deletion status.
2121

2222
<img src="../../assets/misc/Webhooks-Bot-Workflow.png" width="100%" />
2323

@@ -27,29 +27,19 @@ Before creating a bot, set up a server with webhook integration on the third-par
2727

2828
### Set up a server
2929

30-
The following steps show how to set up the server using Guilded or Discord.
30+
The following steps show how to set up the server using Discord.
3131

32-
<Tabs>
33-
<TabItem label="Guilded">
34-
1. Create a new Guilded server. If you are unfamiliar with the process, see [Guilded Support](https://support.guilded.gg/hc/en-us/articles/1500002751582-Create-a-Server).
35-
1. Under the **Privacy** settings, set the server to private. The server automatically creates a private **#general** channel as your default channel.
36-
1. Create a webhook integration with the new server and give it a name that you can easily understand, such as `GDPR Hook`. If you are unfamiliar with the process, see [Guilded Support](https://support.guilded.gg/hc/en-us/articles/360038927934-Incoming-Webhooks).
37-
1. Copy the webhook URL and store it in a secure place. Only allow trusted team members to access it, as leaking the URL can enable bad actors to send fake messages and potentially delete your user data.
38-
</TabItem>
39-
<TabItem label="Discord">
4032
1. Create a new Discord server. If you are unfamiliar with the process, see [Discord Support](https://support.discord.com/hc/en-us/articles/204849977-How-do-I-create-a-server-).
41-
<Alert severity="info">
42-
It's recommended to set your server as a private server to protect user security. See [Discord Support](https://support.discord.com/hc/en-us/articles/206143407-How-do-I-set-up-a-private-server-) if you are unfamiliar with the process.
43-
</Alert>
33+
34+
<Alert severity="info">
35+
It's recommended to set your server as a private server to protect user security. See [Discord Support](https://support.discord.com/hc/en-us/articles/206143407-How-do-I-set-up-a-private-server-) if you are unfamiliar with the process.
36+
</Alert>
4437

4538
1. The server automatically creates a **#general** channel as your default channel. Click the **Edit Channel** icon of the **#general** channel.
4639
1. Under **Permissions**, set the channel to private.
4740
1. Create a webhook integration with the new server, name it to `GDPR Hook`. If you are unfamiliar with the process, see [Discord Support](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks).
4841
1. Copy the webhook URL and store it in a secure place. Only allow trusted team members to access it, as leaking the URL can enable bad actors to send fake messages and potentially delete your user data.
4942

50-
</TabItem>
51-
</Tabs>
52-
5343
### Configure a webhook on Roblox
5444

5545
After obtaining the third-party server URL, use it to [configure a webhook](../../cloud/webhooks/webhook-notifications.md#configure-webhooks-on-creator-dashboard) on Creator Dashboard. make sure you perform the following settings:
@@ -58,39 +48,15 @@ After obtaining the third-party server URL, use it to [configure a webhook](../.
5848
Currently, only group owners can receive Right to Erasure requests for group-owned experiences. To implement the automation solution for a group-owned experience, make sure that the group owner configures the webhook.
5949
</Alert>
6050

61-
- Add the Guilded or Discord server URL as the **Webhook URL**.
51+
- Add the Discord server URL as the **Webhook URL**.
6252
- Include a custom **Secret**. Though a secret is optional for completing the configuration, you should include one to prevent bad actors from impersonating Roblox and deleting your data. For more information on the usage of a secret, see [Verify webhook security](../../cloud/webhooks/webhook-notifications.md#verifying-webhook-security).
6353
- Select **Right to Erasure Request** under **Triggers**.
6454

6555
You can test the webhook using the **Test Response** button to see if you receive a notification in your server's **#general** channel from Roblox. If you don't receive the notification, try again or check your server settings to troubleshoot the error.
6656

67-
<img src="../../assets/misc/Webhooks-Sample-Notification.png" width="50%" alt="Example notification on Guilded"/>
68-
6957
## Configure a bot
7058

71-
After you add the webhook, use it to configure the bot with the following steps:
72-
73-
<Tabs>
74-
<TabItem label="Guilded">
75-
76-
1. Open the **All servers** list by clicking its icon or use the shortcut:
77-
78-
- <kbd>Ctrl</kbd><kbd>S</kbd> on Windows.
79-
- <kbd>⌘</kbd><kbd>S</kbd> on Mac.
80-
81-
1. Select your server for receiving right to erasure notifications.
82-
1. Expand the list under **Server home** and select **Manage Bots**.
83-
1. The server automatically creates a private **#general** channel as your default channel.
84-
1. Click the **Create a bot** button and add a bot name. Guilded redirects you to the bot configuration page.
85-
1. Select the **API** section on the bot configuration page.
86-
1. Under the **Tokens** section, click the **Generate Token** button.
87-
1. Save and store the generated token in a safe place.
88-
89-
</TabItem>
90-
91-
<TabItem label="Discord">
92-
93-
Check out Discord's [documentation](https://discord.com/developers/docs/topics/oauth2#bot-vs-user-accounts) for latest instructions.
59+
After you add the webhook, use it to configure the bot with the following steps. For more information, see the [Discord documentation](https://discord.com/developers/docs/topics/oauth2#bot-vs-user-accounts).
9460

9561
1. Navigate to the [Applications page](https://discord.com/developers/applications).
9662
1. Create a new application and name it to `GDPR Bot`.
@@ -106,9 +72,6 @@ Check out Discord's [documentation](https://discord.com/developers/docs/topics/o
10672
1. Under the **Privileged Gateway Intents** section, enable **Message Content Intent**.
10773
1. In the Bot settings > **Build-A-Bot** section, save the bot token in a secure place for later steps. If you don't see the token, click the **Reset Token** button to generate a new one.
10874

109-
</TabItem>
110-
</Tabs>
111-
11275
## Create an Open Cloud API key
11376

11477
To allow your third-party bot to access your data stores for storing PII data of users, [create an Open Cloud API key](../auth/api-keys.md) that can access your experiences and add the **Delete Entry** permission of data stores for data deletion. If you use ordered data stores for storing PII, you also need to add the **Write** permission of ordered data stores. After completion, copy and save the API key in a secure location to use it in later steps.
@@ -129,31 +92,16 @@ To obtain these identifiers:
12992

13093
## Add scripts
13194

132-
After you finish setting up the webhook, bot, and API key for data stores, add them to the scripts that implement the bot's automation logic. The following example uses Python 3:
95+
After you finish setting up the webhook, bot, and API key for data stores, add them to the scripts that implement the bot's automation logic. The following example uses Python 3.
13396

13497
1. Install Python libraries using the following commands:
13598

136-
<Tabs>
137-
<TabItem label="Guilded">
138-
139-
```bash title="Install Libraries"
140-
pip3 install guilded.py==1.8.0
141-
pip3 install requests
142-
pip3 install urllib3==1.26.6
143-
```
144-
145-
</TabItem>
146-
<TabItem label="Discord">
147-
14899
```bash title="Install Libraries"
149100
pip3 install discord
150101
pip3 install requests
151102
pip3 install urllib3==1.26.6
152103
```
153104

154-
</TabItem>
155-
</Tabs>
156-
157105
1. Copy and save the following scripts corresponding to different parts of the bot logic in the same directory:
158106

159107
```python title="bot_config.py"
@@ -315,7 +263,7 @@ After you finish setting up the webhook, bot, and API key for data stores, add t
315263
return True
316264

317265
"""
318-
Parses a received webhook messaged on Discord or Guilded. Extracts user ID, prevents replay attack
266+
Parses a received webhook messaged on Discord. Extracts user ID, prevents replay attack
319267
based on timestamp received, and verifies Roblox signature with configured secret to check for
320268
validity.
321269
"""
@@ -341,61 +289,6 @@ After you finish setting up the webhook, bot, and API key for data stores, add t
341289
return "", []
342290
```
343291

344-
<Tabs>
345-
<TabItem label="Guilded">
346-
347-
```python title="guilded_bot.py"
348-
import guilded
349-
import json
350-
351-
import bot_config
352-
import data_stores_api
353-
import message_parser
354-
355-
def run():
356-
client = guilded.Client()
357-
358-
@client.event
359-
async def on_ready():
360-
print(f"{client.user} is listening to Right to Erasure messages")
361-
362-
"""
363-
Handler for webhook messages from Roblox
364-
"""
365-
@client.event
366-
async def on_message(message):
367-
# Parses and validates message
368-
user_id, start_place_ids = message_parser.parse_message(message)
369-
if not user_id or not start_place_ids:
370-
return
371-
372-
# Deletes standard data stores user data
373-
[successes, failures] = data_stores_api.delete_standard_data_stores(user_id, start_place_ids)
374-
if successes:
375-
await message.reply(f"Deleted standard data stores data for " +
376-
f"user ID: {user_id}, data: {dict(successes)}")
377-
if failures:
378-
await message.reply(f"Failed to delete standard data stores data for " +
379-
f"user ID: {user_id}, data: {dict(failures)}")
380-
381-
# Deletes ordered data stores user data
382-
[successes, failures] = data_stores_api.delete_ordered_data_stores(user_id, start_place_ids)
383-
if successes:
384-
await message.reply(f"Deleted ordered data stores data for " +
385-
f"user ID: {user_id}, data: {dict(successes)}")
386-
if failures:
387-
await message.reply(f"Failed to delete ordered data stores data for " +
388-
f"user ID: {user_id}, data: {dict(failures)}")
389-
390-
client.run(bot_config.BOT_TOKEN)
391-
392-
if __name__ == "__main__":
393-
run()
394-
```
395-
396-
</TabItem>
397-
<TabItem label="Discord">
398-
399292
```python title="discord_bot.py"
400293
import discord
401294

@@ -446,9 +339,6 @@ After you finish setting up the webhook, bot, and API key for data stores, add t
446339
run()
447340
```
448341

449-
</TabItem>
450-
</Tabs>
451-
452342
1. On the `bot_config.py` file for main configuration of the bot:
453343

454344
1. Set `BOT_TOKEN` to the token generated by your bot.
@@ -461,22 +351,9 @@ After you finish setting up the webhook, bot, and API key for data stores, add t
461351

462352
1. Execute the following command to run the bot:
463353

464-
<Tabs>
465-
<TabItem label="Guilded">
466-
467-
```bash title="Run Guilded Bot"
468-
python3 guilded_bot.py
469-
```
470-
471-
</TabItem>
472-
<TabItem label="Discord">
473-
474-
```bash title="Run Discord Bot"
475-
python3 discord_bot.py
476-
```
477-
478-
</TabItem>
479-
</Tabs>
354+
```bash title="Run Discord Bot"
355+
python3 discord_bot.py
356+
```
480357

481358
1. The bot then starts to listen and verify Roblox webhooks for right to erasure Requests and calls the Open Cloud endpoint for deleting the corresponding data store.
482359

@@ -488,7 +365,7 @@ To ensure constant and secure execution of the scripts, save and run them locall
488365

489366
You can create and run a test message to verify that your custom program can properly handle right to erasure requests and delete PII data:
490367

491-
1. Send an HTTP `POST` request to your Guilded or Discord webhook server with the following request body:
368+
1. Send an HTTP `POST` request to your Discord webhook server with the following request body:
492369

493370
```bash title="Example Request"
494371
curl -X POST {serverUrl}

0 commit comments

Comments
 (0)