Added .rip command again :^)
This commit is contained in:
		| @@ -37,7 +37,7 @@ namespace NadekoBot.Modules.Xp.Services | ||||
|         private readonly Logger _log; | ||||
|         private readonly NadekoStrings _strings; | ||||
|         private readonly IDataCache _cache; | ||||
|         private readonly FontCollection _fonts = new FontCollection(); | ||||
|         private readonly FontProvider _fonts; | ||||
|         public const int XP_REQUIRED_LVL_1 = 36; | ||||
|  | ||||
|         private readonly ConcurrentDictionary<ulong, ConcurrentHashSet<ulong>> _excludedRoles | ||||
| @@ -59,17 +59,11 @@ namespace NadekoBot.Modules.Xp.Services | ||||
|         private readonly CancellationTokenSource _clearRewardTimerTokenSource; | ||||
|         private readonly Task _clearRewardTimer; | ||||
|         private readonly HttpClient http = new HttpClient(); | ||||
|         private FontFamily _usernameFontFamily; | ||||
|         private FontFamily _clubFontFamily; | ||||
|         private Font _levelFont; | ||||
|         private Font _xpFont; | ||||
|         private Font _awardedFont; | ||||
|         private Font _rankFont; | ||||
|         private Font _timeFont; | ||||
|  | ||||
|         public XpService(CommandHandler cmd, IBotConfigProvider bc, | ||||
|             NadekoBot bot, IImagesService images, | ||||
|             DbService db, NadekoStrings strings, IDataCache cache) | ||||
|             DbService db, NadekoStrings strings, IDataCache cache, | ||||
|             FontProvider fonts) | ||||
|         { | ||||
|             _db = db; | ||||
|             _cmd = cmd; | ||||
| @@ -78,6 +72,7 @@ namespace NadekoBot.Modules.Xp.Services | ||||
|             _log = LogManager.GetCurrentClassLogger(); | ||||
|             _strings = strings; | ||||
|             _cache = cache; | ||||
|             _fonts = fonts; | ||||
|  | ||||
|             //load settings | ||||
|             var allGuildConfigs = bot.AllGuildConfigs.Where(x => x.XpSettings != null); | ||||
| @@ -105,16 +100,6 @@ namespace NadekoBot.Modules.Xp.Services | ||||
|                 allGuildConfigs.Where(x => x.XpSettings.ServerExcluded) | ||||
|                                .Select(x => x.GuildId)); | ||||
|  | ||||
|             //todo 60 move to font provider or somethign | ||||
|             _fonts = new FontCollection(); | ||||
|             if (Directory.Exists("data/fonts")) | ||||
|                 foreach (var file in Directory.GetFiles("data/fonts")) | ||||
|                 { | ||||
|                     _fonts.Install(file); | ||||
|                 } | ||||
|  | ||||
|             InitializeFonts(); | ||||
|  | ||||
|             _cmd.OnMessageNoTrigger += _cmd_OnMessageNoTrigger; | ||||
|  | ||||
|             _updateXpTimer = new Timer(async _ => | ||||
| @@ -547,16 +532,6 @@ namespace NadekoBot.Modules.Xp.Services | ||||
|             return GenerateImageAsync(GetUserStats(user)); | ||||
|         } | ||||
|  | ||||
|         private void InitializeFonts() | ||||
|         { | ||||
|             _usernameFontFamily = _fonts.Find("Whitney-Bold"); | ||||
|             _clubFontFamily = _fonts.Find("Whitney-Bold"); | ||||
|             _levelFont = _fonts.Find("Whitney-Bold").CreateFont(45); | ||||
|             _xpFont = _fonts.Find("Whitney-Bold").CreateFont(50); | ||||
|             _awardedFont = _fonts.Find("Whitney-Bold").CreateFont(25); | ||||
|             _rankFont = _fonts.Find("Uni Sans Thin CAPS").CreateFont(30); | ||||
|             _timeFont = _fonts.Find("Whitney-Bold").CreateFont(20); | ||||
|         } | ||||
|  | ||||
|         public Task<MemoryStream> GenerateImageAsync(FullUserStats stats) => Task.Run(async () => | ||||
|         { | ||||
| @@ -564,7 +539,7 @@ namespace NadekoBot.Modules.Xp.Services | ||||
|             { | ||||
|  | ||||
|                 var username = stats.User.ToString(); | ||||
|                 var usernameFont = _usernameFontFamily | ||||
|                 var usernameFont = _fonts.UsernameFontFamily | ||||
|                     .CreateFont(username.Length <= 6 | ||||
|                         ? 50 | ||||
|                         : 50 - username.Length); | ||||
| @@ -574,17 +549,17 @@ namespace NadekoBot.Modules.Xp.Services | ||||
|  | ||||
|                 // level | ||||
|  | ||||
|                 img.DrawText(stats.Global.Level.ToString(), _levelFont, Rgba32.White, | ||||
|                 img.DrawText(stats.Global.Level.ToString(), _fonts.LevelFont, Rgba32.White, | ||||
|                     new PointF(47, 137)); | ||||
|  | ||||
|                 img.DrawText(stats.Guild.Level.ToString(), _levelFont, Rgba32.White, | ||||
|                 img.DrawText(stats.Guild.Level.ToString(), _fonts.LevelFont, Rgba32.White, | ||||
|                     new PointF(47, 285)); | ||||
|  | ||||
|                 //club name | ||||
|  | ||||
|                 var clubName = stats.User.Club?.ToString() ?? "-"; | ||||
|  | ||||
|                 var clubFont = _clubFontFamily | ||||
|                 var clubFont = _fonts.ClubFontFamily | ||||
|                     .CreateFont(clubName.Length <= 8 | ||||
|                         ? 35 | ||||
|                         : 35 - (clubName.Length / 2)); | ||||
| @@ -607,7 +582,7 @@ namespace NadekoBot.Modules.Xp.Services | ||||
|                     new PointF(286 + (450 * (global.LevelXp / (float)global.RequiredXp)), 235), | ||||
|                     new PointF(286, 235), | ||||
|                 }); | ||||
|                 img.DrawText($"{global.LevelXp}/{global.RequiredXp}", _xpFont, brush, pen, | ||||
|                 img.DrawText($"{global.LevelXp}/{global.RequiredXp}", _fonts.XpFont, brush, pen, | ||||
|                     new PointF(430, 130)); | ||||
|  | ||||
|                 img.FillPolygon(xpBgBrush, new[] { | ||||
| @@ -616,7 +591,7 @@ namespace NadekoBot.Modules.Xp.Services | ||||
|                     new PointF(247 + (450 * (guild.LevelXp / (float)guild.RequiredXp)), 379), | ||||
|                     new PointF(247, 379), | ||||
|                 }); | ||||
|                 img.DrawText($"{guild.LevelXp}/{guild.RequiredXp}", _xpFont, brush, pen, | ||||
|                 img.DrawText($"{guild.LevelXp}/{guild.RequiredXp}", _fonts.XpFont, brush, pen, | ||||
|                     new PointF(400, 270)); | ||||
|  | ||||
|                 if (stats.FullGuildStats.AwardedXp != 0) | ||||
| @@ -624,16 +599,16 @@ namespace NadekoBot.Modules.Xp.Services | ||||
|                     var sign = stats.FullGuildStats.AwardedXp > 0 | ||||
|                         ? "+ " | ||||
|                         : ""; | ||||
|                     img.DrawText($"({sign}{stats.FullGuildStats.AwardedXp})", _awardedFont, brush, pen, | ||||
|                     img.DrawText($"({sign}{stats.FullGuildStats.AwardedXp})", _fonts.AwardedFont, brush, pen, | ||||
|                         new PointF(445 - (Math.Max(0, (stats.FullGuildStats.AwardedXp.ToString().Length - 2)) * 5), 335)); | ||||
|                 } | ||||
|  | ||||
|                 //ranking | ||||
|  | ||||
|                 img.DrawText(stats.GlobalRanking.ToString(), _rankFont, Rgba32.White, | ||||
|                 img.DrawText(stats.GlobalRanking.ToString(), _fonts.RankFont, Rgba32.White, | ||||
|                     new PointF(148, 170)); | ||||
|  | ||||
|                 img.DrawText(stats.GuildRanking.ToString(), _rankFont, Rgba32.White, | ||||
|                 img.DrawText(stats.GuildRanking.ToString(), _fonts.RankFont, Rgba32.White, | ||||
|                     new PointF(148, 317)); | ||||
|  | ||||
|                 //time on this level | ||||
| @@ -644,10 +619,10 @@ namespace NadekoBot.Modules.Xp.Services | ||||
|                     return $"{offset.Days}d{offset.Hours}h{offset.Minutes}m"; | ||||
|                 } | ||||
|  | ||||
|                 img.DrawText(GetTimeSpent(stats.User.LastLevelUp), _timeFont, Rgba32.White, | ||||
|                 img.DrawText(GetTimeSpent(stats.User.LastLevelUp), _fonts.TimeFont, Rgba32.White, | ||||
|                     new PointF(50, 197)); | ||||
|  | ||||
|                 img.DrawText(GetTimeSpent(stats.FullGuildStats.LastLevelUp), _timeFont, Rgba32.White, | ||||
|                 img.DrawText(GetTimeSpent(stats.FullGuildStats.LastLevelUp), _fonts.TimeFont, Rgba32.White, | ||||
|                     new PointF(50, 344)); | ||||
|  | ||||
|                 //avatar | ||||
| @@ -664,7 +639,7 @@ namespace NadekoBot.Modules.Xp.Services | ||||
|                             using (var temp = await http.GetStreamAsync(avatarUrl)) | ||||
|                             using (var tempDraw = Image.Load(temp).Resize(69, 70)) | ||||
|                             { | ||||
|                                 ApplyRoundedCorners(tempDraw, 35); | ||||
|                                 tempDraw.ApplyRoundedCorners(35); | ||||
|                                 data = tempDraw.ToStream().ToArray(); | ||||
|                             } | ||||
|  | ||||
| @@ -710,7 +685,7 @@ namespace NadekoBot.Modules.Xp.Services | ||||
|                                 return; | ||||
|                             using (var tempDraw = Image.Load(await temp.Content.ReadAsStreamAsync()).Resize(45, 45)) | ||||
|                             { | ||||
|                                 ApplyRoundedCorners(tempDraw, 22.5f); | ||||
|                                 tempDraw.ApplyRoundedCorners(22.5f); | ||||
|                                 data = tempDraw.ToStream().ToArray(); | ||||
|                             } | ||||
|                         } | ||||
| @@ -731,40 +706,6 @@ namespace NadekoBot.Modules.Xp.Services | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // https://github.com/SixLabors/ImageSharp/tree/master/samples/AvatarWithRoundedCorner | ||||
|         public static void ApplyRoundedCorners(Image<Rgba32> img, float cornerRadius) | ||||
|         { | ||||
|             var corners = BuildCorners(img.Width, img.Height, cornerRadius); | ||||
|             // now we have our corners time to draw them | ||||
|             img.Fill(Rgba32.Transparent, corners, new GraphicsOptions(true) | ||||
|             { | ||||
|                 BlenderMode = ImageSharp.PixelFormats.PixelBlenderMode.Src // enforces that any part of this shape that has color is punched out of the background | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         public static IPathCollection BuildCorners(int imageWidth, int imageHeight, float cornerRadius) | ||||
|         { | ||||
|             // first create a square | ||||
|             var rect = new RectangularePolygon(-0.5f, -0.5f, cornerRadius, cornerRadius); | ||||
|  | ||||
|             // then cut out of the square a circle so we are left with a corner | ||||
|             var cornerToptLeft = 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 orgional around the center of the image | ||||
|             var center = new Vector2(imageWidth / 2, imageHeight / 2); | ||||
|  | ||||
|             float rightPos = imageWidth - cornerToptLeft.Bounds.Width + 1; | ||||
|             float bottomPos = imageHeight - cornerToptLeft.Bounds.Height + 1; | ||||
|  | ||||
|             // move it across the width of the image - the width of the shape | ||||
|             var cornerTopRight = cornerToptLeft.RotateDegree(90).Translate(rightPos, 0); | ||||
|             var cornerBottomLeft = cornerToptLeft.RotateDegree(-90).Translate(0, bottomPos); | ||||
|             var cornerBottomRight = cornerToptLeft.RotateDegree(180).Translate(rightPos, bottomPos); | ||||
|  | ||||
|             return new PathCollection(cornerToptLeft, cornerBottomLeft, cornerTopRight, cornerBottomRight); | ||||
|         } | ||||
|  | ||||
|         public Task Unload() | ||||
|         { | ||||
|             _cmd.OnMessageNoTrigger -= _cmd_OnMessageNoTrigger; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user