mirror of
https://github.com/Tyrrrz/DiscordChatExporter.git
synced 2026-02-14 15:53:30 -07:00
Refactor
This commit is contained in:
parent
69cfe1845b
commit
05c551f80c
|
|
@ -3,7 +3,7 @@ using System.IO;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using CliFx.Attributes;
|
using CliFx.Attributes;
|
||||||
using CliFx.Services;
|
using CliFx.Services;
|
||||||
using DiscordChatExporter.Cli.Internal;
|
using CliFx.Utilities;
|
||||||
using DiscordChatExporter.Core.Models;
|
using DiscordChatExporter.Core.Models;
|
||||||
using DiscordChatExporter.Core.Services;
|
using DiscordChatExporter.Core.Services;
|
||||||
using DiscordChatExporter.Core.Services.Helpers;
|
using DiscordChatExporter.Core.Services.Helpers;
|
||||||
|
|
@ -50,29 +50,27 @@ namespace DiscordChatExporter.Cli.Commands
|
||||||
SettingsService.DateFormat = DateFormat;
|
SettingsService.DateFormat = DateFormat;
|
||||||
|
|
||||||
console.Output.Write($"Exporting channel [{channel.Name}]... ");
|
console.Output.Write($"Exporting channel [{channel.Name}]... ");
|
||||||
using (var progress = new InlineProgress(console))
|
var progress = console.CreateProgressTicker();
|
||||||
|
|
||||||
|
// Get chat log
|
||||||
|
var chatLog = await DataService.GetChatLogAsync(GetToken(), channel, After, Before, progress);
|
||||||
|
|
||||||
|
// Generate file path if not set or is a directory
|
||||||
|
var filePath = OutputPath;
|
||||||
|
if (filePath.IsNullOrWhiteSpace() || ExportHelper.IsDirectoryPath(filePath))
|
||||||
{
|
{
|
||||||
// Get chat log
|
// Generate default file name
|
||||||
var chatLog = await DataService.GetChatLogAsync(GetToken(), channel, After, Before, progress);
|
var fileName = ExportHelper.GetDefaultExportFileName(ExportFormat, chatLog.Guild,
|
||||||
|
chatLog.Channel, After, Before);
|
||||||
|
|
||||||
// Generate file path if not set or is a directory
|
// Combine paths
|
||||||
var filePath = OutputPath;
|
filePath = Path.Combine(filePath ?? "", fileName);
|
||||||
if (filePath.IsNullOrWhiteSpace() || ExportHelper.IsDirectoryPath(filePath))
|
|
||||||
{
|
|
||||||
// Generate default file name
|
|
||||||
var fileName = ExportHelper.GetDefaultExportFileName(ExportFormat, chatLog.Guild,
|
|
||||||
chatLog.Channel, After, Before);
|
|
||||||
|
|
||||||
// Combine paths
|
|
||||||
filePath = Path.Combine(filePath ?? "", fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Export
|
|
||||||
await ExportService.ExportChatLogAsync(chatLog, filePath, ExportFormat, PartitionLimit);
|
|
||||||
|
|
||||||
// Report successful completion
|
|
||||||
progress.ReportCompletion();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Export
|
||||||
|
await ExportService.ExportChatLogAsync(chatLog, filePath, ExportFormat, PartitionLimit);
|
||||||
|
|
||||||
|
console.Output.WriteLine();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
using System;
|
|
||||||
using CliFx.Services;
|
|
||||||
|
|
||||||
namespace DiscordChatExporter.Cli.Internal
|
|
||||||
{
|
|
||||||
internal class InlineProgress : IProgress<double>, IDisposable
|
|
||||||
{
|
|
||||||
private readonly IConsole _console;
|
|
||||||
|
|
||||||
private string _lastOutput = "";
|
|
||||||
private bool _isCompleted;
|
|
||||||
|
|
||||||
public InlineProgress(IConsole console)
|
|
||||||
{
|
|
||||||
_console = console;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ResetCursorPosition()
|
|
||||||
{
|
|
||||||
foreach (var c in _lastOutput)
|
|
||||||
_console.Output.Write('\b');
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Report(double progress)
|
|
||||||
{
|
|
||||||
// If output is not redirected - reset cursor position and write progress
|
|
||||||
if (!_console.IsOutputRedirected)
|
|
||||||
{
|
|
||||||
ResetCursorPosition();
|
|
||||||
_console.Output.Write(_lastOutput = $"{progress:P1}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ReportCompletion() => _isCompleted = true;
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
// If output is not redirected - reset cursor position
|
|
||||||
if (!_console.IsOutputRedirected)
|
|
||||||
{
|
|
||||||
ResetCursorPosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inform about completion
|
|
||||||
_console.Output.WriteLine(_isCompleted ? "Completed ✓" : "Failed X");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -32,41 +32,37 @@ namespace DiscordChatExporter.Core.Services
|
||||||
{
|
{
|
||||||
// Create request
|
// Create request
|
||||||
const string apiRoot = "https://discordapp.com/api/v6";
|
const string apiRoot = "https://discordapp.com/api/v6";
|
||||||
using (var request = new HttpRequestMessage(HttpMethod.Get, $"{apiRoot}/{resource}/{endpoint}"))
|
using var request = new HttpRequestMessage(HttpMethod.Get, $"{apiRoot}/{resource}/{endpoint}");
|
||||||
|
// Set authorization header
|
||||||
|
request.Headers.Authorization = token.Type == AuthTokenType.Bot
|
||||||
|
? new AuthenticationHeaderValue("Bot", token.Value)
|
||||||
|
: new AuthenticationHeaderValue(token.Value);
|
||||||
|
|
||||||
|
// Add parameters
|
||||||
|
foreach (var parameter in parameters)
|
||||||
{
|
{
|
||||||
// Set authorization header
|
var key = parameter.SubstringUntil("=");
|
||||||
request.Headers.Authorization = token.Type == AuthTokenType.Bot
|
var value = parameter.SubstringAfter("=");
|
||||||
? new AuthenticationHeaderValue("Bot", token.Value)
|
|
||||||
: new AuthenticationHeaderValue(token.Value);
|
|
||||||
|
|
||||||
// Add parameters
|
// Skip empty values
|
||||||
foreach (var parameter in parameters)
|
if (value.IsNullOrWhiteSpace())
|
||||||
{
|
continue;
|
||||||
var key = parameter.SubstringUntil("=");
|
|
||||||
var value = parameter.SubstringAfter("=");
|
|
||||||
|
|
||||||
// Skip empty values
|
request.RequestUri = request.RequestUri.SetQueryParameter(key, value);
|
||||||
if (value.IsNullOrWhiteSpace())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
request.RequestUri = request.RequestUri.SetQueryParameter(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get response
|
|
||||||
using (var response = await _httpClient.SendAsync(request))
|
|
||||||
{
|
|
||||||
// Check status code
|
|
||||||
// We throw our own exception here because default one doesn't have status code
|
|
||||||
if (!response.IsSuccessStatusCode)
|
|
||||||
throw new HttpErrorStatusCodeException(response.StatusCode, response.ReasonPhrase);
|
|
||||||
|
|
||||||
// Get content
|
|
||||||
var raw = await response.Content.ReadAsStringAsync();
|
|
||||||
|
|
||||||
// Parse
|
|
||||||
return JToken.Parse(raw);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get response
|
||||||
|
using var response = await _httpClient.SendAsync(request);
|
||||||
|
// Check status code
|
||||||
|
// We throw our own exception here because default one doesn't have status code
|
||||||
|
if (!response.IsSuccessStatusCode)
|
||||||
|
throw new HttpErrorStatusCodeException(response.StatusCode, response.ReasonPhrase);
|
||||||
|
|
||||||
|
// Get content
|
||||||
|
var raw = await response.Content.ReadAsStringAsync();
|
||||||
|
|
||||||
|
// Parse
|
||||||
|
return JToken.Parse(raw);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,8 +42,8 @@ namespace DiscordChatExporter.Core.Services
|
||||||
Directory.CreateDirectory(dirPath);
|
Directory.CreateDirectory(dirPath);
|
||||||
|
|
||||||
// Render chat log to output file
|
// Render chat log to output file
|
||||||
using (var writer = File.CreateText(filePath))
|
await using var writer = File.CreateText(filePath);
|
||||||
await CreateRenderer(chatLog, format).RenderAsync(writer);
|
await CreateRenderer(chatLog, format).RenderAsync(writer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task ExportChatLogAsync(ChatLog chatLog, string filePath, ExportFormat format, int? partitionLimit)
|
public async Task ExportChatLogAsync(ChatLog chatLog, string filePath, ExportFormat format, int? partitionLimit)
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ namespace DiscordChatExporter.Core.Services.Helpers
|
||||||
public static bool IsDirectoryPath(string path) =>
|
public static bool IsDirectoryPath(string path) =>
|
||||||
path.Last() == Path.DirectorySeparatorChar ||
|
path.Last() == Path.DirectorySeparatorChar ||
|
||||||
path.Last() == Path.AltDirectorySeparatorChar ||
|
path.Last() == Path.AltDirectorySeparatorChar ||
|
||||||
(Path.GetExtension(path).IsNullOrWhiteSpace() && !File.Exists(path));
|
Path.GetExtension(path).IsNullOrWhiteSpace() && !File.Exists(path);
|
||||||
|
|
||||||
public static string GetDefaultExportFileName(ExportFormat format, Guild guild, Channel channel,
|
public static string GetDefaultExportFileName(ExportFormat format, Guild guild, Channel channel,
|
||||||
DateTimeOffset? after = null, DateTimeOffset? before = null)
|
DateTimeOffset? after = null, DateTimeOffset? before = null)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue