Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/merlinfuchs/activities-rs
Write Discord Activities in 100% Rust via WebAssembly
https://github.com/merlinfuchs/activities-rs
activities discord rust webassembly
Last synced: 24 days ago
JSON representation
Write Discord Activities in 100% Rust via WebAssembly
- Host: GitHub
- URL: https://github.com/merlinfuchs/activities-rs
- Owner: merlinfuchs
- License: mit
- Created: 2024-03-25T19:28:03.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2024-03-28T11:46:51.000Z (10 months ago)
- Last Synced: 2024-12-10T14:19:37.923Z (about 1 month ago)
- Topics: activities, discord, rust, webassembly
- Language: JavaScript
- Homepage: https://crates.io/crates/activity
- Size: 156 KB
- Stars: 10
- Watchers: 3
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# activities-rs
Ergonomic Rust bindings to the [Discord Embedded App SDK](https://github.com/discord/embedded-app-sdk).
## Features
- [x] Support for all commands
- [x] Support for all events
- [x] No JS required## Example Usage
```rust
use activity::*;
use std::{mem::forget, option_env};#[activity]
pub async fn start() -> Result<(), JsValue> {
console_log!("Starting activity...");let client_id = option_env!("CLIENT_ID").expect("CLIENT_ID environment variable must be set");
let sdk = DiscordSDK::new(client_id)?;
sdk.ready().await?;console_log!("Activity ready!");
authenticate_user(&sdk).await?;
let s = sdk
.subscribe(
|e: VoiceStateUpdateEvent| {
console_log!("Voice state update: {:?}", e);
Ok(())
},
SubscribeArgs::channel_id(sdk.channel_id().unwrap()),
)
.await?;// When the subscription is dropped, the event will be unsubscribed
forget(s);Ok(())
}async fn authenticate_user(sdk: &DiscordSDK) -> Result<(), JsValue> {
let res = sdk
.authorize(AuthorizeCommandArgs {
client_id: sdk.client_id(),
response_type: "code".to_string(),
state: "".to_string(),
prompt: "none".to_string(),
scope: vec![
"identify".to_string(),
"guilds".to_string(),
"rpc.voice.read".to_string(),
],
})
.await?;// The token exchange must happen through your own server. Implement this yourself!
let access_token = exchange_token(&res.code).await?;let res = sdk
.authenticate(AuthenticateCommandArgs { access_token })
.await?;console_log!("Authenticated user: {:?}", res.user);
Ok(())
}
```## Compiling an Activity
There is a build tool that makes it really easy to compile and bundle Rust activities. The finished bundle will be located in `build/activity`.
Alternatively you can also use webpack with the wasm-pack plugin. See the [webpack example](examples/webpack).
```shell
# Install the build tool
cargo install activity-build# Set env vars
export CLIENT_ID=1234567890# Run it in the directory where your `Cargo.toml` is located
activity-build --release
```