code clean up and error fixing

This commit is contained in:
2026-03-27 20:07:02 +00:00
parent 957cdf22cb
commit eeee568048
11 changed files with 127 additions and 74 deletions
+13 -43
View File
@@ -8,6 +8,8 @@ use serenity::all::{
InteractionContext, Message, MessageBuilder, MessageId, ResolvedOption, InteractionContext, Message, MessageBuilder, MessageId, ResolvedOption,
}; };
use crate::common::{self, error_msg};
pub struct Retrive {} pub struct Retrive {}
impl Retrive { impl Retrive {
@@ -16,57 +18,25 @@ impl Retrive {
ctx: &Context, ctx: &Context,
command: &CommandInteraction, command: &CommandInteraction,
) -> CreateInteractionResponse { ) -> CreateInteractionResponse {
let invoker_id = command.user.id.get() as i32; let invoker_id = command.user.id.get() as i64;
let guild_id = command.guild_id.unwrap().get() as i32; let guild_id = command.guild_id.unwrap().get() as i64;
let user_db_id = members::Entity::find() let invoker_db = members::Model::get_by_discord_id(invoker_id, db).await;
.filter(members::Column::IdDiscord.eq(invoker_id))
.one(db)
.await;
let user_db_id = match user_db_id { if let Err(e) = invoker_db {
Ok(x) => match x { return error_msg(Box::new(e));
Some(x) => x.id,
None => -1,
},
Err(e) => -1,
};
if user_db_id == -1 {
let embed = CreateEmbed::new()
.title("Error!")
.description("You're not in our database :c")
.footer(CreateEmbedFooter::new("..or we ran into an error"))
.color(Color::RED);
let reply = CreateInteractionResponse::Message(
CreateInteractionResponseMessage::new().embed(embed),
);
return reply;
} }
let server_db_id = server::Entity::find()
.filter(server::Column::IdDiscord.eq(guild_id))
.one(db)
.await;
let server_db_id = match server_db_id {
Ok(x) => match x {
Some(x) => x.id,
None => -1,
},
Err(e) => -1,
};
let invoker_messages = messages::Entity::find() let invoker_messages = messages::Entity::find()
.filter(messages::Column::IdSender.eq(user_db_id)) .filter(messages::Column::IdSender.eq(invoker_db.unwrap().unwrap().id))
.filter(messages::Column::IdServer.eq(server_db_id)) .filter(messages::Column::IdServer.eq(server_db_id))
.all(db) .all(db)
.await; .await;
// TODO error checking here // TODO error checking here
let invoker_messages = invoker_messages.unwrap(); let invoker_messages = invoker_messages.unwrap();
let mut map: HashMap<i32, i32> = HashMap::new(); // channel - amount let mut map: HashMap<i64, i32> = HashMap::new(); // channel - amount
let mut map_channel: HashMap<i32, i32> = HashMap::new(); // db_id - discord_id let mut map_channel: HashMap<i32, i64> = HashMap::new(); // db_id - discord_id
for msg in invoker_messages { for msg in invoker_messages {
// Get discord id of channel from db then store in map for cache // Get discord id of channel from db then store in map for cache
if map_channel.get(&msg.id_channel).is_none() { if map_channel.get(&msg.id_channel).is_none() {
@@ -75,7 +45,7 @@ impl Retrive {
.await .await
.unwrap() .unwrap()
.unwrap(); .unwrap();
map_channel.insert(msg.id_channel, channel_db.id_discord); map_channel.insert(msg.id_channel, channel_db.id_discord as i64);
} }
let channel_discord_id = map_channel.get(&msg.id_channel).unwrap(); let channel_discord_id = map_channel.get(&msg.id_channel).unwrap();
if let Some(count) = map.get(channel_discord_id) { if let Some(count) = map.get(channel_discord_id) {
@@ -88,12 +58,12 @@ impl Retrive {
let mut summary_string: String = String::new(); let mut summary_string: String = String::new();
for x in map { for x in map {
summary_string.push_str(format!("#{} -- {} \n", x.0, x.1).as_str()); summary_string.push_str(format!("#{} | {} \n", x.0, x.1).as_str());
} }
let embed = CreateEmbed::new() let embed = CreateEmbed::new()
.title("Summary") .title("Summary")
.description(format!("{} msgs in this server", summary_string)); .description(format!("{}", summary_string));
let reply = CreateInteractionResponseMessage::new().embed(embed); let reply = CreateInteractionResponseMessage::new().embed(embed);
+17
View File
@@ -0,0 +1,17 @@
use std::error::Error;
use serenity::all::{
Color, CreateEmbed, CreateEmbedFooter, CreateInteractionResponse,
CreateInteractionResponseMessage,
};
pub fn error_msg(e: Box<dyn Error>) -> CreateInteractionResponse {
let embed = CreateEmbed::new()
.title("Error!")
.description("we ran into an error :c")
.footer(CreateEmbedFooter::new(format!("{}", e)))
.color(Color::RED);
let reply =
CreateInteractionResponse::Message(CreateInteractionResponseMessage::new().embed(embed));
return reply;
}
+48 -23
View File
@@ -4,7 +4,7 @@ use std::error::Error;
use entities::{channel, content, members, messages, server}; use entities::{channel, content, members, messages, server};
use migration::{Migrator, MigratorTrait}; use migration::{Migrator, MigratorTrait};
use sea_orm::{ use sea_orm::{
ActiveModelTrait, ColumnTrait, Database, DatabaseConnection, EntityTrait, QueryFilter, ActiveModelTrait, ColumnTrait, Database, DatabaseConnection, EntityTrait, Iden, QueryFilter,
}; };
use serenity::all::{Command, Interaction, Ready}; use serenity::all::{Command, Interaction, Ready};
use serenity::async_trait; use serenity::async_trait;
@@ -13,6 +13,7 @@ use serenity::model::guild;
use serenity::prelude::*; use serenity::prelude::*;
mod command; mod command;
mod common;
struct Bot { struct Bot {
db: DatabaseConnection, db: DatabaseConnection,
@@ -28,30 +29,45 @@ impl EventHandler for Bot {
} }
// TODO This is a mess, it should be split into its on function(s) // TODO This is a mess, it should be split into its on function(s)
msg.channel(&ctx.http).await.unwrap(); 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() let content = content::Entity::find()
.filter(members::Column::IdDiscord.eq(msg.author.id.get() as i32)) .filter(content::Column::Content.eq(msg.content.clone()))
.one(&self.db) .one(&self.db)
.await .await
.unwrap(); .unwrap();
if member.is_none() { let content = match content {
let activeModel = members::ActiveModel { Some(x) => x,
id: sea_orm::ActiveValue::NotSet, None => {
id_discord: sea_orm::ActiveValue::Set(msg.author.id.get() as i32), let activeModel = content::ActiveModel {
name: sea_orm::ActiveValue::Set(msg.author.name.clone()), id: sea_orm::ActiveValue::NotSet,
}; content: sea_orm::ActiveValue::Set(msg.content.clone()),
let member = activeModel.insert(&self.db).await.unwrap(); r#type: sea_orm::ActiveValue::Set("".to_string()),
} };
activeModel.insert(&self.db).await.unwrap()
}
};
let member = members::Entity::find()
.filter(members::Column::IdDiscord.eq(msg.author.id.get() as i64))
.one(&self.db)
.await
.unwrap();
let member = match member {
Some(x) => x,
None => {
let activeModel = members::ActiveModel {
id: sea_orm::ActiveValue::NotSet,
id_discord: sea_orm::ActiveValue::Set(msg.author.id.get() as i64),
name: sea_orm::ActiveValue::Set(msg.author.name.clone()),
};
activeModel.insert(&self.db).await.unwrap()
}
};
let server_id = msg.guild_id.unwrap().get(); let server_id = msg.guild_id.unwrap().get();
let server_id_i32 = server_id.clone() as i32; let server_id_i32 = server_id.clone() as i64;
let guild_name = msg let guild_name = msg
.channel(&ctx.http) .channel(&ctx.http)
.await .await
@@ -72,13 +88,13 @@ impl EventHandler for Bot {
let activeModel = server::ActiveModel { let activeModel = server::ActiveModel {
id: sea_orm::ActiveValue::NotSet, id: sea_orm::ActiveValue::NotSet,
name: sea_orm::ActiveValue::Set(guild_name.to_string()), name: sea_orm::ActiveValue::Set(guild_name.to_string()),
id_discord: sea_orm::ActiveValue::Set(server_id.clone() as i32), id_discord: sea_orm::ActiveValue::Set(server_id.clone() as i64),
}; };
activeModel.insert(&self.db).await.unwrap() activeModel.insert(&self.db).await.unwrap()
} }
}; };
let channel_id = msg.channel(&ctx.http).await.unwrap().id().get() as i32; let channel_id = msg.channel(&ctx.http).await.unwrap().id().get() as i64;
let channel = entities::channel::Entity::find() let channel = entities::channel::Entity::find()
.filter(entities::channel::Column::IdDiscord.eq(channel_id)) .filter(entities::channel::Column::IdDiscord.eq(channel_id))
.one(&self.db) .one(&self.db)
@@ -90,16 +106,25 @@ impl EventHandler for Bot {
None => { None => {
let activeModel = channel::ActiveModel { let activeModel = channel::ActiveModel {
id: sea_orm::ActiveValue::NotSet, id: sea_orm::ActiveValue::NotSet,
id_discord: sea_orm::ActiveValue::Set(channel_id), id_discord: sea_orm::ActiveValue::Set(channel_id as i64),
}; };
activeModel.insert(&self.db).await.unwrap() activeModel.insert(&self.db).await.unwrap()
} }
}; };
println!(
"{}, {}, {}, {}, {}",
msg.id.get(),
member.id,
server.id,
content.id,
channel.id
);
let activeModel = messages::ActiveModel { let activeModel = messages::ActiveModel {
id: sea_orm::ActiveValue::NotSet, id: sea_orm::ActiveValue::NotSet,
id_discord: sea_orm::ActiveValue::Set(msg.id.get() as i32), id_discord: sea_orm::ActiveValue::Set(msg.id.get() as i64),
id_sender: sea_orm::ActiveValue::Set(member.unwrap().id), id_sender: sea_orm::ActiveValue::Set(member.id),
id_server: sea_orm::ActiveValue::Set(server.id), id_server: sea_orm::ActiveValue::Set(server.id),
id_content: sea_orm::ActiveValue::Set(content.id), id_content: sea_orm::ActiveValue::Set(content.id),
id_channel: sea_orm::ActiveValue::Set(channel.id), id_channel: sea_orm::ActiveValue::Set(channel.id),
+1 -1
View File
@@ -7,7 +7,7 @@ use sea_orm::entity::prelude::*;
pub struct Model { pub struct Model {
#[sea_orm(primary_key)] #[sea_orm(primary_key)]
pub id: i32, pub id: i32,
pub id_discord: i32, pub id_discord: i64,
} }
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
+21 -1
View File
@@ -8,10 +8,30 @@ pub struct Model {
#[sea_orm(primary_key)] #[sea_orm(primary_key)]
pub id: i32, pub id: i32,
#[sea_orm(unique)] #[sea_orm(unique)]
pub id_discord: i32, pub id_discord: i64,
pub name: String, pub name: String,
} }
impl Model {
pub async fn get_by_discord_id(
id: i64,
db: &DatabaseConnection,
) -> Result<Option<Model>, DbErr> {
let user_db_id = Entity::find()
.filter(Column::IdDiscord.eq(id))
.one(db)
.await;
match user_db_id {
Ok(x) => match x {
Some(x) => Ok(Some(x)),
None => Ok(None),
},
Err(e) => Err(e),
}
}
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {} pub enum Relation {}
+2 -1
View File
@@ -7,7 +7,8 @@ use sea_orm::entity::prelude::*;
pub struct Model { pub struct Model {
#[sea_orm(primary_key)] #[sea_orm(primary_key)]
pub id: i32, pub id: i32,
pub id_discord: i32, #[sea_orm(unique)]
pub id_discord: i64,
pub id_sender: i32, pub id_sender: i32,
pub id_content: i32, pub id_content: i32,
pub id_channel: i32, pub id_channel: i32,
+21 -1
View File
@@ -8,10 +8,30 @@ pub struct Model {
#[sea_orm(primary_key)] #[sea_orm(primary_key)]
pub id: i32, pub id: i32,
#[sea_orm(unique)] #[sea_orm(unique)]
pub id_discord: i32, pub id_discord: i64,
pub name: String, pub name: String,
} }
impl Model {
pub async fn get_by_discord_id(
id: i64,
db: &DatabaseConnection,
) -> Result<Option<Model>, DbErr> {
let server_db_id = Entity::find()
.filter(Column::IdDiscord.eq(id))
.one(db)
.await;
match server_db_id {
Ok(x) => match x {
Some(x) => Ok(Some(x)),
None => Ok(None),
},
Err(e) => Err(e),
}
}
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {} pub enum Relation {}
@@ -12,7 +12,7 @@ impl MigrationTrait for Migration {
.table(Server::Table) .table(Server::Table)
.if_not_exists() .if_not_exists()
.col(pk_auto(Server::Id)) .col(pk_auto(Server::Id))
.col(integer(Server::IdDiscord).unique_key()) .col(big_integer(Server::IdDiscord).unique_key())
.col(string(Server::Name)) .col(string(Server::Name))
.to_owned(), .to_owned(),
) )
@@ -12,7 +12,7 @@ impl MigrationTrait for Migration {
.table(Members::Table) .table(Members::Table)
.if_not_exists() .if_not_exists()
.col(pk_auto(Members::Id)) .col(pk_auto(Members::Id))
.col(integer(Members::IdDiscord).unique_key()) .col(big_integer(Members::IdDiscord).unique_key())
.col(string(Members::Name)) .col(string(Members::Name))
.to_owned(), .to_owned(),
) )
@@ -15,7 +15,7 @@ impl MigrationTrait for Migration {
.table(Messages::Table) .table(Messages::Table)
.if_not_exists() .if_not_exists()
.col(pk_auto(Messages::Id)) .col(pk_auto(Messages::Id))
.col(integer(Messages::IdDiscord)) .col(big_integer(Messages::IdDiscord))
.col(integer(Messages::IdSender)) .col(integer(Messages::IdSender))
.col(integer(Messages::IdContent)) .col(integer(Messages::IdContent))
.foreign_key( .foreign_key(
@@ -12,7 +12,7 @@ impl MigrationTrait for Migration {
.table(Channel::Table) .table(Channel::Table)
.if_not_exists() .if_not_exists()
.col(pk_auto(Channel::Id)) .col(pk_auto(Channel::Id))
.col(integer(Channel::IdDiscord)) .col(big_integer(Channel::IdDiscord))
.to_owned(), .to_owned(),
) )
.await .await