From 055c5d8fed5b77ada3831b30edaf6e7747e0cdb1 Mon Sep 17 00:00:00 2001 From: Stephen Leitnick Date: Thu, 9 Feb 2023 09:13:16 -0500 Subject: [PATCH 1/6] Allow env variable for API key --- Cargo.toml | 2 +- src/cli/datastore_cli.rs | 16 ++++++++-------- src/cli/experience_cli.rs | 2 +- src/cli/messaging_cli.rs | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 108d2ce..27e7dcf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ edition = "2021" [dependencies] anyhow = "1.0.58" base64 = "0.13.0" -clap = { version = "3.2.14", features = ["derive"] } +clap = { version = "3.2.14", features = ["derive", "env"] } md-5 = "0.10.1" reqwest = { version = "0.11.11", features = ["json"] } serde = { version = "1.0.140", features = ["derive"] } diff --git a/src/cli/datastore_cli.rs b/src/cli/datastore_cli.rs index a45921a..a6f0dbf 100644 --- a/src/cli/datastore_cli.rs +++ b/src/cli/datastore_cli.rs @@ -27,7 +27,7 @@ pub enum DataStoreCommands { universe_id: u64, /// Roblox Open Cloud API Key - #[clap(short, long, value_parser)] + #[clap(short, long, value_parser, env = "RBXCLOUD_API_KEY")] api_key: String, }, @@ -62,7 +62,7 @@ pub enum DataStoreCommands { universe_id: u64, /// Roblox Open Cloud API Key - #[clap(short, long, value_parser)] + #[clap(short, long, value_parser, env = "RBXCLOUD_API_KEY")] api_key: String, }, @@ -85,7 +85,7 @@ pub enum DataStoreCommands { universe_id: u64, /// Roblox Open Cloud API Key - #[clap(short, long, value_parser)] + #[clap(short, long, value_parser, env = "RBXCLOUD_API_KEY")] api_key: String, }, @@ -128,7 +128,7 @@ pub enum DataStoreCommands { universe_id: u64, /// Roblox Open Cloud API Key - #[clap(short, long, value_parser)] + #[clap(short, long, value_parser, env = "RBXCLOUD_API_KEY")] api_key: String, }, @@ -163,7 +163,7 @@ pub enum DataStoreCommands { universe_id: u64, /// Roblox Open Cloud API Key - #[clap(short, long, value_parser)] + #[clap(short, long, value_parser, env = "RBXCLOUD_API_KEY")] api_key: String, }, @@ -186,7 +186,7 @@ pub enum DataStoreCommands { universe_id: u64, /// Roblox Open Cloud API Key - #[clap(short, long, value_parser)] + #[clap(short, long, value_parser, env = "RBXCLOUD_API_KEY")] api_key: String, }, @@ -229,7 +229,7 @@ pub enum DataStoreCommands { universe_id: u64, /// Roblox Open Cloud API Key - #[clap(short, long, value_parser)] + #[clap(short, long, value_parser, env = "RBXCLOUD_API_KEY")] api_key: String, }, @@ -256,7 +256,7 @@ pub enum DataStoreCommands { universe_id: u64, /// Roblox Open Cloud API Key - #[clap(short, long, value_parser)] + #[clap(short, long, value_parser, env = "RBXCLOUD_API_KEY")] api_key: String, }, } diff --git a/src/cli/experience_cli.rs b/src/cli/experience_cli.rs index b877918..7271870 100644 --- a/src/cli/experience_cli.rs +++ b/src/cli/experience_cli.rs @@ -23,7 +23,7 @@ pub enum ExperienceCommands { version_type: VersionType, /// Roblox Open Cloud API Key - #[clap(short, long, value_parser)] + #[clap(short, long, value_parser, env = "RBXCLOUD_API_KEY")] api_key: String, }, } diff --git a/src/cli/messaging_cli.rs b/src/cli/messaging_cli.rs index aad7ae3..a391edc 100644 --- a/src/cli/messaging_cli.rs +++ b/src/cli/messaging_cli.rs @@ -19,7 +19,7 @@ pub enum MessagingCommands { universe_id: u64, /// Roblox Open Cloud API Key - #[clap(short, long, value_parser)] + #[clap(short, long, value_parser, env = "RBXCLOUD_API_KEY")] api_key: String, }, } From b39304e43a807cd498f1e0bbb1ec00873b97f762 Mon Sep 17 00:00:00 2001 From: Stephen Leitnick Date: Thu, 9 Feb 2023 09:35:55 -0500 Subject: [PATCH 2/6] Documentation for API keys and env variable --- docs/cli/cli-api-key.md | 23 ++++ docs/cli/cli-datastore.md | 276 ++++++++++++++++++------------------- docs/cli/cli-experience.md | 110 +++++++-------- docs/cli/cli-messaging.md | 48 +++---- mkdocs.yml | 99 ++++++------- 5 files changed, 290 insertions(+), 266 deletions(-) create mode 100644 docs/cli/cli-api-key.md diff --git a/docs/cli/cli-api-key.md b/docs/cli/cli-api-key.md new file mode 100644 index 0000000..385cdc3 --- /dev/null +++ b/docs/cli/cli-api-key.md @@ -0,0 +1,23 @@ +# API Key +`rbxcloud` requires a Roblox API key to function. These keys can be created and managed on the [Credentials](https://create.roblox.com/credentials) Roblox page. Remember to always keep these keys secret. + +Roblox API keys will auto-expire if not used for over 60 days. Use the Credentials page to regenerate the key if this occurs. + +## Security +As a general rule of practice for any API key: +- Use the least number of permissions as needed +- Keep the key in a secret location (e.g. GitHub Secrets, AWS Secrets Manager, etc.) +- Never commit a key to a source code repository +- Use as strict of a CIDR as possible +- Use an expiration date to force periodic key rollovers (must be manually regenerated) + +### Handling Compromised Keys +If a key is suspected to have been compromised, use the Credentials page to immediately invalidate the key. This can be done by regenerating or deleting the key. Keys can also be disabled, but re-enabling the key will not change the key, thus is not a safe option to protect from a compromised key. If in doubt, regenerate the key. + +### Storing Keys +There are many tools that can be used to securely store a key. GitHub has a Secrets page for each repository, which can then be used by GitHub Actions securely. AWS and GCP have a Secrets Manager service. Azure has the Key Vault service. + +If a key must be located within a local repository's directory, be sure to add it to the `.gitignore` file. This is common in some `.env` file setups. + +## Environment Variable +All CLI commands expect the `--api-key` parameter, but can also be set via the `RBXCLOUD_API_KEY` environment variable. With the environment variable set, the `--api-key` parameter can be left out. diff --git a/docs/cli/cli-datastore.md b/docs/cli/cli-datastore.md index 4c31090..4aca5ba 100644 --- a/docs/cli/cli-datastore.md +++ b/docs/cli/cli-datastore.md @@ -1,138 +1,138 @@ -# DataStore API - -## List Stores -List all DataStores within a given experience. -``` -USAGE: - rbxcloud datastore list-stores [OPTIONS] --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key - -c, --cursor Cursor for the next set of data - -h, --help Print help information - -l, --limit Maximum number of items to return - -p, --prefix Return only DataStores with this prefix - -u, --universe-id Universe ID of the experience -``` - -## List Keys -List all keys within a given DataStore. -``` -USAGE: - rbxcloud datastore list [OPTIONS] --datastore-name --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key - -c, --cursor Cursor for the next set of data - -d, --datastore-name DataStore name - -h, --help Print help information - -l, --limit Maximum number of items to return - -o, --all-scopes If true, return keys from all scopes - -p, --prefix Return only DataStores with this prefix - -s, --scope DataStore scope - -u, --universe-id Universe ID of the experience -``` - -## List Key Versions -List all versions of the specified key. -``` -USAGE: - rbxcloud datastore list-versions [OPTIONS] --datastore-name --key --sort-order --limit --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key - -c, --cursor Cursor for the next set of data - -d, --datastore-name DataStore name - -e, --end-time End time constraint (ISO UTC Datetime) - -h, --help Print help information - -k, --key The key of the entry - -l, --limit Maximum number of items to return - -o, --sort-order Sort order [possible values: ascending, descending] - -s, --scope DataStore scope - -t, --start-time Start time constraint (ISO UTC Datetime) - -u, --universe-id Universe ID of the experience -``` - -## Get Key -Get the entry value of a specific key. -``` -USAGE: - rbxcloud datastore get [OPTIONS] --datastore-name --key --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key - -d, --datastore-name DataStore name - -h, --help Print help information - -k, --key The key of the entry - -s, --scope DataStore scope - -u, --universe-id Universe ID of the experience -``` - -## Set Key -Set (or create) the entry value of a specific key. -``` -USAGE: - rbxcloud datastore set [OPTIONS] --datastore-name --key --data --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key - -d, --datastore-name DataStore name - -D, --data JSON-stringified data (up to 4MB) - -e, --exclusive-create Only create the entry if it does not exist - -h, --help Print help information - -i, --match-version Only update if the current version matches this - -k, --key The key of the entry - -s, --scope DataStore scope - -t, --attributes JSON-stringified attributes data - -u, --universe-id Universe ID of the experience - -U, --user-ids Comma-separated list of Roblox user IDs -``` - -## Increment Key -Increment (or create) the entry value of a specific key. -``` -USAGE: - rbxcloud datastore increment [OPTIONS] --datastore-name --key --increment-by --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key - -d, --datastore-name DataStore name - -h, --help Print help information - -i, --increment-by The amount by which the entry should be incremented - -k, --key The key of the entry - -s, --scope DataStore scope - -t, --attributes JSON-stringified attributes data - -u, --universe-id Universe ID of the experience - -U, --user-ids Comma-separated list of Roblox user IDs -``` - -## Delete Key -Delete the value of a specific key. Per Roblox's [documentation](https://create.roblox.com/docs/open-cloud/data-store-api#delete-entry), this creates a "tombstone" version for 30 days before being completely deleted. -``` -USAGE: - rbxcloud datastore delete [OPTIONS] --datastore-name --key --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key - -d, --datastore-name DataStore name - -h, --help Print help information - -k, --key The key of the entry - -s, --scope DataStore scope - -u, --universe-id Universe ID of the experience -``` - -## Get Key Version -Get a specific entry of a key given the version. -``` -USAGE: - rbxcloud datastore get-version [OPTIONS] --datastore-name --key --version-id --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key - -d, --datastore-name DataStore name - -h, --help Print help information - -i, --version-id The version of the key - -k, --key The key of the entry - -s, --scope DataStore scope - -u, --universe-id Universe ID of the experience -``` +# DataStore API + +## List Stores +List all DataStores within a given experience. +``` +USAGE: + rbxcloud datastore list-stores [OPTIONS] --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -c, --cursor Cursor for the next set of data + -h, --help Print help information + -l, --limit Maximum number of items to return + -p, --prefix Return only DataStores with this prefix + -u, --universe-id Universe ID of the experience +``` + +## List Keys +List all keys within a given DataStore. +``` +USAGE: + rbxcloud datastore list [OPTIONS] --datastore-name --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -c, --cursor Cursor for the next set of data + -d, --datastore-name DataStore name + -h, --help Print help information + -l, --limit Maximum number of items to return + -o, --all-scopes If true, return keys from all scopes + -p, --prefix Return only DataStores with this prefix + -s, --scope DataStore scope + -u, --universe-id Universe ID of the experience +``` + +## List Key Versions +List all versions of the specified key. +``` +USAGE: + rbxcloud datastore list-versions [OPTIONS] --datastore-name --key --sort-order --limit --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -c, --cursor Cursor for the next set of data + -d, --datastore-name DataStore name + -e, --end-time End time constraint (ISO UTC Datetime) + -h, --help Print help information + -k, --key The key of the entry + -l, --limit Maximum number of items to return + -o, --sort-order Sort order [possible values: ascending, descending] + -s, --scope DataStore scope + -t, --start-time Start time constraint (ISO UTC Datetime) + -u, --universe-id Universe ID of the experience +``` + +## Get Key +Get the entry value of a specific key. +``` +USAGE: + rbxcloud datastore get [OPTIONS] --datastore-name --key --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -d, --datastore-name DataStore name + -h, --help Print help information + -k, --key The key of the entry + -s, --scope DataStore scope + -u, --universe-id Universe ID of the experience +``` + +## Set Key +Set (or create) the entry value of a specific key. +``` +USAGE: + rbxcloud datastore set [OPTIONS] --datastore-name --key --data --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -d, --datastore-name DataStore name + -D, --data JSON-stringified data (up to 4MB) + -e, --exclusive-create Only create the entry if it does not exist + -h, --help Print help information + -i, --match-version Only update if the current version matches this + -k, --key The key of the entry + -s, --scope DataStore scope + -t, --attributes JSON-stringified attributes data + -u, --universe-id Universe ID of the experience + -U, --user-ids Comma-separated list of Roblox user IDs +``` + +## Increment Key +Increment (or create) the entry value of a specific key. +``` +USAGE: + rbxcloud datastore increment [OPTIONS] --datastore-name --key --increment-by --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -d, --datastore-name DataStore name + -h, --help Print help information + -i, --increment-by The amount by which the entry should be incremented + -k, --key The key of the entry + -s, --scope DataStore scope + -t, --attributes JSON-stringified attributes data + -u, --universe-id Universe ID of the experience + -U, --user-ids Comma-separated list of Roblox user IDs +``` + +## Delete Key +Delete the value of a specific key. Per Roblox's [documentation](https://create.roblox.com/docs/open-cloud/data-store-api#delete-entry), this creates a "tombstone" version for 30 days before being completely deleted. +``` +USAGE: + rbxcloud datastore delete [OPTIONS] --datastore-name --key --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -d, --datastore-name DataStore name + -h, --help Print help information + -k, --key The key of the entry + -s, --scope DataStore scope + -u, --universe-id Universe ID of the experience +``` + +## Get Key Version +Get a specific entry of a key given the version. +``` +USAGE: + rbxcloud datastore get-version [OPTIONS] --datastore-name --key --version-id --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -d, --datastore-name DataStore name + -h, --help Print help information + -i, --version-id The version of the key + -k, --key The key of the entry + -s, --scope DataStore scope + -u, --universe-id Universe ID of the experience +``` diff --git a/docs/cli/cli-experience.md b/docs/cli/cli-experience.md index dc5aab7..12e0146 100644 --- a/docs/cli/cli-experience.md +++ b/docs/cli/cli-experience.md @@ -1,55 +1,55 @@ -# Experience API - -## Publish Place -Publish a place to a Roblox experience. This takes an `*.rbxl` file and publishes it to a specific Place ID. -``` -USAGE: - rbxcloud experience publish --filename --place-id --universe-id --version-type --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key - -f, --filename Filename (full or relative) of the RBXL file - -h, --help Print help information - -p, --place-id Place ID of the experience - -u, --universe-id Universe ID of the experience - -t, --version-type Version type [possible values: saved, published] -``` - -### Example -``` -$ rbxcloud experience publish -f myplace.rbxl -t published -p 12345 -u 98765 -a MY_KEY -``` - -### GitHub Action -A common practice is to create a CD pipeline to deploy a place automatically. This can be done with GitHub actions. Below is an example GitHub Action workflow. The example assumes that Foreman is being used and that `rbxcloud` is listed within the `foreman.toml` file. - -```yaml -# Deploy any time code is pushed to the 'main' branch -name: Deploy -on: - push: - branches: - - main - -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - uses: Roblox/setup-foreman@v1 - name: Install Foreman - with: - version: "^1.0.0" - token: ${{ SECRETS.GITHUB_TOKEN }} - - - name: Publish - shell: bash - env: - UID: 123456789 # Universe ID - PID: 123456789 # Place ID - API_KEY: ${{ secrets.key }} # API Key (keep this in your GitHub Repository Secrets) - FILE: my_place.rbxl # Roblox place file (e.g. might have a step before this to build the file with Rojo) - - run: rbxcloud experience publish -a "$API_KEY" -u "$UID" -p "$PID" -t published -f "$FILE" -``` +# Experience API + +## Publish Place +Publish a place to a Roblox experience. This takes an `*.rbxl` file and publishes it to a specific Place ID. +``` +USAGE: + rbxcloud experience publish --filename --place-id --universe-id --version-type --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -f, --filename Filename (full or relative) of the RBXL file + -h, --help Print help information + -p, --place-id Place ID of the experience + -u, --universe-id Universe ID of the experience + -t, --version-type Version type [possible values: saved, published] +``` + +### Example +``` +$ rbxcloud experience publish -f myplace.rbxl -t published -p 12345 -u 98765 -a MY_KEY +``` + +### GitHub Action +A common practice is to create a CD pipeline to deploy a place automatically. This can be done with GitHub actions. Below is an example GitHub Action workflow. The example assumes that Foreman is being used and that `rbxcloud` is listed within the `foreman.toml` file. + +```yaml +# Deploy any time code is pushed to the 'main' branch +name: Deploy +on: + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: Roblox/setup-foreman@v1 + name: Install Foreman + with: + version: "^1.0.0" + token: ${{ SECRETS.GITHUB_TOKEN }} + + - name: Publish + shell: bash + env: + UID: 123456789 # Universe ID + PID: 123456789 # Place ID + API_KEY: ${{ secrets.key }} # API Key (keep this in your GitHub Repository Secrets) + FILE: my_place.rbxl # Roblox place file (e.g. might have a step before this to build the file with Rojo) + + run: rbxcloud experience publish -a "$API_KEY" -u "$UID" -p "$PID" -t published -f "$FILE" +``` diff --git a/docs/cli/cli-messaging.md b/docs/cli/cli-messaging.md index 6d59c0b..80c198d 100644 --- a/docs/cli/cli-messaging.md +++ b/docs/cli/cli-messaging.md @@ -1,25 +1,25 @@ -# Messaging API - -## Publish Message -Publish a message to a Roblox experience. This takes a message and a topic and publishes the message. Experiences can use the [`MessagingService`](https://create.roblox.com/docs/reference/engine/classes/MessagingService) to subscribe to a topic and listen for messages. -``` -USAGE: - rbxcloud messaging publish --topic --message --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key - -h, --help Print help information - -m, --message Message to send - -t, --topic Message topic -``` - -Example: -``` -$ rbxcloud messaging publish -t Hello -m "Hello world!" -p 12345 -u 98765 -a MY_KEY -``` -```lua -MessagingService:SubscribeAsync("Hello", function(message) - print(message) - --> {message: "Hello world!"} -end) +# Messaging API + +## Publish Message +Publish a message to a Roblox experience. This takes a message and a topic and publishes the message. Experiences can use the [`MessagingService`](https://create.roblox.com/docs/reference/engine/classes/MessagingService) to subscribe to a topic and listen for messages. +``` +USAGE: + rbxcloud messaging publish --topic --message --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -h, --help Print help information + -m, --message Message to send + -t, --topic Message topic +``` + +Example: +``` +$ rbxcloud messaging publish -t Hello -m "Hello world!" -p 12345 -u 98765 -a MY_KEY +``` +```lua +MessagingService:SubscribeAsync("Hello", function(message) + print(message) + --> {message: "Hello world!"} +end) ``` \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 9561a06..b80aca1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,49 +1,50 @@ -site_name: rbxcloud -site_url: https://sleitnick.github.io/rbxcloud/ - -repo_name: rbxcloud -repo_url: https://github.com/Sleitnick/rbxcloud - -nav: - - Home: index.md - - CLI: - - Install: cli/cli-install.md - - Experience: cli/cli-experience.md - - Messaging: cli/cli-messaging.md - - DataStore: cli/cli-datastore.md - - Rust Lib: - - Install: lib/lib-install.md - -theme: - name: material - include_search_page: false - search_index_only: true - language: en - palette: - - scheme: default - primary: indigo - accent: indigo - toggle: - icon: material/brightness-7 - name: Switch to Dark Mode - - scheme: slate - primary: indigo - accent: indigo - toggle: - icon: material/brightness-4 - name: Switch to Light Mode - # icon: - # logo: material/cloud-tags - favicon: img/logo_64.png - logo: img/logo_64.png - -markdown_extensions: - - pymdownx.highlight: - anchor_linenums: true - - pymdownx.inlinehilite - - pymdownx.snippets - - pymdownx.superfences - - pymdownx.details - - admonition - - toc: - permalink: true +site_name: rbxcloud +site_url: https://sleitnick.github.io/rbxcloud/ + +repo_name: rbxcloud +repo_url: https://github.com/Sleitnick/rbxcloud + +nav: + - Home: index.md + - CLI: + - Install: cli/cli-install.md + - API Key: cli/cli-api-key.md + - Experience: cli/cli-experience.md + - Messaging: cli/cli-messaging.md + - DataStore: cli/cli-datastore.md + - Rust Lib: + - Install: lib/lib-install.md + +theme: + name: material + include_search_page: false + search_index_only: true + language: en + palette: + - scheme: default + primary: indigo + accent: indigo + toggle: + icon: material/brightness-7 + name: Switch to Dark Mode + - scheme: slate + primary: indigo + accent: indigo + toggle: + icon: material/brightness-4 + name: Switch to Light Mode + # icon: + # logo: material/cloud-tags + favicon: img/logo_64.png + logo: img/logo_64.png + +markdown_extensions: + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.superfences + - pymdownx.details + - admonition + - toc: + permalink: true From 585ac6d0688df4cc8ffb2091644690987629faf0 Mon Sep 17 00:00:00 2001 From: Stephen Leitnick Date: Thu, 9 Feb 2023 09:37:20 -0500 Subject: [PATCH 3/6] EOL --- README.md | 86 ++++++------ docs/cli/cli-datastore.md | 276 ++++++++++++++++++------------------- docs/cli/cli-experience.md | 110 +++++++-------- docs/cli/cli-install.md | 82 +++++------ docs/cli/cli-messaging.md | 48 +++---- docs/lib/lib-install.md | 36 ++--- mkdocs.yml | 100 +++++++------- 7 files changed, 369 insertions(+), 369 deletions(-) diff --git a/README.md b/README.md index 559acf7..78ab815 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,43 @@ -# Roblox Open Cloud CLI   ![Logo](imgs/icon_32_bottom.png) -[![CI](https://github.com/Sleitnick/rbxcloud/actions/workflows/ci.yaml/badge.svg)](https://github.com/Sleitnick/rbxcloud/actions/workflows/ci.yaml) -[![Release](https://github.com/Sleitnick/rbxcloud/actions/workflows/release.yaml/badge.svg?event=push)](https://github.com/Sleitnick/rbxcloud/actions/workflows/release.yaml) -[![Crate](https://img.shields.io/crates/v/rbxcloud.svg)](https://crates.io/crates/rbxcloud) -[![Docs](https://docs.rs/rbxcloud/badge.svg)](https://docs.rs/rbxcloud) - -The `rbxcloud` CLI lets developers easily communicate with the Roblox Open Cloud APIs. The underlying library can also be used to build tools and applications that utilize the various APIs. - -Possible use-cases: -- Deployment pipelines -- Live-ops -- Custom analytics -- Handling data removal requests (see [GDPR & CCPA info](https://create.roblox.com/docs/production/publishing/about-GDPR-and-CCPA)) -- Debugging DataStores - -## Install CLI -### Aftman -Run the `aftman add` command within your project directory. This will add `rbxcloud` to the project's `aftman.toml` file (or create one if it doesn't yet exist). -```sh -$ aftman add Sleitnick/rbxcloud@0.2.2 -``` - -### From Release -Download and unzip the tool for your OS from the [releases](https://github.com/Sleitnick/rbxcloud/releases) page. You will then need to put it in your desired location and point your path variable to the executable location. - -## CLI Documentation -Visit the documentation site for information on installation and usage: https://sleitnick.github.io/rbxcloud/ - -## Install Rust Library -### Add Dependency - -To use `rbxcloud` in a Rust project, simply add `rbxcloud` to the `Cargo.toml` dependency list. -```toml -[dependencies] -rbxcloud = "0.2.2" -``` - -Alternatively, use `cargo add`. -```sh -$ cargo add rbxcloud -``` - -See the [docs.rs](https://docs.rs/rbxcloud/latest/rbxcloud/) page for library documentation. +# Roblox Open Cloud CLI   ![Logo](imgs/icon_32_bottom.png) +[![CI](https://github.com/Sleitnick/rbxcloud/actions/workflows/ci.yaml/badge.svg)](https://github.com/Sleitnick/rbxcloud/actions/workflows/ci.yaml) +[![Release](https://github.com/Sleitnick/rbxcloud/actions/workflows/release.yaml/badge.svg?event=push)](https://github.com/Sleitnick/rbxcloud/actions/workflows/release.yaml) +[![Crate](https://img.shields.io/crates/v/rbxcloud.svg)](https://crates.io/crates/rbxcloud) +[![Docs](https://docs.rs/rbxcloud/badge.svg)](https://docs.rs/rbxcloud) + +The `rbxcloud` CLI lets developers easily communicate with the Roblox Open Cloud APIs. The underlying library can also be used to build tools and applications that utilize the various APIs. + +Possible use-cases: +- Deployment pipelines +- Live-ops +- Custom analytics +- Handling data removal requests (see [GDPR & CCPA info](https://create.roblox.com/docs/production/publishing/about-GDPR-and-CCPA)) +- Debugging DataStores + +## Install CLI +### Aftman +Run the `aftman add` command within your project directory. This will add `rbxcloud` to the project's `aftman.toml` file (or create one if it doesn't yet exist). +```sh +$ aftman add Sleitnick/rbxcloud@0.2.2 +``` + +### From Release +Download and unzip the tool for your OS from the [releases](https://github.com/Sleitnick/rbxcloud/releases) page. You will then need to put it in your desired location and point your path variable to the executable location. + +## CLI Documentation +Visit the documentation site for information on installation and usage: https://sleitnick.github.io/rbxcloud/ + +## Install Rust Library +### Add Dependency + +To use `rbxcloud` in a Rust project, simply add `rbxcloud` to the `Cargo.toml` dependency list. +```toml +[dependencies] +rbxcloud = "0.2.2" +``` + +Alternatively, use `cargo add`. +```sh +$ cargo add rbxcloud +``` + +See the [docs.rs](https://docs.rs/rbxcloud/latest/rbxcloud/) page for library documentation. diff --git a/docs/cli/cli-datastore.md b/docs/cli/cli-datastore.md index 4aca5ba..316c84d 100644 --- a/docs/cli/cli-datastore.md +++ b/docs/cli/cli-datastore.md @@ -1,138 +1,138 @@ -# DataStore API - -## List Stores -List all DataStores within a given experience. -``` -USAGE: - rbxcloud datastore list-stores [OPTIONS] --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] - -c, --cursor Cursor for the next set of data - -h, --help Print help information - -l, --limit Maximum number of items to return - -p, --prefix Return only DataStores with this prefix - -u, --universe-id Universe ID of the experience -``` - -## List Keys -List all keys within a given DataStore. -``` -USAGE: - rbxcloud datastore list [OPTIONS] --datastore-name --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] - -c, --cursor Cursor for the next set of data - -d, --datastore-name DataStore name - -h, --help Print help information - -l, --limit Maximum number of items to return - -o, --all-scopes If true, return keys from all scopes - -p, --prefix Return only DataStores with this prefix - -s, --scope DataStore scope - -u, --universe-id Universe ID of the experience -``` - -## List Key Versions -List all versions of the specified key. -``` -USAGE: - rbxcloud datastore list-versions [OPTIONS] --datastore-name --key --sort-order --limit --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] - -c, --cursor Cursor for the next set of data - -d, --datastore-name DataStore name - -e, --end-time End time constraint (ISO UTC Datetime) - -h, --help Print help information - -k, --key The key of the entry - -l, --limit Maximum number of items to return - -o, --sort-order Sort order [possible values: ascending, descending] - -s, --scope DataStore scope - -t, --start-time Start time constraint (ISO UTC Datetime) - -u, --universe-id Universe ID of the experience -``` - -## Get Key -Get the entry value of a specific key. -``` -USAGE: - rbxcloud datastore get [OPTIONS] --datastore-name --key --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] - -d, --datastore-name DataStore name - -h, --help Print help information - -k, --key The key of the entry - -s, --scope DataStore scope - -u, --universe-id Universe ID of the experience -``` - -## Set Key -Set (or create) the entry value of a specific key. -``` -USAGE: - rbxcloud datastore set [OPTIONS] --datastore-name --key --data --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] - -d, --datastore-name DataStore name - -D, --data JSON-stringified data (up to 4MB) - -e, --exclusive-create Only create the entry if it does not exist - -h, --help Print help information - -i, --match-version Only update if the current version matches this - -k, --key The key of the entry - -s, --scope DataStore scope - -t, --attributes JSON-stringified attributes data - -u, --universe-id Universe ID of the experience - -U, --user-ids Comma-separated list of Roblox user IDs -``` - -## Increment Key -Increment (or create) the entry value of a specific key. -``` -USAGE: - rbxcloud datastore increment [OPTIONS] --datastore-name --key --increment-by --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] - -d, --datastore-name DataStore name - -h, --help Print help information - -i, --increment-by The amount by which the entry should be incremented - -k, --key The key of the entry - -s, --scope DataStore scope - -t, --attributes JSON-stringified attributes data - -u, --universe-id Universe ID of the experience - -U, --user-ids Comma-separated list of Roblox user IDs -``` - -## Delete Key -Delete the value of a specific key. Per Roblox's [documentation](https://create.roblox.com/docs/open-cloud/data-store-api#delete-entry), this creates a "tombstone" version for 30 days before being completely deleted. -``` -USAGE: - rbxcloud datastore delete [OPTIONS] --datastore-name --key --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] - -d, --datastore-name DataStore name - -h, --help Print help information - -k, --key The key of the entry - -s, --scope DataStore scope - -u, --universe-id Universe ID of the experience -``` - -## Get Key Version -Get a specific entry of a key given the version. -``` -USAGE: - rbxcloud datastore get-version [OPTIONS] --datastore-name --key --version-id --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] - -d, --datastore-name DataStore name - -h, --help Print help information - -i, --version-id The version of the key - -k, --key The key of the entry - -s, --scope DataStore scope - -u, --universe-id Universe ID of the experience -``` +# DataStore API + +## List Stores +List all DataStores within a given experience. +``` +USAGE: + rbxcloud datastore list-stores [OPTIONS] --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -c, --cursor Cursor for the next set of data + -h, --help Print help information + -l, --limit Maximum number of items to return + -p, --prefix Return only DataStores with this prefix + -u, --universe-id Universe ID of the experience +``` + +## List Keys +List all keys within a given DataStore. +``` +USAGE: + rbxcloud datastore list [OPTIONS] --datastore-name --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -c, --cursor Cursor for the next set of data + -d, --datastore-name DataStore name + -h, --help Print help information + -l, --limit Maximum number of items to return + -o, --all-scopes If true, return keys from all scopes + -p, --prefix Return only DataStores with this prefix + -s, --scope DataStore scope + -u, --universe-id Universe ID of the experience +``` + +## List Key Versions +List all versions of the specified key. +``` +USAGE: + rbxcloud datastore list-versions [OPTIONS] --datastore-name --key --sort-order --limit --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -c, --cursor Cursor for the next set of data + -d, --datastore-name DataStore name + -e, --end-time End time constraint (ISO UTC Datetime) + -h, --help Print help information + -k, --key The key of the entry + -l, --limit Maximum number of items to return + -o, --sort-order Sort order [possible values: ascending, descending] + -s, --scope DataStore scope + -t, --start-time Start time constraint (ISO UTC Datetime) + -u, --universe-id Universe ID of the experience +``` + +## Get Key +Get the entry value of a specific key. +``` +USAGE: + rbxcloud datastore get [OPTIONS] --datastore-name --key --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -d, --datastore-name DataStore name + -h, --help Print help information + -k, --key The key of the entry + -s, --scope DataStore scope + -u, --universe-id Universe ID of the experience +``` + +## Set Key +Set (or create) the entry value of a specific key. +``` +USAGE: + rbxcloud datastore set [OPTIONS] --datastore-name --key --data --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -d, --datastore-name DataStore name + -D, --data JSON-stringified data (up to 4MB) + -e, --exclusive-create Only create the entry if it does not exist + -h, --help Print help information + -i, --match-version Only update if the current version matches this + -k, --key The key of the entry + -s, --scope DataStore scope + -t, --attributes JSON-stringified attributes data + -u, --universe-id Universe ID of the experience + -U, --user-ids Comma-separated list of Roblox user IDs +``` + +## Increment Key +Increment (or create) the entry value of a specific key. +``` +USAGE: + rbxcloud datastore increment [OPTIONS] --datastore-name --key --increment-by --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -d, --datastore-name DataStore name + -h, --help Print help information + -i, --increment-by The amount by which the entry should be incremented + -k, --key The key of the entry + -s, --scope DataStore scope + -t, --attributes JSON-stringified attributes data + -u, --universe-id Universe ID of the experience + -U, --user-ids Comma-separated list of Roblox user IDs +``` + +## Delete Key +Delete the value of a specific key. Per Roblox's [documentation](https://create.roblox.com/docs/open-cloud/data-store-api#delete-entry), this creates a "tombstone" version for 30 days before being completely deleted. +``` +USAGE: + rbxcloud datastore delete [OPTIONS] --datastore-name --key --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -d, --datastore-name DataStore name + -h, --help Print help information + -k, --key The key of the entry + -s, --scope DataStore scope + -u, --universe-id Universe ID of the experience +``` + +## Get Key Version +Get a specific entry of a key given the version. +``` +USAGE: + rbxcloud datastore get-version [OPTIONS] --datastore-name --key --version-id --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -d, --datastore-name DataStore name + -h, --help Print help information + -i, --version-id The version of the key + -k, --key The key of the entry + -s, --scope DataStore scope + -u, --universe-id Universe ID of the experience +``` diff --git a/docs/cli/cli-experience.md b/docs/cli/cli-experience.md index 12e0146..230033a 100644 --- a/docs/cli/cli-experience.md +++ b/docs/cli/cli-experience.md @@ -1,55 +1,55 @@ -# Experience API - -## Publish Place -Publish a place to a Roblox experience. This takes an `*.rbxl` file and publishes it to a specific Place ID. -``` -USAGE: - rbxcloud experience publish --filename --place-id --universe-id --version-type --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] - -f, --filename Filename (full or relative) of the RBXL file - -h, --help Print help information - -p, --place-id Place ID of the experience - -u, --universe-id Universe ID of the experience - -t, --version-type Version type [possible values: saved, published] -``` - -### Example -``` -$ rbxcloud experience publish -f myplace.rbxl -t published -p 12345 -u 98765 -a MY_KEY -``` - -### GitHub Action -A common practice is to create a CD pipeline to deploy a place automatically. This can be done with GitHub actions. Below is an example GitHub Action workflow. The example assumes that Foreman is being used and that `rbxcloud` is listed within the `foreman.toml` file. - -```yaml -# Deploy any time code is pushed to the 'main' branch -name: Deploy -on: - push: - branches: - - main - -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - uses: Roblox/setup-foreman@v1 - name: Install Foreman - with: - version: "^1.0.0" - token: ${{ SECRETS.GITHUB_TOKEN }} - - - name: Publish - shell: bash - env: - UID: 123456789 # Universe ID - PID: 123456789 # Place ID - API_KEY: ${{ secrets.key }} # API Key (keep this in your GitHub Repository Secrets) - FILE: my_place.rbxl # Roblox place file (e.g. might have a step before this to build the file with Rojo) - - run: rbxcloud experience publish -a "$API_KEY" -u "$UID" -p "$PID" -t published -f "$FILE" -``` +# Experience API + +## Publish Place +Publish a place to a Roblox experience. This takes an `*.rbxl` file and publishes it to a specific Place ID. +``` +USAGE: + rbxcloud experience publish --filename --place-id --universe-id --version-type --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -f, --filename Filename (full or relative) of the RBXL file + -h, --help Print help information + -p, --place-id Place ID of the experience + -u, --universe-id Universe ID of the experience + -t, --version-type Version type [possible values: saved, published] +``` + +### Example +``` +$ rbxcloud experience publish -f myplace.rbxl -t published -p 12345 -u 98765 -a MY_KEY +``` + +### GitHub Action +A common practice is to create a CD pipeline to deploy a place automatically. This can be done with GitHub actions. Below is an example GitHub Action workflow. The example assumes that Foreman is being used and that `rbxcloud` is listed within the `foreman.toml` file. + +```yaml +# Deploy any time code is pushed to the 'main' branch +name: Deploy +on: + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: Roblox/setup-foreman@v1 + name: Install Foreman + with: + version: "^1.0.0" + token: ${{ SECRETS.GITHUB_TOKEN }} + + - name: Publish + shell: bash + env: + UID: 123456789 # Universe ID + PID: 123456789 # Place ID + API_KEY: ${{ secrets.key }} # API Key (keep this in your GitHub Repository Secrets) + FILE: my_place.rbxl # Roblox place file (e.g. might have a step before this to build the file with Rojo) + + run: rbxcloud experience publish -a "$API_KEY" -u "$UID" -p "$PID" -t published -f "$FILE" +``` diff --git a/docs/cli/cli-install.md b/docs/cli/cli-install.md index 4367456..66bd37e 100644 --- a/docs/cli/cli-install.md +++ b/docs/cli/cli-install.md @@ -1,41 +1,41 @@ -# Install - -## Install CLI - -There are a few different ways to install the `rbxcloud` CLI. - -### [Aftman](https://github.com/LPGhatguy/aftman) (Preferred) -Run the `aftman add` command within your project directory. This will add `rbxcloud` to the project's `aftman.toml` file (or create one if it doesn't yet exist). -```sh -$ aftman add Sleitnick/rbxcloud@0.2.2 -``` - -Next, run `aftman install` to install `rbxcloud`. - -### [Foreman](https://github.com/Roblox/foreman) -Add `rbxcloud` under the `[tools]` section of your `foreman.toml` file. -```toml -# foreman.toml -[tools] -rbxcloud = { github = "Sleitnick/rbxcloud", version = "0.2.2" } -``` - -Next, run `foreman install` to install `rbxcloud`. - -??? info "Legacy" - Aftman is preferred over Foreman. For more information, see the [Aftman](https://github.com/LPGhatguy/aftman) GitHub repository. - -### [Releases](https://github.com/Sleitnick/rbxcloud/releases) -A few prebuilt binaries are compiled and attached to each release. - -1. Go to the [`releases`](https://github.com/Sleitnick/rbxcloud/releases) page -1. Navigate to the desired version (e.g. the [latest version](https://github.com/Sleitnick/rbxcloud/releases/latest)) -1. Download and unzip the desired executable -1. Relocate the executable to a more permanent place -1. Change your OS path variable to point to the executable - -## Verify -Run the tool with the `--version` flag to verify the installation succeeded. -```sh -$ rbxcloud --version -``` +# Install + +## Install CLI + +There are a few different ways to install the `rbxcloud` CLI. + +### [Aftman](https://github.com/LPGhatguy/aftman) (Preferred) +Run the `aftman add` command within your project directory. This will add `rbxcloud` to the project's `aftman.toml` file (or create one if it doesn't yet exist). +```sh +$ aftman add Sleitnick/rbxcloud@0.2.2 +``` + +Next, run `aftman install` to install `rbxcloud`. + +### [Foreman](https://github.com/Roblox/foreman) +Add `rbxcloud` under the `[tools]` section of your `foreman.toml` file. +```toml +# foreman.toml +[tools] +rbxcloud = { github = "Sleitnick/rbxcloud", version = "0.2.2" } +``` + +Next, run `foreman install` to install `rbxcloud`. + +??? info "Legacy" + Aftman is preferred over Foreman. For more information, see the [Aftman](https://github.com/LPGhatguy/aftman) GitHub repository. + +### [Releases](https://github.com/Sleitnick/rbxcloud/releases) +A few prebuilt binaries are compiled and attached to each release. + +1. Go to the [`releases`](https://github.com/Sleitnick/rbxcloud/releases) page +1. Navigate to the desired version (e.g. the [latest version](https://github.com/Sleitnick/rbxcloud/releases/latest)) +1. Download and unzip the desired executable +1. Relocate the executable to a more permanent place +1. Change your OS path variable to point to the executable + +## Verify +Run the tool with the `--version` flag to verify the installation succeeded. +```sh +$ rbxcloud --version +``` diff --git a/docs/cli/cli-messaging.md b/docs/cli/cli-messaging.md index 80c198d..16205f6 100644 --- a/docs/cli/cli-messaging.md +++ b/docs/cli/cli-messaging.md @@ -1,25 +1,25 @@ -# Messaging API - -## Publish Message -Publish a message to a Roblox experience. This takes a message and a topic and publishes the message. Experiences can use the [`MessagingService`](https://create.roblox.com/docs/reference/engine/classes/MessagingService) to subscribe to a topic and listen for messages. -``` -USAGE: - rbxcloud messaging publish --topic --message --universe-id --api-key - -OPTIONS: - -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] - -h, --help Print help information - -m, --message Message to send - -t, --topic Message topic -``` - -Example: -``` -$ rbxcloud messaging publish -t Hello -m "Hello world!" -p 12345 -u 98765 -a MY_KEY -``` -```lua -MessagingService:SubscribeAsync("Hello", function(message) - print(message) - --> {message: "Hello world!"} -end) +# Messaging API + +## Publish Message +Publish a message to a Roblox experience. This takes a message and a topic and publishes the message. Experiences can use the [`MessagingService`](https://create.roblox.com/docs/reference/engine/classes/MessagingService) to subscribe to a topic and listen for messages. +``` +USAGE: + rbxcloud messaging publish --topic --message --universe-id --api-key + +OPTIONS: + -a, --api-key Roblox Open Cloud API Key [env: RBXCLOUD_API_KEY=] + -h, --help Print help information + -m, --message Message to send + -t, --topic Message topic +``` + +Example: +``` +$ rbxcloud messaging publish -t Hello -m "Hello world!" -p 12345 -u 98765 -a MY_KEY +``` +```lua +MessagingService:SubscribeAsync("Hello", function(message) + print(message) + --> {message: "Hello world!"} +end) ``` \ No newline at end of file diff --git a/docs/lib/lib-install.md b/docs/lib/lib-install.md index e17fa55..f246996 100644 --- a/docs/lib/lib-install.md +++ b/docs/lib/lib-install.md @@ -1,18 +1,18 @@ -# Rust Library Installation - -## Add Dependency - -To use `rbxcloud` in a Rust project, simply add `rbxcloud` to the `Cargo.toml` dependency list. -```toml -[dependencies] -rbxcloud = "0.2.2" -``` - -Alternatively, use `cargo add`. -```sh -$ cargo add rbxcloud -``` - -## Documentation - -See the [docs.rs](https://docs.rs/rbxcloud/latest/rbxcloud/) page for documentation. +# Rust Library Installation + +## Add Dependency + +To use `rbxcloud` in a Rust project, simply add `rbxcloud` to the `Cargo.toml` dependency list. +```toml +[dependencies] +rbxcloud = "0.2.2" +``` + +Alternatively, use `cargo add`. +```sh +$ cargo add rbxcloud +``` + +## Documentation + +See the [docs.rs](https://docs.rs/rbxcloud/latest/rbxcloud/) page for documentation. diff --git a/mkdocs.yml b/mkdocs.yml index b80aca1..344e096 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,50 +1,50 @@ -site_name: rbxcloud -site_url: https://sleitnick.github.io/rbxcloud/ - -repo_name: rbxcloud -repo_url: https://github.com/Sleitnick/rbxcloud - -nav: - - Home: index.md - - CLI: - - Install: cli/cli-install.md - - API Key: cli/cli-api-key.md - - Experience: cli/cli-experience.md - - Messaging: cli/cli-messaging.md - - DataStore: cli/cli-datastore.md - - Rust Lib: - - Install: lib/lib-install.md - -theme: - name: material - include_search_page: false - search_index_only: true - language: en - palette: - - scheme: default - primary: indigo - accent: indigo - toggle: - icon: material/brightness-7 - name: Switch to Dark Mode - - scheme: slate - primary: indigo - accent: indigo - toggle: - icon: material/brightness-4 - name: Switch to Light Mode - # icon: - # logo: material/cloud-tags - favicon: img/logo_64.png - logo: img/logo_64.png - -markdown_extensions: - - pymdownx.highlight: - anchor_linenums: true - - pymdownx.inlinehilite - - pymdownx.snippets - - pymdownx.superfences - - pymdownx.details - - admonition - - toc: - permalink: true +site_name: rbxcloud +site_url: https://sleitnick.github.io/rbxcloud/ + +repo_name: rbxcloud +repo_url: https://github.com/Sleitnick/rbxcloud + +nav: + - Home: index.md + - CLI: + - Install: cli/cli-install.md + - API Key: cli/cli-api-key.md + - Experience: cli/cli-experience.md + - Messaging: cli/cli-messaging.md + - DataStore: cli/cli-datastore.md + - Rust Lib: + - Install: lib/lib-install.md + +theme: + name: material + include_search_page: false + search_index_only: true + language: en + palette: + - scheme: default + primary: indigo + accent: indigo + toggle: + icon: material/brightness-7 + name: Switch to Dark Mode + - scheme: slate + primary: indigo + accent: indigo + toggle: + icon: material/brightness-4 + name: Switch to Light Mode + # icon: + # logo: material/cloud-tags + favicon: img/logo_64.png + logo: img/logo_64.png + +markdown_extensions: + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.superfences + - pymdownx.details + - admonition + - toc: + permalink: true From 8f6354eaabd4f5fe1fb7a76ef001206ee4dc6c43 Mon Sep 17 00:00:00 2001 From: Stephen Leitnick Date: Thu, 9 Feb 2023 09:50:34 -0500 Subject: [PATCH 4/6] Readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 78ab815..a11dbdd 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,8 @@ Download and unzip the tool for your OS from the [releases](https://github.com/S Visit the documentation site for information on installation and usage: https://sleitnick.github.io/rbxcloud/ ## Install Rust Library +The library built for the CLI tool is available to use directly in Rust projects. This is essentially an SDK for the Roblox Open Cloud APIs. + ### Add Dependency To use `rbxcloud` in a Rust project, simply add `rbxcloud` to the `Cargo.toml` dependency list. From 0ffd9c8c9e57a37e2a0b81da252d59a5449899ec Mon Sep 17 00:00:00 2001 From: Stephen Leitnick Date: Thu, 9 Feb 2023 09:50:40 -0500 Subject: [PATCH 5/6] Social --- .gitignore | 1 + imgs/social.png | Bin 0 -> 27160 bytes 2 files changed, 1 insertion(+) create mode 100644 imgs/social.png diff --git a/.gitignore b/.gitignore index c9daf31..698ba3c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ api_key.txt test.sh *.ai +*.psd diff --git a/imgs/social.png b/imgs/social.png new file mode 100644 index 0000000000000000000000000000000000000000..c20a31f8b7000be5e6e174a108ed50206767224c GIT binary patch literal 27160 zcmd?QXH-;MvnaZns6<7{NCpK7P0m3jN|G!&b%W$4XJ}MV6eZ^*S%M%@GL0xXC_yAi zqeM|akeu#p_qX@??i=Tvd&YZjyg!f8j9$IgoK-a|&8nKUqV8y`l9MoyKoCT(uBN01 zL4@EE4}A^~d}+qr+y!6fQEDb$5JY+j_YZ^8GwHxRdPjr1-gmV$rS05Z1#A%Rwnzbg zR}>fxL9z<|C>uLxq&KTA(!tS9j(wxKot@PYA;)ekrUlnR-9p}TR15S(>IZ5Y*abS< zNg>!3Ov_6cQ2?mf(j=NsEX{!$nyC^~VnIc_Qqk z^^{cpg$?|YW54I^jgl4=^z-u*@DmYm_jC{xl9G}VgbND_3-f~!{9XZW-ZuXHZeARJ zLr_9`*?BsmydB-$SaA?-Y~6jl<=6qOe=Wil^$%D#uYWNLuuRb31|=vY0LLxr&p?FT zKjTn7o-TioBkTl`E=X6To3|GjEA-D;)IE1^cdvWy{{`rO9{+C$0CTmp{=xB|(&Fm+ z4+<}DWnZw2e=+1g9qnZhfI#Cpxx(GB75=f#7=_OA&@B^z&~96J!X2tQmH$lCyj zTvS+ESco4E1P}jfsFpjz(LUfm9V!VF8#g3BK!!Ou|N-UtC-i$!{xcFT^iqitCjJ)5hUn zS1yk7e}jj^?QD?Zz_9FX#qId*>_sK{rR>DSz)xWjdns|as3byERuE@bU=r(JSAPK# z{O>UW1c1+KjyMVe{)JZ`>G2N*tbY_-+QtrNxN_`vIHf}(*#C9g@jsEz|A-U+n(ucH z34s1L%J>&{FL!%yKO0Zv4F@30|D&=C{#V3%+4%nVq>GA4ib~i@N%9LLM8)~-M1eBc zNC-*tOCaq;?d`z>aY?(sm;RrU{_n=|e~0vcvBmD5jhh1!>;r=A|K(!r+}(VUp8qBb zl#QniaQ{e8FFAI5Pj^>V8x+dL(ar`ZI6+@G#J_y%KkC5h?aulihWKCNK_ERH|BY?` zj^!T`SpQ$d_kR@9|IGgX;{N}KLi%HTe_4*;|JA7e`mOXACslB=`Q!Jc|1Vyj{JP@pXi^a(!hP@K!9e&1L0D1( zYuq9zLyPwC}DB1T8S*!6At1d~dW~n$%CvuURJCBDc8&e|VcnTp%;A z*k(xPpFQ!+Rh4cotWg~@PxP`F5y2`&K~Mt~kULg&^eJ+ktfVxyky_X4oNp zL`}iu)%Vqi)1)vujh-|O&)vMtCf2Lci@yogKinXPHm?Jm7}`FKf_lBB;rK>sJ+W_| z6ICoqH}%YT>XK5w zg?UQ6w-I*vkJTJvm?XK6VtR8Es5B%k=piT#BMO7C>dFDt-r;;%f*PfTsk=)&@O%UN z#J<7)_tlFl^p2~s$rMsP9jn!V90Jo9FvwERlD&Vepi$dt`LSmc9n1Iil-8dkBW%Ra zHKx3q00CW55E-|>g zG#eyOs0T!i7Gj;^V#`g~os-psxsIOqH4`JPFd;#~+Yl+moQ-#%`X#?p?-aK?# zaMpg>zO4ultwW7N9|T!a ze3tTBn#{g@5v+PRDh7j&pHKrG*nRlGQ~!aB-=-rpple4Cj3& z;jMSwOxQ9QxTrjvE;rm-(+xPakn%TAeGEa>ku>)p%vfnQmtRHPBB^rzG(C%MyW)4+ zo=J_ZndWM{_5!V9QaorMx{iU+CDrAo^{tBRqShO`}RS)YP zG`(0{+0!Ucyaqx3&*r^>Z+E}jdY8FP`8H`*1^xxc@}xtCfM0S4;~6-6AcrtA=K$k$ z4U+pE+*6tw0pQ?=MGL!z)xIUizo`S74OblSp=d(>4-lI1$-{+kEzfPwkDoV4X=MV9 z+Rj=sB{#gUK+psSAhp7Moc&y_D(_Z9RdH>boE^PRz~KN7Nll0qoF?hrh5jKN^+*>A29!C+UFwByy~@lQ#4nH2<3 zYzSZ*+6pi&ry*jy0uu5*7;|;%4L&$3{*jwHIu1Ln7_H4_{sx$~4aKc-t_UT{Po;E;t zFgL(%r3`<`>Bw$*#J@gLA@~LQ6_eY=)?oe8AJGramxB@NSI(Z~wT}*+ARaGS2); zlyFd9%@hId!*{Ko&9?1^h*|}shV6k8qyo7x6XoZ@RxfwQDB_6IJSs$^xphh zJO_Ew0`-g42Y%IfT|XD64POd)0uW{C`fPJSpR_Y@LhTX7fq33L(f=SLY19zP_S1im znDVmyK$X;Z1rTIq?kWpKTVnPU2*rdJU|~f4EEK;8^^<)8$y?S~7@5LblJ#q~ZK0=HY8! z;77c=84liB6j)*CfnZx7{ZTateI7V+bc$?)iCi%0BrR$rF91h$L;z0cbP71QUAH94 znkQr|2%xy{CR^P(-1zwDJ>a!4_=!CZ8+WEZf#sv;Uh-Z2`~FYdeFF(Wza|RExQs7F z;h>zC-y8hEq^@ecIaMuo26h@tbug3Vq#<$?3X|X+NGN(4c=q~=hO`9+*(esz0;52W=7nQW_?T-8fG0nD3YfoGpzafLTDeyJNS^#y%y1g)suFw^Atg zPyjcXKqND>QsMKx!UsIjD0S#%k-JGm1Q`P#gkE#8C}Ezuc}Un&99Vz6eyi^T@Olsm zANX!mikQY&u{%IxS@-hx$N>$(dV#P-@UIdKb zcj8@SWHFY;7r};PFpT48^k5*Y^gs=Sp|(%#-3Yl!$^h8OdTV|5g`1f&Ai@vF^lg&u z1xoo6Y9+7@DXPeMmYG(?l953IH-R!dBE;W1qI6#5!p$2^jPG98AFl!9piM>`jq!S0 z<40q`OWlgkNf@?*ay}GM%K#lzRKh7)`J?)mi$30Jc#Y-PtWL2BrZ}Gh%C&Gv@}7SF zRDJSq(uFpY(FI0I&n_8AGG^iMYi^s}HGn}C6W~ksFuF4E$zAILP zP?%cVgF}2iV%Vu?Kgs0h74M4>)?Kp=Vx7JZJD80rdy6yBSRde>#to!_rtH%J_E-PZ z@GEPi)~1DF&Np$-`QJ&x`3-2F8u#q`?s&CR+^8~y()MTz{&s^JOGg8t?z3gK<3W?v zuWyHZwSOK$bX*ab9PCsUyhp!e4aK?wC#IO3c)4eS`3}PYExKokyUvZi69yp|aUgGu zE;v)(Q)UV##7Z!?>JMhGEq@lz!c5KLxwt6 z{?_MEg_v`C@ToQtG1P+#pfz8`;~n(1YNBA~bLoXn`W&|iAjElqs3=x%E9uDK#yjA_ z8a{KpDWOM#HA1H#H$wB&y1p`%jj6i=ahxYy@LQiCn+2mV#6U1`!%~NS{0y~rNJYY( zyOR(?;NyTP!C7Nw%N(Ptp{}Lpbxyy6g#l{*B6|qV#oQL56#{kLhzee`Od5`ZLGUC1 zCpKV5?EBJU`2s|j11KDDCA$K_BXAFFfOmRpp=krte3xEW+V~ts02Pq{9Kt{J%?#DU z0kb#DRW}yaMWIw)99Ie=P3zjS#~GnZ#)*PCMHd;MA|l*yZb81BxvpAj4C0kZsgZy! z9EKhMW~108>n$=k3<-Y|c~jQ%8h}$A0*b6?&sQEls8#+M>WK!9``sWJ4HP+SgL62;sh%lEM{T`HF^JzK<^-xFh*N=)p=tr+i@{$J}LWnR1xLwU? zhgP93Q-A>Sgn?KO?vaZQ-ZCQ6gY?UCjl{+_bIBoLbO0lyIU~m?DsV~|OPDj&=Xe*2 zg#m(7Uu;n|+KD*}L)A7aX)|q4V8jsjQ$W_GclXKAE=?)Pm!MSK4x;%kFQAmC&xs8E z<2>PFF8{y`WUWW10<)e;jMw=B{7S6r+V}Ap5+W8TRT7Mko<2l6ebHQc0aa^7$qr0N zfP?{eTjxV8v4n^}9;$1^X`PuE9c4#B41M$JzinuWGqKP(+o+p)vnV()Apyk#Y_DtryNIdYUg~n8$ws{3dFv; zZsG&Owm81`)W`3<2u0)UrR#e|9WNaU@bbdNxaJ9-TYlhjlL1GUx<|N+n{6v0+6<%? zT`ELe5FHEdey@eIA=>T|)X>|?Xb|gh9_o4kxRY-OY>||Dxqrz%k{hBU#*JJb65~6= zL*=_Ve?CtJeZ!fC?q#LBr-WF&_k`7L*)S5QtM5WZ4FUS%Y};*8k9`s7%~ZWgYgM=H zO=8Hd1B67;oR<^Lj9xe4VOn`_Bgfezc_2ER!A2uAYMwmI6u^U2YF)437J}0pi2~

Sq{+{FP;1-xJ*EF6{GhAY?k+6t@*$?nFq|R=qA=E{ly6 zQUNPpnV>ejYJ20k%a9GV_d#HN{|9Po!9=9MB1v z#>y`2oSrU`kj9SAtj<;j981R~8Ca6*G*MuWF@`~Dwf0em@15U%Ac9zIL2#_3WW;Zq zMW9%bX2dsMLq7w?0#Wx2IO>@UFi`?kR_kMBp04I27*B|ZLJpDF3iB5T7UZSy9p8id$S@zK$GIcJp~ zAizSCrAldujlGOypw8;QEeIhLrxJHZciZxJPwjR~v;`<&v7~@|vV3&0@3+UQ2}^TT zv;=Kb1tHC(Hnz!Wx4PQNqnOFwT96uGlmIFII-HzZx^+%f^@ui-*9rJg^|hpA{O+H# zsy{4L%m1Vh7)jhXl~5%H=kY$}sS&62Oc=%{nd_0x)W(%+zbo~JkFr1p*QFA2+P?LZ z0$mpIpxQHTw6e4OL^uiRf0Q{awozUYKS8_voH52`;Sl%Clzth#U8)DyihW7GtH;~IE`IzL*1^E zVZ}%uu6~-ANYdX1rgPJ7t>d;oWt_~I(g-oQ{nXq+CC${T@|9Il-xD?720qt5Vu?iG z%&OqD>9sMz&9#-o6yfiDH#?bK~j;DlXvlz{Goz@Y2LT+vOmhBjo z`Rr0j(V?3^;E`ka$t;WnKZ;8@)_L``Hn>O%$WWRFO~1NzRXB{LqzG}!XK0l#rffJ) z7V4w8RF_k4HS5~y*K^wgB?|e0ssZZDZ`(R#V||tGb!#aKcJ_F2q)x_;{Zk)os;lYb zzC<#0NzqHE=T4-{JXx=n6jjK(kwIlUeQs;Pw4`q#Cg5VQbhrXe6SDEs1*9>zz}l5s ztI)YX*EeD-AEtSz;*q4aOD{_+KW@Dp8iN)}LsWmJ_?htkOxC(UguMW4kC*@-)MI?7 zd0*uvEogq2y*!GFN@y&B6Sm1ZTVdU~t)Zb@j+kSy<8{n4JE-_MqmnE?v*#`G%IJ z>A+udHK4ku2knC>OEFnfP}i^Ah>@X|wR`xR#7L3sUd7Ju>1>m8U_a|JeI->&GpG*> z?Zp(NCA+xSWl!2zt>j*3P!tF8f@Wi%r_WxX>mvKQ)qBI|nbqw_<;Iln&l3WMI7OFs znNHE8d#han&SFm%eAfn)btuk3vcOKQNd~hkK$QN>jYVT2n%Nkh%KD@>g%8Pu?-o1U-Nuk`Ir==yAnQsXVyO`rJ!*r%#XD z_Fe1w6+%A-ugbk){w*tZKawxKGCj}K&fxlxUlRkySyRJu&Q9*2Xi{PUq}rZ@fX74x zva!xL-?#0BBf81SyB3DSV&wArDXp~3ld?Ex?s|>;EaA5dQKSHAnSp-Rr^|+g5y856 zD!Z#!&~w^g zBdK@-w)nRr{9e`K>VUElU>cLt(#zr5+~E>y%jdeE>yLMagG0WLFC*oU&7!Klwt z+zYS)1(BKMS2Tdoj0Zv>dBPHcnfYdQcaH|H1maQ)>_zvwyK@0gD&7r@ik4)Q0a5B3 zXbI+C#BZ>Lb1Q^)%v9xUxc!M-;PGFB4`#$$dHUW8c6~P}KACIJ&@RlX;FvH>E(2cT ziPN^j^*s1yc(U(N&~Q4_b3$tZfK8&-Ep4~QNG>PBD%wPt>ug76)yrZ)zNWZAk-@pH z=w-cs8wnlIJxTuT#GDpH8;H&5@K6?D=7g^4OXk_4iHX;*AO1QxtywB-cD&)Oa*b7^ z6wGsqc5=Ck9tJ-4Y;=^55Wj(9XC;i@6R7KYbzs!)N|p*PBi&5zy!!L(;KAi>t!~HL zGzO(hFF%0<;N2zZeDp;IaWX2hI^O_FKPYmbF8xl+FT2;pBu!~9Z7=w4(^h(H)dW#1 z6$q7zsn!*ao5Hc)Vv007WS`HLjaNIb9>@|a0wtpmj_&Z zE?_FSEMh-{W9#k69k8p6k2pQc$HtXqhjbqvlyOTC;-4ZUEg*;(6c($Fq6^0nR+>h0 zFIqbJIiwI^XWBKB*?pRufioim=W;`&ax`@hk6*>drD21)Lu8=!XW*0(S%JS5D5Wj% z(d8f(Iem{$Bw~tqH*6)A6PnSP<7NJrIVsnb(nmA)T#>`yojYL<`AtUJfo=yLIc)Ot z%aA3CPF$fys-t!x=2W_u>Pc84&X$1Tl9q`^UR;1i<5^@=LPIEB`Oq;d&m_)*KqM1O zo*w_`&38&SA<227wCbbRJ4V+psj@_IfjBFuTYjx@Z$LlGcPg=(o!VN0T2@1Ugl?Q< z8*wHyZO=uwN&LkWEeMLcGAtq>DL7(J__FZhdixVD#PSX2&MXCW8F(iDV;ldDCEW9rH>dvnTMVUCU9S*YZnS?a;g|j z&zm})%oL#9X#8ws>p_B@uTswX;eDWZ=D*)D z+B-;$Dw(UYb6p*p22qmbXGdlQhvE@Eqk{Xe;(k1pOK`-X-YdTk@{_$-q6NNP2w!Tg zE#vo*xTp5@A|+ui;+UG_r@EZ_)klx(jvf~#ju`;$`gD2x^K+QQs2HdlsF=hZlu0yT z$$PX2tXYX2Z_9_JRON<$x}}+P(p?S?BiON5>iK^b|J)s28nzU2_+xxRrQ=38+z=Q{nbq1xOsqW}V(-Fa<582|$VL~^uW_N331|0lS2`@TEJ89{< zs@Kuv-Cz*#($64%JiQo`cvL_EdV+(>fS)HJb*rXyxh90)S&cU-GT&Y3DqwVn9Fu~HW z?cw8+agVOR)sUqJJ#?e-LvBIt%{#}<_Wiof)_1qwmR`%rB^$cVulKBOs-n|KR#`+e zmIGuBo=PThhY7<(_8v`SMPK?iGJY1Pk=ow=P0`bF=~G$rz|W)d3i;^|h2@W5y+!Hi zwgH_moq7eF5LgFD@?%MPZ;$5$e@ZnP;Ji4w*||K}kvgi(IzisOxMC6nLbj2krL?E@ zj_QuN!jhkvwRgC{a=VpZ3eM;!6K?mf zKHWWfR8H%g?pplQe?(x&IPL-mb2Tp&s5m)83W39t^q|MD&zL ztS2sB*8459wwfcGS%eVReV9q(-RTLN z9m-#F7dAn`4l74p2sm}=+ETnGVzzQlc-Tj1{z2I!yG6+EY5u3DGJ_%AKm2d@X&7AV zK}Ttl5RE-io?7RiS-y#%eG4LzEh<;T;V+EPT#9vd)Nea-nOY#Y=dU`9Zaqug`KrA= zMku3@*QY@z6(^L7Hf_5TwDE#k2UM)lzrZGCsh3)OI_Q8mn%3EI{wT)8z3#&q*+!MC z)C979SJegx3P#$Dein+EQlUJHV}o=bvh9WO#)dCs`$AuPI!KF6k}#p@w4Bg z?lK`Ar|s?9X9{!L>$3Mg_QgbB6EqClFH!tc&FzYY$oy}?S{D{H(Jw*4ZWQ z&0gBs{B-XgW!2^AUa%qNOm~rwp^4#zL^JCZK8MMRO{0dGjooS(os^UH=hJ4Zg46k4 z@B1~uLQ;&3J3-=`ZA3HAA+m<4Ddgb;v;91>M?O1~#R4DBqRs1D$BzZ))U#XPZ7?Nl zRcUoi6%JIuj7J&Y9Gijd02T64YDz+WD4Sh!<7ddHw)|Q}j&AbzKYkt!q>X}Dm4Hsu z+|IyV2I;f&ONbD~6X}mB?9&*NU?y3S%}0f|x0l2IP zbdXRZ(abf$^3aWW>l+Uzu4d9|^voxK@m8PNW7^|SKa%nklZHQ9j2PdLzdS&?O+`GT z=03Bvky!zX9->@x{@3ovJ*B;BZnJlBO>U?sVwg$B*=nUqDwO4t(S^7Gk@4mue(7A; z8yf_%`EqW?Gp_9b@p&3xi8;PMB+gEI6Saanl=#ys<$|ww-^Huwm^ArVyNcf=O*KGycAo{7aj72E?ijJuPY9xBUol2J^Lt$5|4TzR_Nm zv#zIyTIsBCkDTVwREY#RE%Z~c7r(jo_+_O6-MJ6^gc6gZU0Z_3>l5xpb5fWG=<_6W zTRX(~nNH^$h+%Xn!or3AJqDz53+uc<&~(~f=Y~sMSTL{8F;jE6&<&(A2wTYCGcu!y zTWz-6eL#Tcxff`se`)$5R-jmLO2^#+pOZD23s?i=_Z{?&#~n(EDc7c#ZcAaPfn&{l zgJ|tu<#_B|P5aV@YHmp*x?Dj@j)IuSDM`t%A|*zfAUB z+mQ>VeoMf^6*J3njRzY-DG5wLQk~~ut2O+stmPwARvX*Vz6l;2l@u1rGd|vJZ>@R9 zCi`%!HF%2%mlkK%y7H6jqDop_X-0#w3{eHaXHpEgLLN_-ou@xlubxLyiMV5gNO|jG zT)*<4OPT54ryEl02tQ5GTl%CRYjo(GrhOd~r>M-`V zV^$)+?(P~L8Vm7&EqhRJc9jLJ-3_MFBC=kei-=P;PDsg@aFS;XYbvEs-xAv`$T4Zm}@ciSafm1rQN#MP|` z3BU~Whw~U*(4}ACA|3I@HznOavuf z_dZw!2!>QARPtgHtqJK;d1Gd1tbfs3dK_nt%V2(ANqzCj>N)mi4K;Ew^}U;|9^+a}3xdARG~5BgI=zToAMg|ePk3ob+d51OuK1#rH2y)UFv%- zaJ&U8|Gv}wBK1>3ZvJcpAzd0R{9%ZpqCGu(^n{{)VoK>Vt(HQpP|%d7B>`rED_+|e z%~V&_>+h@jL~BX0=rtZ0VnB`&PdetZ?EC71x(DPKMWVa!E@_fmB!H;;4STH6z^Cwm zm)8uPQ>uZnwmeU_4jg<(z7j}@!4T_vQ$1Jz_NyrXB}IDvdaU? zYkGoSJgg#bZ&>1|-b{~g{#1h^L_jdQ)bg)*b-CewR4oqfG7~H?di@I?O?V4U#t-MZn^a5zq~sb*5{{-{TghjTeM_wZ}bT$2@=xrdrtjW9Vm$ zCOwQ+$GVbf&Xm4a5z1)8-T zxA~T|d52qGpqD!X{$S*0h)t4<6V=7l?=^c@#P;gbh+{Gw+tmC`Ji;0JDWRUn(?&pH zqwEeTH1GUmdga7T?!H+dmw6`ZsC?kG#`~>EB_HnowaUS?YHG&C#Z8=wM+!ACneJp);<@FKz5B^WM-GqeREvaxXl}`hb=h`LwpSnEv=`Ind`Cw%56A zu^n=)xoFXeRnQ;gs&VA#<=))5{CIM5@W&^SbC{lLGh+tVVk&TU;!h>wZ_R$2#9;d- zGmHPo$I&GWeASQLTdTf;Vy2nxLV9)0TvGgsxtz3d*owW>9P+2D$X;!l>ToK}+4~vS zd0B0)n?_<2^jw6!Uv5MaSb>)pe`>Q}7OanL+uq5lNkY;&ojbnpQJ6|v zQ^+%qBL+LT{hRuXps4};?g1rU(lh&Lof}GnS-JjPtQm>%&$PNK=MYMNDsIskMGHkL z*;o7xNn!q(i9MgjySm>Hh&^gDCuMiCXsxRFqL$&g+0giA5b(<6z$2!R)O)D?=B}%Y zX!cZg^=DpK^rZxU>luc;Ku5NkEB+%9%tz+5qlF&l=(Zx7ZHy9YHrrVztJ$#l*PZhFf_MlM^<1Zy<5FW6=mc>tIV0U4g*6PCZjiELVrScF&N(+e zk2*(!X7h4v+PNzK|s{ukE{-v38K&~ zz5CR;E>5L812F`RsyrrEl?ts{`LEF))?-9n4!7__E^U@3`?`(NU*g*Od@@hS+%oAC z7`zRC|He-W$(O#*Ep@x}@hhh^&bB|#)Chg1 z+u789RP^%H!77T+0z0p8-*}(|bdn^xppuy`&u)l_ThhfU7sy@vRPWoa};wC zt@;L)9XhN9D=tede=ECF$xPvHwtS%QxL<6HN*3Ev*PogR;f{N|`aU2R*_Wg@OFOR) zD8&=4=svvl{psF9Pn62-UVO9rF<+=hJiiTpyRGFzKq=`yZaZroh!+hCA9Q7fq`zC> zm(=~Kmla~(cZ(DDJ@Nc5)L!y&f20+G<Wj||n`yIfP`JV@$wz}D_;VI81-2CLz_9IL#2PddWvA>PQlXXcpC z7trBCCT+1%6tdCe7|@6#9=m;nV40;EsJb#lVQM~TtlQ8}GPFw26$z0=3t0D5GuQ+6 zt%n{N6fb&HS0vLKU8h|>70ISG0jGfdD9^SN8*F4-!Ou^ zBWJSdNl%YGqtvtt+e)IOwh%n;$uX!bG+RH-W(|P~=qXj1Fz99^WUk*kcQTxRw|PJ{ zZPPB}{=v+OxRh8@;Ejjvw;CvD_3`b%$+$``k0Ulv&ff?eHcBZ&%C9!2J+pQRJwN4i)HvTqU? zCOU%C<&gUtVq=GHiuhemFEY^)ZczEBAl03THDI9ECQ-rNYqnYzo8Z+hToHBZ(C}GL z+!dA&`cpX4Eb|7_hwShwon%}ox*ff)M7g_r4U(1xp6!G>C~?rTcD%ROnJA*JaVMoa zFA`+UsZn+iPeM5z^zd|9cRxVP{aMaX+fd^1M*RxTXSZY{)Sa%%79GaEfnkZb`akU?U9w+uMWT%_qv5)@a6W zgT&@JMOET>l+KPiUfRPw3?ad%+mCLO7^ZR!R_TJA*l%p$qtDVlhI|tRO-O_lF_TGJ z5WsbVR>GLIE|mqav%gKswKEXYzs|F;LGtAS{Glrb^Nj8-0}LhS<8>fQP5nFY6 zkL4M9+FZfl0*yVM9f)yS3f(Gvf0L=Q;Z1a0W@%_!G3V~yEIsKSF<+OiK4iF6m3oz( zef~n&MZ32|*8ZfUbXXPOp?5&~@uhC>+%Lb&57Q{Ci2eEcp42vqqzZRvq;^3PZ|_l< zt171@v)JgJ)2UWAojQ-<5b`!@LYK@VdoKg+|JEbwuN|s1h)wmw2JRDp(K~#D_WDdM zCEuc@-~*L@oIZwu*H~r0v9Llh%64N|V*KGW1&y^IxB?aGN*ft$;>NcNEzW|#VMU%U z$J`zffTyF>#y!e-WgqvF;f_qO(xndDLuliVXR^F_o2olxuU|_&L5`c3km%S7%trD@Ur7+fY&*YM*av)JV~(>foAq@S#q z7dSgl&GsOc67L65~@VKRF&@cJ}x0xh@Mcj zsAH73KW*eskI2MV0zQ8nr_*)&MnjZ0&>?M4X;$I}vMaO%=Oyqd?QY{AiwpP?SLh{H zeqJXOyq!_q&M_D(U%jQ5y?%YSzIeYQx;!@-Bx`0kEb3<$bfi&)95Se+$x$);hnsn~ zx<`L;D$MFGs9vVrf3(Y-i?qH>uA9X|*5bD7{VMG7AO(i{w=!g$CYCiTyjehVnA6RA z8P$Y0p~m_1*46#N=z?ojhQmwGpkX^kIPUBSm6SH>e+{c1)Clt@yALycAvhg2pjpE$ znipyMAcxdbQJMY{BbHZ|3fJ$lnU}CUmi4o>5)EndnMSdWP?lSI8ysWp(hf}>EvH85Gw6U;Dz{ecTQ^y7BHP>R7aCjwql)&mNh()Y-)Q?(XLxB6*|uyc zDecx4`X9xV$DKMXkZ=jNDrGglE1bh1`Fvr<28mlr7@UDNlg?_wl$A{H(bL80>472u zMVisTZ=#0#%dm#~rw;xXL4-3g=~}%WP|@G?q4N zj+P%k-{}carU0ymvq%D?N-zF~9j{&2^o2h=mOtou!T!hR{o!^cJLIPpbBuKLG1=a|3vbfdRukJja?{ga* zJ%;ZI!C25RgrVjll)bnazpKA$IDZx@_IY}U2&)Uawc@;a{miV|t6x?&+mmMSBCaC*lRzP$yfb&F~=hs-Ot)`PcH%TvevrT&aj-FId>c^;k zFO5b$jz!NHT)1dSk0AziH-Uaik&SSN-;|Tx!)e;a^R7B=Npy6(AH6qcPeOkjGN*Li z!>m%FOWu;eH*uSb2{;qoxaX+jk+H`4o@#g4^0|zKa`N5e7Qfi+16|QiBWKZ>Ng$vI zeNe^Rz(=Jg9*4)=L4=L=cd+t&&z|4Ly=N8i>dI;d-M4AAC8HIth!(=w8ur>f{C3dg zhcaQ_Ao5q@401EHghFfo_K-}85_I1F%HJ$N6T7Y-O%tM*})1e$<9bYoFeQo4CV{`p(RT_$xQ zZ-)HaLNyM!u9)I2t!XSxs@LMo6lM`SW zWIhMCf0>`__*pzU{8LTR zB7&H&M4W8*jD13=7bcJR98X#qV7-MG%oMR^u~Ic;DV$Zo-u+V{`Otliet#<@KrD$l z8@@|vG8bz5d7yCd2Tv!V+U5gvZt6BZ3n&>iL{mczR;2yyCLhNgP7d~n!wx<9(zX_Y zg_7#emK<({JP=ig(bm_q>L;>ZkOvz32=swq>4PSrO#Wnk!M2S3m^tRpRf3KIyo4Fa z!E3ag-NPSw;M`(f(Z}$g3J{i~_5@0q{7v$9Hu9VA5zl%}Z)rAcO-6@8;lSv4s4lmz z|9;b&0z+7As9EDR=K%&Ma-uM3lN$6R`QLI@oifvillo>Gv(xHe+aAc#7O0LI9KmFg zq|{S&UD|z)JKl_e!gWEo3ZBRF#jUiQHR9SuB zwsOZWhSE!As$n3r$S|=f)Px0!)dlSho6t1qZM!?^6;VSw2tLL2SD%p9Mw;eViNC(r z*15OxLpt;DRHSO2;0oTiQOqx62&)kJdWR4)-`H>T<{QdwTOX0IZmXIOw)11ZZ18lM z@!3bkTdu4M@#B}04j=uv3$oVS7Z-%Rr3okbh`0W;dnacRV!hWbt!-$^0 zULyL69fJh1O?52~jQLyx$kMOJ*{**z1h)C})57$tUUV+akVvutqmQ8qGD5!Vnv1FD zvCH9yC~pn3@9zTI9w1aOcQi`rf6a3^5>a9$Bne0x_|mF5K#)AIQY<|hJubzXRJ~Vs z6?~LA74nvbK3u=OLqGbvnw_61{zdN18%b(YzY4DCe6|SrbRbYuGc7&t$bE1e=lFDq zzN7b57yg%c&B+#3H09>OrG|lpZ`WqNdtYrIG8egALwQA~rf!<&neJiEyx`xq7Wvi4 z@ggZ`Th?eDFh@u0viCcYWsJl3doR$g!rF!EQbZwU+bt)wna`exKC!U<7rxd8^a15@ zggV70nL2Xp3ZT{vW-5e>mvcxb+n5ec;53mVi|VfBK=bExduI6SCKpTX(JaF_jUF^ zqGrAt;sv9r0bIJ-8>m82+C?aB^bVtU69ESH&suC-7_lk?rfAJx(y}IAz*5z}9}xve zV3OF`DvF7O?N;xjyWSDEz2hX_zpw#Xd{5bSq0VRCLu)YMhub;xX1F;Y&k>k^Qb0_L z&#BH!!@3+Ek01A7VpqM-V|*UsJqc$>ZCNpYKu);% zDx59B`1~e_pu+njZR^#;F3hNo7O=i8zmm!~6c*{8M)SxTW(-o}>w&~-7*u|>ZI_dE zHA6ngF?57lVe(JZsZq+5?tlf37wyF0JW15jEb&+~TpaKf37LN!9cILHGr-k19|3Y5 zaQB5>Y&1XzvjmtlQobq;X3>*_W47+5BYsPE%%i)8P{qpnGV8qt-EqxzJRopH!Uumj?cQMX}Y3g;1AvNFskN1go-_kIcFT^WjS7G@D4sE zkJjN>R_L4)*i9YS4Ue(Sqckt9$q;92(8b*O*yv&k>r&+@sYK$#gP%o_{}sl1rL0^6 zY4ays5zFC5q3(s;Gy1l!cSH@~O^=4YMvdTW5gM=VGKn@&($P^4g%PEG{?l`1EEN>> zz;|Bnz(!f*DqLV^1|plYv&A>>ykKJ{i+YcJEk{@5nD#*C)ho(%`Al$<0A9Yjy^}V& zl8&w<@A}bU1LR!>e46>%55l&jw}r|4=aQ*~-0QE^B8w zfZdAbI!INteYfh-L4^2D`d**G$<&*&%JaMwUg!;>LRcs`%xW-lc$0R!<{q@y^Sw%@YW1Y_Uu#6_AilcPbB7=lX@1$NRO zbc&|D{mI-Yr$ALSe5s*tCQU`1ZIp3;7W>+#Bn4j!y@n+RZzO#b36_YMPNH#&nNi^o zMNvz0KsF5cGvK|ehPK_&7AY*OEG5!NkX*`w5X=5d7bjVe3L_q)q?u4xRJA!>Wxje- zV^-utRKN6Ymuy?qHo-tEkzw*$W-uv}R2(9n(wr7>cPHz+=2d+hxDNE;)Psn)3mM_C z=k0h(O7T3PLmnvd8hA5k!eO$OvO|Qo?|0>l)k~qg&b{xG5ZU9}9BnhE#q%@JC>J(z zO1lUI{d8sT$HRwbOfbCgV-PF)7`i}2sTha@)M+HVHzh%FqPOYr!$}4RZ1GS7@!!!y zEkxFM_|ZMs7w51l+SxkbsQ>ufQ>V@7>HpQrmq$bWzJI?FlC2fllQr9@WXn=~?3q3k zWfwx$?6OS>71=}CQkG=j*O(|v)(A0{u|z|ReP5nydY42*%vs0?(9T7g;ZmLE zYfhU$(d2dc22_C|6s}v|F>AEp7|63tV9|zVw^vB7ZqXxuvl%qQu(~$!R`E z9{z-M2VMe{r-qbdaKpy(JC~@dNP{hu;2b}ZC5E*H-(J0DH~-Q|2DS6YLi&RwHLa`! zDDNk?qL4x;cwA?$*VLx5MPZ^zz!6m@TE4EHGAGDWFT1_jAlBd9`;<++$!>8Csdn(J zR>;3IWsH7X9`v1)CHPz;j+~{fK4Lm$o(Hsu_D$Z5`W>YSw%V!4hKq6968Q5{aOULq zwp_k#gp=j0Xb)B}BIO2s^Kbqqm5vS!hXiJ=cWxB04s9ASC2|!j!TVft?KF2tEiG6< zhut7z4yN)|!d$~4VY1svSg_S{T1`jj+u%&+JuPPL`~{i~GUWX|)+6B&`?0NO=h+$$ zw{tU%4AjV}s8!CZ{TOr|k>TbkNg^CWQNd}CJ9T8{Bu#w|kDAK$xz9&vL+L@F*Y=o+;%2JV9*AR)?WG1=k2zB-T!6SqHp|5_<*7oLH zPV>fV0I#iaP}VfFqV}AejaK%99%knvSHa+!YkP8ON}G^J`S1k~2UVWl+jQ36?MMmk zFO}h;9V@MpRaaEx=BZ8mfLJ!YU_$Zl%Eq+CanM0pp8@K9Lb8@%1Us$nD?i_4j%;?=nJ^#F4i^N*m=`Sw&<96yC=T~cXI^rv)$0}4> za^l)V&0T~uGg5)e|H#Bx3DBZcfe?9PqiJ`_p+e`3(v`R~c1HS7EAx)FoZP67u+lPG z!53SFzsKV*_Lov@pRjgYruB244e&f9w*(#3Jh!wwjW7Dj@p0*ux_Z9hNyBnpE5lyT zi~YUvwvK4e%~C-+1N@$ik_uI5zH$p85EAS~!Ne?Btmu%3ba9T%r29Dxh5HSrPDYV8 zT;5w(Wc<(VUkh3z=ol{Ic|ozBfZL)gSi&C{L;TDV%8~yNQpVYhiFy_z<>v~$un+9e zWo3Mk$=aDWvdmgPzR>lbx$IOzW!0hpx}*6q2tw1c8^JB1<8I$;S27+R*nq5=)~p%z zt9D#h<417uBjeF5FJhlYgRKR|UySkDbNB}OSR6!qYSq(z4;Ui_ggU|HrldF>j3G~p zUBV9_r@hh2y+VS!Nvkz|d9vowR$M-NAZ0is90jC#ZMG;@$e2y>ir^o`#rz&oa(BX~ z8%>Y!tp-sMre<~7`@%ZDMcPWbk%N#(ca%(Uf9%=eBr1>J8_ zy;_Fr4$kG4%MT5wN_$`ZdgE2=Gi%9fna~^NGJNp9?ciL*FY4w{n2SsDy$8Gb=fz4n z{mTg$w}utGMTUA)9URdNbeHU!zDOLU;8|%-P3+@C#w?He+hL^_i0ba^Z~8Q)kI}NE zVbWROrH9zIGRb)IlQz&!E0w4zXTp57xu-wo0Xb@~Ah#RHg;&rsuY-uZxwGO|r+o45 z6}Qt&sE7TfFXx7uK?RDhCFVP}#czE1-Y4W#^5u?5GV@WYFEg|XdkdZN5}f4bSB{0W@}@ha+EOLt~OipFgN*AslG;E(rNZ(n-pdu7IJGYM8Yu%Uu$%V;YJjm$Uh zAk`%O9Qv_bssVyu2lyc7lcqk3;N_LP&r=^S;VH5Hhc~`x(~H+oE@oHmWbu)4mwi5# zo5D=cVnpupQy6*=NsR{lPMZ_nM5SvQ=Q_QWHdL-Z_!YDCjnASzrb4fcaZz_}Q7WZ? zcBshpq4eonBnHay!Vdc zArKIH_bzf}$jjOYMXM3TE_BQ$o%dTHEGVm?vq{bj3T&f>j~m(nx3j1I>{hM>)~ZfwS%7YZZ~968X=CWr^#Yh zR=OsP^i|2J!myaIBXo9ov{wcw9gSplvJHn%x*|(&WlNP=D<J?>t44hh7y($)!M)iWX zE``d?;_b8ex``~FP>jM1VF2ClMX7P8=c7Nq@SyPY!9K$^J4-b?E*BiRWK$jN(2Mry zHOAtyNmVjsc^9|G0O7#kTg%t%@2sQ>lRLZ@7bZODMaU^QPoZx4JASCYVx={)T$(db zp`zuxGLl)==P~i3_R4g^83Jj)+sdY^E1{k6V$<>Tb=p?U;=yI0mX}cU+|XkfyI0yX zO-nOHzxSs8mVQ;{ts(nhkLaF=2~^QIWy+pWtx$;#m<8R zP?`6w*829C%gFFxG$;*r={L{Z*3}2j*6fUoer2`1uqWy`-2F+OWGEKFA357M>Rewf z;JK>FB#dE?W*z{?tG;cz>@)-JQdTwFhyNn0-v4rc$to-tv`7R*?*q|B? zO|8aqXmielHBp{mdQ2AhuV&Vnc`c@=PNuI1>rlpq9|U4N$GJ7U^PmQ{rqHU5T!EXs zcPQoH;L?8CHRLR0FfVpPfYuF`_YW+AT`#e)zl+|h=6Q|mOSEcD`mue@;9hEJulr4E*moRdo zf%P}a1*j}lCUSqj@mpNHSI}!xJw$e&9pIqSD$hLh0hh>xrPVs_o2M zFSJ6D{)`|qV(_n~X4u--)gUANX>cpVgnMI!YMrrbv-cYsuP(4LCWs}Y8|Yky>}x~D z?OsB(5LF8BQ&~N+&U6LF9k0|8rw{Kse%3VqtlRVxAyhmy^Ssi=JZ8SLOJW6S`PlorXGARdyr;c^AFaN z=`hqXet)UHWpDH@Q#4@X-Y}u&q7b`o+E2r>3I&o2RLd@x^r$v?#>V^s#PHhHr)Kro zU^lSRLeVkT{U_@1S-*Vj=g;?PhL_oGdI#pZlwH^oSG=ol@HNW}e*wt3cNcwl+{TPd z4;ufqs~?{eJ{?5~3MKIa9Jr=&+$j|)v9=Ddu1>f6XoJ=EU3k$`SG3WFqvfh8N1dDu z<92}>_p`&*ii;%Ceox8T8j?NEYFICAtpDYjIKs~d<@pIu4a8`Y;>%LBfhP=cr{wpY zA{*cEvn8!A)(a_$cSM-sWovdjVV*0*j?6#&$Gr!^X*Ro4!o9YRj)RZ}!|uLw{Ua!* z;dtp$Le1*?S24fB8okDE-Tb#%$_pQIu#qhfCW2&!D92Ql;z9pFHr}E0B7;9!l!e;` zau{BYg10g-C$Yt%gerw%N;kX{wtt<*Yr-Nu!VQgD|l;7Y-cub*teiKzma4Cxk#J^S_AztoQ=;Oi+Ulh!{}9L8h2|sNn;g=tf#3kl z{PKZ71mWQc-Zr$T=Re7^e|U`hlqpWq4=>o+jiK0jK`TA=++auCJsZ3q1hK*eFRq;` z?AfD}RyM1elYpxEz1FgfDfb5^{&yZ)(E*I3#hZ=80}V9#@JH%52D~cxpzLlnm)64! zs&^O>glqe&Fh#bU9!TOAGn9e%+7s!C^KjY#z;CS~{v6K-$GE^=V+YrQbL%JF=`n>I zvhjDyFN?EhoMHt$$pI0_AusY2~u{-QzMh=KhqK?Y~X0u^e@Uo9aKNf;L#n_iuv?PcfJu|cV z9Oe=s4qNX`^T?JNJ_*nYgBUixm<=f|;#roGzrRZgRMzubd{1gH)RT`uPPpn8x?#Js zrB=_*G!4+%R4+hF$MRxo08=1YLhro(!(*56y8b~k!A_+<|EkEC&>#rQE5~-lgPP5r z<)?kY2&u$`%mC*vy|J3G1H?iAjAJ=r*OMy(lshJxRR8b$>r;Ay7Xv5~nB1mCWT@X6 zivmVwfu7(cj9J}C!~AixI5NZ~XOpox)jM+>!nkl~*YL)OuAtEyoC=>)c@V^SwrBZ^ zSK8dKADY-x&}Jl+m_?#8IvEP4jv`3aTQhgW$ga>S_aDm z2*K!5=Dxt)*hQ-sYqZ`Wrj;vN;0BoI>Dtwn%a7e;?xI~?2LcM1%-uNbj})V4aQh{W z=j%u(izINM4p%}G9#MOb!WJZIeIhh$ea@`EX4-;j`Oo$?3#1kq;ig`COt{>XF`)&X z?~^k>AaZ$mY(@u=5n+p$GQ#8u4Lkob&tqZx?-DWF28wevKbxZ2F#^Dqg*8884{&KQ zkAZ?UTzu_Q;#zbQu_@7E;+f8@Qj>&*4)hQ>#qZso3w1iAsu!EgvD*+-dx~5hW6-V5)7ED z%HMU=xKA4Qf|f*DIRv`+4ktrLHfg6B;PgO_%5uPLf2%h-mL{8)4B=*GSBTzf=Q3f9 zFajOHZ3$XZM}v2vVOwKxu}Ok-3l`_e^#a7PHbw{s-)I$MS~(d8gyxQQXdiQvj%OYK zttLyNQ0m&ZuFqTweU^6t{A`evu;N~IFajg%3>=9S{i-uaj$m5$_Aeps;5D!vy6x1OsFkG3LeZnO)dcbX7&ka!A7Pn+<<;) z3MG9O9(E$b))VXYLeqIUkj&SPnV*rCdjLWy_PQi+$$e8SqKRp z%ax|D-!a9AEEN{iuO0f-0bW2?E3)@bq0#m~r2f>~6ioxQyCF6S)EBm(S72VrRn(`rZVTWa&);|U zoCA8HU??eo%&hOda6KOAkQ}FOD7VQd&{w8Rfw;z6w~3oA?9a|VI;qi4Fhr!oCApA$ zVRcoOZx>W1!#2@Lrj11;W=nX~H@_}oncSO}QAK5ksz{?hA3|AmL7 zFBAg+uc`sCPI9{;7rup`?Ynb~3h_p38T}y!JR-OY%$kr@F_E!gJwR0y1QmA`+;TUS zX2IJ6CaDx%a~{{#(fuE6`)#KO_sFXl0C9Dsr$D**yuhins(knDchCCDL07*R4ZWx6 zlWyaZ_&$|vf}Xhr-jgAkGe!PB;M@q&yJ+g8`EQv5|p(D;|YxbD^b#E6psLP`Lv+`0bx z(a;c?dI0r8Sx};cDq0tnn?xOpJB5!e8k?P-_{fVWseU~<;D*~Z^AGH~Ow;fe`ih%E zyDwmS^f8C1a%G|DaM?S|YB7SuCTQXc8x*%1<@S{wHYuadJ-}K1wSCFDx89DIr`wuX zK2`-XYd^DY$N5sH`Q$b@M=7V0SpmKSC*~LyIsmlN$of;cL07*rri51X^(P}ittsjM3NF9VPJ1O^P_Uyf1(X9m z@w3Hz`6e~&u{8VaQyXOHeTDo+35m!Y$_B#m)1!4CKR`{XyC{OmlXa6=pX)lO5ENqSdG9lk-R8O z?66KVPN!KbY>oaUPUgUIe413Kq+JzWD2DnZq3&V}nrY2to#ssFb_VcTQKW5Rw_ru8% zB4JUBXv^^^+v7tLpBW<71aMjjx;*8#C;Ho0lID0OqGsG>0MGTyse!Tc#a^3?Lx0DNhZbX#b1qnJ8VXD-sJou!tyJZv{DtB>PipP-`t^h32UOzw zXI>>-d`pJCRsAy-mVp~o7zw!eIl2p}3j<2Xyn827^g*`HHbC0&3t1)BycPc?yx4yzVszV||m_{RV_|c}ZLm`oXi^46MmXl!#^gm4zvr z*ad;9Q1q9`G>wv&U7E^Dx~X7X6kv?g!r|U zO#2zkZN2`o?AA7Ab1KC|D5-;lC}qU5gls)=Y_Ha8b4!SEu6*{4rRL3T&P2KM(l)9t zi{bb@!sDA!N_5;(d@%#nS~+?tZGC@7DYKqk>{)I^5t95EbmooSAKTM8t8I*j8g|hV z?>iDD<)z&oy?xh_XnImm=m$sMafCn13tRUisir4IAyCMpK)8SC)f@p02O~%o2?btk zo`Bw5%Vy+=4BSGKhg=Ys%t|=&?ZtX8&-=0-LD62VFaZ5Cd057Ts0~%DF}{|EHjIE$ z8}3n@v*&uI_RtmHo;t74+6iN;{N1WJa1vuzgeaaTifm40Nw&#U4uV18%!b5idX;BghgZ z6coXQWd?>PU1pGkBfa{;IS1)=iBehm8W-suo&p$>^ydG5^xw|?uQ#9^aDS1?;ajrU z!61>Y|MwUF>#YAQ>GSakR$kH+r9~2qFkJtWu>36daNrD*E^OTY_v@DqDWa`o8=der R9Hcun{?Sn>xNiRBe*s}V67c{4 literal 0 HcmV?d00001 From 1da18c3f68de495596db0dd0151515b94ae4dacc Mon Sep 17 00:00:00 2001 From: Stephen Leitnick Date: Thu, 9 Feb 2023 09:52:04 -0500 Subject: [PATCH 6/6] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 4 ++-- docs/cli/cli-install.md | 4 ++-- docs/lib/lib-install.md | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3aa1455..dccd413 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -651,7 +651,7 @@ dependencies = [ [[package]] name = "rbxcloud" -version = "0.2.2" +version = "0.3.0" dependencies = [ "anyhow", "base64", diff --git a/Cargo.toml b/Cargo.toml index 27e7dcf..f23f023 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rbxcloud" -version = "0.2.2" +version = "0.3.0" description = "CLI and SDK for the Roblox Open Cloud APIs" authors = ["Stephen Leitnick"] license = "MIT" diff --git a/README.md b/README.md index a11dbdd..4678055 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Possible use-cases: ### Aftman Run the `aftman add` command within your project directory. This will add `rbxcloud` to the project's `aftman.toml` file (or create one if it doesn't yet exist). ```sh -$ aftman add Sleitnick/rbxcloud@0.2.2 +$ aftman add Sleitnick/rbxcloud@0.3.0 ``` ### From Release @@ -34,7 +34,7 @@ The library built for the CLI tool is available to use directly in Rust projects To use `rbxcloud` in a Rust project, simply add `rbxcloud` to the `Cargo.toml` dependency list. ```toml [dependencies] -rbxcloud = "0.2.2" +rbxcloud = "0.3.0" ``` Alternatively, use `cargo add`. diff --git a/docs/cli/cli-install.md b/docs/cli/cli-install.md index 66bd37e..58581ff 100644 --- a/docs/cli/cli-install.md +++ b/docs/cli/cli-install.md @@ -7,7 +7,7 @@ There are a few different ways to install the `rbxcloud` CLI. ### [Aftman](https://github.com/LPGhatguy/aftman) (Preferred) Run the `aftman add` command within your project directory. This will add `rbxcloud` to the project's `aftman.toml` file (or create one if it doesn't yet exist). ```sh -$ aftman add Sleitnick/rbxcloud@0.2.2 +$ aftman add Sleitnick/rbxcloud@0.3.0 ``` Next, run `aftman install` to install `rbxcloud`. @@ -17,7 +17,7 @@ Add `rbxcloud` under the `[tools]` section of your `foreman.toml` file. ```toml # foreman.toml [tools] -rbxcloud = { github = "Sleitnick/rbxcloud", version = "0.2.2" } +rbxcloud = { github = "Sleitnick/rbxcloud", version = "0.3.0" } ``` Next, run `foreman install` to install `rbxcloud`. diff --git a/docs/lib/lib-install.md b/docs/lib/lib-install.md index f246996..1dce1e2 100644 --- a/docs/lib/lib-install.md +++ b/docs/lib/lib-install.md @@ -5,7 +5,7 @@ To use `rbxcloud` in a Rust project, simply add `rbxcloud` to the `Cargo.toml` dependency list. ```toml [dependencies] -rbxcloud = "0.2.2" +rbxcloud = "0.3.0" ``` Alternatively, use `cargo add`.