DiscordClient/DiscordDelete/Program.cs

134 lines
4.5 KiB
C#
Raw Normal View History

2024-06-16 00:12:33 +02:00
using CommandLine;
using DiscordClient;
using DiscordClient.Data;
2024-06-16 00:12:33 +02:00
using DiscordDelete;
string? token = Environment.GetEnvironmentVariable("DISCORD_TOKEN");
if (token == null)
{
// Exit.
2024-06-16 01:06:26 +02:00
Console.WriteLine("Token is null. Make sure you set the DISCORD_TOKEN environmental variable.");
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));
}
int finalCode = await CommandLine
2024-06-16 00:12:33 +02:00
.Parser.Default.ParseArguments<DeleteOptions, ScanOptions>(args)
.MapResult(
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)
)
{
// 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
);
if (response.StatusCode == System.Net.HttpStatusCode.TooManyRequests)
{
2024-06-16 11:00:50 +02:00
await TooManyRequestsDelay();
}
db.Update(message);
await db.SaveChangesAsync();
2024-06-16 01:36:22 +02:00
await Task.Delay(TimeSpan.FromSeconds(2));
}
2024-06-16 00:12:33 +02:00
return 0;
},
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
{
Console.WriteLine("Author ID is null. Default to this user being author.");
opt.Author = client.MyDiscordId;
2024-06-16 01:06:26 +02:00
}
int totalMessages = 1;
int offset = 0;
2024-06-16 10:47:46 +02:00
while (offset < totalMessages)
{
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(
$"Scan code at offset {offset}: {searchResponse.Response.StatusCode}."
);
2024-06-16 11:08:46 +02:00
if (!searchResponse.Response.IsSuccessStatusCode)
{
continue;
}
if (searchResponse.Response.StatusCode == System.Net.HttpStatusCode.TooManyRequests)
{
await TooManyRequestsDelay();
continue;
}
2024-06-16 10:47:46 +02:00
if (searchResponse.JsonData is null)
return 2;
totalMessages = searchResponse.JsonData.TotalMessages;
IEnumerable<Message> newMessages = searchResponse.JsonData.Messages.SelectMany(
message =>
message.Select(messagePart => new Message
{
2024-06-16 10:47:46 +02:00
ChannelId = messagePart.ChannelId,
MessageId = messagePart.Id,
Content = messagePart.Content
})
);
foreach (var newMessage in newMessages)
{
2024-06-16 10:47:46 +02:00
if (!db.Messages.Any(message => message.MessageId == newMessage.MessageId))
await db.AddAsync(newMessage);
}
2024-06-16 10:47:46 +02:00
await db.SaveChangesAsync();
2024-06-16 11:08:46 +02:00
offset += searchResponse.JsonData.Messages.Length;
2024-06-16 10:47:46 +02:00
Console.WriteLine(
$"Written {searchResponse.JsonData.Messages.Length} messages. {offset} / {totalMessages}"
);
await Task.Delay(TimeSpan.FromSeconds(2));
}
2024-06-16 00:12:33 +02:00
return 0;
},
errs => Task.FromResult(0)
2024-06-16 00:12:33 +02:00
);