diff --git a/Cargo.lock b/Cargo.lock index 326ddaf..e345e3e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -563,6 +563,7 @@ dependencies = [ name = "bot" version = "0.1.0" dependencies = [ + "entities", "migration", "sea-orm", "serenity", diff --git a/crates/bot/Cargo.toml b/crates/bot/Cargo.toml index bc7283a..76fa1ff 100644 --- a/crates/bot/Cargo.toml +++ b/crates/bot/Cargo.toml @@ -9,3 +9,4 @@ serenity = "0.12" tokio = {workspace = true} sea-orm = {workspace = true} migration ={workspace = true} +entities = {workspace = true} diff --git a/crates/bot/src/main.rs b/crates/bot/src/main.rs index 47b831e..3177953 100644 --- a/crates/bot/src/main.rs +++ b/crates/bot/src/main.rs @@ -1,22 +1,88 @@ use std::env; use std::error::Error; +use entities::{content, members, messages, server}; use migration::{Migrator, MigratorTrait}; -use sea_orm::{Database, DatabaseConnection}; +use sea_orm::{ + ActiveModelTrait, ColumnTrait, Database, DatabaseConnection, EntityTrait, QueryFilter, +}; use serenity::async_trait; use serenity::model::channel::Message; +use serenity::model::guild; use serenity::prelude::*; -struct Handler; +struct Bot { + db: DatabaseConnection, +} #[async_trait] -impl EventHandler for Handler { +impl EventHandler for Bot { async fn message(&self, ctx: Context, msg: Message) { if msg.content == "!ping" { if let Err(why) = msg.channel_id.say(&ctx.http, "Pong!").await { println!("Error sending message: {why:?}"); } } + // This is a mess, it should be split into its on function(s) + msg.channel(&ctx.http).await.unwrap(); + let activeModel = content::ActiveModel { + id: sea_orm::ActiveValue::NotSet, + content: sea_orm::ActiveValue::Set(msg.content.clone()), + r#type: sea_orm::ActiveValue::Set("Content".into()), + }; + let content = activeModel.insert(&self.db).await.unwrap(); + + let member = members::Entity::find() + .filter(members::Column::IdDiscord.eq(msg.author.id.get() as i32)) + .one(&self.db) + .await + .unwrap(); + + if member.is_none() { + let activeModel = members::ActiveModel { + id: sea_orm::ActiveValue::NotSet, + id_discord: sea_orm::ActiveValue::Set(msg.author.id.get() as i32), + name: sea_orm::ActiveValue::Set(msg.author.name.clone()), + }; + let member = activeModel.insert(&self.db).await.unwrap(); + } + + let server_id = msg.guild_id.unwrap().get(); + let server_id_i32 = server_id.clone() as i32; + let guild_name = msg + .channel(&ctx.http) + .await + .unwrap() + .guild() + .unwrap() + .name + .clone(); + let server = entities::server::Entity::find() + .filter(entities::server::Column::IdDiscord.eq(server_id_i32)) + .one(&self.db) + .await + .unwrap(); + + let server = match server { + Some(x) => x, + None => { + let activeModel = server::ActiveModel { + id: sea_orm::ActiveValue::NotSet, + name: sea_orm::ActiveValue::Set(guild_name.to_string()), + id_discord: sea_orm::ActiveValue::Set(server_id.clone() as i32), + }; + activeModel.insert(&self.db).await.unwrap() + } + }; + + let activeModel = messages::ActiveModel { + id: sea_orm::ActiveValue::NotSet, + id_discord: sea_orm::ActiveValue::Set(msg.id.get() as i32), + id_sender: sea_orm::ActiveValue::Set(member.unwrap().id), + id_server: sea_orm::ActiveValue::Set(server.id), + id_content: sea_orm::ActiveValue::Set(content.id), + }; + activeModel.insert(&self.db).await.unwrap(); } } @@ -33,9 +99,11 @@ async fn main() -> Result<(), Box> { | GatewayIntents::DIRECT_MESSAGES | GatewayIntents::MESSAGE_CONTENT; + let bot = Bot { db: dbc }; + // Create a new instance of the Client, logging in as a bot. let mut client = Client::builder(&token, intents) - .event_handler(Handler) + .event_handler(bot) .await .expect("Err creating client"); diff --git a/crates/entities/src/members.rs b/crates/entities/src/members.rs index a3b0757..42b1489 100644 --- a/crates/entities/src/members.rs +++ b/crates/entities/src/members.rs @@ -7,6 +7,7 @@ use sea_orm::entity::prelude::*; pub struct Model { #[sea_orm(primary_key)] pub id: i32, + #[sea_orm(unique)] pub id_discord: i32, pub name: String, } diff --git a/crates/entities/src/server.rs b/crates/entities/src/server.rs index 589afbb..ec62819 100644 --- a/crates/entities/src/server.rs +++ b/crates/entities/src/server.rs @@ -7,7 +7,8 @@ use sea_orm::entity::prelude::*; pub struct Model { #[sea_orm(primary_key)] pub id: i32, - pub id_discord: String, + #[sea_orm(unique)] + pub id_discord: i32, pub name: String, } diff --git a/crates/migration/src/m20260325_145211_servers.rs b/crates/migration/src/m20260325_145211_servers.rs index 1c68e85..662afac 100644 --- a/crates/migration/src/m20260325_145211_servers.rs +++ b/crates/migration/src/m20260325_145211_servers.rs @@ -12,7 +12,7 @@ impl MigrationTrait for Migration { .table(Server::Table) .if_not_exists() .col(pk_auto(Server::Id)) - .col(string(Server::IdDiscord)) + .col(integer(Server::IdDiscord).unique_key()) .col(string(Server::Name)) .to_owned(), ) diff --git a/crates/migration/src/m20260325_145717_members.rs b/crates/migration/src/m20260325_145717_members.rs index 97701ea..7dc0b4c 100644 --- a/crates/migration/src/m20260325_145717_members.rs +++ b/crates/migration/src/m20260325_145717_members.rs @@ -12,7 +12,7 @@ impl MigrationTrait for Migration { .table(Members::Table) .if_not_exists() .col(pk_auto(Members::Id)) - .col(integer(Members::IdDiscord)) + .col(integer(Members::IdDiscord).unique_key()) .col(string(Members::Name)) .to_owned(), )