Skip to content

Commit 061aa35

Browse files
authored
Merge pull request #296 from Rustmail/37-improve-log-display
feat(logs): improve logs display
2 parents 2511ecd + 7d869bf commit 061aa35

25 files changed

Lines changed: 3018 additions & 177 deletions
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
use super::{format_change_value, EmbedField};
2+
use crate::handlers::audit_log::{
3+
AuditLogContext, AuditLogFormatter, COLOR_DANGER, COLOR_INFO, COLOR_SUCCESS, COLOR_WARNING,
4+
};
5+
use serenity::all::AutoModAction;
6+
7+
pub struct AutoModFormatter(pub AutoModAction);
8+
9+
#[async_trait::async_trait]
10+
impl AuditLogFormatter for AutoModFormatter {
11+
fn emoji(&self) -> &'static str {
12+
match self.0 {
13+
AutoModAction::RuleCreate => "🛡️",
14+
AutoModAction::RuleUpdate => "✏️",
15+
AutoModAction::RuleDelete => "🗑️",
16+
AutoModAction::BlockMessage => "🚫",
17+
AutoModAction::FlagToChannel => "🚩",
18+
AutoModAction::UserCommunicationDisabled => "🔇",
19+
_ => "🛡️",
20+
}
21+
}
22+
23+
fn color(&self) -> u32 {
24+
match self.0 {
25+
AutoModAction::RuleCreate => COLOR_SUCCESS,
26+
AutoModAction::RuleUpdate => COLOR_WARNING,
27+
AutoModAction::RuleDelete => COLOR_DANGER,
28+
AutoModAction::BlockMessage => COLOR_DANGER,
29+
AutoModAction::FlagToChannel => COLOR_WARNING,
30+
AutoModAction::UserCommunicationDisabled => COLOR_INFO,
31+
_ => COLOR_INFO,
32+
}
33+
}
34+
35+
async fn title(&self, alc: &AuditLogContext<'_>) -> String {
36+
let key = match self.0 {
37+
AutoModAction::RuleCreate => "audit_log.automod.rule_create",
38+
AutoModAction::RuleUpdate => "audit_log.automod.rule_update",
39+
AutoModAction::RuleDelete => "audit_log.automod.rule_delete",
40+
AutoModAction::BlockMessage => "audit_log.automod.block_message",
41+
AutoModAction::FlagToChannel => "audit_log.automod.flag_to_channel",
42+
AutoModAction::UserCommunicationDisabled => "audit_log.automod.user_timeout",
43+
_ => "audit_log.automod.unknown",
44+
};
45+
alc.translate(key, None).await
46+
}
47+
48+
async fn description(&self, alc: &AuditLogContext<'_>) -> String {
49+
let target_label = alc.translate("audit_log.target", None).await;
50+
51+
let target = if let Some(target_id) = alc.target_id() {
52+
match self.0 {
53+
AutoModAction::UserCommunicationDisabled => {
54+
format!("<@{}> (`{}`)", target_id, target_id)
55+
}
56+
_ => format!("`{}`", target_id),
57+
}
58+
} else {
59+
alc.translate("audit_log.unknown", None).await
60+
};
61+
62+
format!("**{}:** {}", target_label, target)
63+
}
64+
65+
async fn format_changes(&self, alc: &AuditLogContext<'_>) -> Vec<EmbedField> {
66+
let mut fields = Vec::new();
67+
for change in alc.changes() {
68+
if let Some(field) = format_change_value(alc, change).await {
69+
fields.push(field);
70+
}
71+
}
72+
fields
73+
}
74+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
use super::{format_change_value, EmbedField};
2+
use crate::handlers::audit_log::{
3+
AuditLogContext, AuditLogFormatter, COLOR_DANGER, COLOR_SUCCESS, COLOR_WARNING,
4+
};
5+
use serenity::all::ChannelAction;
6+
7+
pub struct ChannelFormatter(pub ChannelAction);
8+
9+
#[async_trait::async_trait]
10+
impl AuditLogFormatter for ChannelFormatter {
11+
fn emoji(&self) -> &'static str {
12+
match self.0 {
13+
ChannelAction::Create => "📁",
14+
ChannelAction::Update => "✏️",
15+
ChannelAction::Delete => "🗑️",
16+
_ => "📁",
17+
}
18+
}
19+
20+
fn color(&self) -> u32 {
21+
match self.0 {
22+
ChannelAction::Create => COLOR_SUCCESS,
23+
ChannelAction::Update => COLOR_WARNING,
24+
ChannelAction::Delete => COLOR_DANGER,
25+
_ => COLOR_WARNING,
26+
}
27+
}
28+
29+
async fn title(&self, alc: &AuditLogContext<'_>) -> String {
30+
let key = match self.0 {
31+
ChannelAction::Create => "audit_log.channel.create",
32+
ChannelAction::Update => "audit_log.channel.update",
33+
ChannelAction::Delete => "audit_log.channel.delete",
34+
_ => "audit_log.channel.unknown",
35+
};
36+
alc.translate(key, None).await
37+
}
38+
39+
async fn description(&self, alc: &AuditLogContext<'_>) -> String {
40+
let target_label = alc.translate("audit_log.target", None).await;
41+
42+
let target = if let Some(target_id) = alc.target_id() {
43+
match self.0 {
44+
ChannelAction::Delete => format!("`{}`", target_id),
45+
_ => format!("<#{}> (`{}`)", target_id, target_id),
46+
}
47+
} else {
48+
alc.translate("audit_log.unknown", None).await
49+
};
50+
51+
format!("**{}:** {}", target_label, target)
52+
}
53+
54+
async fn format_changes(&self, alc: &AuditLogContext<'_>) -> Vec<EmbedField> {
55+
let mut fields = Vec::new();
56+
for change in alc.changes() {
57+
if let Some(field) = format_change_value(alc, change).await {
58+
fields.push(field);
59+
}
60+
}
61+
fields
62+
}
63+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use super::{format_change_value, EmbedField};
2+
use crate::handlers::audit_log::{
3+
AuditLogContext, AuditLogFormatter, COLOR_DANGER, COLOR_SUCCESS, COLOR_WARNING,
4+
};
5+
use serenity::all::ChannelOverwriteAction;
6+
7+
pub struct ChannelOverwriteFormatter(pub ChannelOverwriteAction);
8+
9+
#[async_trait::async_trait]
10+
impl AuditLogFormatter for ChannelOverwriteFormatter {
11+
fn emoji(&self) -> &'static str {
12+
match self.0 {
13+
ChannelOverwriteAction::Create => "🔐",
14+
ChannelOverwriteAction::Update => "🔑",
15+
ChannelOverwriteAction::Delete => "🔓",
16+
_ => "🔐",
17+
}
18+
}
19+
20+
fn color(&self) -> u32 {
21+
match self.0 {
22+
ChannelOverwriteAction::Create => COLOR_SUCCESS,
23+
ChannelOverwriteAction::Update => COLOR_WARNING,
24+
ChannelOverwriteAction::Delete => COLOR_DANGER,
25+
_ => COLOR_WARNING,
26+
}
27+
}
28+
29+
async fn title(&self, alc: &AuditLogContext<'_>) -> String {
30+
let key = match self.0 {
31+
ChannelOverwriteAction::Create => "audit_log.channel_overwrite.create",
32+
ChannelOverwriteAction::Update => "audit_log.channel_overwrite.update",
33+
ChannelOverwriteAction::Delete => "audit_log.channel_overwrite.delete",
34+
_ => "audit_log.channel_overwrite.unknown",
35+
};
36+
alc.translate(key, None).await
37+
}
38+
39+
async fn description(&self, alc: &AuditLogContext<'_>) -> String {
40+
let target_label = alc.translate("audit_log.target", None).await;
41+
42+
let target = if let Some(target_id) = alc.target_id() {
43+
format!("<#{}> (`{}`)", target_id, target_id)
44+
} else {
45+
alc.translate("audit_log.unknown", None).await
46+
};
47+
48+
format!("**{}:** {}", target_label, target)
49+
}
50+
51+
async fn format_changes(&self, alc: &AuditLogContext<'_>) -> Vec<EmbedField> {
52+
let mut fields = Vec::new();
53+
for change in alc.changes() {
54+
if let Some(field) = format_change_value(alc, change).await {
55+
fields.push(field);
56+
}
57+
}
58+
fields
59+
}
60+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
use super::EmbedField;
2+
use crate::handlers::audit_log::{AuditLogContext, AuditLogFormatter, COLOR_SUCCESS};
3+
use serenity::all::CreatorMonetizationAction;
4+
5+
pub struct CreatorMonetizationFormatter(pub CreatorMonetizationAction);
6+
7+
#[async_trait::async_trait]
8+
impl AuditLogFormatter for CreatorMonetizationFormatter {
9+
fn emoji(&self) -> &'static str {
10+
match self.0 {
11+
CreatorMonetizationAction::RequestCreated => "💰",
12+
CreatorMonetizationAction::TermsAccepted => "✅",
13+
_ => "💰",
14+
}
15+
}
16+
17+
fn color(&self) -> u32 {
18+
COLOR_SUCCESS
19+
}
20+
21+
async fn title(&self, alc: &AuditLogContext<'_>) -> String {
22+
let key = match self.0 {
23+
CreatorMonetizationAction::RequestCreated => {
24+
"audit_log.creator_monetization.request_created"
25+
}
26+
CreatorMonetizationAction::TermsAccepted => {
27+
"audit_log.creator_monetization.terms_accepted"
28+
}
29+
_ => "audit_log.creator_monetization.unknown",
30+
};
31+
alc.translate(key, None).await
32+
}
33+
34+
async fn description(&self, _alc: &AuditLogContext<'_>) -> String {
35+
String::new()
36+
}
37+
38+
async fn format_changes(&self, _alc: &AuditLogContext<'_>) -> Vec<EmbedField> {
39+
Vec::new()
40+
}
41+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use super::{format_change_value, EmbedField};
2+
use crate::handlers::audit_log::{
3+
AuditLogContext, AuditLogFormatter, COLOR_DANGER, COLOR_SUCCESS, COLOR_WARNING,
4+
};
5+
use serenity::all::EmojiAction;
6+
7+
pub struct EmojiFormatter(pub EmojiAction);
8+
9+
#[async_trait::async_trait]
10+
impl AuditLogFormatter for EmojiFormatter {
11+
fn emoji(&self) -> &'static str {
12+
match self.0 {
13+
EmojiAction::Create => "😀",
14+
EmojiAction::Update => "✏️",
15+
EmojiAction::Delete => "🗑️",
16+
_ => "😀",
17+
}
18+
}
19+
20+
fn color(&self) -> u32 {
21+
match self.0 {
22+
EmojiAction::Create => COLOR_SUCCESS,
23+
EmojiAction::Update => COLOR_WARNING,
24+
EmojiAction::Delete => COLOR_DANGER,
25+
_ => COLOR_WARNING,
26+
}
27+
}
28+
29+
async fn title(&self, alc: &AuditLogContext<'_>) -> String {
30+
let key = match self.0 {
31+
EmojiAction::Create => "audit_log.emoji.create",
32+
EmojiAction::Update => "audit_log.emoji.update",
33+
EmojiAction::Delete => "audit_log.emoji.delete",
34+
_ => "audit_log.emoji.unknown",
35+
};
36+
alc.translate(key, None).await
37+
}
38+
39+
async fn description(&self, alc: &AuditLogContext<'_>) -> String {
40+
let target_label = alc.translate("audit_log.target", None).await;
41+
42+
let target = if let Some(target_id) = alc.target_id() {
43+
format!("`{}`", target_id)
44+
} else {
45+
alc.translate("audit_log.unknown", None).await
46+
};
47+
48+
format!("**{}:** {}", target_label, target)
49+
}
50+
51+
async fn format_changes(&self, alc: &AuditLogContext<'_>) -> Vec<EmbedField> {
52+
let mut fields = Vec::new();
53+
for change in alc.changes() {
54+
if let Some(field) = format_change_value(alc, change).await {
55+
fields.push(field);
56+
}
57+
}
58+
fields
59+
}
60+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use super::{format_change_value, EmbedField};
2+
use crate::handlers::audit_log::{AuditLogContext, AuditLogFormatter, COLOR_WARNING};
3+
4+
pub enum GuildFormatter {
5+
Update,
6+
}
7+
8+
#[async_trait::async_trait]
9+
impl AuditLogFormatter for GuildFormatter {
10+
fn emoji(&self) -> &'static str {
11+
"⚙️"
12+
}
13+
14+
fn color(&self) -> u32 {
15+
COLOR_WARNING
16+
}
17+
18+
async fn title(&self, alc: &AuditLogContext<'_>) -> String {
19+
alc.translate("audit_log.guild.update", None).await
20+
}
21+
22+
async fn description(&self, _alc: &AuditLogContext<'_>) -> String {
23+
String::new()
24+
}
25+
26+
async fn format_changes(&self, alc: &AuditLogContext<'_>) -> Vec<EmbedField> {
27+
let mut fields = Vec::new();
28+
for change in alc.changes() {
29+
if let Some(field) = format_change_value(alc, change).await {
30+
fields.push(field);
31+
}
32+
}
33+
fields
34+
}
35+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use super::{format_change_value, EmbedField};
2+
use crate::handlers::audit_log::{
3+
AuditLogContext, AuditLogFormatter, COLOR_DANGER, COLOR_SUCCESS, COLOR_WARNING,
4+
};
5+
use serenity::all::IntegrationAction;
6+
7+
pub struct IntegrationFormatter(pub IntegrationAction);
8+
9+
#[async_trait::async_trait]
10+
impl AuditLogFormatter for IntegrationFormatter {
11+
fn emoji(&self) -> &'static str {
12+
match self.0 {
13+
IntegrationAction::Create => "🔗",
14+
IntegrationAction::Update => "✏️",
15+
IntegrationAction::Delete => "🗑️",
16+
_ => "🔗",
17+
}
18+
}
19+
20+
fn color(&self) -> u32 {
21+
match self.0 {
22+
IntegrationAction::Create => COLOR_SUCCESS,
23+
IntegrationAction::Update => COLOR_WARNING,
24+
IntegrationAction::Delete => COLOR_DANGER,
25+
_ => COLOR_WARNING,
26+
}
27+
}
28+
29+
async fn title(&self, alc: &AuditLogContext<'_>) -> String {
30+
let key = match self.0 {
31+
IntegrationAction::Create => "audit_log.integration.create",
32+
IntegrationAction::Update => "audit_log.integration.update",
33+
IntegrationAction::Delete => "audit_log.integration.delete",
34+
_ => "audit_log.integration.unknown",
35+
};
36+
alc.translate(key, None).await
37+
}
38+
39+
async fn description(&self, alc: &AuditLogContext<'_>) -> String {
40+
let target_label = alc.translate("audit_log.target", None).await;
41+
42+
let target = if let Some(target_id) = alc.target_id() {
43+
format!("`{}`", target_id)
44+
} else {
45+
alc.translate("audit_log.unknown", None).await
46+
};
47+
48+
format!("**{}:** {}", target_label, target)
49+
}
50+
51+
async fn format_changes(&self, alc: &AuditLogContext<'_>) -> Vec<EmbedField> {
52+
let mut fields = Vec::new();
53+
for change in alc.changes() {
54+
if let Some(field) = format_change_value(alc, change).await {
55+
fields.push(field);
56+
}
57+
}
58+
fields
59+
}
60+
}

0 commit comments

Comments
 (0)