DiscordHttpResource

Struct DiscordHttpResource 

Source
pub struct DiscordHttpResource {
    pub http: Arc<Http>,
}
Available on (crate features http or rich_presence) and crate feature http only.
Expand description

A Bevy resource that provides access to the Discord HTTP client.

This resource is automatically inserted into the Bevy app when using DiscordHttpPlugin. It wraps Serenity’s Http client in an Arc for safe concurrent access.

§Examples

use bevy_discord::res::DiscordHttpResource;
use std::sync::Arc;
use serenity::all::Http;

let http = Arc::new(Http::new("token"));
let resource = DiscordHttpResource::new(http);

// Get a cloned Arc reference
let client = resource.client();

// Get a reference to the client
let client_ref = resource.client_ref();

Fields§

§http: Arc<Http>

Arc-wrapped Serenity HTTP client for Discord API operations.

Implementations§

Source§

impl DiscordHttpResource

Source

pub fn new(http: Arc<Http>) -> Self

Creates a new DiscordHttpResource instance.

§Arguments
  • http - An Arc-wrapped Serenity HTTP client
Source

pub fn client(&self) -> Arc<Http>

Returns a cloned Arc reference to the HTTP client.

Use this method when you need to share ownership of the client across multiple systems or threads.

Examples found in repository?
examples/reactions.rs (line 39)
28fn handle_discord_messages(
29    mut messages: MessageReader<DiscordMessage>,
30    http: Option<Res<bevy_discord::res::DiscordHttpResource>>,
31) {
32    for message in messages.read() {
33        if let Some(http) = &http {
34            if message.new_message.author.bot {
35                continue;
36            }
37
38            if message.new_message.content == "!react" {
39                let http = http.client();
40                let message_id = message.new_message.id;
41                let channel_id = message.new_message.channel_id;
42
43                bevy_discord::runtime::tokio_runtime().spawn(async move {
44                    // Add a thumbs up reaction
45                    let _ = http
46                        .create_reaction(
47                            channel_id,
48                            message_id,
49                            &ReactionType::Unicode("👍".to_string()),
50                        )
51                        .await;
52                });
53            }
54        }
55    }
56}
57
58fn handle_discord_reactions(
59    mut reaction_add: MessageReader<ReactionAddMessage>,
60    http: Option<Res<bevy_discord::res::DiscordHttpResource>>,
61) {
62    for reaction in reaction_add.read() {
63        if let Some(http) = &http {
64            // Skip bot reactions
65            if reaction.add_reaction.user_id == Some(reaction.ctx.cache.current_user().id) {
66                continue;
67            }
68
69            let http = http.client();
70            let channel_id = reaction.add_reaction.channel_id;
71
72            bevy_discord::runtime::tokio_runtime().spawn(async move {
73                let _ = http
74                    .send_message(
75                        channel_id,
76                        vec![],
77                        &json!({
78                            "content": "Thanks for reacting! 😊"
79                        }),
80                    )
81                    .await;
82            });
83        }
84    }
85}
More examples
Hide additional examples
examples/basic_bot.rs (line 49)
33fn handle_discord_message(
34    mut messages: MessageReader<DiscordMessage>,
35    http: Option<Res<bevy_discord::res::DiscordHttpResource>>,
36) {
37    for message in messages.read() {
38        if let Some(http) = &http {
39            // Skip messages from bots (including our own)
40            if message.new_message.author.bot {
41                continue;
42            }
43
44            let content = &message.new_message.content;
45            let channel_id = message.new_message.channel_id;
46
47            // Simple ping-pong command
48            if content == "!ping" {
49                let http = http.client();
50
51                bevy_discord::runtime::tokio_runtime().spawn(async move {
52                    let _ = http
53                        .send_message(
54                            channel_id,
55                            vec![],
56                            &json!({
57                                "content": "Pong! 🏓"
58                            }),
59                        )
60                        .await;
61                });
62            }
63        }
64    }
65}
Source

pub fn client_ref(&self) -> &Http

Returns a reference to the underlying HTTP client.

Use this method when you only need temporary access to the client and don’t need to share ownership.

Trait Implementations§

Source§

impl Clone for DiscordHttpResource

Source§

fn clone(&self) -> DiscordHttpResource

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DiscordHttpResource

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Resource for DiscordHttpResource
where Self: Send + Sync + 'static,

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneDebuggableStorage for T

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> CloneableStorage for T
where T: Any + Send + Sync + Clone,

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoResult<T> for T

Source§

fn into_result(self) -> Result<T, RunSystemError>

Converts this type into the system output type.
Source§

impl<A> Is for A
where A: Any,

Source§

fn is<T>() -> bool
where T: Any,

Checks if the current type “is” another type, using a TypeId equality comparison. This is most useful in the context of generic logic. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> TypeData for T
where T: 'static + Send + Sync + Clone,

Source§

fn clone_type_data(&self) -> Box<dyn TypeData>

Creates a type-erased clone of this value.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ConditionalSend for T
where T: Send,

Source§

impl<T> DebuggableStorage for T
where T: Any + Send + Sync + Debug,

Source§

impl<T> ErasedDestructor for T
where T: 'static,