diff --git a/src/commands/users.rs b/src/commands/users.rs index da968f6..f552787 100644 --- a/src/commands/users.rs +++ b/src/commands/users.rs @@ -10,17 +10,26 @@ pub async fn register( email: String, ) -> Result<(), Error> { if let Some(guild_id) = ctx.guild_id() { - let new_user = NewUser { - discord_id: ctx.author().id.0 as i64, - guild_id: guild_id.into(), - first_name, - last_name, - email, - }; + let discord_id = ctx.author().id.0 as i64; { let mut conn = ctx.data().pool.get()?; - new_user.insert(&mut conn); + + if User::get(&mut conn, guild_id.into(), discord_id)?.is_some() { + ctx.say("You've already been registered.").await?; + + return Ok(()); + } + + let new_user = NewUser { + discord_id, + guild_id: guild_id.into(), + first_name, + last_name, + email, + }; + + new_user.insert(&mut conn)?; } ctx.say("You have been registered.").await?; diff --git a/src/db/mod.rs b/src/db/mod.rs index 1542bea..578506e 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -34,10 +34,7 @@ fn initialize_db(conn: &mut SqliteConnection) -> Result<(), DbError> { pub fn initialize_pool(url: &str) -> Result>, DbError> { let manager = ConnectionManager::new(url); - let pool = Pool::builder() - .test_on_check_out(true) - .build(manager) - .expect("oops"); + let pool = Pool::builder().test_on_check_out(true).build(manager)?; let mut conn = pool.get()?; initialize_db(&mut conn)?; diff --git a/src/db/users.rs b/src/db/users.rs index 09360ee..e87f0b9 100644 --- a/src/db/users.rs +++ b/src/db/users.rs @@ -1,14 +1,12 @@ use super::schema::users::{self, dsl::*}; use diesel::dsl::Eq; use diesel::dsl::{AsSelect, Select}; -use diesel::expression::AsExpression; use diesel::helper_types::Filter; use diesel::prelude::*; -use diesel::sql_types::BigInt; use diesel::sqlite::Sqlite; use diesel::sqlite::SqliteConnection; -#[derive(Queryable, Selectable)] +#[derive(Queryable, Selectable, AsChangeset)] #[diesel(table_name = users)] pub struct User { pub id: i32, @@ -52,23 +50,30 @@ impl User { conn: &mut SqliteConnection, guild_id_: i64, discord_id_: i64, - ) -> Result { + ) -> Result, diesel::result::Error> { Self::all() .filter(guild_id.eq(guild_id_)) .filter(discord_id.eq(discord_id_)) .first(conn) + .optional() } - pub fn get_by_id(conn: &mut SqliteConnection, id_: i32) -> Result { - Self::all().filter(id.eq(id_)).first(conn) + pub fn get_by_id( + conn: &mut SqliteConnection, + id_: i32, + ) -> Result, diesel::result::Error> { + Self::all().find(id_).first(conn).optional() + } + + pub fn update(&self, conn: &mut SqliteConnection) -> Result { + diesel::update(users::table).set(self).execute(conn) } } impl NewUser { - pub fn insert(&self, conn: &mut SqliteConnection) -> User { + pub fn insert(&self, conn: &mut SqliteConnection) -> Result { diesel::insert_into(users::table) .values(self) .get_result(conn) - .expect("fuck") } } diff --git a/src/main.rs b/src/main.rs index c1457cf..6328584 100644 --- a/src/main.rs +++ b/src/main.rs @@ -84,7 +84,7 @@ async fn main() { ..Default::default() }; - let pool = db::initialize_pool("affy.db").unwrap(); + let pool = db::initialize_pool("affy.db").expect("Failed to initialize database."); poise::Framework::builder() .token(