bevy_discord/res.rs
1//! Resources for managing Discord HTTP client and Rich Presence functionality.
2//!
3//! This module provides two main resources:
4//! - `DiscordHttpResource`: For handling Discord HTTP client operations
5//! - `DiscordRichPresenceRes`: For managing Discord Rich Presence integration
6
7use bevy_ecs::prelude::*;
8use std::sync::Arc;
9
10/// A Bevy resource that provides access to the Discord HTTP client.
11///
12/// This resource is automatically inserted into the Bevy app when using
13/// `DiscordHttpPlugin`. It wraps Serenity's `Http` client in an `Arc`
14/// for safe concurrent access.
15///
16/// # Examples
17///
18/// ```rust,no_run
19/// use bevy_discord::res::DiscordHttpResource;
20/// use std::sync::Arc;
21/// use serenity::all::Http;
22///
23/// let http = Arc::new(Http::new("token"));
24/// let resource = DiscordHttpResource::new(http);
25///
26/// // Get a cloned Arc reference
27/// let client = resource.client();
28///
29/// // Get a reference to the client
30/// let client_ref = resource.client_ref();
31/// ```
32#[cfg(feature = "http")]
33#[cfg_attr(docsrs, doc(cfg(feature = "http")))]
34#[derive(Resource, Debug, Clone)]
35pub struct DiscordHttpResource {
36 /// Arc-wrapped Serenity HTTP client for Discord API operations.
37 pub http: Arc<serenity::all::Http>,
38}
39
40#[cfg(feature = "http")]
41impl DiscordHttpResource {
42 /// Creates a new `DiscordHttpResource` instance.
43 ///
44 /// # Arguments
45 ///
46 /// * `http` - An Arc-wrapped Serenity HTTP client
47 pub fn new(http: Arc<serenity::all::Http>) -> Self {
48 Self { http }
49 }
50
51 /// Returns a cloned Arc reference to the HTTP client.
52 ///
53 /// Use this method when you need to share ownership of the client
54 /// across multiple systems or threads.
55 pub fn client(&self) -> Arc<serenity::all::Http> {
56 self.http.clone()
57 }
58
59 /// Returns a reference to the underlying HTTP client.
60 ///
61 /// Use this method when you only need temporary access to the client
62 /// and don't need to share ownership.
63 pub fn client_ref(&self) -> &serenity::all::Http {
64 &self.http
65 }
66}
67
68/// A global resource for managing Discord Rich Presence functionality.
69///
70/// This resource maintains the bot's Rich Presence state and provides access
71/// to the Discord SDK client for updating presence information.
72///
73/// # Examples
74///
75/// ```rust,no_run
76/// use bevy_discord::res::DiscordRichPresenceRes;
77/// use std::sync::Arc;
78/// use discord_sdk::Discord;
79///
80/// let discord = Arc::new(Discord::new(/* ... */));
81/// let resource = DiscordRichPresenceRes::new(discord);
82///
83/// // Get a cloned Arc reference
84/// let rp = resource.get_rp();
85///
86/// // Get a reference to the Discord client
87/// let rp_ref = resource.get_rp_ref();
88/// ```
89#[cfg(feature = "rich_presence")]
90#[cfg_attr(docsrs, doc(cfg(feature = "rich_presence")))]
91#[derive(Resource, Clone)]
92pub struct DiscordRichPresenceRes {
93 /// Arc-wrapped Discord SDK client for Rich Presence operations.
94 pub discord: Arc<discord_sdk::Discord>,
95}
96
97#[cfg(feature = "rich_presence")]
98impl DiscordRichPresenceRes {
99 /// Creates a new `DiscordRichPresenceRes` instance.
100 ///
101 /// # Arguments
102 ///
103 /// * `rp` - An Arc-wrapped Discord SDK client
104 pub fn new(rp: Arc<discord_sdk::Discord>) -> Self {
105 Self { discord: rp }
106 }
107
108 /// Returns a cloned Arc reference to the Discord SDK client.
109 ///
110 /// Use this when you need to share ownership of the client.
111 pub fn get_rp(&self) -> Arc<discord_sdk::Discord> {
112 self.discord.clone()
113 }
114
115 /// Returns a reference to the Discord SDK client.
116 ///
117 /// Use this when you only need temporary access to the client.
118 pub fn get_rp_ref(&self) -> &discord_sdk::Discord {
119 &self.discord
120 }
121}