feat: premium ID changes
Some checks failed
Build and push Docker image / .net docker build (push) Has been cancelled
.net checks / run .net tests (push) Has been cancelled
.net checks / dotnet-format (push) Has been cancelled
Build and push Rust service Docker images / rust docker build (push) Has been cancelled
rust checks / cargo fmt (push) Has been cancelled

This commit is contained in:
Iris System 2025-12-28 00:06:51 +13:00
parent 41f8beb2aa
commit 24b6b0d455
16 changed files with 306 additions and 3 deletions

View file

@ -9,6 +9,8 @@ using Myriad.Types;
using Newtonsoft.Json;
using NodaTime;
using PluralKit.Core;
using SqlKata.Compilers;
@ -20,13 +22,47 @@ public class SystemEdit
private readonly DataFileService _dataFiles;
private readonly PrivateChannelService _dmCache;
private readonly AvatarHostingService _avatarHosting;
private readonly BotConfig _botConfig;
public SystemEdit(DataFileService dataFiles, HttpClient client, PrivateChannelService dmCache, AvatarHostingService avatarHosting)
public SystemEdit(DataFileService dataFiles, HttpClient client, PrivateChannelService dmCache, AvatarHostingService avatarHosting, BotConfig botConfig)
{
_dataFiles = dataFiles;
_client = client;
_dmCache = dmCache;
_avatarHosting = avatarHosting;
_botConfig = botConfig;
}
public async Task ChangeId(Context ctx, PKSystem target)
{
ctx.CheckSystem().CheckOwnSystem(target);
if (!ctx.Premium)
throw Errors.PremiumExclusiveCommand();
var input = ctx.PopArgument();
if (!input.TryParseHid(out var newHid))
throw new PKError($"Invalid new system ID `{input}`.");
var existingSystem = await ctx.Repository.GetSystemByHid(newHid);
if (existingSystem != null)
throw new PKError($"Another system already exists with ID `{newHid.DisplayHid(ctx.Config)}`.");
if (ctx.Config.PremiumIdChangesRemaining < 1)
throw new PKError("You do not have enough available ID changes to do this.");
if ((await ctx.Repository.GetHidChangelogCountForDate(target.Id, SystemClock.Instance.GetCurrentInstant().InUtc().Date)) >= Limits.PremiumDailyHidChanges)
throw new PKError($"You have already changed {Limits.PremiumDailyHidChanges} IDs today. Please try again tomorrow.");
if (!await ctx.PromptYesNo($"Change your system ID to `{newHid.DisplayHid(ctx.Config)}`?", "Change"))
throw new PKError("ID change cancelled.");
if (!await ctx.Repository.TryUpdateSystemConfigForIdChange(target.Id))
throw new PKError("You do not have enough available ID changes to do this.");
await ctx.Repository.CreateHidChangelog(target.Id, ctx.Message.Author.Id, "system", target.Hid, newHid);
await ctx.Repository.UpdateSystem(target.Id, new SystemPatch { Hid = newHid });
var newConfig = await ctx.Repository.GetSystemConfig(target.Id);
await ctx.Reply($"{Emojis.Success} System ID changed to `{newHid.DisplayHid(ctx.Config)}`. You have **{newConfig.PremiumIdChangesRemaining}** ID changes remaining.");
}
public async Task Name(Context ctx, PKSystem target)