From 9c1efc7886178eecbb358e8e6546ed426d6b30ad Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 29 Jun 2020 14:39:19 +0200 Subject: [PATCH] Move system updates to the same patch system as members --- PluralKit.API/Controllers/v1/JsonModelExt.cs | 22 ++-- .../Controllers/v1/SystemController.cs | 20 ++-- PluralKit.Bot/Commands/SystemEdit.cs | 100 +++++++++++------- PluralKit.Bot/Commands/Token.cs | 11 +- PluralKit.Core/Models/ModelQueryExt.cs | 11 -- PluralKit.Core/Models/PKSystem.cs | 20 ++-- PluralKit.Core/Models/Patch/MemberPatch.cs | 2 +- PluralKit.Core/Models/Patch/ModelPatchExt.cs | 31 ++++++ PluralKit.Core/Models/Patch/PatchObject.cs | 6 +- PluralKit.Core/Models/Patch/SystemPatch.cs | 31 ++++++ PluralKit.Core/Services/DataFileService.cs | 15 +-- PluralKit.Core/Services/IDataStore.cs | 14 --- 12 files changed, 172 insertions(+), 111 deletions(-) create mode 100644 PluralKit.Core/Models/Patch/ModelPatchExt.cs create mode 100644 PluralKit.Core/Models/Patch/SystemPatch.cs diff --git a/PluralKit.API/Controllers/v1/JsonModelExt.cs b/PluralKit.API/Controllers/v1/JsonModelExt.cs index 1fa59c0d..d9e3adc7 100644 --- a/PluralKit.API/Controllers/v1/JsonModelExt.cs +++ b/PluralKit.API/Controllers/v1/JsonModelExt.cs @@ -26,18 +26,20 @@ namespace PluralKit.API return o; } - public static void ApplyJson(this PKSystem system, JObject o) + public static SystemPatch ToSystemPatch(JObject o) { - if (o.ContainsKey("name")) system.Name = o.Value("name").NullIfEmpty().BoundsCheckField(Limits.MaxSystemNameLength, "System name"); - if (o.ContainsKey("description")) system.Description = o.Value("description").NullIfEmpty().BoundsCheckField(Limits.MaxDescriptionLength, "System description"); - if (o.ContainsKey("tag")) system.Tag = o.Value("tag").NullIfEmpty().BoundsCheckField(Limits.MaxSystemTagLength, "System tag"); - if (o.ContainsKey("avatar_url")) system.AvatarUrl = o.Value("avatar_url").NullIfEmpty().BoundsCheckField(Limits.MaxUriLength, "System avatar URL"); - if (o.ContainsKey("tz")) system.UiTz = o.Value("tz") ?? "UTC"; + var patch = new SystemPatch(); + if (o.ContainsKey("name")) patch.Name = o.Value("name").NullIfEmpty().BoundsCheckField(Limits.MaxSystemNameLength, "System name"); + if (o.ContainsKey("description")) patch.Description = o.Value("description").NullIfEmpty().BoundsCheckField(Limits.MaxDescriptionLength, "System description"); + if (o.ContainsKey("tag")) patch.Tag = o.Value("tag").NullIfEmpty().BoundsCheckField(Limits.MaxSystemTagLength, "System tag"); + if (o.ContainsKey("avatar_url")) patch.AvatarUrl = o.Value("avatar_url").NullIfEmpty().BoundsCheckField(Limits.MaxUriLength, "System avatar URL"); + if (o.ContainsKey("tz")) patch.UiTz = o.Value("tz") ?? "UTC"; - if (o.ContainsKey("description_privacy")) system.DescriptionPrivacy = o.Value("description_privacy").ParsePrivacy("description"); - if (o.ContainsKey("member_list_privacy")) system.MemberListPrivacy = o.Value("member_list_privacy").ParsePrivacy("member list"); - if (o.ContainsKey("front_privacy")) system.FrontPrivacy = o.Value("front_privacy").ParsePrivacy("front"); - if (o.ContainsKey("front_history_privacy")) system.FrontHistoryPrivacy = o.Value("front_history_privacy").ParsePrivacy("front history"); + if (o.ContainsKey("description_privacy")) patch.DescriptionPrivacy = o.Value("description_privacy").ParsePrivacy("description"); + if (o.ContainsKey("member_list_privacy")) patch.MemberListPrivacy = o.Value("member_list_privacy").ParsePrivacy("member list"); + if (o.ContainsKey("front_privacy")) patch.FrontPrivacy = o.Value("front_privacy").ParsePrivacy("front"); + if (o.ContainsKey("front_history_privacy")) patch.FrontHistoryPrivacy = o.Value("front_history_privacy").ParsePrivacy("front history"); + return patch; } public static JObject ToJson(this PKMember member, LookupContext ctx) diff --git a/PluralKit.API/Controllers/v1/SystemController.cs b/PluralKit.API/Controllers/v1/SystemController.cs index 84d26899..b092989b 100644 --- a/PluralKit.API/Controllers/v1/SystemController.cs +++ b/PluralKit.API/Controllers/v1/SystemController.cs @@ -41,13 +41,13 @@ namespace PluralKit.API public class SystemController : ControllerBase { private IDataStore _data; - private IDatabase _conn; + private IDatabase _db; private IAuthorizationService _auth; - public SystemController(IDataStore data, IDatabase conn, IAuthorizationService auth) + public SystemController(IDataStore data, IDatabase db, IAuthorizationService auth) { _data = data; - _conn = conn; + _db = db; _auth = auth; } @@ -55,7 +55,7 @@ namespace PluralKit.API [Authorize] public async Task> GetOwnSystem() { - var system = await _conn.Execute(c => c.QuerySystem(User.CurrentSystem())); + var system = await _db.Execute(c => c.QuerySystem(User.CurrentSystem())); return system.ToJson(User.ContextFor(system)); } @@ -94,7 +94,7 @@ namespace PluralKit.API var auth = await _auth.AuthorizeAsync(User, system, "ViewFrontHistory"); if (!auth.Succeeded) return StatusCode(StatusCodes.Status403Forbidden, "Unauthorized to view front history."); - using (var conn = await _conn.Obtain()) + using (var conn = await _db.Obtain()) { var res = await conn.QueryAsync( @"select *, array( @@ -132,17 +132,19 @@ namespace PluralKit.API [Authorize] public async Task> EditSystem([FromBody] JObject changes) { - var system = await _conn.Execute(c => c.QuerySystem(User.CurrentSystem())); + var system = await _db.Execute(c => c.QuerySystem(User.CurrentSystem())); + + SystemPatch patch; try { - system.ApplyJson(changes); + patch = JsonModelExt.ToSystemPatch(changes); } catch (JsonModelParseError e) { return BadRequest(e.Message); } - await _data.SaveSystem(system); + await _db.Execute(conn => conn.UpdateSystem(system.Id, patch)); return Ok(system.ToJson(User.ContextFor(system))); } @@ -166,7 +168,7 @@ namespace PluralKit.API // Resolve member objects for all given IDs IEnumerable membersList; - using (var conn = await _conn.Obtain()) + using (var conn = await _db.Obtain()) membersList = (await conn.QueryAsync("select * from members where hid = any(@Hids)", new {Hids = param.Members})).ToList(); foreach (var member in membersList) diff --git a/PluralKit.Bot/Commands/SystemEdit.cs b/PluralKit.Bot/Commands/SystemEdit.cs index 31df2270..6dd31270 100644 --- a/PluralKit.Bot/Commands/SystemEdit.cs +++ b/PluralKit.Bot/Commands/SystemEdit.cs @@ -34,8 +34,9 @@ namespace PluralKit.Bot if (ctx.MatchFlag("c", "clear") || ctx.Match("clear")) { - ctx.System.Name = null; - await _data.SaveSystem(ctx.System); + var clearPatch = new SystemPatch {Name = null}; + await _db.Execute(conn => conn.UpdateSystem(ctx.System.Id, clearPatch)); + await ctx.Reply($"{Emojis.Success} System name cleared."); return; } @@ -50,9 +51,12 @@ namespace PluralKit.Bot return; } - if (newSystemName != null && newSystemName.Length > Limits.MaxSystemNameLength) throw Errors.SystemNameTooLongError(newSystemName.Length); - ctx.System.Name = newSystemName; - await _data.SaveSystem(ctx.System); + if (newSystemName != null && newSystemName.Length > Limits.MaxSystemNameLength) + throw Errors.SystemNameTooLongError(newSystemName.Length); + + var patch = new SystemPatch {Name = newSystemName}; + await _db.Execute(conn => conn.UpdateSystem(ctx.System.Id, patch)); + await ctx.Reply($"{Emojis.Success} System name changed."); } @@ -61,8 +65,9 @@ namespace PluralKit.Bot if (ctx.MatchFlag("c", "clear") || ctx.Match("clear")) { - ctx.System.Description = null; - await _data.SaveSystem(ctx.System); + var patch = new SystemPatch {Description = null}; + await _db.Execute(conn => conn.UpdateSystem(ctx.System.Id, patch)); + await ctx.Reply($"{Emojis.Success} System description cleared."); return; } @@ -84,8 +89,10 @@ namespace PluralKit.Bot else { if (newDescription.Length > Limits.MaxDescriptionLength) throw Errors.DescriptionTooLongError(newDescription.Length); - ctx.System.Description = newDescription; - await _data.SaveSystem(ctx.System); + + var patch = new SystemPatch {Description = newDescription}; + await _db.Execute(conn => conn.UpdateSystem(ctx.System.Id, patch)); + await ctx.Reply($"{Emojis.Success} System description changed."); } } @@ -96,8 +103,9 @@ namespace PluralKit.Bot if (ctx.MatchFlag("c", "clear") || ctx.Match("clear")) { - ctx.System.Tag = null; - await _data.SaveSystem(ctx.System); + var patch = new SystemPatch {Tag = null}; + await _db.Execute(conn => conn.UpdateSystem(ctx.System.Id, patch)); + await ctx.Reply($"{Emojis.Success} System tag cleared."); } else if (!ctx.HasNext(skipFlags: false)) { @@ -112,8 +120,10 @@ namespace PluralKit.Bot if (newTag != null) if (newTag.Length > Limits.MaxSystemTagLength) throw Errors.SystemNameTooLongError(newTag.Length); - ctx.System.Tag = newTag; - await _data.SaveSystem(ctx.System); + + var patch = new SystemPatch {Tag = newTag}; + await _db.Execute(conn => conn.UpdateSystem(ctx.System.Id, patch)); + await ctx.Reply($"{Emojis.Success} System tag changed. Member names will now end with `{newTag}` when proxied."); } } @@ -124,8 +134,9 @@ namespace PluralKit.Bot if (ctx.Match("clear") || ctx.MatchFlag("c", "clear")) { - ctx.System.AvatarUrl = null; - await _data.SaveSystem(ctx.System); + var patch = new SystemPatch {AvatarUrl = null}; + await _db.Execute(conn => conn.UpdateSystem(ctx.System.Id, patch)); + await ctx.Reply($"{Emojis.Success} System avatar cleared."); return; } @@ -149,10 +160,12 @@ namespace PluralKit.Bot if (member != null) { if (member.AvatarHash == null) throw Errors.UserHasNoAvatar; - ctx.System.AvatarUrl = member.GetAvatarUrl(ImageFormat.Png, size: 256); - await _data.SaveSystem(ctx.System); - - var embed = new DiscordEmbedBuilder().WithImageUrl(ctx.System.AvatarUrl).Build(); + + var newUrl = member.GetAvatarUrl(ImageFormat.Png, size: 256); + var patch = new SystemPatch {AvatarUrl = newUrl}; + await _db.Execute(conn => conn.UpdateSystem(ctx.System.Id, patch)); + + var embed = new DiscordEmbedBuilder().WithImageUrl(newUrl).Build(); await ctx.Reply( $"{Emojis.Success} System avatar changed to {member.Username}'s avatar! {Emojis.Warn} Please note that if {member.Username} changes their avatar, the system's avatar will need to be re-set.", embed: embed); } @@ -163,8 +176,8 @@ namespace PluralKit.Bot if (url?.Length > Limits.MaxUriLength) throw Errors.InvalidUrl(url); await ctx.BusyIndicator(() => AvatarUtils.VerifyAvatarOrThrow(url)); - ctx.System.AvatarUrl = url; - await _data.SaveSystem(ctx.System); + var patch = new SystemPatch {AvatarUrl = url}; + await _db.Execute(conn => conn.UpdateSystem(ctx.System.Id, patch)); var embed = url != null ? new DiscordEmbedBuilder().WithImageUrl(url).Build() : null; await ctx.Reply($"{Emojis.Success} System avatar changed.", embed: embed); @@ -178,7 +191,8 @@ namespace PluralKit.Bot if (!await ctx.ConfirmWithReply(ctx.System.Hid)) throw new PKError($"System deletion cancelled. Note that you must reply with your system ID (`{ctx.System.Hid}`) *verbatim*."); - await _data.DeleteSystem(ctx.System); + await _db.Execute(conn => conn.DeleteSystem(ctx.System.Id)); + await ctx.Reply($"{Emojis.Success} System deleted."); } @@ -216,8 +230,9 @@ namespace PluralKit.Bot if (ctx.MatchFlag("c", "clear") || ctx.Match("clear")) { - ctx.System.UiTz = "UTC"; - await _data.SaveSystem(ctx.System); + var clearPatch = new SystemPatch {UiTz = "UTC"}; + await _db.Execute(conn => conn.UpdateSystem(ctx.System.Id, clearPatch)); + await ctx.Reply($"{Emojis.Success} System time zone cleared (set to UTC)."); return; } @@ -237,8 +252,9 @@ namespace PluralKit.Bot var msg = await ctx.Reply( $"This will change the system time zone to **{zone.Id}**. The current time is **{currentTime.FormatZoned()}**. Is this correct?"); if (!await ctx.PromptYesNo(msg)) throw Errors.TimezoneChangeCancelled; - ctx.System.UiTz = zone.Id; - await _data.SaveSystem(ctx.System); + + var patch = new SystemPatch {UiTz = zone.Id}; + await _db.Execute(conn => conn.UpdateSystem(ctx.System.Id, patch)); await ctx.Reply($"System time zone changed to **{zone.Id}**."); } @@ -290,39 +306,41 @@ namespace PluralKit.Bot string levelStr, levelExplanation, subjectStr; var subjectList = "`description`, `members`, `front`, `fronthistory`, or `all`"; + + SystemPatch patch = new SystemPatch(); if (ctx.Match("description", "desc", "text", "info")) { subjectStr = "description"; - ctx.System.DescriptionPrivacy = PopPrivacyLevel("description", out levelStr, out levelExplanation); + patch.DescriptionPrivacy = PopPrivacyLevel("description", out levelStr, out levelExplanation); } else if (ctx.Match("members", "memberlist", "list", "mlist")) { subjectStr = "member list"; - ctx.System.MemberListPrivacy = PopPrivacyLevel("members", out levelStr, out levelExplanation); + patch.MemberListPrivacy = PopPrivacyLevel("members", out levelStr, out levelExplanation); } else if (ctx.Match("front", "fronter")) { subjectStr = "fronter(s)"; - ctx.System.FrontPrivacy = PopPrivacyLevel("front", out levelStr, out levelExplanation); + patch.FrontPrivacy = PopPrivacyLevel("front", out levelStr, out levelExplanation); } else if (ctx.Match("switch", "switches", "fronthistory", "fh")) { subjectStr = "front history"; - ctx.System.FrontHistoryPrivacy = PopPrivacyLevel("fronthistory", out levelStr, out levelExplanation); + patch.FrontHistoryPrivacy = PopPrivacyLevel("fronthistory", out levelStr, out levelExplanation); } else if (ctx.Match("all")){ subjectStr = "all"; PrivacyLevel level = PopPrivacyLevel("all", out levelStr, out levelExplanation); - ctx.System.DescriptionPrivacy = level; - ctx.System.MemberListPrivacy = level; - ctx.System.FrontPrivacy = level; - ctx.System.FrontHistoryPrivacy = level; + patch.DescriptionPrivacy = level; + patch.MemberListPrivacy = level; + patch.FrontPrivacy = level; + patch.FrontHistoryPrivacy = level; } else throw new PKSyntaxError($"Invalid privacy subject `{ctx.PopArgument()}` (must be {subjectList})."); - await _data.SaveSystem(ctx.System); + await _db.Execute(conn => conn.UpdateSystem(ctx.System.Id, patch)); if(subjectStr == "all"){ if(levelStr == "private") await ctx.Reply($"All of your systems privacy settings have been set to **{levelStr}**. Other accounts will now see nothing on the member card."); @@ -331,7 +349,7 @@ namespace PluralKit.Bot } //Handle other subjects else - await ctx.Reply($"System {subjectStr} privacy has been set to **{levelStr}**. Other accounts will now {levelExplanation} your system {subjectStr}."); + await ctx.Reply($"System {subjectStr} privacy has been set to **{levelStr}**. Other accounts will now {levelExplanation} your system {subjectStr}."); } public async Task SystemPing(Context ctx) @@ -345,13 +363,15 @@ namespace PluralKit.Bot } else { if (ctx.Match("on", "enable")) { - ctx.System.PingsEnabled = true; - await _data.SaveSystem(ctx.System); + var patch = new SystemPatch {PingsEnabled = true}; + await _db.Execute(conn => conn.UpdateSystem(ctx.System.Id, patch)); + await ctx.Reply("Reaction pings have now been enabled."); } if (ctx.Match("off", "disable")) { - ctx.System.PingsEnabled = false; - await _data.SaveSystem(ctx.System); + var patch = new SystemPatch {PingsEnabled = false}; + await _db.Execute(conn => conn.UpdateSystem(ctx.System.Id, patch)); + await ctx.Reply("Reaction pings have now been disabled."); } } diff --git a/PluralKit.Bot/Commands/Token.cs b/PluralKit.Bot/Commands/Token.cs index 6e3074ae..d2cb3720 100644 --- a/PluralKit.Bot/Commands/Token.cs +++ b/PluralKit.Bot/Commands/Token.cs @@ -8,10 +8,10 @@ namespace PluralKit.Bot { public class Token { - private IDataStore _data; - public Token(IDataStore data) + private readonly IDatabase _db; + public Token(IDatabase db) { - _data = data; + _db = db; } public async Task GetToken(Context ctx) @@ -35,8 +35,9 @@ namespace PluralKit.Bot private async Task MakeAndSetNewToken(PKSystem system) { - system.Token = Core.StringUtils.GenerateToken(); - await _data.SaveSystem(system); + var patch = new SystemPatch {Token = StringUtils.GenerateToken()}; + await _db.Execute(conn => conn.UpdateSystem(system.Id, patch)); + return system.Token; } diff --git a/PluralKit.Core/Models/ModelQueryExt.cs b/PluralKit.Core/Models/ModelQueryExt.cs index eb6a5594..00128fce 100644 --- a/PluralKit.Core/Models/ModelQueryExt.cs +++ b/PluralKit.Core/Models/ModelQueryExt.cs @@ -28,16 +28,5 @@ namespace PluralKit.Core conn.QueryFirstAsync( "insert into member_guild (guild, member) values (@guild, @member) on conflict (guild, member) do update set guild = @guild, member = @member returning *", new {guild, member}); - - public static Task UpdateMember(this IPKConnection conn, MemberId id, MemberPatch patch) - { - var (query, pms) = patch.Apply(new UpdateQueryBuilder("members", "id = @id")) - .WithConstant("id", id) - .Build("returning *"); - return conn.QueryFirstAsync(query, pms); - } - - public static Task DeleteMember(this IPKConnection conn, MemberId id) => - conn.ExecuteAsync("delete from members where id = @Id", new {Id = id}); } } \ No newline at end of file diff --git a/PluralKit.Core/Models/PKSystem.cs b/PluralKit.Core/Models/PKSystem.cs index 73d457a4..aff336af 100644 --- a/PluralKit.Core/Models/PKSystem.cs +++ b/PluralKit.Core/Models/PKSystem.cs @@ -10,18 +10,18 @@ namespace PluralKit.Core { // Additions here should be mirrored in SystemStore::Save [Key] public SystemId Id { get; } public string Hid { get; } - public string Name { get; set; } - public string Description { get; set; } - public string Tag { get; set; } - public string AvatarUrl { get; set; } - public string Token { get; set; } + public string Name { get; } + public string Description { get; } + public string Tag { get; } + public string AvatarUrl { get; } + public string Token { get; } public Instant Created { get; } public string UiTz { get; set; } - public bool PingsEnabled { get; set; } - public PrivacyLevel DescriptionPrivacy { get; set; } - public PrivacyLevel MemberListPrivacy { get; set; } - public PrivacyLevel FrontPrivacy { get; set; } - public PrivacyLevel FrontHistoryPrivacy { get; set; } + public bool PingsEnabled { get; } + public PrivacyLevel DescriptionPrivacy { get; } + public PrivacyLevel MemberListPrivacy { get;} + public PrivacyLevel FrontPrivacy { get; } + public PrivacyLevel FrontHistoryPrivacy { get; } [JsonIgnore] public DateTimeZone Zone => DateTimeZoneProviders.Tzdb.GetZoneOrNull(UiTz); } diff --git a/PluralKit.Core/Models/Patch/MemberPatch.cs b/PluralKit.Core/Models/Patch/MemberPatch.cs index aa1529f2..51a2b552 100644 --- a/PluralKit.Core/Models/Patch/MemberPatch.cs +++ b/PluralKit.Core/Models/Patch/MemberPatch.cs @@ -4,7 +4,7 @@ using NodaTime; namespace PluralKit.Core { - public class MemberPatch: PatchObject + public class MemberPatch: PatchObject { public Partial Name { get; set; } public Partial DisplayName { get; set; } diff --git a/PluralKit.Core/Models/Patch/ModelPatchExt.cs b/PluralKit.Core/Models/Patch/ModelPatchExt.cs new file mode 100644 index 00000000..edcc90f6 --- /dev/null +++ b/PluralKit.Core/Models/Patch/ModelPatchExt.cs @@ -0,0 +1,31 @@ +using System.Threading.Tasks; + +using Dapper; + +namespace PluralKit.Core +{ + public static class ModelPatchExt + { + public static Task UpdateSystem(this IPKConnection conn, SystemId id, SystemPatch patch) + { + var (query, pms) = patch.Apply(new UpdateQueryBuilder("systems", "id = @id")) + .WithConstant("id", id) + .Build("returning *"); + return conn.QueryFirstAsync(query, pms); + } + + public static Task DeleteSystem(this IPKConnection conn, SystemId id) => + conn.ExecuteAsync("delete from systems where id = @Id", new {Id = id}); + + public static Task UpdateMember(this IPKConnection conn, MemberId id, MemberPatch patch) + { + var (query, pms) = patch.Apply(new UpdateQueryBuilder("members", "id = @id")) + .WithConstant("id", id) + .Build("returning *"); + return conn.QueryFirstAsync(query, pms); + } + + public static Task DeleteMember(this IPKConnection conn, MemberId id) => + conn.ExecuteAsync("delete from members where id = @Id", new {Id = id}); + } +} \ No newline at end of file diff --git a/PluralKit.Core/Models/Patch/PatchObject.cs b/PluralKit.Core/Models/Patch/PatchObject.cs index 9105cf6e..476007ef 100644 --- a/PluralKit.Core/Models/Patch/PatchObject.cs +++ b/PluralKit.Core/Models/Patch/PatchObject.cs @@ -1,8 +1,6 @@ -using PluralKit.Core; - -namespace PluralKit.Core +namespace PluralKit.Core { - public abstract class PatchObject + public abstract class PatchObject { public abstract UpdateQueryBuilder Apply(UpdateQueryBuilder b); } diff --git a/PluralKit.Core/Models/Patch/SystemPatch.cs b/PluralKit.Core/Models/Patch/SystemPatch.cs new file mode 100644 index 00000000..aecd160f --- /dev/null +++ b/PluralKit.Core/Models/Patch/SystemPatch.cs @@ -0,0 +1,31 @@ +#nullable enable +namespace PluralKit.Core +{ + public class SystemPatch: PatchObject + { + public Partial Name { get; set; } + public Partial Description { get; set; } + public Partial Tag { get; set; } + public Partial AvatarUrl { get; set; } + public Partial Token { get; set; } + public Partial UiTz { get; set; } + public Partial DescriptionPrivacy { get; set; } + public Partial MemberListPrivacy { get; set; } + public Partial FrontPrivacy { get; set; } + public Partial FrontHistoryPrivacy { get; set; } + public Partial PingsEnabled { get; set; } + + public override UpdateQueryBuilder Apply(UpdateQueryBuilder b) => b + .With("name", Name) + .With("description", Description) + .With("tag", Tag) + .With("avatar_url", AvatarUrl) + .With("token", Token) + .With("ui_tz", UiTz) + .With("description_privacy", DescriptionPrivacy) + .With("member_list_privacy", MemberListPrivacy) + .With("front_privacy", FrontPrivacy) + .With("front_history_privacy", FrontHistoryPrivacy) + .With("pings_enabled", PingsEnabled); + } +} \ No newline at end of file diff --git a/PluralKit.Core/Services/DataFileService.cs b/PluralKit.Core/Services/DataFileService.cs index 5e399ad8..9a7dec4a 100644 --- a/PluralKit.Core/Services/DataFileService.cs +++ b/PluralKit.Core/Services/DataFileService.cs @@ -116,16 +116,17 @@ namespace PluralKit.Core await _data.AddAccount(system, accountId); } + await using var conn = await _db.Obtain(); + // Apply system info - system.Name = data.Name; - if (data.Description != null) system.Description = data.Description; - if (data.Tag != null) system.Tag = data.Tag; - if (data.AvatarUrl != null) system.AvatarUrl = data.AvatarUrl; - if (data.TimeZone != null) system.UiTz = data.TimeZone ?? "UTC"; - await _data.SaveSystem(system); + var patch = new SystemPatch {Name = data.Name}; + if (data.Description != null) patch.Description = data.Description; + if (data.Tag != null) patch.Tag = data.Tag; + if (data.AvatarUrl != null) patch.AvatarUrl = data.AvatarUrl; + if (data.TimeZone != null) patch.UiTz = data.TimeZone ?? "UTC"; + await conn.UpdateSystem(system.Id, patch); // -- Member/switch import -- - await using var conn = await _db.Obtain(); await using (var imp = await BulkImporter.Begin(system, conn)) { // Tally up the members that didn't exist before, and check member count on import diff --git a/PluralKit.Core/Services/IDataStore.cs b/PluralKit.Core/Services/IDataStore.cs index 93f40748..a84b860e 100644 --- a/PluralKit.Core/Services/IDataStore.cs +++ b/PluralKit.Core/Services/IDataStore.cs @@ -102,20 +102,6 @@ namespace PluralKit.Core { /// /// Throws an exception (TODO: which?) if the given account is not linked to the given system. Task RemoveAccount(PKSystem system, ulong accountToRemove); - - /// - /// Saves the information within the given struct to the data store. - /// - Task SaveSystem(PKSystem system); - - /// - /// Deletes the given system from the database. - /// - /// - /// This will also delete all the system's members, all system switches, and every message that has been proxied - /// by members in the system. - /// - Task DeleteSystem(PKSystem system); /// /// Gets a member by its user-facing human ID.