2022-04-18 10:52:03 +00:00
using System ;
2022-02-21 08:40:09 +00:00
using System.Collections.Generic ;
2024-12-26 05:36:20 +00:00
using System.ComponentModel ;
2022-02-21 08:40:09 +00:00
using System.IO ;
using System.Threading.Tasks ;
2024-12-26 05:36:20 +00:00
using DSharpPlus.Commands ;
using DSharpPlus.Commands.ContextChecks ;
using DSharpPlus.Commands.Processors.SlashCommands ;
2022-02-21 08:40:09 +00:00
using DSharpPlus.Entities ;
using DSharpPlus.Exceptions ;
2022-08-21 07:34:11 +00:00
namespace SupportChild.Commands ;
2024-12-26 05:36:20 +00:00
public class TranscriptCommand
2022-02-21 08:40:09 +00:00
{
2024-12-27 03:58:26 +00:00
// TODO: Refactor the hell out of this
2024-12-26 05:36:20 +00:00
[RequireGuild]
[Command("transcript")]
[Description("Creates a transcript of a ticket.")]
public async Task OnExecute ( SlashCommandContext command , [ Parameter ( "ticket-id" ) ] [ Description ( "(Optional) Ticket number to get transcript of." ) ] long ticketID = 0 )
2024-10-29 09:10:37 +00:00
{
2024-12-26 05:36:20 +00:00
await command . DeferResponseAsync ( true ) ;
2024-10-29 09:10:37 +00:00
Database . Ticket ticket ;
if ( ticketID = = 0 ) // If there are no arguments use current channel
{
if ( Database . TryGetOpenTicket ( command . Channel . Id , out ticket ) )
{
try
{
await Transcriber . ExecuteAsync ( command . Channel . Id , ticket . id ) ;
}
catch ( Exception )
{
await command . EditResponseAsync ( new DiscordWebhookBuilder ( ) . AddEmbed ( new DiscordEmbedBuilder
{
Color = DiscordColor . Red ,
Description = "ERROR: Could not save transcript file. Aborting..."
} ) ) ;
throw ;
}
}
else
{
await command . EditResponseAsync ( new DiscordWebhookBuilder ( ) . AddEmbed ( new DiscordEmbedBuilder
{
Color = DiscordColor . Red ,
Description = "This channel is not a ticket."
} ) ) ;
return ;
}
}
else
{
// If the ticket is still open, generate a new fresh transcript
if ( Database . TryGetOpenTicketByID ( ( uint ) ticketID , out ticket ) & & ticket ? . creatorID = = command . Member . Id )
{
try
{
await Transcriber . ExecuteAsync ( command . Channel . Id , ticket . id ) ;
}
catch ( Exception )
{
await command . EditResponseAsync ( new DiscordWebhookBuilder ( ) . AddEmbed ( new DiscordEmbedBuilder
{
Color = DiscordColor . Red ,
Description = "ERROR: Could not save transcript file. Aborting..."
} ) ) ;
throw ;
}
2022-02-21 08:40:09 +00:00
2024-10-29 09:10:37 +00:00
}
// If there is no open or closed ticket, send an error. If there is a closed ticket we will simply use the old transcript from when the ticket was closed.
else if ( ! Database . TryGetClosedTicket ( ( uint ) ticketID , out ticket ) | | ( ticket ? . creatorID ! = command . Member . Id & & ! Database . IsStaff ( command . Member . Id ) ) )
{
await command . EditResponseAsync ( new DiscordWebhookBuilder ( ) . AddEmbed ( new DiscordEmbedBuilder
{
Color = DiscordColor . Red ,
Description = "Could not find a closed ticket with that number which you opened.\n(Use the /list command to see all your tickets)"
} ) ) ;
return ;
}
}
2022-02-21 08:40:09 +00:00
2024-12-27 03:58:26 +00:00
string fileName = Transcriber . GetZipFilename ( ticket . id ) ;
string filePath = Transcriber . GetZipPath ( ticket . id ) ;
long zipSize = 0 ;
// If the zip transcript doesn't exist, use the html file.
try
{
2024-12-27 04:23:03 +00:00
FileInfo fileInfo = new FileInfo ( filePath ) ;
if ( ! fileInfo . Exists | | fileInfo . Length > = 26214400 )
2024-12-27 03:58:26 +00:00
{
fileName = Transcriber . GetHTMLFilename ( ticket . id ) ;
filePath = Transcriber . GetHtmlPath ( ticket . id ) ;
}
2024-12-27 04:23:03 +00:00
zipSize = fileInfo . Length ;
2024-12-27 03:58:26 +00:00
}
catch ( Exception e )
{
await command . EditResponseAsync ( new DiscordWebhookBuilder ( ) . AddEmbed ( new DiscordEmbedBuilder
{
Color = DiscordColor . Red ,
Description = "ERROR: Could not find transcript file. Aborting..."
} ) ) ;
Logger . Error ( "Failed to access transcript file:" , e ) ;
return ;
}
// Check if the chosen file path works.
if ( ! File . Exists ( filePath ) )
{
await command . EditResponseAsync ( new DiscordWebhookBuilder ( ) . AddEmbed ( new DiscordEmbedBuilder
{
Color = DiscordColor . Red ,
Description = "ERROR: Could not find transcript file. Aborting..."
} ) ) ;
Logger . Error ( "Transcript file does not exist: \"" + filePath + "\"" ) ;
return ;
}
2024-12-26 05:57:41 +00:00
try
2024-10-29 09:10:37 +00:00
{
2024-12-27 03:58:26 +00:00
await using FileStream file = new FileStream ( filePath , FileMode . Open , FileAccess . Read ) ;
2024-12-27 07:17:14 +00:00
await LogChannel . Success ( "Transcript generated by " + command . User . Mention + "." , ticket . id , new Utilities . File ( fileName , file ) ) ;
2024-10-29 09:10:37 +00:00
}
2024-12-27 07:17:14 +00:00
catch ( Exception e )
2024-12-26 05:57:41 +00:00
{
2024-12-27 07:17:14 +00:00
Logger . Error ( "Failed to log transcript generation." , e ) ;
2024-12-26 05:57:41 +00:00
}
2022-02-21 08:40:09 +00:00
2024-12-27 03:58:26 +00:00
if ( await SendDirectMessage ( command , fileName , filePath , zipSize , ticket . id ) )
{
await command . EditResponseAsync ( new DiscordWebhookBuilder ( ) . AddEmbed ( new DiscordEmbedBuilder
{
Color = DiscordColor . Green ,
Description = "Transcript sent!\n"
} ) ) ;
}
}
private static async Task < bool > SendDirectMessage ( SlashCommandContext command , string fileName , string filePath , long zipSize , uint ticketID )
{
2024-10-29 09:10:37 +00:00
try
{
// Send transcript in a direct message
2024-12-27 03:58:26 +00:00
await using FileStream file = new FileStream ( filePath , FileMode . Open , FileAccess . Read ) ;
2022-02-21 08:40:09 +00:00
2024-10-29 09:10:37 +00:00
DiscordMessageBuilder directMessage = new DiscordMessageBuilder ( ) ;
2024-12-27 03:58:26 +00:00
if ( zipSize > = 26214400 )
2024-10-29 09:10:37 +00:00
{
2024-12-27 03:58:26 +00:00
directMessage . AddEmbed ( new DiscordEmbedBuilder
{
Color = DiscordColor . Orange ,
Description = "Transcript generated.\n\nThe zip file is too large, sending only the HTML file. Ask an administrator for the zip if you need it." ,
Footer = new DiscordEmbedBuilder . EmbedFooter
{
Text = "Ticket: " + ticketID . ToString ( "00000" )
}
} ) ;
}
else
{
directMessage . AddEmbed ( new DiscordEmbedBuilder
{
Color = DiscordColor . Green ,
Description = "Transcript generated!\n" ,
Footer = new DiscordEmbedBuilder . EmbedFooter
{
Text = "Ticket: " + ticketID . ToString ( "00000" )
}
} ) ;
}
directMessage . AddFiles ( new Dictionary < string , Stream > { { fileName , file } } ) ;
2022-08-21 07:34:11 +00:00
2024-10-29 09:10:37 +00:00
await command . Member . SendMessageAsync ( directMessage ) ;
2024-12-27 03:58:26 +00:00
return true ;
2024-10-29 09:10:37 +00:00
}
catch ( UnauthorizedException )
{
await command . EditResponseAsync ( new DiscordWebhookBuilder ( ) . AddEmbed ( new DiscordEmbedBuilder
{
Color = DiscordColor . Red ,
Description = "Not allowed to send direct message to you, please check your privacy settings.\n"
} ) ) ;
2024-12-27 03:58:26 +00:00
return false ;
2024-10-29 09:10:37 +00:00
}
}
2022-05-19 11:38:59 +00:00
}