global nadeko won't cache nsfw images
This commit is contained in:
		@@ -76,11 +76,13 @@ namespace NadekoBot.Modules.Searches.Common
 | 
			
		||||
                    if (images.Length == 0)
 | 
			
		||||
                        return null;
 | 
			
		||||
                    var toReturn = images[_rng.Next(images.Length)];
 | 
			
		||||
#if !GLOBAL_NADEKO
 | 
			
		||||
                    foreach (var dledImg in images)
 | 
			
		||||
                    {
 | 
			
		||||
                        if(dledImg != toReturn)
 | 
			
		||||
                            _cache.Add(dledImg);
 | 
			
		||||
                    }
 | 
			
		||||
#endif
 | 
			
		||||
                    return toReturn;
 | 
			
		||||
                }                    
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -549,7 +549,7 @@ namespace NadekoBot.Modules.Xp.Services
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Task<Image<Rgba32>> GenerateImageAsync(IGuildUser user)
 | 
			
		||||
        public Task<MemoryStream> GenerateImageAsync(IGuildUser user)
 | 
			
		||||
        {
 | 
			
		||||
            return GenerateImageAsync(GetUserStats(user));
 | 
			
		||||
        }
 | 
			
		||||
@@ -565,170 +565,166 @@ namespace NadekoBot.Modules.Xp.Services
 | 
			
		||||
            _timeFont = _fonts.Find("Whitney-Bold").CreateFont(20);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Task<Image<Rgba32>> GenerateImageAsync(FullUserStats stats) => Task.Run(async () =>
 | 
			
		||||
        public Task<MemoryStream> GenerateImageAsync(FullUserStats stats) => Task.Run(async () =>
 | 
			
		||||
        {
 | 
			
		||||
            var img = Image.Load(_images.XpCard.ToArray());
 | 
			
		||||
 | 
			
		||||
            var username = stats.User.ToString();
 | 
			
		||||
            var usernameFont = _usernameFontFamily
 | 
			
		||||
                .CreateFont(username.Length <= 6
 | 
			
		||||
                    ? 50
 | 
			
		||||
                    : 50 - username.Length);
 | 
			
		||||
 | 
			
		||||
            img.DrawText("@" + username, usernameFont, Rgba32.White,
 | 
			
		||||
                new PointF(130, 5));
 | 
			
		||||
 | 
			
		||||
            // level
 | 
			
		||||
 | 
			
		||||
            img.DrawText(stats.Global.Level.ToString(), _levelFont, Rgba32.White,
 | 
			
		||||
                new PointF(47, 137));
 | 
			
		||||
 | 
			
		||||
            img.DrawText(stats.Guild.Level.ToString(), _levelFont, Rgba32.White,
 | 
			
		||||
                new PointF(47, 285));
 | 
			
		||||
 | 
			
		||||
            //club name
 | 
			
		||||
 | 
			
		||||
            var clubName = stats.User.Club?.ToString() ?? "-";
 | 
			
		||||
 | 
			
		||||
            var clubFont = _clubFontFamily
 | 
			
		||||
                .CreateFont(clubName.Length <= 8
 | 
			
		||||
                    ? 35
 | 
			
		||||
                    : 35 - (clubName.Length / 2));
 | 
			
		||||
 | 
			
		||||
            img.DrawText(clubName, clubFont, Rgba32.White,
 | 
			
		||||
                new PointF(650 - clubName.Length * 10, 40));
 | 
			
		||||
 | 
			
		||||
            var pen = new Pen<Rgba32>(Rgba32.Black, 1);
 | 
			
		||||
            var brush = Brushes.Solid<Rgba32>(Rgba32.White);
 | 
			
		||||
            var xpBgBrush = Brushes.Solid<Rgba32>(new Rgba32(0, 0, 0, 0.4f));
 | 
			
		||||
 | 
			
		||||
            var global = stats.Global;
 | 
			
		||||
            var guild = stats.Guild;
 | 
			
		||||
 | 
			
		||||
            //xp bar
 | 
			
		||||
 | 
			
		||||
            img.FillPolygon(xpBgBrush, new[] {
 | 
			
		||||
                new PointF(321, 104),
 | 
			
		||||
                new PointF(321 + (450 * (global.LevelXp / (float)global.RequiredXp)), 104),
 | 
			
		||||
                new PointF(286 + (450 * (global.LevelXp / (float)global.RequiredXp)), 235),
 | 
			
		||||
                new PointF(286, 235),
 | 
			
		||||
            });
 | 
			
		||||
            img.DrawText($"{global.LevelXp}/{global.RequiredXp}", _xpFont, brush, pen,
 | 
			
		||||
                new PointF(430, 130));
 | 
			
		||||
 | 
			
		||||
            img.FillPolygon(xpBgBrush, new[] {
 | 
			
		||||
                new PointF(282, 248),
 | 
			
		||||
                new PointF(282 + (450 * (guild.LevelXp / (float)guild.RequiredXp)), 248),
 | 
			
		||||
                new PointF(247 + (450 * (guild.LevelXp / (float)guild.RequiredXp)), 379),
 | 
			
		||||
                new PointF(247, 379),
 | 
			
		||||
            });
 | 
			
		||||
            img.DrawText($"{guild.LevelXp}/{guild.RequiredXp}", _xpFont, brush, pen,
 | 
			
		||||
                new PointF(400, 270));
 | 
			
		||||
 | 
			
		||||
            if (stats.FullGuildStats.AwardedXp != 0)
 | 
			
		||||
            using (var img = Image.Load(_images.XpCard.ToArray()))
 | 
			
		||||
            {
 | 
			
		||||
                var sign = stats.FullGuildStats.AwardedXp > 0
 | 
			
		||||
                    ? "+ "
 | 
			
		||||
                    : "";
 | 
			
		||||
                img.DrawText($"({sign}{stats.FullGuildStats.AwardedXp})", _awardedFont, brush, pen,
 | 
			
		||||
                    new PointF(445 - (Math.Max(0, (stats.FullGuildStats.AwardedXp.ToString().Length - 2)) * 5), 335));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //ranking
 | 
			
		||||
                var username = stats.User.ToString();
 | 
			
		||||
                var usernameFont = _usernameFontFamily
 | 
			
		||||
                    .CreateFont(username.Length <= 6
 | 
			
		||||
                        ? 50
 | 
			
		||||
                        : 50 - username.Length);
 | 
			
		||||
 | 
			
		||||
            img.DrawText(stats.GlobalRanking.ToString(), _rankFont, Rgba32.White,
 | 
			
		||||
                new PointF(148, 170));
 | 
			
		||||
                img.DrawText("@" + username, usernameFont, Rgba32.White,
 | 
			
		||||
                    new PointF(130, 5));
 | 
			
		||||
 | 
			
		||||
            img.DrawText(stats.GuildRanking.ToString(), _rankFont, Rgba32.White,
 | 
			
		||||
                new PointF(148, 317));
 | 
			
		||||
                // level
 | 
			
		||||
 | 
			
		||||
            //time on this level
 | 
			
		||||
                img.DrawText(stats.Global.Level.ToString(), _levelFont, Rgba32.White,
 | 
			
		||||
                    new PointF(47, 137));
 | 
			
		||||
 | 
			
		||||
            string GetTimeSpent(DateTime time)
 | 
			
		||||
            {
 | 
			
		||||
                var offset = DateTime.UtcNow - time;
 | 
			
		||||
                return $"{offset.Days}d{offset.Hours}h{offset.Minutes}m";
 | 
			
		||||
            }
 | 
			
		||||
                img.DrawText(stats.Guild.Level.ToString(), _levelFont, Rgba32.White,
 | 
			
		||||
                    new PointF(47, 285));
 | 
			
		||||
 | 
			
		||||
            img.DrawText(GetTimeSpent(stats.User.LastLevelUp), _timeFont, Rgba32.White,
 | 
			
		||||
                new PointF(50, 197));
 | 
			
		||||
                //club name
 | 
			
		||||
 | 
			
		||||
            img.DrawText(GetTimeSpent(stats.FullGuildStats.LastLevelUp), _timeFont, Rgba32.White,
 | 
			
		||||
                new PointF(50, 344));
 | 
			
		||||
                var clubName = stats.User.Club?.ToString() ?? "-";
 | 
			
		||||
 | 
			
		||||
            //avatar
 | 
			
		||||
                var clubFont = _clubFontFamily
 | 
			
		||||
                    .CreateFont(clubName.Length <= 8
 | 
			
		||||
                        ? 35
 | 
			
		||||
                        : 35 - (clubName.Length / 2));
 | 
			
		||||
 | 
			
		||||
            if (stats.User.AvatarId != null)
 | 
			
		||||
            {
 | 
			
		||||
                try
 | 
			
		||||
                img.DrawText(clubName, clubFont, Rgba32.White,
 | 
			
		||||
                    new PointF(650 - clubName.Length * 10, 40));
 | 
			
		||||
 | 
			
		||||
                var pen = new Pen<Rgba32>(Rgba32.Black, 1);
 | 
			
		||||
                var brush = Brushes.Solid<Rgba32>(Rgba32.White);
 | 
			
		||||
                var xpBgBrush = Brushes.Solid<Rgba32>(new Rgba32(0, 0, 0, 0.4f));
 | 
			
		||||
 | 
			
		||||
                var global = stats.Global;
 | 
			
		||||
                var guild = stats.Guild;
 | 
			
		||||
 | 
			
		||||
                //xp bar
 | 
			
		||||
 | 
			
		||||
                img.FillPolygon(xpBgBrush, new[] {
 | 
			
		||||
                    new PointF(321, 104),
 | 
			
		||||
                    new PointF(321 + (450 * (global.LevelXp / (float)global.RequiredXp)), 104),
 | 
			
		||||
                    new PointF(286 + (450 * (global.LevelXp / (float)global.RequiredXp)), 235),
 | 
			
		||||
                    new PointF(286, 235),
 | 
			
		||||
                });
 | 
			
		||||
                img.DrawText($"{global.LevelXp}/{global.RequiredXp}", _xpFont, brush, pen,
 | 
			
		||||
                    new PointF(430, 130));
 | 
			
		||||
 | 
			
		||||
                img.FillPolygon(xpBgBrush, new[] {
 | 
			
		||||
                    new PointF(282, 248),
 | 
			
		||||
                    new PointF(282 + (450 * (guild.LevelXp / (float)guild.RequiredXp)), 248),
 | 
			
		||||
                    new PointF(247 + (450 * (guild.LevelXp / (float)guild.RequiredXp)), 379),
 | 
			
		||||
                    new PointF(247, 379),
 | 
			
		||||
                });
 | 
			
		||||
                img.DrawText($"{guild.LevelXp}/{guild.RequiredXp}", _xpFont, brush, pen,
 | 
			
		||||
                    new PointF(400, 270));
 | 
			
		||||
 | 
			
		||||
                if (stats.FullGuildStats.AwardedXp != 0)
 | 
			
		||||
                {
 | 
			
		||||
                    var avatarUrl = stats.User.RealAvatarUrl();
 | 
			
		||||
                    var sign = stats.FullGuildStats.AwardedXp > 0
 | 
			
		||||
                        ? "+ "
 | 
			
		||||
                        : "";
 | 
			
		||||
                    img.DrawText($"({sign}{stats.FullGuildStats.AwardedXp})", _awardedFont, brush, pen,
 | 
			
		||||
                        new PointF(445 - (Math.Max(0, (stats.FullGuildStats.AwardedXp.ToString().Length - 2)) * 5), 335));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                    var (succ, data) = await _cache.TryGetImageDataAsync(avatarUrl);
 | 
			
		||||
                    if (!succ)
 | 
			
		||||
                //ranking
 | 
			
		||||
 | 
			
		||||
                img.DrawText(stats.GlobalRanking.ToString(), _rankFont, Rgba32.White,
 | 
			
		||||
                    new PointF(148, 170));
 | 
			
		||||
 | 
			
		||||
                img.DrawText(stats.GuildRanking.ToString(), _rankFont, Rgba32.White,
 | 
			
		||||
                    new PointF(148, 317));
 | 
			
		||||
 | 
			
		||||
                //time on this level
 | 
			
		||||
 | 
			
		||||
                string GetTimeSpent(DateTime time)
 | 
			
		||||
                {
 | 
			
		||||
                    var offset = DateTime.UtcNow - time;
 | 
			
		||||
                    return $"{offset.Days}d{offset.Hours}h{offset.Minutes}m";
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                img.DrawText(GetTimeSpent(stats.User.LastLevelUp), _timeFont, Rgba32.White,
 | 
			
		||||
                    new PointF(50, 197));
 | 
			
		||||
 | 
			
		||||
                img.DrawText(GetTimeSpent(stats.FullGuildStats.LastLevelUp), _timeFont, Rgba32.White,
 | 
			
		||||
                    new PointF(50, 344));
 | 
			
		||||
 | 
			
		||||
                //avatar
 | 
			
		||||
 | 
			
		||||
                if (stats.User.AvatarId != null)
 | 
			
		||||
                {
 | 
			
		||||
                    try
 | 
			
		||||
                    {
 | 
			
		||||
                        using (var temp = await http.GetStreamAsync(avatarUrl))
 | 
			
		||||
                        var avatarUrl = stats.User.RealAvatarUrl();
 | 
			
		||||
 | 
			
		||||
                        var (succ, data) = await _cache.TryGetImageDataAsync(avatarUrl);
 | 
			
		||||
                        if (!succ)
 | 
			
		||||
                        {
 | 
			
		||||
                            var tempDraw = Image.Load(temp);
 | 
			
		||||
                            tempDraw = tempDraw.Resize(69, 70);
 | 
			
		||||
                            ApplyRoundedCorners(tempDraw, 35);
 | 
			
		||||
                            data = tempDraw.ToStream().ToArray();
 | 
			
		||||
                            using (var temp = await http.GetStreamAsync(avatarUrl))
 | 
			
		||||
                            using (var tempDraw = Image.Load(temp).Resize(69, 70))
 | 
			
		||||
                            {
 | 
			
		||||
                                ApplyRoundedCorners(tempDraw, 35);
 | 
			
		||||
                                data = tempDraw.ToStream().ToArray();
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            await _cache.SetImageDataAsync(avatarUrl, data);
 | 
			
		||||
                        }
 | 
			
		||||
                        var toDraw = Image.Load(data);
 | 
			
		||||
 | 
			
		||||
                        await _cache.SetImageDataAsync(avatarUrl, data);
 | 
			
		||||
 | 
			
		||||
                        img.DrawImage(toDraw,
 | 
			
		||||
                            1,
 | 
			
		||||
                            new Size(69, 70),
 | 
			
		||||
                            new Point(32, 10));
 | 
			
		||||
                    }
 | 
			
		||||
                    var toDraw = Image.Load(data);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                    img.DrawImage(toDraw,
 | 
			
		||||
                        1,
 | 
			
		||||
                        new Size(69, 70),
 | 
			
		||||
                        new Point(32, 10));
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception ex)
 | 
			
		||||
                {
 | 
			
		||||
                    _log.Warn(ex);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //club image
 | 
			
		||||
 | 
			
		||||
            if (!string.IsNullOrWhiteSpace(stats.User.Club?.ImageUrl))
 | 
			
		||||
            {
 | 
			
		||||
                var imgUrl = stats.User.Club.ImageUrl;
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    var (succ, data) = await _cache.TryGetImageDataAsync(imgUrl);
 | 
			
		||||
                    if (!succ)
 | 
			
		||||
                    catch (Exception ex)
 | 
			
		||||
                    {
 | 
			
		||||
                        using (var temp = await http.GetStreamAsync(imgUrl))
 | 
			
		||||
                        {
 | 
			
		||||
                            var tempDraw = Image.Load(temp);
 | 
			
		||||
                            tempDraw = tempDraw.Resize(45, 45);
 | 
			
		||||
                            ApplyRoundedCorners(tempDraw, 22.5f);
 | 
			
		||||
                            data = tempDraw.ToStream().ToArray();
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        await _cache.SetImageDataAsync(imgUrl, data);
 | 
			
		||||
                        _log.Warn(ex);
 | 
			
		||||
                    }
 | 
			
		||||
                    var toDraw = Image.Load(data);
 | 
			
		||||
 | 
			
		||||
                    img.DrawImage(toDraw,
 | 
			
		||||
                        1,
 | 
			
		||||
                        new Size(45, 45),
 | 
			
		||||
                        new Point(722, 25));
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception ex)
 | 
			
		||||
 | 
			
		||||
                //club image
 | 
			
		||||
 | 
			
		||||
                if (!string.IsNullOrWhiteSpace(stats.User.Club?.ImageUrl))
 | 
			
		||||
                {
 | 
			
		||||
                    _log.Warn(ex);
 | 
			
		||||
                    var imgUrl = stats.User.Club.ImageUrl;
 | 
			
		||||
                    try
 | 
			
		||||
                    {
 | 
			
		||||
                        var (succ, data) = await _cache.TryGetImageDataAsync(imgUrl);
 | 
			
		||||
                        if (!succ)
 | 
			
		||||
                        {
 | 
			
		||||
                            using (var temp = await http.GetStreamAsync(imgUrl))
 | 
			
		||||
                            using (var tempDraw = Image.Load(temp).Resize(45, 45))
 | 
			
		||||
                            {
 | 
			
		||||
                                ApplyRoundedCorners(tempDraw, 22.5f);
 | 
			
		||||
                                data = tempDraw.ToStream().ToArray();
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            await _cache.SetImageDataAsync(imgUrl, data);
 | 
			
		||||
                        }
 | 
			
		||||
                        var toDraw = Image.Load(data);
 | 
			
		||||
 | 
			
		||||
                        img.DrawImage(toDraw,
 | 
			
		||||
                            1,
 | 
			
		||||
                            new Size(45, 45),
 | 
			
		||||
                            new Point(722, 25));
 | 
			
		||||
                    }
 | 
			
		||||
                    catch (Exception ex)
 | 
			
		||||
                    {
 | 
			
		||||
                        _log.Warn(ex);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return img.Resize(432, 211).ToStream();
 | 
			
		||||
            }
 | 
			
		||||
            img.Resize(432, 211);
 | 
			
		||||
            var arr = img.ToStream().ToArray();
 | 
			
		||||
 | 
			
		||||
            //_log.Info("{0:F2} KB", arr.Length * 1.0f / 1.KB());
 | 
			
		||||
 | 
			
		||||
            return img;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ namespace NadekoBot.Modules.Xp
 | 
			
		||||
            sw.Stop();
 | 
			
		||||
            _log.Info("Generating finished in {0:F2}s", sw.Elapsed.TotalSeconds);
 | 
			
		||||
            sw.Restart();
 | 
			
		||||
            await Context.Channel.SendFileAsync(img.ToStream(), $"{user.Id}_xp.png")
 | 
			
		||||
            await Context.Channel.SendFileAsync(img, $"{user.Id}_xp.png")
 | 
			
		||||
                .ConfigureAwait(false);
 | 
			
		||||
            sw.Stop();
 | 
			
		||||
            _log.Info("Sending finished in {0:F2}s", sw.Elapsed.TotalSeconds);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user