mirror of
https://github.com/PluralKit/PluralKit.git
synced 2026-02-04 04:56:49 +00:00
feat: initial 6-character HID rework
This commit is contained in:
parent
73f43b8cb3
commit
9f56697241
30 changed files with 208 additions and 91 deletions
|
|
@ -122,13 +122,13 @@ begin
|
|||
end
|
||||
$$ language plpgsql;
|
||||
|
||||
create function generate_hid() returns char(5) as $$
|
||||
select string_agg(substr('abcdefghijklmnopqrstuvwxyz', ceil(random() * 26)::integer, 1), '') from generate_series(1, 5)
|
||||
create function generate_hid() returns char(6) as $$
|
||||
select string_agg(substr('abcefghjknoprstuvwxyz', ceil(random() * 21)::integer, 1), '') from generate_series(1, 6)
|
||||
$$ language sql volatile;
|
||||
|
||||
|
||||
create function find_free_system_hid() returns char(5) as $$
|
||||
declare new_hid char(5);
|
||||
create function find_free_system_hid() returns char(6) as $$
|
||||
declare new_hid char(6);
|
||||
begin
|
||||
loop
|
||||
new_hid := generate_hid();
|
||||
|
|
@ -138,8 +138,8 @@ end
|
|||
$$ language plpgsql volatile;
|
||||
|
||||
|
||||
create function find_free_member_hid() returns char(5) as $$
|
||||
declare new_hid char(5);
|
||||
create function find_free_member_hid() returns char(6) as $$
|
||||
declare new_hid char(6);
|
||||
begin
|
||||
loop
|
||||
new_hid := generate_hid();
|
||||
|
|
@ -148,8 +148,9 @@ begin
|
|||
end
|
||||
$$ language plpgsql volatile;
|
||||
|
||||
create function find_free_group_hid() returns char(5) as $$
|
||||
declare new_hid char(5);
|
||||
|
||||
create function find_free_group_hid() returns char(6) as $$
|
||||
declare new_hid char(6);
|
||||
begin
|
||||
loop
|
||||
new_hid := generate_hid();
|
||||
|
|
|
|||
10
PluralKit.Core/Database/Migrations/42.sql
Normal file
10
PluralKit.Core/Database/Migrations/42.sql
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
-- database version 42
|
||||
-- move to 6 character HIDs, add HID display config setting
|
||||
|
||||
alter table systems alter column hid type char(6) using rpad(hid, 6, ' ');
|
||||
alter table members alter column hid type char(6) using rpad(hid, 6, ' ');
|
||||
alter table groups alter column hid type char(6) using rpad(hid, 6, ' ');
|
||||
|
||||
alter table system_config add column hid_display_split bool default false;
|
||||
|
||||
update info set schema_version = 42;
|
||||
|
|
@ -9,7 +9,7 @@ namespace PluralKit.Core;
|
|||
internal class DatabaseMigrator
|
||||
{
|
||||
private const string RootPath = "PluralKit.Core.Database"; // "resource path" root for SQL files
|
||||
private const int TargetSchemaVersion = 41;
|
||||
private const int TargetSchemaVersion = 42;
|
||||
private readonly ILogger _logger;
|
||||
|
||||
public DatabaseMigrator(ILogger logger)
|
||||
|
|
|
|||
35
PluralKit.Core/Database/Utils/HidUtils.cs
Normal file
35
PluralKit.Core/Database/Utils/HidUtils.cs
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace PluralKit.Core;
|
||||
|
||||
public static class HidUtils
|
||||
{
|
||||
private static readonly Regex _hidRegex = new(@"^[a-zA-Z]{5,6}$");
|
||||
|
||||
public static string? ParseHid(string input)
|
||||
{
|
||||
input = input.ToLower().Replace("-", null);
|
||||
if (!_hidRegex.IsMatch(input))
|
||||
return null;
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
public static bool TryParseHid(this string input, out string hid)
|
||||
{
|
||||
hid = ParseHid(input);
|
||||
return hid != null;
|
||||
}
|
||||
|
||||
public static string HidTransform(string input, bool split = false)
|
||||
{
|
||||
if (split && input.Length > 5)
|
||||
{
|
||||
var len = (int)Math.Floor(input.Length / 2.0);
|
||||
input = string.Concat(input.AsSpan(0, len), "-", input.AsSpan(len));
|
||||
}
|
||||
|
||||
return input;
|
||||
}
|
||||
}
|
||||
|
|
@ -32,7 +32,13 @@ public readonly struct GroupId: INumericId<GroupId, int>
|
|||
public class PKGroup
|
||||
{
|
||||
public GroupId Id { get; private set; }
|
||||
public string Hid { get; private set; } = null!;
|
||||
private string _hid = null!;
|
||||
public string Hid
|
||||
{
|
||||
private set => _hid = value.Trim();
|
||||
get => _hid;
|
||||
}
|
||||
|
||||
public Guid Uuid { get; private set; }
|
||||
public SystemId System { get; private set; }
|
||||
|
||||
|
|
|
|||
|
|
@ -35,7 +35,13 @@ public class PKMember
|
|||
// Dapper *can* figure out mapping to getter-only properties, but this doesn't work
|
||||
// when trying to map to *subclasses* (eg. ListedMember). Adding private setters makes it work anyway.
|
||||
public MemberId Id { get; private set; }
|
||||
public string Hid { get; private set; }
|
||||
private string _hid = null!;
|
||||
public string Hid
|
||||
{
|
||||
private set => _hid = value.Trim();
|
||||
get => _hid;
|
||||
}
|
||||
|
||||
public Guid Uuid { get; private set; }
|
||||
public SystemId System { get; private set; }
|
||||
public string Color { get; private set; }
|
||||
|
|
|
|||
|
|
@ -33,7 +33,13 @@ public readonly struct SystemId: INumericId<SystemId, int>
|
|||
public class PKSystem
|
||||
{
|
||||
[Key] public SystemId Id { get; }
|
||||
public string Hid { get; }
|
||||
private string _hid = null!;
|
||||
public string Hid
|
||||
{
|
||||
private set => _hid = value.Trim();
|
||||
get => _hid;
|
||||
}
|
||||
|
||||
public Guid Uuid { get; private set; }
|
||||
public string Name { get; }
|
||||
public string Description { get; }
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ public class SystemConfigPatch: PatchObject
|
|||
public Partial<string[]> DescriptionTemplates { get; set; }
|
||||
public Partial<bool> CaseSensitiveProxyTags { get; set; }
|
||||
public Partial<bool> ProxyErrorMessageEnabled { get; set; }
|
||||
public Partial<bool> HidDisplaySplit { get; set; }
|
||||
|
||||
|
||||
public override Query Apply(Query q) => q.ApplyPatch(wrapper => wrapper
|
||||
|
|
@ -33,6 +34,7 @@ public class SystemConfigPatch: PatchObject
|
|||
.With("description_templates", DescriptionTemplates)
|
||||
.With("case_sensitive_proxy_tags", CaseSensitiveProxyTags)
|
||||
.With("proxy_error_message_enabled", ProxyErrorMessageEnabled)
|
||||
.With("hid_display_split", HidDisplaySplit)
|
||||
);
|
||||
|
||||
public new void AssertIsValid()
|
||||
|
|
@ -88,6 +90,9 @@ public class SystemConfigPatch: PatchObject
|
|||
if (ProxyErrorMessageEnabled.IsPresent)
|
||||
o.Add("proxy_error_message_enabled", ProxyErrorMessageEnabled.Value);
|
||||
|
||||
if (HidDisplaySplit.IsPresent)
|
||||
o.Add("hid_display_split", HidDisplaySplit.Value);
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
|
|
@ -119,6 +124,9 @@ public class SystemConfigPatch: PatchObject
|
|||
if (o.ContainsKey("proxy_error_message_enabled"))
|
||||
patch.ProxyErrorMessageEnabled = o.Value<bool>("proxy_error_message_enabled");
|
||||
|
||||
if (o.ContainsKey("hid_display_split"))
|
||||
patch.HidDisplaySplit = o.Value<bool>("hid_display_split");
|
||||
|
||||
return patch;
|
||||
}
|
||||
}
|
||||
|
|
@ -19,8 +19,9 @@ public class SystemConfig
|
|||
|
||||
public DateTimeZone Zone => DateTimeZoneProviders.Tzdb.GetZoneOrNull(UiTz);
|
||||
|
||||
public bool CaseSensitiveProxyTags { get; set; }
|
||||
public bool CaseSensitiveProxyTags { get; }
|
||||
public bool ProxyErrorMessageEnabled { get; }
|
||||
public bool HidDisplaySplit { get; }
|
||||
}
|
||||
|
||||
public static class SystemConfigExt
|
||||
|
|
@ -39,6 +40,7 @@ public static class SystemConfigExt
|
|||
o.Add("group_limit", cfg.GroupLimitOverride ?? Limits.MaxGroupCount);
|
||||
o.Add("case_sensitive_proxy_tags", cfg.CaseSensitiveProxyTags);
|
||||
o.Add("proxy_error_message_enabled", cfg.ProxyErrorMessageEnabled);
|
||||
o.Add("hid_display_split", cfg.HidDisplaySplit);
|
||||
|
||||
o.Add("description_templates", JArray.FromObject(cfg.DescriptionTemplates));
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue