From 40214c0deb8362f53d2d1d5ccc0d3f7f92cca219 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Mon, 15 Aug 2016 16:57:40 +0200 Subject: [PATCH] Almost done converting NSFW --- src/NadekoBot/Attributes/LocalizedCommand.cs | 2 +- .../Attributes/LocalizedDescription.cs | 2 +- src/NadekoBot/Attributes/LocalizedSummary.cs | 2 +- src/NadekoBot/Classes/Extensions.cs | 378 ---------------- src/NadekoBot/Classes/SearchHelper.cs | 86 +--- .../ClashOfClans/ClashOfClans.cs | 17 +- .../ClashOfClans/ClashOfClansModule.cs | 289 ++++++++++++ src/NadekoBot/Modules/DiscordModule.cs | 26 ++ src/NadekoBot/Modules/NSFW/NSFWModule.cs | 237 ++++++++++ .../Modules/Utility/Commands/InfoCommands.cs | 177 ++++---- .../Modules/Utility/Commands/Remind.cs | 10 +- .../Modules/Utility/UtilityModule.cs | 271 ++++++------ src/NadekoBot/NadekoBot.cs | 41 +- ...Designer.cs => CommandStrings.Designer.cs} | 6 +- .../{Strings.resx => CommandStrings.resx} | 0 .../Resources/ResponseStrings.Designer.cs | 71 +++ src/NadekoBot/Resources/ResponseStrings.resx | 123 ++++++ src/NadekoBot/Services/ILocalization.cs | 13 + .../{ => Services/Impl}/Localization.cs | 31 +- src/NadekoBot/_Extensions/Extensions.cs | 51 +++ .../Administration/AdministrationModule.cs | 130 +++--- .../Administration/Commands/AutoAssignRole.cs | 8 +- .../Commands/CrossServerTextChannel.cs | 4 +- .../Commands/CustomReactionsCommands.cs | 24 +- .../Administration/Commands/LogCommand.cs | 26 +- .../Commands/MessageRepeater.cs | 8 +- .../Administration/Commands/PlayingRotate.cs | 10 +- .../Commands/RatelimitCommand.cs | 4 +- .../Commands/SelfAssignedRolesCommand.cs | 32 +- .../Administration/Commands/SelfCommands.cs | 2 +- .../Commands/ServerGreetCommand.cs | 36 +- .../Commands/VoicePlusTextCommand.cs | 12 +- .../ClashOfClans/ClashOfClansModule.cs | 418 ------------------ .../Conversations/Commands/RipCommand.cs | 120 ----- .../_Modules/Conversations/Conversations.cs | 224 ---------- .../CustomReactions/CustomReactions.cs | 2 +- .../Gambling/Commands/AnimalRacing.cs | 4 +- .../_Modules/Gambling/DiceRollCommand.cs | 12 +- .../_Modules/Gambling/DrawCommand.cs | 6 +- .../_Modules/Gambling/FlipCoinCommand.cs | 6 +- .../_Modules/Gambling/GamblingModule.cs | 20 +- .../_Modules/Games/Commands/BetrayGame.cs | 8 +- .../_Modules/Games/Commands/Bomberman.cs | 2 +- src/NadekoBot/_Modules/Games/Commands/Leet.cs | 2 +- .../_Modules/Games/Commands/PlantPick.cs | 16 +- .../_Modules/Games/Commands/PollCommand.cs | 2 +- .../_Modules/Games/Commands/SpeedTyping.cs | 8 +- .../_Modules/Games/Commands/TriviaCommand.cs | 10 +- src/NadekoBot/_Modules/Games/GamesModule.cs | 8 +- .../_Modules/Help/Commands/HelpCommand.cs | 6 +- src/NadekoBot/_Modules/Help/HelpModule.cs | 10 +- src/NadekoBot/_Modules/Music/MusicModule.cs | 72 +-- src/NadekoBot/_Modules/NSFW/NSFWModule.cs | 127 ------ .../Commands/FilterInvitesCommand.cs | 10 +- .../Commands/FilterWordsCommand.cs | 22 +- .../_Modules/Permissions/PermissionsModule.cs | 170 +++---- .../_Modules/Pokemon/PokemonModule.cs | 42 +- .../Searches/Commands/ConverterCommand.cs | 8 +- .../_Modules/Searches/Commands/EvalCommand.cs | 4 +- .../_Modules/Searches/Commands/LoLCommands.cs | 8 +- .../Searches/Commands/MemegenCommands.cs | 4 +- .../_Modules/Searches/Commands/OsuCommands.cs | 18 +- .../Commands/PokemonSearchCommands.cs | 8 +- .../Searches/Commands/StreamNotifications.cs | 26 +- .../_Modules/Searches/Commands/WowJokes.cs | 2 +- .../_Modules/Searches/SearchesModule.cs | 84 ++-- .../_Modules/Translator/TranslateCommand.cs | 4 +- .../Translator/ValidLanguagesCommand.cs | 4 +- src/NadekoBot/_Modules/Trello/TrelloModule.cs | 10 +- .../netcoreapp1.0/Discord.Net.Commands.dll | Bin 54784 -> 54784 bytes .../netcoreapp1.0/Discord.Net.Commands.pdb | Bin 130560 -> 130560 bytes .../bin/Debug/netcoreapp1.0/Discord.Net.dll | Bin 704000 -> 704000 bytes .../bin/Debug/netcoreapp1.0/Discord.Net.pdb | Bin 1523200 -> 1523200 bytes .../bin/Debug/netcoreapp1.0/NadekoBot.dll | Bin 181760 -> 226304 bytes .../bin/Debug/netcoreapp1.0/NadekoBot.pdb | Bin 312832 -> 374272 bytes 75 files changed, 1575 insertions(+), 2061 deletions(-) delete mode 100644 src/NadekoBot/Classes/Extensions.cs rename src/NadekoBot/{_Modules => Modules}/ClashOfClans/ClashOfClans.cs (84%) create mode 100644 src/NadekoBot/Modules/ClashOfClans/ClashOfClansModule.cs create mode 100644 src/NadekoBot/Modules/DiscordModule.cs create mode 100644 src/NadekoBot/Modules/NSFW/NSFWModule.cs rename src/NadekoBot/Resources/{Strings.Designer.cs => CommandStrings.Designer.cs} (99%) rename src/NadekoBot/Resources/{Strings.resx => CommandStrings.resx} (100%) create mode 100644 src/NadekoBot/Resources/ResponseStrings.Designer.cs create mode 100644 src/NadekoBot/Resources/ResponseStrings.resx create mode 100644 src/NadekoBot/Services/ILocalization.cs rename src/NadekoBot/{ => Services/Impl}/Localization.cs (66%) create mode 100644 src/NadekoBot/_Extensions/Extensions.cs delete mode 100644 src/NadekoBot/_Modules/ClashOfClans/ClashOfClansModule.cs delete mode 100644 src/NadekoBot/_Modules/Conversations/Commands/RipCommand.cs delete mode 100644 src/NadekoBot/_Modules/Conversations/Conversations.cs delete mode 100644 src/NadekoBot/_Modules/NSFW/NSFWModule.cs diff --git a/src/NadekoBot/Attributes/LocalizedCommand.cs b/src/NadekoBot/Attributes/LocalizedCommand.cs index 8c23932a..b145c820 100644 --- a/src/NadekoBot/Attributes/LocalizedCommand.cs +++ b/src/NadekoBot/Attributes/LocalizedCommand.cs @@ -10,7 +10,7 @@ namespace NadekoBot.Attributes { public class LocalizedCommandAttribute : CommandAttribute { - public LocalizedCommandAttribute([CallerMemberName] string memberName="") : base(Localization.LoadString(memberName.ToLowerInvariant() + "_text")) + public LocalizedCommandAttribute([CallerMemberName] string memberName="") : base(Localization.LoadCommandString(memberName.ToLowerInvariant() + "_text")) { } diff --git a/src/NadekoBot/Attributes/LocalizedDescription.cs b/src/NadekoBot/Attributes/LocalizedDescription.cs index 116efd88..65aaa802 100644 --- a/src/NadekoBot/Attributes/LocalizedDescription.cs +++ b/src/NadekoBot/Attributes/LocalizedDescription.cs @@ -10,7 +10,7 @@ namespace NadekoBot.Attributes { public class LocalizedDescriptionAttribute : DescriptionAttribute { - public LocalizedDescriptionAttribute([CallerMemberName] string memberName="") : base(Localization.LoadString(memberName.ToLowerInvariant()+"_description")) + public LocalizedDescriptionAttribute([CallerMemberName] string memberName="") : base(Localization.LoadCommandString(memberName.ToLowerInvariant()+"_description")) { } diff --git a/src/NadekoBot/Attributes/LocalizedSummary.cs b/src/NadekoBot/Attributes/LocalizedSummary.cs index d24ca42d..d2a7f10f 100644 --- a/src/NadekoBot/Attributes/LocalizedSummary.cs +++ b/src/NadekoBot/Attributes/LocalizedSummary.cs @@ -10,7 +10,7 @@ namespace NadekoBot.Attributes { public class LocalizedSummaryAttribute : SummaryAttribute { - public LocalizedSummaryAttribute([CallerMemberName] string memberName="") : base(Localization.LoadString(memberName.ToLowerInvariant() + "_summary")) + public LocalizedSummaryAttribute([CallerMemberName] string memberName="") : base(Localization.LoadCommandString(memberName.ToLowerInvariant() + "_summary")) { } diff --git a/src/NadekoBot/Classes/Extensions.cs b/src/NadekoBot/Classes/Extensions.cs deleted file mode 100644 index 098e4732..00000000 --- a/src/NadekoBot/Classes/Extensions.cs +++ /dev/null @@ -1,378 +0,0 @@ -using Discord; -using Discord.Commands; -using NadekoBot.Classes; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using System.Net; -using System.Security.Cryptography; -using System.Text; -using System.Threading.Tasks; - -namespace NadekoBot.Extensions -{ - public static class Extensions - { - private static Random rng = new Random(); - - public static string Scramble(this string word) - { - - var letters = word.ToArray(); - var count = 0; - for (var i = 0; i < letters.Length; i++) - { - if (letters[i] == ' ') - continue; - - count++; - if (count <= letters.Length / 5) - continue; - - if (count % 3 == 0) - continue; - - if (letters[i] != ' ') - letters[i] = '_'; - } - return "`" + string.Join(" ", letters) + "`"; - } - public static string TrimTo(this string str, int num, bool hideDots = false) - { - if (num < 0) - throw new ArgumentOutOfRangeException(nameof(num), "TrimTo argument cannot be less than 0"); - if (num == 0) - return string.Empty; - if (num <= 3) - return string.Concat(str.Select(c => '.')); - if (str.Length < num) - return str; - return string.Concat(str.Take(num - 3)) + (hideDots ? "" : "..."); - } - /// - /// Removes trailing S or ES (if specified) on the given string if the num is 1 - /// - /// - /// - /// - /// String with the correct singular/plural form - public static string SnPl(this string str, int? num, bool es = false) - { - if (str == null) - throw new ArgumentNullException(nameof(str)); - if (num == null) - throw new ArgumentNullException(nameof(num)); - return num == 1 ? str.Remove(str.Length - 1, es ? 2 : 1) : str; - } - - /// - /// Sends a message to the channel from which this command is called. - /// - /// EventArg - /// Message to be sent - /// - public static async Task Send(this CommandEventArgs e, string message) - => await e.Channel.SendMessage(message).ConfigureAwait(false); - - /// - /// Sends a message to the channel from which MessageEventArg came. - /// - /// EventArg - /// Message to be sent - /// - public static async Task Send(this MessageEventArgs e, string message) - { - if (string.IsNullOrWhiteSpace(message)) - return; - await e.Channel.SendMessage(message).ConfigureAwait(false); - } - - /// - /// Sends a message to this channel. - /// - /// - /// - /// - public static async Task Send(this Channel c, string message) - { - await c.SendMessage(message).ConfigureAwait(false); - } - - /// - /// Sends a private message to this user. - /// - /// - /// - /// - public static async Task Send(this User u, string message) - { - await u.SendMessage(message).ConfigureAwait(false); - } - - /// - /// Replies to a user who invoked this command, message start with that user's mention. - /// - /// - /// - /// - public static async Task Reply(this CommandEventArgs e, string message) - { - await e.Channel.SendMessage(e.User.Mention + " " + message).ConfigureAwait(false); - } - - /// - /// Replies to a user who invoked this command, message start with that user's mention. - /// - /// - /// - /// - public static async Task Reply(this MessageEventArgs e, string message) - { - await e.Channel.SendMessage(e.User.Mention + " " + message).ConfigureAwait(false); - } - - /// - /// Randomizes element order in a list - /// - /// - /// - public static IList Shuffle(this IList list) - { - - // Thanks to @Joe4Evr for finding a bug in the old version of the shuffle - var provider = new RNGCryptoServiceProvider(); - var n = list.Count; - while (n > 1) - { - var box = new byte[(n / Byte.MaxValue) + 1]; - int boxSum; - do - { - provider.GetBytes(box); - boxSum = box.Sum(b => b); - } - while (!(boxSum < n * ((Byte.MaxValue * box.Length) / n))); - var k = (boxSum % n); - n--; - var value = list[k]; - list[k] = list[n]; - list[n] = value; - } - return list; - } - - /// - /// Shortens a string URL - /// - /// - /// - /// - public static async Task ShortenUrl(this string str) - { - try - { - var result = await SearchHelper.ShortenUrl(str).ConfigureAwait(false); - return result; - } - catch (WebException ex) - { - throw new InvalidOperationException("You must enable URL shortner in google developers console.", ex); - } - } - - public static string GetOnPage(this IEnumerable source, int pageIndex, int itemsPerPage = 5) - { - var items = source.Skip(pageIndex * itemsPerPage).Take(itemsPerPage); - if (!items.Any()) - { - return $"No items on page {pageIndex + 1}."; - } - var sb = new StringBuilder($"---page {pageIndex + 1} --\n"); - var itemsDC = items as IEnumerable>>; - var itemsDS = items as IEnumerable>; - if (itemsDC != null) - { - foreach (var item in itemsDC) - { - sb.Append($"{ Format.Code(item.Key)}\n"); - int i = 1; - var last = item.Value.Last(); - foreach (var value in item.Value) - { - if (last != value) - sb.AppendLine(" `├" + i++ + "─`" + Format.Bold(value)); - else - sb.AppendLine(" `└" + i++ + "─`" + Format.Bold(value)); - } - - } - } - else if (itemsDS != null) - { - foreach (var item in itemsDS) - { - sb.Append($"{ Format.Code(item.Key)}\n"); - sb.AppendLine(" `└─`" + Format.Bold(item.Value)); - } - - } - else - { - foreach (var item in items) - { - sb.Append($"{ Format.Code(item.ToString())} \n"); - } - } - - return sb.ToString(); - } - /// - /// Gets the program runtime - /// - /// - /// - /// - public static string GetRuntime(this DiscordClient c) => ".Net Framework 4.5.2"; - - public static string Matrix(this string s) - => - string.Concat(s.Select(c => c.ToString() + " ̵̢̬̜͉̞̭̖̰͋̉̎ͬ̔̇̌̀".TrimTo(rng.Next(0, 12), true))); - //.Replace("`", ""); - - public static void ForEach(this IEnumerable source, Action action) - { - foreach (var element in source) - { - action(element); - } - } - - //http://www.dotnetperls.com/levenshtein - public static int LevenshteinDistance(this string s, string t) - { - var n = s.Length; - var m = t.Length; - var d = new int[n + 1, m + 1]; - - // Step 1 - if (n == 0) - { - return m; - } - - if (m == 0) - { - return n; - } - - // Step 2 - for (var i = 0; i <= n; d[i, 0] = i++) - { - } - - for (var j = 0; j <= m; d[0, j] = j++) - { - } - - // Step 3 - for (var i = 1; i <= n; i++) - { - //Step 4 - for (var j = 1; j <= m; j++) - { - // Step 5 - var cost = (t[j - 1] == s[i - 1]) ? 0 : 1; - - // Step 6 - d[i, j] = Math.Min( - Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), - d[i - 1, j - 1] + cost); - } - } - // Step 7 - return d[n, m]; - } - - public static int KiB(this int value) => value * 1024; - public static int KB(this int value) => value * 1000; - - public static int MiB(this int value) => value.KiB() * 1024; - public static int MB(this int value) => value.KB() * 1000; - - public static int GiB(this int value) => value.MiB() * 1024; - public static int GB(this int value) => value.MB() * 1000; - - public static ulong KiB(this ulong value) => value * 1024; - public static ulong KB(this ulong value) => value * 1000; - - public static ulong MiB(this ulong value) => value.KiB() * 1024; - public static ulong MB(this ulong value) => value.KB() * 1000; - - public static ulong GiB(this ulong value) => value.MiB() * 1024; - public static ulong GB(this ulong value) => value.MB() * 1000; - - public static Stream ToStream(this Image img, System.Drawing.Imaging.ImageFormat format = null) - { - if (format == null) - format = System.Drawing.Imaging.ImageFormat.Jpeg; - var stream = new MemoryStream(); - img.Save(stream, format); - stream.Position = 0; - return stream; - } - - /// - /// Merges Images into 1 Image and returns a bitmap. - /// - /// The Images you want to merge. - /// Merged bitmap - public static Bitmap Merge(this IEnumerable images, int reverseScaleFactor = 1) - { - var imageArray = images as Image[] ?? images.ToArray(); - if (!imageArray.Any()) return null; - var width = imageArray.Sum(i => i.Width); - var height = imageArray.First().Height; - var bitmap = new Bitmap(width / reverseScaleFactor, height / reverseScaleFactor); - var r = new Random(); - var offsetx = 0; - foreach (var img in imageArray) - { - var bm = new Bitmap(img); - for (var w = 0; w < img.Width; w++) - { - for (var h = 0; h < bitmap.Height; h++) - { - bitmap.SetPixel(w / reverseScaleFactor + offsetx, h, bm.GetPixel(w, h * reverseScaleFactor)); - } - } - offsetx += img.Width / reverseScaleFactor; - } - return bitmap; - } - - /// - /// Merges Images into 1 Image and returns a bitmap asynchronously. - /// - /// The Images you want to merge. - /// - /// Merged bitmap - public static async Task MergeAsync(this IEnumerable images, int reverseScaleFactor = 1) => - await Task.Run(() => images.Merge(reverseScaleFactor)).ConfigureAwait(false); - - public static string Unmention(this string str) => str.Replace("@", "ම"); - - public static Stream ToStream(this string str) - { - var sw = new StreamWriter(new MemoryStream()); - sw.Write(str); - sw.Flush(); - sw.BaseStream.Position = 0; - return sw.BaseStream; - } - - public static double UnixTimestamp(this DateTime dt) => dt.ToUniversalTime().Subtract(new DateTime(1970, 1, 1)).TotalSeconds; - - } -} diff --git a/src/NadekoBot/Classes/SearchHelper.cs b/src/NadekoBot/Classes/SearchHelper.cs index a0a59e9b..3b30a205 100644 --- a/src/NadekoBot/Classes/SearchHelper.cs +++ b/src/NadekoBot/Classes/SearchHelper.cs @@ -251,91 +251,7 @@ namespace NadekoBot.Classes } - public static async Task GetDanbooruImageLink(string tag) - { - var rng = new Random(); - - if (tag == "loli") //loli doesn't work for some reason atm - tag = "flat_chest"; - - var link = $"http://danbooru.donmai.us/posts?" + - $"page={rng.Next(0, 15)}"; - if (!string.IsNullOrWhiteSpace(tag)) - link += $"&tags={tag.Replace(" ", "_")}"; - - var webpage = await GetResponseStringAsync(link).ConfigureAwait(false); - var matches = Regex.Matches(webpage, "data-large-file-url=\"(?.*?)\""); - - if (matches.Count == 0) - return null; - return $"http://danbooru.donmai.us" + - $"{matches[rng.Next(0, matches.Count)].Groups["id"].Value}"; - } - - public static async Task GetGelbooruImageLink(string tag) - { - var headers = new Dictionary() { - {"User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1"}, - {"Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" }, - }; - var url = - $"http://gelbooru.com/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}"; - var webpage = await GetResponseStringAsync(url, headers).ConfigureAwait(false); - var matches = Regex.Matches(webpage, "file_url=\"(?.*?)\""); - if (matches.Count == 0) - return null; - var rng = new Random(); - var match = matches[rng.Next(0, matches.Count)]; - return matches[rng.Next(0, matches.Count)].Groups["url"].Value; - } - - public static async Task GetSafebooruImageLink(string tag) - { - var rng = new Random(); - var url = - $"http://safebooru.org/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}"; - var webpage = await GetResponseStringAsync(url).ConfigureAwait(false); - var matches = Regex.Matches(webpage, "file_url=\"(?.*?)\""); - if (matches.Count == 0) - return null; - var match = matches[rng.Next(0, matches.Count)]; - return matches[rng.Next(0, matches.Count)].Groups["url"].Value; - } - - public static async Task GetRule34ImageLink(string tag) - { - var rng = new Random(); - var url = - $"http://rule34.xxx/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}"; - var webpage = await GetResponseStringAsync(url).ConfigureAwait(false); - var matches = Regex.Matches(webpage, "file_url=\"(?.*?)\""); - if (matches.Count == 0) - return null; - var match = matches[rng.Next(0, matches.Count)]; - return "http:" + matches[rng.Next(0, matches.Count)].Groups["url"].Value; - } - - - internal static async Task GetE621ImageLink(string tags) - { - try - { - var headers = new Dictionary() { - {"User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1"}, - {"Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" }, - }; - var data = await GetResponseStreamAsync( - "http://e621.net/post/index.xml?tags=" + Uri.EscapeUriString(tags) + "%20order:random&limit=1", - headers); - var doc = XDocument.Load(data); - return doc.Descendants("file_url").FirstOrDefault().Value; - } - catch (Exception ex) - { - Console.WriteLine("Error in e621 search: \n" + ex); - return "Error, do you have too many tags?"; - } - } + public static async Task ShortenUrl(string url) { diff --git a/src/NadekoBot/_Modules/ClashOfClans/ClashOfClans.cs b/src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs similarity index 84% rename from src/NadekoBot/_Modules/ClashOfClans/ClashOfClans.cs rename to src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs index 1ae491ad..f6949ca8 100644 --- a/src/NadekoBot/_Modules/ClashOfClans/ClashOfClans.cs +++ b/src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json; +using Discord; +using Newtonsoft.Json; using System; using System.Linq; using System.Text; @@ -14,7 +15,7 @@ namespace NadekoBot.Classes.ClashOfClans { Started, Ended, Created } - [System.Serializable] + internal class Caller { public string CallUser { get; set; } @@ -62,7 +63,7 @@ namespace NadekoBot.Classes.ClashOfClans public ulong ChannelId { get; set; } [JsonIgnore] - public Discord.Channel Channel { get; internal set; } + public ITextChannel Channel { get; internal set; } /// /// This init is purely for the deserialization @@ -76,7 +77,15 @@ namespace NadekoBot.Classes.ClashOfClans this.Bases = new Caller[size]; this.ServerId = serverId; this.ChannelId = channelId; - this.Channel = NadekoBot.Client.Servers.FirstOrDefault(s => s.Id == serverId)?.TextChannels.FirstOrDefault(c => c.Id == channelId); + this.Channel = NadekoBot.Client.GetGuildsAsync() //nice api you got here volt, + .GetAwaiter() //especially like how getguildsasync isn't async at all internally. + .GetResult() //But hey, lib has to be async kek + .FirstOrDefault(s => s.Id == serverId)? // srsly + .GetChannelsAsync() //wtf is this + .GetAwaiter() // oh i know, its the implementation detail + .GetResult() // and makes library look consistent + .FirstOrDefault(c => c.Id == channelId) // its not common sense to make library work like this. + as ITextChannel; // oh and don't forget to cast it to this arbitrary bullshit } internal void End() diff --git a/src/NadekoBot/Modules/ClashOfClans/ClashOfClansModule.cs b/src/NadekoBot/Modules/ClashOfClans/ClashOfClansModule.cs new file mode 100644 index 00000000..2ea71a2d --- /dev/null +++ b/src/NadekoBot/Modules/ClashOfClans/ClashOfClansModule.cs @@ -0,0 +1,289 @@ +using Discord.Commands; +using NadekoBot.Classes.ClashOfClans; +using Newtonsoft.Json; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Discord; +using NadekoBot.Services; +using NadekoBot.Attributes; + +namespace NadekoBot.Modules.ClashOfClans +{ + [Module(",",AppendSpace = false)] + internal class ClashOfClansModule : DiscordModule + { + public static ConcurrentDictionary> ClashWars { get; set; } = new ConcurrentDictionary>(); + + private readonly object writeLock = new object(); + + public ClashOfClansModule(ILocalization loc, CommandService cmds, IBotConfiguration config, IDiscordClient client) : base(loc, cmds, config, client) + { + } + + private static async Task CheckWar(TimeSpan callExpire, ClashWar war) + { + var Bases = war.Bases; + for (var i = 0; i < Bases.Length; i++) + { + if (Bases[i] == null) continue; + if (!Bases[i].BaseDestroyed && DateTime.UtcNow - Bases[i].TimeAdded >= callExpire) + { + await war.Channel.SendMessageAsync($"❗🔰**Claim from @{Bases[i].CallUser} for a war against {war.ShortPrint()} has expired.**").ConfigureAwait(false); + Bases[i] = null; + } + } + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task CreateWar(IMessage imsg, int size, [Remainder] string enemyClan) + { + var channel = imsg.Channel as IGuildChannel; + + if (!(imsg.Author as IGuildUser).GuildPermissions.ManageChannels) + return; + + if (string.IsNullOrWhiteSpace(enemyClan)) + return; + + if (size < 10 || size > 50 || size % 5 != 0) + { + await imsg.Channel.SendMessageAsync("💢🔰 Not a Valid war size").ConfigureAwait(false); + return; + } + List wars; + if (!ClashWars.TryGetValue(channel.Guild.Id, out wars)) + { + wars = new List(); + if (!ClashWars.TryAdd(channel.Guild.Id, wars)) + return; + } + + + var cw = new ClashWar(enemyClan, size, channel.Guild.Id, imsg.Channel.Id); + //cw.Start(); + + wars.Add(cw); + await imsg.Channel.SendMessageAsync($"❗🔰**CREATED CLAN WAR AGAINST {cw.ShortPrint()}**").ConfigureAwait(false); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task StartWar(IMessage imsg, [Remainder] string number) + { + var channel = imsg.Channel as IGuildChannel; + + int num = 0; + int.TryParse(number, out num); + + var warsInfo = GetWarInfo(imsg, num); + if (warsInfo == null) + { + await imsg.Channel.SendMessageAsync("💢🔰 **That war does not exist.**").ConfigureAwait(false); + return; + } + var war = warsInfo.Item1[warsInfo.Item2]; + try + { + war.Start(); + await imsg.Channel.SendMessageAsync($"🔰**STARTED WAR AGAINST {war.ShortPrint()}**").ConfigureAwait(false); + } + catch + { + await imsg.Channel.SendMessageAsync($"🔰**WAR AGAINST {war.ShortPrint()} HAS ALREADY STARTED**").ConfigureAwait(false); + } + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task ListWar(IMessage imsg, [Remainder] string number) + { + var channel = imsg.Channel as IGuildChannel; + + // if number is null, print all wars in a short way + if (string.IsNullOrWhiteSpace(number)) + { + //check if there are any wars + List wars = null; + ClashWars.TryGetValue(channel.Guild.Id, out wars); + if (wars == null || wars.Count == 0) + { + await imsg.Channel.SendMessageAsync("🔰 **No active wars.**").ConfigureAwait(false); + return; + } + + var sb = new StringBuilder(); + sb.AppendLine("🔰 **LIST OF ACTIVE WARS**"); + sb.AppendLine("**-------------------------**"); + for (var i = 0; i < wars.Count; i++) + { + sb.AppendLine($"**#{i + 1}.** `Enemy:` **{wars[i].EnemyClan}**"); + sb.AppendLine($"\t\t`Size:` **{wars[i].Size} v {wars[i].Size}**"); + sb.AppendLine("**-------------------------**"); + } + await imsg.Channel.SendMessageAsync(sb.ToString()).ConfigureAwait(false); + return; + + } + var num = 0; + int.TryParse(number, out num); + //if number is not null, print the war needed + var warsInfo = GetWarInfo(imsg, num); + if (warsInfo == null) + { + await imsg.Channel.SendMessageAsync("💢🔰 **That war does not exist.**").ConfigureAwait(false); + return; + } + await imsg.Channel.SendMessageAsync(warsInfo.Item1[warsInfo.Item2].ToString()).ConfigureAwait(false); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task Claim(IMessage imsg, int number, int baseNumber, [Remainder] string other_name) + { + var channel = imsg.Channel as IGuildChannel; + var warsInfo = GetWarInfo(imsg, number); + if (warsInfo == null || warsInfo.Item1.Count == 0) + { + await imsg.Channel.SendMessageAsync("💢🔰 **That war does not exist.**").ConfigureAwait(false); + return; + } + var usr = + string.IsNullOrWhiteSpace(other_name) ? + imsg.Author.Username : + other_name; + try + { + var war = warsInfo.Item1[warsInfo.Item2]; + war.Call(usr, baseNumber - 1); + await imsg.Channel.SendMessageAsync($"🔰**{usr}** claimed a base #{baseNumber} for a war against {war.ShortPrint()}").ConfigureAwait(false); + } + catch (Exception ex) + { + await imsg.Channel.SendMessageAsync($"💢🔰 {ex.Message}").ConfigureAwait(false); + } + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task ClaimFinish1(IMessage imsg, int number, int baseNumber, [Remainder] string other_name) + { + var channel = imsg.Channel as IGuildChannel; + await FinishClaim(imsg, number, baseNumber, other_name, 1); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task ClaimFinish2(IMessage imsg, int number, int baseNumber, [Remainder] string other_name) + { + var channel = imsg.Channel as IGuildChannel; + await FinishClaim(imsg, number, baseNumber, other_name, 2); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task ClaimFinish(IMessage imsg, int number, int baseNumber, [Remainder] string other_name) + { + var channel = imsg.Channel as IGuildChannel; + await FinishClaim(imsg, number, baseNumber, other_name); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task EndWar(IMessage imsg, int number) + { + var channel = imsg.Channel as IGuildChannel; + + var warsInfo = GetWarInfo(imsg,number); + if (warsInfo == null) + { + await imsg.Channel.SendMessageAsync("💢🔰 That war does not exist.").ConfigureAwait(false); + return; + } + warsInfo.Item1[warsInfo.Item2].End(); + await imsg.Channel.SendMessageAsync($"❗🔰**War against {warsInfo.Item1[warsInfo.Item2].ShortPrint()} ended.**").ConfigureAwait(false); + + var size = warsInfo.Item1[warsInfo.Item2].Size; + warsInfo.Item1.RemoveAt(warsInfo.Item2); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task Unclaim(IMessage imsg, int number, [Remainder] string otherName) + { + var channel = imsg.Channel as IGuildChannel; + + var warsInfo = GetWarInfo(imsg, number); + if (warsInfo == null || warsInfo.Item1.Count == 0) + { + await imsg.Channel.SendMessageAsync("💢🔰 **That war does not exist.**").ConfigureAwait(false); + return; + } + var usr = + string.IsNullOrWhiteSpace(otherName) ? + imsg.Author.Username : + otherName; + try + { + var war = warsInfo.Item1[warsInfo.Item2]; + var baseNumber = war.Uncall(usr); + await imsg.Channel.SendMessageAsync($"🔰 @{usr} has **UNCLAIMED** a base #{baseNumber + 1} from a war against {war.ShortPrint()}").ConfigureAwait(false); + } + catch (Exception ex) + { + await imsg.Channel.SendMessageAsync($"💢🔰 {ex.Message}").ConfigureAwait(false); + } + } + + private async Task FinishClaim(IMessage imsg, int number, int baseNumber, [Remainder] string other_name, int stars = 3) + { + var channel = imsg.Channel as IGuildChannel; + var warInfo = GetWarInfo(imsg, number); + if (warInfo == null || warInfo.Item1.Count == 0) + { + await imsg.Channel.SendMessageAsync("💢🔰 **That war does not exist.**").ConfigureAwait(false); + return; + } + var usr = + string.IsNullOrWhiteSpace(other_name) ? + imsg.Author.Username : + other_name; + + var war = warInfo.Item1[warInfo.Item2]; + try + { + var baseNum = war.FinishClaim(usr, stars); + await imsg.Channel.SendMessageAsync($"❗🔰{imsg.Author.Mention} **DESTROYED** a base #{baseNum + 1} in a war against {war.ShortPrint()}").ConfigureAwait(false); + } + catch (Exception ex) + { + await imsg.Channel.SendMessageAsync($"💢🔰 {ex.Message}").ConfigureAwait(false); + } + } + + private static Tuple, int> GetWarInfo(IMessage imsg, int num) + { + var channel = imsg.Channel as IGuildChannel; + //check if there are any wars + List wars = null; + ClashWars.TryGetValue(channel.Guild.Id, out wars); + if (wars == null || wars.Count == 0) + { + return null; + } + // get the number of the war + else if (num < 1 || num > wars.Count) + { + return null; + } + num -= 1; + //get the actual war + return new Tuple, int>(wars, num); + } + } +} diff --git a/src/NadekoBot/Modules/DiscordModule.cs b/src/NadekoBot/Modules/DiscordModule.cs new file mode 100644 index 00000000..aeac5d11 --- /dev/null +++ b/src/NadekoBot/Modules/DiscordModule.cs @@ -0,0 +1,26 @@ +using Discord; +using Discord.Commands; +using NadekoBot.Services; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace NadekoBot.Modules +{ + public class DiscordModule + { + protected ILocalization _l; + protected CommandService _commands; + protected IBotConfiguration _config; + protected IDiscordClient _client; + + public DiscordModule(ILocalization loc, CommandService cmds, IBotConfiguration config,IDiscordClient client) + { + _l = loc; + _commands = cmds; + _config = config; + _client = client; + } + } +} diff --git a/src/NadekoBot/Modules/NSFW/NSFWModule.cs b/src/NadekoBot/Modules/NSFW/NSFWModule.cs new file mode 100644 index 00000000..46234cc4 --- /dev/null +++ b/src/NadekoBot/Modules/NSFW/NSFWModule.cs @@ -0,0 +1,237 @@ +using Discord; +using Discord.Commands; +using NadekoBot.Attributes; +using Newtonsoft.Json.Linq; +using System; +using System.Linq; +using System.Threading.Tasks; +using NadekoBot.Services; +using System.Net.Http; +using System.Text.RegularExpressions; + +namespace NadekoBot.Modules.NSFW +{ + [Module("~", AppendSpace = false)] + public class NSFWModule : DiscordModule + { + + private readonly Random rng = new Random(); + + public NSFWModule(ILocalization loc, CommandService cmds, IBotConfiguration config, IDiscordClient client) : base(loc, cmds, config, client) + { + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task Hentai(IMessage imsg, [Remainder] string tag) + { + var channel = imsg.Channel as IGuildChannel; + + tag = tag?.Trim() ?? ""; + + var links = await Task.WhenAll(GetGelbooruImageLink("rating%3Aexplicit+" + tag), GetDanbooruImageLink("rating%3Aexplicit+" + tag)).ConfigureAwait(false); + + if (links.All(l => l == null)) + { + await imsg.Channel.SendMessageAsync("`No results.`"); + return; + } + + await imsg.Channel.SendMessageAsync(String.Join("\n\n", links)).ConfigureAwait(false); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task Danbooru(IMessage imsg, [Remainder] string tag) + { + var channel = imsg.Channel as IGuildChannel; + + tag = tag?.Trim() ?? ""; + var link = await GetDanbooruImageLink(tag).ConfigureAwait(false); + if (string.IsNullOrWhiteSpace(link)) + await imsg.Channel.SendMessageAsync("Search yielded no results ;("); + else + await imsg.Channel.SendMessageAsync(link).ConfigureAwait(false); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task Gelbooru(IMessage imsg, [Remainder] string tag) + { + var channel = imsg.Channel as IGuildChannel; + + tag = tag?.Trim() ?? ""; + var link = await GetRule34ImageLink(tag).ConfigureAwait(false); + if (string.IsNullOrWhiteSpace(link)) + await imsg.Channel.SendMessageAsync("Search yielded no results ;("); + else + await imsg.Channel.SendMessageAsync(link).ConfigureAwait(false); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task Rule34(IMessage imsg, [Remainder] string tag) + { + var channel = imsg.Channel as IGuildChannel; + + tag = tag?.Trim() ?? ""; + var link = await GetGelbooruImageLink(tag).ConfigureAwait(false); + if (string.IsNullOrWhiteSpace(link)) + await imsg.Channel.SendMessageAsync("Search yielded no results ;("); + else + await imsg.Channel.SendMessageAsync(link).ConfigureAwait(false); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task E621(IMessage imsg, [Remainder] string tag) + { + var channel = imsg.Channel as IGuildChannel; + + tag = tag?.Trim() ?? ""; + var link = await GetE621ImageLink(tag).ConfigureAwait(false); + if (string.IsNullOrWhiteSpace(link)) + await imsg.Channel.SendMessageAsync("Search yielded no results ;("); + else + await imsg.Channel.SendMessageAsync(link).ConfigureAwait(false); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task Cp(IMessage imsg) + { + var channel = imsg.Channel as IGuildChannel; + + await imsg.Channel.SendMessageAsync("http://i.imgur.com/MZkY1md.jpg").ConfigureAwait(false); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task Boobs(IMessage imsg) + { + var channel = imsg.Channel as IGuildChannel; + try + { + JToken obj; + using (var http = new HttpClient()) + { + obj = JArray.Parse(await http.GetStringAsync($"http://api.oboobs.ru/boobs/{rng.Next(0, 9380)}").ConfigureAwait(false))[0]; + } + await imsg.Channel.SendMessageAsync($"http://media.oboobs.ru/{ obj["preview"].ToString() }").ConfigureAwait(false); + } + catch (Exception ex) + { + await imsg.Channel.SendMessageAsync($"💢 {ex.Message}").ConfigureAwait(false); + } + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task Butts(IMessage imsg) + { + var channel = imsg.Channel as IGuildChannel; + + try + { + JToken obj; + using (var http = new HttpClient()) + { + obj = JArray.Parse(await http.GetStringAsync($"http://api.obutts.ru/butts/{rng.Next(0, 3373)}").ConfigureAwait(false))[0]; + } + await imsg.Channel.SendMessageAsync($"http://media.obutts.ru/{ obj["preview"].ToString() }").ConfigureAwait(false); + } + catch (Exception ex) + { + await imsg.Channel.SendMessageAsync($"💢 {ex.Message}").ConfigureAwait(false); + } + } + + public static async Task GetDanbooruImageLink(string tag) + { + var rng = new Random(); + + if (tag == "loli") //loli doesn't work for some reason atm + tag = "flat_chest"; + + var link = $"http://danbooru.donmai.us/posts?" + + $"page={rng.Next(0, 15)}"; + if (!string.IsNullOrWhiteSpace(tag)) + link += $"&tags={tag.Replace(" ", "_")}"; + using (var http = new HttpClient()) + { + var webpage = await http.GetStringAsync(link).ConfigureAwait(false); + var matches = Regex.Matches(webpage, "data-large-file-url=\"(?.*?)\""); + + if (matches.Count == 0) + return null; + return $"http://danbooru.donmai.us" + + $"{matches[rng.Next(0, matches.Count)].Groups["id"].Value}"; + } + } + + public static async Task GetGelbooruImageLink(string tag) + { + var headers = new Dictionary() { + {"User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1"}, + {"Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" }, + }; + var url = + $"http://gelbooru.com/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}"; + var webpage = await GetResponseStringAsync(url, headers).ConfigureAwait(false); + var matches = Regex.Matches(webpage, "file_url=\"(?.*?)\""); + if (matches.Count == 0) + return null; + var rng = new Random(); + var match = matches[rng.Next(0, matches.Count)]; + return matches[rng.Next(0, matches.Count)].Groups["url"].Value; + } + + public static async Task GetSafebooruImageLink(string tag) + { + var rng = new Random(); + var url = + $"http://safebooru.org/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}"; + var webpage = await GetResponseStringAsync(url).ConfigureAwait(false); + var matches = Regex.Matches(webpage, "file_url=\"(?.*?)\""); + if (matches.Count == 0) + return null; + var match = matches[rng.Next(0, matches.Count)]; + return matches[rng.Next(0, matches.Count)].Groups["url"].Value; + } + + public static async Task GetRule34ImageLink(string tag) + { + var rng = new Random(); + var url = + $"http://rule34.xxx/index.php?page=dapi&s=post&q=index&limit=100&tags={tag.Replace(" ", "_")}"; + var webpage = await GetResponseStringAsync(url).ConfigureAwait(false); + var matches = Regex.Matches(webpage, "file_url=\"(?.*?)\""); + if (matches.Count == 0) + return null; + var match = matches[rng.Next(0, matches.Count)]; + return "http:" + matches[rng.Next(0, matches.Count)].Groups["url"].Value; + } + + + internal static async Task GetE621ImageLink(string tags) + { + try + { + var headers = new Dictionary() { + {"User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1"}, + {"Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" }, + }; + var data = await GetResponseStreamAsync( + "http://e621.net/post/index.xml?tags=" + Uri.EscapeUriString(tags) + "%20order:random&limit=1", + headers); + var doc = XDocument.Load(data); + return doc.Descendants("file_url").FirstOrDefault().Value; + } + catch (Exception ex) + { + Console.WriteLine("Error in e621 search: \n" + ex); + return "Error, do you have too many tags?"; + } + } + } +} diff --git a/src/NadekoBot/Modules/Utility/Commands/InfoCommands.cs b/src/NadekoBot/Modules/Utility/Commands/InfoCommands.cs index d196bc9d..1c242b45 100644 --- a/src/NadekoBot/Modules/Utility/Commands/InfoCommands.cs +++ b/src/NadekoBot/Modules/Utility/Commands/InfoCommands.cs @@ -1,99 +1,86 @@ -//using Discord; -//using Discord.Commands; -//using NadekoBot.Classes; -//using NadekoBot.Extensions; -//using System; -//using System.Linq; -//using System.Text; +using Discord; +using Discord.Commands; +using NadekoBot.Attributes; +using NadekoBot.Extensions; +using System; +using System.Linq; +using System.Text; +using System.Threading.Tasks; -//namespace NadekoBot.Modules.Utility.Commands -//{ -// class InfoCommands : DiscordCommand -// { -// public InfoCommands(DiscordModule module) : base(module) -// { -// } +namespace NadekoBot.Modules.Utility +{ + partial class UtilityModule : DiscordModule + { + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task ServerInfo(IMessage msg, string guild = null) + { + var channel = msg.Channel as IGuildChannel; + guild = guild?.ToUpperInvariant(); + IGuild server; + if (guild == null) + server = channel.Guild; + else + server = (await _client.GetGuildsAsync()).Where(g => g.Name.ToUpperInvariant() == guild.ToUpperInvariant()).FirstOrDefault(); + if (server == null) + return; -// internal override void Init(CommandGroupBuilder cgb) -// { -// cgb.CreateCommand(Module.Prefix + "serverinfo") -// .Alias(Module.Prefix + "sinfo") -// .Description($"Shows info about the server the bot is on. If no channel is supplied, it defaults to current one. |`{Module.Prefix}sinfo Some Server`") -// .Parameter("server", ParameterType.Optional) -// .Do(async e => -// { -// var servText = e.GetArg("server")?.Trim(); -// var server = string.IsNullOrWhiteSpace(servText) -// ? e.Server -// : NadekoBot.Client.FindServers(servText).FirstOrDefault(); -// if (server == null) -// return; -// var createdAt = new DateTime(2015, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(server.Id >> 22); -// var sb = new StringBuilder(); -// sb.AppendLine($"`Name:` **#{server.Name}**"); -// sb.AppendLine($"`Owner:` **{server.Owner}**"); -// sb.AppendLine($"`Id:` **{server.Id}**"); -// sb.AppendLine($"`Icon Url:` **{await server.IconUrl.ShortenUrl().ConfigureAwait(false)}**"); -// sb.AppendLine($"`TextChannels:` **{server.TextChannels.Count()}** `VoiceChannels:` **{server.VoiceChannels.Count()}**"); -// sb.AppendLine($"`Members:` **{server.UserCount}** `Online:` **{server.Users.Count(u => u.Status == UserStatus.Online)}** (may be incorrect)"); -// sb.AppendLine($"`Roles:` **{server.Roles.Count()}**"); -// sb.AppendLine($"`Created At:` **{createdAt}**"); -// if (server.CustomEmojis.Count() > 0) -// sb.AppendLine($"`Custom Emojis:` **{string.Join(", ", server.CustomEmojis)}**"); -// if (server.Features.Count() > 0) -// sb.AppendLine($"`Features:` **{string.Join(", ", server.Features)}**"); -// if (!string.IsNullOrWhiteSpace(server.SplashId)) -// sb.AppendLine($"`Region:` **{server.Region.Name}**"); -// await e.Channel.SendMessage(sb.ToString()).ConfigureAwait(false); -// }); + var createdAt = new DateTime(2015, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(server.Id >> 22); + var sb = new StringBuilder(); + var users = await server.GetUsersAsync(); + sb.AppendLine($@"`Name:` **{server.Name}** +`Owner:` **{await server.GetUserAsync(server.OwnerId)}** +`Id:` **{server.Id}** +`Icon Url:` **{ server.IconUrl}** +`TextChannels:` **{(await server.GetTextChannelsAsync()).Count()}** `VoiceChannels:` **{(await server.GetVoiceChannelsAsync()).Count()}** +`Members:` **{users.Count}** `Online:` **{users.Count(u => u.Status == UserStatus.Online)}** +`Roles:` **{server.Roles.Count()}** +`Created At:` **{createdAt}**"); + if (server.Emojis.Count() > 0) + sb.AppendLine($"`Custom Emojis:` **{string.Join(", ", server.Emojis)}**"); + if (server.Features.Count() > 0) + sb.AppendLine($"`Features:` **{string.Join(", ", server.Features)}**"); + if (!string.IsNullOrWhiteSpace(server.SplashUrl)) + sb.AppendLine($"`Region:` **{server.VoiceRegionId}**"); + await msg.Reply(sb.ToString()).ConfigureAwait(false); + } -// cgb.CreateCommand(Module.Prefix + "channelinfo") -// .Alias(Module.Prefix + "cinfo") -// .Description($"Shows info about the channel. If no channel is supplied, it defaults to current one. |`{Module.Prefix}cinfo #some-channel`") -// .Parameter("channel", ParameterType.Optional) -// .Do(async e => -// { -// var chText = e.GetArg("channel")?.Trim(); -// var ch = string.IsNullOrWhiteSpace(chText) -// ? e.Channel -// : e.Server.FindChannels(chText, Discord.ChannelType.Text).FirstOrDefault(); -// if (ch == null) -// return; -// var createdAt = new DateTime(2015, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(ch.Id >> 22); -// var sb = new StringBuilder(); -// sb.AppendLine($"`Name:` **#{ch.Name}**"); -// sb.AppendLine($"`Id:` **{ch.Id}**"); -// sb.AppendLine($"`Created At:` **{createdAt}**"); -// sb.AppendLine($"`Topic:` **{ch.Topic}**"); -// sb.AppendLine($"`Users:` **{ch.Users.Count()}**"); -// await e.Channel.SendMessage(sb.ToString()).ConfigureAwait(false); -// }); + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task ChannelInfo(IMessage msg, ITextChannel channel = null) + { + var ch = channel ?? msg.Channel as ITextChannel; + if (ch == null) + return; + var createdAt = new DateTime(2015, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(ch.Id >> 22); + var sb = new StringBuilder(); + sb.AppendLine($"`Name:` **#{ch.Name}**"); + sb.AppendLine($"`Id:` **{ch.Id}**"); + sb.AppendLine($"`Created At:` **{createdAt}**"); + sb.AppendLine($"`Topic:` **{ch.Topic}**"); + sb.AppendLine($"`Users:` **{(await ch.GetUsersAsync()).Count()}**"); + await msg.Reply(sb.ToString()).ConfigureAwait(false); + } -// cgb.CreateCommand(Module.Prefix + "userinfo") -// .Alias(Module.Prefix + "uinfo") -// .Description($"Shows info about the user. If no user is supplied, it defaults a user running the command. |`{Module.Prefix}uinfo @SomeUser`") -// .Parameter("user", ParameterType.Optional) -// .Do(async e => -// { -// var userText = e.GetArg("user")?.Trim(); -// var user = string.IsNullOrWhiteSpace(userText) -// ? e.User -// : e.Server.FindUsers(userText).FirstOrDefault(); -// if (user == null) -// return; -// var sb = new StringBuilder(); -// sb.AppendLine($"`Name#Discrim:` **#{user.Name}#{user.Discriminator}**"); -// if (!string.IsNullOrWhiteSpace(user.Nickname)) -// sb.AppendLine($"`Nickname:` **{user.Nickname}**"); -// sb.AppendLine($"`Id:` **{user.Id}**"); -// sb.AppendLine($"`Current Game:` **{(user.CurrentGame?.Name == null ? "-" : user.CurrentGame.Value.Name)}**"); -// if (user.LastOnlineAt != null) -// sb.AppendLine($"`Last Online:` **{user.LastOnlineAt:HH:mm:ss}**"); -// sb.AppendLine($"`Joined At:` **{user.JoinedAt}**"); -// sb.AppendLine($"`Roles:` **({user.Roles.Count()}) - {string.Join(", ", user.Roles.Select(r => r.Name))}**"); -// sb.AppendLine($"`AvatarUrl:` **{await user.AvatarUrl.ShortenUrl().ConfigureAwait(false)}**"); -// await e.Channel.SendMessage(sb.ToString()).ConfigureAwait(false); -// }); -// } -// } -//} + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task UserInfo(IMessage msg, IGuildUser usr = null) + { + var channel = msg.Channel as IGuildChannel; + var user = usr ?? msg.Author as IGuildUser; + if (user == null) + return; + var sb = new StringBuilder(); + sb.AppendLine($"`Name#Discrim:` **#{user.Username}#{user.Discriminator}**"); + if (!string.IsNullOrWhiteSpace(user.Nickname)) + sb.AppendLine($"`Nickname:` **{user.Nickname}**"); + sb.AppendLine($"`Id:` **{user.Id}**"); + sb.AppendLine($"`Current Game:` **{(user.Game?.Name == null ? "-" : user.Game.Name)}**"); + sb.AppendLine($"`Joined At:` **{user.JoinedAt}**"); + sb.AppendLine($"`Roles:` **({user.Roles.Count()}) - {string.Join(", ", user.Roles.Select(r => r.Name))}**"); + sb.AppendLine($"`AvatarUrl:` **{user.AvatarUrl}**"); + await msg.Reply(sb.ToString()).ConfigureAwait(false); + } + + } +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Utility/Commands/Remind.cs b/src/NadekoBot/Modules/Utility/Commands/Remind.cs index 818ce080..4f4bea7f 100644 --- a/src/NadekoBot/Modules/Utility/Commands/Remind.cs +++ b/src/NadekoBot/Modules/Utility/Commands/Remind.cs @@ -113,7 +113,7 @@ // if (ch == null) // { -// await e.Channel.SendMessage($"{e.User.Mention} Something went wrong (channel cannot be found) ;(").ConfigureAwait(false); +// await channel.SendMessageAsync($"{e.User.Mention} Something went wrong (channel cannot be found) ;(").ConfigureAwait(false); // return; // } @@ -123,7 +123,7 @@ // if (m.Length == 0) // { -// await e.Channel.SendMessage("Not a valid time format blablabla").ConfigureAwait(false); +// await channel.SendMessageAsync("Not a valid time format blablabla").ConfigureAwait(false); // return; // } @@ -148,7 +148,7 @@ // (groupName == "hours" && value > 23) || // (groupName == "minutes" && value > 59)) // { -// await e.Channel.SendMessage($"Invalid {groupName} value.").ConfigureAwait(false); +// await channel.SendMessageAsync($"Invalid {groupName} value.").ConfigureAwait(false); // return; // } // else @@ -175,7 +175,7 @@ // reminders.Add(StartNewReminder(rem)); -// await e.Channel.SendMessage($"⏰ I will remind \"{ch.Name}\" to \"{e.GetArg("message").ToString()}\" in {output}. ({time:d.M.yyyy.} at {time:HH:mm})").ConfigureAwait(false); +// await channel.SendMessageAsync($"⏰ I will remind \"{ch.Name}\" to \"{e.GetArg("message").ToString()}\" in {output}. ({time:d.M.yyyy.} at {time:HH:mm})").ConfigureAwait(false); // }); // cgb.CreateCommand(Module.Prefix + "remindmsg") // .Description("Sets message for when the remind is triggered. " + @@ -190,7 +190,7 @@ // return; // NadekoBot.Config.RemindMessageFormat = arg; -// await e.Channel.SendMessage("`New remind message set.`"); +// await channel.SendMessageAsync("`New remind message set.`"); // }); // } // } diff --git a/src/NadekoBot/Modules/Utility/UtilityModule.cs b/src/NadekoBot/Modules/Utility/UtilityModule.cs index 640db153..1e87e91f 100644 --- a/src/NadekoBot/Modules/Utility/UtilityModule.cs +++ b/src/NadekoBot/Modules/Utility/UtilityModule.cs @@ -4,16 +4,24 @@ using NadekoBot.Attributes; using System; using System.Linq; using System.Threading.Tasks; +using NadekoBot.Services; +using System.Text; +using NadekoBot.Extensions; +using System.Text.RegularExpressions; +using System.Collections.Generic; +using System.Reflection; namespace NadekoBot.Modules.Utility { [Module(".", AppendSpace = false)] - public class UtilityModule + public partial class UtilityModule : DiscordModule { - [LocalizedCommand] - [LocalizedDescription] - [LocalizedSummary] + public UtilityModule(ILocalization loc, CommandService cmds, IBotConfiguration config, IDiscordClient client) : base(loc, cmds, config, client) + { + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] [RequireContext(ContextType.Guild)] public async Task WhoPlays(IMessage imsg, [Remainder] string game) { @@ -22,154 +30,161 @@ namespace NadekoBot.Modules.Utility if (string.IsNullOrWhiteSpace(game)) return; var arr = (await chnl.Guild.GetUsersAsync()) - .Where(u => u.Game?.Name.ToUpperInvariant() == game) + .Where(u => u.Game?.Name?.ToUpperInvariant() == game) .Select(u => u.Username) .ToList(); int i = 0; if (!arr.Any()) - await imsg.Channel.SendMessageAsync("`Noone is playing that game.`").ConfigureAwait(false); + await imsg.Channel.SendMessageAsync(_l["`Nobody is playing that game.`"]).ConfigureAwait(false); else await imsg.Channel.SendMessageAsync("```xl\n" + string.Join("\n", arr.GroupBy(item => (i++) / 3).Select(ig => string.Concat(ig.Select(el => $"• {el,-35}")))) + "\n```").ConfigureAwait(false); } - [LocalizedCommand] - [LocalizedDescription] - [LocalizedSummary] + [LocalizedCommand, LocalizedDescription, LocalizedSummary] [RequireContext(ContextType.Guild)] - public async Task InRole(IMessage imsg, [Remainder] string roles) { + public async Task InRole(IMessage imsg, [Remainder] string roles) + { if (string.IsNullOrWhiteSpace(roles)) return; var channel = imsg.Channel as IGuildChannel; var arg = roles.Split(',').Select(r => r.Trim().ToUpperInvariant()); - string send = $"`Here is a list of users in a specfic role:`"; + string send = _l["`Here is a list of users in a specfic role:`"]; foreach (var roleStr in arg.Where(str => !string.IsNullOrWhiteSpace(str) && str != "@EVERYONE" && str != "EVERYONE")) { var role = channel.Guild.Roles.Where(r => r.Name.ToUpperInvariant() == roleStr).FirstOrDefault(); if (role == null) continue; send += $"\n`{role.Name}`\n"; - send += string.Join(", ", (await channel.Guild.GetUsersAsync()).Where(u=>u.Roles.Contains(role)).Select(u => u.ToString())); + send += string.Join(", ", (await channel.Guild.GetUsersAsync()).Where(u => u.Roles.Contains(role)).Select(u => u.ToString())); } - - //todo - - - //while (send.Length > 2000) - //{ - // if (!) - // { - // await e.Channel.SendMessage($"{e.User.Mention} you are not allowed to use this command on roles with a lot of users in them to prevent abuse."); - // return; - // } - // var curstr = send.Substring(0, 2000); - // await imsg.Channel.SendMessageAsync(curstr.Substring(0, - // curstr.LastIndexOf(", ", StringComparison.Ordinal) + 1)).ConfigureAwait(false); - // send = curstr.Substring(curstr.LastIndexOf(", ", StringComparison.Ordinal) + 1) + - // send.Substring(2000); - //} - //await e.Channel.Send(send).ConfigureAwait(false); + var usr = imsg.Author as IGuildUser; + while (send.Length > 2000) + { + if (!usr.GetPermissions(channel).ManageMessages) + { + await imsg.Channel.SendMessageAsync($"{usr.Mention} you are not allowed to use this command on roles with a lot of users in them to prevent abuse."); + return; + } + var curstr = send.Substring(0, 2000); + await imsg.Channel.SendMessageAsync(curstr.Substring(0, + curstr.LastIndexOf(", ", StringComparison.Ordinal) + 1)).ConfigureAwait(false); + send = curstr.Substring(curstr.LastIndexOf(", ", StringComparison.Ordinal) + 1) + + send.Substring(2000); + } + await imsg.Channel.SendMessageAsync(send).ConfigureAwait(false); } + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task CheckMyPerms(IMessage msg) + { + StringBuilder builder = new StringBuilder("```\n"); + var user = msg.Author as IGuildUser; + var perms = user.GetPermissions(msg.Channel as ITextChannel); + foreach (var p in perms.GetType().GetProperties().Where(p => !p.GetGetMethod().GetParameters().Any())) + { + builder.AppendLine($"{p.Name} : {p.GetValue(perms, null).ToString()}"); + } + builder.Append("```"); + await msg.Reply(builder.ToString()); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task UserId(IMessage msg, IGuildUser target = null) + { + var usr = target ?? msg.Author; + await msg.Reply($"Id of the user { usr.Username } is { usr.Id })"); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + public async Task ChannelId(IMessage msg) + { + await msg.Reply($"This Channel's ID is {msg.Channel.Id}"); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task ServerId(IMessage msg) + { + await msg.Reply($"This server's ID is {(msg.Channel as IGuildChannel).Guild.Id}"); + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task Roles(IMessage msg, IGuildUser target = null) + { + var guild = (msg.Channel as IGuildChannel).Guild; + if (target != null) + { + await msg.Reply($"`List of roles for **{target.Username}**:` \n• " + string.Join("\n• ", target.Roles.Except(new[] { guild.EveryoneRole }))); + } + else + { + await msg.Reply("`List of roles:` \n• " + string.Join("\n• ", (msg.Channel as IGuildChannel).Guild.Roles.Except(new[] { guild.EveryoneRole }))); + } + } + + [LocalizedCommand, LocalizedDescription, LocalizedSummary] + [RequireContext(ContextType.Guild)] + public async Task Prune(IMessage msg, [Remainder] string target = null) + { + var channel = msg.Channel as IGuildChannel; + + var user = await channel.Guild.GetCurrentUserAsync(); + if (string.IsNullOrWhiteSpace(target)) + { + + var enumerable = (await msg.Channel.GetMessagesAsync(limit: 100)).Where(x => x.Author.Id == user.Id); + await msg.Channel.DeleteMessagesAsync(enumerable); + return; + } + target = target.Trim(); + if (!user.GetPermissions(channel).ManageMessages) + { + await msg.Reply("Don't have permissions to manage messages in channel"); + return; + } + int count; + if (int.TryParse(target, out count)) + { + while (count > 0) + { + int limit = (count < 100) ? count : 100; + var enumerable = (await msg.Channel.GetMessagesAsync(limit: limit)); + await msg.Channel.DeleteMessagesAsync(enumerable); + if (enumerable.Count < limit) break; + count -= limit; + } + } + else if (msg.MentionedUsers.Count > 0) + { + var toDel = new List(); + + var match = Regex.Match(target, @"\s(\d+)\s"); + if (match.Success) + { + int.TryParse(match.Groups[1].Value, out count); + var messages = new List(count); + + while (count > 0) + { + var toAdd = await msg.Channel.GetMessagesAsync(limit: count < 100 ? count : 100); + messages.AddRange(toAdd); + count -= toAdd.Count; + } + + foreach (var mention in msg.MentionedUsers) + { + toDel.AddRange(messages.Where(m => m.Author.Id == mention.Id)); + } + //TODO check if limit == 100 or there is no limit + await msg.Channel.DeleteMessagesAsync(toDel); + } + } + } } } - //public void Install() - //{ - // manager.CreateCommands("", cgb => - // { - // cgb.AddCheck(PermissionChecker.Instance); - - // var client = manager.Client; - - // commands.ForEach(cmd => cmd.Init(cgb)); - - // cgb.CreateCommand(Prefix + "whoplays") - // .Description() - // .Parameter("game", ParameterType.Unparsed) - // .Do(async e => - // { - - // }); - - - - // cgb.CreateCommand(Prefix + "checkmyperms") - // .Description($"Checks your userspecific permissions on this channel. | `{Prefix}checkmyperms`") - // .Do(async e => - // { - // var output = "```\n"; - // foreach (var p in e.User.ServerPermissions.GetType().GetProperties().Where(p => !p.GetGetMethod().GetParameters().Any())) - // { - // output += p.Name + ": " + p.GetValue(e.User.ServerPermissions, null).ToString() + "\n"; - // } - // output += "```"; - // await e.User.SendMessage(output).ConfigureAwait(false); - // }); - - // cgb.CreateCommand(Prefix + "stats") - // .Description($"Shows some basic stats for Nadeko. | `{Prefix}stats`") - // .Do(async e => - // { - // await e.Channel.SendMessage(await NadekoStats.Instance.GetStats()).ConfigureAwait(false); - // }); - - // cgb.CreateCommand(Prefix + "dysyd") - // .Description($"Shows some basic stats for Nadeko. | `{Prefix}dysyd`") - // .Do(async e => - // { - // await e.Channel.SendMessage((await NadekoStats.Instance.GetStats()).Matrix().TrimTo(1990)).ConfigureAwait(false); - // }); - - // cgb.CreateCommand(Prefix + "userid").Alias(Prefix + "uid") - // .Description($"Shows user ID. | `{Prefix}uid` or `{Prefix}uid \"@SomeGuy\"`") - // .Parameter("user", ParameterType.Unparsed) - // .Do(async e => - // { - // var usr = e.User; - // if (!string.IsNullOrWhiteSpace(e.GetArg("user"))) usr = e.Channel.FindUsers(e.GetArg("user")).FirstOrDefault(); - // if (usr == null) - // return; - // await e.Channel.SendMessage($"Id of the user { usr.Name } is { usr.Id }").ConfigureAwait(false); - // }); - - // cgb.CreateCommand(Prefix + "channelid").Alias(Prefix + "cid") - // .Description($"Shows current channel ID. | `{Prefix}cid`") - // .Do(async e => await e.Channel.SendMessage("This channel's ID is " + e.Channel.Id).ConfigureAwait(false)); - - // cgb.CreateCommand(Prefix + "serverid").Alias(Prefix + "sid") - // .Description($"Shows current server ID. | `{Prefix}sid`") - // .Do(async e => await e.Channel.SendMessage("This server's ID is " + e.Server.Id).ConfigureAwait(false)); - - // cgb.CreateCommand(Prefix + "roles") - // .Description("List all roles on this server or a single user if specified. | `{Prefix}roles`") - // .Parameter("user", ParameterType.Unparsed) - // .Do(async e => - // { - // if (!string.IsNullOrWhiteSpace(e.GetArg("user"))) - // { - // var usr = e.Server.FindUsers(e.GetArg("user")).FirstOrDefault(); - // if (usr == null) return; - - // await e.Channel.SendMessage($"`List of roles for **{usr.Name}**:` \n• " + string.Join("\n• ", usr.Roles)).ConfigureAwait(false); - // return; - // } - // await e.Channel.SendMessage("`List of roles:` \n• " + string.Join("\n• ", e.Server.Roles)).ConfigureAwait(false); - // }); - - - // cgb.CreateCommand(Prefix + "channeltopic") - // .Alias(Prefix + "ct") - // .Description($"Sends current channel's topic as a message. | `{Prefix}ct`") - // .Do(async e => - // { - // var topic = e.Channel.Topic; - // if (string.IsNullOrWhiteSpace(topic)) - // return; - // await e.Channel.SendMessage(topic).ConfigureAwait(false); - // }); - // }); -// } -// } -//} diff --git a/src/NadekoBot/NadekoBot.cs b/src/NadekoBot/NadekoBot.cs index 71d8880e..c9eb20b3 100644 --- a/src/NadekoBot/NadekoBot.cs +++ b/src/NadekoBot/NadekoBot.cs @@ -1,6 +1,9 @@ -using Discord.Commands; +using Discord; +using Discord.Commands; using Discord.WebSocket; using NadekoBot.Modules.Utility; +using NadekoBot.Services; +using NadekoBot.Services.Impl; using System; using System.Collections.Generic; using System.Linq; @@ -13,30 +16,50 @@ namespace NadekoBot { public static CommandService Commands { get; private set; } public static DiscordSocketClient Client { get; private set; } + public BotConfiguration Config { get; private set; } + public Localization Localizer { get; private set; } public async Task RunAsync(string[] args) { - Client = new DiscordSocketClient(new Discord.DiscordSocketConfig + //create client + Client = new DiscordSocketClient(new DiscordSocketConfig { AudioMode = Discord.Audio.AudioMode.Incoming, LargeThreshold = 200, - LogLevel = Discord.LogSeverity.Warning, + LogLevel = LogSeverity.Warning, MessageCacheSize = 10, }); + //initialize Services Commands = new CommandService(); + Config = new BotConfiguration(); + Localizer = new Localization(); + + //setup DI + var depMap = new DependencyMap(); + depMap.Add(Localizer); + depMap.Add(Config); + depMap.Add(Client); + depMap.Add(Commands); - //Client.MessageReceived += Client_MessageReceived; - - //await Commands.Load(new UtilityModule()); - await Commands.LoadAssembly(Assembly.GetEntryAssembly()); - - await Client.LoginAsync(Discord.TokenType.Bot, "MTE5Nzc3MDIxMzE5NTc3NjEw.CmxGHA.nk1KyvR6y05nntj-J0W_Zvu-2kk"); + //connect + await Client.LoginAsync(TokenType.Bot, "MTE5Nzc3MDIxMzE5NTc3NjEw.CpGoCA.yQBJbLWurrjSk7IlGpGzBm-tPTg"); await Client.ConnectAsync(); + + //load commands + await Commands.LoadAssembly(Assembly.GetEntryAssembly(), depMap); + Client.MessageReceived += Client_MessageReceived; Console.WriteLine(Commands.Commands.Count()); await Task.Delay(-1); } + + private async Task Client_MessageReceived(IMessage arg) + { + var t = await Commands.Execute(arg, 0); + if(!t.IsSuccess) + Console.WriteLine(t.ErrorReason); + } } } diff --git a/src/NadekoBot/Resources/Strings.Designer.cs b/src/NadekoBot/Resources/CommandStrings.Designer.cs similarity index 99% rename from src/NadekoBot/Resources/Strings.Designer.cs rename to src/NadekoBot/Resources/CommandStrings.Designer.cs index 1f48b5cc..e3fe9537 100644 --- a/src/NadekoBot/Resources/Strings.Designer.cs +++ b/src/NadekoBot/Resources/CommandStrings.Designer.cs @@ -22,13 +22,13 @@ namespace NadekoBot.Resources { // with the /str option, or rebuild your VS project. [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class Strings { + public class CommandStrings { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; - internal Strings() { + internal CommandStrings() { } /// @@ -38,7 +38,7 @@ namespace NadekoBot.Resources { public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NadekoBot.Resources.Strings", typeof(Strings).GetTypeInfo().Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NadekoBot.Resources.CommandStrings", typeof(CommandStrings).GetTypeInfo().Assembly); resourceMan = temp; } return resourceMan; diff --git a/src/NadekoBot/Resources/Strings.resx b/src/NadekoBot/Resources/CommandStrings.resx similarity index 100% rename from src/NadekoBot/Resources/Strings.resx rename to src/NadekoBot/Resources/CommandStrings.resx diff --git a/src/NadekoBot/Resources/ResponseStrings.Designer.cs b/src/NadekoBot/Resources/ResponseStrings.Designer.cs new file mode 100644 index 00000000..15ceb39d --- /dev/null +++ b/src/NadekoBot/Resources/ResponseStrings.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace NadekoBot.Resources { + using System; + using System.Reflection; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class ResponseStrings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + internal ResponseStrings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NadekoBot.Resources.ResponseStrings", typeof(ResponseStrings).GetTypeInfo().Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to TESTING. + /// + public static string test { + get { + return ResourceManager.GetString("test", resourceCulture); + } + } + } +} diff --git a/src/NadekoBot/Resources/ResponseStrings.resx b/src/NadekoBot/Resources/ResponseStrings.resx new file mode 100644 index 00000000..188ec335 --- /dev/null +++ b/src/NadekoBot/Resources/ResponseStrings.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + TESTING + + \ No newline at end of file diff --git a/src/NadekoBot/Services/ILocalization.cs b/src/NadekoBot/Services/ILocalization.cs new file mode 100644 index 00000000..9b18f0a7 --- /dev/null +++ b/src/NadekoBot/Services/ILocalization.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace NadekoBot.Services +{ + public interface ILocalization + { + string this[string key] { get; } + } +} diff --git a/src/NadekoBot/Localization.cs b/src/NadekoBot/Services/Impl/Localization.cs similarity index 66% rename from src/NadekoBot/Localization.cs rename to src/NadekoBot/Services/Impl/Localization.cs index 3cd33e42..3d36e0da 100644 --- a/src/NadekoBot/Localization.cs +++ b/src/NadekoBot/Services/Impl/Localization.cs @@ -7,13 +7,34 @@ using System.Resources; namespace NadekoBot.Services { - public class Localization + public class Localization : ILocalization { - public static string LoadString(string key) => GetOrAddResourceKey(key); + public string this[string key] { + get { + try + { + return Resources.ResponseStrings.ResourceManager.GetString(key); + } + catch (Exception) { + return key; + } + } + } - private static string GetOrAddResourceKey(string key) + public static string LoadCommandString(string key) { - return Resources.Strings.ResourceManager.GetString(key); + try + { + return Resources.CommandStrings.ResourceManager.GetString(key); + } + catch (Exception) { + return key; + } + } + + //private static string GetCommandString(string key) + //{ + // return key; //var resx = new List(); //var fs = new StreamReader(File.OpenRead("./Strings.resx")); //Console.WriteLine(fs.ReadToEnd()); @@ -41,6 +62,6 @@ namespace NadekoBot.Services // writer.Generate(); //} //return key; - } + //} } } diff --git a/src/NadekoBot/_Extensions/Extensions.cs b/src/NadekoBot/_Extensions/Extensions.cs new file mode 100644 index 00000000..1b08c734 --- /dev/null +++ b/src/NadekoBot/_Extensions/Extensions.cs @@ -0,0 +1,51 @@ +using Discord; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace NadekoBot.Extensions +{ + public static class Extensions + { + public static async Task Reply(this IMessage msg, string content) => await msg.Channel.SendMessageAsync(content); + + public static async Task ReplyLong(this IMessage msg, string content, string breakOn = "\n", string addToEnd = "", string addToStart = "") + { + + if (content.Length < 2000) return new[] { await msg.Channel.SendMessageAsync(content) }; + var list = new List(); + + var temp = Regex.Split(content, breakOn).Select(x => x += breakOn).ToList(); + string toolong; + //while ((toolong = temp.FirstOrDefault(x => x.Length > 2000)) != null) + //{ + // //TODO more desperate measures == split on whitespace? + //} + + StringBuilder builder = new StringBuilder(); + //TODO make this less crappy to look at, maybe it's bugged + for (int i = 0; i < temp.Count; i++) + { + var addition = temp[i]; + //we append + + if (builder.Length == 0 && i != 0) builder.Append(addToStart + addition); + else builder.Append(addition); + + //Check if the next would have room + if (i + 1 >= temp.Count || temp[i + 1].Length + builder.Length + addToEnd.Length > 2000) + { + if (i + 1 < temp.Count) builder.Append(addToEnd); + list.Add(await msg.Channel.SendMessageAsync(builder.ToString())); + builder.Clear(); + } + } + + return list.ToArray(); + } + + } +} \ No newline at end of file diff --git a/src/NadekoBot/_Modules/Administration/AdministrationModule.cs b/src/NadekoBot/_Modules/Administration/AdministrationModule.cs index 23402c81..ecd118f9 100644 --- a/src/NadekoBot/_Modules/Administration/AdministrationModule.cs +++ b/src/NadekoBot/_Modules/Administration/AdministrationModule.cs @@ -72,9 +72,9 @@ namespace NadekoBot.Modules.Administration conf.AutoDeleteMessagesOnCommand = !conf.AutoDeleteMessagesOnCommand; await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false); if (conf.AutoDeleteMessagesOnCommand) - await e.Channel.SendMessage("❗`Now automatically deleting successfull command invokations.`"); + await channel.SendMessageAsync("❗`Now automatically deleting successfull command invokations.`"); else - await e.Channel.SendMessage("❗`Stopped automatic deletion of successfull command invokations.`"); + await channel.SendMessageAsync("❗`Stopped automatic deletion of successfull command invokations.`"); }); @@ -83,7 +83,7 @@ namespace NadekoBot.Modules.Administration .AddCheck(SimpleCheckers.OwnerOnly()) .Do(async e => { - await e.Channel.SendMessage("`Restarting in 2 seconds...`"); + await channel.SendMessageAsync("`Restarting in 2 seconds...`"); await Task.Delay(2000); System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location); Environment.Exit(0); @@ -103,31 +103,31 @@ namespace NadekoBot.Modules.Administration if (!e.User.ServerPermissions.ManageRoles) { - await e.Channel.SendMessage("You have insufficient permissions.").ConfigureAwait(false); + await channel.SendMessageAsync("You have insufficient permissions.").ConfigureAwait(false); } var usr = e.Server.FindUsers(userName).FirstOrDefault(); if (usr == null) { - await e.Channel.SendMessage("You failed to supply a valid username").ConfigureAwait(false); + await channel.SendMessageAsync("You failed to supply a valid username").ConfigureAwait(false); return; } var role = e.Server.FindRoles(roleName).FirstOrDefault(); if (role == null) { - await e.Channel.SendMessage("You failed to supply a valid role").ConfigureAwait(false); + await channel.SendMessageAsync("You failed to supply a valid role").ConfigureAwait(false); return; } try { await usr.AddRoles(role).ConfigureAwait(false); - await e.Channel.SendMessage($"Successfully added role **{role.Name}** to user **{usr.Name}**").ConfigureAwait(false); + await channel.SendMessageAsync($"Successfully added role **{role.Name}** to user **{usr.Name}**").ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Failed to add roles. Bot has insufficient permissions.\n").ConfigureAwait(false); + await channel.SendMessageAsync("Failed to add roles. Bot has insufficient permissions.\n").ConfigureAwait(false); Console.WriteLine(ex.ToString()); } }); @@ -147,25 +147,25 @@ namespace NadekoBot.Modules.Administration var usr = e.Server.FindUsers(userName).FirstOrDefault(); if (usr == null) { - await e.Channel.SendMessage("You failed to supply a valid username").ConfigureAwait(false); + await channel.SendMessageAsync("You failed to supply a valid username").ConfigureAwait(false); return; } var role = e.Server.FindRoles(roleName).FirstOrDefault(); if (role == null) { - await e.Channel.SendMessage("You failed to supply a valid role").ConfigureAwait(false); + await channel.SendMessageAsync("You failed to supply a valid role").ConfigureAwait(false); return; } try { await usr.RemoveRoles(role).ConfigureAwait(false); - await e.Channel.SendMessage($"Successfully removed role **{role.Name}** from user **{usr.Name}**").ConfigureAwait(false); + await channel.SendMessageAsync($"Successfully removed role **{role.Name}** from user **{usr.Name}**").ConfigureAwait(false); } catch { - await e.Channel.SendMessage("Failed to remove roles. Most likely reason: Insufficient permissions.").ConfigureAwait(false); + await channel.SendMessageAsync("Failed to remove roles. Most likely reason: Insufficient permissions.").ConfigureAwait(false); } }); @@ -183,7 +183,7 @@ namespace NadekoBot.Modules.Administration var roleToEdit = e.Server.FindRoles(r1).FirstOrDefault(); if (roleToEdit == null) { - await e.Channel.SendMessage("Can't find that role.").ConfigureAwait(false); + await channel.SendMessageAsync("Can't find that role.").ConfigureAwait(false); return; } @@ -191,15 +191,15 @@ namespace NadekoBot.Modules.Administration { if (roleToEdit.Position > e.Server.CurrentUser.Roles.Max(r => r.Position)) { - await e.Channel.SendMessage("I can't edit roles higher than my highest role.").ConfigureAwait(false); + await channel.SendMessageAsync("I can't edit roles higher than my highest role.").ConfigureAwait(false); return; } await roleToEdit.Edit(r2); - await e.Channel.SendMessage("Role renamed.").ConfigureAwait(false); + await channel.SendMessageAsync("Role renamed.").ConfigureAwait(false); } catch (Exception) { - await e.Channel.SendMessage("Failed to rename role. Probably insufficient permissions.").ConfigureAwait(false); + await channel.SendMessageAsync("Failed to rename role. Probably insufficient permissions.").ConfigureAwait(false); } }); @@ -214,18 +214,18 @@ namespace NadekoBot.Modules.Administration var usr = e.Server.FindUsers(userName).FirstOrDefault(); if (usr == null) { - await e.Channel.SendMessage("You failed to supply a valid username").ConfigureAwait(false); + await channel.SendMessageAsync("You failed to supply a valid username").ConfigureAwait(false); return; } try { await usr.RemoveRoles(usr.Roles.ToArray()).ConfigureAwait(false); - await e.Channel.SendMessage($"Successfully removed **all** roles from user **{usr.Name}**").ConfigureAwait(false); + await channel.SendMessageAsync($"Successfully removed **all** roles from user **{usr.Name}**").ConfigureAwait(false); } catch { - await e.Channel.SendMessage("Failed to remove roles. Most likely reason: Insufficient permissions.").ConfigureAwait(false); + await channel.SendMessageAsync("Failed to remove roles. Most likely reason: Insufficient permissions.").ConfigureAwait(false); } }); @@ -240,11 +240,11 @@ namespace NadekoBot.Modules.Administration try { var r = await e.Server.CreateRole(e.GetArg("role_name")).ConfigureAwait(false); - await e.Channel.SendMessage($"Successfully created role **{r.Name}**.").ConfigureAwait(false); + await channel.SendMessageAsync($"Successfully created role **{r.Name}**.").ConfigureAwait(false); } catch (Exception) { - await e.Channel.SendMessage(":warning: Unspecified error.").ConfigureAwait(false); + await channel.SendMessageAsync(":warning: Unspecified error.").ConfigureAwait(false); } }); @@ -258,7 +258,7 @@ namespace NadekoBot.Modules.Administration { if (!e.User.ServerPermissions.ManageRoles) { - await e.Channel.SendMessage("You don't have permission to use this!").ConfigureAwait(false); + await channel.SendMessageAsync("You don't have permission to use this!").ConfigureAwait(false); return; } @@ -266,7 +266,7 @@ namespace NadekoBot.Modules.Administration if (args.Count() != 2 && args.Count() != 4) { - await e.Channel.SendMessage("The parameters are invalid.").ConfigureAwait(false); + await channel.SendMessageAsync("The parameters are invalid.").ConfigureAwait(false); return; } @@ -274,7 +274,7 @@ namespace NadekoBot.Modules.Administration if (role == null) { - await e.Channel.SendMessage("That role does not exist.").ConfigureAwait(false); + await channel.SendMessageAsync("That role does not exist.").ConfigureAwait(false); return; } try @@ -287,11 +287,11 @@ namespace NadekoBot.Modules.Administration var blue = Convert.ToByte(rgb ? int.Parse(e.Args[3]) : Convert.ToInt32(arg1.Substring(4, 2), 16)); await role.Edit(color: new Color(red, green, blue)).ConfigureAwait(false); - await e.Channel.SendMessage($"Role {role.Name}'s color has been changed.").ConfigureAwait(false); + await channel.SendMessageAsync($"Role {role.Name}'s color has been changed.").ConfigureAwait(false); } catch (Exception) { - await e.Channel.SendMessage("Error occured, most likely invalid parameters or insufficient permissions.").ConfigureAwait(false); + await channel.SendMessageAsync("Error occured, most likely invalid parameters or insufficient permissions.").ConfigureAwait(false); } }); @@ -308,7 +308,7 @@ namespace NadekoBot.Modules.Administration var usr = e.Server.FindUsers(user).FirstOrDefault(); if (usr == null) { - await e.Channel.SendMessage("User not found.").ConfigureAwait(false); + await channel.SendMessageAsync("User not found.").ConfigureAwait(false); return; } if (!string.IsNullOrWhiteSpace(msg)) @@ -321,11 +321,11 @@ namespace NadekoBot.Modules.Administration { await e.Server.Ban(usr, 7).ConfigureAwait(false); - await e.Channel.SendMessage("Banned user " + usr.Name + " Id: " + usr.Id).ConfigureAwait(false); + await channel.SendMessageAsync("Banned user " + usr.Name + " Id: " + usr.Id).ConfigureAwait(false); } catch { - await e.Channel.SendMessage("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false); + await channel.SendMessageAsync("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false); } } }); @@ -343,7 +343,7 @@ namespace NadekoBot.Modules.Administration var usr = e.Server.FindUsers(user).FirstOrDefault(); if (usr == null) { - await e.Channel.SendMessage("User not found.").ConfigureAwait(false); + await channel.SendMessageAsync("User not found.").ConfigureAwait(false); return; } if (!string.IsNullOrWhiteSpace(msg)) @@ -357,11 +357,11 @@ namespace NadekoBot.Modules.Administration await e.Server.Ban(usr, 7).ConfigureAwait(false); await e.Server.Unban(usr).ConfigureAwait(false); - await e.Channel.SendMessage("Soft-Banned user " + usr.Name + " Id: " + usr.Id).ConfigureAwait(false); + await channel.SendMessageAsync("Soft-Banned user " + usr.Name + " Id: " + usr.Id).ConfigureAwait(false); } catch { - await e.Channel.SendMessage("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false); + await channel.SendMessageAsync("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false); } } }); @@ -379,7 +379,7 @@ namespace NadekoBot.Modules.Administration var usr = e.Server.FindUsers(user).FirstOrDefault(); if (usr == null) { - await e.Channel.SendMessage("User not found.").ConfigureAwait(false); + await channel.SendMessageAsync("User not found.").ConfigureAwait(false); return; } if (!string.IsNullOrWhiteSpace(msg)) @@ -391,11 +391,11 @@ namespace NadekoBot.Modules.Administration try { await usr.Kick().ConfigureAwait(false); - await e.Channel.SendMessage("Kicked user " + usr.Name + " Id: " + usr.Id).ConfigureAwait(false); + await channel.SendMessageAsync("Kicked user " + usr.Name + " Id: " + usr.Id).ConfigureAwait(false); } catch { - await e.Channel.SendMessage("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false); + await channel.SendMessageAsync("Error. Most likely I don't have sufficient permissions.").ConfigureAwait(false); } } }); @@ -406,7 +406,7 @@ namespace NadekoBot.Modules.Administration { if (!e.User.ServerPermissions.MuteMembers) { - await e.Channel.SendMessage("I most likely don't have the permission necessary for that.").ConfigureAwait(false); + await channel.SendMessageAsync("I most likely don't have the permission necessary for that.").ConfigureAwait(false); return; } if (!e.Message.MentionedUsers.Any()) @@ -417,11 +417,11 @@ namespace NadekoBot.Modules.Administration { await u.Edit(isMuted: true).ConfigureAwait(false); } - await e.Channel.SendMessage("Mute successful").ConfigureAwait(false); + await channel.SendMessageAsync("Mute successful").ConfigureAwait(false); } catch { - await e.Channel.SendMessage("I most likely don't have the permission necessary for that.").ConfigureAwait(false); + await channel.SendMessageAsync("I most likely don't have the permission necessary for that.").ConfigureAwait(false); } }); @@ -432,7 +432,7 @@ namespace NadekoBot.Modules.Administration { if (!e.User.ServerPermissions.MuteMembers) { - await e.Channel.SendMessage("You do not have permission to do that.").ConfigureAwait(false); + await channel.SendMessageAsync("You do not have permission to do that.").ConfigureAwait(false); return; } if (!e.Message.MentionedUsers.Any()) @@ -443,11 +443,11 @@ namespace NadekoBot.Modules.Administration { await u.Edit(isMuted: false).ConfigureAwait(false); } - await e.Channel.SendMessage("Unmute successful").ConfigureAwait(false); + await channel.SendMessageAsync("Unmute successful").ConfigureAwait(false); } catch { - await e.Channel.SendMessage("I most likely don't have the permission necessary for that.").ConfigureAwait(false); + await channel.SendMessageAsync("I most likely don't have the permission necessary for that.").ConfigureAwait(false); } }); @@ -459,7 +459,7 @@ namespace NadekoBot.Modules.Administration { if (!e.User.ServerPermissions.DeafenMembers) { - await e.Channel.SendMessage("You do not have permission to do that.").ConfigureAwait(false); + await channel.SendMessageAsync("You do not have permission to do that.").ConfigureAwait(false); return; } if (!e.Message.MentionedUsers.Any()) @@ -470,11 +470,11 @@ namespace NadekoBot.Modules.Administration { await u.Edit(isDeafened: true).ConfigureAwait(false); } - await e.Channel.SendMessage("Deafen successful").ConfigureAwait(false); + await channel.SendMessageAsync("Deafen successful").ConfigureAwait(false); } catch { - await e.Channel.SendMessage("I most likely don't have the permission necessary for that.").ConfigureAwait(false); + await channel.SendMessageAsync("I most likely don't have the permission necessary for that.").ConfigureAwait(false); } }); @@ -486,7 +486,7 @@ namespace NadekoBot.Modules.Administration { if (!e.User.ServerPermissions.DeafenMembers) { - await e.Channel.SendMessage("You do not have permission to do that.").ConfigureAwait(false); + await channel.SendMessageAsync("You do not have permission to do that.").ConfigureAwait(false); return; } if (!e.Message.MentionedUsers.Any()) @@ -497,11 +497,11 @@ namespace NadekoBot.Modules.Administration { await u.Edit(isDeafened: false).ConfigureAwait(false); } - await e.Channel.SendMessage("Undeafen successful").ConfigureAwait(false); + await channel.SendMessageAsync("Undeafen successful").ConfigureAwait(false); } catch { - await e.Channel.SendMessage("I most likely don't have the permission necessary for that.").ConfigureAwait(false); + await channel.SendMessageAsync("I most likely don't have the permission necessary for that.").ConfigureAwait(false); } }); @@ -519,12 +519,12 @@ namespace NadekoBot.Modules.Administration if (ch == null) return; await ch.Delete().ConfigureAwait(false); - await e.Channel.SendMessage($"Removed channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false); + await channel.SendMessageAsync($"Removed channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false); } } catch { - await e.Channel.SendMessage("Insufficient permissions."); + await channel.SendMessageAsync("Insufficient permissions."); } }); @@ -539,12 +539,12 @@ namespace NadekoBot.Modules.Administration if (e.User.ServerPermissions.ManageChannels) { await e.Server.CreateChannel(e.GetArg("channel_name"), ChannelType.Voice).ConfigureAwait(false); - await e.Channel.SendMessage($"Created voice channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false); + await channel.SendMessageAsync($"Created voice channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false); } } catch { - await e.Channel.SendMessage("Insufficient permissions.").ConfigureAwait(false); + await channel.SendMessageAsync("Insufficient permissions.").ConfigureAwait(false); } }); @@ -561,12 +561,12 @@ namespace NadekoBot.Modules.Administration var channel = e.Server.FindChannels(e.GetArg("channel_name"), ChannelType.Text).FirstOrDefault(); if (channel == null) return; await channel.Delete().ConfigureAwait(false); - await e.Channel.SendMessage($"Removed text channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false); + await channel.SendMessageAsync($"Removed text channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false); } } catch { - await e.Channel.SendMessage("Insufficient permissions.").ConfigureAwait(false); + await channel.SendMessageAsync("Insufficient permissions.").ConfigureAwait(false); } }); @@ -581,12 +581,12 @@ namespace NadekoBot.Modules.Administration if (e.User.ServerPermissions.ManageChannels) { await e.Server.CreateChannel(e.GetArg("channel_name"), ChannelType.Text).ConfigureAwait(false); - await e.Channel.SendMessage($"Added text channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false); + await channel.SendMessageAsync($"Added text channel **{e.GetArg("channel_name")}**.").ConfigureAwait(false); } } catch { - await e.Channel.SendMessage("Insufficient permissions.").ConfigureAwait(false); + await channel.SendMessageAsync("Insufficient permissions.").ConfigureAwait(false); } }); @@ -599,7 +599,7 @@ namespace NadekoBot.Modules.Administration { var topic = e.GetArg("topic")?.Trim() ?? ""; await e.Channel.Edit(topic: topic).ConfigureAwait(false); - await e.Channel.SendMessage(":ok: **New channel topic set.**").ConfigureAwait(false); + await channel.SendMessageAsync(":ok: **New channel topic set.**").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "setchanlname") @@ -613,7 +613,7 @@ namespace NadekoBot.Modules.Administration if (string.IsNullOrWhiteSpace(name)) return; await e.Channel.Edit(name: name).ConfigureAwait(false); - await e.Channel.SendMessage(":ok: **New channel name set.**").ConfigureAwait(false); + await channel.SendMessageAsync(":ok: **New channel name set.**").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "heap") @@ -622,7 +622,7 @@ namespace NadekoBot.Modules.Administration .Do(async e => { var heap = await Task.Run(() => NadekoStats.Instance.Heap()).ConfigureAwait(false); - await e.Channel.SendMessage($"`Heap Size:` {heap}").ConfigureAwait(false); + await channel.SendMessageAsync($"`Heap Size:` {heap}").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "prune") @@ -647,7 +647,7 @@ namespace NadekoBot.Modules.Administration return; else if (!e.Server.CurrentUser.GetPermissions(e.Channel).ManageMessages) { - await e.Channel.SendMessage("💢I don't have the permission to manage messages."); + await channel.SendMessageAsync("💢I don't have the permission to manage messages."); return; } int val; @@ -678,7 +678,7 @@ namespace NadekoBot.Modules.Administration .AddCheck(SimpleCheckers.OwnerOnly()) .Do(async e => { - await e.Channel.SendMessage("`Shutting down.`").ConfigureAwait(false); + await channel.SendMessageAsync("`Shutting down.`").ConfigureAwait(false); await Task.Delay(2000).ConfigureAwait(false); Environment.Exit(0); }); @@ -711,7 +711,7 @@ namespace NadekoBot.Modules.Administration await client.CurrentUser.Edit("", avatar: image.ToStream()).ConfigureAwait(false); // Send confirm. - await e.Channel.SendMessage("New avatar set.").ConfigureAwait(false); + await channel.SendMessageAsync("New avatar set.").ConfigureAwait(false); // Save the image to disk. image.Save("data/avatar.png", System.Drawing.Imaging.ImageFormat.Png); @@ -770,7 +770,7 @@ namespace NadekoBot.Modules.Administration } else { - await e.Channel.SendMessage("`Invalid format.`"); + await channel.SendMessageAsync("`Invalid format.`"); } }); @@ -824,7 +824,7 @@ namespace NadekoBot.Modules.Administration var donatorsOrdered = rows.OrderByDescending(d => d.Amount); string str = $"**Thanks to the people listed below for making this project happen!**\n"; - await e.Channel.SendMessage(str + string.Join("⭐", donatorsOrdered.Select(d => d.UserName))).ConfigureAwait(false); + await channel.SendMessageAsync(str + string.Join("⭐", donatorsOrdered.Select(d => d.UserName))).ConfigureAwait(false); }).ConfigureAwait(false); }); @@ -848,7 +848,7 @@ namespace NadekoBot.Modules.Administration UserName = donator.Name, UserId = (long)donator.Id }); - e.Channel.SendMessage("Successfuly added a new donator. 👑").ConfigureAwait(false); + channel.SendMessageAsync("Successfuly added a new donator. 👑").ConfigureAwait(false); } catch { } }).ConfigureAwait(false); @@ -865,7 +865,7 @@ namespace NadekoBot.Modules.Administration await ch.SendMessage(e.GetArg("msg")).ConfigureAwait(false); } - await e.Channel.SendMessage(":ok:").ConfigureAwait(false); + await channel.SendMessageAsync(":ok:").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "savechat") diff --git a/src/NadekoBot/_Modules/Administration/Commands/AutoAssignRole.cs b/src/NadekoBot/_Modules/Administration/Commands/AutoAssignRole.cs index 38084dfa..89f64c3a 100644 --- a/src/NadekoBot/_Modules/Administration/Commands/AutoAssignRole.cs +++ b/src/NadekoBot/_Modules/Administration/Commands/AutoAssignRole.cs @@ -41,7 +41,7 @@ namespace NadekoBot.Modules.Administration.Commands { if (!e.Server.CurrentUser.ServerPermissions.ManageRoles) { - await e.Channel.SendMessage("I do not have the permission to manage roles.").ConfigureAwait(false); + await channel.SendMessageAsync("I do not have the permission to manage roles.").ConfigureAwait(false); return; } var r = e.GetArg("role")?.Trim(); @@ -52,19 +52,19 @@ namespace NadekoBot.Modules.Administration.Commands { config.AutoAssignedRole = 0; - await e.Channel.SendMessage("`Auto assign role on user join is now disabled.`").ConfigureAwait(false); + await channel.SendMessageAsync("`Auto assign role on user join is now disabled.`").ConfigureAwait(false); return; } var role = e.Server.FindRoles(r).FirstOrDefault(); if (role == null) { - await e.Channel.SendMessage("💢 `Role not found.`").ConfigureAwait(false); + await channel.SendMessageAsync("💢 `Role not found.`").ConfigureAwait(false); return; } config.AutoAssignedRole = role.Id; - await e.Channel.SendMessage("`Auto assigned role is set.`").ConfigureAwait(false); + await channel.SendMessageAsync("`Auto assigned role is set.`").ConfigureAwait(false); }); } diff --git a/src/NadekoBot/_Modules/Administration/Commands/CrossServerTextChannel.cs b/src/NadekoBot/_Modules/Administration/Commands/CrossServerTextChannel.cs index c08c34ef..512440e3 100644 --- a/src/NadekoBot/_Modules/Administration/Commands/CrossServerTextChannel.cs +++ b/src/NadekoBot/_Modules/Administration/Commands/CrossServerTextChannel.cs @@ -91,7 +91,7 @@ namespace NadekoBot.Modules.Administration.Commands if (!Subscribers.TryGetValue(token, out set)) return; set.Add(e.Channel); - await e.Channel.SendMessage(":ok:").ConfigureAwait(false); + await channel.SendMessageAsync(":ok:").ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "lcsc") @@ -103,7 +103,7 @@ namespace NadekoBot.Modules.Administration.Commands { subscriber.Value.Remove(e.Channel); } - await e.Channel.SendMessage(":ok:").ConfigureAwait(false); + await channel.SendMessageAsync(":ok:").ConfigureAwait(false); }); } } diff --git a/src/NadekoBot/_Modules/Administration/Commands/CustomReactionsCommands.cs b/src/NadekoBot/_Modules/Administration/Commands/CustomReactionsCommands.cs index 2725e196..d0db8dee 100644 --- a/src/NadekoBot/_Modules/Administration/Commands/CustomReactionsCommands.cs +++ b/src/NadekoBot/_Modules/Administration/Commands/CustomReactionsCommands.cs @@ -33,7 +33,7 @@ namespace NadekoBot.Modules.Administration.Commands var message = e.GetArg("message")?.Trim(); if (string.IsNullOrWhiteSpace(message)) { - await e.Channel.SendMessage($"Incorrect command usage. See -h {Prefix}acr for correct formatting").ConfigureAwait(false); + await channel.SendMessageAsync($"Incorrect command usage. See -h {Prefix}acr for correct formatting").ConfigureAwait(false); return; } if (NadekoBot.Config.CustomReactions.ContainsKey(name)) @@ -41,7 +41,7 @@ namespace NadekoBot.Modules.Administration.Commands else NadekoBot.Config.CustomReactions.Add(name, new System.Collections.Generic.List() { message }); await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false); - await e.Channel.SendMessage($"Added {name} : {message}").ConfigureAwait(false); + await channel.SendMessageAsync($"Added {name} : {message}").ConfigureAwait(false); }); @@ -69,12 +69,12 @@ namespace NadekoBot.Modules.Administration.Commands var cmds = GetCustomsOnPage(num - 1); if (!cmds.Any()) { - await e.Channel.SendMessage("`There are no custom reactions.`"); + await channel.SendMessageAsync("`There are no custom reactions.`"); } else { string result = SearchHelper.ShowInPrettyCode(cmds, s => $"{s,-25}"); //People prefer starting with 1 - await e.Channel.SendMessage($"`Showing page {num}:`\n" + result).ConfigureAwait(false); + await channel.SendMessageAsync($"`Showing page {num}:`\n" + result).ConfigureAwait(false); } }); @@ -89,7 +89,7 @@ namespace NadekoBot.Modules.Administration.Commands return; if (!NadekoBot.Config.CustomReactions.ContainsKey(name)) { - await e.Channel.SendMessage("`Can't find that custom reaction.`").ConfigureAwait(false); + await channel.SendMessageAsync("`Can't find that custom reaction.`").ConfigureAwait(false); return; } var items = NadekoBot.Config.CustomReactions[name]; @@ -101,7 +101,7 @@ namespace NadekoBot.Modules.Administration.Commands { message.AppendLine($"[{i++}] " + Format.Code(Format.Escape(reaction))); } - await e.Channel.SendMessage(message.ToString()); + await channel.SendMessageAsync(message.ToString()); }); cgb.CreateCommand(Prefix + "editcustreact") @@ -127,21 +127,21 @@ namespace NadekoBot.Modules.Administration.Commands if (!NadekoBot.Config.CustomReactions.ContainsKey(name)) { - await e.Channel.SendMessage("`Could not find given commandname`").ConfigureAwait(false); + await channel.SendMessageAsync("`Could not find given commandname`").ConfigureAwait(false); return; } int index; if (!int.TryParse(indexstr, out index) || index < 1 || index > NadekoBot.Config.CustomReactions[name].Count) { - await e.Channel.SendMessage("`Invalid index.`").ConfigureAwait(false); + await channel.SendMessageAsync("`Invalid index.`").ConfigureAwait(false); return; } index = index - 1; NadekoBot.Config.CustomReactions[name][index] = msg; await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false); - await e.Channel.SendMessage($"Edited response #{index + 1} from `{name}`").ConfigureAwait(false); + await channel.SendMessageAsync($"Edited response #{index + 1} from `{name}`").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "delcustreact") @@ -157,7 +157,7 @@ namespace NadekoBot.Modules.Administration.Commands return; if (!NadekoBot.Config.CustomReactions.ContainsKey(name)) { - await e.Channel.SendMessage("Could not find given commandname").ConfigureAwait(false); + await channel.SendMessageAsync("Could not find given commandname").ConfigureAwait(false); return; } string message = ""; @@ -167,7 +167,7 @@ namespace NadekoBot.Modules.Administration.Commands index = index - 1; if (index < 0 || index > NadekoBot.Config.CustomReactions[name].Count) { - await e.Channel.SendMessage("Given index was out of range").ConfigureAwait(false); + await channel.SendMessageAsync("Given index was out of range").ConfigureAwait(false); return; } @@ -184,7 +184,7 @@ namespace NadekoBot.Modules.Administration.Commands message = $"Deleted custom reaction: `{name}`"; } await Classes.JSONModels.ConfigHandler.SaveConfig().ConfigureAwait(false); - await e.Channel.SendMessage(message).ConfigureAwait(false); + await channel.SendMessageAsync(message).ConfigureAwait(false); }); } diff --git a/src/NadekoBot/_Modules/Administration/Commands/LogCommand.cs b/src/NadekoBot/_Modules/Administration/Commands/LogCommand.cs index b5f19eb1..c5f144b5 100644 --- a/src/NadekoBot/_Modules/Administration/Commands/LogCommand.cs +++ b/src/NadekoBot/_Modules/Administration/Commands/LogCommand.cs @@ -42,7 +42,7 @@ namespace NadekoBot.Modules.Administration.Commands var usr = e.Message.MentionedUsers.FirstOrDefault(u => u != e.User); if (usr?.Status != UserStatus.Offline) return; - await e.Channel.SendMessage($"User `{usr.Name}` is offline. PM sent.").ConfigureAwait(false); + await channel.SendMessageAsync($"User `{usr.Name}` is offline. PM sent.").ConfigureAwait(false); await usr.SendMessage( $"User `{e.User.Name}` mentioned you on " + $"`{e.Server.Name}` server while you were offline.\n" + @@ -383,10 +383,10 @@ namespace NadekoBot.Modules.Administration.Commands specificConfig.SendPrivateMessageOnMention = !specificConfig.SendPrivateMessageOnMention; if (specificConfig.SendPrivateMessageOnMention) - await e.Channel.SendMessage(":ok: I will send private messages " + + await channel.SendMessageAsync(":ok: I will send private messages " + "to mentioned offline users.").ConfigureAwait(false); else - await e.Channel.SendMessage(":ok: I won't send private messages " + + await channel.SendMessageAsync(":ok: I won't send private messages " + "to mentioned offline users anymore.").ConfigureAwait(false); }); @@ -400,7 +400,7 @@ namespace NadekoBot.Modules.Administration.Commands if (chId == null) { SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel = e.Channel.Id; - await e.Channel.SendMessage($"❗**I WILL BEGIN LOGGING SERVER ACTIVITY IN THIS CHANNEL**❗").ConfigureAwait(false); + await channel.SendMessageAsync($"❗**I WILL BEGIN LOGGING SERVER ACTIVITY IN THIS CHANNEL**❗").ConfigureAwait(false); return; } Channel ch; @@ -408,7 +408,7 @@ namespace NadekoBot.Modules.Administration.Commands return; SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel = null; - await e.Channel.SendMessage($"❗**NO LONGER LOGGING IN {ch.Mention} CHANNEL**❗").ConfigureAwait(false); + await channel.SendMessageAsync($"❗**NO LONGER LOGGING IN {ch.Mention} CHANNEL**❗").ConfigureAwait(false); }); @@ -421,12 +421,12 @@ namespace NadekoBot.Modules.Administration.Commands var config = SpecificConfigurations.Default.Of(e.Server.Id); if (config.LogserverIgnoreChannels.Remove(e.Channel.Id)) { - await e.Channel.SendMessage($"`{Prefix}logserver will stop ignoring this channel.`"); + await channel.SendMessageAsync($"`{Prefix}logserver will stop ignoring this channel.`"); } else { config.LogserverIgnoreChannels.Add(e.Channel.Id); - await e.Channel.SendMessage($"`{Prefix}logserver will ignore this channel.`"); + await channel.SendMessageAsync($"`{Prefix}logserver will ignore this channel.`"); } }); @@ -439,11 +439,11 @@ namespace NadekoBot.Modules.Administration.Commands if (chId == null) { SpecificConfigurations.Default.Of(e.Server.Id).LogPresenceChannel = e.Channel.Id; - await e.Channel.SendMessage($"**User presence notifications enabled.**").ConfigureAwait(false); + await channel.SendMessageAsync($"**User presence notifications enabled.**").ConfigureAwait(false); return; } SpecificConfigurations.Default.Of(e.Server.Id).LogPresenceChannel = null; - await e.Channel.SendMessage($"**User presence notifications disabled.**").ConfigureAwait(false); + await channel.SendMessageAsync($"**User presence notifications disabled.**").ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "voicepresence") @@ -460,23 +460,23 @@ namespace NadekoBot.Modules.Administration.Commands { config.VoiceChannelLog.TryAdd(voiceChannel.Id, e.Channel.Id); } - await e.Channel.SendMessage("Started logging user presence for **ALL** voice channels!").ConfigureAwait(false); + await channel.SendMessageAsync("Started logging user presence for **ALL** voice channels!").ConfigureAwait(false); return; } if (e.User.VoiceChannel == null) { - await e.Channel.SendMessage("💢 You are not in a voice channel right now. If you are, please rejoin it.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 You are not in a voice channel right now. If you are, please rejoin it.").ConfigureAwait(false); return; } ulong throwaway; if (!config.VoiceChannelLog.TryRemove(e.User.VoiceChannel.Id, out throwaway)) { config.VoiceChannelLog.TryAdd(e.User.VoiceChannel.Id, e.Channel.Id); - await e.Channel.SendMessage($"`Logging user updates for` {e.User.VoiceChannel.Mention} `voice channel.`").ConfigureAwait(false); + await channel.SendMessageAsync($"`Logging user updates for` {e.User.VoiceChannel.Mention} `voice channel.`").ConfigureAwait(false); } else - await e.Channel.SendMessage($"`Stopped logging user updates for` {e.User.VoiceChannel.Mention} `voice channel.`").ConfigureAwait(false); + await channel.SendMessageAsync($"`Stopped logging user updates for` {e.User.VoiceChannel.Mention} `voice channel.`").ConfigureAwait(false); }); } } diff --git a/src/NadekoBot/_Modules/Administration/Commands/MessageRepeater.cs b/src/NadekoBot/_Modules/Administration/Commands/MessageRepeater.cs index e87f5555..99f8ab4f 100644 --- a/src/NadekoBot/_Modules/Administration/Commands/MessageRepeater.cs +++ b/src/NadekoBot/_Modules/Administration/Commands/MessageRepeater.cs @@ -64,7 +64,7 @@ namespace NadekoBot.Modules.Administration.Commands Repeater rep; if (!repeaters.TryGetValue(e.Server, out rep)) { - await e.Channel.SendMessage("`No repeating message found on this server.`"); + await channel.SendMessageAsync("`No repeating message found on this server.`"); return; } @@ -90,13 +90,13 @@ namespace NadekoBot.Modules.Administration.Commands if (!repeaters.TryRemove(e.Server, out rep)) return; rep.MessageTimer.Stop(); - await e.Channel.SendMessage("Repeating disabled").ConfigureAwait(false); + await channel.SendMessageAsync("Repeating disabled").ConfigureAwait(false); return; } int minutes; if (!int.TryParse(minutesStr, out minutes) || minutes < 1 || minutes > 1440) { - await e.Channel.SendMessage("Invalid value").ConfigureAwait(false); + await channel.SendMessageAsync("Invalid value").ConfigureAwait(false); return; } @@ -117,7 +117,7 @@ namespace NadekoBot.Modules.Administration.Commands repeater.MessageTimer.Stop(); repeater.MessageTimer.Start(); - await e.Channel.SendMessage(String.Format("👌 Repeating `{0}` every " + + await channel.SendMessageAsync(String.Format("👌 Repeating `{0}` every " + "**{1}** minutes on {2} channel.", repeater.RepeatingMessage, minutes, repeater.RepeatingChannel)) .ConfigureAwait(false); diff --git a/src/NadekoBot/_Modules/Administration/Commands/PlayingRotate.cs b/src/NadekoBot/_Modules/Administration/Commands/PlayingRotate.cs index c1caa0bc..cc48fb10 100644 --- a/src/NadekoBot/_Modules/Administration/Commands/PlayingRotate.cs +++ b/src/NadekoBot/_Modules/Administration/Commands/PlayingRotate.cs @@ -89,7 +89,7 @@ namespace NadekoBot.Modules.Administration.Commands finally { playingPlaceholderLock.Release(); } - await e.Channel.SendMessage($"❗`Rotating playing status has been {(timer.Enabled ? "enabled" : "disabled")}.`").ConfigureAwait(false); + await channel.SendMessageAsync($"❗`Rotating playing status has been {(timer.Enabled ? "enabled" : "disabled")}.`").ConfigureAwait(false); }; internal override void Init(CommandGroupBuilder cgb) @@ -121,7 +121,7 @@ namespace NadekoBot.Modules.Administration.Commands { playingPlaceholderLock.Release(); } - await e.Channel.SendMessage("🆗 `Added a new playing string.`").ConfigureAwait(false); + await channel.SendMessageAsync("🆗 `Added a new playing string.`").ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "listplaying") @@ -131,14 +131,14 @@ namespace NadekoBot.Modules.Administration.Commands .Do(async e => { if (NadekoBot.Config.RotatingStatuses.Count == 0) - await e.Channel.SendMessage("`There are no playing strings. " + + await channel.SendMessageAsync("`There are no playing strings. " + "Add some with .addplaying [text] command.`").ConfigureAwait(false); var sb = new StringBuilder(); for (var i = 0; i < NadekoBot.Config.RotatingStatuses.Count; i++) { sb.AppendLine($"`{i + 1}.` {NadekoBot.Config.RotatingStatuses[i]}"); } - await e.Channel.SendMessage(sb.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync(sb.ToString()).ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "removeplaying") @@ -160,7 +160,7 @@ namespace NadekoBot.Modules.Administration.Commands await ConfigHandler.SaveConfig().ConfigureAwait(false); } finally { playingPlaceholderLock.Release(); } - await e.Channel.SendMessage($"🆗 `Removed playing string #{num}`({str})").ConfigureAwait(false); + await channel.SendMessageAsync($"🆗 `Removed playing string #{num}`({str})").ConfigureAwait(false); }); } } diff --git a/src/NadekoBot/_Modules/Administration/Commands/RatelimitCommand.cs b/src/NadekoBot/_Modules/Administration/Commands/RatelimitCommand.cs index d1f62bd9..89f26aab 100644 --- a/src/NadekoBot/_Modules/Administration/Commands/RatelimitCommand.cs +++ b/src/NadekoBot/_Modules/Administration/Commands/RatelimitCommand.cs @@ -48,12 +48,12 @@ namespace NadekoBot.Modules.Administration.Commands ConcurrentDictionary throwaway; if (RatelimitingChannels.TryRemove(e.Channel.Id, out throwaway)) { - await e.Channel.SendMessage("Slow mode disabled.").ConfigureAwait(false); + await channel.SendMessageAsync("Slow mode disabled.").ConfigureAwait(false); return; } if (RatelimitingChannels.TryAdd(e.Channel.Id, new ConcurrentDictionary())) { - await e.Channel.SendMessage("Slow mode initiated. " + + await channel.SendMessageAsync("Slow mode initiated. " + "Users can't send more than 1 message every 5 seconds.") .ConfigureAwait(false); } diff --git a/src/NadekoBot/_Modules/Administration/Commands/SelfAssignedRolesCommand.cs b/src/NadekoBot/_Modules/Administration/Commands/SelfAssignedRolesCommand.cs index 8e5e54fb..a7fafcb6 100644 --- a/src/NadekoBot/_Modules/Administration/Commands/SelfAssignedRolesCommand.cs +++ b/src/NadekoBot/_Modules/Administration/Commands/SelfAssignedRolesCommand.cs @@ -40,7 +40,7 @@ namespace NadekoBot.Modules.Administration.Commands msg.AppendLine($":ok:Role **{role.Name}** added to the list."); } } - await e.Channel.SendMessage(msg.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync(msg.ToString()).ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "rsar") @@ -55,17 +55,17 @@ namespace NadekoBot.Modules.Administration.Commands var role = e.Server.FindRoles(roleName).FirstOrDefault(); if (role == null) { - await e.Channel.SendMessage(":anger:That role does not exist.").ConfigureAwait(false); + await channel.SendMessageAsync(":anger:That role does not exist.").ConfigureAwait(false); return; } var config = SpecificConfigurations.Default.Of(e.Server.Id); if (!config.ListOfSelfAssignableRoles.Contains(role.Id)) { - await e.Channel.SendMessage(":anger:That role is not self-assignable.").ConfigureAwait(false); + await channel.SendMessageAsync(":anger:That role is not self-assignable.").ConfigureAwait(false); return; } config.ListOfSelfAssignableRoles.Remove(role.Id); - await e.Channel.SendMessage($":ok:**{role.Name}** has been removed from the list of self-assignable roles").ConfigureAwait(false); + await channel.SendMessageAsync($":ok:**{role.Name}** has been removed from the list of self-assignable roles").ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "lsar") @@ -93,7 +93,7 @@ namespace NadekoBot.Modules.Administration.Commands { config.ListOfSelfAssignableRoles.Remove(id); } - await e.Channel.SendMessage(msg.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync(msg.ToString()).ConfigureAwait(false); }); @@ -106,7 +106,7 @@ namespace NadekoBot.Modules.Administration.Commands var config = SpecificConfigurations.Default.Of(e.Server.Id); config.ExclusiveSelfAssignedRoles = !config.ExclusiveSelfAssignedRoles; string exl = config.ExclusiveSelfAssignedRoles ? "exclusive" : "not exclusive"; - await e.Channel.SendMessage("Self assigned roles are now " + exl); + await channel.SendMessageAsync("Self assigned roles are now " + exl); }); cgb.CreateCommand(Module.Prefix + "iam") @@ -122,24 +122,24 @@ namespace NadekoBot.Modules.Administration.Commands var role = e.Server.FindRoles(roleName).FirstOrDefault(); if (role == null) { - await e.Channel.SendMessage(":anger:That role does not exist.").ConfigureAwait(false); + await channel.SendMessageAsync(":anger:That role does not exist.").ConfigureAwait(false); return; } var config = SpecificConfigurations.Default.Of(e.Server.Id); if (!config.ListOfSelfAssignableRoles.Contains(role.Id)) { - await e.Channel.SendMessage(":anger:That role is not self-assignable.").ConfigureAwait(false); + await channel.SendMessageAsync(":anger:That role is not self-assignable.").ConfigureAwait(false); return; } if (e.User.HasRole(role)) { - await e.Channel.SendMessage($":anger:You already have {role.Name} role.").ConfigureAwait(false); + await channel.SendMessageAsync($":anger:You already have {role.Name} role.").ConfigureAwait(false); return; } var sameRoles = e.User.Roles.Where(r => config.ListOfSelfAssignableRoles.Contains(r.Id)); if (config.ExclusiveSelfAssignedRoles && sameRoles.Any()) { - await e.Channel.SendMessage($":anger:You already have {sameRoles.FirstOrDefault().Name} role.").ConfigureAwait(false); + await channel.SendMessageAsync($":anger:You already have {sameRoles.FirstOrDefault().Name} role.").ConfigureAwait(false); return; } try @@ -151,10 +151,10 @@ namespace NadekoBot.Modules.Administration.Commands } catch (Exception ex) { - await e.Channel.SendMessage($":anger:`I am unable to add that role to you. I can't add roles to owners or other roles higher than my role in the role hierarchy.`").ConfigureAwait(false); + await channel.SendMessageAsync($":anger:`I am unable to add that role to you. I can't add roles to owners or other roles higher than my role in the role hierarchy.`").ConfigureAwait(false); return; } - var msg = await e.Channel.SendMessage($":ok:You now have {role.Name} role.").ConfigureAwait(false); + var msg = await channel.SendMessageAsync($":ok:You now have {role.Name} role.").ConfigureAwait(false); await Task.Delay(3000).ConfigureAwait(false); await msg.Delete().ConfigureAwait(false); try @@ -178,22 +178,22 @@ namespace NadekoBot.Modules.Administration.Commands var role = e.Server.FindRoles(roleName).FirstOrDefault(); if (role == null) { - await e.Channel.SendMessage(":anger:That role does not exist.").ConfigureAwait(false); + await channel.SendMessageAsync(":anger:That role does not exist.").ConfigureAwait(false); return; } var config = SpecificConfigurations.Default.Of(e.Server.Id); if (!config.ListOfSelfAssignableRoles.Contains(role.Id)) { - await e.Channel.SendMessage(":anger:That role is not self-assignable.").ConfigureAwait(false); + await channel.SendMessageAsync(":anger:That role is not self-assignable.").ConfigureAwait(false); return; } if (!e.User.HasRole(role)) { - await e.Channel.SendMessage($":anger:You don't have {role.Name} role.").ConfigureAwait(false); + await channel.SendMessageAsync($":anger:You don't have {role.Name} role.").ConfigureAwait(false); return; } await e.User.RemoveRoles(role).ConfigureAwait(false); - var msg = await e.Channel.SendMessage($":ok:Successfuly removed {role.Name} role from you.").ConfigureAwait(false); + var msg = await channel.SendMessageAsync($":ok:Successfuly removed {role.Name} role from you.").ConfigureAwait(false); await Task.Delay(3000).ConfigureAwait(false); await msg.Delete().ConfigureAwait(false); try diff --git a/src/NadekoBot/_Modules/Administration/Commands/SelfCommands.cs b/src/NadekoBot/_Modules/Administration/Commands/SelfCommands.cs index f8019ac9..b1effafb 100644 --- a/src/NadekoBot/_Modules/Administration/Commands/SelfCommands.cs +++ b/src/NadekoBot/_Modules/Administration/Commands/SelfCommands.cs @@ -24,7 +24,7 @@ namespace NadekoBot.Modules.Administration.Commands NadekoBot.Client.FindServers(arg).FirstOrDefault(); if (server == null) { - await e.Channel.SendMessage("Cannot find that server").ConfigureAwait(false); + await channel.SendMessageAsync("Cannot find that server").ConfigureAwait(false); return; } if (!server.IsOwner) diff --git a/src/NadekoBot/_Modules/Administration/Commands/ServerGreetCommand.cs b/src/NadekoBot/_Modules/Administration/Commands/ServerGreetCommand.cs index b2cdf3b4..85bb1ba3 100644 --- a/src/NadekoBot/_Modules/Administration/Commands/ServerGreetCommand.cs +++ b/src/NadekoBot/_Modules/Administration/Commands/ServerGreetCommand.cs @@ -226,9 +226,9 @@ namespace NadekoBot.Modules.Administration.Commands var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id)); if (ann.ToggleDelete()) - await e.Channel.SendMessage("`Automatic deletion of greet and bye messages has been enabled.`").ConfigureAwait(false); + await channel.SendMessageAsync("`Automatic deletion of greet and bye messages has been enabled.`").ConfigureAwait(false); else - await e.Channel.SendMessage("`Automatic deletion of greet and bye messages has been disabled.`").ConfigureAwait(false); + await channel.SendMessageAsync("`Automatic deletion of greet and bye messages has been disabled.`").ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "greet") @@ -239,9 +239,9 @@ namespace NadekoBot.Modules.Administration.Commands var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id)); if (ann.ToggleGreet(e.Channel.Id)) - await e.Channel.SendMessage("Greet announcements enabled on this channel.").ConfigureAwait(false); + await channel.SendMessageAsync("Greet announcements enabled on this channel.").ConfigureAwait(false); else - await e.Channel.SendMessage("Greet announcements disabled.").ConfigureAwait(false); + await channel.SendMessageAsync("Greet announcements disabled.").ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "greetmsg") @@ -253,15 +253,15 @@ namespace NadekoBot.Modules.Administration.Commands var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id)); if (string.IsNullOrWhiteSpace(e.GetArg("msg"))) { - await e.Channel.SendMessage("`Current greet message:` " + ann.GreetText); + await channel.SendMessageAsync("`Current greet message:` " + ann.GreetText); return; } ann.GreetText = e.GetArg("msg"); - await e.Channel.SendMessage("New greet message set.").ConfigureAwait(false); + await channel.SendMessageAsync("New greet message set.").ConfigureAwait(false); if (!ann.Greet) - await e.Channel.SendMessage("Enable greet messsages by typing `.greet`").ConfigureAwait(false); + await channel.SendMessageAsync("Enable greet messsages by typing `.greet`").ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "bye") @@ -272,9 +272,9 @@ namespace NadekoBot.Modules.Administration.Commands var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id)); if (ann.ToggleBye(e.Channel.Id)) - await e.Channel.SendMessage("Bye announcements enabled on this channel.").ConfigureAwait(false); + await channel.SendMessageAsync("Bye announcements enabled on this channel.").ConfigureAwait(false); else - await e.Channel.SendMessage("Bye announcements disabled.").ConfigureAwait(false); + await channel.SendMessageAsync("Bye announcements disabled.").ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "byemsg") @@ -286,14 +286,14 @@ namespace NadekoBot.Modules.Administration.Commands var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id)); if (string.IsNullOrWhiteSpace(e.GetArg("msg"))) { - await e.Channel.SendMessage("`Current bye message:` " + ann.ByeText); + await channel.SendMessageAsync("`Current bye message:` " + ann.ByeText); return; } ann.ByeText = e.GetArg("msg"); - await e.Channel.SendMessage("New bye message set.").ConfigureAwait(false); + await channel.SendMessageAsync("New bye message set.").ConfigureAwait(false); if (!ann.Bye) - await e.Channel.SendMessage("Enable bye messsages by typing `.bye`.").ConfigureAwait(false); + await channel.SendMessageAsync("Enable bye messsages by typing `.bye`.").ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "byepm") @@ -305,11 +305,11 @@ namespace NadekoBot.Modules.Administration.Commands if (ann.ToggleByePM()) - await e.Channel.SendMessage("Bye messages will be sent in a PM from now on.\n ⚠ Keep in mind this might fail if the user and the bot have no common servers after the user leaves.").ConfigureAwait(false); + await channel.SendMessageAsync("Bye messages will be sent in a PM from now on.\n ⚠ Keep in mind this might fail if the user and the bot have no common servers after the user leaves.").ConfigureAwait(false); else - await e.Channel.SendMessage("Bye messages will be sent in a bound channel from now on.").ConfigureAwait(false); + await channel.SendMessageAsync("Bye messages will be sent in a bound channel from now on.").ConfigureAwait(false); if (!ann.Bye) - await e.Channel.SendMessage("Enable bye messsages by typing `.bye`, and set the bye message using `.byemsg`").ConfigureAwait(false); + await channel.SendMessageAsync("Enable bye messsages by typing `.bye`, and set the bye message using `.byemsg`").ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "greetpm") @@ -321,11 +321,11 @@ namespace NadekoBot.Modules.Administration.Commands var ann = AnnouncementsDictionary.GetOrAdd(e.Server.Id, new AnnounceControls(e.Server.Id)); if (ann.ToggleGreetPM()) - await e.Channel.SendMessage("Greet messages will be sent in a PM from now on.").ConfigureAwait(false); + await channel.SendMessageAsync("Greet messages will be sent in a PM from now on.").ConfigureAwait(false); else - await e.Channel.SendMessage("Greet messages will be sent in a bound channel from now on.").ConfigureAwait(false); + await channel.SendMessageAsync("Greet messages will be sent in a bound channel from now on.").ConfigureAwait(false); if (!ann.Greet) - await e.Channel.SendMessage("Enable greet messsages by typing `.greet`, and set the greet message using `.greetmsg`").ConfigureAwait(false); + await channel.SendMessageAsync("Enable greet messsages by typing `.greet`, and set the greet message using `.greetmsg`").ConfigureAwait(false); }); } } diff --git a/src/NadekoBot/_Modules/Administration/Commands/VoicePlusTextCommand.cs b/src/NadekoBot/_Modules/Administration/Commands/VoicePlusTextCommand.cs index 4c6a948c..507706a1 100644 --- a/src/NadekoBot/_Modules/Administration/Commands/VoicePlusTextCommand.cs +++ b/src/NadekoBot/_Modules/Administration/Commands/VoicePlusTextCommand.cs @@ -95,7 +95,7 @@ namespace NadekoBot.Modules.Administration.Commands { if (!e.Server.CurrentUser.ServerPermissions.ManageChannels) { - await e.Channel.SendMessage("`I have insufficient permission to do that.`"); + await channel.SendMessageAsync("`I have insufficient permission to do that.`"); return; } @@ -114,7 +114,7 @@ namespace NadekoBot.Modules.Administration.Commands await Task.Delay(500); } - await e.Channel.SendMessage("`Done.`"); + await channel.SendMessageAsync("`Done.`"); }); cgb.CreateCommand(Module.Prefix + "voice+text") @@ -139,24 +139,24 @@ namespace NadekoBot.Modules.Administration.Commands } catch { - await e.Channel.SendMessage( + await channel.SendMessageAsync( ":anger: Error: Most likely i don't have permissions to do this.") .ConfigureAwait(false); return; } } - await e.Channel.SendMessage("Successfuly removed voice + text feature.").ConfigureAwait(false); + await channel.SendMessageAsync("Successfuly removed voice + text feature.").ConfigureAwait(false); return; } config.VoicePlusTextEnabled = true; - await e.Channel.SendMessage("Successfuly enabled voice + text feature. " + + await channel.SendMessageAsync("Successfuly enabled voice + text feature. " + "**Make sure the bot has manage roles and manage channels permissions**") .ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage(ex.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync(ex.ToString()).ConfigureAwait(false); } }); } diff --git a/src/NadekoBot/_Modules/ClashOfClans/ClashOfClansModule.cs b/src/NadekoBot/_Modules/ClashOfClans/ClashOfClansModule.cs deleted file mode 100644 index 449c4da6..00000000 --- a/src/NadekoBot/_Modules/ClashOfClans/ClashOfClansModule.cs +++ /dev/null @@ -1,418 +0,0 @@ -using Discord.Commands; -using Discord.Modules; -using NadekoBot.Classes.ClashOfClans; -using NadekoBot.Modules.Permissions.Classes; -using Newtonsoft.Json; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace NadekoBot.Modules.ClashOfClans -{ - internal class ClashOfClansModule : DiscordModule - { - public override string Prefix { get; } = NadekoBot.Config.CommandPrefixes.ClashOfClans; - - public static ConcurrentDictionary> ClashWars { get; set; } = new ConcurrentDictionary>(); - - private readonly object writeLock = new object(); - - public ClashOfClansModule() - { - NadekoBot.OnReady += () => Task.Run(async () => - { - if (File.Exists("data/clashofclans/wars.json")) - { - try - { - var content = File.ReadAllText("data/clashofclans/wars.json"); - - var dict = JsonConvert.DeserializeObject>>(content); - - foreach (var cw in dict) - { - cw.Value.ForEach(war => - { - war.Channel = NadekoBot.Client.GetServer(war.ServerId)?.GetChannel(war.ChannelId); - if (war.Channel == null) - { - cw.Value.Remove(war); - } - } - ); - } - //urgh - ClashWars = new ConcurrentDictionary>(dict); - } - catch (Exception e) - { - Console.WriteLine("Could not load coc wars: " + e.Message); - } - - - } - //Can't this be disabled if the modules is disabled too :) - var callExpire = new TimeSpan(2, 0, 0); - var warExpire = new TimeSpan(23, 0, 0); - while (true) - { - try - { - var hash = ClashWars.GetHashCode(); - foreach (var cw in ClashWars) - { - foreach (var war in cw.Value) - { - await CheckWar(callExpire, war); - } - List newVal = new List(); - foreach (var w in cw.Value) - { - //We add when A: the war is not ended - if (w.WarState != WarState.Ended) - { - //and B: the war has not expired - if ((w.WarState == WarState.Started && DateTime.UtcNow - w.StartedAt <= warExpire) || w.WarState == WarState.Created) - { - newVal.Add(w); - } - } - } - //var newVal = cw.Value.Where(w => !(w.Ended || DateTime.UtcNow - w.StartedAt >= warExpire)).ToList(); - foreach (var exWar in cw.Value.Except(newVal)) - { - await exWar.Channel.SendMessage($"War against {exWar.EnemyClan} ({exWar.Size}v{exWar.Size}) has ended"); - } - - if (newVal.Count == 0) - { - List obj; - ClashWars.TryRemove(cw.Key, out obj); - } - else - { - ClashWars.AddOrUpdate(cw.Key, newVal, (x, s) => newVal); - } - } - if (hash != ClashWars.GetHashCode()) //something changed - { - Save(); - } - - - } - catch { } - await Task.Delay(5000); - } - }); - } - - private static void Save() - { - try - { - Directory.CreateDirectory("data/clashofclans"); - File.WriteAllText("data/clashofclans/wars.json", JsonConvert.SerializeObject(ClashWars, Formatting.Indented)); - } - catch (Exception e) - { - Console.WriteLine(e.Message); - } - } - - private static async Task CheckWar(TimeSpan callExpire, ClashWar war) - { - var Bases = war.Bases; - for (var i = 0; i < Bases.Length; i++) - { - if (Bases[i] == null) continue; - if (!Bases[i].BaseDestroyed && DateTime.UtcNow - Bases[i].TimeAdded >= callExpire) - { - await war.Channel.SendMessage($"❗🔰**Claim from @{Bases[i].CallUser} for a war against {war.ShortPrint()} has expired.**").ConfigureAwait(false); - Bases[i] = null; - } - } - } - - #region commands - public override void Install(ModuleManager manager) - { - manager.CreateCommands("", cgb => - { - - cgb.AddCheck(PermissionChecker.Instance); - - cgb.CreateCommand(Prefix + "createwar") - .Alias(Prefix + "cw") - .Description($"Creates a new war by specifying a size (>10 and multiple of 5) and enemy clan name. | `{Prefix}cw 15 The Enemy Clan`") - .Parameter("size") - .Parameter("enemy_clan", ParameterType.Unparsed) - .Do(async e => - { - if (!e.User.ServerPermissions.ManageChannels) - return; - var enemyClan = e.GetArg("enemy_clan"); - if (string.IsNullOrWhiteSpace(enemyClan)) - { - return; - } - int size; - if (!int.TryParse(e.GetArg("size"), out size) || size < 10 || size > 50 || size % 5 != 0) - { - await e.Channel.SendMessage("💢🔰 Not a Valid war size").ConfigureAwait(false); - return; - } - List wars; - if (!ClashWars.TryGetValue(e.Server.Id, out wars)) - { - wars = new List(); - if (!ClashWars.TryAdd(e.Server.Id, wars)) - return; - } - - - var cw = new ClashWar(enemyClan, size, e.Server.Id, e.Channel.Id); - //cw.Start(); - - wars.Add(cw); - await e.Channel.SendMessage($"❗🔰**CREATED CLAN WAR AGAINST {cw.ShortPrint()}**").ConfigureAwait(false); - Save(); - //war with the index X started. - }); - - cgb.CreateCommand(Prefix + "startwar") - .Alias(Prefix + "sw") - .Description("Starts a war with a given number. | `{Prefix}sw 15`") - .Parameter("number", ParameterType.Required) - .Do(async e => - { - var warsInfo = GetInfo(e); - if (warsInfo == null) - { - await e.Channel.SendMessage("💢🔰 **That war does not exist.**").ConfigureAwait(false); - return; - } - var war = warsInfo.Item1[warsInfo.Item2]; - try - { - war.Start(); - await e.Channel.SendMessage($"🔰**STARTED WAR AGAINST {war.ShortPrint()}**").ConfigureAwait(false); - } - catch - { - await e.Channel.SendMessage($"🔰**WAR AGAINST {war.ShortPrint()} HAS ALREADY STARTED**").ConfigureAwait(false); - } - Save(); - }); - - cgb.CreateCommand(Prefix + "listwar") - .Alias(Prefix + "lw") - .Description($"Shows the active war claims by a number. Shows all wars in a short way if no number is specified. | `{Prefix}lw [war_number] or {Prefix}lw`") - .Parameter("number", ParameterType.Optional) - .Do(async e => - { - // if number is null, print all wars in a short way - if (string.IsNullOrWhiteSpace(e.GetArg("number"))) - { - //check if there are any wars - List wars = null; - ClashWars.TryGetValue(e.Server.Id, out wars); - if (wars == null || wars.Count == 0) - { - await e.Channel.SendMessage("🔰 **No active wars.**").ConfigureAwait(false); - return; - } - - var sb = new StringBuilder(); - sb.AppendLine("🔰 **LIST OF ACTIVE WARS**"); - sb.AppendLine("**-------------------------**"); - for (var i = 0; i < wars.Count; i++) - { - sb.AppendLine($"**#{i + 1}.** `Enemy:` **{wars[i].EnemyClan}**"); - sb.AppendLine($"\t\t`Size:` **{wars[i].Size} v {wars[i].Size}**"); - sb.AppendLine("**-------------------------**"); - } - await e.Channel.SendMessage(sb.ToString()).ConfigureAwait(false); - return; - - } - //if number is not null, print the war needed - var warsInfo = GetInfo(e); - if (warsInfo == null) - { - await e.Channel.SendMessage("💢🔰 **That war does not exist.**").ConfigureAwait(false); - return; - } - await e.Channel.SendMessage(warsInfo.Item1[warsInfo.Item2].ToString()).ConfigureAwait(false); - }); - - cgb.CreateCommand(Prefix + "claim") - .Alias(Prefix + "call") - .Alias(Prefix + "c") - .Description($"Claims a certain base from a certain war. You can supply a name in the third optional argument to claim in someone else's place. | `{Prefix}call [war_number] [base_number] [optional_other_name]`") - .Parameter("number") - .Parameter("baseNumber") - .Parameter("other_name", ParameterType.Unparsed) - .Do(async e => - { - var warsInfo = GetInfo(e); - if (warsInfo == null || warsInfo.Item1.Count == 0) - { - await e.Channel.SendMessage("💢🔰 **That war does not exist.**").ConfigureAwait(false); - return; - } - int baseNum; - if (!int.TryParse(e.GetArg("baseNumber"), out baseNum)) - { - await e.Channel.SendMessage("💢🔰 **Invalid base number.**").ConfigureAwait(false); - return; - } - var usr = - string.IsNullOrWhiteSpace(e.GetArg("other_name")) ? - e.User.Name : - e.GetArg("other_name"); - try - { - var war = warsInfo.Item1[warsInfo.Item2]; - war.Call(usr, baseNum - 1); - await e.Channel.SendMessage($"🔰**{usr}** claimed a base #{baseNum} for a war against {war.ShortPrint()}").ConfigureAwait(false); - Save(); - } - catch (Exception ex) - { - await e.Channel.SendMessage($"💢🔰 {ex.Message}").ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "claimfinish") - .Alias(Prefix + "cf") - .Alias(Prefix + "cf3") - .Alias(Prefix + "claimfinish3") - .Description($"Finish your claim with 3 stars if you destroyed a base. Optional second argument finishes for someone else. | `{Prefix}cf [war_number] [optional_other_name]`") - .Parameter("number", ParameterType.Required) - .Parameter("other_name", ParameterType.Unparsed) - .Do(e => FinishClaim(e)); - - cgb.CreateCommand(Prefix + "claimfinish2") - .Alias(Prefix + "cf2") - .Description($"Finish your claim with 2 stars if you destroyed a base. Optional second argument finishes for someone else. | `{Prefix}cf [war_number] [optional_other_name]`") - .Parameter("number", ParameterType.Required) - .Parameter("other_name", ParameterType.Unparsed) - .Do(e => FinishClaim(e, 2)); - - cgb.CreateCommand(Prefix + "claimfinish1") - .Alias(Prefix + "cf1") - .Description($"Finish your claim with 1 stars if you destroyed a base. Optional second argument finishes for someone else. | `{Prefix}cf [war_number] [optional_other_name]`") - .Parameter("number", ParameterType.Required) - .Parameter("other_name", ParameterType.Unparsed) - .Do(e => FinishClaim(e, 1)); - - cgb.CreateCommand(Prefix + "unclaim") - .Alias(Prefix + "uncall") - .Alias(Prefix + "uc") - .Description($"Removes your claim from a certain war. Optional second argument denotes a person in whose place to unclaim | `{Prefix}uc [war_number] [optional_other_name]`") - .Parameter("number", ParameterType.Required) - .Parameter("other_name", ParameterType.Unparsed) - .Do(async e => - { - var warsInfo = GetInfo(e); - if (warsInfo == null || warsInfo.Item1.Count == 0) - { - await e.Channel.SendMessage("💢🔰 **That war does not exist.**").ConfigureAwait(false); - return; - } - var usr = - string.IsNullOrWhiteSpace(e.GetArg("other_name")) ? - e.User.Name : - e.GetArg("other_name"); - try - { - var war = warsInfo.Item1[warsInfo.Item2]; - var baseNumber = war.Uncall(usr); - await e.Channel.SendMessage($"🔰 @{usr} has **UNCLAIMED** a base #{baseNumber + 1} from a war against {war.ShortPrint()}").ConfigureAwait(false); - Save(); - } - catch (Exception ex) - { - await e.Channel.SendMessage($"💢🔰 {ex.Message}").ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "endwar") - .Alias(Prefix + "ew") - .Description($"Ends the war with a given index. | `{Prefix}ew [war_number]`") - .Parameter("number") - .Do(async e => - { - var warsInfo = GetInfo(e); - if (warsInfo == null) - { - await e.Channel.SendMessage("💢🔰 That war does not exist.").ConfigureAwait(false); - return; - } - warsInfo.Item1[warsInfo.Item2].End(); - await e.Channel.SendMessage($"❗🔰**War against {warsInfo.Item1[warsInfo.Item2].ShortPrint()} ended.**").ConfigureAwait(false); - - var size = warsInfo.Item1[warsInfo.Item2].Size; - warsInfo.Item1.RemoveAt(warsInfo.Item2); - Save(); - }); - }); - - } - #endregion - - - private async Task FinishClaim(CommandEventArgs e, int stars = 3) - { - var warInfo = GetInfo(e); - if (warInfo == null || warInfo.Item1.Count == 0) - { - await e.Channel.SendMessage("💢🔰 **That war does not exist.**").ConfigureAwait(false); - return; - } - var usr = - string.IsNullOrWhiteSpace(e.GetArg("other_name")) ? - e.User.Name : - e.GetArg("other_name"); - - var war = warInfo.Item1[warInfo.Item2]; - try - { - var baseNum = war.FinishClaim(usr, stars); - await e.Channel.SendMessage($"❗🔰{e.User.Mention} **DESTROYED** a base #{baseNum + 1} in a war against {war.ShortPrint()}").ConfigureAwait(false); - Save(); - } - catch (Exception ex) - { - await e.Channel.SendMessage($"💢🔰 {ex.Message}").ConfigureAwait(false); - } - } - - private static Tuple, int> GetInfo(CommandEventArgs e) - { - //check if there are any wars - List wars = null; - ClashWars.TryGetValue(e.Server.Id, out wars); - if (wars == null || wars.Count == 0) - { - return null; - } - // get the number of the war - int num; - if (string.IsNullOrWhiteSpace(e.GetArg("number"))) - num = 0; - else if (!int.TryParse(e.GetArg("number"), out num) || num > wars.Count) - { - return null; - } - num -= 1; - //get the actual war - return new Tuple, int>(wars, num); - } - } -} diff --git a/src/NadekoBot/_Modules/Conversations/Commands/RipCommand.cs b/src/NadekoBot/_Modules/Conversations/Commands/RipCommand.cs deleted file mode 100644 index 9c4842bf..00000000 --- a/src/NadekoBot/_Modules/Conversations/Commands/RipCommand.cs +++ /dev/null @@ -1,120 +0,0 @@ -using NadekoBot.Classes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Discord.Commands; -using System.Drawing; -using System.Drawing.Drawing2D; -using NadekoBot.Properties; -using System.IO; -using System.Drawing.Imaging; -using NadekoBot.Extensions; - -namespace NadekoBot.Modules.Conversations.Commands -{ - class RipCommand : DiscordCommand - { - public RipCommand(DiscordModule module) : base(module) - { - } - - internal override void Init(CommandGroupBuilder cgb) - { - cgb.CreateCommand("rip") - .Description("Shows a grave image of someone with a start year | `@NadekoBot rip @Someone 2000`") - .Parameter("user", ParameterType.Required) - .Parameter("year", ParameterType.Optional) - .Do(async e => - { - if (string.IsNullOrWhiteSpace(e.GetArg("user"))) - return; - var usr = e.Channel.FindUsers(e.GetArg("user")).FirstOrDefault(); - var text = ""; - Stream file; - if (usr == null) - { - text = e.GetArg("user"); - file = RipName(text, string.IsNullOrWhiteSpace(e.GetArg("year")) - ? null - : e.GetArg("year")); - } - else - { - var avatar = await GetAvatar(usr.AvatarUrl); - text = usr.Name; - file = RipUser(text, avatar, string.IsNullOrWhiteSpace(e.GetArg("year")) - ? null - : e.GetArg("year")); - } - await e.Channel.SendFile("ripzor_m8.png", - file); - }); - } - - - /// - /// Create a RIP image of the given name and avatar, with an optional year - /// - /// - /// - /// - /// - public Stream RipUser(string name, Image avatar, string year = null) - { - var bm = Resources.rip; - int width = 300; - var fontSize = width / name.Length -2; - if (fontSize > 20) fontSize = 20; - var g = Graphics.FromImage(bm); - Font nameFont = new Font("Comic Sans MS", fontSize, FontStyle.Bold, GraphicsUnit.Pixel); - SizeF nameSize = g.MeasureString(name, nameFont); - g.DrawString(name, new Font("Comic Sans MS", fontSize, FontStyle.Bold), Brushes.Black, (bm.Width /2 - 8) - (nameSize.Width /2), 243 - nameSize.Height); - g.DrawString((year ?? "?") + " - " + DateTime.Now.Year, new Font("Consolas", 12, FontStyle.Bold), Brushes.Black, 80, 240); - - g.DrawImage(avatar, 80, 135); - g.DrawImage((Image)Resources.rose_overlay, 0, 0); - g.Flush(); - g.Dispose(); - - return bm.ToStream(ImageFormat.Png); - } - - public Stream RipName(string name, string year = null) - { - var bm = Resources.rip; - int width = 190; - var offset = name.Length * 5; - var fontSize = width / name.Length; - if (fontSize > 20) fontSize = 20; - var g = Graphics.FromImage(bm); - Font nameFont = new Font("Comic Sans MS", fontSize, FontStyle.Bold, GraphicsUnit.Pixel); - SizeF nameSize = g.MeasureString(name, nameFont); - g.DrawString(name, nameFont, Brushes.Black, (bm.Width / 2) - (nameSize.Width / 2), 200); - g.DrawString((year ?? "?") + " - " + DateTime.Now.Year, new Font("Consolas", 12, FontStyle.Bold), Brushes.Black, 80, 235); - g.Flush(); - g.Dispose(); - - return bm.ToStream(ImageFormat.Png); - } - - public static async Task GetAvatar(string url) - { - var stream = await SearchHelper.GetResponseStreamAsync(url); - Bitmap bmp = new Bitmap(100, 100); - using (GraphicsPath gp = new GraphicsPath()) - { - gp.AddEllipse(0, 0, bmp.Width, bmp.Height); - using (Graphics gr = Graphics.FromImage(bmp)) - { - gr.SetClip(gp); - gr.DrawImage(Image.FromStream(stream), Point.Empty); - - } - } - return bmp; - - } - } -} diff --git a/src/NadekoBot/_Modules/Conversations/Conversations.cs b/src/NadekoBot/_Modules/Conversations/Conversations.cs deleted file mode 100644 index a3611d0e..00000000 --- a/src/NadekoBot/_Modules/Conversations/Conversations.cs +++ /dev/null @@ -1,224 +0,0 @@ -using Discord; -using Discord.Commands; -using Discord.Modules; -using NadekoBot.DataModels; -using NadekoBot.Extensions; -using NadekoBot.Modules.Conversations.Commands; -using NadekoBot.Modules.Permissions.Classes; -using System; -using System.Diagnostics; -using System.IO; -using System.Text; -using System.Threading.Tasks; - -namespace NadekoBot.Modules.Conversations -{ - internal class Conversations : DiscordModule - { - private const string firestr = "🔥 ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้ 🔥"; - public Conversations() - { - commands.Add(new RipCommand(this)); - } - - public override string Prefix { get; } = String.Format(NadekoBot.Config.CommandPrefixes.Conversations, NadekoBot.Creds.BotId); - - public override void Install(ModuleManager manager) - { - var rng = new Random(); - - manager.CreateCommands("", cgb => - { - cgb.AddCheck(PermissionChecker.Instance); - - cgb.CreateCommand("..") - .Description("Adds a new quote with the specified name (single word) and message (no limit). | `.. abc My message`") - .Parameter("keyword", ParameterType.Required) - .Parameter("text", ParameterType.Unparsed) - .Do(async e => - { - var text = e.GetArg("text"); - if (string.IsNullOrWhiteSpace(text)) - return; - await Task.Run(() => - Classes.DbHandler.Instance.Connection.Insert(new DataModels.UserQuote() - { - DateAdded = DateTime.Now, - Keyword = e.GetArg("keyword").ToLowerInvariant(), - Text = text, - UserName = e.User.Name, - })).ConfigureAwait(false); - - await e.Channel.SendMessage("`New quote added.`").ConfigureAwait(false); - }); - - cgb.CreateCommand("...") - .Description("Shows a random quote with a specified name. | `... abc`") - .Parameter("keyword", ParameterType.Required) - .Do(async e => - { - var keyword = e.GetArg("keyword")?.ToLowerInvariant(); - if (string.IsNullOrWhiteSpace(keyword)) - return; - - var quote = - Classes.DbHandler.Instance.GetRandom( - uqm => uqm.Keyword == keyword); - - if (quote != null) - await e.Channel.SendMessage($"📣 {quote.Text}").ConfigureAwait(false); - else - await e.Channel.SendMessage("💢`No quote found.`").ConfigureAwait(false); - }); - - cgb.CreateCommand("..qdel") - .Alias("..quotedelete") - .Description("Deletes all quotes with the specified keyword. You have to either be bot owner or the creator of the quote to delete it. | `..qdel abc`") - .Parameter("quote", ParameterType.Required) - .Do(async e => - { - var text = e.GetArg("quote")?.Trim(); - if (string.IsNullOrWhiteSpace(text)) - return; - await Task.Run(() => - { - if (NadekoBot.IsOwner(e.User.Id)) - Classes.DbHandler.Instance.DeleteWhere(uq => uq.Keyword == text); - else - Classes.DbHandler.Instance.DeleteWhere(uq => uq.Keyword == text && uq.UserName == e.User.Name); - }).ConfigureAwait(false); - - await e.Channel.SendMessage("`Done.`").ConfigureAwait(false); - }); - }); - - manager.CreateCommands(NadekoBot.BotMention, cgb => - { - var client = manager.Client; - - cgb.AddCheck(PermissionChecker.Instance); - - commands.ForEach(cmd => cmd.Init(cgb)); - - cgb.CreateCommand("die") - .Description("Works only for the owner. Shuts the bot down. | `@NadekoBot die`") - .Do(async e => - { - if (NadekoBot.IsOwner(e.User.Id)) - { - await e.Channel.SendMessage(e.User.Mention + ", Yes, my love.").ConfigureAwait(false); - await Task.Delay(5000).ConfigureAwait(false); - Environment.Exit(0); - } - else - await e.Channel.SendMessage(e.User.Mention + ", No.").ConfigureAwait(false); - }); - - var randServerSw = new Stopwatch(); - randServerSw.Start(); - - cgb.CreateCommand("do you love me") - .Description("Replies with positive answer only to the bot owner. | `@NadekoBot do you love me`") - .Do(async e => - { - if (NadekoBot.IsOwner(e.User.Id)) - await e.Channel.SendMessage(e.User.Mention + ", Of course I do, my Master.").ConfigureAwait(false); - else - await e.Channel.SendMessage(e.User.Mention + ", Don't be silly.").ConfigureAwait(false); - }); - - cgb.CreateCommand("how are you") - .Alias("how are you?") - .Description("Replies positive only if bot owner is online. | `@NadekoBot how are you`") - .Do(async e => - { - if (NadekoBot.IsOwner(e.User.Id)) - { - await e.Channel.SendMessage(e.User.Mention + " I am great as long as you are here.").ConfigureAwait(false); - return; - } - var kw = e.Server.GetUser(NadekoBot.Creds.OwnerIds[0]); - if (kw != null && kw.Status == UserStatus.Online) - { - await e.Channel.SendMessage(e.User.Mention + " I am great as long as " + kw.Mention + " is with me.").ConfigureAwait(false); - } - else - { - await e.Channel.SendMessage(e.User.Mention + " I am sad. My Master is not with me.").ConfigureAwait(false); - } - }); - - cgb.CreateCommand("fire") - .Description("Shows a unicode fire message. Optional parameter [x] tells her how many times to repeat the fire. | `@NadekoBot fire [x]`") - .Parameter("times", ParameterType.Optional) - .Do(async e => - { - int count; - if (string.IsNullOrWhiteSpace(e.Args[0])) - count = 1; - else - int.TryParse(e.Args[0], out count); - if (count < 1 || count > 12) - { - await e.Channel.SendMessage("Number must be between 1 and 12").ConfigureAwait(false); - return; - } - - var str = new StringBuilder(); - for (var i = 0; i < count; i++) - { - str.Append(firestr); - } - await e.Channel.SendMessage(str.ToString()).ConfigureAwait(false); - }); - - cgb.CreateCommand("dump") - .Description("Dumps all of the invites it can to dump.txt.** Owner Only.** | `@NadekoBot dump`") - .Do(async e => - { - if (!NadekoBot.IsOwner(e.User.Id)) return; - var i = 0; - var j = 0; - var invites = ""; - foreach (var s in client.Servers) - { - try - { - var invite = await s.CreateInvite(0).ConfigureAwait(false); - invites += invite.Url + "\n"; - i++; - } - catch - { - j++; - continue; - } - } - File.WriteAllText("dump.txt", invites); - await e.Channel.SendMessage($"Got invites for {i} servers and failed to get invites for {j} servers") - .ConfigureAwait(false); - }); - - cgb.CreateCommand("ab") - .Description("Try to get 'abalabahaha'| `@NadekoBot ab`") - .Do(async e => - { - string[] strings = { "ba", "la", "ha" }; - var construct = "@a"; - var cnt = rng.Next(4, 7); - while (cnt-- > 0) - { - construct += strings[rng.Next(0, strings.Length)]; - } - await e.Channel.SendMessage(construct).ConfigureAwait(false); - }); - - }); - } - - - - private static Func SayYes() - => async e => await e.Channel.SendMessage("Yes. :)").ConfigureAwait(false); - } -} diff --git a/src/NadekoBot/_Modules/CustomReactions/CustomReactions.cs b/src/NadekoBot/_Modules/CustomReactions/CustomReactions.cs index b62b2dd7..81a59f2f 100644 --- a/src/NadekoBot/_Modules/CustomReactions/CustomReactions.cs +++ b/src/NadekoBot/_Modules/CustomReactions/CustomReactions.cs @@ -58,7 +58,7 @@ namespace NadekoBot.Modules.CustomReactions commandFuncs.Keys.ForEach(key => str = key.Replace(str, m => commandFuncs[key](e, m))); - await e.Channel.SendMessage(str).ConfigureAwait(false); + await channel.SendMessageAsync(str).ConfigureAwait(false); }); } }); diff --git a/src/NadekoBot/_Modules/Gambling/Commands/AnimalRacing.cs b/src/NadekoBot/_Modules/Gambling/Commands/AnimalRacing.cs index a908128c..ede3a350 100644 --- a/src/NadekoBot/_Modules/Gambling/Commands/AnimalRacing.cs +++ b/src/NadekoBot/_Modules/Gambling/Commands/AnimalRacing.cs @@ -48,7 +48,7 @@ namespace NadekoBot.Modules.Gambling.Commands if (userFlowers < amount) { - await e.Channel.SendMessage($"{e.User.Mention} You don't have enough {NadekoBot.Config.CurrencyName}s. You only have {userFlowers}{NadekoBot.Config.CurrencySign}.").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} You don't have enough {NadekoBot.Config.CurrencyName}s. You only have {userFlowers}{NadekoBot.Config.CurrencySign}.").ConfigureAwait(false); return; } @@ -58,7 +58,7 @@ namespace NadekoBot.Modules.Gambling.Commands AnimalRace ar; if (!AnimalRaces.TryGetValue(e.Server.Id, out ar)) { - await e.Channel.SendMessage("No race exists on this server"); + await channel.SendMessageAsync("No race exists on this server"); return; } await ar.JoinRace(e.User, amount); diff --git a/src/NadekoBot/_Modules/Gambling/DiceRollCommand.cs b/src/NadekoBot/_Modules/Gambling/DiceRollCommand.cs index 55bb5ee1..918416e1 100644 --- a/src/NadekoBot/_Modules/Gambling/DiceRollCommand.cs +++ b/src/NadekoBot/_Modules/Gambling/DiceRollCommand.cs @@ -80,7 +80,7 @@ namespace NadekoBot.Modules.Gambling arr[i] = r.Next(1, n2 + 1); } var elemCnt = 0; - await e.Channel.SendMessage($"`Rolled {n1} {(n1 == 1 ? "die" : "dice")} 1-{n2}.`\n`Result:` " + string.Join(", ", (ordered ? arr.OrderBy(x => x).AsEnumerable() : arr).Select(x => elemCnt++ % 2 == 0 ? $"**{x}**" : x.ToString()))).ConfigureAwait(false); + await channel.SendMessageAsync($"`Rolled {n1} {(n1 == 1 ? "die" : "dice")} 1-{n2}.`\n`Result:` " + string.Join(", ", (ordered ? arr.OrderBy(x => x).AsEnumerable() : arr).Select(x => elemCnt++ % 2 == 0 ? $"**{x}**" : x.ToString()))).ConfigureAwait(false); } return; } @@ -90,7 +90,7 @@ namespace NadekoBot.Modules.Gambling if (num < 1) num = 1; if (num > 30) { - await e.Channel.SendMessage("You can roll up to 30 dice at a time.").ConfigureAwait(false); + await channel.SendMessageAsync("You can roll up to 30 dice at a time.").ConfigureAwait(false); num = 30; } var dices = new List(num); @@ -121,12 +121,12 @@ namespace NadekoBot.Modules.Gambling } var bitmap = dices.Merge(); - await e.Channel.SendMessage(values.Count + " Dice rolled. Total: **" + values.Sum() + "** Average: **" + (values.Sum() / (1.0f * values.Count)).ToString("N2") + "**").ConfigureAwait(false); + await channel.SendMessageAsync(values.Count + " Dice rolled. Total: **" + values.Sum() + "** Average: **" + (values.Sum() / (1.0f * values.Count)).ToString("N2") + "**").ConfigureAwait(false); await e.Channel.SendFile("dice.png", bitmap.ToStream(ImageFormat.Png)).ConfigureAwait(false); } catch { - await e.Channel.SendMessage("Please enter a number of dice to roll.").ConfigureAwait(false); + await channel.SendMessageAsync("Please enter a number of dice to roll.").ConfigureAwait(false); } }; } @@ -153,11 +153,11 @@ namespace NadekoBot.Modules.Gambling rolled = new Random().Next(0, int.Parse(e.GetArg("range")) + 1); } - await e.Channel.SendMessage($"{e.User.Mention} rolled **{rolled}**.").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} rolled **{rolled}**.").ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage($":anger: {ex.Message}").ConfigureAwait(false); + await channel.SendMessageAsync($":anger: {ex.Message}").ConfigureAwait(false); } }; } diff --git a/src/NadekoBot/_Modules/Gambling/DrawCommand.cs b/src/NadekoBot/_Modules/Gambling/DrawCommand.cs index dbd023e1..2d1e2964 100644 --- a/src/NadekoBot/_Modules/Gambling/DrawCommand.cs +++ b/src/NadekoBot/_Modules/Gambling/DrawCommand.cs @@ -41,7 +41,7 @@ namespace NadekoBot.Modules.Gambling return c; }); - await e.Channel.SendMessage("Deck reshuffled.").ConfigureAwait(false); + await channel.SendMessageAsync("Deck reshuffled.").ConfigureAwait(false); }; } @@ -68,7 +68,7 @@ namespace NadekoBot.Modules.Gambling { if (cards.CardPool.Count == 0 && i != 0) { - await e.Channel.SendMessage("No more cards in a deck.").ConfigureAwait(false); + await channel.SendMessageAsync("No more cards in a deck.").ConfigureAwait(false); break; } var currentCard = cards.DrawACard(); @@ -79,7 +79,7 @@ namespace NadekoBot.Modules.Gambling await e.Channel.SendFile(images.Count + " cards.jpg", bitmap.ToStream()).ConfigureAwait(false); if (cardObjects.Count == 5) { - await e.Channel.SendMessage($"{e.User.Mention} `{Cards.GetHandValue(cardObjects)}`").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} `{Cards.GetHandValue(cardObjects)}`").ConfigureAwait(false); } } catch (Exception ex) diff --git a/src/NadekoBot/_Modules/Gambling/FlipCoinCommand.cs b/src/NadekoBot/_Modules/Gambling/FlipCoinCommand.cs index d0b79919..6cb2f4d7 100644 --- a/src/NadekoBot/_Modules/Gambling/FlipCoinCommand.cs +++ b/src/NadekoBot/_Modules/Gambling/FlipCoinCommand.cs @@ -47,7 +47,7 @@ namespace NadekoBot.Modules.Gambling if (userFlowers < amount) { - await e.Channel.SendMessage($"{e.User.Mention} You don't have enough {NadekoBot.Config.CurrencyName}s. You only have {userFlowers}{NadekoBot.Config.CurrencySign}.").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} You don't have enough {NadekoBot.Config.CurrencyName}s. You only have {userFlowers}{NadekoBot.Config.CurrencySign}.").ConfigureAwait(false); return; } @@ -75,7 +75,7 @@ namespace NadekoBot.Modules.Gambling else str = $"{e.User.Mention}`More luck next time.`"; - await e.Channel.SendMessage(str).ConfigureAwait(false); + await channel.SendMessageAsync(str).ConfigureAwait(false); }; public Func FlipCoinFunc() => async e => @@ -105,7 +105,7 @@ namespace NadekoBot.Modules.Gambling await e.Channel.SendFile($"{result} coins.png", imgs.Merge().ToStream(System.Drawing.Imaging.ImageFormat.Png)).ConfigureAwait(false); return; } - await e.Channel.SendMessage("Invalid number").ConfigureAwait(false); + await channel.SendMessageAsync("Invalid number").ConfigureAwait(false); } }; } diff --git a/src/NadekoBot/_Modules/Gambling/GamblingModule.cs b/src/NadekoBot/_Modules/Gambling/GamblingModule.cs index d7ced224..9ab2cba2 100644 --- a/src/NadekoBot/_Modules/Gambling/GamblingModule.cs +++ b/src/NadekoBot/_Modules/Gambling/GamblingModule.cs @@ -41,13 +41,13 @@ namespace NadekoBot.Modules.Gambling var role = e.Server.FindRoles(arg).FirstOrDefault(); if (role == null) { - await e.Channel.SendMessage("💢 Role not found.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 Role not found.").ConfigureAwait(false); return; } var members = role.Members.Where(u => u.Status == UserStatus.Online); // only online var membersArray = members as User[] ?? members.ToArray(); var usr = membersArray[new Random().Next(0, membersArray.Length)]; - await e.Channel.SendMessage($"**Raffled user:** {usr.Name} (id: {usr.Id})").ConfigureAwait(false); + await channel.SendMessageAsync($"**Raffled user:** {usr.Name} (id: {usr.Id})").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "$$") @@ -59,7 +59,7 @@ namespace NadekoBot.Modules.Gambling var usr = e.Message.MentionedUsers.FirstOrDefault() ?? e.User; var pts = GetUserFlowers(usr.Id); var str = $"{usr.Name} has {pts} {NadekoBot.Config.CurrencySign}"; - await e.Channel.SendMessage(str).ConfigureAwait(false); + await channel.SendMessageAsync(str).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "give") @@ -83,14 +83,14 @@ namespace NadekoBot.Modules.Gambling if (userFlowers < amount) { - await e.Channel.SendMessage($"{e.User.Mention} You don't have enough {NadekoBot.Config.CurrencyName}s. You only have {userFlowers}{NadekoBot.Config.CurrencySign}.").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} You don't have enough {NadekoBot.Config.CurrencyName}s. You only have {userFlowers}{NadekoBot.Config.CurrencySign}.").ConfigureAwait(false); return; } await FlowersHandler.RemoveFlowers(e.User, "Gift", (int)amount, true).ConfigureAwait(false); await FlowersHandler.AddFlowersAsync(mentionedUser, "Gift", (int)amount).ConfigureAwait(false); - await e.Channel.SendMessage($"{e.User.Mention} successfully sent {amount} {NadekoBot.Config.CurrencyName}s to {mentionedUser.Mention}!").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} successfully sent {amount} {NadekoBot.Config.CurrencyName}s to {mentionedUser.Mention}!").ConfigureAwait(false); }); @@ -113,7 +113,7 @@ namespace NadekoBot.Modules.Gambling await FlowersHandler.AddFlowersAsync(mentionedUser, $"Awarded by bot owner. ({e.User.Name}/{e.User.Id})", (int)amount).ConfigureAwait(false); - await e.Channel.SendMessage($"{e.User.Mention} successfully awarded {amount} {NadekoBot.Config.CurrencyName}s to {mentionedUser.Mention}!").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} successfully awarded {amount} {NadekoBot.Config.CurrencyName}s to {mentionedUser.Mention}!").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "take") @@ -135,7 +135,7 @@ namespace NadekoBot.Modules.Gambling await FlowersHandler.RemoveFlowers(mentionedUser, $"Taken by bot owner.({e.User.Name}/{e.User.Id})", (int)amount).ConfigureAwait(false); - await e.Channel.SendMessage($"{e.User.Mention} successfully took {amount} {NadekoBot.Config.CurrencyName}s from {mentionedUser.Mention}!").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} successfully took {amount} {NadekoBot.Config.CurrencyName}s from {mentionedUser.Mention}!").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "betroll") @@ -154,7 +154,7 @@ namespace NadekoBot.Modules.Gambling if (userFlowers < amount) { - await e.Channel.SendMessage($"{e.User.Mention} You don't have enough {NadekoBot.Config.CurrencyName}s. You only have {userFlowers}{NadekoBot.Config.CurrencySign}.").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} You don't have enough {NadekoBot.Config.CurrencyName}s. You only have {userFlowers}{NadekoBot.Config.CurrencySign}.").ConfigureAwait(false); return; } @@ -181,7 +181,7 @@ namespace NadekoBot.Modules.Gambling await FlowersHandler.AddFlowersAsync(e.User, "Betroll Gamble", amount * 10, true).ConfigureAwait(false); } - await e.Channel.SendMessage(str).ConfigureAwait(false); + await channel.SendMessageAsync(str).ConfigureAwait(false); }); @@ -194,7 +194,7 @@ namespace NadekoBot.Modules.Gambling var richest = richestTemp as CurrencyState[] ?? richestTemp.ToArray(); if (richest.Length == 0) return; - await e.Channel.SendMessage( + await channel.SendMessageAsync( richest.Aggregate(new StringBuilder( $@"```xl ┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┓ diff --git a/src/NadekoBot/_Modules/Games/Commands/BetrayGame.cs b/src/NadekoBot/_Modules/Games/Commands/BetrayGame.cs index 74b98bf6..ba95cb13 100644 --- a/src/NadekoBot/_Modules/Games/Commands/BetrayGame.cs +++ b/src/NadekoBot/_Modules/Games/Commands/BetrayGame.cs @@ -90,7 +90,7 @@ namespace NadekoBot.Modules.Games.Commands UserPoints -= 3; } - await e.Channel.SendMessage($"**ROUND {++round}**\n" + + await channel.SendMessageAsync($"**ROUND {++round}**\n" + $"{response}\n" + $"{nadekoResponse}\n" + $"--------------------------------\n" + @@ -100,11 +100,11 @@ namespace NadekoBot.Modules.Games.Commands .ConfigureAwait(false); if (round < 10) return; if (nadekoPoints == userPoints) - await e.Channel.SendMessage("Its a draw").ConfigureAwait(false); + await channel.SendMessageAsync("Its a draw").ConfigureAwait(false); else if (nadekoPoints > userPoints) - await e.Channel.SendMessage("Nadeko won.").ConfigureAwait(false); + await channel.SendMessageAsync("Nadeko won.").ConfigureAwait(false); else - await e.Channel.SendMessage("You won.").ConfigureAwait(false); + await channel.SendMessageAsync("You won.").ConfigureAwait(false); nadekoPoints = 0; userPoints = 0; round = 0; diff --git a/src/NadekoBot/_Modules/Games/Commands/Bomberman.cs b/src/NadekoBot/_Modules/Games/Commands/Bomberman.cs index 4987dd66..9652a893 100644 --- a/src/NadekoBot/_Modules/Games/Commands/Bomberman.cs +++ b/src/NadekoBot/_Modules/Games/Commands/Bomberman.cs @@ -93,7 +93,7 @@ namespace NadekoBot.Modules.Games.Commands // { // if (gameChannel != null) // return; - // godMsg = await e.Channel.SendMessage("GAME START IN 1 SECOND....").ConfigureAwait(false); + // godMsg = await channel.SendMessageAsync("GAME START IN 1 SECOND....").ConfigureAwait(false); // gameChannel = e.Channel; // players[0] = new BombermanPlayer // { diff --git a/src/NadekoBot/_Modules/Games/Commands/Leet.cs b/src/NadekoBot/_Modules/Games/Commands/Leet.cs index e71a80d0..2fb1dcaa 100644 --- a/src/NadekoBot/_Modules/Games/Commands/Leet.cs +++ b/src/NadekoBot/_Modules/Games/Commands/Leet.cs @@ -310,7 +310,7 @@ namespace NadekoBot.Modules.Games.Commands return; if (string.IsNullOrWhiteSpace(text)) return; - await e.Channel.SendMessage(ToLeet(text, level)).ConfigureAwait(false); + await channel.SendMessageAsync(ToLeet(text, level)).ConfigureAwait(false); }); } } diff --git a/src/NadekoBot/_Modules/Games/Commands/PlantPick.cs b/src/NadekoBot/_Modules/Games/Commands/PlantPick.cs index 2752ad1f..209e24e5 100644 --- a/src/NadekoBot/_Modules/Games/Commands/PlantPick.cs +++ b/src/NadekoBot/_Modules/Games/Commands/PlantPick.cs @@ -49,7 +49,7 @@ namespace NadekoBot.Modules.Games.Commands var rnd = Math.Abs(rng.Next(0,101)); if (rnd == 0) { - var msgs = new[] { await e.Channel.SendFile(GetRandomCurrencyImagePath()), await e.Channel.SendMessage($"❗ A random {NadekoBot.Config.CurrencyName} appeared! Pick it up by typing `>pick`") }; + var msgs = new[] { await e.Channel.SendFile(GetRandomCurrencyImagePath()), await channel.SendMessageAsync($"❗ A random {NadekoBot.Config.CurrencyName} appeared! Pick it up by typing `>pick`") }; plantedFlowerChannels.AddOrUpdate(e.Channel.Id, msgs, (u, m) => { m.ForEach(async msgToDelete => { try { await msgToDelete.Delete(); } catch { } }); return msgs; }); plantpickCooldowns.AddOrUpdate(e.Channel.Id, now, (i, d) => now); } @@ -78,7 +78,7 @@ namespace NadekoBot.Modules.Games.Commands await msgToDelete.Delete().ConfigureAwait(false); await FlowersHandler.AddFlowersAsync(e.User, "Picked a flower.", 1, true).ConfigureAwait(false); - var msg = await e.Channel.SendMessage($"**{e.User.Name}** picked a {NadekoBot.Config.CurrencyName}!").ConfigureAwait(false); + var msg = await channel.SendMessageAsync($"**{e.User.Name}** picked a {NadekoBot.Config.CurrencyName}!").ConfigureAwait(false); ThreadPool.QueueUserWorkItem(async (state) => { try @@ -99,24 +99,24 @@ namespace NadekoBot.Modules.Games.Commands { if (plantedFlowerChannels.ContainsKey(e.Channel.Id)) { - await e.Channel.SendMessage($"There is already a {NadekoBot.Config.CurrencyName} in this channel.").ConfigureAwait(false); + await channel.SendMessageAsync($"There is already a {NadekoBot.Config.CurrencyName} in this channel.").ConfigureAwait(false); return; } var removed = await FlowersHandler.RemoveFlowers(e.User, "Planted a flower.", 1, true).ConfigureAwait(false); if (!removed) { - await e.Channel.SendMessage($"You don't have any {NadekoBot.Config.CurrencyName}s.").ConfigureAwait(false); + await channel.SendMessageAsync($"You don't have any {NadekoBot.Config.CurrencyName}s.").ConfigureAwait(false); return; } var file = GetRandomCurrencyImagePath(); Message msg; if (file == null) - msg = await e.Channel.SendMessage(NadekoBot.Config.CurrencySign).ConfigureAwait(false); + msg = await channel.SendMessageAsync(NadekoBot.Config.CurrencySign).ConfigureAwait(false); else msg = await e.Channel.SendFile(file).ConfigureAwait(false); var vowelFirst = new[] { 'a', 'e', 'i', 'o', 'u' }.Contains(NadekoBot.Config.CurrencyName[0]); - var msg2 = await e.Channel.SendMessage($"Oh how Nice! **{e.User.Name}** planted {(vowelFirst ? "an" : "a")} {NadekoBot.Config.CurrencyName}. Pick it using {Module.Prefix}pick").ConfigureAwait(false); + var msg2 = await channel.SendMessageAsync($"Oh how Nice! **{e.User.Name}** planted {(vowelFirst ? "an" : "a")} {NadekoBot.Config.CurrencyName}. Pick it using {Module.Prefix}pick").ConfigureAwait(false); plantedFlowerChannels.TryAdd(e.Channel.Id, new[] { msg, msg2 }); } finally { locker.Release(); } @@ -139,12 +139,12 @@ namespace NadekoBot.Modules.Games.Commands int throwaway; if (config.GenerateCurrencyChannels.TryRemove(e.Channel.Id, out throwaway)) { - await e.Channel.SendMessage("`Currency generation disabled on this channel.`").ConfigureAwait(false); + await channel.SendMessageAsync("`Currency generation disabled on this channel.`").ConfigureAwait(false); } else { if (config.GenerateCurrencyChannels.TryAdd(e.Channel.Id, cd)) - await e.Channel.SendMessage($"`Currency generation enabled on this channel. Cooldown is {cd} minutes.`").ConfigureAwait(false); + await channel.SendMessageAsync($"`Currency generation enabled on this channel. Cooldown is {cd} minutes.`").ConfigureAwait(false); } }); } diff --git a/src/NadekoBot/_Modules/Games/Commands/PollCommand.cs b/src/NadekoBot/_Modules/Games/Commands/PollCommand.cs index 785d5c5f..fb6777c4 100644 --- a/src/NadekoBot/_Modules/Games/Commands/PollCommand.cs +++ b/src/NadekoBot/_Modules/Games/Commands/PollCommand.cs @@ -83,7 +83,7 @@ namespace NadekoBot.Modules.Games.Commands var num = 1; msgToSend = answers.Aggregate(msgToSend, (current, answ) => current + $"`{num++}.` **{answ}**\n"); msgToSend += "\n**Private Message me with the corresponding number of the answer.**"; - await e.Channel.SendMessage(msgToSend).ConfigureAwait(false); + await channel.SendMessageAsync(msgToSend).ConfigureAwait(false); } public async Task StopPoll(Channel ch) diff --git a/src/NadekoBot/_Modules/Games/Commands/SpeedTyping.cs b/src/NadekoBot/_Modules/Games/Commands/SpeedTyping.cs index 07100820..950c67ce 100644 --- a/src/NadekoBot/_Modules/Games/Commands/SpeedTyping.cs +++ b/src/NadekoBot/_Modules/Games/Commands/SpeedTyping.cs @@ -114,7 +114,7 @@ namespace NadekoBot.Modules.Games.Commands await channel.Send($"{e.User.Mention} finished in **{sw.Elapsed.Seconds}** seconds with { distance } errors, **{ CurrentSentence.Length / WORD_VALUE / sw.Elapsed.Seconds * 60 }** WPM!").ConfigureAwait(false); if (finishedUserIds.Count % 2 == 0) { - await e.Channel.SendMessage($":exclamation: `A lot of people finished, here is the text for those still typing:`\n\n:book:**{CurrentSentence}**:book:").ConfigureAwait(false); + await channel.SendMessageAsync($":exclamation: `A lot of people finished, here is the text for those still typing:`\n\n:book:**{CurrentSentence}**:book:").ConfigureAwait(false); } } } @@ -142,7 +142,7 @@ namespace NadekoBot.Modules.Games.Commands if (game.IsActive) { - await e.Channel.SendMessage( + await channel.SendMessageAsync( $"Contest already running in " + $"{game.Channell.Mention} channel.") .ConfigureAwait(false); @@ -162,7 +162,7 @@ namespace NadekoBot.Modules.Games.Commands await game.Stop().ConfigureAwait(false); return; } - await e.Channel.SendMessage("No contest to stop on this channel.").ConfigureAwait(false); + await channel.SendMessageAsync("No contest to stop on this channel.").ConfigureAwait(false); }; internal override void Init(CommandGroupBuilder cgb) @@ -188,7 +188,7 @@ namespace NadekoBot.Modules.Games.Commands DateAdded = DateTime.Now }); - await e.Channel.SendMessage("Added new article for typing game.").ConfigureAwait(false); + await channel.SendMessageAsync("Added new article for typing game.").ConfigureAwait(false); }); } } diff --git a/src/NadekoBot/_Modules/Games/Commands/TriviaCommand.cs b/src/NadekoBot/_Modules/Games/Commands/TriviaCommand.cs index 75481309..02e57efa 100644 --- a/src/NadekoBot/_Modules/Games/Commands/TriviaCommand.cs +++ b/src/NadekoBot/_Modules/Games/Commands/TriviaCommand.cs @@ -37,12 +37,12 @@ namespace NadekoBot.Modules.Games.Commands return; var triviaGame = new TriviaGame(e, showHints, number == 0 ? 10 : number); if (RunningTrivias.TryAdd(e.Server.Id, triviaGame)) - await e.Channel.SendMessage($"**Trivia game started! {triviaGame.WinRequirement} points needed to win.**").ConfigureAwait(false); + await channel.SendMessageAsync($"**Trivia game started! {triviaGame.WinRequirement} points needed to win.**").ConfigureAwait(false); else await triviaGame.StopGame().ConfigureAwait(false); } else - await e.Channel.SendMessage("Trivia game is already running on this server.\n" + trivia.CurrentQuestion).ConfigureAwait(false); + await channel.SendMessageAsync("Trivia game is already running on this server.\n" + trivia.CurrentQuestion).ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "tl") @@ -51,9 +51,9 @@ namespace NadekoBot.Modules.Games.Commands { TriviaGame trivia; if (RunningTrivias.TryGetValue(e.Server.Id, out trivia)) - await e.Channel.SendMessage(trivia.GetLeaderboard()).ConfigureAwait(false); + await channel.SendMessageAsync(trivia.GetLeaderboard()).ConfigureAwait(false); else - await e.Channel.SendMessage("No trivia is running on this server.").ConfigureAwait(false); + await channel.SendMessageAsync("No trivia is running on this server.").ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "tq") @@ -66,7 +66,7 @@ namespace NadekoBot.Modules.Games.Commands await trivia.StopGame().ConfigureAwait(false); } else - await e.Channel.SendMessage("No trivia is running on this server.").ConfigureAwait(false); + await channel.SendMessageAsync("No trivia is running on this server.").ConfigureAwait(false); }); } } diff --git a/src/NadekoBot/_Modules/Games/GamesModule.cs b/src/NadekoBot/_Modules/Games/GamesModule.cs index acdaf1b3..d87e1f22 100644 --- a/src/NadekoBot/_Modules/Games/GamesModule.cs +++ b/src/NadekoBot/_Modules/Games/GamesModule.cs @@ -46,7 +46,7 @@ namespace NadekoBot.Modules.Games var list = arg.Split(';'); if (list.Count() < 2) return; - await e.Channel.SendMessage(list[rng.Next(0, list.Length)]).ConfigureAwait(false); + await channel.SendMessageAsync(list[rng.Next(0, list.Length)]).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "8ball") @@ -59,7 +59,7 @@ namespace NadekoBot.Modules.Games return; try { - await e.Channel.SendMessage( + await channel.SendMessageAsync( $":question: `Question` __**{question}**__ \n🎱 `8Ball Answers` __**{NadekoBot.Config._8BallResponses[rng.Next(0, NadekoBot.Config._8BallResponses.Length)]}**__") .ConfigureAwait(false); } @@ -103,7 +103,7 @@ namespace NadekoBot.Modules.Games else msg = $"{e.User.Mention} won! :{GetRPSPick(pick)}: beats :{GetRPSPick(nadekoPick)}:"; - await e.Channel.SendMessage(msg).ConfigureAwait(false); + await channel.SendMessageAsync(msg).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "linux") @@ -115,7 +115,7 @@ namespace NadekoBot.Modules.Games var guhnoo = e.Args[0]; var loonix = e.Args[1]; - await e.Channel.SendMessage( + await channel.SendMessageAsync( $@" I'd just like to interject for moment. What you're refering to as {loonix}, is in fact, {guhnoo}/{loonix}, or as I've recently taken to calling it, {guhnoo} plus {loonix}. {loonix} is not an operating system unto itself, but rather another free component of a fully functioning {guhnoo} system made useful by the {guhnoo} corelibs, shell utilities and vital system components comprising a full OS as defined by POSIX. diff --git a/src/NadekoBot/_Modules/Help/Commands/HelpCommand.cs b/src/NadekoBot/_Modules/Help/Commands/HelpCommand.cs index d0ba292b..7a99c332 100644 --- a/src/NadekoBot/_Modules/Help/Commands/HelpCommand.cs +++ b/src/NadekoBot/_Modules/Help/Commands/HelpCommand.cs @@ -31,7 +31,7 @@ namespace NadekoBot.Classes.Help.Commands if (alias != null) str = $" / `{ com.Aliases.FirstOrDefault()}`"; if (com != null) - await e.Channel.SendMessage($@"**__Help for:__ `{com.Text}`**" + str + $"\n**Desc:** {new Regex(@"\|").Replace(com.Description, "\n**Usage:**", 1)}").ConfigureAwait(false); + await channel.SendMessageAsync($@"**__Help for:__ `{com.Text}`**" + str + $"\n**Desc:** {new Regex(@"\|").Replace(com.Description, "\n**Usage:**", 1)}").ConfigureAwait(false); }).ConfigureAwait(false); }; public static string HelpString { @@ -91,7 +91,7 @@ $@"######For more information and how to setup your own NadekoBot, go to: - await e.Channel.SendMessage( + await channel.SendMessageAsync( @"**Wiki with all info**: **WINDOWS SETUP GUIDE**: @@ -105,7 +105,7 @@ $@"######For more information and how to setup your own NadekoBot, go to: { - await e.Channel.SendMessage( + await channel.SendMessageAsync( $@"You can support the project on patreon. or You can send donations to `nadekodiscordbot@gmail.com` Don't forget to leave your discord name or id in the message. diff --git a/src/NadekoBot/_Modules/Help/HelpModule.cs b/src/NadekoBot/_Modules/Help/HelpModule.cs index 45e4dc76..a45299e4 100644 --- a/src/NadekoBot/_Modules/Help/HelpModule.cs +++ b/src/NadekoBot/_Modules/Help/HelpModule.cs @@ -32,7 +32,7 @@ namespace NadekoBot.Modules.Help .Description($"List all bot modules. | `{Prefix}modules` or `.modules`") .Do(async e => { - await e.Channel.SendMessage("`List of modules:` \n• " + string.Join("\n• ", NadekoBot.Client.GetService().Modules.Select(m => m.Name)) + $"\n`Type \"{Prefix}commands module_name\" to get a list of commands in that module.`") + await channel.SendMessageAsync("`List of modules:` \n• " + string.Join("\n• ", NadekoBot.Client.GetService().Modules.Select(m => m.Name)) + $"\n`Type \"{Prefix}commands module_name\" to get a list of commands in that module.`") .ConfigureAwait(false); }); @@ -52,20 +52,20 @@ namespace NadekoBot.Modules.Help var cmdsArray = cmds as Command[] ?? cmds.ToArray(); if (!cmdsArray.Any()) { - await e.Channel.SendMessage("That module does not exist.").ConfigureAwait(false); + await channel.SendMessageAsync("That module does not exist.").ConfigureAwait(false); return; } if (module != "customreactions" && module != "conversations") { - await e.Channel.SendMessage("`List Of Commands:`\n" + SearchHelper.ShowInPrettyCode(cmdsArray, + await channel.SendMessageAsync("`List Of Commands:`\n" + SearchHelper.ShowInPrettyCode(cmdsArray, el => $"{el.Text,-15}{"[" + el.Aliases.FirstOrDefault() + "]",-8}")) .ConfigureAwait(false); } else { - await e.Channel.SendMessage("`List Of Commands:`\n• " + string.Join("\n• ", cmdsArray.Select(c => $"{c.Text}"))); + await channel.SendMessageAsync("`List Of Commands:`\n• " + string.Join("\n• ", cmdsArray.Select(c => $"{c.Text}"))); } - await e.Channel.SendMessage($"`You can type \"{Prefix}h command_name\" to see the help about that specific command.`").ConfigureAwait(false); + await channel.SendMessageAsync($"`You can type \"{Prefix}h command_name\" to see the help about that specific command.`").ConfigureAwait(false); }); }); } diff --git a/src/NadekoBot/_Modules/Music/MusicModule.cs b/src/NadekoBot/_Modules/Music/MusicModule.cs index 3c4aa351..1c4a010a 100644 --- a/src/NadekoBot/_Modules/Music/MusicModule.cs +++ b/src/NadekoBot/_Modules/Music/MusicModule.cs @@ -92,9 +92,9 @@ namespace NadekoBot.Modules.Music return; musicPlayer.TogglePause(); if (musicPlayer.Paused) - await e.Channel.SendMessage("🎵`Music Player paused.`").ConfigureAwait(false); + await channel.SendMessageAsync("🎵`Music Player paused.`").ConfigureAwait(false); else - await e.Channel.SendMessage("🎵`Music Player unpaused.`").ConfigureAwait(false); + await channel.SendMessageAsync("🎵`Music Player unpaused.`").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "queue") @@ -137,7 +137,7 @@ namespace NadekoBot.Modules.Music MusicPlayer musicPlayer; if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) { - await e.Channel.SendMessage("🎵 No active music player.").ConfigureAwait(false); + await channel.SendMessageAsync("🎵 No active music player.").ConfigureAwait(false); return; } @@ -163,7 +163,7 @@ namespace NadekoBot.Modules.Music const int itemsPerPage = 15; int startAt = itemsPerPage * (page - 1); var number = 1 + startAt; - await e.Channel.SendMessage(toSend + string.Join("\n", musicPlayer.Playlist.Skip(startAt).Take(15).Select(v => $"`{number++}.` {v.PrettyName}"))).ConfigureAwait(false); + await channel.SendMessageAsync(toSend + string.Join("\n", musicPlayer.Playlist.Skip(startAt).Take(15).Select(v => $"`{number++}.` {v.PrettyName}"))).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "nowplaying") @@ -177,7 +177,7 @@ namespace NadekoBot.Modules.Music var currentSong = musicPlayer.CurrentSong; if (currentSong == null) return; - await e.Channel.SendMessage($"🎵`Now Playing` {currentSong.PrettyName} " + + await channel.SendMessageAsync($"🎵`Now Playing` {currentSong.PrettyName} " + $"{currentSong.PrettyCurrentTime()}").ConfigureAwait(false); }); @@ -196,11 +196,11 @@ namespace NadekoBot.Modules.Music int volume; if (!int.TryParse(arg, out volume)) { - await e.Channel.SendMessage("Volume number invalid.").ConfigureAwait(false); + await channel.SendMessageAsync("Volume number invalid.").ConfigureAwait(false); return; } volume = musicPlayer.SetVolume(volume); - await e.Channel.SendMessage($"🎵 `Volume set to {volume}%`").ConfigureAwait(false); + await channel.SendMessageAsync($"🎵 `Volume set to {volume}%`").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "defvol") @@ -214,12 +214,12 @@ namespace NadekoBot.Modules.Music float volume; if (!float.TryParse(arg, out volume) || volume < 0 || volume > 100) { - await e.Channel.SendMessage("Volume number invalid.").ConfigureAwait(false); + await channel.SendMessageAsync("Volume number invalid.").ConfigureAwait(false); return; } var conf = SpecificConfigurations.Default.Of(e.Server.Id); conf.DefaultMusicVolume = volume / 100; - await e.Channel.SendMessage($"🎵 `Default volume set to {volume}%`").ConfigureAwait(false); + await channel.SendMessageAsync($"🎵 `Default volume set to {volume}%`").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "mute") @@ -271,12 +271,12 @@ namespace NadekoBot.Modules.Music return; if (musicPlayer.Playlist.Count < 2) { - await e.Channel.SendMessage("💢 Not enough songs in order to perform the shuffle.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 Not enough songs in order to perform the shuffle.").ConfigureAwait(false); return; } musicPlayer.Shuffle(); - await e.Channel.SendMessage("🎵 `Songs shuffled.`").ConfigureAwait(false); + await channel.SendMessageAsync("🎵 `Songs shuffled.`").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "playlist") @@ -290,25 +290,25 @@ namespace NadekoBot.Modules.Music return; if (e.User.VoiceChannel?.Server != e.Server) { - await e.Channel.SendMessage("💢 You need to be in a voice channel on this server.\n If you are already in a voice channel, try rejoining it.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 You need to be in a voice channel on this server.\n If you are already in a voice channel, try rejoining it.").ConfigureAwait(false); return; } var plId = await SearchHelper.GetPlaylistIdByKeyword(arg).ConfigureAwait(false); if (plId == null) { - await e.Channel.SendMessage("No search results for that query."); + await channel.SendMessageAsync("No search results for that query."); return; } var ids = await SearchHelper.GetVideoIDs(plId, 500).ConfigureAwait(false); if (ids == null || ids.Count == 0) { - await e.Channel.SendMessage($"🎵 `Failed to find any songs.`").ConfigureAwait(false); + await channel.SendMessageAsync($"🎵 `Failed to find any songs.`").ConfigureAwait(false); return; } var idArray = ids as string[] ?? ids.ToArray(); var count = idArray.Length; var msg = - await e.Channel.SendMessage($"🎵 `Attempting to queue {count} songs".SnPl(count) + "...`").ConfigureAwait(false); + await channel.SendMessageAsync($"🎵 `Attempting to queue {count} songs".SnPl(count) + "...`").ConfigureAwait(false); foreach (var id in idArray) { try @@ -383,7 +383,7 @@ namespace NadekoBot.Modules.Music } catch { } } - await e.Channel.SendMessage("🎵 `Directory queue complete.`").ConfigureAwait(false); + await channel.SendMessageAsync("🎵 `Directory queue complete.`").ConfigureAwait(false); } catch { } }); @@ -395,7 +395,7 @@ namespace NadekoBot.Modules.Music { if (e.User.VoiceChannel?.Server != e.Server) { - await e.Channel.SendMessage("💢 You need to be in a voice channel on this server.\n If you are already in a voice channel, try rejoining it.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 You need to be in a voice channel on this server.\n If you are already in a voice channel, try rejoining it.").ConfigureAwait(false); return; } await QueueSong(e.User, e.Channel, e.User.VoiceChannel, e.GetArg("radio_link"), musicType: MusicType.Radio).ConfigureAwait(false); @@ -448,7 +448,7 @@ namespace NadekoBot.Modules.Music if (arg?.ToLower() == "all") { musicPlayer.ClearQueue(); - await e.Channel.SendMessage($"🎵`Queue cleared!`").ConfigureAwait(false); + await channel.SendMessageAsync($"🎵`Queue cleared!`").ConfigureAwait(false); return; } int num; @@ -460,7 +460,7 @@ namespace NadekoBot.Modules.Music return; var song = (musicPlayer.Playlist as List)?[num - 1]; musicPlayer.RemoveSongAt(num - 1); - await e.Channel.SendMessage($"🎵**Track {song.PrettyName} at position `#{num}` has been removed.**").ConfigureAwait(false); + await channel.SendMessageAsync($"🎵**Track {song.PrettyName} at position `#{num}` has been removed.**").ConfigureAwait(false); }); //var msRegex = new Regex(@"(?\d+)>(?\d+)", RegexOptions.Compiled); @@ -487,7 +487,7 @@ namespace NadekoBot.Modules.Music !int.TryParse(fromtoArr[1], out n2) || n1 < 1 || n2 < 1 || n1 == n2 || n1 > playlist.Count || n2 > playlist.Count) { - await e.Channel.SendMessage("`Invalid input.`").ConfigureAwait(false); + await channel.SendMessageAsync("`Invalid input.`").ConfigureAwait(false); return; } @@ -496,7 +496,7 @@ namespace NadekoBot.Modules.Music var nn1 = n2 < n1 ? n1 : n1 - 1; playlist.RemoveAt(nn1); - await e.Channel.SendMessage($"🎵`Moved` {s.PrettyName} `from #{n1} to #{n2}`").ConfigureAwait(false); + await channel.SendMessageAsync($"🎵`Moved` {s.PrettyName} `from #{n1} to #{n2}`").ConfigureAwait(false); }); @@ -520,7 +520,7 @@ namespace NadekoBot.Modules.Music } musicPlayer.MaxQueueSize = size; - await e.Channel.SendMessage($"🎵 `Max queue set to {(size == 0 ? ("unlimited") : size + " tracks")}`"); + await channel.SendMessageAsync($"🎵 `Max queue set to {(size == 0 ? ("unlimited") : size + " tracks")}`"); }); cgb.CreateCommand(Prefix + "cleanup") @@ -553,7 +553,7 @@ namespace NadekoBot.Modules.Music if (currentSong == null) return; var currentValue = musicPlayer.ToggleRepeatSong(); - await e.Channel.SendMessage(currentValue ? + await channel.SendMessageAsync(currentValue ? $"🎵🔂`Repeating track:`{currentSong.PrettyName}" : $"🎵🔂`Current track repeat stopped.`") .ConfigureAwait(false); @@ -568,7 +568,7 @@ namespace NadekoBot.Modules.Music if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) return; var currentValue = musicPlayer.ToggleRepeatPlaylist(); - await e.Channel.SendMessage($"🎵🔁`Repeat playlist {(currentValue ? "enabled" : "disabled")}`").ConfigureAwait(false); + await channel.SendMessageAsync($"🎵🔁`Repeat playlist {(currentValue ? "enabled" : "disabled")}`").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "save") @@ -620,7 +620,7 @@ namespace NadekoBot.Modules.Music SongInfoId = s.Id.Value }), typeof(PlaylistSongInfo)); - await e.Channel.SendMessage($"🎵 `Saved playlist as {name}-{playlist.Id}`").ConfigureAwait(false); + await channel.SendMessageAsync($"🎵 `Saved playlist as {name}-{playlist.Id}`").ConfigureAwait(false); }); @@ -655,7 +655,7 @@ namespace NadekoBot.Modules.Music if (playlist == null) { - await e.Channel.SendMessage("Can't find playlist under that name.").ConfigureAwait(false); + await channel.SendMessageAsync("Can't find playlist under that name.").ConfigureAwait(false); return; } @@ -665,7 +665,7 @@ namespace NadekoBot.Modules.Music var songInfos = psis.Select(psi => DbHandler.Instance .FindOne(si => si.Id == psi.SongInfoId)); - await e.Channel.SendMessage($"`Attempting to load {songInfos.Count()} songs`").ConfigureAwait(false); + await channel.SendMessageAsync($"`Attempting to load {songInfos.Count()} songs`").ConfigureAwait(false); foreach (var si in songInfos) { try @@ -695,9 +695,9 @@ namespace NadekoBot.Modules.Music return; var result = DbHandler.Instance.GetPlaylistData(num); if (result.Count == 0) - e.Channel.SendMessage($"`No saved playlists found on page {num}`").ConfigureAwait(false); + channel.SendMessageAsync($"`No saved playlists found on page {num}`").ConfigureAwait(false); else - e.Channel.SendMessage($"```js\n--- List of saved playlists ---\n\n" + string.Join("\n", result.Select(r => $"'{r.Name}-{r.Id}' by {r.Creator} ({r.SongCnt} songs)")) + $"\n\n --- Page {num} ---```").ConfigureAwait(false); + channel.SendMessageAsync($"```js\n--- List of saved playlists ---\n\n" + string.Join("\n", result.Select(r => $"'{r.Name}-{r.Id}' by {r.Creator} ({r.SongCnt} songs)")) + $"\n\n --- Page {num} ---```").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "deleteplaylist") @@ -714,7 +714,7 @@ namespace NadekoBot.Modules.Music DbHandler.Instance.Delete(plnum); else DbHandler.Instance.DeleteWhere(mp => mp.Id == plnum && (long)e.User.Id == mp.CreatorId); - await e.Channel.SendMessage("`Ok.` :ok:").ConfigureAwait(false); + await channel.SendMessageAsync("`Ok.` :ok:").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "goto") @@ -751,7 +751,7 @@ namespace NadekoBot.Modules.Music if (seconds.Length == 1) seconds = "0" + seconds; - await e.Channel.SendMessage($"`Skipped to {minutes}:{seconds}`").ConfigureAwait(false); + await channel.SendMessageAsync($"`Skipped to {minutes}:{seconds}`").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "getlink") @@ -771,12 +771,12 @@ namespace NadekoBot.Modules.Music var selSong = musicPlayer.Playlist.DefaultIfEmpty(null).ElementAtOrDefault(index - 1); if (selSong == null) { - await e.Channel.SendMessage("Could not select song, likely wrong index"); + await channel.SendMessageAsync("Could not select song, likely wrong index"); } else { - await e.Channel.SendMessage($"🎶`Selected song {selSong.SongInfo.Title}:` <{selSong.SongInfo.Query}>").ConfigureAwait(false); + await channel.SendMessageAsync($"🎶`Selected song {selSong.SongInfo.Title}:` <{selSong.SongInfo.Query}>").ConfigureAwait(false); } } else @@ -784,7 +784,7 @@ namespace NadekoBot.Modules.Music var curSong = musicPlayer.CurrentSong; if (curSong == null) return; - await e.Channel.SendMessage($"🎶`Current song:` <{curSong.SongInfo.Query}>").ConfigureAwait(false); + await channel.SendMessageAsync($"🎶`Current song:` <{curSong.SongInfo.Query}>").ConfigureAwait(false); } }); @@ -800,9 +800,9 @@ namespace NadekoBot.Modules.Music return; if (!musicPlayer.ToggleAutoplay()) - await e.Channel.SendMessage("🎶`Autoplay disabled.`").ConfigureAwait(false); + await channel.SendMessageAsync("🎶`Autoplay disabled.`").ConfigureAwait(false); else - await e.Channel.SendMessage("🎶`Autoplay enabled.`").ConfigureAwait(false); + await channel.SendMessageAsync("🎶`Autoplay enabled.`").ConfigureAwait(false); }); }); } diff --git a/src/NadekoBot/_Modules/NSFW/NSFWModule.cs b/src/NadekoBot/_Modules/NSFW/NSFWModule.cs deleted file mode 100644 index ac688fb7..00000000 --- a/src/NadekoBot/_Modules/NSFW/NSFWModule.cs +++ /dev/null @@ -1,127 +0,0 @@ -using Discord.Commands; -using Discord.Modules; -using NadekoBot.Classes; -using NadekoBot.Modules.Permissions.Classes; -using Newtonsoft.Json.Linq; -using System; -using System.Linq; -using System.Threading.Tasks; - -namespace NadekoBot.Modules.NSFW -{ - internal class NSFWModule : DiscordModule - { - - private readonly Random rng = new Random(); - - public override string Prefix { get; } = NadekoBot.Config.CommandPrefixes.NSFW; - - public override void Install(ModuleManager manager) - { - manager.CreateCommands("", cgb => - { - - cgb.AddCheck(PermissionChecker.Instance); - - cgb.CreateCommand(Prefix + "hentai") - .Description($"Shows a random NSFW hentai image from gelbooru and danbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) | `{Prefix}hentai yuri+kissing`") - .Parameter("tag", ParameterType.Unparsed) - .Do(async e => - { - var tag = e.GetArg("tag")?.Trim() ?? ""; - - var links = await Task.WhenAll(SearchHelper.GetGelbooruImageLink("rating%3Aexplicit+" + tag), SearchHelper.GetDanbooruImageLink("rating%3Aexplicit+" + tag)).ConfigureAwait(false); - - if (links.All(l => l == null)) - { - await e.Channel.SendMessage("`No results.`"); - return; - } - - await e.Channel.SendMessage(String.Join("\n\n", links)).ConfigureAwait(false); - }); - cgb.CreateCommand(Prefix + "danbooru") - .Description($"Shows a random hentai image from danbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) | `{Prefix}danbooru yuri+kissing`") - .Parameter("tag", ParameterType.Unparsed) - .Do(async e => - { - var tag = e.GetArg("tag")?.Trim() ?? ""; - var link = await SearchHelper.GetDanbooruImageLink(tag).ConfigureAwait(false); - if (string.IsNullOrWhiteSpace(link)) - await e.Channel.SendMessage("Search yielded no results ;("); - else - await e.Channel.SendMessage(link).ConfigureAwait(false); - }); - cgb.CreateCommand(Prefix + "gelbooru") - .Description($"Shows a random hentai image from gelbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) | `{Prefix}gelbooru yuri+kissing`") - .Parameter("tag", ParameterType.Unparsed) - .Do(async e => - { - var tag = e.GetArg("tag")?.Trim() ?? ""; - var link = await SearchHelper.GetGelbooruImageLink(tag).ConfigureAwait(false); - if (string.IsNullOrWhiteSpace(link)) - await e.Channel.SendMessage("Search yielded no results ;("); - else - await e.Channel.SendMessage(link).ConfigureAwait(false); - }); - - cgb.CreateCommand(Prefix + "rule34") - .Description($"Shows a random image from rule34.xx with a given tag. Tag is optional but preffered. (multiple tags are appended with +) | `{Prefix}rule34 yuri+kissing`") - .Parameter("tag", ParameterType.Unparsed) - .Do(async e => - { - var tag = e.GetArg("tag")?.Trim() ?? ""; - var link = await SearchHelper.GetRule34ImageLink(tag).ConfigureAwait(false); - if (string.IsNullOrWhiteSpace(link)) - await e.Channel.SendMessage("Search yielded no results ;("); - else - await e.Channel.SendMessage(link).ConfigureAwait(false); - }); - cgb.CreateCommand(Prefix + "e621") - .Description($"Shows a random hentai image from e621.net with a given tag. Tag is optional but preffered. Use spaces for multiple tags. | `{Prefix}e621 yuri kissing`") - .Parameter("tag", ParameterType.Unparsed) - .Do(async e => - { - var tag = e.GetArg("tag")?.Trim() ?? ""; - await e.Channel.SendMessage(await SearchHelper.GetE621ImageLink(tag).ConfigureAwait(false)).ConfigureAwait(false); - }); - cgb.CreateCommand(Prefix + "cp") - .Description($"We all know where this will lead you to. | `{Prefix}cp`") - .Parameter("anything", ParameterType.Unparsed) - .Do(async e => - { - await e.Channel.SendMessage("http://i.imgur.com/MZkY1md.jpg").ConfigureAwait(false); - }); - cgb.CreateCommand(Prefix + "boobs") - .Description($"Real adult content. | `{Prefix}boobs`") - .Do(async e => - { - try - { - var obj = JArray.Parse(await SearchHelper.GetResponseStringAsync($"http://api.oboobs.ru/boobs/{rng.Next(0, 9380)}").ConfigureAwait(false))[0]; - await e.Channel.SendMessage($"http://media.oboobs.ru/{ obj["preview"].ToString() }").ConfigureAwait(false); - } - catch (Exception ex) - { - await e.Channel.SendMessage($"💢 {ex.Message}").ConfigureAwait(false); - } - }); - cgb.CreateCommand(Prefix + "butts") - .Alias(Prefix + "ass", Prefix + "butt") - .Description($"Real adult content. | `{Prefix}butts` or `{Prefix}ass`") - .Do(async e => - { - try - { - var obj = JArray.Parse(await SearchHelper.GetResponseStringAsync($"http://api.obutts.ru/butts/{rng.Next(0, 3373)}").ConfigureAwait(false))[0]; - await e.Channel.SendMessage($"http://media.obutts.ru/{ obj["preview"].ToString() }").ConfigureAwait(false); - } - catch (Exception ex) - { - await e.Channel.SendMessage($"💢 {ex.Message}").ConfigureAwait(false); - } - }); - }); - } - } -} diff --git a/src/NadekoBot/_Modules/Permissions/Commands/FilterInvitesCommand.cs b/src/NadekoBot/_Modules/Permissions/Commands/FilterInvitesCommand.cs index 445558c3..47ba8b53 100644 --- a/src/NadekoBot/_Modules/Permissions/Commands/FilterInvitesCommand.cs +++ b/src/NadekoBot/_Modules/Permissions/Commands/FilterInvitesCommand.cs @@ -72,7 +72,7 @@ namespace NadekoBot.Modules.Permissions.Commands ? e.Channel : PermissionHelper.ValidateChannel(e.Server, chanStr); await PermissionsHandler.SetChannelFilterInvitesPermission(chan, state).ConfigureAwait(false); - await e.Channel.SendMessage($"Invite Filter has been **{(state ? "enabled" : "disabled")}** for **{chan.Name}** channel.") + await channel.SendMessageAsync($"Invite Filter has been **{(state ? "enabled" : "disabled")}** for **{chan.Name}** channel.") .ConfigureAwait(false); return; } @@ -82,13 +82,13 @@ namespace NadekoBot.Modules.Permissions.Commands { await PermissionsHandler.SetChannelFilterInvitesPermission(curChannel, state).ConfigureAwait(false); } - await e.Channel.SendMessage($"Invite Filter has been **{(state ? "enabled" : "disabled")}** for **ALL** channels.") + await channel.SendMessageAsync($"Invite Filter has been **{(state ? "enabled" : "disabled")}** for **ALL** channels.") .ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage($"💢 Error: {ex.Message}") + await channel.SendMessageAsync($"💢 Error: {ex.Message}") .ConfigureAwait(false); } }); @@ -103,13 +103,13 @@ namespace NadekoBot.Modules.Permissions.Commands { var state = PermissionHelper.ValidateBool(e.GetArg("bool")); await PermissionsHandler.SetServerFilterInvitesPermission(e.Server, state).ConfigureAwait(false); - await e.Channel.SendMessage($"Invite Filter has been **{(state ? "enabled" : "disabled")}** for this server.") + await channel.SendMessageAsync($"Invite Filter has been **{(state ? "enabled" : "disabled")}** for this server.") .ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage($"💢 Error: {ex.Message}").ConfigureAwait(false); + await channel.SendMessageAsync($"💢 Error: {ex.Message}").ConfigureAwait(false); } }); } diff --git a/src/NadekoBot/_Modules/Permissions/Commands/FilterWordsCommand.cs b/src/NadekoBot/_Modules/Permissions/Commands/FilterWordsCommand.cs index b574ef23..bd16354d 100644 --- a/src/NadekoBot/_Modules/Permissions/Commands/FilterWordsCommand.cs +++ b/src/NadekoBot/_Modules/Permissions/Commands/FilterWordsCommand.cs @@ -69,7 +69,7 @@ namespace NadekoBot.Modules.Permissions.Commands ? e.Channel : PermissionHelper.ValidateChannel(e.Server, chanStr); await PermissionsHandler.SetChannelWordPermission(chan, state).ConfigureAwait(false); - await e.Channel.SendMessage($"Word filtering has been **{(state ? "enabled" : "disabled")}** for **{chan.Name}** channel.").ConfigureAwait(false); + await channel.SendMessageAsync($"Word filtering has been **{(state ? "enabled" : "disabled")}** for **{chan.Name}** channel.").ConfigureAwait(false); return; } //all channels @@ -78,11 +78,11 @@ namespace NadekoBot.Modules.Permissions.Commands { await PermissionsHandler.SetChannelWordPermission(curChannel, state).ConfigureAwait(false); } - await e.Channel.SendMessage($"Word filtering has been **{(state ? "enabled" : "disabled")}** for **ALL** channels.").ConfigureAwait(false); + await channel.SendMessageAsync($"Word filtering has been **{(state ? "enabled" : "disabled")}** for **ALL** channels.").ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage($"💢 Error: {ex.Message}").ConfigureAwait(false); + await channel.SendMessageAsync($"💢 Error: {ex.Message}").ConfigureAwait(false); } }); @@ -99,12 +99,12 @@ namespace NadekoBot.Modules.Permissions.Commands if (string.IsNullOrWhiteSpace(word)) return; await PermissionsHandler.AddFilteredWord(e.Server, word.ToLowerInvariant().Trim()).ConfigureAwait(false); - await e.Channel.SendMessage($"Successfully added new filtered word.").ConfigureAwait(false); + await channel.SendMessageAsync($"Successfully added new filtered word.").ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage($"💢 Error: {ex.Message}").ConfigureAwait(false); + await channel.SendMessageAsync($"💢 Error: {ex.Message}").ConfigureAwait(false); } }); @@ -121,12 +121,12 @@ namespace NadekoBot.Modules.Permissions.Commands if (string.IsNullOrWhiteSpace(word)) return; await PermissionsHandler.RemoveFilteredWord(e.Server, word.ToLowerInvariant().Trim()).ConfigureAwait(false); - await e.Channel.SendMessage($"Successfully removed filtered word.").ConfigureAwait(false); + await channel.SendMessageAsync($"Successfully removed filtered word.").ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage($"💢 Error: {ex.Message}").ConfigureAwait(false); + await channel.SendMessageAsync($"💢 Error: {ex.Message}").ConfigureAwait(false); } }); @@ -141,12 +141,12 @@ namespace NadekoBot.Modules.Permissions.Commands Classes.ServerPermissions serverPerms; if (!PermissionsHandler.PermissionsDict.TryGetValue(e.Server.Id, out serverPerms)) return; - await e.Channel.SendMessage($"There are `{serverPerms.Words.Count}` filtered words.\n" + + await channel.SendMessageAsync($"There are `{serverPerms.Words.Count}` filtered words.\n" + string.Join("\n", serverPerms.Words)).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage($"💢 Error: {ex.Message}").ConfigureAwait(false); + await channel.SendMessageAsync($"💢 Error: {ex.Message}").ConfigureAwait(false); } }); @@ -160,13 +160,13 @@ namespace NadekoBot.Modules.Permissions.Commands { var state = PermissionHelper.ValidateBool(e.GetArg("bool")); await PermissionsHandler.SetServerWordPermission(e.Server, state).ConfigureAwait(false); - await e.Channel.SendMessage($"Word filtering has been **{(state ? "enabled" : "disabled")}** on this server.") + await channel.SendMessageAsync($"Word filtering has been **{(state ? "enabled" : "disabled")}** on this server.") .ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage($"💢 Error: {ex.Message}").ConfigureAwait(false); + await channel.SendMessageAsync($"💢 Error: {ex.Message}").ConfigureAwait(false); } }); } diff --git a/src/NadekoBot/_Modules/Permissions/PermissionsModule.cs b/src/NadekoBot/_Modules/Permissions/PermissionsModule.cs index d2bc1840..de616d1c 100644 --- a/src/NadekoBot/_Modules/Permissions/PermissionsModule.cs +++ b/src/NadekoBot/_Modules/Permissions/PermissionsModule.cs @@ -39,7 +39,7 @@ namespace NadekoBot.Modules.Permissions { if (string.IsNullOrWhiteSpace(e.GetArg("role"))) { - await e.Channel.SendMessage($"Current permissions role is `{PermissionsHandler.GetServerPermissionsRoleName(e.Server)}`").ConfigureAwait(false); + await channel.SendMessageAsync($"Current permissions role is `{PermissionsHandler.GetServerPermissionsRoleName(e.Server)}`").ConfigureAwait(false); return; } @@ -52,11 +52,11 @@ namespace NadekoBot.Modules.Permissions catch (Exception ex) { Console.WriteLine(ex.Message); - await e.Channel.SendMessage($"Role `{arg}` probably doesn't exist. Create the role with that name first.").ConfigureAwait(false); + await channel.SendMessageAsync($"Role `{arg}` probably doesn't exist. Create the role with that name first.").ConfigureAwait(false); return; } await PermissionsHandler.SetPermissionsRole(e.Server, role.Name).ConfigureAwait(false); - await e.Channel.SendMessage($"Role `{role.Name}` is now required in order to change permissions.").ConfigureAwait(false); + await channel.SendMessageAsync($"Role `{role.Name}` is now required in order to change permissions.").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "rolepermscopy") @@ -71,7 +71,7 @@ namespace NadekoBot.Modules.Permissions var args = arg.Split('~').Select(a => a.Trim()).ToArray(); if (args.Length > 2) { - await e.Channel.SendMessage("💢Invalid number of '~'s in the argument.").ConfigureAwait(false); + await channel.SendMessageAsync("💢Invalid number of '~'s in the argument.").ConfigureAwait(false); return; } try @@ -80,11 +80,11 @@ namespace NadekoBot.Modules.Permissions var toRole = PermissionHelper.ValidateRole(e.Server, args[1]); await PermissionsHandler.CopyRolePermissions(fromRole, toRole).ConfigureAwait(false); - await e.Channel.SendMessage($"Copied permission settings from **{fromRole.Name}** to **{toRole.Name}**.").ConfigureAwait(false); + await channel.SendMessageAsync($"Copied permission settings from **{fromRole.Name}** to **{toRole.Name}**.").ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage($"💢{ex.Message}").ConfigureAwait(false); + await channel.SendMessageAsync($"💢{ex.Message}").ConfigureAwait(false); } }); cgb.CreateCommand(Prefix + "chnlpermscopy") @@ -99,7 +99,7 @@ namespace NadekoBot.Modules.Permissions var args = arg.Split('~').Select(a => a.Trim()).ToArray(); if (args.Length > 2) { - await e.Channel.SendMessage("💢Invalid number of '~'s in the argument."); + await channel.SendMessageAsync("💢Invalid number of '~'s in the argument."); return; } try @@ -108,11 +108,11 @@ namespace NadekoBot.Modules.Permissions var toChannel = PermissionHelper.ValidateChannel(e.Server, args[1]); await PermissionsHandler.CopyChannelPermissions(fromChannel, toChannel).ConfigureAwait(false); - await e.Channel.SendMessage($"Copied permission settings from **{fromChannel.Name}** to **{toChannel.Name}**.").ConfigureAwait(false); + await channel.SendMessageAsync($"Copied permission settings from **{fromChannel.Name}** to **{toChannel.Name}**.").ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage($"💢{ex.Message}"); + await channel.SendMessageAsync($"💢{ex.Message}"); } }); cgb.CreateCommand(Prefix + "usrpermscopy") @@ -127,7 +127,7 @@ namespace NadekoBot.Modules.Permissions var args = arg.Split('~').Select(a => a.Trim()).ToArray(); if (args.Length > 2) { - await e.Channel.SendMessage("💢Invalid number of '~'s in the argument.").ConfigureAwait(false); + await channel.SendMessageAsync("💢Invalid number of '~'s in the argument.").ConfigureAwait(false); return; } try @@ -136,11 +136,11 @@ namespace NadekoBot.Modules.Permissions var toUser = PermissionHelper.ValidateUser(e.Server, args[1]); await PermissionsHandler.CopyUserPermissions(fromUser, toUser).ConfigureAwait(false); - await e.Channel.SendMessage($"Copied permission settings from **{fromUser.ToString()}**to * *{toUser.ToString()}**.").ConfigureAwait(false); + await channel.SendMessageAsync($"Copied permission settings from **{fromUser.ToString()}**to * *{toUser.ToString()}**.").ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage($"💢{ex.Message}"); + await channel.SendMessageAsync($"💢{ex.Message}"); } }); @@ -153,7 +153,7 @@ namespace NadekoBot.Modules.Permissions var arg = e.GetArg("arg"); var val = PermissionHelper.ValidateBool(arg); await PermissionsHandler.SetVerbosity(e.Server, val).ConfigureAwait(false); - await e.Channel.SendMessage($"Verbosity set to {val}.").ConfigureAwait(false); + await channel.SendMessageAsync($"Verbosity set to {val}.").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "srvrperms") @@ -163,8 +163,8 @@ namespace NadekoBot.Modules.Permissions { var perms = PermissionsHandler.GetServerPermissions(e.Server); if (string.IsNullOrWhiteSpace(perms?.ToString())) - await e.Channel.SendMessage("No permissions set for this server.").ConfigureAwait(false); - await e.Channel.SendMessage(perms.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync("No permissions set for this server.").ConfigureAwait(false); + await channel.SendMessageAsync(perms.ToString()).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "roleperms") @@ -182,15 +182,15 @@ namespace NadekoBot.Modules.Permissions } catch (Exception ex) { - await e.Channel.SendMessage("💢 Error: " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("💢 Error: " + ex.Message).ConfigureAwait(false); return; } var perms = PermissionsHandler.GetRolePermissionsById(e.Server, role.Id); if (string.IsNullOrWhiteSpace(perms?.ToString())) - await e.Channel.SendMessage($"No permissions set for **{role.Name}** role.").ConfigureAwait(false); - await e.Channel.SendMessage(perms.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync($"No permissions set for **{role.Name}** role.").ConfigureAwait(false); + await channel.SendMessageAsync(perms.ToString()).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "chnlperms") @@ -208,14 +208,14 @@ namespace NadekoBot.Modules.Permissions } catch (Exception ex) { - await e.Channel.SendMessage("💢 Error: " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("💢 Error: " + ex.Message).ConfigureAwait(false); return; } var perms = PermissionsHandler.GetChannelPermissionsById(e.Server, channel.Id); if (string.IsNullOrWhiteSpace(perms?.ToString())) - await e.Channel.SendMessage($"No permissions set for **{channel.Name}** channel.").ConfigureAwait(false); - await e.Channel.SendMessage(perms.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync($"No permissions set for **{channel.Name}** channel.").ConfigureAwait(false); + await channel.SendMessageAsync(perms.ToString()).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "userperms") @@ -232,14 +232,14 @@ namespace NadekoBot.Modules.Permissions } catch (Exception ex) { - await e.Channel.SendMessage("💢 Error: " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("💢 Error: " + ex.Message).ConfigureAwait(false); return; } var perms = PermissionsHandler.GetUserPermissionsById(e.Server, user.Id); if (string.IsNullOrWhiteSpace(perms?.ToString())) - await e.Channel.SendMessage($"No permissions set for user **{user.Name}**.").ConfigureAwait(false); - await e.Channel.SendMessage(perms.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync($"No permissions set for user **{user.Name}**.").ConfigureAwait(false); + await channel.SendMessageAsync(perms.ToString()).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "srvrmdl") @@ -255,15 +255,15 @@ namespace NadekoBot.Modules.Permissions var state = PermissionHelper.ValidateBool(e.GetArg("bool")); await PermissionsHandler.SetServerModulePermission(e.Server, module, state).ConfigureAwait(false); - await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false); + await channel.SendMessageAsync($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false); } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -279,15 +279,15 @@ namespace NadekoBot.Modules.Permissions var state = PermissionHelper.ValidateBool(e.GetArg("bool")); await PermissionsHandler.SetServerCommandPermission(e.Server, command, state).ConfigureAwait(false); - await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false); + await channel.SendMessageAsync($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false); } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -309,23 +309,23 @@ namespace NadekoBot.Modules.Permissions { await PermissionsHandler.SetRoleModulePermission(role, module, state).ConfigureAwait(false); } - await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **ALL** roles.").ConfigureAwait(false); + await channel.SendMessageAsync($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **ALL** roles.").ConfigureAwait(false); } else { var role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role")); await PermissionsHandler.SetRoleModulePermission(role, module, state).ConfigureAwait(false); - await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false); + await channel.SendMessageAsync($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false); } } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -347,23 +347,23 @@ namespace NadekoBot.Modules.Permissions { await PermissionsHandler.SetRoleCommandPermission(role, command, state).ConfigureAwait(false); } - await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **ALL** roles.").ConfigureAwait(false); + await channel.SendMessageAsync($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **ALL** roles.").ConfigureAwait(false); } else { var role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role")); await PermissionsHandler.SetRoleCommandPermission(role, command, state).ConfigureAwait(false); - await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false); + await channel.SendMessageAsync($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false); } } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -385,28 +385,28 @@ namespace NadekoBot.Modules.Permissions { await PermissionsHandler.SetChannelModulePermission(channel, module, state).ConfigureAwait(false); } - await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** on **ALL** channels.").ConfigureAwait(false); + await channel.SendMessageAsync($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** on **ALL** channels.").ConfigureAwait(false); } else if (string.IsNullOrWhiteSpace(channelArg)) { await PermissionsHandler.SetChannelModulePermission(e.Channel, module, state).ConfigureAwait(false); - await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{e.Channel.Name}** channel.").ConfigureAwait(false); + await channel.SendMessageAsync($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{e.Channel.Name}** channel.").ConfigureAwait(false); } else { var channel = PermissionHelper.ValidateChannel(e.Server, channelArg); await PermissionsHandler.SetChannelModulePermission(channel, module, state).ConfigureAwait(false); - await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false); + await channel.SendMessageAsync($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false); } } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -428,23 +428,23 @@ namespace NadekoBot.Modules.Permissions { await PermissionsHandler.SetChannelCommandPermission(channel, command, state).ConfigureAwait(false); } - await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** on **ALL** channels.").ConfigureAwait(false); + await channel.SendMessageAsync($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** on **ALL** channels.").ConfigureAwait(false); } else { var channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); await PermissionsHandler.SetChannelCommandPermission(channel, command, state).ConfigureAwait(false); - await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false); + await channel.SendMessageAsync($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false); } } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -462,15 +462,15 @@ namespace NadekoBot.Modules.Permissions var user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user")); await PermissionsHandler.SetUserModulePermission(user, module, state).ConfigureAwait(false); - await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for user **{user.Name}**.").ConfigureAwait(false); + await channel.SendMessageAsync($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for user **{user.Name}**.").ConfigureAwait(false); } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -488,15 +488,15 @@ namespace NadekoBot.Modules.Permissions var user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user")); await PermissionsHandler.SetUserCommandPermission(user, command, state).ConfigureAwait(false); - await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for user **{user.Name}**.").ConfigureAwait(false); + await channel.SendMessageAsync($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for user **{user.Name}**.").ConfigureAwait(false); } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -513,15 +513,15 @@ namespace NadekoBot.Modules.Permissions { await PermissionsHandler.SetServerModulePermission(e.Server, module.Name, state).ConfigureAwait(false); } - await e.Channel.SendMessage($"All modules have been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false); + await channel.SendMessageAsync($"All modules have been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false); } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -540,15 +540,15 @@ namespace NadekoBot.Modules.Permissions { await PermissionsHandler.SetServerCommandPermission(e.Server, command.Text, state).ConfigureAwait(false); } - await e.Channel.SendMessage($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false); + await channel.SendMessageAsync($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false); } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -568,15 +568,15 @@ namespace NadekoBot.Modules.Permissions await PermissionsHandler.SetChannelModulePermission(channel, module.Name, state).ConfigureAwait(false); } - await e.Channel.SendMessage($"All modules have been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false); + await channel.SendMessageAsync($"All modules have been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false); } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -596,15 +596,15 @@ namespace NadekoBot.Modules.Permissions { await PermissionsHandler.SetChannelCommandPermission(channel, command.Text, state).ConfigureAwait(false); } - await e.Channel.SendMessage($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false); + await channel.SendMessageAsync($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false); } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -623,15 +623,15 @@ namespace NadekoBot.Modules.Permissions await PermissionsHandler.SetRoleModulePermission(role, module.Name, state).ConfigureAwait(false); } - await e.Channel.SendMessage($"All modules have been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false); + await channel.SendMessageAsync($"All modules have been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false); } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -655,7 +655,7 @@ namespace NadekoBot.Modules.Permissions await PermissionsHandler.SetRoleCommandPermission(role, command.Text, state).ConfigureAwait(false); } } - await e.Channel.SendMessage($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** for **all roles** role.").ConfigureAwait(false); + await channel.SendMessageAsync($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** for **all roles** role.").ConfigureAwait(false); } else { @@ -665,16 +665,16 @@ namespace NadekoBot.Modules.Permissions { await PermissionsHandler.SetRoleCommandPermission(role, command.Text, state).ConfigureAwait(false); } - await e.Channel.SendMessage($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false); + await channel.SendMessageAsync($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false); } } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -690,7 +690,7 @@ namespace NadekoBot.Modules.Permissions var usr = e.Message.MentionedUsers.First(); NadekoBot.Config.UserBlacklist.Add(usr.Id); await ConfigHandler.SaveConfig().ConfigureAwait(false); - await e.Channel.SendMessage($"`Sucessfully blacklisted user {usr.Name}`").ConfigureAwait(false); + await channel.SendMessageAsync($"`Sucessfully blacklisted user {usr.Name}`").ConfigureAwait(false); }).ConfigureAwait(false); }); @@ -708,11 +708,11 @@ namespace NadekoBot.Modules.Permissions { NadekoBot.Config.UserBlacklist.Remove(usr.Id); await ConfigHandler.SaveConfig().ConfigureAwait(false); - await e.Channel.SendMessage($"`Sucessfully unblacklisted user {usr.Name}`").ConfigureAwait(false); + await channel.SendMessageAsync($"`Sucessfully unblacklisted user {usr.Name}`").ConfigureAwait(false); } else { - await e.Channel.SendMessage($"`{usr.Name} was not in blacklist`").ConfigureAwait(false); + await channel.SendMessageAsync($"`{usr.Name} was not in blacklist`").ConfigureAwait(false); } }).ConfigureAwait(false); }); @@ -728,7 +728,7 @@ namespace NadekoBot.Modules.Permissions var ch = e.Message.MentionedChannels.First(); NadekoBot.Config.UserBlacklist.Add(ch.Id); await ConfigHandler.SaveConfig().ConfigureAwait(false); - await e.Channel.SendMessage($"`Sucessfully blacklisted channel {ch.Name}`").ConfigureAwait(false); + await channel.SendMessageAsync($"`Sucessfully blacklisted channel {ch.Name}`").ConfigureAwait(false); }).ConfigureAwait(false); }); @@ -743,7 +743,7 @@ namespace NadekoBot.Modules.Permissions var ch = e.Message.MentionedChannels.First(); NadekoBot.Config.UserBlacklist.Remove(ch.Id); await ConfigHandler.SaveConfig().ConfigureAwait(false); - await e.Channel.SendMessage($"`Sucessfully blacklisted channel {ch.Name}`").ConfigureAwait(false); + await channel.SendMessageAsync($"`Sucessfully blacklisted channel {ch.Name}`").ConfigureAwait(false); }).ConfigureAwait(false); }); @@ -762,7 +762,7 @@ namespace NadekoBot.Modules.Permissions NadekoBot.Client.FindServers(arg.Trim()).FirstOrDefault(); if (server == null) { - await e.Channel.SendMessage("Cannot find that server").ConfigureAwait(false); + await channel.SendMessageAsync("Cannot find that server").ConfigureAwait(false); return; } var serverId = server.Id; @@ -774,7 +774,7 @@ namespace NadekoBot.Modules.Permissions TypingGame typeracer; SpeedTyping.RunningContests.TryRemove(serverId, out typeracer); - await e.Channel.SendMessage($"`Sucessfully blacklisted server {server.Name}`").ConfigureAwait(false); + await channel.SendMessageAsync($"`Sucessfully blacklisted server {server.Name}`").ConfigureAwait(false); }).ConfigureAwait(false); }); @@ -797,17 +797,17 @@ namespace NadekoBot.Modules.Permissions await PermissionsHandler.SetCommandCooldown(e.Server, command, secs).ConfigureAwait(false); if(secs == 0) - await e.Channel.SendMessage($"Command **{command}** has no coooldown now.").ConfigureAwait(false); + await channel.SendMessageAsync($"Command **{command}** has no coooldown now.").ConfigureAwait(false); else - await e.Channel.SendMessage($"Command **{command}** now has a **{secs} {(secs==1 ? "second" : "seconds")}** cooldown.").ConfigureAwait(false); + await channel.SendMessageAsync($"Command **{command}** now has a **{secs} {(secs==1 ? "second" : "seconds")}** cooldown.").ConfigureAwait(false); } catch (ArgumentException exArg) { - await e.Channel.SendMessage(exArg.Message).ConfigureAwait(false); + await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); + await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); } }); @@ -823,10 +823,10 @@ namespace NadekoBot.Modules.Permissions if (!perms.CommandCooldowns.Any()) { - await e.Channel.SendMessage("`No command cooldowns set.`").ConfigureAwait(false); + await channel.SendMessageAsync("`No command cooldowns set.`").ConfigureAwait(false); return; } - await e.Channel.SendMessage(SearchHelper.ShowInPrettyCode(perms.CommandCooldowns.Select(c=>c.Key+ ": "+c.Value+" secs"),s=>$"{s,-30}",2)).ConfigureAwait(false); + await channel.SendMessageAsync(SearchHelper.ShowInPrettyCode(perms.CommandCooldowns.Select(c=>c.Key+ ": "+c.Value+" secs"),s=>$"{s,-30}",2)).ConfigureAwait(false); }); }); } diff --git a/src/NadekoBot/_Modules/Pokemon/PokemonModule.cs b/src/NadekoBot/_Modules/Pokemon/PokemonModule.cs index d494fffa..f9503fdc 100644 --- a/src/NadekoBot/_Modules/Pokemon/PokemonModule.cs +++ b/src/NadekoBot/_Modules/Pokemon/PokemonModule.cs @@ -92,12 +92,12 @@ namespace NadekoBot.Modules.Pokemon var target = e.Server.FindUsers(targetStr).FirstOrDefault(); if (target == null) { - await e.Channel.SendMessage("No such person.").ConfigureAwait(false); + await channel.SendMessageAsync("No such person.").ConfigureAwait(false); return; } else if (target == e.User) { - await e.Channel.SendMessage("You can't attack yourself.").ConfigureAwait(false); + await channel.SendMessageAsync("You can't attack yourself.").ConfigureAwait(false); return; } // Checking stats first, then move @@ -109,17 +109,17 @@ namespace NadekoBot.Modules.Pokemon //User not able if HP < 0, has made more than 4 attacks if (userStats.Hp < 0) { - await e.Channel.SendMessage($"{e.User.Mention} has fainted and was not able to move!").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} has fainted and was not able to move!").ConfigureAwait(false); return; } if (userStats.MovesMade >= 5) { - await e.Channel.SendMessage($"{e.User.Mention} has used too many moves in a row and was not able to move!").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} has used too many moves in a row and was not able to move!").ConfigureAwait(false); return; } if (userStats.LastAttacked.Contains(target.Id)) { - await e.Channel.SendMessage($"{e.User.Mention} can't attack again without retaliation!").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} can't attack again without retaliation!").ConfigureAwait(false); return; } //get target stats @@ -129,7 +129,7 @@ namespace NadekoBot.Modules.Pokemon //If target's HP is below 0, no use attacking if (targetStats.Hp <= 0) { - await e.Channel.SendMessage($"{target.Mention} has already fainted!").ConfigureAwait(false); + await channel.SendMessageAsync($"{target.Mention} has already fainted!").ConfigureAwait(false); return; } @@ -139,7 +139,7 @@ namespace NadekoBot.Modules.Pokemon var enabledMoves = userType.Moves; if (!enabledMoves.Contains(move.ToLowerInvariant())) { - await e.Channel.SendMessage($"{e.User.Mention} was not able to use **{move}**, use `{Prefix}ml` to see moves you can use").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} was not able to use **{move}**, use `{Prefix}ml` to see moves you can use").ConfigureAwait(false); return; } @@ -191,7 +191,7 @@ namespace NadekoBot.Modules.Pokemon Stats[e.User.Id] = userStats; Stats[target.Id] = targetStats; - await e.Channel.SendMessage(response).ConfigureAwait(false); + await channel.SendMessageAsync(response).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "movelist") @@ -206,7 +206,7 @@ namespace NadekoBot.Modules.Pokemon { str += $"\n{userType.Icon}{m}"; } - await e.Channel.SendMessage(str).ConfigureAwait(false); + await channel.SendMessageAsync(str).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "heal") @@ -220,7 +220,7 @@ namespace NadekoBot.Modules.Pokemon var usr = e.Server.FindUsers(targetStr).FirstOrDefault(); if (usr == null) { - await e.Channel.SendMessage("No such person.").ConfigureAwait(false); + await channel.SendMessageAsync("No such person.").ConfigureAwait(false); return; } if (Stats.ContainsKey(usr.Id)) @@ -230,7 +230,7 @@ namespace NadekoBot.Modules.Pokemon int HP = targetStats.Hp; if (targetStats.Hp == targetStats.MaxHp) { - await e.Channel.SendMessage($"{usr.Name} already has full HP!").ConfigureAwait(false); + await channel.SendMessageAsync($"{usr.Name} already has full HP!").ConfigureAwait(false); return; } //Payment~ @@ -238,7 +238,7 @@ namespace NadekoBot.Modules.Pokemon var pts = Classes.DbHandler.Instance.GetStateByUserId((long)e.User.Id)?.Value ?? 0; if (pts < amount) { - await e.Channel.SendMessage($"{e.User.Mention} you don't have enough {NadekoBot.Config.CurrencyName}s! \nYou still need {amount - pts} {NadekoBot.Config.CurrencySign} to be able to do this!").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} you don't have enough {NadekoBot.Config.CurrencyName}s! \nYou still need {amount - pts} {NadekoBot.Config.CurrencySign} to be able to do this!").ConfigureAwait(false); return; } var target = (usr.Id == e.User.Id) ? "yourself" : usr.Name; @@ -249,16 +249,16 @@ namespace NadekoBot.Modules.Pokemon { //Could heal only for half HP? Stats[usr.Id].Hp = (targetStats.MaxHp / 2); - await e.Channel.SendMessage($"{e.User.Name} revived {usr.Name} with one {NadekoBot.Config.CurrencySign}").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Name} revived {usr.Name} with one {NadekoBot.Config.CurrencySign}").ConfigureAwait(false); return; } var vowelFirst = new[] { 'a', 'e', 'i', 'o', 'u' }.Contains(NadekoBot.Config.CurrencyName[0]); - await e.Channel.SendMessage($"{e.User.Name} healed {usr.Name} for {targetStats.MaxHp - HP} HP with {(vowelFirst ? "an" : "a")} {NadekoBot.Config.CurrencySign}").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Name} healed {usr.Name} for {targetStats.MaxHp - HP} HP with {(vowelFirst ? "an" : "a")} {NadekoBot.Config.CurrencySign}").ConfigureAwait(false); return; } else { - await e.Channel.SendMessage($"{usr.Name} already has full HP!").ConfigureAwait(false); + await channel.SendMessageAsync($"{usr.Name} already has full HP!").ConfigureAwait(false); } }); @@ -273,11 +273,11 @@ namespace NadekoBot.Modules.Pokemon var usr = e.Server.FindUsers(usrStr).FirstOrDefault(); if (usr == null) { - await e.Channel.SendMessage("No such person.").ConfigureAwait(false); + await channel.SendMessageAsync("No such person.").ConfigureAwait(false); return; } var pType = GetPokeType(usr.Id); - await e.Channel.SendMessage($"Type of {usr.Name} is **{pType.Name.ToLowerInvariant()}**{pType.Icon}").ConfigureAwait(false); + await channel.SendMessageAsync($"Type of {usr.Name} is **{pType.Name.ToLowerInvariant()}**{pType.Icon}").ConfigureAwait(false); }); @@ -292,12 +292,12 @@ namespace NadekoBot.Modules.Pokemon var targetType = stringToPokemonType(targetTypeStr); if (targetType == null) { - await e.Channel.SendMessage("Invalid type specified. Type must be one of:\n" + string.Join(", ", NadekoBot.Config.PokemonTypes.Select(t => t.Name.ToUpperInvariant()))).ConfigureAwait(false); + await channel.SendMessageAsync("Invalid type specified. Type must be one of:\n" + string.Join(", ", NadekoBot.Config.PokemonTypes.Select(t => t.Name.ToUpperInvariant()))).ConfigureAwait(false); return; } if (targetType == GetPokeType(e.User.Id)) { - await e.Channel.SendMessage($"Your type is already {targetType.Name.ToLowerInvariant()}{targetType.Icon}").ConfigureAwait(false); + await channel.SendMessageAsync($"Your type is already {targetType.Name.ToLowerInvariant()}{targetType.Icon}").ConfigureAwait(false); return; } @@ -306,7 +306,7 @@ namespace NadekoBot.Modules.Pokemon var pts = DbHandler.Instance.GetStateByUserId((long)e.User.Id)?.Value ?? 0; if (pts < amount) { - await e.Channel.SendMessage($"{e.User.Mention} you don't have enough {NadekoBot.Config.CurrencyName}s! \nYou still need {amount - pts} {NadekoBot.Config.CurrencySign} to be able to do this!").ConfigureAwait(false); + await channel.SendMessageAsync($"{e.User.Mention} you don't have enough {NadekoBot.Config.CurrencyName}s! \nYou still need {amount - pts} {NadekoBot.Config.CurrencySign} to be able to do this!").ConfigureAwait(false); return; } await FlowersHandler.RemoveFlowers(e.User, $"set usertype to {targetTypeStr}", amount).ConfigureAwait(false); @@ -327,7 +327,7 @@ namespace NadekoBot.Modules.Pokemon //Now for the response - await e.Channel.SendMessage($"Set type of {e.User.Mention} to {targetTypeStr}{targetType.Icon} for a {NadekoBot.Config.CurrencySign}").ConfigureAwait(false); + await channel.SendMessageAsync($"Set type of {e.User.Mention} to {targetTypeStr}{targetType.Icon} for a {NadekoBot.Config.CurrencySign}").ConfigureAwait(false); }); }); } diff --git a/src/NadekoBot/_Modules/Searches/Commands/ConverterCommand.cs b/src/NadekoBot/_Modules/Searches/Commands/ConverterCommand.cs index ada8709a..d6a5f983 100644 --- a/src/NadekoBot/_Modules/Searches/Commands/ConverterCommand.cs +++ b/src/NadekoBot/_Modules/Searches/Commands/ConverterCommand.cs @@ -61,7 +61,7 @@ namespace NadekoBot.Modules.Searches.Commands msg += curr + "; "; } - await e.Channel.SendMessage(msg).ConfigureAwait(false); + await channel.SendMessageAsync(msg).ConfigureAwait(false); }; private Func ConvertFunc() => @@ -88,7 +88,7 @@ namespace NadekoBot.Modules.Searches.Commands { Unit inUnit = new Unit(fromCode, quantity, table); Unit outUnit = inUnit.Convert(toCode); - await e.Channel.SendMessage(inUnit.ToString() + " = " + outUnit.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync(inUnit.ToString() + " = " + outUnit.ToString()).ConfigureAwait(false); } else { @@ -97,13 +97,13 @@ namespace NadekoBot.Modules.Searches.Commands reInitCurrencyConverterTable(); Unit inUnit = currTable.CreateUnit(quantity, from.ToUpperInvariant()); Unit outUnit = inUnit.Convert(currTable.CurrencyCode(to.ToUpperInvariant())); - await e.Channel.SendMessage(inUnit.ToString() + " = " + outUnit.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync(inUnit.ToString() + " = " + outUnit.ToString()).ConfigureAwait(false); } } catch //(Exception ex) { //Console.WriteLine(ex.ToString()); - await e.Channel.SendMessage("Bad input format, or sth went wrong... Try to list them with `" + Module.Prefix + "`convertlist").ConfigureAwait(false); + await channel.SendMessageAsync("Bad input format, or sth went wrong... Try to list them with `" + Module.Prefix + "`convertlist").ConfigureAwait(false); } }; diff --git a/src/NadekoBot/_Modules/Searches/Commands/EvalCommand.cs b/src/NadekoBot/_Modules/Searches/Commands/EvalCommand.cs index 4dd5a9fe..2e237162 100644 --- a/src/NadekoBot/_Modules/Searches/Commands/EvalCommand.cs +++ b/src/NadekoBot/_Modules/Searches/Commands/EvalCommand.cs @@ -34,10 +34,10 @@ namespace NadekoBot.Modules.Searches.Commands string answer = Evaluate(expression); if (answer == null) { - await e.Channel.SendMessage($"Expression {expression} failed to evaluate"); + await channel.SendMessageAsync($"Expression {expression} failed to evaluate"); return; } - await e.Channel.SendMessage($"⚙ `{answer}`"); + await channel.SendMessageAsync($"⚙ `{answer}`"); }; private string Evaluate(string expression) diff --git a/src/NadekoBot/_Modules/Searches/Commands/LoLCommands.cs b/src/NadekoBot/_Modules/Searches/Commands/LoLCommands.cs index 5a5b766a..d5e11c92 100644 --- a/src/NadekoBot/_Modules/Searches/Commands/LoLCommands.cs +++ b/src/NadekoBot/_Modules/Searches/Commands/LoLCommands.cs @@ -106,7 +106,7 @@ namespace NadekoBot.Modules.Searches.Commands } if (data == null) { - await e.Channel.SendMessage("💢 Data for that role does not exist.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 Data for that role does not exist.").ConfigureAwait(false); return; } } @@ -275,7 +275,7 @@ Assists: {general["assists"]} Ban: {general["banRate"]}% catch (Exception ex) { Console.WriteLine(ex); - await e.Channel.SendMessage("💢 Failed retreiving data for that champion.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 Failed retreiving data for that champion.").ConfigureAwait(false); } }); @@ -307,11 +307,11 @@ Assists: {general["assists"]} Ban: {general["banRate"]}% //sb.AppendLine($" ({dataList[i]["general"]["banRate"]}%)"); } - await e.Channel.SendMessage(sb.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync(sb.ToString()).ConfigureAwait(false); } catch (Exception) { - await e.Channel.SendMessage($":anger: Fail: Champion.gg didsabled ban data until next patch. Sorry for the inconvenience.").ConfigureAwait(false); + await channel.SendMessageAsync($":anger: Fail: Champion.gg didsabled ban data until next patch. Sorry for the inconvenience.").ConfigureAwait(false); } }); } diff --git a/src/NadekoBot/_Modules/Searches/Commands/MemegenCommands.cs b/src/NadekoBot/_Modules/Searches/Commands/MemegenCommands.cs index a7d23181..62c4779c 100644 --- a/src/NadekoBot/_Modules/Searches/Commands/MemegenCommands.cs +++ b/src/NadekoBot/_Modules/Searches/Commands/MemegenCommands.cs @@ -21,7 +21,7 @@ namespace NadekoBot.Modules.Searches.Commands .Do(async e => { int i = 0; - await e.Channel.SendMessage("`List Of Commands:`\n```xl\n" + + await channel.SendMessageAsync("`List Of Commands:`\n```xl\n" + string.Join("\n", JsonConvert.DeserializeObject>(await SearchHelper.GetResponseStringAsync("http://memegen.link/templates/")) .Select(kvp => Path.GetFileName(kvp.Value)) .GroupBy(item => (i++) / 4) @@ -39,7 +39,7 @@ namespace NadekoBot.Modules.Searches.Commands var meme = e.GetArg("meme"); var top = Uri.EscapeDataString(e.GetArg("toptext").Replace(' ', '-')); var bot = Uri.EscapeDataString(e.GetArg("bottext").Replace(' ', '-')); - await e.Channel.SendMessage($"http://memegen.link/{meme}/{top}/{bot}.jpg"); + await channel.SendMessageAsync($"http://memegen.link/{meme}/{top}/{bot}.jpg"); }); } } diff --git a/src/NadekoBot/_Modules/Searches/Commands/OsuCommands.cs b/src/NadekoBot/_Modules/Searches/Commands/OsuCommands.cs index 0532203d..94251751 100644 --- a/src/NadekoBot/_Modules/Searches/Commands/OsuCommands.cs +++ b/src/NadekoBot/_Modules/Searches/Commands/OsuCommands.cs @@ -43,14 +43,14 @@ namespace NadekoBot.Modules.Searches.Commands try { await e.Channel.SendFile($"{e.GetArg("usr")}.png", new MemoryStream(cle.Result)).ConfigureAwait(false); - await e.Channel.SendMessage($"`Profile Link:`https://osu.ppy.sh/u/{Uri.EscapeDataString(e.GetArg("usr"))}\n`Image provided by https://lemmmy.pw/osusig`").ConfigureAwait(false); + await channel.SendMessageAsync($"`Profile Link:`https://osu.ppy.sh/u/{Uri.EscapeDataString(e.GetArg("usr"))}\n`Image provided by https://lemmmy.pw/osusig`").ConfigureAwait(false); } catch { } }; } catch { - await e.Channel.SendMessage("💢 Failed retrieving osu signature :\\").ConfigureAwait(false); + await channel.SendMessageAsync("💢 Failed retrieving osu signature :\\").ConfigureAwait(false); } } }); @@ -62,7 +62,7 @@ namespace NadekoBot.Modules.Searches.Commands { if (string.IsNullOrWhiteSpace(NadekoBot.Creds.OsuAPIKey)) { - await e.Channel.SendMessage("💢 An osu! API key is required.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 An osu! API key is required.").ConfigureAwait(false); return; } @@ -79,11 +79,11 @@ namespace NadekoBot.Modules.Searches.Commands var time = TimeSpan.FromSeconds(Double.Parse($"{obj["total_length"]}")).ToString(@"mm\:ss"); sb.AppendLine($"{obj["artist"]} - {obj["title"]}, mapped by {obj["creator"]}. https://osu.ppy.sh/s/{obj["beatmapset_id"]}"); sb.AppendLine($"{starRating} stars, {obj["bpm"]} BPM | AR{obj["diff_approach"]}, CS{obj["diff_size"]}, OD{obj["diff_overall"]} | Length: {time}"); - await e.Channel.SendMessage(sb.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync(sb.ToString()).ConfigureAwait(false); } catch { - await e.Channel.SendMessage("Something went wrong."); + await channel.SendMessageAsync("Something went wrong."); } }); @@ -95,13 +95,13 @@ namespace NadekoBot.Modules.Searches.Commands { if (string.IsNullOrWhiteSpace(NadekoBot.Creds.OsuAPIKey)) { - await e.Channel.SendMessage("💢 An osu! API key is required.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 An osu! API key is required.").ConfigureAwait(false); return; } if (string.IsNullOrWhiteSpace(e.GetArg("usr"))) { - await e.Channel.SendMessage("💢 Please provide a username.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 Please provide a username.").ConfigureAwait(false); return; } @@ -129,11 +129,11 @@ namespace NadekoBot.Modules.Searches.Commands sb.AppendLine($"{pp + "pp",-7} | {acc + "%",-7} | {map["artist"] + "-" + map["title"] + " (" + map["version"],-40}) | /b/{item["beatmap_id"]}"); } sb.Append("```"); - await e.Channel.SendMessage(sb.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync(sb.ToString()).ConfigureAwait(false); } catch { - await e.Channel.SendMessage("Something went wrong."); + await channel.SendMessageAsync("Something went wrong."); } }); } diff --git a/src/NadekoBot/_Modules/Searches/Commands/PokemonSearchCommands.cs b/src/NadekoBot/_Modules/Searches/Commands/PokemonSearchCommands.cs index b2c13dca..723d58cc 100644 --- a/src/NadekoBot/_Modules/Searches/Commands/PokemonSearchCommands.cs +++ b/src/NadekoBot/_Modules/Searches/Commands/PokemonSearchCommands.cs @@ -34,11 +34,11 @@ namespace NadekoBot.Modules.Searches.Commands { if (kvp.Key.ToUpperInvariant() == pok.ToUpperInvariant()) { - await e.Channel.SendMessage($"`Stats for \"{kvp.Key}\" pokemon:`\n{kvp.Value}"); + await channel.SendMessageAsync($"`Stats for \"{kvp.Key}\" pokemon:`\n{kvp.Value}"); return; } } - await e.Channel.SendMessage("`No pokemon found.`"); + await channel.SendMessageAsync("`No pokemon found.`"); }); cgb.CreateCommand(Prefix + "pokemonability") @@ -54,11 +54,11 @@ namespace NadekoBot.Modules.Searches.Commands { if (kvp.Key.ToUpperInvariant() == ab) { - await e.Channel.SendMessage($"`Info for \"{kvp.Key}\" ability:`\n{kvp.Value}"); + await channel.SendMessageAsync($"`Info for \"{kvp.Key}\" ability:`\n{kvp.Value}"); return; } } - await e.Channel.SendMessage("`No ability found.`"); + await channel.SendMessageAsync("`No ability found.`"); }); } } diff --git a/src/NadekoBot/_Modules/Searches/Commands/StreamNotifications.cs b/src/NadekoBot/_Modules/Searches/Commands/StreamNotifications.cs index f8720324..936ad52c 100644 --- a/src/NadekoBot/_Modules/Searches/Commands/StreamNotifications.cs +++ b/src/NadekoBot/_Modules/Searches/Commands/StreamNotifications.cs @@ -163,12 +163,12 @@ namespace NadekoBot.Modules.Searches.Commands })); if (streamStatus.Item1) { - await e.Channel.SendMessage($"`Streamer {streamStatus.Item2} is online.`"); + await channel.SendMessageAsync($"`Streamer {streamStatus.Item2} is online.`"); } } catch { - await e.Channel.SendMessage("No channel found."); + await channel.SendMessageAsync("No channel found."); } }); @@ -192,12 +192,12 @@ namespace NadekoBot.Modules.Searches.Commands })); if (streamStatus.Item1) { - await e.Channel.SendMessage($"`Streamer {streamStatus.Item2} is online.`"); + await channel.SendMessageAsync($"`Streamer {streamStatus.Item2} is online.`"); } } catch { - await e.Channel.SendMessage("No channel found."); + await channel.SendMessageAsync("No channel found."); } }); @@ -221,12 +221,12 @@ namespace NadekoBot.Modules.Searches.Commands })); if (streamStatus.Item1) { - await e.Channel.SendMessage($"`Streamer {streamStatus.Item2} is online.`"); + await channel.SendMessageAsync($"`Streamer {streamStatus.Item2} is online.`"); } } catch { - await e.Channel.SendMessage("No channel found."); + await channel.SendMessageAsync("No channel found."); } }); @@ -249,13 +249,13 @@ namespace NadekoBot.Modules.Searches.Commands snc.Username.ToLower().Trim() == username); if (toRemove == null) { - await e.Channel.SendMessage(":anger: No such stream.").ConfigureAwait(false); + await channel.SendMessageAsync(":anger: No such stream.").ConfigureAwait(false); return; } config.ObservingStreams.Remove(toRemove); await ConfigHandler.SaveConfig().ConfigureAwait(false); - await e.Channel.SendMessage($":ok: Removed `{toRemove.Username}`'s stream from notifications.").ConfigureAwait(false); + await channel.SendMessageAsync($":ok: Removed `{toRemove.Username}`'s stream from notifications.").ConfigureAwait(false); }); cgb.CreateCommand(Module.Prefix + "liststreams") @@ -274,7 +274,7 @@ namespace NadekoBot.Modules.Searches.Commands if (streamsArray.Length == 0) { - await e.Channel.SendMessage("You are not following any streams on this server.").ConfigureAwait(false); + await channel.SendMessageAsync("You are not following any streams on this server.").ConfigureAwait(false); return; } @@ -288,7 +288,7 @@ namespace NadekoBot.Modules.Searches.Commands return ""; })); - await e.Channel.SendMessage($"You are following **{streamsArray.Length}** streams on this server.\n\n" + text).ConfigureAwait(false); + await channel.SendMessageAsync($"You are following **{streamsArray.Length}** streams on this server.\n\n" + text).ConfigureAwait(false); }); } @@ -311,7 +311,7 @@ namespace NadekoBot.Modules.Searches.Commands var exists = config.ObservingStreams.Contains(stream); if (exists) { - await e.Channel.SendMessage(":anger: I am already notifying that stream on this channel.").ConfigureAwait(false); + await channel.SendMessageAsync(":anger: I am already notifying that stream on this channel.").ConfigureAwait(false); return; } Tuple data; @@ -321,7 +321,7 @@ namespace NadekoBot.Modules.Searches.Commands } catch { - await e.Channel.SendMessage(":anger: Stream probably doesn't exist.").ConfigureAwait(false); + await channel.SendMessageAsync(":anger: Stream probably doesn't exist.").ConfigureAwait(false); return; } var msg = $"Stream is currently **{(data.Item1 ? "ONLINE" : "OFFLINE")}** with **{data.Item2}** viewers"; @@ -337,7 +337,7 @@ namespace NadekoBot.Modules.Searches.Commands stream.LastStatus = data.Item1; if (!exists) msg = $":ok: I will notify this channel when status changes.\n{msg}"; - await e.Channel.SendMessage(msg).ConfigureAwait(false); + await channel.SendMessageAsync(msg).ConfigureAwait(false); config.ObservingStreams.Add(stream); }; } diff --git a/src/NadekoBot/_Modules/Searches/Commands/WowJokes.cs b/src/NadekoBot/_Modules/Searches/Commands/WowJokes.cs index b3e67eed..714d1a2d 100644 --- a/src/NadekoBot/_Modules/Searches/Commands/WowJokes.cs +++ b/src/NadekoBot/_Modules/Searches/Commands/WowJokes.cs @@ -29,7 +29,7 @@ namespace NadekoBot.Modules.Searches.Commands { jokes = JsonConvert.DeserializeObject>(File.ReadAllText("data/wowjokes.json")); } - await e.Channel.SendMessage(jokes[new Random().Next(0, jokes.Count)].ToString()); + await channel.SendMessageAsync(jokes[new Random().Next(0, jokes.Count)].ToString()); }); } } diff --git a/src/NadekoBot/_Modules/Searches/SearchesModule.cs b/src/NadekoBot/_Modules/Searches/SearchesModule.cs index 2662107a..8280c0e2 100644 --- a/src/NadekoBot/_Modules/Searches/SearchesModule.cs +++ b/src/NadekoBot/_Modules/Searches/SearchesModule.cs @@ -59,7 +59,7 @@ namespace NadekoBot.Modules.Searches var obj = JObject.Parse(response)["weather"]; - await e.Channel.SendMessage( + await channel.SendMessageAsync( $@"🌍 **Weather for** 【{obj["target"]}】 📏 **Lat,Long:** ({obj["latitude"]}, {obj["longitude"]}) ☁ **Condition:** {obj["condition"]} 😓 **Humidity:** {obj["humidity"]}% 💨 **Wind Speed:** {obj["windspeedk"]}km/h / {obj["windspeedm"]}mph @@ -76,11 +76,11 @@ $@"🌍 **Weather for** 【{obj["target"]}】 var link = await SearchHelper.FindYoutubeUrlByKeywords(e.GetArg("query")).ConfigureAwait(false); if (string.IsNullOrWhiteSpace(link)) { - await e.Channel.SendMessage("No results found for that query."); + await channel.SendMessageAsync("No results found for that query."); return; } var shortUrl = await SearchHelper.ShortenUrl(link).ConfigureAwait(false); - await e.Channel.SendMessage(shortUrl).ConfigureAwait(false); + await channel.SendMessageAsync(shortUrl).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "ani") @@ -97,11 +97,11 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } catch { - await e.Channel.SendMessage("Failed to find that anime.").ConfigureAwait(false); + await channel.SendMessageAsync("Failed to find that anime.").ConfigureAwait(false); return; } - await e.Channel.SendMessage(result.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync(result.ToString()).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "imdb") @@ -120,11 +120,11 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } catch { - await e.Channel.SendMessage("Failed to find that movie.").ConfigureAwait(false); + await channel.SendMessageAsync("Failed to find that movie.").ConfigureAwait(false); return; } - await e.Channel.SendMessage(result.ToString()).ConfigureAwait(false); + await channel.SendMessageAsync(result.ToString()).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "mang") @@ -141,10 +141,10 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } catch { - await e.Channel.SendMessage("Failed to find that anime.").ConfigureAwait(false); + await channel.SendMessageAsync("Failed to find that anime.").ConfigureAwait(false); return; } - await e.Channel.SendMessage(result).ConfigureAwait(false); + await channel.SendMessageAsync(result).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "randomcat") @@ -152,7 +152,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 .Description($"Shows a random cat image. | `{Prefix}meow`") .Do(async e => { - await e.Channel.SendMessage(JObject.Parse( + await channel.SendMessageAsync(JObject.Parse( await SearchHelper.GetResponseStringAsync("http://www.random.cat/meow").ConfigureAwait(false))["file"].ToString()) .ConfigureAwait(false); }); @@ -162,7 +162,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 .Description($"Shows a random dog image. | `{Prefix}woof`") .Do(async e => { - await e.Channel.SendMessage("http://random.dog/" + await SearchHelper.GetResponseStringAsync("http://random.dog/woof").ConfigureAwait(false)).ConfigureAwait(false); + await channel.SendMessageAsync("http://random.dog/" + await SearchHelper.GetResponseStringAsync("http://random.dog/woof").ConfigureAwait(false)).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "i") @@ -176,17 +176,17 @@ $@"🌍 **Weather for** 【{obj["target"]}】 { var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString(e.GetArg("query"))}&cx=018084019232060951019%3Ahs5piey28-e&num=1&searchType=image&fields=items%2Flink&key={NadekoBot.Creds.GoogleAPIKey}"; var obj = JObject.Parse(await SearchHelper.GetResponseStringAsync(reqString).ConfigureAwait(false)); - await e.Channel.SendMessage(obj["items"][0]["link"].ToString()).ConfigureAwait(false); + await channel.SendMessageAsync(obj["items"][0]["link"].ToString()).ConfigureAwait(false); } catch (HttpRequestException exception) { if (exception.Message.Contains("403 (Forbidden)")) { - await e.Channel.SendMessage("Daily limit reached!"); + await channel.SendMessageAsync("Daily limit reached!"); } else { - await e.Channel.SendMessage("Something went wrong."); + await channel.SendMessageAsync("Something went wrong."); } } }); @@ -203,17 +203,17 @@ $@"🌍 **Weather for** 【{obj["target"]}】 var reqString = $"https://www.googleapis.com/customsearch/v1?q={Uri.EscapeDataString(e.GetArg("query"))}&cx=018084019232060951019%3Ahs5piey28-e&num=1&searchType=image&start={ rng.Next(1, 50) }&fields=items%2Flink&key={NadekoBot.Creds.GoogleAPIKey}"; var obj = JObject.Parse(await SearchHelper.GetResponseStringAsync(reqString).ConfigureAwait(false)); var items = obj["items"] as JArray; - await e.Channel.SendMessage(items[0]["link"].ToString()).ConfigureAwait(false); + await channel.SendMessageAsync(items[0]["link"].ToString()).ConfigureAwait(false); } catch (HttpRequestException exception) { if (exception.Message.Contains("403 (Forbidden)")) { - await e.Channel.SendMessage("Daily limit reached!"); + await channel.SendMessageAsync("Daily limit reached!"); } else { - await e.Channel.SendMessage("Something went wrong."); + await channel.SendMessageAsync("Something went wrong."); } } }); @@ -224,7 +224,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 .Do(async e => { if (e.GetArg("ffs") == null || e.GetArg("ffs").Length < 1) return; - await e.Channel.SendMessage(await $"http://lmgtfy.com/?q={ Uri.EscapeUriString(e.GetArg("ffs").ToString()) }".ShortenUrl()) + await channel.SendMessageAsync(await $"http://lmgtfy.com/?q={ Uri.EscapeUriString(e.GetArg("ffs").ToString()) }".ShortenUrl()) .ConfigureAwait(false); }); @@ -237,7 +237,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 var terms = e.GetArg("terms")?.Trim(); if (string.IsNullOrWhiteSpace(terms)) return; - await e.Channel.SendMessage($"https://google.com/search?q={ HttpUtility.UrlEncode(terms).Replace(' ', '+') }") + await channel.SendMessageAsync($"https://google.com/search?q={ HttpUtility.UrlEncode(terms).Replace(' ', '+') }") .ConfigureAwait(false); }); @@ -249,7 +249,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 var arg = e.GetArg("name"); if (string.IsNullOrWhiteSpace(arg)) { - await e.Channel.SendMessage("💢 Please enter a card name to search for.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 Please enter a card name to search for.").ConfigureAwait(false); return; } await e.Channel.SendIsTyping().ConfigureAwait(false); @@ -271,14 +271,14 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } if (items.Count > 4) { - await e.Channel.SendMessage("⚠ Found over 4 images. Showing random 4.").ConfigureAwait(false); + await channel.SendMessageAsync("⚠ Found over 4 images. Showing random 4.").ConfigureAwait(false); } await e.Channel.SendFile(arg + ".png", (await images.MergeAsync()).ToStream(System.Drawing.Imaging.ImageFormat.Png)) .ConfigureAwait(false); } catch (Exception ex) { - await e.Channel.SendMessage($"💢 Error {ex.Message}").ConfigureAwait(false); + await channel.SendMessageAsync($"💢 Error {ex.Message}").ConfigureAwait(false); } }); @@ -290,7 +290,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 var arg = e.GetArg("query"); if (string.IsNullOrWhiteSpace(arg)) { - await e.Channel.SendMessage("💢 Please enter a search term.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 Please enter a search term.").ConfigureAwait(false); return; } await e.Channel.SendIsTyping().ConfigureAwait(false); @@ -303,11 +303,11 @@ $@"🌍 **Weather for** 【{obj["target"]}】 sb.AppendLine($"`Term:` {items["list"][0]["word"].ToString()}"); sb.AppendLine($"`Definition:` {items["list"][0]["definition"].ToString()}"); sb.Append($"`Link:` <{await items["list"][0]["permalink"].ToString().ShortenUrl().ConfigureAwait(false)}>"); - await e.Channel.SendMessage(sb.ToString()); + await channel.SendMessageAsync(sb.ToString()); } catch { - await e.Channel.SendMessage("💢 Failed finding a definition for that term.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 Failed finding a definition for that term.").ConfigureAwait(false); } }); // thanks to Blaubeerwald @@ -319,7 +319,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 var arg = e.GetArg("query"); if (string.IsNullOrWhiteSpace(arg)) { - await e.Channel.SendMessage("💢 Please enter a search term.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 Please enter a search term.").ConfigureAwait(false); return; } await e.Channel.SendIsTyping().ConfigureAwait(false); @@ -332,11 +332,11 @@ $@"🌍 **Weather for** 【{obj["target"]}】 sb.AppendLine($"`Hashtag:` {items["defs"]["def"]["hashtag"].ToString()}"); sb.AppendLine($"`Definition:` {items["defs"]["def"]["text"].ToString()}"); sb.Append($"`Link:` <{await items["defs"]["def"]["uri"].ToString().ShortenUrl().ConfigureAwait(false)}>"); - await e.Channel.SendMessage(sb.ToString()); + await channel.SendMessageAsync(sb.ToString()); } catch { - await e.Channel.SendMessage("💢 Failed finidng a definition for that tag.").ConfigureAwait(false); + await channel.SendMessageAsync("💢 Failed finidng a definition for that tag.").ConfigureAwait(false); } }); @@ -345,7 +345,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 .Do(async e => { var quote = NadekoBot.Config.Quotes[rng.Next(0, NadekoBot.Config.Quotes.Count)].ToString(); - await e.Channel.SendMessage(quote).ConfigureAwait(false); + await channel.SendMessageAsync(quote).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "catfact") @@ -355,7 +355,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 var response = await SearchHelper.GetResponseStringAsync("http://catfacts-api.appspot.com/api/facts").ConfigureAwait(false); if (response == null) return; - await e.Channel.SendMessage($"🐈 `{JObject.Parse(response)["facts"][0].ToString()}`").ConfigureAwait(false); + await channel.SendMessageAsync($"🐈 `{JObject.Parse(response)["facts"][0].ToString()}`").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "yomama") @@ -364,7 +364,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 .Do(async e => { var response = await SearchHelper.GetResponseStringAsync("http://api.yomomma.info/").ConfigureAwait(false); - await e.Channel.SendMessage("`" + JObject.Parse(response)["joke"].ToString() + "` 😆").ConfigureAwait(false); + await channel.SendMessageAsync("`" + JObject.Parse(response)["joke"].ToString() + "` 😆").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "randjoke") @@ -373,7 +373,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 .Do(async e => { var response = await SearchHelper.GetResponseStringAsync("http://tambal.azurewebsites.net/joke/random").ConfigureAwait(false); - await e.Channel.SendMessage("`" + JObject.Parse(response)["joke"].ToString() + "` 😆").ConfigureAwait(false); + await channel.SendMessageAsync("`" + JObject.Parse(response)["joke"].ToString() + "` 😆").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "chucknorris") @@ -382,7 +382,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 .Do(async e => { var response = await SearchHelper.GetResponseStringAsync("http://api.icndb.com/jokes/random/").ConfigureAwait(false); - await e.Channel.SendMessage("`" + JObject.Parse(response)["value"]["joke"].ToString() + "` 😆").ConfigureAwait(false); + await channel.SendMessageAsync("`" + JObject.Parse(response)["value"]["joke"].ToString() + "` 😆").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "magicitem") @@ -393,7 +393,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 var magicItems = JsonConvert.DeserializeObject>(File.ReadAllText("data/magicitems.json")); var item = magicItems[rng.Next(0, magicItems.Count)].ToString(); - await e.Channel.SendMessage(item).ConfigureAwait(false); + await channel.SendMessageAsync(item).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "revav") @@ -410,7 +410,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 if (usr == null || string.IsNullOrWhiteSpace(usr.AvatarUrl)) return; - await e.Channel.SendMessage($"https://images.google.com/searchbyimage?image_url={usr.AvatarUrl}").ConfigureAwait(false); + await channel.SendMessageAsync($"https://images.google.com/searchbyimage?image_url={usr.AvatarUrl}").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "revimg") @@ -422,7 +422,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 if (string.IsNullOrWhiteSpace(imgLink)) return; - await e.Channel.SendMessage($"https://images.google.com/searchbyimage?image_url={imgLink}").ConfigureAwait(false); + await channel.SendMessageAsync($"https://images.google.com/searchbyimage?image_url={imgLink}").ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "safebooru") @@ -433,9 +433,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】 var tag = e.GetArg("tag")?.Trim() ?? ""; var link = await SearchHelper.GetSafebooruImageLink(tag).ConfigureAwait(false); if (link == null) - await e.Channel.SendMessage("`No results.`"); + await channel.SendMessageAsync("`No results.`"); else - await e.Channel.SendMessage(link).ConfigureAwait(false); + await channel.SendMessageAsync(link).ConfigureAwait(false); }); cgb.CreateCommand(Prefix + "wiki") @@ -447,9 +447,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】 var result = await SearchHelper.GetResponseStringAsync("https://en.wikipedia.org//w/api.php?action=query&format=json&prop=info&redirects=1&formatversion=2&inprop=url&titles=" + Uri.EscapeDataString(query)); var data = JsonConvert.DeserializeObject(result); if (data.Query.Pages[0].Missing) - await e.Channel.SendMessage("`That page could not be found.`"); + await channel.SendMessageAsync("`That page could not be found.`"); else - await e.Channel.SendMessage(data.Query.Pages[0].FullUrl); + await channel.SendMessageAsync(data.Query.Pages[0].FullUrl); }); cgb.CreateCommand(Prefix + "clr") @@ -508,10 +508,10 @@ $@"🌍 **Weather for** 【{obj["target"]}】 var usr = e.Channel.FindUsers(e.GetArg("mention")).FirstOrDefault(); if (usr == null) { - await e.Channel.SendMessage("Invalid user specified.").ConfigureAwait(false); + await channel.SendMessageAsync("Invalid user specified.").ConfigureAwait(false); return; } - await e.Channel.SendMessage(await usr.AvatarUrl.ShortenUrl()).ConfigureAwait(false); + await channel.SendMessageAsync(await usr.AvatarUrl.ShortenUrl()).ConfigureAwait(false); }); }); diff --git a/src/NadekoBot/_Modules/Translator/TranslateCommand.cs b/src/NadekoBot/_Modules/Translator/TranslateCommand.cs index e54aa020..ded3a0d3 100644 --- a/src/NadekoBot/_Modules/Translator/TranslateCommand.cs +++ b/src/NadekoBot/_Modules/Translator/TranslateCommand.cs @@ -32,12 +32,12 @@ namespace NadekoBot.Modules.Translator return; string translation = await t.Translate(text, from, to).ConfigureAwait(false); - await e.Channel.SendMessage(translation).ConfigureAwait(false); + await channel.SendMessageAsync(translation).ConfigureAwait(false); } catch (Exception ex) { Console.WriteLine(ex); - await e.Channel.SendMessage("Bad input format, or something went wrong...").ConfigureAwait(false); + await channel.SendMessageAsync("Bad input format, or something went wrong...").ConfigureAwait(false); } }; diff --git a/src/NadekoBot/_Modules/Translator/ValidLanguagesCommand.cs b/src/NadekoBot/_Modules/Translator/ValidLanguagesCommand.cs index 438e77de..e727dd66 100644 --- a/src/NadekoBot/_Modules/Translator/ValidLanguagesCommand.cs +++ b/src/NadekoBot/_Modules/Translator/ValidLanguagesCommand.cs @@ -38,11 +38,11 @@ namespace NadekoBot.Modules.Translator ret += " " + key + ";"; } } - await e.Channel.SendMessage(ret).ConfigureAwait(false); + await channel.SendMessageAsync(ret).ConfigureAwait(false); } catch { - await e.Channel.SendMessage("Bad input format, or sth went wrong...").ConfigureAwait(false); + await channel.SendMessageAsync("Bad input format, or sth went wrong...").ConfigureAwait(false); } }; diff --git a/src/NadekoBot/_Modules/Trello/TrelloModule.cs b/src/NadekoBot/_Modules/Trello/TrelloModule.cs index 176ca2b8..b424c6eb 100644 --- a/src/NadekoBot/_Modules/Trello/TrelloModule.cs +++ b/src/NadekoBot/_Modules/Trello/TrelloModule.cs @@ -82,7 +82,7 @@ namespace NadekoBot.Modules.Trello bound = e.Channel; board = new Board(e.GetArg("board_id").Trim()); board.Refresh(); - await e.Channel.SendMessage("Successfully bound to this channel and board " + board.Name); + await channel.SendMessageAsync("Successfully bound to this channel and board " + board.Name); t.Start(); } catch (Exception ex) @@ -100,7 +100,7 @@ namespace NadekoBot.Modules.Trello t.Stop(); bound = null; board = null; - await e.Channel.SendMessage("Successfully unbound trello from this channel.").ConfigureAwait(false); + await channel.SendMessageAsync("Successfully unbound trello from this channel.").ConfigureAwait(false); }); @@ -111,7 +111,7 @@ namespace NadekoBot.Modules.Trello { if (!NadekoBot.IsOwner(e.User.Id)) return; if (bound == null || board == null || bound != e.Channel) return; - await e.Channel.SendMessage("Lists for a board '" + board.Name + "'\n" + string.Join("\n", board.Lists.Select(l => "**• " + l.ToString() + "**"))) + await channel.SendMessageAsync("Lists for a board '" + board.Name + "'\n" + string.Join("\n", board.Lists.Select(l => "**• " + l.ToString() + "**"))) .ConfigureAwait(false); }); @@ -133,10 +133,10 @@ namespace NadekoBot.Modules.Trello if (list != null) - await e.Channel.SendMessage("There are " + list.Cards.Count() + " cards in a **" + list.Name + "** list\n" + string.Join("\n", list.Cards.Select(c => "**• " + c.ToString() + "**"))) + await channel.SendMessageAsync("There are " + list.Cards.Count() + " cards in a **" + list.Name + "** list\n" + string.Join("\n", list.Cards.Select(c => "**• " + c.ToString() + "**"))) .ConfigureAwait(false); else - await e.Channel.SendMessage("No such list.") + await channel.SendMessageAsync("No such list.") .ConfigureAwait(false); }); }); diff --git a/src/NadekoBot/bin/Debug/netcoreapp1.0/Discord.Net.Commands.dll b/src/NadekoBot/bin/Debug/netcoreapp1.0/Discord.Net.Commands.dll index f58c84d5dff0f563bac3e92a14d7a513e513f505..ff977cfce4a4e891347ffbbbd90abc9aaeab937e 100644 GIT binary patch delta 68 zcmV-K0K5NytOJ0o1CWRVC a84yH5bC~R%=R$#VXjZ>xe+sjB&4>u?j~&AR delta 68 zcmZoz!`!fjc|r%XPS*O3-L9Ji5_|LZ|Cs9RxjbwA;TtLL6E{EDlp_U_o$P;BQh?|1 Yx1$#4WIQIHJLKYgI^xXcinARY08OAE%>V!Z diff --git a/src/NadekoBot/bin/Debug/netcoreapp1.0/Discord.Net.Commands.pdb b/src/NadekoBot/bin/Debug/netcoreapp1.0/Discord.Net.Commands.pdb index 9dd0af16fe1170bfb892bfc4e525386db3c2efb4..5714ebbaf4d69f99582be0cac937a56d386b3c26 100644 GIT binary patch delta 4761 zcmaKw3ry8j9LIkLue{W&Ajm`DYMEBPP^YttDWVBhBB7y`F$C|$wPI^pQ(Rt@nzmIk zTRYCAS*b%oyod@u!RFjdXXazAm$OB=6>Zs;(?#9B=luWYfB*N${r?8{|NouO?{UuW zye`!B#ntu21zm~hJ$1oljELqJtl81qc)MWJn$=}p)q%wJti;|IVt?PVb@$A>_3l+2 z?o}*){s5vZ{#+Bwz{|t(C5DKXG_g!HOpy(7L^BcYWBz&*ONDX`N`X{_X*W#K=tIVZ z%Ays@2&v={orAJn^hXoX#B=wvOc&AK0lcP(rNN$o)St$JImoa53py25^RGK+iWNehu9dt zu9+<`eQLxrw}ri8>e>8w3tMCiahm1w2|+g7GJiK{%Lm2H2ecVJa!4!NtRBb!=xYx59%dz0fc=MU0aDx9 zLP1agzxmAJzqT9Z(zomgD-vY)5u-=4BDqIdnP`+s%Te~UrDPpr#g@`=jFnnSUpGtO zNgYN$=~&lc!?!wtStpxoIiO_-f1}fwBI$sZ7cE?I+~y4>h4&se>LhJTP8e9t?NI*p z2_v|gU^mY{$qLMP<9PE)Hcu#jo@8>CD^9Ump<@cBa`$PYBv51{VvOf;XV?;9Aq&6$ z3|na__wCC1E;jMQ%`M5iqKPGnrKonM+uE6ZUF=QaEPKAA+cpeTO|CsvuvlJmmd&zk zubgF51CcxEPI$GGzPs)@u#f|b#U3rTc4=h3r2)W&QD7rjw5`4e?1_H;imHADD=}FN zt@oR+7!c9KfkflY2K1Q%cDP)Fc2*B|2dA45;iyCeT^mo7VK(UOeXwCsSYtf$XGei2 z;8+la^?_}P!s-*k71cX)2`nAsT6*2Ut1SgH=O*F+yLzP_Uw^SHTXN2?s`Or=qHip+uQxLY++m zLtmvtGNL(PFN>Hj;TLzjC8BK?_KWIi90jqP4H4{fFtwd@)~+#r{X8oO6jgm^i40i*gXpfcwi#{mdmPwUFzk9M zy5A%Rzrb_{$0xzCL;DR{2sWx;=5bZq5)LMhZH7Fq8ZZ<`3Ya+H4Ph|c2zbEMBOSfI zN0Y;q8A6L~$F|ou*@4Xf8*Rqa{gx#^9v!ZO<213TAi|N)y1+8MhAut@>Kab8z-)4x zPw^0JAWl8C+XUkc@W&OwTkyo!TqVM`9<~T2McVdUVC4aiYfozU@EoR9vJ>nh(?@5E zMiA|c!fu0AM`6WjL`xL&XbC?B#E%q_kl*?e1KQ`}eRz8J*=CaHUl_KVwn-Gpg6Tw^ zHpWXXYW~YB-@%2c4)|nBtuoC~*s{vYU`x%0;n){^&qaK#3Wa#eC03BkC~s`62FwYf4W%@#DRs?dQIJFw@$uu!DvF{{B;!7>9{!i|7f?)^G$15?XM z584Q(mWs}TVB@32obWwhe!mdw)Dy1ENXo0^S1w~}@$ALZn`b-Qi1J{ocCfHDL&`P( zjK+BWS4Nx_cm^VEYhkN8tH;?Jm3e(vz|<^e(JWhjukRZNb~E4re{o>FU}}o>g#Urz zM~cp}M@9MtOgmHxM;0J%IVrm1Y%ukeNoS>Cs%koW3oM@u(b?%y_%f-=mK`x|Uf(%5 zMq?Kp*i|r989inXm|FY>GsiDR{|}&A{JP`d(c#6fvrI6x_;ofBOjSl_%fV)hBSRvg z$Mpf={TPGgh;uFdDl1P4g;v1fhUxPVF}~$0+kh(FoI>28qpu7mB_$z zud%VXotmZ-Z8h)j$4o9B!Y3Dho2ZKwH;^TQd2LJ$M;Hh;9}GQ^G6A3b6msGJ9;Imi zOBg^VNlW8h`s9U6HrZ&FpA0ACGO(FuA9FRoZL`CE7_lWH=4W7I%$BKoC(qj)Q5#Ey WW5;{f*}9?W(f;Aok=4U`GX4jCo_{s~ delta 4774 zcmaKw4NR3)7{{L@SH8mQM<^Er#4;&CML{JrBqY&FA~dx!2D^SVSA@%&ALMnhR&JHd z)=m>`Rho+V&lnjDCzt;$BYTE4EHjfQarM!qzJYX@90 zxC%2aR31$*#z-T%w(2~L9U>pCF@ic{A4~AmR@H^^ihAY?udQkfBjPP3EH=PsfxjD8 zgsEc`xlV-;?3xSv(S`l&!hR1jKCq9)4Y^avI~rILpRu1kCXBLHmdtnVXHN>Fxdlde zgJIMhWE1#?1~%W+RER#Kk*ziDBz~-sEwYRU4j6`vvEu++B8U;N$q0yf$MIL2SfQo) zuF23~s#N~eK{i(q7;=iTQ!In0H?v&JeOt3_J{Vpe)?#SnlFD1G3}gW0n#^+!v0^L0 zzC*SEqg&ZRK~RC!W}nP|Z8hAbcIjcZK#)C$jf`YPGLEpNVo(~5N7&<*k$999Sw_uK zR$>|b9W08EY%}JQ!mVvKe4`zhwX;Vp0Y--L*V>IOk^+o8XW_DAHZ_b`-gnHXlk_b< zZeX>y!}-_8jo@m7y*%#(%Qxet@`e*^o-qDA!Q?KNon)JYjV+kYy{C+lz>tH8k;WrV zv&F(g7JlPtR&E)0?8e43Y%;DLsS6pQK6tI0*?)$;F2pkPk2-A2K-J{gQw0m>6=&HT z%lFb*Ha!q}gKh>-JL$LUwhJ3@Vc{O4B8MBhBmlV30qzEKy6Stu9v)Oj)B{#*vLR+K zI`N2@Jd`NS91FwaBcQl|%Qa|c)nGTxXhLXb>m!NcZ9(nqJ+KiDYiQ_!w}Pxh|dM z#1KW9FHfD#8%8wNL01ZPchxYzSmCNcp#3itr7>XZGlwgkNEE5d5$`;D9 zJafTb5CNXYZ#ZRH3t<%J--Y|4GL3+3gb>NZ`9A|w*GXrs8sk?lu>3%w=X+bcC@Qqg zRp|N2rU_+Po|`sZbV!a_p4&E^<$!bBqpz2#I`vYH`?QtBGQab72#~aO-8$byHk) zff+8sN5F7H2Mt;XmNF>osa#{5Fot?6O*iaNPh|xdiX$6XAOvm!+#iHC7UzF(RIoC` zv~8d2!e)YvH)HC$WuqoJ!wnE-in^l-A)j-RCFIdv3S~p_)Kj-j zFkS=w5cG}clS6&0;fqkRN#EX!tQ41T@95yeQ&mkkiL~0mK9q`JMHO2#hG?e)`weW3 z11pLnTCCVO^MmNbgr5N7M>dfRzwsp&guWkrjtS5S-+$rQY7SvjttMEr56PP&g7M~#M@T)E zL>v*c(1jJbuxG$jf_ls~V5(pVnBQt*!YzQRGP-a(nAh~y*={g(RCLx1mgb;K{{b-1 z0glC9tH+Kwv;0!Gv9*2Zb4(FBk@#%*sYC9B7& zb77ajRIZ6)VzY^u-?*^r0T=j-3+n?@TdYs`9~gdQ(^*nVs4igo$x2NH#9K}_U6>1| zzB1{o1WZ*;XK#Szk+O5rNXc0MIoQk`|Wu*+boGPjINdu(|O415YU!B`qiPoq&)=4YI&5$i74gqg(4gKSrM U+q+lUhT)F?eQHbWWxetL1CuXye*gdg diff --git a/src/NadekoBot/bin/Debug/netcoreapp1.0/Discord.Net.dll b/src/NadekoBot/bin/Debug/netcoreapp1.0/Discord.Net.dll index 063e73d3af7d61fbcbfc27e9e5a61ea50527796f..6c092ad80e1dca3c6d17052ba422c154c743ce0c 100644 GIT binary patch delta 121 zcmZqpqt)<7YeEO}gN6-_-L2h>t=&wm-OR1sEUn$Ft=(*`-R!O199z3NBdZ0(Z~lC~ zT4swwW8)9QQlE?!?O&=nw|}YTQn1tk>JDcB0wy4qVPs&?xy;3&vz3b>DA*0mC7 delta 121 zcmZqpqt)<7YeENeUFQ16?$&O`)^4WOZsyi*mey|8)^4`eZuZu0j;-CCk<|hZUU#gK zdh*X}KBv!u#FdL@w127Q-2SDSOTkhHs5_hi2$+CahLM3m=Q0mlpkSBawUh5G YzFzRhY1%jI9|x_@g>QG*%5{JP006!*iU0rr diff --git a/src/NadekoBot/bin/Debug/netcoreapp1.0/Discord.Net.pdb b/src/NadekoBot/bin/Debug/netcoreapp1.0/Discord.Net.pdb index 24d16752f7c146f5a16b098aa3f90d4c49e2fc52..ee65f8ec565779c7f0f46ab0236bf1753af1aa04 100644 GIT binary patch delta 25243 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 z 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

Wahu6wD@m~LSWaXpd%NVl3cg0!V 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 N#|Zowf&beP_+MPrX^j8? literal 312832 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