Crate bevy_discord

Source
Expand description

§Bevy Discord Plugin

GitHub License Crates.io Version CI

A very simple, bevy plugin that let you send and receive messages through bevy events.

§Installation

Add bevy-discord as your dependency:

cargo add bevy-discord --features full

§Quick Start

Basic ping-pong bot
use bevy::prelude::*;
use bevy_discord::config::DiscordBotConfig;
use bevy_discord::events::bot::BMessage;
use bevy_discord::serenity::all::*;
use bevy_discord::DiscordBotPlugin;
use serde_json::json;

fn main() {
    // Configure the bot with necessary intents
    let config = DiscordBotConfig::default()
        .token("YOUR_BOT_TOKEN_HERE".to_string())
        .gateway_intents(
            GatewayIntents::GUILD_MESSAGES
                | GatewayIntents::MESSAGE_CONTENT
                | GatewayIntents::GUILDS,
        );

    App::new()
        .add_plugins(MinimalPlugins)
        .add_plugins(bevy::log::LogPlugin {
            ..Default::default()
        })
        .add_plugins(DiscordBotPlugin::new(config))
        .add_systems(Update, handle_messages)
        .run();
}

fn handle_messages(
    mut messages: EventReader<BMessage>,
    http: Option<Res<bevy_discord::res::DiscordHttpResource>>,
) {
    for message in messages.read() {
        if let Some(http) = &http {
            // Skip messages from bots (including our own)
            if message.new_message.author.bot {
                continue;
            }

            let content = &message.new_message.content;
            let channel_id = message.new_message.channel_id;

            // Simple ping-pong command
            if content == "!ping" {
                let http = http.client();

                bevy_discord::runtime::tokio_runtime().spawn(async move {
                    let _ = http
                        .send_message(
                            channel_id,
                            vec![],
                            &json!({
                                "content": "Pong! 🏓"
                            }),
                        )
                        .await;
                });
            }
        }
    }
}

Example taken from examples/basic_bot.rs

Basic Rich-presence bot
use bevy::log::tracing_subscriber::fmt::Subscriber;
use bevy::prelude::*;
use bevy_discord::config::DiscordRichPresenceConfig;
use bevy_discord::events::rich_presence::RichPresenceReady;
use bevy_discord::res::DiscordRichPresenceRes;
use bevy_discord::{DiscordRichPresencePlugin, DiscordSet};
use discord_sdk::activity::ActivityBuilder;
use discord_sdk::OffsetDateTime;

fn main() {
    // Initialize tracing subscriber
    let subscriber = Subscriber::builder()
        .with_max_level(tracing::Level::DEBUG)
        .finish();
    tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed");

    let config = DiscordRichPresenceConfig::default()
        .app(1326097363395411968)
        .subscriptions(
            bevy_discord::discord_sdk::Subscriptions::ACTIVITY
                | bevy_discord::discord_sdk::Subscriptions::USER
                | bevy_discord::discord_sdk::Subscriptions::OVERLAY,
        );

    App::new()
        .add_plugins(MinimalPlugins)
        .add_plugins(DiscordRichPresencePlugin::new(config))
        .add_systems(Update, rich_presence_ready.after(DiscordSet))
        .run();
}

fn rich_presence_ready(
    mut events: EventReader<RichPresenceReady>,
    rich_presence: Res<DiscordRichPresenceRes>,
) {
    for event in events.read() {
        println!(
            r#"
            version: {},
            user: {:?}
            "#,
            event.version, event.user
        );

        println!("setup_rich_presence");
        let current_date_time = OffsetDateTime::now_utc();
        let new_activity = ActivityBuilder::new()
            .state("bevy-discord")
            .details("Exploring example rich_presence.rs")
            .start_timestamp(current_date_time)
            .kind(bevy_discord::discord_sdk::activity::ActivityKind::Playing);

        let ds = rich_presence.discord.clone();
        bevy_discord::runtime::tokio_runtime().spawn(async move {
            let _ = ds
                .update_activity(new_activity)
                .await
                .expect("Failed to update the activity");
        });
    }
}

Example taken from examples/rich_presence.rs

§Examples

The examples/ directory contains several example implementations:

To run an example:

cargo run --example <EXAMPLE_NAME> --features "full docsrs"

Note: Remember to replace YOUR_BOT_TOKEN with your actual Discord bot token.

§Features

This crate using powerful cargo features.

FeatureInformation
bot (includes http)Discord bot integration for Bevy applications.
httpHTTP Client functionality for Discord API interactions.
rich_presenceDiscord Rich Presence Integration with Bevy. (v0.6 and greater)

All features are comes under full feature.

§Limitations

Currently, the following Discord/Serenity features are not supported:

FeatureModule
voicebot

§Versions

This crate aims to track bevy’s versions. It also follows the semver standard. Below is a chart which versions of this crate are compatible with which bevy version:

VersionBevy Version
0.2.x0.13.x
0.3.x0.13.x
0.4.x0.14.x
0.5.x0.15.x
0.6.x0.16.x

§Contributing

If you are planning to contribute to bevy-discord in any manner, please refer to CONTRIBUTING.md

Re-exports§

pub use serenity;http
pub use discord_sdk;rich_presence

Modules§

configbot or rich_presence
Configuration types for Discord bot and Rich Presence integration.
eventsbot or rich_presence
Contains all the Bevy events that can be emitted by the Discord integration.
res
Resources for managing Discord HTTP client and Rich Presence functionality.
runtime
Tokio runtime, use this if you want to use async code inside bevy systems

Structs§

DiscordBotPlugin
A plugin that integrates Discord bot functionality into a Bevy application.
DiscordHttpPlugin
A Bevy plugin that provides Discord HTTP functionality.
DiscordRichPresencePlugin
A plugin for integrating Discord Rich Presence with the Bevy game engine. You can do anything that you can do with Game SDK.
DiscordSet
Bevy SystemSet that contains all system of this plugin.