Uhm so yeah here's some c o d e
This commit is contained in:
1 parent
6a77189343
commit
d530b182b3
33 files changed
+1934
-298
No files matched your search
@@ -0,0 +1,3 @@
|
||||
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
|
||||
pub const MOTD: &str = "OPEN BETA (v2)";
|
||||
// pub const MOTD: &str = "some good 'ol music";
|
||||
@@ -0,0 +1,10 @@
|
||||
pub fn escape(text: impl Into<String>) -> String {
|
||||
let text: String = text.into();
|
||||
|
||||
text
|
||||
.replace("\\", "\\\\")
|
||||
.replace("*", "\\*")
|
||||
.replace("_", "\\_")
|
||||
.replace("~", "\\~")
|
||||
.replace("`", "\\`")
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
use serenity::builder::CreateEmbed;
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub enum Status {
|
||||
Info = 0x0773D6,
|
||||
Success = 0x3BD65D,
|
||||
Warning = 0xF0D932,
|
||||
Error = 0xFC1F28,
|
||||
None = 0,
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct EmbedMessageOptions {
|
||||
pub title: Option<String>,
|
||||
pub title_url: Option<String>,
|
||||
pub icon_url: Option<String>,
|
||||
pub description: String,
|
||||
pub status: Option<Status>,
|
||||
pub footer: Option<String>,
|
||||
}
|
||||
|
||||
pub struct EmbedBuilder {
|
||||
embed: EmbedMessageOptions,
|
||||
}
|
||||
|
||||
impl EmbedBuilder {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
embed: EmbedMessageOptions::default(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn title(mut self, title: impl Into<String>) -> Self {
|
||||
self.embed.title = Some(title.into());
|
||||
self
|
||||
}
|
||||
|
||||
pub fn title_url(mut self, title_url: impl Into<String>) -> Self {
|
||||
self.embed.title_url = Some(title_url.into());
|
||||
self
|
||||
}
|
||||
|
||||
pub fn icon_url(mut self, icon_url: impl Into<String>) -> Self {
|
||||
self.embed.icon_url = Some(icon_url.into());
|
||||
self
|
||||
}
|
||||
|
||||
pub fn description(mut self, description: impl Into<String>) -> Self {
|
||||
self.embed.description = description.into();
|
||||
self
|
||||
}
|
||||
|
||||
pub fn status(mut self, status: Status) -> Self {
|
||||
self.embed.status = Some(status);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn footer(mut self, footer: impl Into<String>) -> Self {
|
||||
self.embed.footer = Some(footer.into());
|
||||
self
|
||||
}
|
||||
|
||||
/// Build the embed
|
||||
pub fn build(self) -> EmbedMessageOptions {
|
||||
self.embed
|
||||
}
|
||||
}
|
||||
|
||||
pub fn make_embed_message<'a>(
|
||||
embed: &'a mut CreateEmbed,
|
||||
options: EmbedMessageOptions,
|
||||
) -> &'a mut CreateEmbed {
|
||||
let status = options.status.unwrap_or(Status::None);
|
||||
|
||||
embed.author(|author| {
|
||||
if let Some(title) = options.title {
|
||||
author.name(title);
|
||||
}
|
||||
|
||||
if let Some(title_url) = options.title_url {
|
||||
author.url(title_url);
|
||||
}
|
||||
|
||||
if let Some(icon_url) = options.icon_url {
|
||||
author.icon_url(icon_url);
|
||||
}
|
||||
|
||||
author
|
||||
});
|
||||
|
||||
if let Some(text) = options.footer {
|
||||
embed.footer(|footer| footer.text(text));
|
||||
}
|
||||
|
||||
embed.description(options.description);
|
||||
embed.color(status as u32);
|
||||
|
||||
embed
|
||||
}
|
||||
@@ -1,5 +1,8 @@
|
||||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
|
||||
pub mod consts;
|
||||
pub mod discord;
|
||||
pub mod embed;
|
||||
pub mod spotify;
|
||||
|
||||
pub fn get_time() -> u64 {
|
||||
@@ -8,3 +11,28 @@ pub fn get_time() -> u64 {
|
||||
|
||||
since_the_epoch.as_secs()
|
||||
}
|
||||
|
||||
pub fn get_time_ms() -> u128 {
|
||||
let now = SystemTime::now();
|
||||
let since_the_epoch = now.duration_since(UNIX_EPOCH).expect("Time went backwards");
|
||||
|
||||
since_the_epoch.as_millis()
|
||||
}
|
||||
|
||||
pub fn time_to_str(time: u32) -> String {
|
||||
let hour = 3600;
|
||||
let min = 60;
|
||||
|
||||
if time / hour >= 1 {
|
||||
return format!(
|
||||
"{}h{}m{}s",
|
||||
time / hour,
|
||||
(time % hour) / min,
|
||||
(time % hour) % min
|
||||
);
|
||||
} else if time / min >= 1 {
|
||||
return format!("{}m{}s", time / min, time % min);
|
||||
} else {
|
||||
return format!("{}s", time);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,8 @@
|
||||
use std::error::Error;
|
||||
|
||||
use librespot::core::spotify_id::SpotifyId;
|
||||
use log::{error, trace};
|
||||
use serde::Deserialize;
|
||||
use serde_json::Value;
|
||||
|
||||
pub async fn get_username(token: impl Into<String>) -> Result<String, String> {
|
||||
@@ -34,3 +38,98 @@ pub async fn get_username(token: impl Into<String>) -> Result<String, String> {
|
||||
error!("Missing 'id' field in body");
|
||||
Err("Failed to parse body: Invalid body received".to_string())
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct Artist {
|
||||
pub name: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct Image {
|
||||
pub url: String,
|
||||
pub height: u32,
|
||||
pub width: u32,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct Album {
|
||||
pub name: String,
|
||||
pub images: Vec<Image>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct Track {
|
||||
pub name: String,
|
||||
pub artists: Vec<Artist>,
|
||||
pub album: Album,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct Show {
|
||||
pub name: String,
|
||||
pub images: Vec<Image>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct Episode {
|
||||
pub name: String,
|
||||
pub show: Show,
|
||||
}
|
||||
|
||||
pub async fn get_track_info(
|
||||
token: impl Into<String>,
|
||||
track: SpotifyId,
|
||||
) -> Result<Track, Box<dyn Error>> {
|
||||
let token = token.into();
|
||||
let client = reqwest::Client::new();
|
||||
|
||||
let response = client
|
||||
.get(format!(
|
||||
"https://api.spotify.com/v1/tracks/{}",
|
||||
track.to_base62()?
|
||||
))
|
||||
.bearer_auth(token)
|
||||
.send()
|
||||
.await?;
|
||||
|
||||
if response.status() != 200 {
|
||||
return Err(
|
||||
format!(
|
||||
"Failed to get track info: Invalid status code: {}",
|
||||
response.status()
|
||||
)
|
||||
.into(),
|
||||
);
|
||||
}
|
||||
|
||||
Ok(response.json().await?)
|
||||
}
|
||||
|
||||
pub async fn get_episode_info(
|
||||
token: impl Into<String>,
|
||||
episode: SpotifyId,
|
||||
) -> Result<Episode, Box<dyn Error>> {
|
||||
let token = token.into();
|
||||
let client = reqwest::Client::new();
|
||||
|
||||
let response = client
|
||||
.get(format!(
|
||||
"https://api.spotify.com/v1/episodes/{}",
|
||||
episode.to_base62()?
|
||||
))
|
||||
.bearer_auth(token)
|
||||
.send()
|
||||
.await?;
|
||||
|
||||
if response.status() != 200 {
|
||||
return Err(
|
||||
format!(
|
||||
"Failed to get episode info: Invalid status code: {}",
|
||||
response.status()
|
||||
)
|
||||
.into(),
|
||||
);
|
||||
}
|
||||
|
||||
Ok(response.json().await?)
|
||||
}
|
||||
Reference in new issue
Block a user