global nadeko won't cache nsfw images

This commit is contained in:
Master Kwoth 2017-09-12 23:49:37 +02:00
parent 46f9de01d6
commit 438f68cde7
3 changed files with 140 additions and 142 deletions

View File

@ -76,11 +76,13 @@ namespace NadekoBot.Modules.Searches.Common
if (images.Length == 0) if (images.Length == 0)
return null; return null;
var toReturn = images[_rng.Next(images.Length)]; var toReturn = images[_rng.Next(images.Length)];
#if !GLOBAL_NADEKO
foreach (var dledImg in images) foreach (var dledImg in images)
{ {
if(dledImg != toReturn) if(dledImg != toReturn)
_cache.Add(dledImg); _cache.Add(dledImg);
} }
#endif
return toReturn; return toReturn;
} }
} }

View File

@ -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)); return GenerateImageAsync(GetUserStats(user));
} }
@ -565,170 +565,166 @@ namespace NadekoBot.Modules.Xp.Services
_timeFont = _fonts.Find("Whitney-Bold").CreateFont(20); _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()); using (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)
{ {
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, img.DrawText("@" + username, usernameFont, Rgba32.White,
new PointF(148, 170)); new PointF(130, 5));
img.DrawText(stats.GuildRanking.ToString(), _rankFont, Rgba32.White, // level
new PointF(148, 317));
//time on this level img.DrawText(stats.Global.Level.ToString(), _levelFont, Rgba32.White,
new PointF(47, 137));
string GetTimeSpent(DateTime time) img.DrawText(stats.Guild.Level.ToString(), _levelFont, Rgba32.White,
{ new PointF(47, 285));
var offset = DateTime.UtcNow - time;
return $"{offset.Days}d{offset.Hours}h{offset.Minutes}m";
}
img.DrawText(GetTimeSpent(stats.User.LastLevelUp), _timeFont, Rgba32.White, //club name
new PointF(50, 197));
img.DrawText(GetTimeSpent(stats.FullGuildStats.LastLevelUp), _timeFont, Rgba32.White, var clubName = stats.User.Club?.ToString() ?? "-";
new PointF(50, 344));
//avatar var clubFont = _clubFontFamily
.CreateFont(clubName.Length <= 8
? 35
: 35 - (clubName.Length / 2));
if (stats.User.AvatarId != null) img.DrawText(clubName, clubFont, Rgba32.White,
{ new PointF(650 - clubName.Length * 10, 40));
try
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); //ranking
if (!succ)
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); using (var temp = await http.GetStreamAsync(avatarUrl))
tempDraw = tempDraw.Resize(69, 70); using (var tempDraw = Image.Load(temp).Resize(69, 70))
ApplyRoundedCorners(tempDraw, 35); {
data = tempDraw.ToStream().ToArray(); 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); catch (Exception ex)
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)
{ {
using (var temp = await http.GetStreamAsync(imgUrl)) _log.Warn(ex);
{
var tempDraw = Image.Load(temp);
tempDraw = tempDraw.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)
//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;
}); });

View File

@ -32,7 +32,7 @@ namespace NadekoBot.Modules.Xp
sw.Stop(); sw.Stop();
_log.Info("Generating finished in {0:F2}s", sw.Elapsed.TotalSeconds); _log.Info("Generating finished in {0:F2}s", sw.Elapsed.TotalSeconds);
sw.Restart(); sw.Restart();
await Context.Channel.SendFileAsync(img.ToStream(), $"{user.Id}_xp.png") await Context.Channel.SendFileAsync(img, $"{user.Id}_xp.png")
.ConfigureAwait(false); .ConfigureAwait(false);
sw.Stop(); sw.Stop();
_log.Info("Sending finished in {0:F2}s", sw.Elapsed.TotalSeconds); _log.Info("Sending finished in {0:F2}s", sw.Elapsed.TotalSeconds);