From 06cafa1296a39385d07ef69deab3c46267e77004 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Mon, 20 Feb 2017 23:46:34 +0100 Subject: [PATCH] more localization, fixes, etc, no idea exactly what, rategirl is commented out until i fix the last bug --- ...dekoModule.cs => NadekoModuleAttribute.cs} | 0 src/NadekoBot/DataStructures/AsyncLazy.cs | 23 +++ .../Modules/Administration/Administration.cs | 2 +- .../Administration/Commands/LogCommand.cs | 2 +- .../Modules/ClashOfClans/ClashOfClans.cs | 2 +- .../Modules/ClashOfClans/Extensions.cs | 2 +- .../CustomReactions/CustomReactions.cs | 2 +- .../Modules/Gambling/Commands/AnimalRacing.cs | 4 +- .../Gambling/Commands/DiceRollCommand.cs | 5 +- .../Modules/Gambling/Commands/DrawCommand.cs | 2 +- .../Gambling/Commands/FlipCoinCommand.cs | 19 +- .../Modules/Gambling/Commands/Slots.cs | 105 ++++------- src/NadekoBot/Modules/Gambling/Gambling.cs | 2 +- .../Modules/Games/Commands/Acropobia.cs | 2 +- src/NadekoBot/Modules/Games/Games.cs | 166 +++++++++++++++++- src/NadekoBot/Modules/Help/Help.cs | 2 +- src/NadekoBot/Modules/Music/Music.cs | 2 +- src/NadekoBot/Modules/NSFW/NSFW.cs | 2 +- src/NadekoBot/Modules/NadekoModule.cs | 6 +- .../Modules/Permissions/Permissions.cs | 2 +- src/NadekoBot/Modules/Pokemon/Pokemon.cs | 2 +- src/NadekoBot/Modules/Searches/Searches.cs | 15 +- src/NadekoBot/Modules/Utility/Utility.cs | 7 +- src/NadekoBot/NadekoBot.cs | 3 + .../Resources/CommandStrings.Designer.cs | 81 ++++++--- src/NadekoBot/Resources/CommandStrings.resx | 13 +- src/NadekoBot/Resources/ResponseStrings.resx | 36 ++++ src/NadekoBot/Services/IImagesService.cs | 2 + src/NadekoBot/Services/Impl/ImagesService.cs | 6 + src/NadekoBot/_Extensions/Extensions.cs | 27 ++- src/NadekoBot/data/images/wifematrix.png | Bin 0 -> 34050 bytes src/NadekoBot/project.json | 7 +- 32 files changed, 393 insertions(+), 158 deletions(-) rename src/NadekoBot/Attributes/{NadekoModule.cs => NadekoModuleAttribute.cs} (100%) create mode 100644 src/NadekoBot/DataStructures/AsyncLazy.cs create mode 100644 src/NadekoBot/data/images/wifematrix.png diff --git a/src/NadekoBot/Attributes/NadekoModule.cs b/src/NadekoBot/Attributes/NadekoModuleAttribute.cs similarity index 100% rename from src/NadekoBot/Attributes/NadekoModule.cs rename to src/NadekoBot/Attributes/NadekoModuleAttribute.cs diff --git a/src/NadekoBot/DataStructures/AsyncLazy.cs b/src/NadekoBot/DataStructures/AsyncLazy.cs new file mode 100644 index 00000000..40800755 --- /dev/null +++ b/src/NadekoBot/DataStructures/AsyncLazy.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.DataStructures +{ + public class AsyncLazy : Lazy> + { + public AsyncLazy(Func valueFactory) : + base(() => Task.Factory.StartNew(valueFactory)) + { } + + public AsyncLazy(Func> taskFactory) : + base(() => Task.Factory.StartNew(taskFactory).Unwrap()) + { } + + public TaskAwaiter GetAwaiter() { return Value.GetAwaiter(); } + } + +} diff --git a/src/NadekoBot/Modules/Administration/Administration.cs b/src/NadekoBot/Modules/Administration/Administration.cs index 3f52ac17..405485dd 100644 --- a/src/NadekoBot/Modules/Administration/Administration.cs +++ b/src/NadekoBot/Modules/Administration/Administration.cs @@ -16,7 +16,7 @@ using NLog; namespace NadekoBot.Modules.Administration { [NadekoModule("Administration", ".")] - public partial class Administration : NadekoModule + public partial class Administration : NadekoTopLevelModule { private static ConcurrentHashSet deleteMessagesOnCommand { get; } diff --git a/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs b/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs index 95c4538a..88d512e7 100644 --- a/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs +++ b/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs @@ -1068,7 +1068,7 @@ namespace NadekoBot.Modules.Administration public static class GuildExtensions { public static string GetLogText(this IGuild guild, string key, params object[] replacements) - => NadekoModule.GetTextStatic(key, + => NadekoTopLevelModule.GetTextStatic(key, NadekoBot.Localization.GetCultureInfo(guild), typeof(Administration).Name.ToLowerInvariant(), replacements); diff --git a/src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs b/src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs index 37f07efa..043a12b2 100644 --- a/src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs +++ b/src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs @@ -17,7 +17,7 @@ using NLog; namespace NadekoBot.Modules.ClashOfClans { [NadekoModule("ClashOfClans", ",")] - public class ClashOfClans : NadekoModule + public class ClashOfClans : NadekoTopLevelModule { public static ConcurrentDictionary> ClashWars { get; set; } = new ConcurrentDictionary>(); diff --git a/src/NadekoBot/Modules/ClashOfClans/Extensions.cs b/src/NadekoBot/Modules/ClashOfClans/Extensions.cs index 032d3bcd..5756d3db 100644 --- a/src/NadekoBot/Modules/ClashOfClans/Extensions.cs +++ b/src/NadekoBot/Modules/ClashOfClans/Extensions.cs @@ -135,7 +135,7 @@ namespace NadekoBot.Modules.ClashOfClans public static string Localize(this ClashWar cw, string key) { - return NadekoModule.GetTextStatic(key, + return NadekoTopLevelModule.GetTextStatic(key, NadekoBot.Localization.GetCultureInfo(cw.Channel?.GuildId), typeof(ClashOfClans).Name.ToLowerInvariant()); } diff --git a/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs b/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs index ebeb4922..efd3717e 100644 --- a/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs +++ b/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs @@ -17,7 +17,7 @@ using NadekoBot.DataStructures; namespace NadekoBot.Modules.CustomReactions { [NadekoModule("CustomReactions", ".")] - public class CustomReactions : NadekoModule + public class CustomReactions : NadekoTopLevelModule { private static CustomReaction[] _globalReactions = new CustomReaction[] { }; public static CustomReaction[] GlobalReactions => _globalReactions; diff --git a/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs b/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs index 39c749d2..040e657e 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs @@ -272,12 +272,12 @@ namespace NadekoBot.Modules.Gambling } private string GetText(string text) - => NadekoModule.GetTextStatic(text, + => NadekoTopLevelModule.GetTextStatic(text, NadekoBot.Localization.GetCultureInfo(_raceChannel.Guild), typeof(Gambling).Name.ToLowerInvariant()); private string GetText(string text, params object[] replacements) - => NadekoModule.GetTextStatic(text, + => NadekoTopLevelModule.GetTextStatic(text, NadekoBot.Localization.GetCultureInfo(_raceChannel.Guild), typeof(Gambling).Name.ToLowerInvariant(), replacements); diff --git a/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs b/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs index a75827e7..721b5b4e 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs @@ -10,6 +10,7 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; +using ImageSharp.Formats; using Image = ImageSharp.Image; namespace NadekoBot.Modules.Gambling @@ -35,7 +36,7 @@ namespace NadekoBot.Modules.Gambling var imageStream = await Task.Run(() => { var ms = new MemoryStream(); - new[] { GetDice(num1), GetDice(num2) }.Merge().SaveAsPng(ms); + new[] { GetDice(num1), GetDice(num2) }.Merge().Save(ms); ms.Position = 0; return ms; }).ConfigureAwait(false); @@ -120,7 +121,7 @@ namespace NadekoBot.Modules.Gambling var bitmap = dice.Merge(); var ms = new MemoryStream(); - bitmap.SaveAsPng(ms); + bitmap.Save(ms); ms.Position = 0; await Context.Channel.SendFileAsync(ms, "dice.png", Context.User.Mention + diff --git a/src/NadekoBot/Modules/Gambling/Commands/DrawCommand.cs b/src/NadekoBot/Modules/Gambling/Commands/DrawCommand.cs index 7471f7d0..b7a68ece 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/DrawCommand.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/DrawCommand.cs @@ -49,7 +49,7 @@ namespace NadekoBot.Modules.Gambling images.Add(new Image(stream)); } MemoryStream bitmapStream = new MemoryStream(); - images.Merge().SaveAsPng(bitmapStream); + images.Merge().Save(bitmapStream); bitmapStream.Position = 0; var toSend = $"{Context.User.Mention}"; if (cardObjects.Count == 5) diff --git a/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs b/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs index 973bc90e..40b8a735 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs @@ -52,17 +52,22 @@ namespace NadekoBot.Modules.Gambling return; } var imgs = new Image[count]; - using (var heads = _images.Heads.ToStream()) - using(var tails = _images.Tails.ToStream()) + for (var i = 0; i < count; i++) { - for (var i = 0; i < count; i++) + using (var heads = _images.Heads.ToStream()) + using (var tails = _images.Tails.ToStream()) { - imgs[i] = rng.Next(0, 10) < 5 ? - new Image(heads) : - new Image(tails); + if (rng.Next(0, 10) < 5) + { + imgs[i] = new Image(heads); + } + else + { + imgs[i] = new Image(tails); + } } - await Context.Channel.SendFileAsync(imgs.Merge().ToStream(), $"{count} coins.png").ConfigureAwait(false); } + await Context.Channel.SendFileAsync(imgs.Merge().ToStream(), $"{count} coins.png").ConfigureAwait(false); } [NadekoCommand, Usage, Description, Aliases] diff --git a/src/NadekoBot/Modules/Gambling/Commands/Slots.cs b/src/NadekoBot/Modules/Gambling/Commands/Slots.cs index c298a9b4..ea20b4b1 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/Slots.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/Slots.cs @@ -1,5 +1,6 @@ using Discord; using Discord.Commands; +using ImageSharp; using NadekoBot.Attributes; using NadekoBot.Extensions; using NadekoBot.Services; @@ -163,83 +164,43 @@ namespace NadekoBot.Modules.Gambling var result = SlotMachine.Pull(); int[] numbers = result.Numbers; - using (var bgPixels = bgImage.Lock()) + + for (int i = 0; i < 3; i++) { - for (int i = 0; i < 3; i++) + using (var file = _images.SlotEmojis[numbers[i]].ToStream()) + using (var randomImage = new ImageSharp.Image(file)) { - using (var file = _images.SlotEmojis[numbers[i]].ToStream()) - { - var randomImage = new ImageSharp.Image(file); - using (var toAdd = randomImage.Lock()) - { - for (int j = 0; j < toAdd.Width; j++) - { - for (int k = 0; k < toAdd.Height; k++) - { - var x = 95 + 142 * i + j; - int y = 330 + k; - var toSet = toAdd[j, k]; - if (toSet.A < _alphaCutOut) - continue; - bgPixels[x, y] = toAdd[j, k]; - } - } - } - } + bgImage.DrawImage(randomImage, 100, default(Size), new Point(95 + 142 * i, 330)); } - - var won = amount * result.Multiplier; - var printWon = won; - var n = 0; - do - { - var digit = printWon % 10; - using (var fs = NadekoBot.Images.SlotNumbers[digit].ToStream()) - { - var img = new ImageSharp.Image(fs); - using (var pixels = img.Lock()) - { - for (int i = 0; i < pixels.Width; i++) - { - for (int j = 0; j < pixels.Height; j++) - { - if (pixels[i, j].A < _alphaCutOut) - continue; - var x = 230 - n * 16 + i; - bgPixels[x, 462 + j] = pixels[i, j]; - } - } - } - } - n++; - } while ((printWon /= 10) != 0); - - var printAmount = amount; - n = 0; - do - { - var digit = printAmount % 10; - using (var fs = _images.SlotNumbers[digit].ToStream()) - { - var img = new ImageSharp.Image(fs); - using (var pixels = img.Lock()) - { - for (int i = 0; i < pixels.Width; i++) - { - for (int j = 0; j < pixels.Height; j++) - { - if (pixels[i, j].A < _alphaCutOut) - continue; - var x = 395 - n * 16 + i; - bgPixels[x, 462 + j] = pixels[i, j]; - } - } - } - } - n++; - } while ((printAmount /= 10) != 0); } + var won = amount * result.Multiplier; + var printWon = won; + var n = 0; + do + { + var digit = printWon % 10; + using (var fs = NadekoBot.Images.SlotNumbers[digit].ToStream()) + using (var img = new ImageSharp.Image(fs)) + { + bgImage.DrawImage(img, 100, default(Size), new Point(230 - n * 16, 462)); + } + n++; + } while ((printWon /= 10) != 0); + + var printAmount = amount; + n = 0; + do + { + var digit = printAmount % 10; + using (var fs = _images.SlotNumbers[digit].ToStream()) + using (var img = new ImageSharp.Image(fs)) + { + bgImage.DrawImage(img, 100, default(Size), new Point(395 - n * 16, 462)); + } + n++; + } while ((printAmount /= 10) != 0); + var msg = GetText("better_luck"); if (result.Multiplier != 0) { diff --git a/src/NadekoBot/Modules/Gambling/Gambling.cs b/src/NadekoBot/Modules/Gambling/Gambling.cs index 3cdd7165..0db8e198 100644 --- a/src/NadekoBot/Modules/Gambling/Gambling.cs +++ b/src/NadekoBot/Modules/Gambling/Gambling.cs @@ -12,7 +12,7 @@ using System.Collections.Generic; namespace NadekoBot.Modules.Gambling { [NadekoModule("Gambling", "$")] - public partial class Gambling : NadekoModule + public partial class Gambling : NadekoTopLevelModule { public static string CurrencyName { get; set; } public static string CurrencyPluralName { get; set; } diff --git a/src/NadekoBot/Modules/Games/Commands/Acropobia.cs b/src/NadekoBot/Modules/Games/Commands/Acropobia.cs index 088b95d7..aa11f1c6 100644 --- a/src/NadekoBot/Modules/Games/Commands/Acropobia.cs +++ b/src/NadekoBot/Modules/Games/Commands/Acropobia.cs @@ -299,7 +299,7 @@ $@"-- } private string GetText(string key, params object[] replacements) - => NadekoModule.GetTextStatic(key, + => NadekoTopLevelModule.GetTextStatic(key, NadekoBot.Localization.GetCultureInfo(_channel.Guild), typeof(Games).Name.ToLowerInvariant()); } diff --git a/src/NadekoBot/Modules/Games/Games.cs b/src/NadekoBot/Modules/Games/Games.cs index b6b9130b..88a663df 100644 --- a/src/NadekoBot/Modules/Games/Games.cs +++ b/src/NadekoBot/Modules/Games/Games.cs @@ -4,18 +4,33 @@ using NadekoBot.Services; using System.Threading.Tasks; using NadekoBot.Attributes; using System; +using System.Collections.Concurrent; using System.Linq; using System.Collections.Generic; using System.Collections.Immutable; +using System.IO; +using System.Threading; using NadekoBot.Extensions; +using System.Net.Http; +using ImageSharp; +using NadekoBot.DataStructures; +using NLog; +using ImageSharp.Drawing.Pens; +using SixLabors.Shapes; namespace NadekoBot.Modules.Games { [NadekoModule("Games", ">")] - public partial class Games : NadekoModule + public partial class Games : NadekoTopLevelModule { private static readonly ImmutableArray _8BallResponses = NadekoBot.BotConfig.EightBallResponses.Select(ebr => ebr.Text).ToImmutableArray(); + private static readonly Timer _t = new Timer((_) => + { + _girlRatings.Clear(); + + }, null, TimeSpan.FromDays(1), TimeSpan.FromDays(1)); + [NadekoCommand, Usage, Description, Aliases] public async Task Choose([Remainder] string list = null) { @@ -91,6 +106,155 @@ namespace NadekoBot.Modules.Games await Context.Channel.SendConfirmAsync(msg).ConfigureAwait(false); } + private static readonly ConcurrentDictionary _girlRatings = new ConcurrentDictionary(); + + public class GirlRating + { + private static Logger _log = LogManager.GetCurrentClassLogger(); + + public double Crazy { get; } + public double Hot { get; } + public int Roll { get; } + public string Advice { get; } + public AsyncLazy Url { get; } + + public GirlRating(double crazy, double hot, int roll, string advice) + { + Crazy = crazy; + Hot = hot; + Roll = roll; + Advice = advice; // convenient to have it here, even though atm there are only few different ones. + + Url = new AsyncLazy(async () => + { + try + { + using (var ms = new MemoryStream(NadekoBot.Images.WifeMatrix.ToArray(), false)) + using (var img = new ImageSharp.Image(ms)) + { + var clr = new ImageSharp.Color(0x0000ff); + const int minx = 35; + const int miny = 385; + const int length = 345; + + var pointx = (int)(minx + length * (Hot / 10)); + var pointy = (int)(miny - length * ((Crazy - 4) / 6)); + + var p = new Pen(ImageSharp.Color.Red, 5); + + img.Draw(p, new SixLabors.Shapes.Ellipse(200, 200, 5, 5)); + + string url; + using (var http = new HttpClient()) + using (var imgStream = new MemoryStream()) + { + img.Save(imgStream); + var byteContent = new ByteArrayContent(imgStream.ToArray()); + http.AddFakeHeaders(); + + var reponse = await http.PutAsync("https://transfer.sh/img.png", byteContent); + url = await reponse.Content.ReadAsStringAsync(); + } + return url; + } + } + catch (Exception ex) + { + _log.Warn(ex); + return null; + } + }); + } + } + + //[NadekoCommand, Usage, Description, Aliases] + //[RequireContext(ContextType.Guild)] + //public async Task RateGirl(IGuildUser usr) + //{ + // var gr = _girlRatings.GetOrAdd(usr.Id, GetGirl); + // var img = await gr.Url; + // await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor() + // .WithTitle("Girl Rating For " + usr) + // .AddField(efb => efb.WithName("Hot").WithValue(gr.Hot.ToString("F2")).WithIsInline(true)) + // .AddField(efb => efb.WithName("Crazy").WithValue(gr.Crazy.ToString("F2")).WithIsInline(true)) + // .AddField(efb => efb.WithName("Advice").WithValue(gr.Advice).WithIsInline(false)) + // .WithImageUrl(img)).ConfigureAwait(false); + //} + + private double NextDouble(double x, double y) + { + var rng = new Random(); + return rng.NextDouble() * (y - x) + x; + } + + private GirlRating GetGirl(ulong uid) + { + var rng = new NadekoRandom(); + + var roll = rng.Next(1, 1001); + + double hot; + double crazy; + string advice; + if (roll < 500) + { + hot = NextDouble(0, 5); + crazy = NextDouble(4, 10); + advice = + "This is your NO-GO ZONE. We do not hang around, and date, and marry women who are atleast, in our mind, a 5. " + + "So, this is your no-go zone. You don't go here. You just rule this out. Life is better this way, that's the way it is."; + } + else if (roll < 750) + { + hot = NextDouble(5, 8); + crazy = NextDouble(4, .6 * hot + 4); + advice = "Above a 5, and to about an 8, and below the crazy line - this is your FUN ZONE. You can " + + "hang around here, and meet these girls and spend time with them. Keep in mind, while you're " + + "in the fun zone, you want to move OUT of the fun zone to a more permanent location. " + + "These girls are most of the time not crazy."; + } + else if (roll < 900) + { + hot = NextDouble(5, 10); + crazy = NextDouble(.61 * hot + 4, 10); + advice = "Above the crazy line - it's the DANGER ZONE. This is redheads, strippers, anyone named Tiffany, " + + "hairdressers... This is where your car gets keyed, you get bunny in the pot, your tires get slashed, " + + "and you wind up in jail."; + } + else if (roll < 951) + { + hot = NextDouble(8, 10); + crazy = NextDouble(4, 10); + advice = "Below the crazy line, above an 8 hot, but still about 7 crazy. This is your DATE ZONE. " + + "You can stay in the date zone indefinitely. These are the girls you introduce to your friends and your family. " + + "They're good looking, and they're reasonably not crazy most of the time. You can stay here indefinitely."; + } + else if (roll < 990) + { + hot = NextDouble(8, 10); + crazy = NextDouble(5, 7); + advice = "Above an 8 hot, and between about 7 and a 5 crazy - this is WIFE ZONE. You you meet this girl, you should consider long-term " + + "relationship. Rare."; + } + else if (roll < 999) + { + hot = NextDouble(8, 10); + crazy = NextDouble(2, 3.99d); + advice = "You've met a girl she's above 8 hot, and not crazy at all (below 4)... totally cool?" + + " You should be careful. That's a dude. It's a tranny."; + } + else + { + hot = NextDouble(8, 10); + crazy = NextDouble(4, 5); + advice = "Below 5 crazy, and above 8 hot, this is the UNICORN ZONE, these things don't exist." + + "If you find a unicorn, please capture it safely, keep it alive, we'd like to study it, " + + "and maybe look at how to replicate that."; + } + + return new GirlRating(crazy, hot, roll, advice); + } + [NadekoCommand, Usage, Description, Aliases] public async Task Linux(string guhnoo, string loonix) { diff --git a/src/NadekoBot/Modules/Help/Help.cs b/src/NadekoBot/Modules/Help/Help.cs index c22a9789..d6ceb1bd 100644 --- a/src/NadekoBot/Modules/Help/Help.cs +++ b/src/NadekoBot/Modules/Help/Help.cs @@ -13,7 +13,7 @@ using System.Collections.Generic; namespace NadekoBot.Modules.Help { [NadekoModule("Help", "-")] - public class Help : NadekoModule + public class Help : NadekoTopLevelModule { private static string helpString { get; } = NadekoBot.BotConfig.HelpString; public static string HelpString => String.Format(helpString, NadekoBot.Credentials.ClientId, NadekoBot.ModulePrefixes[typeof(Help).Name]); diff --git a/src/NadekoBot/Modules/Music/Music.cs b/src/NadekoBot/Modules/Music/Music.cs index 4fbc8701..a7b46269 100644 --- a/src/NadekoBot/Modules/Music/Music.cs +++ b/src/NadekoBot/Modules/Music/Music.cs @@ -20,7 +20,7 @@ namespace NadekoBot.Modules.Music { [NadekoModule("Music", "!!")] [DontAutoLoad] - public partial class Music : NadekoModule + public partial class Music : NadekoTopLevelModule { public static ConcurrentDictionary MusicPlayers { get; } = new ConcurrentDictionary(); diff --git a/src/NadekoBot/Modules/NSFW/NSFW.cs b/src/NadekoBot/Modules/NSFW/NSFW.cs index 5538e8d6..53a3f3bb 100644 --- a/src/NadekoBot/Modules/NSFW/NSFW.cs +++ b/src/NadekoBot/Modules/NSFW/NSFW.cs @@ -17,7 +17,7 @@ using System.Collections.Concurrent; namespace NadekoBot.Modules.NSFW { [NadekoModule("NSFW", "~")] - public class NSFW : NadekoModule + public class NSFW : NadekoTopLevelModule { private static readonly ConcurrentDictionary AutoHentaiTimers = new ConcurrentDictionary(); diff --git a/src/NadekoBot/Modules/NadekoModule.cs b/src/NadekoBot/Modules/NadekoModule.cs index d76a483c..ea4a0049 100644 --- a/src/NadekoBot/Modules/NadekoModule.cs +++ b/src/NadekoBot/Modules/NadekoModule.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace NadekoBot.Modules { - public abstract class NadekoModule : ModuleBase + public abstract class NadekoTopLevelModule : ModuleBase { protected readonly Logger _log; protected CultureInfo _cultureInfo; @@ -17,7 +17,7 @@ namespace NadekoBot.Modules public readonly string ModuleTypeName; public readonly string LowerModuleTypeName; - protected NadekoModule(bool isTopLevelModule = true) + protected NadekoTopLevelModule(bool isTopLevelModule = true) { //if it's top level module ModuleTypeName = isTopLevelModule ? this.GetType().Name : this.GetType().DeclaringType.Name; @@ -120,7 +120,7 @@ namespace NadekoBot.Modules } } - public abstract class NadekoSubmodule : NadekoModule + public abstract class NadekoSubmodule : NadekoTopLevelModule { protected NadekoSubmodule() : base(false) { diff --git a/src/NadekoBot/Modules/Permissions/Permissions.cs b/src/NadekoBot/Modules/Permissions/Permissions.cs index 407ca2a2..3e8ecd13 100644 --- a/src/NadekoBot/Modules/Permissions/Permissions.cs +++ b/src/NadekoBot/Modules/Permissions/Permissions.cs @@ -15,7 +15,7 @@ using NLog; namespace NadekoBot.Modules.Permissions { [NadekoModule("Permissions", ";")] - public partial class Permissions : NadekoModule + public partial class Permissions : NadekoTopLevelModule { public class PermissionCache { diff --git a/src/NadekoBot/Modules/Pokemon/Pokemon.cs b/src/NadekoBot/Modules/Pokemon/Pokemon.cs index 08d3976f..c81091c7 100644 --- a/src/NadekoBot/Modules/Pokemon/Pokemon.cs +++ b/src/NadekoBot/Modules/Pokemon/Pokemon.cs @@ -16,7 +16,7 @@ using System.Collections.Concurrent; namespace NadekoBot.Modules.Pokemon { [NadekoModule("Pokemon", ">")] - public class Pokemon : NadekoModule + public class Pokemon : NadekoTopLevelModule { private static readonly List _pokemonTypes = new List(); private static readonly ConcurrentDictionary _stats = new ConcurrentDictionary(); diff --git a/src/NadekoBot/Modules/Searches/Searches.cs b/src/NadekoBot/Modules/Searches/Searches.cs index 28a00413..ef47301c 100644 --- a/src/NadekoBot/Modules/Searches/Searches.cs +++ b/src/NadekoBot/Modules/Searches/Searches.cs @@ -1,5 +1,4 @@ using Discord; -using Discord.Commands; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; @@ -8,27 +7,25 @@ using System.Text; using System.Net.Http; using NadekoBot.Services; using System.Threading.Tasks; -using NadekoBot.Attributes; -using System.Text.RegularExpressions; using System.Net; using NadekoBot.Modules.Searches.Models; using System.Collections.Generic; -using ImageSharp; using NadekoBot.Extensions; using System.IO; using NadekoBot.Modules.Searches.Commands.OMDB; using NadekoBot.Modules.Searches.Commands.Models; -using AngleSharp.Parser.Html; using AngleSharp; using AngleSharp.Dom.Html; using AngleSharp.Dom; using System.Xml; -using System.Xml.Linq; +using Configuration = AngleSharp.Configuration; +using NadekoBot.Attributes; +using Discord.Commands; namespace NadekoBot.Modules.Searches { [NadekoModule("Searches", "~")] - public partial class Searches : NadekoModule + public partial class Searches : NadekoTopLevelModule { [NadekoCommand, Usage, Description, Aliases] public async Task Weather([Remainder] string query) @@ -396,7 +393,7 @@ namespace NadekoBot.Modules.Searches msg = "⚠ Found over 4 images. Showing random 4."; } var ms = new MemoryStream(); - await Task.Run(() => images.AsEnumerable().Merge().SaveAsPng(ms)); + await Task.Run(() => images.AsEnumerable().Merge().Save(ms)); ms.Position = 0; await Context.Channel.SendFileAsync(ms, arg + ".png", msg).ConfigureAwait(false); } @@ -625,7 +622,7 @@ namespace NadekoBot.Modules.Searches return; var img = new ImageSharp.Image(50, 50); - img.BackgroundColor(new ImageSharp.Color(color)); + //img.FillPolygon(new ImageSharp, new ImageSharp.Color(color)); await Context.Channel.SendFileAsync(img.ToStream(), $"{color}.png").ConfigureAwait(false); ; } diff --git a/src/NadekoBot/Modules/Utility/Utility.cs b/src/NadekoBot/Modules/Utility/Utility.cs index d627d956..8d3a95c4 100644 --- a/src/NadekoBot/Modules/Utility/Utility.cs +++ b/src/NadekoBot/Modules/Utility/Utility.cs @@ -6,7 +6,6 @@ using System.Linq; using System.Threading.Tasks; using System.Text; using NadekoBot.Extensions; -using System.Text.RegularExpressions; using System.Reflection; using NadekoBot.Services.Impl; using System.Net.Http; @@ -21,7 +20,7 @@ using NadekoBot.Services; namespace NadekoBot.Modules.Utility { [NadekoModule("Utility", ".")] - public partial class Utility : NadekoModule + public partial class Utility : NadekoTopLevelModule { private static ConcurrentDictionary rotatingRoleColors = new ConcurrentDictionary(); @@ -122,10 +121,10 @@ namespace NadekoBot.Modules.Utility } return; } - + var hexColors = hexes.Select(hex => { - try { return (ImageSharp.Color?)new ImageSharp.Color(hex.Replace("#", "")); } catch { return null; } + try { return (ImageSharp.Color?)ImageSharp.Color.FromHex(hex.Replace("#", "")); } catch { return null; } }) .Where(c => c != null) .Select(c => c.Value) diff --git a/src/NadekoBot/NadekoBot.cs b/src/NadekoBot/NadekoBot.cs index 40d71602..7da895d6 100644 --- a/src/NadekoBot/NadekoBot.cs +++ b/src/NadekoBot/NadekoBot.cs @@ -60,6 +60,9 @@ namespace NadekoBot OkColor = new Color(Convert.ToUInt32(BotConfig.OkColor, 16)); ErrorColor = new Color(Convert.ToUInt32(BotConfig.ErrorColor, 16)); } + + //ImageSharp.Configuration.Default.AddImageFormat(new ImageSharp.Formats.PngFormat()); + //ImageSharp.Configuration.Default.AddImageFormat(new ImageSharp.Formats.JpegFormat()); } public async Task RunAsync(params string[] args) diff --git a/src/NadekoBot/Resources/CommandStrings.Designer.cs b/src/NadekoBot/Resources/CommandStrings.Designer.cs index 579382ba..e6390b66 100644 --- a/src/NadekoBot/Resources/CommandStrings.Designer.cs +++ b/src/NadekoBot/Resources/CommandStrings.Designer.cs @@ -2381,33 +2381,6 @@ namespace NadekoBot.Resources { } } - /// - /// Looks up a localized string similar to qsearch. - /// - public static string searchquote_cmd { - get { - return ResourceManager.GetString("searchquote_cmd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Shows a random quote for a keyword that contains any text specified in the search.. - /// - public static string searchquote_desc { - get { - return ResourceManager.GetString("searchquote_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `{0}qsearch keyword text`. - /// - public static string searchquote_usage { - get { - return ResourceManager.GetString("searchquote_usage", resourceCulture); - } - } - /// /// Looks up a localized string similar to delmsgoncmd. /// @@ -5756,6 +5729,33 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to rategirl. + /// + public static string rategirl_cmd { + get { + return ResourceManager.GetString("rategirl_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use the universal hot-crazy wife zone matrix to determine the girl's worth. It is everything young men need to know about women. At any moment in time, any woman you have previously located on this chart can vanish from that location and appear anywhere else on the chart.. + /// + public static string rategirl_desc { + get { + return ResourceManager.GetString("rategirl_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `{0}rategirl @SomeGurl`. + /// + public static string rategirl_usage { + get { + return ResourceManager.GetString("rategirl_usage", resourceCulture); + } + } + /// /// Looks up a localized string similar to reloadimages. /// @@ -6701,6 +6701,33 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to qsearch. + /// + public static string searchquote_cmd { + get { + return ResourceManager.GetString("searchquote_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Shows a random quote for a keyword that contains any text specified in the search.. + /// + public static string searchquote_desc { + get { + return ResourceManager.GetString("searchquote_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `{0}qsearch keyword text`. + /// + public static string searchquote_usage { + get { + return ResourceManager.GetString("searchquote_usage", resourceCulture); + } + } + /// /// Looks up a localized string similar to send. /// diff --git a/src/NadekoBot/Resources/CommandStrings.resx b/src/NadekoBot/Resources/CommandStrings.resx index 732c0087..c661db7d 100644 --- a/src/NadekoBot/Resources/CommandStrings.resx +++ b/src/NadekoBot/Resources/CommandStrings.resx @@ -1151,7 +1151,7 @@ `{0}qsearch keyword text` - + deletequote delq @@ -3141,4 +3141,13 @@ `{0}langli` - + + rategirl + + + Use the universal hot-crazy wife zone matrix to determine the girl's worth. It is everything young men need to know about women. At any moment in time, any woman you have previously located on this chart can vanish from that location and appear anywhere else on the chart. + + + `{0}rategirl @SomeGurl` + + \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.resx b/src/NadekoBot/Resources/ResponseStrings.resx index 90024cd2..c1eb0a5d 100644 --- a/src/NadekoBot/Resources/ResponseStrings.resx +++ b/src/NadekoBot/Resources/ResponseStrings.resx @@ -1170,9 +1170,42 @@ Don't forget to leave your discord name or id in the message. 8ball + + Acrophobia + + + Game ended with no submissions. + + + No votes cast. Game ended with no winner. + + + Acronym was {0}. + Acrophobia game is already running in this channel. + + Game started. Create a sentence with the following acronym: {0}. + + + You have {0} seconds to make a submission. + + + {0} submitted their sentence. ({1} total) + + + Vote by typing a number of the submission + + + {0} cast their vote! + + + Winner is {0} with {1} points. + + + {0} is the winner for being the only user who made a submission! + Question @@ -1182,4 +1215,7 @@ Don't forget to leave your discord name or id in the message. {0} won! {1} beats {2} + + Submissions Closed + \ No newline at end of file diff --git a/src/NadekoBot/Services/IImagesService.cs b/src/NadekoBot/Services/IImagesService.cs index 81e21907..e3b25458 100644 --- a/src/NadekoBot/Services/IImagesService.cs +++ b/src/NadekoBot/Services/IImagesService.cs @@ -21,6 +21,8 @@ namespace NadekoBot.Services ImmutableArray> SlotEmojis { get; } ImmutableArray> SlotNumbers { get; } + ImmutableArray WifeMatrix { get; } + Task Reload(); } } diff --git a/src/NadekoBot/Services/Impl/ImagesService.cs b/src/NadekoBot/Services/Impl/ImagesService.cs index 77ee9f26..567d63f2 100644 --- a/src/NadekoBot/Services/Impl/ImagesService.cs +++ b/src/NadekoBot/Services/Impl/ImagesService.cs @@ -28,6 +28,8 @@ namespace NadekoBot.Services.Impl private const string slotNumbersPath = basePath + "slots/numbers/"; private const string slotEmojisPath = basePath + "slots/emojis/"; + private const string _wifeMatrixPath = basePath + "wifematrix.png"; + public ImmutableArray Heads { get; private set; } public ImmutableArray Tails { get; private set; } @@ -41,6 +43,8 @@ namespace NadekoBot.Services.Impl public ImmutableArray> SlotNumbers { get; private set; } public ImmutableArray> SlotEmojis { get; private set; } + public ImmutableArray WifeMatrix { get; private set; } + private ImagesService() { _log = LogManager.GetCurrentClassLogger(); @@ -86,6 +90,8 @@ namespace NadekoBot.Services.Impl .Select(x => File.ReadAllBytes(x).ToImmutableArray()) .ToImmutableArray(); + WifeMatrix = File.ReadAllBytes(_wifeMatrixPath).ToImmutableArray(); + sw.Stop(); _log.Info($"Images loaded after {sw.Elapsed.TotalSeconds:F2}s!"); return sw.Elapsed; diff --git a/src/NadekoBot/_Extensions/Extensions.cs b/src/NadekoBot/_Extensions/Extensions.cs index 4c32a542..8dbdf02b 100644 --- a/src/NadekoBot/_Extensions/Extensions.cs +++ b/src/NadekoBot/_Extensions/Extensions.cs @@ -22,7 +22,11 @@ namespace NadekoBot.Extensions private const string arrow_right = "➡"; public static Stream ToStream(this IEnumerable bytes, bool canWrite = false) - => new MemoryStream(bytes as byte[] ?? bytes.ToArray(), canWrite); + { + var ms = new MemoryStream(bytes as byte[] ?? bytes.ToArray(), canWrite); + ms.Seek(0, SeekOrigin.Begin); + return ms; + } /// /// danny kamisama @@ -398,22 +402,15 @@ namespace NadekoBot.Extensions public static ImageSharp.Image Merge(this IEnumerable images) { - var imgList = images.ToList(); + var imgs = images.ToArray(); - var canvas = new ImageSharp.Image(imgList.Sum(img => img.Width), imgList.Max(img => img.Height)); + var canvas = new ImageSharp.Image(imgs.Sum(img => img.Width), imgs.Max(img => img.Height)); - var canvasPixels = canvas.Lock(); - int offsetX = 0; - foreach (var img in imgList.Select(img => img.Lock())) + var xOffset = 0; + for (int i = 0; i < imgs.Length; i++) { - for (int i = 0; i < img.Width; i++) - { - for (int j = 0; j < img.Height; j++) - { - canvasPixels[i + offsetX, j] = img[i, j]; - } - } - offsetX += img.Width; + canvas.DrawImage(imgs[i], 100, default(Size), new Point(xOffset, 0)); + xOffset += imgs[i].Bounds.Width; } return canvas; @@ -422,7 +419,7 @@ namespace NadekoBot.Extensions public static Stream ToStream(this ImageSharp.Image img) { var imageStream = new MemoryStream(); - img.SaveAsPng(imageStream); + img.Save(imageStream); imageStream.Position = 0; return imageStream; } diff --git a/src/NadekoBot/data/images/wifematrix.png b/src/NadekoBot/data/images/wifematrix.png new file mode 100644 index 0000000000000000000000000000000000000000..6e0b8db9b6f25e0175b76a163f7ce20929a78fba GIT binary patch literal 34050 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 literal 0 HcmV?d00001 diff --git a/src/NadekoBot/project.json b/src/NadekoBot/project.json index 88ebdd52..d6b8ad6c 100644 --- a/src/NadekoBot/project.json +++ b/src/NadekoBot/project.json @@ -23,7 +23,12 @@ "Google.Apis.Urlshortener.v1": "1.19.0.138", "Google.Apis.YouTube.v3": "1.20.0.701", "Google.Apis.Customsearch.v1": "1.20.0.466", - "ImageSharp": "1.0.0-alpha-000079", + "ImageSharp": "1.0.0-alpha2-00090", + "ImageSharp.Processing": "1.0.0-alpha2-00078", + "ImageSharp.Formats.Png": "1.0.0-alpha2-00086", + "ImageSharp.Drawing": "1.0.0-alpha2-00090", + "ImageSharp.Drawing.Paths": "1.0.0-alpha2-00040", + //"ImageSharp.Formats.Jpeg": "1.0.0-alpha2-00090", "Microsoft.EntityFrameworkCore": "1.1.0", "Microsoft.EntityFrameworkCore.Design": "1.1.0", "Microsoft.EntityFrameworkCore.Sqlite": "1.1.0",