This commit is contained in:
Stachelbeere1248 2024-07-11 00:44:05 +02:00
parent fcf37449b3
commit fcc30b43be
Signed by: Stachelbeere1248
SSH key fingerprint: SHA256:IozEKdw2dB8TZxkpPdMxcWSoWTIMwoLaCcZJ1AJnY2o

View file

@ -1,5 +1,5 @@
use poise::CreateReply; use poise::CreateReply;
use reqwest::Response; use reqwest::{Client, Response};
use serde::Deserialize; use serde::Deserialize;
use serenity::{ use serenity::{
all::{ all::{
@ -39,7 +39,7 @@ struct HypixelResponse {
#[derive(Deserialize)] #[derive(Deserialize)]
struct MojangPlayer { struct MojangPlayer {
pub id: String, pub id: String,
pub name: String, //pub name: String,
} }
#[derive(PartialEq, sqlx::FromRow)] #[derive(PartialEq, sqlx::FromRow)]
@ -47,12 +47,6 @@ struct Uuid {
uuid: String uuid: String
} }
impl Uuid { impl Uuid {
fn new(uuid: &str) -> Self {
let uuid: String = uuid.to_string();
Uuid {
uuid
}
}
fn get(&self) -> &str { fn get(&self) -> &str {
self.uuid.as_str() self.uuid.as_str()
} }
@ -78,25 +72,15 @@ struct DiscordId {
id: u64 id: u64
} }
impl DiscordId { impl DiscordId {
fn new(id: u64) -> Self { async fn matches_fetch(user: &User, uuid: &str, client: &Client) -> Result<bool, Error> {
DiscordId {
id
}
}
fn new_from_unsigned(id: i64) -> Self {
DiscordId {
id: id.cast_unsigned()
}
}
async fn matches_fetch(user: &User, uuid: &str) -> Result<bool, Error> {
let url: String = format!("https://api.hypixel.net/v2/player?uuid={}", uuid); let url: String = format!("https://api.hypixel.net/v2/player?uuid={}", uuid);
let response: Response = reqwest::get(url).await?; let response: Response = client.get(url).send().await?;
match response.error_for_status() { match response.error_for_status() {
Ok(res) => { Ok(res) => {
let response_text = res.text().await.unwrap(); let response_text = res.text().await.unwrap();
let matches = (serde_json::from_str(response_text.as_str()) let matches = (serde_json::from_str(response_text.as_str())
as Result<HypixelPlayer, JsonError>) as Result<HypixelResponse, JsonError>)
.map(|hypixel_player: HypixelPlayer| user.name == hypixel_player.social_media.links.discord)?; .map(|hypixel_response: HypixelResponse| user.name == hypixel_response.player.social_media.links.discord)?;
Ok(matches) Ok(matches)
}, },
Err(why) => { Err(why) => {
@ -164,7 +148,7 @@ pub(crate) async fn add<'a>(
ctx.defer_ephemeral().await?; ctx.defer_ephemeral().await?;
let user = user.unwrap_or(ctx.author().clone()); let user = user.unwrap_or(ctx.author().clone());
let uuid = Uuid::fetch(ign.as_str()).await?; let uuid = Uuid::fetch(ign.as_str()).await?;
let valid = DiscordId::matches_fetch(&user, uuid.get()).await let valid = DiscordId::matches_fetch(&user, uuid.get(), &ctx.data().hypixel_api_client).await
.expect("This Minecraft account does not have a Discord account linked."); .expect("This Minecraft account does not have a Discord account linked.");
match valid { match valid {
true => { true => {
@ -260,39 +244,27 @@ async fn list_string(link: Link, user_id: u64) -> String {
format!("## Account list for <@{user_id}>:\n{}\n{}", discord_list.as_str(), minecraft_list.as_str()) format!("## Account list for <@{user_id}>:\n{}\n{}", discord_list.as_str(), minecraft_list.as_str())
} }
#[derive(sqlx::FromRow)]
struct MinecraftLink {
link_id: i16,
minecraft_uuid: String,
}
async fn link_id_from_minecraft(pool: &Pool<Sqlite>, minecraft_uuid: &str) -> Option<u16> { async fn link_id_from_minecraft(pool: &Pool<Sqlite>, minecraft_uuid: &str) -> Option<u16> {
return query_as( return query_as(
format!( format!(
"SELECT * FROM minecraft_links WHERE minecraft_uuid = \"{minecraft_uuid}\" LIMIT 1;" "SELECT link_id FROM minecraft_links WHERE minecraft_uuid = \"{minecraft_uuid}\" LIMIT 1;"
) )
.as_str(), .as_str(),
) )
.fetch_optional(pool) .fetch_optional(pool)
.await .await
.expect("Database error: fetching link id by uuid") .expect("Database error: fetching link id by uuid")
.map(|minecraft_link: MinecraftLink| minecraft_link.link_id.cast_unsigned()); .map(|link_id: LinkId| link_id.link_id.cast_unsigned());
}
#[derive(sqlx::FromRow)]
struct DiscordLink {
link_id: i16,
discord_id: i64,
} }
async fn link_id_from_discord(pool: &Pool<Sqlite>, snowflake: u64) -> Option<u16> { async fn link_id_from_discord(pool: &Pool<Sqlite>, snowflake: u64) -> Option<u16> {
let discord_id: i64 = snowflake.cast_signed(); let discord_id: i64 = snowflake.cast_signed();
return query_as( return query_as(
format!("SELECT * FROM discord_links WHERE discord_id = {discord_id} LIMIT 1;").as_str(), format!("SELECT link_id FROM discord_links WHERE discord_id = {discord_id} LIMIT 1;").as_str(),
) )
.fetch_optional(pool) .fetch_optional(pool)
.await .await
.expect("Database error: fetching link id by discord") .expect("Database error: fetching link id by discord")
.map(|discord_link: DiscordLink| discord_link.link_id.cast_unsigned()); .map(|link_id: LinkId| link_id.link_id.cast_unsigned());
} }
#[derive(sqlx::FromRow)] #[derive(sqlx::FromRow)]