1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
//! # PresenceForge
//!
//! A cross-platform Rust library for Discord Rich Presence (IPC) integration.
//!
//! Supports both Unix-like systems (Linux, macOS) using Unix domain sockets
//! and Windows using named pipes.
//!
//! ## Features
//!
//! - Synchronous and asynchronous API
//! - **Unified async API** - Write once, run on any async runtime
//! - Runtime-agnostic async design (supports tokio, async-std, and smol)
//! - Activity builder pattern
//! - Cross-platform support (Linux, macOS, Windows)
//!
//! ## Synchronous Example
//!
//! ```rust no_run
//! use presenceforge::ActivityBuilder;
//! use presenceforge::sync::DiscordIpcClient;
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! let mut client = DiscordIpcClient::new("your_client_id")?;
//! client.connect()?;
//!
//! let activity = ActivityBuilder::new()
//! .state("Playing a game")
//! .details("In the menu")
//! .start_timestamp_now()?
//! .large_image("game_logo")
//! .large_text("My Awesome Game")
//! .build();
//!
//! client.set_activity(&activity)?;
//!
//! // Keep the activity for some time...
//! std::thread::sleep(std::time::Duration::from_secs(10));
//!
//! client.clear_activity()?;
//! # Ok(())
//! # }
//! ```
//!
//! ## Unified Async API
//!
//! The library provides a single `AsyncDiscordIpcClient` type that automatically
//! adapts to your chosen async runtime through feature flags. No need for
//! runtime-specific imports!
//!
//! ### With Tokio
//!
//! Enable the `tokio-runtime` feature in your `Cargo.toml`:
//!
//! ```toml
//! [dependencies]
//! presenceforge = { version = "0.1.0", features = ["tokio-runtime"] }
//! tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
//! ```
//!
//! ```rust,no_run
//! # #[cfg(feature = "tokio-runtime")]
//! # {
//! use presenceforge::{AsyncDiscordIpcClient, ActivityBuilder, Result};
//!
//! async fn main() -> Result {
//! let mut client = AsyncDiscordIpcClient::new("your_client_id").await?;
//! client.connect().await?;
//!
//! let activity = ActivityBuilder::new()
//! .state("Playing a game")
//! .details("In the menu")
//! .start_timestamp_now()?
//! .large_image("game_logo")
//! .large_text("My Awesome Game")
//! .build();
//!
//! client.set_activity(&activity).await?;
//! # tokio::time::sleep(tokio::time::Duration::from_secs(10)).await;
//! # client.clear_activity().await?;
//! Ok(())
//! }
//! # }
//! ```
//!
//! ### With async-std
//!
//! Enable the `async-std-runtime` feature:
//!
//! ```toml
//! [dependencies]
//! presenceforge = { version = "0.1.0", features = ["async-std-runtime"] }
//! async-std = { version = "1", features = ["attributes"] }
//! ```
//!
//! ```rust,no_run
//! # #[cfg(feature = "async-std-runtime")]
//! # {
//! use presenceforge::{AsyncDiscordIpcClient, ActivityBuilder, Result};
//!
//! async fn main() -> Result {
//! let mut client = AsyncDiscordIpcClient::new("your_client_id").await?;
//! client.connect().await?;
//!
//! let activity = ActivityBuilder::new()
//! .state("Playing a game")
//! .details("In the menu")
//! .start_timestamp_now()?
//! .large_image("game_logo")
//! .large_text("My Awesome Game")
//! .build();
//!
//! client.set_activity(&activity).await?;
//! # async_std::task::sleep(std::time::Duration::from_secs(10)).await;
//! # client.clear_activity().await?;
//! Ok(())
//! }
//! # }
//! ```
//!
//! ### With smol
//!
//! Enable the `smol-runtime` feature:
//!
//! ```toml
//! [dependencies]
//! presenceforge = { version = "0.1.0", features = ["smol-runtime"] }
//! smol = "2"
//! ```
//!
//! ```rust,no_run
//! # #[cfg(feature = "smol-runtime")]
//! # {
//! use presenceforge::{AsyncDiscordIpcClient, ActivityBuilder, Result};
//!
//! fn main() -> Result {
//! smol::block_on(async {
//! let mut client = AsyncDiscordIpcClient::new("your_client_id").await?;
//! client.connect().await?;
//!
//! let activity = ActivityBuilder::new()
//! .state("Playing a game")
//! .details("In the menu")
//! .start_timestamp_now()?
//! .large_image("game_logo")
//! .large_text("My Awesome Game")
//! .build();
//!
//! client.set_activity(&activity).await?;
//! smol::Timer::after(std::time::Duration::from_secs(10)).await;
//! client.clear_activity().await?;
//! Ok(())
//! })
//! }
//! # }
//! ```
//!
//! ## Runtime-Specific APIs (Advanced)
//!
//! For advanced use cases, you can still import runtime-specific clients directly:
//!
//! ```rust,no_run
//! // Tokio-specific client
//! # #[cfg(feature = "tokio-runtime")]
//! use presenceforge::async_io::tokio::TokioDiscordIpcClient;
//!
//! // async-std-specific client
//! # #[cfg(feature = "async-std-runtime")]
//! use presenceforge::async_io::async_std::AsyncStdDiscordIpcClient;
//!
//! // smol-specific client
//! # #[cfg(feature = "smol-runtime")]
//! use presenceforge::async_io::smol::SmolDiscordIpcClient;
//! ```
// Re-export the main public API
pub use ActivitySecrets;
pub use ;
pub use ;
pub use IpcConfig;
pub use ;
pub use is_debug_enabled;
// Re-export the synchronous API for backwards compatibility
pub use DiscordIpcClient;
// The sync module is also accessible for more explicit imports
// Unified async API - automatically selects the correct runtime based on feature flags
pub use TokioDiscordIpcClient as AsyncDiscordIpcClient;
pub use AsyncStdDiscordIpcClient as AsyncDiscordIpcClient;
pub use SmolDiscordIpcClient as AsyncDiscordIpcClient;