Skip to content

Commit

Permalink
add webp converter
Browse files Browse the repository at this point in the history
  • Loading branch information
th0mk committed Sep 10, 2024
1 parent 5866f46 commit 6fc71c4
Showing 1 changed file with 39 additions and 4 deletions.
43 changes: 39 additions & 4 deletions src/FMBot.Bot/Services/Guild/WebhookService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using Serilog;
using SkiaSharp;

namespace FMBot.Bot.Services.Guild;

Expand Down Expand Up @@ -306,18 +307,52 @@ public async Task ChangeToNewAvatar(DiscordShardedClient client, string imageUrl
{
response.EnsureSuccessStatusCode();
Log.Information("ChangeToNewAvatar: Got new avatar in stream");
await using (var stream = await response.Content.ReadAsStreamAsync())

var contentType = response.Content.Headers.ContentType?.MediaType;
Log.Information($"ChangeToNewAvatar: Content-Type: {contentType}");

var imageData = await response.Content.ReadAsByteArrayAsync();

if (contentType?.ToLower() == "image/webp")
{
imageData = ConvertWebPToPng(imageData);
Log.Information("ChangeToNewAvatar: Converted WebP to PNG");
}

using (var imageStream = new MemoryStream(imageData))
{
await client.CurrentUser.ModifyAsync(u => u.Avatar = new Discord.Image(stream));
await client.CurrentUser.ModifyAsync(u => u.Avatar = new Discord.Image(imageStream));
Log.Information("ChangeToNewAvatar: Avatar successfully changed");
}
}

await Task.Delay(5000);
await Task.Delay(3000);
}
catch (Exception exception)
{
Log.Error(exception, "ChangeToNewAvatar: Error while attempting to change avatar");
Log.Error(exception, "ChangeToNewAvatar: Error while attempting to change avatar: {ErrorMessage}", exception.Message);
}
}

private static byte[] ConvertWebPToPng(byte[] webpData)
{
using var inputStream = new MemoryStream(webpData);
using var outputStream = new MemoryStream();
using (var codec = SKCodec.Create(inputStream))
using (var surface = SKSurface.Create(new SKImageInfo(codec.Info.Width, codec.Info.Height)))
{
var canvas = surface.Canvas;
using (var image = SKImage.FromEncodedData(webpData))
{
canvas.DrawImage(image, 0, 0);
}

using (var image = surface.Snapshot())
using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
{
data.SaveTo(outputStream);
}
}
return outputStream.ToArray();
}
}

0 comments on commit 6fc71c4

Please sign in to comment.