Skip to content

Commit 852d9ac

Browse files
committed
feat: add presence persistence
1 parent 5438d7d commit 852d9ac

File tree

5 files changed

+156
-9
lines changed

5 files changed

+156
-9
lines changed

Cargo.lock

Lines changed: 98 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ nanoid = "0.4.0"
1818
num = "0.4.1"
1919
once_cell = "1.18.0"
2020
owo-colors = { version = "3.5.0", features = ["supports-colors"] }
21-
poise = { git = "https://github.com/serenity-rs/poise.git", branch = "serenity-next", version = "0.5.5" }
21+
poise = { git = "https://github.com/serenity-rs/poise.git", branch = "serenity-next" }
22+
redis = { version = "0.23.3", features = ["tokio-comp", "tokio-rustls-comp"] }
2223
regex = "1.10.2"
2324
reqwest = { version = "0.11.22", default-features = false, features = ["rustls-tls", "json", "brotli"] }
2425
serde = { version = "1.0.189", features = ["derive"] }

src/commands/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,5 @@ pub fn vec() -> Vec<
2424
translate::translate(),
2525
]
2626
}
27+
28+
pub use presence::restore_presence;

src/commands/presence.rs

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
use anyhow::Result;
1+
use owo_colors::OwoColorize;
22
use poise::{serenity_prelude as serenity, CreateReply};
3+
use redis::AsyncCommands;
34

45
use crate::Context;
6+
use anyhow::Result;
57

6-
#[derive(poise::ChoiceParameter)]
8+
#[derive(poise::ChoiceParameter, serde::Serialize, serde::Deserialize, Clone, Copy)]
9+
#[serde(rename_all = "lowercase")]
710
pub enum PresenceChoice {
811
Custom,
912
Playing,
@@ -46,6 +49,13 @@ impl std::fmt::Display for PresenceChoice {
4649
}
4750
}
4851

52+
#[derive(serde::Serialize, serde::Deserialize)]
53+
struct PresencePersistence {
54+
content: String,
55+
#[serde(rename = "type")]
56+
type_: PresenceChoice,
57+
}
58+
4959
/// Modify the Discord presence shown by the bot
5060
#[poise::command(
5161
slash_command,
@@ -73,11 +83,36 @@ pub async fn presence(
7383
serenity::CreateEmbed::new()
7484
.title("Presence set!")
7585
.field("Type", type_.to_string(), false)
76-
.field("Content", content, false)
86+
.field("Content", &content, false)
7787
.color(0x4ade80),
7888
),
7989
)
8090
.await?;
8191

92+
if let Some(redis) = &ctx.data().redis {
93+
let mut conn = redis.get_async_connection().await?;
94+
conn.set(
95+
"presence-v1",
96+
serde_json::to_string(&PresencePersistence { content, type_ })?,
97+
)
98+
.await?;
99+
}
100+
101+
Ok(())
102+
}
103+
104+
pub async fn restore_presence(ctx: &serenity::Context, redis_client: &redis::Client) -> Result<()> {
105+
let mut conn = redis_client.get_async_connection().await?;
106+
let data: Option<String> = conn.get("presence-v1").await?;
107+
108+
if let Some(data) = data {
109+
let data: PresencePersistence = serde_json::from_str(&data)?;
110+
ctx.set_presence(
111+
Some(data.type_.make_activity(&data.content)),
112+
serenity::OnlineStatus::Online,
113+
);
114+
println!("{} presence from Redis", "Restored".cyan());
115+
}
116+
82117
Ok(())
83118
}

src/main.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ use poise::{
88

99
use crate::utils::Pluralize;
1010

11-
pub struct Data {}
11+
pub struct Data {
12+
pub redis: Option<redis::Client>,
13+
}
1214
pub type Context<'a> = poise::Context<'a, Data, Error>;
1315

1416
mod commands;
@@ -74,7 +76,19 @@ async fn main() -> Result<()> {
7476
"command".pluralize(commands.len())
7577
);
7678

77-
Ok(Data {})
79+
if let Ok(redis_url) = std::env::var("REDIS_URL") {
80+
let client = redis::Client::open(redis_url)?;
81+
82+
if let Err(err) = commands::restore_presence(&ctx, &client).await {
83+
eprintln!("{}", err);
84+
};
85+
86+
return Ok(Data {
87+
redis: Some(client),
88+
});
89+
}
90+
91+
return Ok(Data { redis: None });
7892
})
7993
},
8094
))

0 commit comments

Comments
 (0)