did stuff

This commit is contained in:
2026-04-05 00:24:34 +01:00
parent a6932b1b0b
commit cb143254b6
6 changed files with 147 additions and 8 deletions
+83
View File
@@ -0,0 +1,83 @@
use std::collections::HashMap;
use entities::{channel, members, messages, server};
use sea_orm::{ColIdx, ColumnTrait, DatabaseConnection, EntityTrait, QueryFilter};
use serenity::all::{
CommandInteraction, Context, CreateCommand, CreateEmbed, CreateInteractionResponse,
CreateInteractionResponseMessage, InteractionContext,
};
use crate::common::error_msg;
pub struct Channelretrive {}
impl Channelretrive {
pub async fn run(
db: &DatabaseConnection,
ctx: &Context,
command: &CommandInteraction,
) -> CreateInteractionResponse {
let invoker_id = command.user.id.get() as i64;
let channel_id = command.channel_id.get() as i64;
// let guild_id = command.guild_id.unwrap().get() as i64;
// let guild_name = command.guild_id.unwrap().name(&ctx.cache).unwrap();
let channel_db = channel::Model::get_or_create(channel_id, db).await;
if let Err(e) = channel_db {
return error_msg(Box::new(e));
}
// let guild_db = server::Model::get_or_create(guild_id, guild_name, db).await;
//
// if let Err(e) = guild_db {
// return error_msg(Box::new(e));
// }
let messages_by_channels = messages::Entity::find()
.filter(messages::Column::IdChannel.eq(channel_db.unwrap()))
.all(db)
.await
.unwrap();
let mut user_lookup: HashMap<i32, String> = HashMap::new();
let mut user_msg_amount: HashMap<String, i32> = HashMap::new();
for x in messages_by_channels {
if let Some(user) = user_lookup.get(&x.id_sender) {
if let Some(user_amount) = user_msg_amount.get(user) {
user_msg_amount.insert(user.to_string(), (user_amount + 1));
} else {
user_msg_amount.insert(user.clone(), 1);
}
} else {
let memebr = members::Entity::find_by_id(x.id_sender)
.one(db)
.await
.unwrap()
.unwrap();
user_lookup.insert(memebr.id, memebr.name.clone());
user_msg_amount.insert(memebr.name, 1);
}
}
let mut summary_string: String = String::new();
for x in &user_msg_amount {
summary_string.push_str(format!("{} - {}\n", x.0, x.1).as_str());
}
let embed = CreateEmbed::new()
.title("Summary")
.description(format!("{}", summary_string));
let reply = CreateInteractionResponseMessage::new().embed(embed);
CreateInteractionResponse::Message(reply)
}
pub fn register() -> CreateCommand {
CreateCommand::new("retriveChannel")
.name("channeldata")
.description("description")
.contexts(vec![InteractionContext::Guild])
}
}
+18
View File
@@ -0,0 +1,18 @@
use sea_orm::DatabaseConnection;
use serenity::all::{
CommandInteraction, Context, CreateCommand, CreateInteractionResponse, InteractionContext,
};
pub struct Fetch;
// This is "possible" but with ratelimiting, it'll take a long long long time to rip a medium sized
// server
impl Fetch {
pub fn register() -> CreateCommand {
CreateCommand::new("retriveChannel")
.name("channeldata")
.description("description")
.contexts(vec![InteractionContext::Guild])
}
}
+9 -1
View File
@@ -3,7 +3,15 @@ use std::error::Error;
use entities::{channel, content, members, messages, server};
use migration::prelude::{DateTime, Utc};
use sea_orm::{ActiveModelTrait, ColumnTrait, DatabaseConnection, EntityTrait, QueryFilter};
use serenity::all::{Context, Message};
use serenity::all::{Context, Message, VoiceState};
pub async fn log_vc_event(
db: &DatabaseConnection,
ctx: &Context,
vc: VoiceState,
) -> Result<(), Box<dyn Error>> {
Ok(())
}
pub async fn log_message(
db: &DatabaseConnection,
+22 -7
View File
@@ -6,16 +6,18 @@ use migration::{Migrator, MigratorTrait};
use sea_orm::{
ActiveModelTrait, ColumnTrait, Database, DatabaseConnection, EntityTrait, Iden, QueryFilter,
};
use serenity::all::{Command, Interaction, Ready};
use serenity::all::{Command, Interaction, Ready, VoiceState};
use serenity::async_trait;
use serenity::model::channel::Message;
use serenity::model::guild;
use serenity::prelude::*;
use crate::logger::log_message;
use crate::logger::{log_message, log_vc_event};
mod channelcommand;
mod command;
mod common;
mod fetchcommand;
mod logger;
struct Bot {
@@ -32,15 +34,25 @@ impl EventHandler for Bot {
}
log_message(&self.db, &ctx, msg).await.unwrap();
}
async fn voice_state_update(&self, ctx: Context, _old: Option<VoiceState>, new: VoiceState) {
log_vc_event(&self.db, &ctx, new).await.unwrap();
}
async fn interaction_create(&self, ctx: Context, interaction: Interaction) {
if let Interaction::Command(command) = interaction {
println!("Received command interaction: {command:#?}");
println!("{:#?}", command.data.name.as_str());
let content = match command.data.name.as_str() {
"userdata" => Some(command::Retrive::run(&self.db, &ctx, &command).await),
"channeldata" => {
Some(channelcommand::Channelretrive::run(&self.db, &ctx, &command).await)
}
_ => Some(serenity::all::CreateInteractionResponse::Pong),
};
println!("{:#?}", content);
if let Some(content) = content {
if let Err(why) = command.create_response(&ctx.http, content).await {
println!("Cannot respond to slash command: {why}");
@@ -51,10 +63,12 @@ impl EventHandler for Bot {
async fn ready(&self, ctx: Context, ready: Ready) {
println!("{} is connected!", ready.user.name);
let global_command =
Command::create_global_command(&ctx.http, command::Retrive::register()).await;
println!("I created the following global slash command: {global_command:#?}");
Command::create_global_command(&ctx.http, command::Retrive::register())
.await
.unwrap();
Command::create_global_command(&ctx.http, channelcommand::Channelretrive::register())
.await
.unwrap();
}
}
@@ -69,7 +83,8 @@ async fn main() -> Result<(), Box<dyn Error>> {
// Set gateway intents, which decides what events the bot will be notified about
let intents = GatewayIntents::GUILD_MESSAGES
| GatewayIntents::DIRECT_MESSAGES
| GatewayIntents::MESSAGE_CONTENT;
| GatewayIntents::MESSAGE_CONTENT
| GatewayIntents::GUILD_VOICE_STATES;
let bot = Bot { db: dbc };