mirror of
https://gitlab.com/Kwoth/nadekobot.git
synced 2025-09-11 17:58:26 -04:00
add: Added admin-only .warndelete command
This commit is contained in:
@@ -273,6 +273,31 @@ public partial class Administration
|
|||||||
.SendAsync();
|
.SendAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Cmd]
|
||||||
|
[RequireContext(ContextType.Guild)]
|
||||||
|
[UserPerm(GuildPerm.Administrator)]
|
||||||
|
public Task WarnDelete(IGuildUser user, int index)
|
||||||
|
=> WarnDelete(user.Id, index);
|
||||||
|
|
||||||
|
[Cmd]
|
||||||
|
[RequireContext(ContextType.Guild)]
|
||||||
|
[UserPerm(GuildPerm.Administrator)]
|
||||||
|
public async Task WarnDelete(ulong userId, int index)
|
||||||
|
{
|
||||||
|
if (--index < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var warn = await _service.WarnDelete(userId, index);
|
||||||
|
|
||||||
|
if (warn is null)
|
||||||
|
{
|
||||||
|
await Response().Error(strs.warning_not_found).SendAsync();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await Response().Confirm(strs.warning_deleted(Format.Bold(index.ToString()))).SendAsync();
|
||||||
|
}
|
||||||
|
|
||||||
[Cmd]
|
[Cmd]
|
||||||
[RequireContext(ContextType.Guild)]
|
[RequireContext(ContextType.Guild)]
|
||||||
[UserPerm(GuildPerm.BanMembers)]
|
[UserPerm(GuildPerm.BanMembers)]
|
||||||
@@ -286,6 +311,7 @@ public partial class Administration
|
|||||||
{
|
{
|
||||||
if (index < 0)
|
if (index < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var success = await _service.WarnClearAsync(ctx.Guild.Id, userId, index, ctx.User.ToString());
|
var success = await _service.WarnClearAsync(ctx.Guild.Id, userId, index, ctx.User.ToString());
|
||||||
var userStr = Format.Bold((ctx.Guild as SocketGuild)?.GetUser(userId)?.ToString() ?? userId.ToString());
|
var userStr = Format.Bold((ctx.Guild as SocketGuild)?.GetUser(userId)?.ToString() ?? userId.ToString());
|
||||||
if (index == 0)
|
if (index == 0)
|
||||||
|
@@ -89,9 +89,10 @@ public class UserPunishService : INService, IReadyExecutor
|
|||||||
{
|
{
|
||||||
ps = uow.GuildConfigsForId(guildId, set => set.Include(x => x.WarnPunishments)).WarnPunishments;
|
ps = uow.GuildConfigsForId(guildId, set => set.Include(x => x.WarnPunishments)).WarnPunishments;
|
||||||
|
|
||||||
previousCount = uow.Set<Warning>().ForId(guildId, userId)
|
previousCount = uow.Set<Warning>()
|
||||||
.Where(w => !w.Forgiven && w.UserId == userId)
|
.ForId(guildId, userId)
|
||||||
.Sum(x => x.Weight);
|
.Where(w => !w.Forgiven && w.UserId == userId)
|
||||||
|
.Sum(x => x.Weight);
|
||||||
|
|
||||||
uow.Set<Warning>().Add(warn);
|
uow.Set<Warning>().Add(warn);
|
||||||
|
|
||||||
@@ -103,7 +104,7 @@ public class UserPunishService : INService, IReadyExecutor
|
|||||||
var totalCount = previousCount + weight;
|
var totalCount = previousCount + weight;
|
||||||
|
|
||||||
var p = ps.Where(x => x.Count > previousCount && x.Count <= totalCount)
|
var p = ps.Where(x => x.Count > previousCount && x.Count <= totalCount)
|
||||||
.MaxBy(x => x.Count);
|
.MaxBy(x => x.Count);
|
||||||
|
|
||||||
if (p is not null)
|
if (p is not null)
|
||||||
{
|
{
|
||||||
@@ -244,33 +245,33 @@ public class UserPunishService : INService, IReadyExecutor
|
|||||||
{
|
{
|
||||||
await using var uow = _db.GetDbContext();
|
await using var uow = _db.GetDbContext();
|
||||||
var cleared = await uow.Set<Warning>()
|
var cleared = await uow.Set<Warning>()
|
||||||
.Where(x => uow.Set<GuildConfig>()
|
.Where(x => uow.Set<GuildConfig>()
|
||||||
.Any(y => y.GuildId == x.GuildId
|
.Any(y => y.GuildId == x.GuildId
|
||||||
&& y.WarnExpireHours > 0
|
&& y.WarnExpireHours > 0
|
||||||
&& y.WarnExpireAction == WarnExpireAction.Clear)
|
&& y.WarnExpireAction == WarnExpireAction.Clear)
|
||||||
&& x.Forgiven == false
|
&& x.Forgiven == false
|
||||||
&& x.DateAdded
|
&& x.DateAdded
|
||||||
< DateTime.UtcNow.AddHours(-uow.Set<GuildConfig>()
|
< DateTime.UtcNow.AddHours(-uow.Set<GuildConfig>()
|
||||||
.Where(y => x.GuildId == y.GuildId)
|
.Where(y => x.GuildId == y.GuildId)
|
||||||
.Select(y => y.WarnExpireHours)
|
.Select(y => y.WarnExpireHours)
|
||||||
.First()))
|
.First()))
|
||||||
.UpdateAsync(_ => new()
|
.UpdateAsync(_ => new()
|
||||||
{
|
{
|
||||||
Forgiven = true,
|
Forgiven = true,
|
||||||
ForgivenBy = "expiry"
|
ForgivenBy = "expiry"
|
||||||
});
|
});
|
||||||
|
|
||||||
var deleted = await uow.Set<Warning>()
|
var deleted = await uow.Set<Warning>()
|
||||||
.Where(x => uow.Set<GuildConfig>()
|
.Where(x => uow.Set<GuildConfig>()
|
||||||
.Any(y => y.GuildId == x.GuildId
|
.Any(y => y.GuildId == x.GuildId
|
||||||
&& y.WarnExpireHours > 0
|
&& y.WarnExpireHours > 0
|
||||||
&& y.WarnExpireAction == WarnExpireAction.Delete)
|
&& y.WarnExpireAction == WarnExpireAction.Delete)
|
||||||
&& x.DateAdded
|
&& x.DateAdded
|
||||||
< DateTime.UtcNow.AddHours(-uow.Set<GuildConfig>()
|
< DateTime.UtcNow.AddHours(-uow.Set<GuildConfig>()
|
||||||
.Where(y => x.GuildId == y.GuildId)
|
.Where(y => x.GuildId == y.GuildId)
|
||||||
.Select(y => y.WarnExpireHours)
|
.Select(y => y.WarnExpireHours)
|
||||||
.First()))
|
.First()))
|
||||||
.DeleteAsync();
|
.DeleteAsync();
|
||||||
|
|
||||||
if (cleared > 0 || deleted > 0)
|
if (cleared > 0 || deleted > 0)
|
||||||
{
|
{
|
||||||
@@ -293,21 +294,21 @@ public class UserPunishService : INService, IReadyExecutor
|
|||||||
if (config.WarnExpireAction == WarnExpireAction.Clear)
|
if (config.WarnExpireAction == WarnExpireAction.Clear)
|
||||||
{
|
{
|
||||||
await uow.Set<Warning>()
|
await uow.Set<Warning>()
|
||||||
.Where(x => x.GuildId == guildId
|
.Where(x => x.GuildId == guildId
|
||||||
&& x.Forgiven == false
|
&& x.Forgiven == false
|
||||||
&& x.DateAdded < DateTime.UtcNow.AddHours(-config.WarnExpireHours))
|
&& x.DateAdded < DateTime.UtcNow.AddHours(-config.WarnExpireHours))
|
||||||
.UpdateAsync(_ => new()
|
.UpdateAsync(_ => new()
|
||||||
{
|
{
|
||||||
Forgiven = true,
|
Forgiven = true,
|
||||||
ForgivenBy = "expiry"
|
ForgivenBy = "expiry"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (config.WarnExpireAction == WarnExpireAction.Delete)
|
else if (config.WarnExpireAction == WarnExpireAction.Delete)
|
||||||
{
|
{
|
||||||
await uow.Set<Warning>()
|
await uow.Set<Warning>()
|
||||||
.Where(x => x.GuildId == guildId
|
.Where(x => x.GuildId == guildId
|
||||||
&& x.DateAdded < DateTime.UtcNow.AddHours(-config.WarnExpireHours))
|
&& x.DateAdded < DateTime.UtcNow.AddHours(-config.WarnExpireHours))
|
||||||
.DeleteAsync();
|
.DeleteAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
await uow.SaveChangesAsync();
|
await uow.SaveChangesAsync();
|
||||||
@@ -425,8 +426,8 @@ public class UserPunishService : INService, IReadyExecutor
|
|||||||
{
|
{
|
||||||
using var uow = _db.GetDbContext();
|
using var uow = _db.GetDbContext();
|
||||||
return uow.GuildConfigsForId(guildId, gc => gc.Include(x => x.WarnPunishments))
|
return uow.GuildConfigsForId(guildId, gc => gc.Include(x => x.WarnPunishments))
|
||||||
.WarnPunishments.OrderBy(x => x.Count)
|
.WarnPunishments.OrderBy(x => x.Count)
|
||||||
.ToArray();
|
.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public (IReadOnlyCollection<(string Original, ulong? Id, string Reason)> Bans, int Missing) MassKill(
|
public (IReadOnlyCollection<(string Original, ulong? Id, string Reason)> Bans, int Missing) MassKill(
|
||||||
@@ -436,20 +437,20 @@ public class UserPunishService : INService, IReadyExecutor
|
|||||||
var gusers = guild.Users;
|
var gusers = guild.Users;
|
||||||
//get user objects and reasons
|
//get user objects and reasons
|
||||||
var bans = people.Split("\n")
|
var bans = people.Split("\n")
|
||||||
.Select(x =>
|
.Select(x =>
|
||||||
{
|
{
|
||||||
var split = x.Trim().Split(" ");
|
var split = x.Trim().Split(" ");
|
||||||
|
|
||||||
var reason = string.Join(" ", split.Skip(1));
|
var reason = string.Join(" ", split.Skip(1));
|
||||||
|
|
||||||
if (ulong.TryParse(split[0], out var id))
|
if (ulong.TryParse(split[0], out var id))
|
||||||
return (Original: split[0], Id: id, Reason: reason);
|
return (Original: split[0], Id: id, Reason: reason);
|
||||||
|
|
||||||
return (Original: split[0],
|
return (Original: split[0],
|
||||||
gusers.FirstOrDefault(u => u.ToString().ToLowerInvariant() == x)?.Id,
|
gusers.FirstOrDefault(u => u.ToString().ToLowerInvariant() == x)?.Id,
|
||||||
Reason: reason);
|
Reason: reason);
|
||||||
})
|
})
|
||||||
.ToArray();
|
.ToArray();
|
||||||
|
|
||||||
//if user is null, means that person couldn't be found
|
//if user is null, means that person couldn't be found
|
||||||
var missing = bans.Count(x => !x.Id.HasValue);
|
var missing = bans.Count(x => !x.Id.HasValue);
|
||||||
@@ -483,11 +484,12 @@ public class UserPunishService : INService, IReadyExecutor
|
|||||||
}
|
}
|
||||||
else if (template is null)
|
else if (template is null)
|
||||||
{
|
{
|
||||||
uow.Set<BanTemplate>().Add(new()
|
uow.Set<BanTemplate>()
|
||||||
{
|
.Add(new()
|
||||||
GuildId = guildId,
|
{
|
||||||
Text = text
|
GuildId = guildId,
|
||||||
});
|
Text = text
|
||||||
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
template.Text = text;
|
template.Text = text;
|
||||||
@@ -499,31 +501,31 @@ public class UserPunishService : INService, IReadyExecutor
|
|||||||
{
|
{
|
||||||
await using var ctx = _db.GetDbContext();
|
await using var ctx = _db.GetDbContext();
|
||||||
await ctx.Set<BanTemplate>()
|
await ctx.Set<BanTemplate>()
|
||||||
.ToLinqToDBTable()
|
.ToLinqToDBTable()
|
||||||
.InsertOrUpdateAsync(() => new()
|
.InsertOrUpdateAsync(() => new()
|
||||||
{
|
{
|
||||||
GuildId = guildId,
|
GuildId = guildId,
|
||||||
Text = null,
|
Text = null,
|
||||||
DateAdded = DateTime.UtcNow,
|
DateAdded = DateTime.UtcNow,
|
||||||
PruneDays = pruneDays
|
PruneDays = pruneDays
|
||||||
},
|
},
|
||||||
old => new()
|
old => new()
|
||||||
{
|
{
|
||||||
PruneDays = pruneDays
|
PruneDays = pruneDays
|
||||||
},
|
},
|
||||||
() => new()
|
() => new()
|
||||||
{
|
{
|
||||||
GuildId = guildId
|
GuildId = guildId
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int?> GetBanPruneAsync(ulong guildId)
|
public async Task<int?> GetBanPruneAsync(ulong guildId)
|
||||||
{
|
{
|
||||||
await using var ctx = _db.GetDbContext();
|
await using var ctx = _db.GetDbContext();
|
||||||
return await ctx.Set<BanTemplate>()
|
return await ctx.Set<BanTemplate>()
|
||||||
.Where(x => x.GuildId == guildId)
|
.Where(x => x.GuildId == guildId)
|
||||||
.Select(x => x.PruneDays)
|
.Select(x => x.PruneDays)
|
||||||
.FirstOrDefaultAsyncLinqToDB();
|
.FirstOrDefaultAsyncLinqToDB();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<SmartText> GetBanUserDmEmbed(
|
public Task<SmartText> GetBanUserDmEmbed(
|
||||||
@@ -554,18 +556,18 @@ public class UserPunishService : INService, IReadyExecutor
|
|||||||
banReason = string.IsNullOrWhiteSpace(banReason) ? "-" : banReason;
|
banReason = string.IsNullOrWhiteSpace(banReason) ? "-" : banReason;
|
||||||
|
|
||||||
var repCtx = new ReplacementContext(client, guild)
|
var repCtx = new ReplacementContext(client, guild)
|
||||||
.WithOverride("%ban.mod%", () => moderator.ToString())
|
.WithOverride("%ban.mod%", () => moderator.ToString())
|
||||||
.WithOverride("%ban.mod.fullname%", () => moderator.ToString())
|
.WithOverride("%ban.mod.fullname%", () => moderator.ToString())
|
||||||
.WithOverride("%ban.mod.name%", () => moderator.Username)
|
.WithOverride("%ban.mod.name%", () => moderator.Username)
|
||||||
.WithOverride("%ban.mod.discrim%", () => moderator.Discriminator)
|
.WithOverride("%ban.mod.discrim%", () => moderator.Discriminator)
|
||||||
.WithOverride("%ban.user%", () => target.ToString())
|
.WithOverride("%ban.user%", () => target.ToString())
|
||||||
.WithOverride("%ban.user.fullname%", () => target.ToString())
|
.WithOverride("%ban.user.fullname%", () => target.ToString())
|
||||||
.WithOverride("%ban.user.name%", () => target.Username)
|
.WithOverride("%ban.user.name%", () => target.Username)
|
||||||
.WithOverride("%ban.user.discrim%", () => target.Discriminator)
|
.WithOverride("%ban.user.discrim%", () => target.Discriminator)
|
||||||
.WithOverride("%reason%", () => banReason)
|
.WithOverride("%reason%", () => banReason)
|
||||||
.WithOverride("%ban.reason%", () => banReason)
|
.WithOverride("%ban.reason%", () => banReason)
|
||||||
.WithOverride("%ban.duration%",
|
.WithOverride("%ban.duration%",
|
||||||
() => duration?.ToString(@"d\.hh\:mm") ?? "perma");
|
() => duration?.ToString(@"d\.hh\:mm") ?? "perma");
|
||||||
|
|
||||||
|
|
||||||
// if template isn't set, use the old message style
|
// if template isn't set, use the old message style
|
||||||
@@ -594,4 +596,24 @@ public class UserPunishService : INService, IReadyExecutor
|
|||||||
var output = SmartText.CreateFrom(template);
|
var output = SmartText.CreateFrom(template);
|
||||||
return await _repSvc.ReplaceAsync(output, repCtx);
|
return await _repSvc.ReplaceAsync(output, repCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<Warning> WarnDelete(ulong userId, int index)
|
||||||
|
{
|
||||||
|
await using var uow = _db.GetDbContext();
|
||||||
|
|
||||||
|
var warn = await uow.GetTable<Warning>()
|
||||||
|
.Where(x => x.UserId == userId)
|
||||||
|
.OrderByDescending(x => x.DateAdded)
|
||||||
|
.Skip(index)
|
||||||
|
.FirstOrDefaultAsyncLinqToDB();
|
||||||
|
|
||||||
|
if (warn is not null)
|
||||||
|
{
|
||||||
|
await uow.GetTable<Warning>()
|
||||||
|
.Where(x => x.Id == warn.Id)
|
||||||
|
.DeleteAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
return warn;
|
||||||
|
}
|
||||||
}
|
}
|
@@ -947,6 +947,10 @@ warnexpire:
|
|||||||
warnclear:
|
warnclear:
|
||||||
- warnclear
|
- warnclear
|
||||||
- warnc
|
- warnc
|
||||||
|
warndelete:
|
||||||
|
- warndelete
|
||||||
|
- warnrm
|
||||||
|
- warnd
|
||||||
warnpunishlist:
|
warnpunishlist:
|
||||||
- warnpunishlist
|
- warnpunishlist
|
||||||
- warnpl
|
- warnpl
|
||||||
|
@@ -3178,6 +3178,13 @@ warnclear:
|
|||||||
desc: "The ID of the user whose warnings are being cleared."
|
desc: "The ID of the user whose warnings are being cleared."
|
||||||
index:
|
index:
|
||||||
desc: "The index of the warning to be cleared, or 0 to clear all warnings."
|
desc: "The index of the warning to be cleared, or 0 to clear all warnings."
|
||||||
|
warndelete:
|
||||||
|
desc: Deletes a warning from a user by its index.
|
||||||
|
ex:
|
||||||
|
- 3
|
||||||
|
params:
|
||||||
|
- index:
|
||||||
|
desc: "The index of the warning to be deleted."
|
||||||
warnpunishlist:
|
warnpunishlist:
|
||||||
desc: Lists punishments for warnings.
|
desc: Lists punishments for warnings.
|
||||||
ex:
|
ex:
|
||||||
|
@@ -702,6 +702,7 @@
|
|||||||
"warn_count": "{0} current, {1} total",
|
"warn_count": "{0} current, {1} total",
|
||||||
"warnlog_for": "Warnlog for {0}",
|
"warnlog_for": "Warnlog for {0}",
|
||||||
"warnpl_none": "No punishments set.",
|
"warnpl_none": "No punishments set.",
|
||||||
|
"warning_not_found": "Warning not found.",
|
||||||
"warn_expire_set_delete": "Warnings will be deleted after {0} days.",
|
"warn_expire_set_delete": "Warnings will be deleted after {0} days.",
|
||||||
"warn_expire_set_clear": "Warnings will be cleared after {0} days.",
|
"warn_expire_set_clear": "Warnings will be cleared after {0} days.",
|
||||||
"warn_expire_reset": "Warnings will no longer expire.",
|
"warn_expire_reset": "Warnings will no longer expire.",
|
||||||
@@ -712,6 +713,7 @@
|
|||||||
"warn_punish_rem": "Having {0} warnings will no longer trigger a punishment.",
|
"warn_punish_rem": "Having {0} warnings will no longer trigger a punishment.",
|
||||||
"warn_punish_set": "I will apply {0} punishment to users with {1} warnings.",
|
"warn_punish_set": "I will apply {0} punishment to users with {1} warnings.",
|
||||||
"warn_punish_set_timed": "I will apply {0} punishment for {2} to users with {1} warnings.",
|
"warn_punish_set_timed": "I will apply {0} punishment for {2} to users with {1} warnings.",
|
||||||
|
"warning_deleted": "Warning {0} has been deleted.",
|
||||||
"time_new": "Time",
|
"time_new": "Time",
|
||||||
"timezone": "Timezone",
|
"timezone": "Timezone",
|
||||||
"timezone_db_api_key": "You need to activate your TimezoneDB API key. You can do so by clicking on the link you've received in the email with your API key.",
|
"timezone_db_api_key": "You need to activate your TimezoneDB API key. You can do so by clicking on the link you've received in the email with your API key.",
|
||||||
|
Reference in New Issue
Block a user