Refactor CLI and add 'exportdm' command to export all direct message channels

pull/145/head
Oleksii Holub 6 years ago
parent e22e1c03fb
commit 13925c69af

@ -37,7 +37,8 @@ namespace DiscordChatExporter.Cli
// Get all verb types // Get all verb types
var verbTypes = new[] var verbTypes = new[]
{ {
typeof(ExportChatOptions), typeof(ExportChannelOptions),
typeof(ExportDirectMessagesOptions),
typeof(ExportGuildOptions), typeof(ExportGuildOptions),
typeof(GetChannelsOptions), typeof(GetChannelsOptions),
typeof(GetDirectMessageChannelsOptions), typeof(GetDirectMessageChannelsOptions),
@ -48,7 +49,8 @@ namespace DiscordChatExporter.Cli
var parsedArgs = Parser.Default.ParseArguments(args, verbTypes); var parsedArgs = Parser.Default.ParseArguments(args, verbTypes);
// Execute commands // Execute commands
parsedArgs.WithParsed<ExportChatOptions>(o => new ExportChatVerb(o).Execute()); parsedArgs.WithParsed<ExportChannelOptions>(o => new ExportChannelVerb(o).Execute());
parsedArgs.WithParsed<ExportDirectMessagesOptions>(o => new ExportDirectMessagesVerb(o).Execute());
parsedArgs.WithParsed<ExportGuildOptions>(o => new ExportGuildVerb(o).Execute()); parsedArgs.WithParsed<ExportGuildOptions>(o => new ExportGuildVerb(o).Execute());
parsedArgs.WithParsed<GetChannelsOptions>(o => new GetChannelsVerb(o).Execute()); parsedArgs.WithParsed<GetChannelsOptions>(o => new GetChannelsVerb(o).Execute());
parsedArgs.WithParsed<GetDirectMessageChannelsOptions>(o => new GetDirectMessageChannelsVerb(o).Execute()); parsedArgs.WithParsed<GetDirectMessageChannelsOptions>(o => new GetDirectMessageChannelsVerb(o).Execute());

@ -7,9 +7,9 @@ using Tyrrrz.Extensions;
namespace DiscordChatExporter.Cli.Verbs namespace DiscordChatExporter.Cli.Verbs
{ {
public class ExportChatVerb : Verb<ExportChatOptions> public class ExportChannelVerb : Verb<ExportChannelOptions>
{ {
public ExportChatVerb(ExportChatOptions options) public ExportChannelVerb(ExportChannelOptions options)
: base(options) : base(options)
{ {
} }

@ -0,0 +1,80 @@
using System;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using DiscordChatExporter.Cli.Verbs.Options;
using DiscordChatExporter.Core.Exceptions;
using DiscordChatExporter.Core.Helpers;
using DiscordChatExporter.Core.Services;
using Tyrrrz.Extensions;
namespace DiscordChatExporter.Cli.Verbs
{
public class ExportDirectMessagesVerb : Verb<ExportDirectMessagesOptions>
{
public ExportDirectMessagesVerb(ExportDirectMessagesOptions options)
: base(options)
{
}
public override async Task ExecuteAsync()
{
// Get services
var settingsService = Container.Instance.Get<SettingsService>();
var dataService = Container.Instance.Get<DataService>();
var exportService = Container.Instance.Get<ExportService>();
// Configure settings
if (Options.DateFormat.IsNotBlank())
settingsService.DateFormat = Options.DateFormat;
if (Options.MessageGroupLimit > 0)
settingsService.MessageGroupLimit = Options.MessageGroupLimit;
// Get channels
var channels = await dataService.GetDirectMessageChannelsAsync(Options.GetToken());
// Order channels
channels = channels.OrderBy(c => c.Name).ToArray();
// Loop through channels
foreach (var channel in channels)
{
try
{
// Print current channel name
Console.WriteLine($"Exporting chat from [{channel.Name}]...");
// Get chat log
var chatLog = await dataService.GetChatLogAsync(Options.GetToken(), channel,
Options.After, Options.Before);
// Generate file path if not set or is a directory
var filePath = Options.FilePath;
if (filePath == null || filePath.EndsWith("/") || filePath.EndsWith("\\"))
{
// Generate default file name
var defaultFileName = ExportHelper.GetDefaultExportFileName(Options.ExportFormat, chatLog.Guild,
chatLog.Channel, Options.After, Options.Before);
// Append the file name to the file path
filePath += defaultFileName;
}
// Export
exportService.ExportChatLog(chatLog, filePath, Options.ExportFormat, Options.PartitionLimit);
// Print result
Console.WriteLine($"Exported chat to [{filePath}]");
}
catch (HttpErrorStatusCodeException ex) when (ex.StatusCode == HttpStatusCode.Forbidden)
{
Console.Error.WriteLine("You don't have access to this channel");
}
catch (HttpErrorStatusCodeException ex) when (ex.StatusCode == HttpStatusCode.NotFound)
{
Console.Error.WriteLine("This channel doesn't exist");
}
}
}
}
}

@ -2,8 +2,8 @@
namespace DiscordChatExporter.Cli.Verbs.Options namespace DiscordChatExporter.Cli.Verbs.Options
{ {
[Verb("export", HelpText = "Export channel chat log to a file.")] [Verb("export", HelpText = "Export channel.")]
public class ExportChatOptions : ExportOptions public class ExportChannelOptions : ExportOptions
{ {
[Option('c', "channel", Required = true, HelpText = "Channel ID.")] [Option('c', "channel", Required = true, HelpText = "Channel ID.")]
public string ChannelId { get; set; } public string ChannelId { get; set; }

@ -0,0 +1,9 @@
using CommandLine;
namespace DiscordChatExporter.Cli.Verbs.Options
{
[Verb("exportdm", HelpText = "Export all direct message channels.")]
public class ExportDirectMessagesOptions : ExportOptions
{
}
}

@ -2,7 +2,7 @@
namespace DiscordChatExporter.Cli.Verbs.Options namespace DiscordChatExporter.Cli.Verbs.Options
{ {
[Verb("exportguild", HelpText = "Export all available channels within a given guild.")] [Verb("exportguild", HelpText = "Export all channels within a given guild.")]
public class ExportGuildOptions : ExportOptions public class ExportGuildOptions : ExportOptions
{ {
[Option('g', "guild", Required = true, HelpText = "Guild ID.")] [Option('g', "guild", Required = true, HelpText = "Guild ID.")]

@ -4,7 +4,7 @@ using DiscordChatExporter.Core.Models;
namespace DiscordChatExporter.Cli.Verbs.Options namespace DiscordChatExporter.Cli.Verbs.Options
{ {
public class ExportOptions : TokenOptions public abstract class ExportOptions : TokenOptions
{ {
[Option('f', "format", Default = ExportFormat.HtmlDark, HelpText = "Output file format.")] [Option('f', "format", Default = ExportFormat.HtmlDark, HelpText = "Output file format.")]
public ExportFormat ExportFormat { get; set; } public ExportFormat ExportFormat { get; set; }

@ -3,7 +3,7 @@ using DiscordChatExporter.Core.Models;
namespace DiscordChatExporter.Cli.Verbs.Options namespace DiscordChatExporter.Cli.Verbs.Options
{ {
public class TokenOptions public abstract class TokenOptions
{ {
[Option('t', "token", Required = true, HelpText = "Authorization token.")] [Option('t', "token", Required = true, HelpText = "Authorization token.")]
public string TokenValue { get; set; } public string TokenValue { get; set; }

Loading…
Cancel
Save