2024-06-16 00:12:33 +02:00
|
|
|
|
using CommandLine;
|
2024-06-16 00:47:41 +02:00
|
|
|
|
using DiscordClient;
|
2024-06-16 00:12:33 +02:00
|
|
|
|
using DiscordDelete;
|
2024-06-18 19:49:21 +02:00
|
|
|
|
using Microsoft.Extensions.Configuration;
|
|
|
|
|
|
|
|
|
|
|
|
IConfiguration configuration = new ConfigurationBuilder()
|
|
|
|
|
|
.AddEnvironmentVariables()
|
2024-06-18 19:50:42 +02:00
|
|
|
|
.AddJsonFile("config.json", true)
|
|
|
|
|
|
.AddXmlFile("config.xml", true)
|
2024-06-18 19:49:21 +02:00
|
|
|
|
.Build();
|
2024-06-16 00:12:33 +02:00
|
|
|
|
|
2024-06-18 19:56:13 +02:00
|
|
|
|
string? token = configuration.GetSection("Token").Value;
|
2024-06-16 00:47:41 +02:00
|
|
|
|
|
2024-06-18 20:19:11 +02:00
|
|
|
|
if(token is null)
|
2024-06-16 00:47:41 +02:00
|
|
|
|
{
|
2024-06-18 19:56:13 +02:00
|
|
|
|
Console.WriteLine("Token has not been found in any form of configuration.");
|
2024-06-16 00:47:41 +02:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DiscordContext db = new DiscordContext();
|
|
|
|
|
|
DiscordUserClient client = new DiscordUserClient(token);
|
|
|
|
|
|
|
2024-06-16 11:00:50 +02:00
|
|
|
|
static async Task TooManyRequestsDelay()
|
|
|
|
|
|
{
|
|
|
|
|
|
int seconds = 60;
|
|
|
|
|
|
Console.WriteLine($"Too many requests. Sleeping for extra {seconds} seconds.");
|
|
|
|
|
|
await Task.Delay(TimeSpan.FromSeconds(seconds));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-16 00:47:41 +02:00
|
|
|
|
int finalCode = await CommandLine
|
2024-06-16 00:12:33 +02:00
|
|
|
|
.Parser.Default.ParseArguments<DeleteOptions, ScanOptions>(args)
|
|
|
|
|
|
.MapResult(
|
2024-06-16 00:47:41 +02:00
|
|
|
|
async (DeleteOptions opt) =>
|
2024-06-16 00:12:33 +02:00
|
|
|
|
{
|
2024-06-16 01:51:08 +02:00
|
|
|
|
foreach (
|
|
|
|
|
|
Message message in db
|
|
|
|
|
|
.Messages
|
|
|
|
|
|
// Skip ones that are already deleted.
|
|
|
|
|
|
.Where(message => message.LastHttpCode != 204)
|
2024-06-16 01:54:57 +02:00
|
|
|
|
// Skip BadRequest (such as archived thread).
|
|
|
|
|
|
.Where(message => message.LastHttpCode != 400)
|
2024-06-16 01:51:08 +02:00
|
|
|
|
// Skip NotFound.
|
|
|
|
|
|
.Where(message => message.LastHttpCode != 404)
|
|
|
|
|
|
)
|
2024-06-16 00:47:41 +02:00
|
|
|
|
{
|
|
|
|
|
|
// If required data is null, continue to next message.
|
|
|
|
|
|
if (message.MessageId is null || message.ChannelId is null)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
HttpResponseMessage response = await client.DeleteMessage(
|
|
|
|
|
|
message.ChannelId,
|
|
|
|
|
|
message.MessageId
|
|
|
|
|
|
);
|
|
|
|
|
|
message.LastHttpCode = (int)response.StatusCode;
|
2024-06-16 01:43:58 +02:00
|
|
|
|
Console.WriteLine(
|
2024-06-16 14:12:31 +02:00
|
|
|
|
$"{(response.IsSuccessStatusCode ? "✅" : "❌")} {message.Id} - Deleting {message.MessageId} - {response.StatusCode}"
|
2024-06-16 01:43:58 +02:00
|
|
|
|
);
|
2024-06-16 00:47:41 +02:00
|
|
|
|
|
2024-06-16 01:42:35 +02:00
|
|
|
|
if (response.StatusCode == System.Net.HttpStatusCode.TooManyRequests)
|
|
|
|
|
|
{
|
2024-06-16 11:00:50 +02:00
|
|
|
|
await TooManyRequestsDelay();
|
2024-06-16 01:42:35 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-16 00:47:41 +02:00
|
|
|
|
db.Update(message);
|
|
|
|
|
|
await db.SaveChangesAsync();
|
2024-06-16 01:36:22 +02:00
|
|
|
|
|
|
|
|
|
|
await Task.Delay(TimeSpan.FromSeconds(2));
|
2024-06-16 00:47:41 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-16 00:12:33 +02:00
|
|
|
|
return 0;
|
|
|
|
|
|
},
|
2024-06-16 00:47:41 +02:00
|
|
|
|
async (ScanOptions opt) =>
|
2024-06-16 00:12:33 +02:00
|
|
|
|
{
|
2024-06-16 01:12:54 +02:00
|
|
|
|
if (opt.Author is null)
|
2024-06-16 01:06:26 +02:00
|
|
|
|
{
|
2024-06-16 19:24:14 +02:00
|
|
|
|
Console.WriteLine("Author ID is null. Default to this user being author.");
|
|
|
|
|
|
opt.Author = client.MyDiscordId;
|
2024-06-16 01:06:26 +02:00
|
|
|
|
}
|
2024-06-16 00:47:41 +02:00
|
|
|
|
|
|
|
|
|
|
int totalMessages = 1;
|
|
|
|
|
|
int offset = 0;
|
|
|
|
|
|
|
2024-06-16 10:47:46 +02:00
|
|
|
|
while (offset < totalMessages)
|
2024-06-16 00:47:41 +02:00
|
|
|
|
{
|
2024-06-16 10:47:46 +02:00
|
|
|
|
var searchResponse = opt.GuildId is null
|
|
|
|
|
|
? await client.GetChannelMessages(opt.ChannelId, offset, opt.Author)
|
|
|
|
|
|
: await client.SearchGuildMessages(opt.GuildId, offset, opt.Author);
|
|
|
|
|
|
|
|
|
|
|
|
Console.WriteLine(
|
2024-06-18 20:17:07 +02:00
|
|
|
|
$"Scan code at offset {offset}: {searchResponse.HttpResponse.StatusCode}."
|
2024-06-16 10:47:46 +02:00
|
|
|
|
);
|
|
|
|
|
|
|
2024-06-18 20:17:07 +02:00
|
|
|
|
if (!searchResponse.HttpResponse.IsSuccessStatusCode)
|
2024-06-16 11:08:46 +02:00
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-18 20:17:07 +02:00
|
|
|
|
if (
|
|
|
|
|
|
searchResponse.HttpResponse.StatusCode
|
|
|
|
|
|
== System.Net.HttpStatusCode.TooManyRequests
|
|
|
|
|
|
)
|
2024-06-16 11:08:46 +02:00
|
|
|
|
{
|
|
|
|
|
|
await TooManyRequestsDelay();
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-18 20:17:07 +02:00
|
|
|
|
if (searchResponse.DeserializedData is null)
|
2024-06-16 10:47:46 +02:00
|
|
|
|
return 2;
|
|
|
|
|
|
|
2024-06-18 20:17:07 +02:00
|
|
|
|
totalMessages = searchResponse.DeserializedData.TotalMessages;
|
2024-06-16 10:47:46 +02:00
|
|
|
|
|
2024-06-18 20:17:07 +02:00
|
|
|
|
IEnumerable<Message> newMessages =
|
|
|
|
|
|
searchResponse.DeserializedData.Messages.SelectMany(message =>
|
2024-06-16 10:47:46 +02:00
|
|
|
|
message.Select(messagePart => new Message
|
2024-06-16 10:17:28 +02:00
|
|
|
|
{
|
2024-06-16 10:47:46 +02:00
|
|
|
|
ChannelId = messagePart.ChannelId,
|
|
|
|
|
|
MessageId = messagePart.Id,
|
|
|
|
|
|
Content = messagePart.Content
|
|
|
|
|
|
})
|
2024-06-18 20:17:07 +02:00
|
|
|
|
);
|
2024-06-16 10:47:46 +02:00
|
|
|
|
|
|
|
|
|
|
foreach (var newMessage in newMessages)
|
2024-06-16 00:47:41 +02:00
|
|
|
|
{
|
2024-06-16 10:47:46 +02:00
|
|
|
|
if (!db.Messages.Any(message => message.MessageId == newMessage.MessageId))
|
|
|
|
|
|
await db.AddAsync(newMessage);
|
2024-06-16 00:47:41 +02:00
|
|
|
|
}
|
2024-06-16 10:47:46 +02:00
|
|
|
|
|
|
|
|
|
|
await db.SaveChangesAsync();
|
2024-06-16 11:04:19 +02:00
|
|
|
|
|
2024-06-18 20:17:07 +02:00
|
|
|
|
offset += searchResponse.DeserializedData.Messages.Length;
|
2024-06-16 11:04:19 +02:00
|
|
|
|
|
2024-06-16 10:47:46 +02:00
|
|
|
|
Console.WriteLine(
|
2024-06-18 20:17:07 +02:00
|
|
|
|
$"Written {searchResponse.DeserializedData.Messages.Length} messages. {offset} / {totalMessages}"
|
2024-06-16 10:47:46 +02:00
|
|
|
|
);
|
|
|
|
|
|
await Task.Delay(TimeSpan.FromSeconds(2));
|
2024-06-16 00:47:41 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-16 00:12:33 +02:00
|
|
|
|
return 0;
|
|
|
|
|
|
},
|
2024-06-16 00:47:41 +02:00
|
|
|
|
errs => Task.FromResult(0)
|
2024-06-16 00:12:33 +02:00
|
|
|
|
);
|