mirror of
				https://gitlab.com/Kwoth/nadekobot.git
				synced 2025-11-04 00:34:26 -05:00 
			
		
		
		
	Cleaned up some unused/commented code
- Small amount of refactoring - Separated imagesharp extension to ImageSharpExtensions.cs - Using .join Ienumerable extension instead of string.join in some places
This commit is contained in:
		@@ -1,19 +1,9 @@
 | 
			
		||||
using Humanizer.Localisation;
 | 
			
		||||
using SixLabors.Fonts;
 | 
			
		||||
using SixLabors.ImageSharp;
 | 
			
		||||
using SixLabors.ImageSharp.Drawing;
 | 
			
		||||
using SixLabors.ImageSharp.Drawing.Processing;
 | 
			
		||||
using SixLabors.ImageSharp.Formats;
 | 
			
		||||
using SixLabors.ImageSharp.Formats.Png;
 | 
			
		||||
using SixLabors.ImageSharp.PixelFormats;
 | 
			
		||||
using SixLabors.ImageSharp.Processing;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.Net.Http.Headers;
 | 
			
		||||
using System.Text.Json;
 | 
			
		||||
using System.Text.RegularExpressions;
 | 
			
		||||
using Color = Discord.Color;
 | 
			
		||||
 | 
			
		||||
// todo imagesharp extensions
 | 
			
		||||
namespace NadekoBot.Extensions;
 | 
			
		||||
 | 
			
		||||
public static class Extensions
 | 
			
		||||
