From e834b3308ad21d8c437e10f7d536381de5f85ba1 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Mon, 15 May 2023 17:38:13 +0200 Subject: [PATCH] feat: initial register functionality --- .env | 1 + .gitignore | 1 + Cargo.lock | 69 +++++++++++++++++++ Cargo.toml | 1 + diesel.toml | 8 +++ migrations/.keep | 0 .../2023-05-15-142901_create_users/down.sql | 2 + .../2023-05-15-142901_create_users/up.sql | 7 ++ src/commands/mod.rs | 9 ++- src/commands/users.rs | 45 ++++++++++++ src/db/mod.rs | 2 + src/db/schema.rs | 10 +++ src/db/users.rs | 22 ++++++ src/main.rs | 7 ++ src/models.rs | 0 15 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 .env create mode 100644 diesel.toml create mode 100644 migrations/.keep create mode 100644 migrations/2023-05-15-142901_create_users/down.sql create mode 100644 migrations/2023-05-15-142901_create_users/up.sql create mode 100644 src/commands/users.rs create mode 100644 src/db/mod.rs create mode 100644 src/db/schema.rs create mode 100644 src/db/users.rs create mode 100644 src/models.rs diff --git a/.env b/.env new file mode 100644 index 0000000..3e6e71e --- /dev/null +++ b/.env @@ -0,0 +1 @@ +DATABASE_URL=sqlite://affy.db diff --git a/.gitignore b/.gitignore index b128699..a7e99c9 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ rust-project.json # End of https://www.toptal.com/developers/gitignore/api/rust,rust-analyzer +*.db diff --git a/Cargo.lock b/Cargo.lock index 99099f4..c88ad20 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,6 +35,7 @@ dependencies = [ "affluences-api", "async-minecraft-ping", "chrono", + "diesel", "poise", "tokio", "uuid", @@ -413,6 +414,28 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "diesel" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72eb77396836a4505da85bae0712fa324b74acfe1876d7c2f7e694ef3d0ee373" +dependencies = [ + "diesel_derives", + "libsqlite3-sys", +] + +[[package]] +name = "diesel_derives" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad74fdcf086be3d4fdd142f67937678fe60ed431c3b2f08599e7687269410c4" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "digest" version = "0.10.6" @@ -793,6 +816,16 @@ version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" +[[package]] +name = "libsqlite3-sys" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" +dependencies = [ + "pkg-config", + "vcpkg", +] + [[package]] name = "link-cplusplus" version = "1.0.8" @@ -955,6 +988,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + [[package]] name = "poise" version = "0.5.5" @@ -992,6 +1031,30 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" version = "1.0.56" @@ -1644,6 +1707,12 @@ dependencies = [ "serde", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.4" diff --git a/Cargo.toml b/Cargo.toml index 0a82e38..a4d6e6f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,3 +22,4 @@ chrono = "*" uuid = "*" poise = "0.5.5" async-minecraft-ping = "0.8.0" +diesel = { version = "2.0.4", features = ["sqlite", "returning_clauses_for_sqlite_3_35"] } diff --git a/diesel.toml b/diesel.toml new file mode 100644 index 0000000..88db6ba --- /dev/null +++ b/diesel.toml @@ -0,0 +1,8 @@ +# For documentation on how to configure this file, +# see https://diesel.rs/guides/configuring-diesel-cli + +[print_schema] +file = "src/db/schema.rs" + +[migrations_directory] +dir = "migrations" diff --git a/migrations/.keep b/migrations/.keep new file mode 100644 index 0000000..e69de29 diff --git a/migrations/2023-05-15-142901_create_users/down.sql b/migrations/2023-05-15-142901_create_users/down.sql new file mode 100644 index 0000000..dc3714b --- /dev/null +++ b/migrations/2023-05-15-142901_create_users/down.sql @@ -0,0 +1,2 @@ +-- This file should undo anything in `up.sql` +DROP TABLE users; diff --git a/migrations/2023-05-15-142901_create_users/up.sql b/migrations/2023-05-15-142901_create_users/up.sql new file mode 100644 index 0000000..e5148b3 --- /dev/null +++ b/migrations/2023-05-15-142901_create_users/up.sql @@ -0,0 +1,7 @@ +-- Your SQL goes here +CREATE TABLE users ( + discord_id UNSIGNED BIG INT PRIMARY KEY NOT NULL, + email TEXT UNIQUE NOT NULL, + first_name TEXT NOT NULL, + last_name TEXT NOT NULL +); diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 70a5dea..d0f47ce 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -1,12 +1,19 @@ mod affluence; mod minecraft; +mod users; use crate::{Context, Data, Error}; type EmbedField = (String, String, bool); pub fn commands() -> Vec> { - vec![help(), affluence::available(), minecraft::ping_mc()] + vec![ + help(), + affluence::available(), + minecraft::ping_mc(), + users::register(), + users::registered(), + ] } /// Show this help menu diff --git a/src/commands/users.rs b/src/commands/users.rs new file mode 100644 index 0000000..df0e7e6 --- /dev/null +++ b/src/commands/users.rs @@ -0,0 +1,45 @@ +use crate::db::users::{user_all, user_insert, User}; +use crate::{Context, Error}; + +#[poise::command(prefix_command, slash_command)] +pub async fn register( + ctx: Context<'_>, + first_name: String, + last_name: String, + email: String, +) -> Result<(), Error> { + let user = User { + discord_id: ctx.author().id.0 as i64, + first_name, + last_name, + email, + }; + + { + let mut conn = ctx.data().conn.lock().unwrap(); + user_insert(&mut conn, &user); + } + + Ok(()) +} + +#[poise::command(prefix_command, slash_command)] +pub async fn registered(ctx: Context<'_>) -> Result<(), Error> { + let users = { + let mut conn = ctx.data().conn.lock().unwrap(); + user_all(&mut conn) + }; + + ctx.send(|f| { + f.embed(|e| { + e.description("Registered users").fields( + users + .into_iter() + .map(|u| (format!("{} {}", u.first_name, u.last_name), u.email, false)), + ) + }) + }) + .await?; + + Ok(()) +} diff --git a/src/db/mod.rs b/src/db/mod.rs new file mode 100644 index 0000000..aa8f28e --- /dev/null +++ b/src/db/mod.rs @@ -0,0 +1,2 @@ +mod schema; +pub mod users; diff --git a/src/db/schema.rs b/src/db/schema.rs new file mode 100644 index 0000000..f50726b --- /dev/null +++ b/src/db/schema.rs @@ -0,0 +1,10 @@ +// @generated automatically by Diesel CLI. + +diesel::table! { + users (discord_id) { + discord_id -> BigInt, + email -> Text, + first_name -> Text, + last_name -> Text, + } +} diff --git a/src/db/users.rs b/src/db/users.rs new file mode 100644 index 0000000..17040b0 --- /dev/null +++ b/src/db/users.rs @@ -0,0 +1,22 @@ +use super::schema::users; +use diesel::prelude::*; +use diesel::sqlite::SqliteConnection; + +#[derive(Queryable, Insertable)] +pub struct User { + pub discord_id: i64, + pub email: String, + pub first_name: String, + pub last_name: String, +} + +pub fn user_insert(conn: &mut SqliteConnection, user: &User) -> User { + diesel::insert_into(users::table) + .values(user) + .get_result(conn) + .expect("fuck") +} + +pub fn user_all(conn: &mut SqliteConnection) -> Vec { + users::table.load::(conn).expect("nou") +} diff --git a/src/main.rs b/src/main.rs index c052b07..e4364d8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,10 @@ mod commands; +mod db; use affluences_api::AffluencesClient; +use diesel::Connection; use poise::serenity_prelude as serenity; +use std::sync::Mutex; use std::{env::var, time::Duration}; // Types used by all command functions @@ -11,6 +14,7 @@ type Context<'a> = poise::Context<'a, Data, Error>; // Custom user data passed to all command functions pub struct Data { client: AffluencesClient, + conn: Mutex, } async fn on_error(error: poise::FrameworkError<'_, Data, Error>) { @@ -91,6 +95,9 @@ async fn main() { poise::builtins::register_globally(ctx, &framework.options().commands).await?; Ok(Data { client: AffluencesClient::new(), + conn: Mutex::new( + diesel::sqlite::SqliteConnection::establish("affy.db").unwrap(), + ), }) }) }) diff --git a/src/models.rs b/src/models.rs new file mode 100644 index 0000000..e69de29