Implement custom portrait generation: update API, UI, and localization to support user-defined prompts for portraits, replacing half-body option with custom variant.
This commit is contained in:
@@ -271,7 +271,7 @@ internal sealed class SchoolStore
|
||||
public bool HasPortrait(int schoolId, string personId, PortraitKind kind) =>
|
||||
File.Exists(PortraitPath(schoolId, personId, kind));
|
||||
|
||||
public (bool HasAvatar, bool HasHalfBody, bool HasFullBody) PortraitFlags(int schoolId, string personId)
|
||||
public (bool HasAvatar, bool HasCustom, bool HasFullBody) PortraitFlags(int schoolId, string personId)
|
||||
{
|
||||
var directory = PortraitsDirectory(schoolId);
|
||||
if (!Directory.Exists(directory))
|
||||
@@ -281,10 +281,22 @@ internal sealed class SchoolStore
|
||||
|
||||
return (
|
||||
HasPortrait(schoolId, personId, PortraitKind.Avatar),
|
||||
HasPortrait(schoolId, personId, PortraitKind.Half),
|
||||
HasPortrait(schoolId, personId, PortraitKind.Custom),
|
||||
HasPortrait(schoolId, personId, PortraitKind.Full));
|
||||
}
|
||||
|
||||
public string CustomPortraitPromptPath(int schoolId, string personId)
|
||||
{
|
||||
var safeId = SanitizePersonId(personId);
|
||||
return Path.Combine(PortraitsDirectory(schoolId), $"{safeId}.custom.prompt.txt");
|
||||
}
|
||||
|
||||
public string? TryReadCustomPortraitPrompt(int schoolId, string personId)
|
||||
{
|
||||
var path = CustomPortraitPromptPath(schoolId, personId);
|
||||
return File.Exists(path) ? File.ReadAllText(path) : null;
|
||||
}
|
||||
|
||||
public string PortraitPath(int schoolId, string personId, PortraitKind kind)
|
||||
{
|
||||
var safeId = SanitizePersonId(personId);
|
||||
@@ -292,13 +304,21 @@ internal sealed class SchoolStore
|
||||
return Path.Combine(PortraitsDirectory(schoolId), $"{safeId}.{suffix}.png");
|
||||
}
|
||||
|
||||
public void SavePortrait(int schoolId, string personId, PortraitKind kind, ReadOnlySpan<byte> png)
|
||||
public void SavePortrait(int schoolId, string personId, PortraitKind kind, ReadOnlySpan<byte> png, string? customPrompt = null)
|
||||
{
|
||||
var path = PortraitPath(schoolId, personId, kind);
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(path)!);
|
||||
var temp = path + ".tmp";
|
||||
File.WriteAllBytes(temp, png);
|
||||
File.Move(temp, path, overwrite: true);
|
||||
|
||||
if (kind == PortraitKind.Custom && customPrompt is not null)
|
||||
{
|
||||
var promptPath = CustomPortraitPromptPath(schoolId, personId);
|
||||
var promptTemp = promptPath + ".tmp";
|
||||
File.WriteAllText(promptTemp, customPrompt);
|
||||
File.Move(promptTemp, promptPath, overwrite: true);
|
||||
}
|
||||
}
|
||||
|
||||
private static string SanitizePersonId(string personId)
|
||||
|
||||
Reference in New Issue
Block a user