Skip to content

Commit 1625d98

Browse files
committed
Add mass dehoist as a scheduled task
Fixes #258
1 parent d1e64e2 commit 1625d98

File tree

5 files changed

+66
-10
lines changed

5 files changed

+66
-10
lines changed

Commands/DebugCmds.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,9 @@ public async Task Refresh(TextCommandContext ctx)
139139
bool unlocks = await Tasks.LockdownTasks.CheckUnlocksAsync();
140140
bool channelUpdateEvents = await Tasks.EventTasks.HandlePendingChannelUpdateEventsAsync();
141141
bool channelDeleteEvents = await Tasks.EventTasks.HandlePendingChannelDeleteEventsAsync();
142+
bool checkAndMassDehoist = await Tasks.MassDehoistTasks.CheckAndMassDehoistTask();
142143

143-
await msg.ModifyAsync($"Unban check result: `{bans}`\nUnmute check result: `{mutes}`\nPunishment message cleanup check result: `{punishmentMessages}`\nReminders check result: `{reminders}`\nRaidmode check result: `{raidmode}`\nUnlocks check result: `{unlocks}`\nPending Channel Update events check result: `{channelUpdateEvents}`\nPending Channel Delete events check result: `{channelDeleteEvents}`");
144+
await msg.ModifyAsync($"Unban check result: `{bans}`\nUnmute check result: `{mutes}`\nPunishment message cleanup check result: `{punishmentMessages}`\nReminders check result: `{reminders}`\nRaidmode check result: `{raidmode}`\nUnlocks check result: `{unlocks}`\nPending Channel Update events check result: `{channelUpdateEvents}`\nPending Channel Delete events check result: `{channelDeleteEvents}`\nMass dehoist check result: `{checkAndMassDehoist}`");
144145
}
145146

146147
[Command("sh")]

Commands/DehoistCmds.cs

+2-9
Original file line numberDiff line numberDiff line change
@@ -139,18 +139,11 @@ public async Task MassDehoist(TextCommandContext ctx)
139139
{
140140
await ctx.RespondAsync($"{Program.cfgjson.Emoji.Loading} Working on it. This will take a while.");
141141
var msg = await ctx.GetResponseAsync();
142-
var discordMembers = await ctx.Guild.GetAllMembersAsync().ToListAsync();
143-
int failedCount = 0;
144142

145-
foreach (DiscordMember discordMember in discordMembers)
146-
{
147-
bool success = await DehoistHelpers.CheckAndDehoistMemberAsync(discordMember, ctx.User, true);
148-
if (!success)
149-
failedCount++;
150-
}
143+
var (totalMembers, failedMembers) = await DehoistHelpers.MassDehoistAsync(ctx.Guild);
151144

152145
_ = msg.DeleteAsync();
153-
await ctx.Channel.SendMessageAsync(new DiscordMessageBuilder().WithContent($"{Program.cfgjson.Emoji.Success} Successfully dehoisted {discordMembers.Count() - failedCount} of {discordMembers.Count()} member(s)! (Check Audit Log for details)").WithReply(ctx.Message.Id, true, false));
146+
await ctx.Channel.SendMessageAsync(new DiscordMessageBuilder().WithContent($"{Program.cfgjson.Emoji.Success} Successfully dehoisted {totalMembers - failedMembers} of {totalMembers} member(s)! (Check Audit Log for details)").WithReply(ctx.Message.Id, true, false));
154147
}
155148

156149
[Command("massundehoisttextcmd")]

Helpers/DehoistHelpers.cs

+14
Original file line numberDiff line numberDiff line change
@@ -165,5 +165,19 @@ await discordMember.ModifyAsync(a =>
165165
return (success, isPermissionError, true);
166166
}
167167
}
168+
169+
public static async Task<(int totalMembers, int failedMembers)> MassDehoistAsync(DiscordGuild guild)
170+
{
171+
var discordMembers = await guild.GetAllMembersAsync().ToListAsync();
172+
int failedCount = 0;
173+
174+
foreach (DiscordMember discordMember in discordMembers)
175+
{
176+
bool success = await CheckAndDehoistMemberAsync(discordMember, Program.discord.CurrentUser, true);
177+
if (!success)
178+
failedCount++;
179+
}
180+
return (discordMembers.Count, failedCount);
181+
}
168182
}
169183
}

Program.cs

+3
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,9 @@ static async Task Main(string[] _)
263263
Tasks.EventTasks.HandlePendingChannelDeleteEventsAsync(),
264264
];
265265

266+
// This one has its own time management, run it asynchronously and throw caution to the wind.
267+
Tasks.MassDehoistTasks.CheckAndMassDehoistTask();
268+
266269
// To prevent a future issue if checks take longer than 10 seconds,
267270
// we only start the 10 second counter after all tasks have concluded.
268271
await Task.WhenAll(taskList);

Tasks/MassDehoistTasks.cs

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
namespace Cliptok.Tasks
2+
{
3+
internal class MassDehoistTasks
4+
{
5+
public static async Task<bool> CheckAndMassDehoistTask()
6+
{
7+
var dbResult = await Program.db.StringGetAsync("lastMassDehoistRun");
8+
9+
if (dbResult.IsNull)
10+
{
11+
await MassDehoistAndUpdateTimeAsync();
12+
}
13+
14+
var lastMassDehoistRun = DateTimeOffset.FromUnixTimeSeconds((int)dbResult);
15+
var timeSinceLastRun = DateTime.Now - lastMassDehoistRun;
16+
17+
if (timeSinceLastRun > TimeSpan.FromHours(24))
18+
{
19+
await MassDehoistAndUpdateTimeAsync();
20+
return true;
21+
}
22+
else
23+
{
24+
Program.discord.Logger.LogDebug("Mass dehoist task skipped. Last run was at {time} UTC", lastMassDehoistRun);
25+
return false;
26+
}
27+
}
28+
29+
public static async Task<bool> MassDehoistAndUpdateTimeAsync()
30+
{
31+
await Program.db.StringSetAsync("lastMassDehoistRun", TimeHelpers.ToUnixTimestamp(DateTime.Now));
32+
var (totalMembers, failedMembers) = await DehoistHelpers.MassDehoistAsync(Program.homeGuild);
33+
if (totalMembers != failedMembers)
34+
{
35+
Program.discord.Logger.LogInformation("Successfully mass dehoisted {members} of {total} member(s)! Check Audit Log for details.", totalMembers - failedMembers, totalMembers);
36+
return true;
37+
}
38+
else
39+
{
40+
Program.discord.Logger.LogDebug("Mass dehoist task completed with no members to dehoist.");
41+
return false;
42+
}
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)