xpd_common/
lib.rs

1#![deny(clippy::all, clippy::pedantic, clippy::nursery, clippy::cargo)]
2
3use twilight_model::{
4    id::{
5        marker::{GuildMarker, UserMarker},
6        Id,
7    },
8    util::ImageHash,
9};
10
11#[derive(serde::Serialize, serde::Deserialize)]
12pub struct RedisUser {
13    pub id: Id<UserMarker>,
14    pub username: Option<String>,
15    pub discriminator: Option<u16>,
16    pub avatar_hash: Option<ImageHash>,
17    pub banner_hash: Option<ImageHash>,
18}
19
20#[derive(serde::Serialize, serde::Deserialize)]
21pub struct RedisGuild {
22    pub id: Id<GuildMarker>,
23    pub name: String,
24    pub banner_hash: Option<ImageHash>,
25    pub icon_hash: Option<ImageHash>,
26}
27
28pub trait Tag {
29    #[must_use]
30    fn tag(&self) -> String;
31}
32
33impl Tag for twilight_model::user::User {
34    fn tag(&self) -> String {
35        if self.discriminator == 0 {
36            self.name.clone()
37        } else {
38            format!("{}#{}", self.name, self.discriminator())
39        }
40    }
41}
42
43impl Tag for RedisUser {
44    fn tag(&self) -> String {
45        let Some(discriminator) = self.discriminator else {
46            return self.id.to_string();
47        };
48        let Some(name) = &self.username else {
49            return self.id.to_string();
50        };
51        name_discrim_to_tag(name, discriminator)
52    }
53}
54
55fn name_discrim_to_tag(name: &str, discriminator: u16) -> String {
56    if discriminator == 0 {
57        name.to_string()
58    } else {
59        format!(
60            "{}#{}",
61            name,
62            twilight_model::user::DiscriminatorDisplay::new(discriminator)
63        )
64    }
65}
66
67/// A simple function that waits until we are told to stop.
68/// # Panics
69/// If the system fails to set up a unix signal handler
70#[cfg(target_family = "unix")]
71#[allow(clippy::redundant_pub_crate)]
72pub async fn wait_for_shutdown() {
73    let mut term_handler =
74        tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()).unwrap();
75    tokio::select! {
76        _ = tokio::signal::ctrl_c() => {},
77        _ = term_handler.recv() => {}
78    }
79}
80
81/// A simple function that waits until we are told to stop.
82#[cfg(not(target_family = "unix"))]
83#[allow(clippy::redundant_pub_crate)]
84pub async fn wait_for_shutdown() {
85    tokio::signal::ctrl_c().await.ok();
86}