msg collecting

This commit is contained in:
2026-03-26 23:25:04 +00:00
parent 4a53d5c111
commit 7ae73dc49e
7 changed files with 79 additions and 7 deletions
Generated
+1
View File
@@ -563,6 +563,7 @@ dependencies = [
name = "bot" name = "bot"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"entities",
"migration", "migration",
"sea-orm", "sea-orm",
"serenity", "serenity",
+1
View File
@@ -9,3 +9,4 @@ serenity = "0.12"
tokio = {workspace = true} tokio = {workspace = true}
sea-orm = {workspace = true} sea-orm = {workspace = true}
migration ={workspace = true} migration ={workspace = true}
entities = {workspace = true}
+72 -4
View File
@@ -1,22 +1,88 @@
use std::env; use std::env;
use std::error::Error; use std::error::Error;
use entities::{content, members, messages, server};
use migration::{Migrator, MigratorTrait}; use migration::{Migrator, MigratorTrait};
use sea_orm::{Database, DatabaseConnection}; use sea_orm::{
ActiveModelTrait, ColumnTrait, Database, DatabaseConnection, EntityTrait, QueryFilter,
};
use serenity::async_trait; use serenity::async_trait;
use serenity::model::channel::Message; use serenity::model::channel::Message;
use serenity::model::guild;
use serenity::prelude::*; use serenity::prelude::*;
struct Handler; struct Bot {
db: DatabaseConnection,
}
#[async_trait] #[async_trait]
impl EventHandler for Handler { impl EventHandler for Bot {
async fn message(&self, ctx: Context, msg: Message) { async fn message(&self, ctx: Context, msg: Message) {
if msg.content == "!ping" { if msg.content == "!ping" {
if let Err(why) = msg.channel_id.say(&ctx.http, "Pong!").await { if let Err(why) = msg.channel_id.say(&ctx.http, "Pong!").await {
println!("Error sending message: {why:?}"); 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<dyn Error>> {
| GatewayIntents::DIRECT_MESSAGES | GatewayIntents::DIRECT_MESSAGES
| GatewayIntents::MESSAGE_CONTENT; | GatewayIntents::MESSAGE_CONTENT;
let bot = Bot { db: dbc };
// Create a new instance of the Client, logging in as a bot. // Create a new instance of the Client, logging in as a bot.
let mut client = Client::builder(&token, intents) let mut client = Client::builder(&token, intents)
.event_handler(Handler) .event_handler(bot)
.await .await
.expect("Err creating client"); .expect("Err creating client");
+1
View File
@@ -7,6 +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,
#[sea_orm(unique)]
pub id_discord: i32, pub id_discord: i32,
pub name: String, pub name: String,
} }
+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: String, #[sea_orm(unique)]
pub id_discord: i32,
pub name: String, pub name: String,
} }
@@ -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(string(Server::IdDiscord)) .col(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)) .col(integer(Members::IdDiscord).unique_key())
.col(string(Members::Name)) .col(string(Members::Name))
.to_owned(), .to_owned(),
) )