mirror of
https://github.com/spacebarchat/server.git
synced 2026-04-21 12:35:41 +00:00
103 lines
5.0 KiB
C#
103 lines
5.0 KiB
C#
using System.Globalization;
|
|
using ImageMagick;
|
|
using Spacebar.AdminApi.TestClient.Services.Helpers;
|
|
using Spacebar.AdminApi.TestClient.Services.Services;
|
|
using Spacebar.Cdn.Worker;
|
|
using Spacebar.Interop.Cdn.Abstractions;
|
|
|
|
var builder = WebApplication.CreateBuilder(args);
|
|
|
|
// var sw = Stopwatch.StartNew();
|
|
Console.WriteLine("Pre-initializing Magick.NET...");
|
|
// OpenCL.IsEnabled = true;
|
|
MagickNET.Initialize();
|
|
// Console.WriteLine("==> Rendering default avatars...");
|
|
// foreach (var (r, g, b) in DefaultAvatarRenderer.DefaultAvatarColors) {
|
|
// var res = await DefaultAvatarRenderer.GetDefaultAvatar(r, g, b, size: 4096);
|
|
// Console.WriteLine($" ==> #{r:X2}{g:X2}{b:X2} => {res.Length} bytes");
|
|
// res.Position = 0;
|
|
// await using (var fs = File.OpenWrite($"default-{r:X2}{g:X2}{b:X2}.png")) {
|
|
// await res.CopyToAsync(fs);
|
|
// fs.Flush();
|
|
// fs.Close();
|
|
// }
|
|
// }
|
|
|
|
// byte skip = 8;
|
|
// var re = new RainbowEnumerator(lengthFactor: 256, skip: skip);
|
|
// var reFg = new RainbowEnumerator(lengthFactor: 512, skip: skip, offset: 128);
|
|
// var magickCollection = new MagickImageCollection();
|
|
// for (int i = 0; i < 255; i += skip) {
|
|
// var sw2 = Stopwatch.StartNew();
|
|
// var clr = re.Next();
|
|
// var clrFg = reFg.Next();
|
|
// var res = await DefaultAvatarRenderer.GetDefaultAvatarImage(clr.r, clr.g, clr.b, clrFg.r, clrFg.g, clrFg.b, size: 512);
|
|
// Console.Write($" ==> #{clr.r:X2}{clr.g:X2}{clr.b:X2}/{clrFg.r:X2}{clrFg.g:X2}{clrFg.b:X2} ({i} => {magickCollection.Count + 1})... R");
|
|
// res.Flatten();
|
|
// Console.Write("F");
|
|
// res.First().AnimationDelay = 4;
|
|
// Console.Write("A");
|
|
// magickCollection.Add(res.First());
|
|
// Console.WriteLine(" => " + sw2.Elapsed);
|
|
// }
|
|
//
|
|
// Console.WriteLine(" ==> Optimizing (1/2)...");
|
|
// magickCollection.OptimizePlus();
|
|
// Console.WriteLine(" ==> Optimizing (2/2)...");
|
|
// magickCollection.OptimizeTransparency();
|
|
// Console.WriteLine(" ==> Writing...");
|
|
// await using (var fs = File.OpenWrite($"default-animated.gif")) {
|
|
// await magickCollection.WriteAsync(fs, MagickFormat.Gif);
|
|
// }
|
|
//
|
|
// Console.WriteLine(sw.Elapsed);
|
|
// Environment.Exit(0);
|
|
|
|
// builder.WebHost.ConfigureKestrel(opts => opts.ListenUnixSocket(Environment.GetEnvironmentVariable("SOCKET_PATH")!));
|
|
|
|
builder.WebHost.ConfigureKestrel(o => {
|
|
o.UseSystemd(); // Socket activation if wanted
|
|
});
|
|
|
|
builder.Services.AddSingleton<IFileSource>(await new FilesystemFileSource(Environment.GetEnvironmentVariable("STORAGE_PATH") ?? throw new InvalidOperationException("STORAGE_PATH not set!")).Init());
|
|
builder.Services.AddSingleton<DiscordImageResizeService>();
|
|
|
|
builder.Services.AddControllers();
|
|
var app = builder.Build();
|
|
app.MapControllers();
|
|
|
|
app.MapGet("/embed/avatars/{idx:int}.{ext}", async (HttpContext ctx, int idx, string ext) => {
|
|
var (r, g, b) = DefaultAvatarRenderer.DefaultAvatarColors[idx % DefaultAvatarRenderer.DefaultAvatarColors.Length];
|
|
var res = await DefaultAvatarRenderer.GetDefaultAvatar(r, g, b, size: ctx.Request.Query.ContainsKey("size") ? int.Parse(ctx.Request.Query["size"]!) : 4096,
|
|
format: Mimes.GetFormatForExtension(ext));
|
|
return Results.File(res, Mimes.GetMime(Mimes.GetFormatForExtension(ext)));
|
|
});
|
|
|
|
// small easter egg internal stuff, maybe used someday :)
|
|
app.MapGet("/embed/avatars/_{bg:length(6)}.{ext}", async (HttpContext ctx, string bg, string ext) => {
|
|
var (r, g, b) = (byte.Parse(bg[..2], NumberStyles.HexNumber), byte.Parse(bg[2..4], NumberStyles.HexNumber), byte.Parse(bg[4..6], NumberStyles.HexNumber));
|
|
var res = await DefaultAvatarRenderer.GetDefaultAvatar(r, g, b, size: ctx.Request.Query.ContainsKey("size") ? int.Parse(ctx.Request.Query["size"]!) : 4096,
|
|
format: Mimes.GetFormatForExtension(ext));
|
|
return Results.File(res, Mimes.GetMime(Mimes.GetFormatForExtension(ext)));
|
|
});
|
|
|
|
app.MapGet("/embed/avatars/_{bg:length(6)}_{fg:length(6)}.{ext}", async (HttpContext ctx, string bg, string fg, string ext) => {
|
|
var (r, g, b) = (byte.Parse(bg[..2], NumberStyles.HexNumber), byte.Parse(bg[2..4], NumberStyles.HexNumber), byte.Parse(bg[4..6], NumberStyles.HexNumber));
|
|
var (rf, gf, bf) = (byte.Parse(fg[..2], NumberStyles.HexNumber), byte.Parse(fg[2..4], NumberStyles.HexNumber), byte.Parse(fg[4..6], NumberStyles.HexNumber));
|
|
var res = await DefaultAvatarRenderer.GetDefaultAvatar(r, g, b, rf, gf, bf, size: ctx.Request.Query.ContainsKey("size") ? int.Parse(ctx.Request.Query["size"]!) : 4096,
|
|
format: Mimes.GetFormatForExtension(ext));
|
|
return Results.File(res, Mimes.GetMime(Mimes.GetFormatForExtension(ext)));
|
|
});
|
|
|
|
app.MapGet("/scale/{*path}", async (HttpContext ctx, IFileSource ifs, DiscordImageResizeService dirs, string path) => {
|
|
var f = await ifs.GetFile(path);
|
|
f.Stream.Position = 0;
|
|
var mig = new MagickImageCollection();
|
|
await mig.ReadAsync(f.Stream, ctx.RequestAborted);
|
|
var res = await dirs.Apply(mig, ctx.Request.GetResizeParams());
|
|
await ctx.Response.StartAsync();
|
|
await res.WriteAsync(ctx.Response.Body);
|
|
await ctx.Response.CompleteAsync();
|
|
});
|
|
|
|
app.Run(); |