Add leaderboard command and XP winning system
This commit is contained in:
+10
-18
@@ -11,7 +11,9 @@ use twilight_util::builder::embed::{EmbedAuthorBuilder, EmbedBuilder, ImageSourc
|
||||
|
||||
use crate::{
|
||||
constants::COLOR_WHITE,
|
||||
database::models::{Call, Channel, Message, User, UserIncident},
|
||||
database::models::{
|
||||
Call, Channel, Message, User, UserIncident, get_or_create_user_and_set_last_seen,
|
||||
},
|
||||
discord::sanitizing::SanitizeDiscordMarkdown,
|
||||
framework::{
|
||||
events::traits::{
|
||||
@@ -142,6 +144,8 @@ impl OnMessageHandler<State> for CallMessageHandler {
|
||||
return Ok(());
|
||||
};
|
||||
|
||||
let user = get_or_create_user_and_set_last_seen(event.author.clone(), &rt.state.db).await?;
|
||||
|
||||
let user_incidents = UserIncident::get_for_user(event.author.id.get(), &rt.state.db)
|
||||
.await?
|
||||
.iter()
|
||||
@@ -268,7 +272,9 @@ impl OnMessageHandler<State> for CallMessageHandler {
|
||||
{
|
||||
if error.code == 10015 {
|
||||
log::debug!("Webhook not found, updating...");
|
||||
opposite_channel.update_webhook(&rt.state.db, &rt.http).await?;
|
||||
opposite_channel
|
||||
.update_webhook(&rt.state.db, &rt.http)
|
||||
.await?;
|
||||
}
|
||||
}
|
||||
return Ok(());
|
||||
@@ -297,18 +303,6 @@ impl OnMessageHandler<State> for CallMessageHandler {
|
||||
.iter()
|
||||
.any(|rule| rule.action() == &Action::BlockAndPenalty)
|
||||
{
|
||||
let user = User::get_by_id(event.author.id.get(), &rt.state.db).await?;
|
||||
|
||||
let user = if let Some(user) = user {
|
||||
user
|
||||
} else {
|
||||
let user: User = event.author.clone().into();
|
||||
|
||||
user.insert(&rt.state.db).await?;
|
||||
|
||||
user
|
||||
};
|
||||
|
||||
penalize_user(user, message, rules, &rt).await?;
|
||||
}
|
||||
|
||||
@@ -374,11 +368,9 @@ impl OnMessageEditHandler<State> for CallMessageEditHandler {
|
||||
.reply(event.id)
|
||||
.await?;
|
||||
|
||||
let user = User::get_by_id(event.author.id.get(), &rt.state.db).await?;
|
||||
let user = get_or_create_user_and_set_last_seen(event.author.clone(), &rt.state.db).await?;
|
||||
|
||||
if let Some(user) = user {
|
||||
penalize_user(user, message, rules, &rt).await?;
|
||||
}
|
||||
penalize_user(user, message, rules, &rt).await?;
|
||||
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
//!
|
||||
//! All of which would be detected.
|
||||
|
||||
use std::{collections::HashMap, sync::Arc};
|
||||
use std::{collections::HashMap, fmt::Debug, sync::Arc};
|
||||
|
||||
use itertools::Itertools;
|
||||
use linkify::LinkFinder;
|
||||
@@ -128,6 +128,7 @@ pub fn escape_message(event: &Message) -> (String, Vec<Arc<dyn Rule>>) {
|
||||
let (censored, rules) = moderate_message(&message);
|
||||
|
||||
log::debug!("Escaped and normalized message: {censored:?}");
|
||||
log::debug!("Rules broken: {rules:?}");
|
||||
|
||||
(censored, rules)
|
||||
}
|
||||
@@ -377,7 +378,7 @@ pub enum Action {
|
||||
|
||||
/// Trait implemented by all rules.
|
||||
#[allow(dead_code)]
|
||||
pub trait Rule: Send + Sync {
|
||||
pub trait Rule: Send + Sync + Debug {
|
||||
/// The rule's human-readable name.
|
||||
fn name(&self) -> &'static str;
|
||||
|
||||
@@ -447,6 +448,7 @@ fn find_with_exceptions(message: &str, pattern: &Regex, exceptions: &[String]) -
|
||||
.collect()
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct HateSpeechAndSlursRule {
|
||||
pattern: Regex,
|
||||
exceptions: Vec<String>,
|
||||
@@ -483,6 +485,7 @@ impl Rule for HateSpeechAndSlursRule {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct ThreatsAndSelfHarmRule {
|
||||
pattern: Regex,
|
||||
exceptions: Vec<String>,
|
||||
@@ -519,6 +522,7 @@ impl Rule for ThreatsAndSelfHarmRule {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct ExplicitSexualLanguageRule {
|
||||
pattern: Regex,
|
||||
exceptions: Vec<String>,
|
||||
@@ -555,6 +559,7 @@ impl Rule for ExplicitSexualLanguageRule {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct ExplicitSexualLanguageTypoRule {
|
||||
pattern: Regex,
|
||||
exceptions: Vec<String>,
|
||||
@@ -591,6 +596,7 @@ impl Rule for ExplicitSexualLanguageTypoRule {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct SuggestiveLanguageRule {
|
||||
pattern: Regex,
|
||||
exceptions: Vec<String>,
|
||||
@@ -627,6 +633,7 @@ impl Rule for SuggestiveLanguageRule {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct AdvertisingRule;
|
||||
|
||||
impl Rule for AdvertisingRule {
|
||||
@@ -656,6 +663,7 @@ impl Rule for AdvertisingRule {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct SensitiveTopicsAndTriggeringContentRule {
|
||||
pattern: Regex,
|
||||
exceptions: Vec<String>,
|
||||
@@ -693,6 +701,7 @@ impl Rule for SensitiveTopicsAndTriggeringContentRule {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct MildSwearWordsRule {
|
||||
pattern: Regex,
|
||||
exceptions: Vec<String>,
|
||||
@@ -728,6 +737,7 @@ impl Rule for MildSwearWordsRule {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct CasualInsultsAndTeasing {
|
||||
pattern: Regex,
|
||||
exceptions: Vec<String>,
|
||||
@@ -763,7 +773,7 @@ impl Rule for CasualInsultsAndTeasing {
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct LinksRule;
|
||||
|
||||
impl Rule for LinksRule {
|
||||
|
||||
Reference in New Issue
Block a user