Files
lampac/mods/AdminPanel/ConfigSectionGroups.cs

108 lines
5.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json.Linq;
namespace AdminPanel;
public static class ConfigSectionGroups
{
public sealed record GroupSpec(string Id, string Title, string Hint, string[] Keys);
public static readonly GroupSpec[] Catalog =
{
new("runtime", "Рантайм", "Поля снимка; обычно приходят из current, в init не обязательны.",
new[] { "guid", "freeDiskSpace" }),
new("listen", "HTTP-сервер (listen)", "Адрес, порт, схема, таймауты, compression.",
new[] { "listen" }),
new("security", "Безопасность и доступ", "WAF, accsdb, список модулей и middleware ядра.",
new[] { "WAF", "accsdb", "BaseModule" }),
new("network", "Сеть и прокси", "Прокси исходящих запросов, CORS, доверенные сети.",
new[] { "serverproxy", "proxy", "globalproxy", "corsehost", "KnownProxies" }),
new("pools", "Пулы и служебное", "Буферы, apn, kit.",
new[] { "pool", "apn", "kit" }),
new("cache-gc", "Кэш и память", "Гибридный кэш, Staticache, настройки GC.",
new[] { "cache", "Staticache", "GC" }),
new("media", "Изображения и постеры", "Движок картинок, Poster API.",
new[] { "imagelibrary", "posterApi" }),
new("realtime", "WebSocket и RCH", "Нативные сокеты и удалённый хаб.",
new[] { "WebSocket", "rch" }),
new("browser", "Браузеры (Playwright)", "Chromium / Firefox для автоматизации.",
new[] { "chromium", "firefox" }),
new("diagnostics", "Логи и диагностика", "Serilog, обработчик исключений, openstat.",
new[] { "serilog", "useDeveloperExceptionPage", "exceptionHandlerLogTarget", "exceptionHandlerLogFile", "watcherInit", "openstat" }),
new("app", "Приложение и оболочка", "online, cub, sisi, реклама, дефолты, omdb.",
new[] { "online", "cub", "sisi", "vast", "disableEng", "defaultOn", "omdbapi_key", "overrideResponse" }),
new("client", "Клиент Lampa и API", "Оболочка Lampa, cookie, PidTor, TMDB.",
new[] { "tmdb", "LampaWeb", "Cookie", "PidTor" }),
new("modules", "Модули расширения", "Секции подключаемых модулей в корне конфига.",
new[] { "Catalog", "DLNA", "JacRed", "Sync", "TimeCode", "TorrServer", "Tracks", "transcoding", "TmdbProxy", "CubProxy", "WebLog" }),
new("src-anime", "Источники · аниме", "Онлайн-балансеры аниме и смежные (в т.ч. Kodik).",
new[] { "AniLiberty", "AniLibria", "Animebesst", "AnimeGo", "AnimeLib", "AnimeON", "Animevost", "AniMedia", "Dreamerscast", "Kodik", "Mikai", "MoonAnime" }),
new("src-embed", "Источники · встраиваемые плееры", "Embed и агрегаторы сторонних плееров.",
new[] { "Autoembed", "Hydraflix", "MovPI", "Playembed", "Rgshows", "Smashystream", "Twoembed", "VidLink", "Videasy", "Vidsrc" }),
new("src-vod", "Источники · VOD и CDN", "Кино, сериалы, региональные и CDN-провайдеры.",
new[]
{
"Alloha", "Ashdi", "AsiaGe", "BamBoo", "CDNvideohub", "Collaps", "Eneyida", "FanCDN", "Filmix", "FilmixPartner", "FilmixTV", "FlixCDN",
"Geosaitebi", "GetsTV", "HDVB", "HdvbUA", "IptvOnline", "iRemux", "Kinobase", "Kinoflix", "Kinogo", "Kinotochka", "Kinoukr", "KinoPub",
"LeProduction", "Mirage", "Rezka", "RezkaPrem", "RutubeMovie", "Tortuga", "UaKino", "VideoDB", "Videoseed", "VeoVeo", "Vibix", "VkMovie", "VoKino"
}),
new("src-adult", "Источники · 18+", "SISI / взрослые сайты.",
new[]
{
"BongaCams", "Chaturbate", "Ebalovo", "Eporner", "HQporner", "PornHub", "PornHubPremium", "Porntrex", "Runetki", "Spankbang", "Tizam",
"Xhamster", "Xnxx", "Xvideos", "XvideosRED"
}),
};
public static List<GroupDto> Build(JObject currentRoot)
{
if (currentRoot == null)
currentRoot = new JObject();
var inFile = new HashSet<string>(
currentRoot.Properties().Select(p => p.Name),
StringComparer.Ordinal);
var assigned = new HashSet<string>(StringComparer.Ordinal);
var result = new List<GroupDto>();
foreach (var g in Catalog)
{
var keys = g.Keys.Where(inFile.Contains).OrderBy(k => k, StringComparer.Ordinal).ToArray();
foreach (var k in keys)
assigned.Add(k);
if (keys.Length == 0)
continue;
result.Add(new GroupDto(g.Id, g.Title, g.Hint, keys));
}
var orphans = inFile.Where(k => !assigned.Contains(k)).OrderBy(k => k, StringComparer.Ordinal).ToArray();
if (orphans.Length > 0)
result.Add(new GroupDto("other", "Прочее", "Ключи из current.conf, не попавшие в каталог (новые модули).", orphans));
return result;
}
public static List<GroupDto> BuildCatalog()
{
var list = new List<GroupDto>(Catalog.Length);
foreach (var g in Catalog)
list.Add(new GroupDto(g.Id, g.Title, g.Hint, g.Keys.ToArray()));
return list;
}
public static HashSet<string> CatalogRootKeys { get; } = new(
Catalog.SelectMany(g => g.Keys),
StringComparer.Ordinal);
}
public sealed record GroupDto(string Id, string Title, string Hint, string[] Keys);