Abstract user penalization
This commit is contained in:
@@ -1,15 +1,13 @@
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use twilight_model::{
|
use twilight_model::{channel::message::Embed, oauth::Application};
|
||||||
channel::{Message, message::Embed},
|
|
||||||
oauth::Application,
|
|
||||||
};
|
|
||||||
use twilight_util::builder::embed::{
|
use twilight_util::builder::embed::{
|
||||||
EmbedAuthorBuilder, EmbedBuilder, EmbedFieldBuilder, EmbedFooterBuilder, ImageSource,
|
EmbedAuthorBuilder, EmbedBuilder, EmbedFieldBuilder, EmbedFooterBuilder, ImageSource,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
constants::{COLOR_RED, COLOR_YELLOW},
|
constants::{COLOR_RED, COLOR_YELLOW},
|
||||||
|
database::models::Message,
|
||||||
discord::images,
|
discord::images,
|
||||||
groups::calls::moderation::Rule,
|
groups::calls::moderation::Rule,
|
||||||
utils::ellipse,
|
utils::ellipse,
|
||||||
@@ -35,7 +33,7 @@ pub fn first_warning_embed(
|
|||||||
)
|
)
|
||||||
.title("Warning")
|
.title("Warning")
|
||||||
.description("You broke [Payphone's code of conduct](https://payphone.lat/code-of-conduct) during a call. Read the code of conduct to prevent getting banned.")
|
.description("You broke [Payphone's code of conduct](https://payphone.lat/code-of-conduct) during a call. Read the code of conduct to prevent getting banned.")
|
||||||
.field(EmbedFieldBuilder::new("What message broke the rules?", ellipse(message.content.clone(), 500)))
|
.field(EmbedFieldBuilder::new("What message broke the rules?", ellipse(message.data.content.clone(), 500)))
|
||||||
.field(EmbedFieldBuilder::new(
|
.field(EmbedFieldBuilder::new(
|
||||||
"What rules did you break?",
|
"What rules did you break?",
|
||||||
rules_broken
|
rules_broken
|
||||||
@@ -78,7 +76,7 @@ pub fn repeat_warning_embed(
|
|||||||
)
|
)
|
||||||
.title("Long Time no See!")
|
.title("Long Time no See!")
|
||||||
.description("You broke [Payphone's code of conduct](https://payphone.lat/code-of-conduct) during a call. It's not your first offense, yet you've gone for a long time with a good record so we're making this a warning instead. In case you've forgotten the rules, consider this a reminder to re-read them.")
|
.description("You broke [Payphone's code of conduct](https://payphone.lat/code-of-conduct) during a call. It's not your first offense, yet you've gone for a long time with a good record so we're making this a warning instead. In case you've forgotten the rules, consider this a reminder to re-read them.")
|
||||||
.field(EmbedFieldBuilder::new("What message broke the rules?", ellipse(message.content.clone(), 500)))
|
.field(EmbedFieldBuilder::new("What message broke the rules?", ellipse(message.data.content.clone(), 500)))
|
||||||
.field(EmbedFieldBuilder::new(
|
.field(EmbedFieldBuilder::new(
|
||||||
"What rules did you break?",
|
"What rules did you break?",
|
||||||
rules_broken
|
rules_broken
|
||||||
@@ -121,7 +119,7 @@ pub fn first_ban_embed(
|
|||||||
)
|
)
|
||||||
.title("Banned")
|
.title("Banned")
|
||||||
.description("You broke [Payphone's code of conduct](https://payphone.lat/code-of-conduct) during a call. This is your first offense, and as such, you are being issued a ban. This ban will last for 24 hours, next one will be permanent.")
|
.description("You broke [Payphone's code of conduct](https://payphone.lat/code-of-conduct) during a call. This is your first offense, and as such, you are being issued a ban. This ban will last for 24 hours, next one will be permanent.")
|
||||||
.field(EmbedFieldBuilder::new("What message broke the rules?", ellipse(message.content.clone(), 500)))
|
.field(EmbedFieldBuilder::new("What message broke the rules?", ellipse(message.data.content.clone(), 500)))
|
||||||
.field(EmbedFieldBuilder::new(
|
.field(EmbedFieldBuilder::new(
|
||||||
"What rules did you break?",
|
"What rules did you break?",
|
||||||
rules_broken
|
rules_broken
|
||||||
@@ -164,7 +162,7 @@ pub fn final_ban_embed(
|
|||||||
)
|
)
|
||||||
.title("Permanently Banned")
|
.title("Permanently Banned")
|
||||||
.description("You broke [Payphone's code of conduct](https://payphone.lat/code-of-conduct) during a call. This is your final offense, and as such, you are being issued a permanent ban.")
|
.description("You broke [Payphone's code of conduct](https://payphone.lat/code-of-conduct) during a call. This is your final offense, and as such, you are being issued a permanent ban.")
|
||||||
.field(EmbedFieldBuilder::new("What message broke the rules?", ellipse(message.content.clone(), 500)))
|
.field(EmbedFieldBuilder::new("What message broke the rules?", ellipse(message.data.content.clone(), 500)))
|
||||||
.field(EmbedFieldBuilder::new(
|
.field(EmbedFieldBuilder::new(
|
||||||
"What rules did you break?",
|
"What rules did you break?",
|
||||||
rules_broken
|
rules_broken
|
||||||
|
|||||||
+58
-47
@@ -1,4 +1,4 @@
|
|||||||
use std::sync::Arc;
|
use std::{error::Error, sync::Arc};
|
||||||
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
@@ -15,16 +15,16 @@ use crate::{
|
|||||||
groups::calls::{
|
groups::calls::{
|
||||||
components::{CodeOfConductButton, NeedHelpButton},
|
components::{CodeOfConductButton, NeedHelpButton},
|
||||||
embeds, get_display_profile,
|
embeds, get_display_profile,
|
||||||
moderation::{Action, escape_message},
|
moderation::{Action, Rule, escape_message},
|
||||||
},
|
},
|
||||||
state::State,
|
state::State,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct MessageRedirector;
|
pub struct CallMessageHandler;
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl OnMessageHandler<State> for MessageRedirector {
|
impl OnMessageHandler<State> for CallMessageHandler {
|
||||||
async fn on_message(&self, event: &MessageCreate, rt: Arc<Runtime<State>>) -> EventResult {
|
async fn on_message(&self, event: &MessageCreate, rt: Arc<Runtime<State>>) -> EventResult {
|
||||||
if event.author.bot || event.author.system.unwrap_or(false) {
|
if event.author.bot || event.author.system.unwrap_or(false) {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@@ -142,23 +142,6 @@ impl OnMessageHandler<State> for MessageRedirector {
|
|||||||
user
|
user
|
||||||
};
|
};
|
||||||
|
|
||||||
let reason = format!(
|
|
||||||
"You broke the following rules during a call:\n{}",
|
|
||||||
rules
|
|
||||||
.iter()
|
|
||||||
.map(|rule| format!("- {}", rule.name()))
|
|
||||||
.join("\n")
|
|
||||||
);
|
|
||||||
|
|
||||||
let new_incident = user
|
|
||||||
.incident(
|
|
||||||
reason.clone(),
|
|
||||||
message.data.clone(),
|
|
||||||
Some(event.author.id.get()),
|
|
||||||
&rt.state.db,
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
rt.http
|
rt.http
|
||||||
.create_message(event.channel_id)
|
.create_message(event.channel_id)
|
||||||
.content(
|
.content(
|
||||||
@@ -174,32 +157,7 @@ impl OnMessageHandler<State> for MessageRedirector {
|
|||||||
))
|
))
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let dm_channel = rt
|
penalize_user(user, message, rules, &rt).await?;
|
||||||
.http
|
|
||||||
.create_private_channel(event.author.id)
|
|
||||||
.await?
|
|
||||||
.model()
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let embed = if new_incident.is_first_incident {
|
|
||||||
embeds::first_warning_embed(&rt.app, &event.0, rules)
|
|
||||||
} else if new_incident.counting_incidents == 0 {
|
|
||||||
embeds::repeat_warning_embed(&rt.app, &event.0, rules)
|
|
||||||
} else if new_incident.counting_incidents == 1 {
|
|
||||||
embeds::first_ban_embed(&rt.app, &event.0, rules)
|
|
||||||
} else {
|
|
||||||
embeds::final_ban_embed(&rt.app, &event.0, rules)
|
|
||||||
};
|
|
||||||
|
|
||||||
rt.http
|
|
||||||
.create_message(dm_channel.id)
|
|
||||||
.embeds(&[embed])
|
|
||||||
.components(&[ActionRow::new(&[
|
|
||||||
(None, Arc::new(CodeOfConductButton)),
|
|
||||||
(None, Arc::new(NeedHelpButton)),
|
|
||||||
])
|
|
||||||
.build()])
|
|
||||||
.await?;
|
|
||||||
} else {
|
} else {
|
||||||
rt.http
|
rt.http
|
||||||
.execute_webhook(Id::new(webhook_id), &webhook_token)
|
.execute_webhook(Id::new(webhook_id), &webhook_token)
|
||||||
@@ -220,3 +178,56 @@ impl OnMessageHandler<State> for MessageRedirector {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn penalize_user(
|
||||||
|
user: User,
|
||||||
|
message: Message,
|
||||||
|
broken_rules: Vec<Arc<dyn Rule>>,
|
||||||
|
rt: &Runtime<State>,
|
||||||
|
) -> Result<(), Box<dyn Error>> {
|
||||||
|
let reason = format!(
|
||||||
|
"You broke the following rules during a call:\n{}",
|
||||||
|
broken_rules
|
||||||
|
.iter()
|
||||||
|
.map(|rule| format!("- {}", rule.name()))
|
||||||
|
.join("\n")
|
||||||
|
);
|
||||||
|
|
||||||
|
let new_incident = user
|
||||||
|
.incident(
|
||||||
|
reason.clone(),
|
||||||
|
message.data.clone(),
|
||||||
|
Some(user.id),
|
||||||
|
&rt.state.db,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let dm_channel = rt
|
||||||
|
.http
|
||||||
|
.create_private_channel(Id::new(user.id))
|
||||||
|
.await?
|
||||||
|
.model()
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let embed = if new_incident.is_first_incident {
|
||||||
|
embeds::first_warning_embed(&rt.app, &message, broken_rules)
|
||||||
|
} else if new_incident.counting_incidents == 0 {
|
||||||
|
embeds::repeat_warning_embed(&rt.app, &message, broken_rules)
|
||||||
|
} else if new_incident.counting_incidents == 1 {
|
||||||
|
embeds::first_ban_embed(&rt.app, &message, broken_rules)
|
||||||
|
} else {
|
||||||
|
embeds::final_ban_embed(&rt.app, &message, broken_rules)
|
||||||
|
};
|
||||||
|
|
||||||
|
rt.http
|
||||||
|
.create_message(dm_channel.id)
|
||||||
|
.embeds(&[embed])
|
||||||
|
.components(&[ActionRow::new(&[
|
||||||
|
(None, Arc::new(CodeOfConductButton)),
|
||||||
|
(None, Arc::new(NeedHelpButton)),
|
||||||
|
])
|
||||||
|
.build()])
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|||||||
+2
-2
@@ -127,7 +127,7 @@ use crate::{
|
|||||||
about::{commands::HelpCommand, components::HelpGoBackButton},
|
about::{commands::HelpCommand, components::HelpGoBackButton},
|
||||||
calls::{
|
calls::{
|
||||||
commands::{CallCommand, FriendRequestCommand, HangupCommand, SkipCommand},
|
commands::{CallCommand, FriendRequestCommand, HangupCommand, SkipCommand},
|
||||||
events::MessageRedirector,
|
events::CallMessageHandler,
|
||||||
},
|
},
|
||||||
gateway::events::{ReadyHandler, ReconnectHandler},
|
gateway::events::{ReadyHandler, ReconnectHandler},
|
||||||
servers::{
|
servers::{
|
||||||
@@ -232,7 +232,7 @@ async fn start(token: String, database_addr: String, shard: ShardId) {
|
|||||||
.component(HelpGoBackButton)
|
.component(HelpGoBackButton)
|
||||||
.on_ready(ReadyHandler)
|
.on_ready(ReadyHandler)
|
||||||
.on_reconnect(ReconnectHandler)
|
.on_reconnect(ReconnectHandler)
|
||||||
.on_message(MessageRedirector)
|
.on_message(CallMessageHandler)
|
||||||
.on_server_create(ServerCreateHandler)
|
.on_server_create(ServerCreateHandler)
|
||||||
.on_server_update(ServerUpdateHandler)
|
.on_server_update(ServerUpdateHandler)
|
||||||
.on_server_delete(ServerDeleteHandler);
|
.on_server_delete(ServerDeleteHandler);
|
||||||
|
|||||||
Reference in New Issue
Block a user