global nadeko won't cache nsfw images
This commit is contained in:
parent
46f9de01d6
commit
438f68cde7
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user