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#[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#[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}