Skip to content

Commit dc982b6

Browse files
authored
Merge pull request #264 from Rustmail/262-logs-tickets-channel
feat(logs): add logs when closing tickets
2 parents 9ab4982 + 45d8466 commit dc982b6

7 files changed

Lines changed: 194 additions & 0 deletions

File tree

rustmail/src/commands/close/slash_command/close.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,35 @@ impl RegistrableCommand for CloseCommand {
362362
.await?;
363363
let _ = delete_scheduled_closure(&thread.id, db_pool).await;
364364

365+
if config.bot.enable_logs {
366+
if let Some(logs_channel_id) = config.bot.logs_channel_id {
367+
let base_url = config
368+
.bot
369+
.redirect_url
370+
.trim_end_matches("/api/auth/callback")
371+
.trim_end_matches('/');
372+
373+
let panel_url = format!("{}/panel/tickets/{}", base_url, thread.id);
374+
375+
let mut params = HashMap::new();
376+
params.insert("username".to_string(), thread.user_name.clone());
377+
params.insert("user_id".to_string(), thread.user_id.to_string());
378+
params.insert("panel_url".to_string(), panel_url);
379+
380+
let _ = MessageBuilder::system_message(&ctx, &config)
381+
.translated_content(
382+
"logs.ticket_closed",
383+
Some(&params),
384+
Some(command.user.id),
385+
command.guild_id.map(|g| g.get()),
386+
)
387+
.await
388+
.to_channel(serenity::all::ChannelId::new(logs_channel_id))
389+
.send(true)
390+
.await;
391+
}
392+
}
393+
365394
let _ = command.channel_id.delete(&ctx.http).await?;
366395

367396
Ok(())

rustmail/src/commands/close/text_command/close.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,35 @@ pub async fn close(
284284
.await?;
285285
let _ = delete_scheduled_closure(&thread.id, db_pool).await;
286286

287+
if config.bot.enable_logs {
288+
if let Some(logs_channel_id) = config.bot.logs_channel_id {
289+
let base_url = config
290+
.bot
291+
.redirect_url
292+
.trim_end_matches("/api/auth/callback")
293+
.trim_end_matches('/');
294+
295+
let panel_url = format!("{}/panel/tickets/{}", base_url, thread.id);
296+
297+
let mut params = HashMap::new();
298+
params.insert("username".to_string(), thread.user_name.clone());
299+
params.insert("user_id".to_string(), thread.user_id.to_string());
300+
params.insert("panel_url".to_string(), panel_url);
301+
302+
let _ = MessageBuilder::system_message(&ctx, config)
303+
.translated_content(
304+
"logs.ticket_closed",
305+
Some(&params),
306+
Some(msg.author.id),
307+
msg.guild_id.map(|g| g.get()),
308+
)
309+
.await
310+
.to_channel(serenity::all::ChannelId::new(logs_channel_id))
311+
.send(true)
312+
.await;
313+
}
314+
}
315+
287316
let _ = msg.channel_id.delete(&ctx.http).await?;
288317

289318
Ok(())

rustmail/src/commands/force_close/slash_command/force_close.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::prelude::db::*;
44
use crate::prelude::errors::*;
55
use crate::prelude::handlers::*;
66
use crate::prelude::i18n::*;
7+
use crate::prelude::utils::*;
78
use serenity::FutureExt;
89
use serenity::all::{CommandInteraction, Context, CreateCommand, ResolvedOption};
910
use std::sync::Arc;
@@ -82,11 +83,48 @@ impl RegistrableCommand for ForceCloseCommand {
8283
}
8384
}
8485

86+
let thread = get_thread_by_channel_id(&command.channel_id.to_string(), db_pool).await;
87+
8588
match is_orphaned_thread_channel(command.channel_id, db_pool).await {
8689
Ok(res) => {
8790
if !res {
8891
return Err(ModmailError::Thread(ThreadError::UserStillInServer));
8992
}
93+
94+
if let Some(thread_info) = thread {
95+
if config.bot.enable_logs {
96+
if let Some(logs_channel_id) = config.bot.logs_channel_id {
97+
let base_url = config
98+
.bot
99+
.redirect_url
100+
.trim_end_matches("/api/auth/callback")
101+
.trim_end_matches('/');
102+
103+
let panel_url =
104+
format!("{}/panel/tickets/{}", base_url, thread_info.id);
105+
106+
let mut params = std::collections::HashMap::new();
107+
params
108+
.insert("username".to_string(), thread_info.user_name.clone());
109+
params
110+
.insert("user_id".to_string(), thread_info.user_id.to_string());
111+
params.insert("panel_url".to_string(), panel_url);
112+
113+
let _ = MessageBuilder::system_message(&ctx, &config)
114+
.translated_content(
115+
"logs.ticket_closed",
116+
Some(&params),
117+
Some(command.user.id),
118+
command.guild_id.map(|g| g.get()),
119+
)
120+
.await
121+
.to_channel(serenity::all::ChannelId::new(logs_channel_id))
122+
.send(true)
123+
.await;
124+
}
125+
}
126+
}
127+
90128
delete_channel(&ctx, command.channel_id).await
91129
}
92130
Err(..) => Err(ModmailError::Database(DatabaseError::QueryFailed(

rustmail/src/commands/force_close/text_command/force_close.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::prelude::config::*;
33
use crate::prelude::db::*;
44
use crate::prelude::errors::*;
55
use crate::prelude::handlers::*;
6+
use crate::prelude::utils::*;
67
use serenity::all::{Context, Message};
78
use std::sync::Arc;
89

@@ -26,11 +27,45 @@ pub async fn force_close(
2627
};
2728
}
2829

30+
let thread = get_thread_by_channel_id(&msg.channel_id.to_string(), db_pool).await;
31+
2932
match is_orphaned_thread_channel(msg.channel_id, db_pool).await {
3033
Ok(res) => {
3134
if !res {
3235
return Err(ModmailError::Thread(ThreadError::UserStillInServer));
3336
}
37+
38+
if let Some(thread_info) = thread {
39+
if config.bot.enable_logs {
40+
if let Some(logs_channel_id) = config.bot.logs_channel_id {
41+
let base_url = config
42+
.bot
43+
.redirect_url
44+
.trim_end_matches("/api/auth/callback")
45+
.trim_end_matches('/');
46+
47+
let panel_url = format!("{}/panel/tickets/{}", base_url, thread_info.id);
48+
49+
let mut params = std::collections::HashMap::new();
50+
params.insert("username".to_string(), thread_info.user_name.clone());
51+
params.insert("user_id".to_string(), thread_info.user_id.to_string());
52+
params.insert("panel_url".to_string(), panel_url);
53+
54+
let _ = MessageBuilder::system_message(&ctx, config)
55+
.translated_content(
56+
"logs.ticket_closed",
57+
Some(&params),
58+
Some(msg.author.id),
59+
msg.guild_id.map(|g| g.get()),
60+
)
61+
.await
62+
.to_channel(serenity::all::ChannelId::new(logs_channel_id))
63+
.send(true)
64+
.await;
65+
}
66+
}
67+
}
68+
3469
delete_channel(&ctx, msg.channel_id).await
3570
}
3671
Err(..) => Err(ModmailError::Database(DatabaseError::QueryFailed(

rustmail/src/i18n/language/en.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,10 @@ pub fn load_english_messages(dict: &mut ErrorDictionary) {
638638
"close.silent_closing".to_string(),
639639
DictionaryMessage::new("This ticket will be closed silently in {time}."),
640640
);
641+
dict.messages.insert(
642+
"logs.ticket_closed".to_string(),
643+
DictionaryMessage::new("Ticket closed for user **{username}** (ID: {user_id})\n[View log on panel]({panel_url})"),
644+
);
641645
dict.messages.insert(
642646
"feature.not_implemented".to_string(),
643647
DictionaryMessage::new("This feature is not yet implemented."),

rustmail/src/i18n/language/fr.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,10 @@ pub fn load_french_messages(dict: &mut ErrorDictionary) {
660660
"close.silent_closing".to_string(),
661661
DictionaryMessage::new("Ce ticket sera fermé silencieusement dans {time}."),
662662
);
663+
dict.messages.insert(
664+
"logs.ticket_closed".to_string(),
665+
DictionaryMessage::new("Ticket fermé pour l'utilisateur **{username}** (ID: {user_id})\n[Voir le log sur le panel]({panel_url})"),
666+
);
663667
dict.messages.insert(
664668
"feature.not_implemented".to_string(),
665669
DictionaryMessage::new("Cette feature n'est pas encore implémentée."),

rustmail/src/modules/scheduled_closures.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,36 @@ pub fn schedule_one(ctx: &Context, config: &Config, thread_id: String, close_at:
3333
)
3434
.await;
3535
let _ = delete_scheduled_closure(&thread_id, pool).await;
36+
37+
if config_clone.bot.enable_logs {
38+
if let Some(logs_channel_id) = config_clone.bot.logs_channel_id {
39+
let base_url = config_clone
40+
.bot
41+
.redirect_url
42+
.trim_end_matches("/api/auth/callback")
43+
.trim_end_matches('/');
44+
45+
let panel_url = format!("{}/panel/tickets/{}", base_url, thread.id);
46+
47+
let mut params = std::collections::HashMap::new();
48+
params.insert("username".to_string(), thread.user_name.clone());
49+
params.insert("user_id".to_string(), thread.user_id.to_string());
50+
params.insert("panel_url".to_string(), panel_url);
51+
52+
let _ = MessageBuilder::system_message(&ctx_clone, &config_clone)
53+
.translated_content(
54+
"logs.ticket_closed",
55+
Some(&params),
56+
None,
57+
None,
58+
)
59+
.await
60+
.to_channel(ChannelId::new(logs_channel_id))
61+
.send(true)
62+
.await;
63+
}
64+
}
65+
3666
if !current.silent {
3767
let _ = MessageBuilder::system_message(&ctx_clone, &config_clone)
3868
.content(&config_clone.bot.close_message)
@@ -85,6 +115,31 @@ pub async fn hydrate_scheduled_closures(ctx: &Context, config: &Config) {
85115
)
86116
.await;
87117
let _ = delete_scheduled_closure(&thread.id, pool).await;
118+
119+
if config.bot.enable_logs {
120+
if let Some(logs_channel_id) = config.bot.logs_channel_id {
121+
let base_url = config
122+
.bot
123+
.redirect_url
124+
.trim_end_matches("/api/auth/callback")
125+
.trim_end_matches('/');
126+
127+
let panel_url = format!("{}/panel/tickets/{}", base_url, thread.id);
128+
129+
let mut params = std::collections::HashMap::new();
130+
params.insert("username".to_string(), thread.user_name.clone());
131+
params.insert("user_id".to_string(), thread.user_id.to_string());
132+
params.insert("panel_url".to_string(), panel_url);
133+
134+
let _ = MessageBuilder::system_message(ctx, config)
135+
.translated_content("logs.ticket_closed", Some(&params), None, None)
136+
.await
137+
.to_channel(ChannelId::new(logs_channel_id))
138+
.send(true)
139+
.await;
140+
}
141+
}
142+
88143
if !sc.silent {
89144
let _ = MessageBuilder::system_message(ctx, config)
90145
.content(&config.bot.close_message)

0 commit comments

Comments
 (0)