@@ -65,45 +55,7 @@ public static class Extensions
 | 
			
		||||
    public static IEmote ToIEmote(this string emojiStr)
 | 
			
		||||
        => Emote.TryParse(emojiStr, out var maybeEmote) ? maybeEmote : new Emoji(emojiStr);
 | 
			
		||||
 | 
			
		||||
    // https://github.com/SixLabors/Samples/blob/master/ImageSharp/AvatarWithRoundedCorner/Program.cs
 | 
			
		||||
    public static IImageProcessingContext ApplyRoundedCorners(this IImageProcessingContext ctx, float cornerRadius)
 | 
			
		||||
    {
 | 
			
		||||
        var size = ctx.GetCurrentSize();
 | 
			
		||||
        var corners = BuildCorners(size.Width, size.Height, cornerRadius);
 | 
			
		||||
 | 
			
		||||
        ctx.SetGraphicsOptions(new GraphicsOptions
 | 
			
		||||
        {
 | 
			
		||||
            Antialias = true,
 | 
			
		||||
            // enforces that any part of this shape that has color is punched out of the background
 | 
			
		||||
            AlphaCompositionMode = PixelAlphaCompositionMode.DestOut
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        foreach (var c in corners) ctx = ctx.Fill(SixLabors.ImageSharp.Color.Red, c);
 | 
			
		||||
 | 
			
		||||
        return ctx;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static IPathCollection BuildCorners(int imageWidth, int imageHeight, float cornerRadius)
 | 
			
		||||
    {
 | 
			
		||||
        // first create a square
 | 
			
		||||
        var rect = new RectangularPolygon(-0.5f, -0.5f, cornerRadius, cornerRadius);
 | 
			
		||||
 | 
			
		||||
        // then cut out of the square a circle so we are left with a corner
 | 
			
		||||
        var cornerTopLeft = rect.Clip(new EllipsePolygon(cornerRadius - 0.5f, cornerRadius - 0.5f, cornerRadius));
 | 
			
		||||
 | 
			
		||||
        // corner is now a corner shape positions top left
 | 
			
		||||
        //lets make 3 more positioned correctly, we can do that by translating the original around the center of the image
 | 
			
		||||
 | 
			
		||||
        var rightPos = imageWidth - cornerTopLeft.Bounds.Width + 1;
 | 
			
		||||
        var bottomPos = imageHeight - cornerTopLeft.Bounds.Height + 1;
 | 
			
		||||
 | 
			
		||||
        // move it across the width of the image - the width of the shape
 | 
			
		||||
        var cornerTopRight = cornerTopLeft.RotateDegree(90).Translate(rightPos, 0);
 | 
			
		||||
        var cornerBottomLeft = cornerTopLeft.RotateDegree(-90).Translate(0, bottomPos);
 | 
			
		||||
        var cornerBottomRight = cornerTopLeft.RotateDegree(180).Translate(rightPos, bottomPos);
 | 
			
		||||
 | 
			
		||||
        return new PathCollection(cornerTopLeft, cornerBottomLeft, cornerTopRight, cornerBottomRight);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    ///     First 10 characters of teh bot token.
 | 
			
		||||
@@ -139,9 +91,6 @@ public static class Extensions
 | 
			
		||||
        return embed.WithFooter(curPage.ToString());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Color ToDiscordColor(this Rgba32 color)
 | 
			
		||||
        => new(color.R, color.G, color.B);
 | 
			
		||||
 | 
			
		||||
    public static IEmbedBuilder WithOkColor(this IEmbedBuilder eb)
 | 
			
		||||
        => eb.WithColor(EmbedColor.Ok);
 | 
			
		||||
 | 
			
		||||
@@ -215,47 +164,6 @@ public static class Extensions
 | 
			
		||||
    public static string ToJson<T>(this T any, JsonSerializerOptions? options = null)
 | 
			
		||||
        => JsonSerializer.Serialize(any, options);
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    ///     Adds fallback fonts to <see cref="TextOptions" />
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="opts"><see cref="TextOptions" /> to which fallback fonts will be added to</param>
 | 
			
		||||
    /// <param name="fallback">List of fallback Font Families to add</param>
 | 
			
		||||
    /// <returns>The same <see cref="TextOptions" /> to allow chaining</returns>
 | 
			
		||||
    public static TextOptions WithFallbackFonts(this TextOptions opts, List<FontFamily> fallback)
 | 
			
		||||
    {
 | 
			
		||||
        foreach (var ff in fallback) opts.FallbackFonts.Add(ff);
 | 
			
		||||
 | 
			
		||||
        return opts;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    ///     Adds fallback fonts to <see cref="TextGraphicsOptions" />
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="opts"><see cref="TextGraphicsOptions" /> to which fallback fonts will be added to</param>
 | 
			
		||||
    /// <param name="fallback">List of fallback Font Families to add</param>
 | 
			
		||||
    /// <returns>The same <see cref="TextGraphicsOptions" /> to allow chaining</returns>
 | 
			
		||||
    public static TextGraphicsOptions WithFallbackFonts(this TextGraphicsOptions opts, List<FontFamily> fallback)
 | 
			
		||||
    {
 | 
			
		||||
        opts.TextOptions.WithFallbackFonts(fallback);
 | 
			
		||||
        return opts;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static MemoryStream ToStream(this Image<Rgba32> img, IImageFormat? format = null)
 | 
			
		||||
    {
 | 
			
		||||
        var imageStream = new MemoryStream();
 | 
			
		||||
        if (format?.Name == "GIF")
 | 
			
		||||
            img.SaveAsGif(imageStream);
 | 
			
		||||
        else
 | 
			
		||||
            img.SaveAsPng(imageStream,
 | 
			
		||||
                new()
 | 
			
		||||
                {
 | 
			
		||||
                    ColorType = PngColorType.RgbWithAlpha, CompressionLevel = PngCompressionLevel.BestCompression
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
        imageStream.Position = 0;
 | 
			
		||||
        return imageStream;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Stream ToStream(this IEnumerable<byte> bytes, bool canWrite = false)
 | 
			
		||||
    {
 | 
			
		||||
        var ms = new MemoryStream(bytes as byte[] ?? bytes.ToArray(), canWrite);
 | 
			
		||||
 
 | 
			
		||||
@@ -84,8 +84,9 @@ public static class MessageChannelExtensions
 | 
			
		||||
        Func<T, string> howToPrint,
 | 
			
		||||
        int columns = 3)
 | 
			
		||||
        => ch.SendMessageAsync($@"{seed}```css
 | 
			
		||||
{string.Join("\n", items.Chunk(columns)
 | 
			
		||||
                        .Select(ig => string.Concat(ig.Select(howToPrint))))}
 | 
			
		||||
{items.Chunk(columns)
 | 
			
		||||
      .Select(ig => string.Concat(ig.Select(howToPrint)))
 | 
			
		||||
      .Join("\n")}
 | 
			
		||||
```");
 | 
			
		||||
 | 
			
		||||
    public static Task<IUserMessage> SendTableAsync<T>(
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										98
									
								
								src/NadekoBot/_Extensions/ImagesharpExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								src/NadekoBot/_Extensions/ImagesharpExtensions.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,98 @@
 | 
			
		||||
using SixLabors.Fonts;
 | 
			
		||||
using SixLabors.ImageSharp;
 | 
			
		||||
using SixLabors.ImageSharp.Drawing;
 | 
			
		||||
using SixLabors.ImageSharp.Drawing.Processing;
 | 
			
		||||
using SixLabors.ImageSharp.Formats;
 | 
			
		||||
using SixLabors.ImageSharp.Formats.Png;
 | 
			
		||||
using SixLabors.ImageSharp.PixelFormats;
 | 
			
		||||
using SixLabors.ImageSharp.Processing;
 | 
			
		||||
using Color = Discord.Color;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Extensions;
 | 
			
		||||
 | 
			
		||||
public static class ImagesharpExtensions
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    ///     Adds fallback fonts to <see cref="TextOptions" />
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="opts"><see cref="TextOptions" /> to which fallback fonts will be added to</param>
 | 
			
		||||
    /// <param name="fallback">List of fallback Font Families to add</param>
 | 
			
		||||
    /// <returns>The same <see cref="TextOptions" /> to allow chaining</returns>
 | 
			
		||||
    public static TextOptions WithFallbackFonts(this TextOptions opts, List<FontFamily> fallback)
 | 
			
		||||
    {
 | 
			
		||||
        foreach (var ff in fallback) opts.FallbackFonts.Add(ff);
 | 
			
		||||
 | 
			
		||||
        return opts;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    ///     Adds fallback fonts to <see cref="TextGraphicsOptions" />
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="opts"><see cref="TextGraphicsOptions" /> to which fallback fonts will be added to</param>
 | 
			
		||||
    /// <param name="fallback">List of fallback Font Families to add</param>
 | 
			
		||||
    /// <returns>The same <see cref="TextGraphicsOptions" /> to allow chaining</returns>
 | 
			
		||||
    public static TextGraphicsOptions WithFallbackFonts(this TextGraphicsOptions opts, List<FontFamily> fallback)
 | 
			
		||||
    {
 | 
			
		||||
        opts.TextOptions.WithFallbackFonts(fallback);
 | 
			
		||||
        return opts;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // https://github.com/SixLabors/Samples/blob/master/ImageSharp/AvatarWithRoundedCorner/Program.cs
 | 
			
		||||
    public static IImageProcessingContext ApplyRoundedCorners(this IImageProcessingContext ctx, float cornerRadius)
 | 
			
		||||
    {
 | 
			
		||||
        var size = ctx.GetCurrentSize();
 | 
			
		||||
        var corners = BuildCorners(size.Width, size.Height, cornerRadius);
 | 
			
		||||
 | 
			
		||||
        ctx.SetGraphicsOptions(new GraphicsOptions
 | 
			
		||||
        {
 | 
			
		||||
            Antialias = true,
 | 
			
		||||
            // enforces that any part of this shape that has color is punched out of the background
 | 
			
		||||
            AlphaCompositionMode = PixelAlphaCompositionMode.DestOut
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        foreach (var c in corners) ctx = ctx.Fill(SixLabors.ImageSharp.Color.Red, c);
 | 
			
		||||
 | 
			
		||||
        return ctx;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static IPathCollection BuildCorners(int imageWidth, int imageHeight, float cornerRadius)
 | 
			
		||||
    {
 | 
			
		||||
        // first create a square
 | 
			
		||||
        var rect = new RectangularPolygon(-0.5f, -0.5f, cornerRadius, cornerRadius);
 | 
			
		||||
 | 
			
		||||
        // then cut out of the square a circle so we are left with a corner
 | 
			
		||||
        var cornerTopLeft = rect.Clip(new EllipsePolygon(cornerRadius - 0.5f, cornerRadius - 0.5f, cornerRadius));
 | 
			
		||||
 | 
			
		||||
        // corner is now a corner shape positions top left
 | 
			
		||||
        //lets make 3 more positioned correctly, we can do that by translating the original around the center of the image
 | 
			
		||||
 | 
			
		||||
        var rightPos = imageWidth - cornerTopLeft.Bounds.Width + 1;
 | 
			
		||||
        var bottomPos = imageHeight - cornerTopLeft.Bounds.Height + 1;
 | 
			
		||||
 | 
			
		||||
        // move it across the width of the image - the width of the shape
 | 
			
		||||
        var cornerTopRight = cornerTopLeft.RotateDegree(90).Translate(rightPos, 0);
 | 
			
		||||
        var cornerBottomLeft = cornerTopLeft.RotateDegree(-90).Translate(0, bottomPos);
 | 
			
		||||
        var cornerBottomRight = cornerTopLeft.RotateDegree(180).Translate(rightPos, bottomPos);
 | 
			
		||||
 | 
			
		||||
        return new PathCollection(cornerTopLeft, cornerBottomLeft, cornerTopRight, cornerBottomRight);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public static Color ToDiscordColor(this Rgba32 color)
 | 
			
		||||
        => new(color.R, color.G, color.B);
 | 
			
		||||
 | 
			
		||||
    public static MemoryStream ToStream(this Image<Rgba32> img, IImageFormat? format = null)
 | 
			
		||||
    {
 | 
			
		||||
        var imageStream = new MemoryStream();
 | 
			
		||||
        if (format?.Name == "GIF")
 | 
			
		||||
            img.SaveAsGif(imageStream);
 | 
			
		||||
        else
 | 
			
		||||
            img.SaveAsPng(imageStream,
 | 
			
		||||
                new()
 | 
			
		||||
                {
 | 
			
		||||
                    ColorType = PngColorType.RgbWithAlpha, CompressionLevel = PngCompressionLevel.BestCompression
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
        imageStream.Position = 0;
 | 
			
		||||
        return imageStream;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -45,7 +45,7 @@ public static class StringExtensions
 | 
			
		||||
            tokens[i] = token[..1].ToUpperInvariant() + token[1..];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return string.Join(" ", tokens).Replace(" Of ", " of ").Replace(" The ", " the ");
 | 
			
		||||
        return tokens.Join(" ").Replace(" Of ", " of ").Replace(" The ", " the ");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //http://www.dotnetperls.com/levenshtein
 | 
			
		||||
@@ -124,7 +124,7 @@ public static class StringExtensions
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static string GetInitials(this string txt, string glue = "")
 | 
			
		||||
        => string.Join(glue, txt.Split(' ').Select(x => x.FirstOrDefault()));
 | 
			
		||||
        => txt.Split(' ').Select(x => x.FirstOrDefault()).Join(glue);
 | 
			
		||||
 | 
			
		||||
    public static bool IsAlphaNumeric(this string txt)
 | 
			
		||||
        => txt.All(c => _lettersAndDigits.Contains(c));
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user