From 62b2f0c869862f82c68164875d14cfc80645015c Mon Sep 17 00:00:00 2001 From: Master Kwoth Date: Fri, 5 Feb 2016 18:17:48 +0100 Subject: [PATCH] improvements to getresponse, prune and clr (performance/ratelimit) --- NadekoBot/Classes/NadekoStats.cs | 2 +- NadekoBot/Modules/Administration.cs | 94 ++++++++++++++++++----------- NadekoBot/Modules/Searches.cs | 20 ++++-- 3 files changed, 74 insertions(+), 42 deletions(-) diff --git a/NadekoBot/Classes/NadekoStats.cs b/NadekoBot/Classes/NadekoStats.cs index a6737207..9ccca97e 100644 --- a/NadekoBot/Classes/NadekoStats.cs +++ b/NadekoBot/Classes/NadekoStats.cs @@ -12,7 +12,7 @@ namespace NadekoBot { public class NadekoStats { - public string BotVersion = "0.8-beta7"; + public string BotVersion = "0.8-beta8"; private static readonly NadekoStats _instance = new NadekoStats(); public static NadekoStats Instance => _instance; diff --git a/NadekoBot/Modules/Administration.cs b/NadekoBot/Modules/Administration.cs index 85afa9ed..8310ec41 100644 --- a/NadekoBot/Modules/Administration.cs +++ b/NadekoBot/Modules/Administration.cs @@ -9,12 +9,13 @@ using NadekoBot.Extensions; using System.Threading.Tasks; using NadekoBot.Commands; using System.IO; +using System.Collections.Concurrent; namespace NadekoBot.Modules { class Administration : DiscordModule { public Administration() : base() { commands.Add(new HelpCommand()); - if(NadekoBot.ParseActive) + if (NadekoBot.ParseActive) commands.Add(new ServerGreetCommand()); else Console.WriteLine("Parse not active. Server greet disabled."); @@ -148,7 +149,7 @@ namespace NadekoBot.Modules { cgb.CreateCommand(".roles") .Description("List all roles on this server") .Do(async e => { - await e.Send("`List of roles:` \n• " + string.Join("\n• ", e.Server.Roles).Replace("@everyone","[everyone]")); + await e.Send("`List of roles:` \n• " + string.Join("\n• ", e.Server.Roles).Replace("@everyone", "[everyone]")); }); cgb.CreateCommand(".b").Alias(".ban") @@ -375,28 +376,37 @@ namespace NadekoBot.Modules { }); + ConcurrentDictionary pruneDict = new ConcurrentDictionary(); cgb.CreateCommand(".prune") .Parameter("num", ParameterType.Required) .Description("Prunes a number of messages from the current channel.\n**Usage**: .prune 50") .Do(async e => { if (!e.User.ServerPermissions.ManageMessages) return; - + if (pruneDict.ContainsKey(e.Server)) + return; int num; - if (!Int32.TryParse(e.GetArg("num"), out num) || num < 1) { await e.Send("Incorrect amount."); return; } - try { - Message last = null; - while (num > 0) { - var msgs = await e.Channel.DownloadMessages(num, last?.Id); - last = msgs.LastOrDefault(); - msgs.ForEach(async m => await m.Delete()); - num -= 100; - } - } catch (Exception) { await e.Send("Failed pruning. Make sure the bot has correct permissions."); } + pruneDict.TryAdd(e.Server, true); + await Task.Factory.StartNew(async () => { + try { + Message last = null; + while (num > 0) { + var msgs = await e.Channel.DownloadMessages(num, last?.Id); + last = msgs.LastOrDefault(); + foreach (var m in msgs) { + await m.Delete(); + await Task.Delay(500); + } + num -= 100; + } + } catch (Exception) { await e.Send("Failed pruning. Make sure the bot has correct permissions."); } + }, TaskCreationOptions.LongRunning); + bool throwAway; + pruneDict.TryRemove(e.Server, out throwAway); }); cgb.CreateCommand(".die") @@ -412,13 +422,25 @@ namespace NadekoBot.Modules { } }); + ConcurrentDictionary clearDictionary = new ConcurrentDictionary(); cgb.CreateCommand(".clr") .Description("Clears some of nadeko's messages from the current channel.") .Do(async e => { + try { + if (clearDictionary.ContainsKey(e.Server)) + return; + clearDictionary.TryAdd(e.Server, true); var msgs = await e.Channel.DownloadMessages(100); - - msgs.Where(msg => msg.User.Id == client.CurrentUser.Id) - .ForEach(async m => { try { await m.Delete(); } catch (Exception) { } }); + await Task.Run(async () => { + var ms = msgs.Where(msg => msg.User.Id == client.CurrentUser.Id); + foreach (var m in ms) { + try { await m.Delete(); } catch (Exception) { } + await Task.Delay(500); + } + }); + } catch (Exception) {} + bool throwaway; + clearDictionary.TryRemove(e.Server, out throwaway); }); cgb.CreateCommand(".newname") .Description("Give the bot a new name.") @@ -506,27 +528,27 @@ namespace NadekoBot.Modules { cgb.CreateCommand(".menrole") .Alias(".mentionrole") - .Description("Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have mention @everyone permission.") - .Parameter("roles", ParameterType.Unparsed) - .Do(async e => { - if (!e.User.ServerPermissions.MentionEveryone) return; - var arg = e.GetArg("roles").Split(',').Select(r => r.Trim()); - string send = $"--{e.User.Mention} has invoked a mention on the following roles--"; - foreach (var roleStr in arg) { - if (string.IsNullOrWhiteSpace(roleStr)) continue; - var role = e.Server.FindRoles(roleStr).FirstOrDefault(); - if (role == null) continue; - send += $"\n`{role.Name}`\n"; - send += string.Join(", ", role.Members.Select(r => r.Mention)); - } + .Description("Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have mention @everyone permission.") + .Parameter("roles", ParameterType.Unparsed) + .Do(async e => { + if (!e.User.ServerPermissions.MentionEveryone) return; + var arg = e.GetArg("roles").Split(',').Select(r => r.Trim()); + string send = $"--{e.User.Mention} has invoked a mention on the following roles--"; + foreach (var roleStr in arg) { + if (string.IsNullOrWhiteSpace(roleStr)) continue; + var role = e.Server.FindRoles(roleStr).FirstOrDefault(); + if (role == null) continue; + send += $"\n`{role.Name}`\n"; + send += string.Join(", ", role.Members.Select(r => r.Mention)); + } - while (send.Length > 2000) { - var curstr = send.Substring(0, 2000); - await e.Channel.Send(curstr.Substring(0, curstr.LastIndexOf(", ") + 1)); - send = curstr.Substring(curstr.LastIndexOf(", ") + 1) + send.Substring(2000); - } - await e.Channel.Send(send); - }); + while (send.Length > 2000) { + var curstr = send.Substring(0, 2000); + await e.Channel.Send(curstr.Substring(0, curstr.LastIndexOf(", ") + 1)); + send = curstr.Substring(curstr.LastIndexOf(", ") + 1) + send.Substring(2000); + } + await e.Channel.Send(send); + }); /*cgb.CreateCommand(".voicetext") .Description("Enabled or disabled voice to text channel connection. Only people in a certain voice channel will see ") diff --git a/NadekoBot/Modules/Searches.cs b/NadekoBot/Modules/Searches.cs index 09dd7c9d..d21c3025 100644 --- a/NadekoBot/Modules/Searches.cs +++ b/NadekoBot/Modules/Searches.cs @@ -183,14 +183,14 @@ namespace NadekoBot.Modules { await e.Send($":anger: Error {ex}"); } }); - + /* cgb.CreateCommand("~osu") .Description("desc") .Parameter("arg", ParameterType.Required) .Do(async e => { var arg = e.GetArg("arg"); - //make request to osu - //print useful data + var res = await GetResponseStream($"http://lemmmy.pw/osusig/sig.php?uname=kwoth&flagshadow&xpbar&xpbarhex&pp=2"); + await e.Channel.SendFile($"_{e.GetArg("arg")}.png", res); }); cgb.CreateCommand("~osubind") @@ -209,11 +209,21 @@ namespace NadekoBot.Modules { //if exists save bind pair to parse.com //if not valid error }); + */ }); } - public static async Task GetResponseStream(string v) => - (await ((HttpWebRequest)WebRequest.Create(v)).GetResponseAsync()).GetResponseStream(); + public static async Task GetResponseStream(string v) { + var wr = (HttpWebRequest)WebRequest.Create(v); + try { + ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; + wr.UserAgent = @"Mozilla/5.0 (Windows NT 6.2; Win64; x64)"; + return (await (wr).GetResponseAsync()).GetResponseStream(); + } catch (Exception ex) { + Console.WriteLine("error in getresponse stream " + ex); + return null; + } + } public static async Task GetResponseAsync(string v) => await new StreamReader((await ((HttpWebRequest)WebRequest.Create(v)).GetResponseAsync()).GetResponseStream()).ReadToEndAsync();