112 lines
3.0 KiB
C#
112 lines
3.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Text.Json;
|
|
using AxCopilot.Models;
|
|
|
|
namespace AxCopilot.Services;
|
|
|
|
public static class PresetService
|
|
{
|
|
private static readonly List<TopicPreset> _presets = new List<TopicPreset>();
|
|
|
|
private static bool _loaded;
|
|
|
|
public static IReadOnlyList<TopicPreset> Presets
|
|
{
|
|
get
|
|
{
|
|
if (!_loaded)
|
|
{
|
|
Load();
|
|
}
|
|
return _presets;
|
|
}
|
|
}
|
|
|
|
public static TopicPreset? GetByCategory(string category)
|
|
{
|
|
return Presets.FirstOrDefault((TopicPreset p) => p.Category == category);
|
|
}
|
|
|
|
public static IReadOnlyList<TopicPreset> GetByTab(string tab)
|
|
{
|
|
return Presets.Where((TopicPreset p) => p.Tab.Equals(tab, StringComparison.OrdinalIgnoreCase)).ToList();
|
|
}
|
|
|
|
public static IReadOnlyList<TopicPreset> GetByTabWithCustom(string tab, IEnumerable<CustomPresetEntry> customPresets)
|
|
{
|
|
List<TopicPreset> list = GetByTab(tab).ToList();
|
|
foreach (CustomPresetEntry item in customPresets.Where((CustomPresetEntry c) => c.Tab.Equals(tab, StringComparison.OrdinalIgnoreCase)))
|
|
{
|
|
list.Add(new TopicPreset
|
|
{
|
|
Category = "custom_" + item.Id,
|
|
Label = item.Label,
|
|
Symbol = item.Symbol,
|
|
Color = item.Color,
|
|
Description = item.Description,
|
|
SystemPrompt = item.SystemPrompt,
|
|
Placeholder = "",
|
|
Tab = item.Tab,
|
|
IsCustom = true,
|
|
CustomId = item.Id
|
|
});
|
|
}
|
|
return list;
|
|
}
|
|
|
|
private static void Load()
|
|
{
|
|
_loaded = true;
|
|
Assembly executingAssembly = Assembly.GetExecutingAssembly();
|
|
string value = "AxCopilot.Assets.Presets.";
|
|
string[] manifestResourceNames = executingAssembly.GetManifestResourceNames();
|
|
foreach (string text in manifestResourceNames)
|
|
{
|
|
if (!text.StartsWith(value) || !text.EndsWith(".json"))
|
|
{
|
|
continue;
|
|
}
|
|
try
|
|
{
|
|
using Stream stream = executingAssembly.GetManifestResourceStream(text);
|
|
if (stream == null)
|
|
{
|
|
continue;
|
|
}
|
|
using StreamReader streamReader = new StreamReader(stream);
|
|
string json = streamReader.ReadToEnd();
|
|
TopicPreset topicPreset = JsonSerializer.Deserialize<TopicPreset>(json, new JsonSerializerOptions
|
|
{
|
|
PropertyNameCaseInsensitive = true
|
|
});
|
|
if (topicPreset != null)
|
|
{
|
|
_presets.Add(topicPreset);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogService.Warn("프리셋 로드 실패 (" + text + "): " + ex.Message);
|
|
}
|
|
}
|
|
Dictionary<string, int> catOrder = ChatCategory.All.Select(((string Key, string Label, string Symbol, string Color) c, int item) => (Key: c.Key, i: item)).ToDictionary(((string Key, int i) x) => x.Key, ((string Key, int i) x) => x.i);
|
|
_presets.Sort(delegate(TopicPreset a, TopicPreset b)
|
|
{
|
|
int order = a.Order;
|
|
int order2 = b.Order;
|
|
if (order != order2)
|
|
{
|
|
return order.CompareTo(order2);
|
|
}
|
|
int valueOrDefault = catOrder.GetValueOrDefault(a.Category, 99);
|
|
int valueOrDefault2 = catOrder.GetValueOrDefault(b.Category, 99);
|
|
return valueOrDefault.CompareTo(valueOrDefault2);
|
|
});
|
|
LogService.Info($"대화 주제 프리셋 {_presets.Count}개 로드 완료");
|
|
}
|
|
}
|