From ffb63f9e8131a087124fa853c4b677016d087fc7 Mon Sep 17 00:00:00 2001 From: Master Kwoth Date: Thu, 3 Mar 2016 07:43:50 +0100 Subject: [PATCH] ~ani, ~mang, and @nadekobot how are you are the only things that don't work now --- NadekoBot/Classes/JSONModels/Config.cs | 10 + NadekoBot/Classes/Music/Song.cs | 152 +++++++-------- .../Classes/Permissions/PermissionChecker.cs | 10 +- .../Classes/Permissions/PermissionsHandler.cs | 173 +++++++++--------- NadekoBot/Classes/SearchHelper.cs | 58 +++--- NadekoBot/Commands/LoLCommands.cs | 111 +++++------ NadekoBot/Commands/PlayingRotate.cs | 95 +++++----- NadekoBot/Commands/PollCommand.cs | 72 ++++---- NadekoBot/Modules/Conversations.cs | 8 +- NadekoBot/Modules/Music.cs | 65 +++---- NadekoBot/Modules/NSFW.cs | 35 ++-- NadekoBot/Modules/Permissions.cs | 80 ++++---- NadekoBot/NadekoBot.cs | 2 + NadekoBot/NadekoBot.csproj | 1 + NadekoBot/bin/Debug/Discord.Net.Audio.dll | Bin 65536 -> 65536 bytes NadekoBot/bin/Debug/Discord.Net.Commands.dll | Bin 40448 -> 40448 bytes NadekoBot/bin/Debug/Discord.Net.Modules.dll | Bin 35328 -> 35328 bytes NadekoBot/bin/Debug/Discord.Net.dll | Bin 311808 -> 312320 bytes 18 files changed, 443 insertions(+), 429 deletions(-) create mode 100644 NadekoBot/Classes/JSONModels/Config.cs diff --git a/NadekoBot/Classes/JSONModels/Config.cs b/NadekoBot/Classes/JSONModels/Config.cs new file mode 100644 index 00000000..aa427aac --- /dev/null +++ b/NadekoBot/Classes/JSONModels/Config.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Classes.JSONModels { + internal class Config { + } +} diff --git a/NadekoBot/Classes/Music/Song.cs b/NadekoBot/Classes/Music/Song.cs index 34966df2..ffe6f67d 100644 --- a/NadekoBot/Classes/Music/Song.cs +++ b/NadekoBot/Classes/Music/Song.cs @@ -21,7 +21,7 @@ namespace NadekoBot.Classes.Music { /// public class PoopyBuffer { - private byte[] ringBuffer; + private readonly byte[] ringBuffer; public int WritePosition { get; private set; } = 0; public int ReadPosition { get; private set; } = 0; @@ -70,13 +70,13 @@ namespace NadekoBot.Classes.Music { return count; } // B: if i can't read as much, read to the end, - int readNormaly = BufferSize - ReadPosition; + var readNormaly = BufferSize - ReadPosition; Buffer.BlockCopy(ringBuffer, ReadPosition, buffer, 0, readNormaly); //Console.WriteLine($"Read normaly {count}[{ReadPosition} to {ReadPosition + readNormaly}]"); //then read the remaining amount from the start - int readFromStart = count - readNormaly; + var readFromStart = count - readNormaly; Buffer.BlockCopy(ringBuffer, 0, buffer, readNormaly, readFromStart); //Console.WriteLine($"Read From start {readFromStart}[{0} to {readFromStart}]"); ReadPosition = readFromStart; @@ -88,7 +88,7 @@ namespace NadekoBot.Classes.Music { if (count > buffer.Length) throw new ArgumentException(); while (ContentLength + count > BufferSize) { - await Task.Delay(20); + await Task.Delay(20, cancelToken); if (cancelToken.IsCancellationRequested) return; } @@ -104,12 +104,12 @@ namespace NadekoBot.Classes.Music { } // otherwise, i have to write to the end, then write the rest from the start - int wroteNormaly = BufferSize - WritePosition; + var wroteNormaly = BufferSize - WritePosition; Buffer.BlockCopy(buffer, 0, ringBuffer, WritePosition, wroteNormaly); //Console.WriteLine($"Wrote normally {wroteNormaly}[{WritePosition} to {BufferSize}]"); - int wroteFromStart = count - wroteNormaly; + var wroteFromStart = count - wroteNormaly; Buffer.BlockCopy(buffer, wroteNormaly, ringBuffer, 0, wroteFromStart); //Console.WriteLine($"and from start {wroteFromStart} [0 to {wroteFromStart}"); @@ -145,27 +145,25 @@ namespace NadekoBot.Classes.Music { RedirectStandardError = false, CreateNoWindow = true, }); - int blockSize = 3840; - byte[] buffer = new byte[blockSize]; - int attempt = 0; + var blockSize = 3840; + var buffer = new byte[blockSize]; + var attempt = 0; while (!cancelToken.IsCancellationRequested) { - int read = await p.StandardOutput.BaseStream.ReadAsync(buffer, 0, blockSize, cancelToken); + var read = await p.StandardOutput.BaseStream.ReadAsync(buffer, 0, blockSize, cancelToken); if (read == 0) if (attempt++ == 20) break; else - await Task.Delay(50); + await Task.Delay(50, cancelToken); else attempt = 0; await songBuffer.WriteAsync(buffer, read, cancelToken); if (songBuffer.ContentLength > 2.MB()) prebufferingComplete = true; } - } - catch { + } catch { Console.WriteLine("Buffering errored"); - } - finally { + } finally { if (p != null) { p.CancelOutputRead(); p.StandardOutput.Dispose(); @@ -179,34 +177,33 @@ namespace NadekoBot.Classes.Music { internal async Task Play(IAudioClient voiceClient, CancellationToken cancelToken) { var t = BufferSong(cancelToken).ConfigureAwait(false); - int bufferAttempts = 0; - int waitPerAttempt = 500; - int toAttemptTimes = SongInfo.ProviderType != MusicType.Normal ? 5 : 9; + var bufferAttempts = 0; + const int waitPerAttempt = 500; + var toAttemptTimes = SongInfo.ProviderType != MusicType.Normal ? 5 : 9; while (!prebufferingComplete && bufferAttempts++ < toAttemptTimes) { await Task.Delay(waitPerAttempt, cancelToken); } cancelToken.ThrowIfCancellationRequested(); Console.WriteLine($"Prebuffering done? in {waitPerAttempt * bufferAttempts}"); - int blockSize = 3840; - byte[] buffer = new byte[blockSize]; - int attempt = 0; + var blockSize = 3840; + var buffer = new byte[blockSize]; + var attempt = 0; while (!cancelToken.IsCancellationRequested) { //Console.WriteLine($"Read: {songBuffer.ReadPosition}\nWrite: {songBuffer.WritePosition}\nContentLength:{songBuffer.ContentLength}\n---------"); - int read = songBuffer.Read(buffer, blockSize); + var read = songBuffer.Read(buffer, blockSize); if (read == 0) if (attempt++ == 20) { voiceClient.Wait(); Console.WriteLine("Nothing to read."); return; - } - else - await Task.Delay(50); + } else + await Task.Delay(50, cancelToken); else attempt = 0; while (this.MusicPlayer.Paused) await Task.Delay(200, cancelToken); - buffer = adjustVolume(buffer, MusicPlayer.Volume); + buffer = AdjustVolume(buffer, MusicPlayer.Volume); voiceClient.Send(buffer, 0, read); } cancelToken.ThrowIfCancellationRequested(); @@ -220,11 +217,11 @@ namespace NadekoBot.Classes.Music { } //stackoverflow ftw - private byte[] adjustVolume(byte[] audioSamples, float volume) { - if (volume == 1.0f) + private static byte[] AdjustVolume(byte[] audioSamples, float volume) { + if (Math.Abs(volume - 1.0f) < 0.01f) return audioSamples; - byte[] array = new byte[audioSamples.Length]; - for (int i = 0; i < array.Length; i += 2) { + var array = new byte[audioSamples.Length]; + for (var i = 0; i < array.Length; i += 2) { // convert byte pair to int short buf1 = audioSamples[i + 1]; @@ -233,7 +230,7 @@ namespace NadekoBot.Classes.Music { buf1 = (short)((buf1 & 0xff) << 8); buf2 = (short)(buf2 & 0xff); - short res = (short)(buf1 | buf2); + var res = (short)(buf1 | buf2); res = (short)(res * volume); // convert back @@ -254,23 +251,23 @@ namespace NadekoBot.Classes.Music { } try { - if (musicType == MusicType.Local) { - return new Song(new SongInfo { - Uri = "\"" + Path.GetFullPath(query) + "\"", - Title = Path.GetFileNameWithoutExtension(query), - Provider = "Local File", - ProviderType = musicType, - }); + switch (musicType) { + case MusicType.Local: + return new Song(new SongInfo { + Uri = "\"" + Path.GetFullPath(query) + "\"", + Title = Path.GetFileNameWithoutExtension(query), + Provider = "Local File", + ProviderType = musicType, + }); + case MusicType.Radio: + return new Song(new SongInfo { + Uri = query, + Title = $"{query}", + Provider = "Radio Stream", + ProviderType = musicType, + }); } - else if (musicType == MusicType.Radio) { - return new Song(new SongInfo { - Uri = query, - Title = $"{query}", - Provider = "Radio Stream", - ProviderType = musicType, - }); - } - else if (SoundCloud.Default.IsSoundCloudLink(query)) { + if (SoundCloud.Default.IsSoundCloudLink(query)) { var svideo = await SoundCloud.Default.GetVideoAsync(query); return new Song(new SongInfo { Title = svideo.FullName, @@ -279,29 +276,25 @@ namespace NadekoBot.Classes.Music { ProviderType = musicType, }); } - else { - var links = await SearchHelper.FindYoutubeUrlByKeywords(query); - if (links == String.Empty) - throw new OperationCanceledException("Not a valid youtube query."); - var allVideos = await Task.Factory.StartNew(async () => await YouTube.Default.GetAllVideosAsync(links)).Unwrap(); - var videos = allVideos.Where(v => v.AdaptiveKind == AdaptiveKind.Audio); - var video = videos - .Where(v => v.AudioBitrate < 192) - .OrderByDescending(v => v.AudioBitrate) - .FirstOrDefault(); + var links = await SearchHelper.FindYoutubeUrlByKeywords(query); + if (links == String.Empty) + throw new OperationCanceledException("Not a valid youtube query."); + var allVideos = await Task.Factory.StartNew(async () => await YouTube.Default.GetAllVideosAsync(links)).Unwrap(); + var videos = allVideos.Where(v => v.AdaptiveKind == AdaptiveKind.Audio); + var video = videos + .Where(v => v.AudioBitrate < 192) + .OrderByDescending(v => v.AudioBitrate) + .FirstOrDefault(); - if (video == null) // do something with this error - throw new Exception("Could not load any video elements based on the query."); - return new Song(new SongInfo { - Title = video.Title.Substring(0, video.Title.Length - 10), // removing trailing "- You Tube" - Provider = "YouTube", - Uri = video.Uri, - ProviderType = musicType, - }); - - } - } - catch (Exception ex) { + if (video == null) // do something with this error + throw new Exception("Could not load any video elements based on the query."); + return new Song(new SongInfo { + Title = video.Title.Substring(0, video.Title.Length - 10), // removing trailing "- You Tube" + Provider = "YouTube", + Uri = video.Uri, + ProviderType = musicType, + }); + } catch (Exception ex) { Console.WriteLine($"Failed resolving the link.{ex.Message}"); return null; } @@ -311,8 +304,7 @@ namespace NadekoBot.Classes.Music { string file = null; try { file = await SearchHelper.GetResponseStringAsync(query); - } - catch { + } catch { return query; } if (query.Contains(".pls")) { @@ -322,13 +314,12 @@ namespace NadekoBot.Classes.Music { var m = Regex.Match(file, "File1=(?.*?)\\n"); var res = m.Groups["url"]?.ToString(); return res?.Trim(); - } - catch { + } catch { Console.WriteLine($"Failed reading .pls:\n{file}"); return null; } } - else if (query.Contains(".m3u")) { + if (query.Contains(".m3u")) { /* # This is a comment C:\xxx4xx\xxxxxx3x\xx2xxxx\xx.mp3 @@ -338,26 +329,24 @@ namespace NadekoBot.Classes.Music { var m = Regex.Match(file, "(?^[^#].*)", RegexOptions.Multiline); var res = m.Groups["url"]?.ToString(); return res?.Trim(); - } - catch { + } catch { Console.WriteLine($"Failed reading .m3u:\n{file}"); return null; } } - else if (query.Contains(".asx")) { + if (query.Contains(".asx")) { // try { var m = Regex.Match(file, ".*?)\""); var res = m.Groups["url"]?.ToString(); return res?.Trim(); - } - catch { + } catch { Console.WriteLine($"Failed reading .asx:\n{file}"); return null; } } - else if (query.Contains(".xspf")) { + if (query.Contains(".xspf")) { /* @@ -368,8 +357,7 @@ namespace NadekoBot.Classes.Music { var m = Regex.Match(file, "(?.*?)"); var res = m.Groups["url"]?.ToString(); return res?.Trim(); - } - catch { + } catch { Console.WriteLine($"Failed reading .xspf:\n{file}"); return null; } diff --git a/NadekoBot/Classes/Permissions/PermissionChecker.cs b/NadekoBot/Classes/Permissions/PermissionChecker.cs index a0d3d9e8..59898ff9 100644 --- a/NadekoBot/Classes/Permissions/PermissionChecker.cs +++ b/NadekoBot/Classes/Permissions/PermissionChecker.cs @@ -15,8 +15,8 @@ namespace NadekoBot.Classes.Permissions { public PermissionChecker() { Task.Run(async () => { while (true) { - //blacklist is cleared every 1.3 seconds. That is the most time anyone will be blocked for ever - await Task.Delay(1300); + //blacklist is cleared every 1.75 seconds. That is the most time anyone will be blocked for ever + await Task.Delay(1750); timeBlackList.Clear(); } }); @@ -45,7 +45,7 @@ namespace NadekoBot.Classes.Permissions { if (user.Server.Owner.Id == user.Id || (role != null && user.HasRole(role))) return true; ServerPermissions perms; - PermissionsHandler._permissionsDict.TryGetValue(user.Server.Id, out perms); + PermissionsHandler.PermissionsDict.TryGetValue(user.Server.Id, out perms); throw new Exception($"You don't have the necessary role (**{(perms?.PermissionsControllerRole ?? "Nadeko")}**) to change permissions."); } @@ -83,11 +83,11 @@ namespace NadekoBot.Classes.Permissions { default: return true; } - if (PermissionsHandler._permissionsDict[user.Server.Id].Verbose) //if verbose - print errors + if (PermissionsHandler.PermissionsDict[user.Server.Id].Verbose) //if verbose - print errors error = msg; return false; } catch (Exception ex) { - if (PermissionsHandler._permissionsDict[user.Server.Id].Verbose) //if verbose - print errors + if (PermissionsHandler.PermissionsDict[user.Server.Id].Verbose) //if verbose - print errors error = ex.Message; return false; } diff --git a/NadekoBot/Classes/Permissions/PermissionsHandler.cs b/NadekoBot/Classes/Permissions/PermissionsHandler.cs index b00a58b8..08b0af16 100644 --- a/NadekoBot/Classes/Permissions/PermissionsHandler.cs +++ b/NadekoBot/Classes/Permissions/PermissionsHandler.cs @@ -4,12 +4,13 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Discord.Commands; namespace NadekoBot.Classes.Permissions { public static class PermissionsHandler { - public static ConcurrentDictionary _permissionsDict = + public static ConcurrentDictionary PermissionsDict = new ConcurrentDictionary(); public enum PermissionBanType { @@ -25,19 +26,18 @@ namespace NadekoBot.Classes.Permissions { foreach (var file in Directory.EnumerateFiles("data/permissions/")) { try { var strippedFileName = Path.GetFileNameWithoutExtension(file); + if (string.IsNullOrWhiteSpace(strippedFileName)) continue; var id = ulong.Parse(strippedFileName); var data = Newtonsoft.Json.JsonConvert.DeserializeObject(File.ReadAllText(file)); - _permissionsDict.TryAdd(id, data); - } catch (Exception ex) { - //Console.WriteLine($"Failed getting server with id: {file}\nReason: {ex.Message}"); - } + PermissionsDict.TryAdd(id, data); + } catch { } } Console.WriteLine("Permission initialization complete."); } internal static Permissions GetRolePermissionsById(Server server, ulong id) { ServerPermissions serverPerms; - if (!_permissionsDict.TryGetValue(server.Id, out serverPerms)) + if (!PermissionsDict.TryGetValue(server.Id, out serverPerms)) return null; Permissions toReturn; @@ -47,7 +47,7 @@ namespace NadekoBot.Classes.Permissions { internal static Permissions GetUserPermissionsById(Server server, ulong id) { ServerPermissions serverPerms; - if (!_permissionsDict.TryGetValue(server.Id, out serverPerms)) + if (!PermissionsDict.TryGetValue(server.Id, out serverPerms)) return null; Permissions toReturn; @@ -57,7 +57,7 @@ namespace NadekoBot.Classes.Permissions { internal static Permissions GetChannelPermissionsById(Server server, ulong id) { ServerPermissions serverPerms; - if (!_permissionsDict.TryGetValue(server.Id, out serverPerms)) + if (!PermissionsDict.TryGetValue(server.Id, out serverPerms)) return null; Permissions toReturn; @@ -67,32 +67,29 @@ namespace NadekoBot.Classes.Permissions { internal static Permissions GetServerPermissions(Server server) { ServerPermissions serverPerms; - if (!_permissionsDict.TryGetValue(server.Id, out serverPerms)) - return null; - - return serverPerms.Permissions; + return !PermissionsDict.TryGetValue(server.Id, out serverPerms) ? null : serverPerms.Permissions; } internal static PermissionBanType GetPermissionBanType(Command command, User user, Channel channel) { var server = user.Server; ServerPermissions serverPerms; - if (!_permissionsDict.TryGetValue(server.Id,out serverPerms)) { + if (!PermissionsDict.TryGetValue(server.Id, out serverPerms)) { serverPerms = new ServerPermissions(server.Id, server.Name); - _permissionsDict.TryAdd(server.Id, serverPerms); + PermissionsDict.TryAdd(server.Id, serverPerms); } bool val; Permissions perm; //server - if (serverPerms.Permissions.modules.TryGetValue(command.Category, out val) && val == false) + if (serverPerms.Permissions.Modules.TryGetValue(command.Category, out val) && val == false) return PermissionBanType.ServerBanModule; - if (serverPerms.Permissions.commands.TryGetValue(command.Text, out val) && val == false) + if (serverPerms.Permissions.Commands.TryGetValue(command.Text, out val) && val == false) return PermissionBanType.ServerBanCommand; //channel if (serverPerms.ChannelPermissions.TryGetValue(channel.Id, out perm) && - perm.modules.TryGetValue(command.Category, out val) && val == false) + perm.Modules.TryGetValue(command.Category, out val) && val == false) return PermissionBanType.ChannelBanModule; if (serverPerms.ChannelPermissions.TryGetValue(channel.Id, out perm) && - perm.commands.TryGetValue(command.Text, out val) && val == false) + perm.Commands.TryGetValue(command.Text, out val) && val == false) return PermissionBanType.ChannelBanCommand; //ROLE PART - TWO CASES @@ -101,16 +98,14 @@ namespace NadekoBot.Classes.Permissions { // THAT MEANS USER CANNOT RUN THIS COMMAND // IF AT LEAST ONE ROLE EXIST THAT IS NOT BANNED, // USER CAN RUN THE COMMAND - bool foundNotBannedRole = false; + var foundNotBannedRole = false; foreach (var role in user.Roles) { //if every role is banned from using the module -> rolebanmodule if (serverPerms.RolePermissions.TryGetValue(role.Id, out perm) && - perm.modules.TryGetValue(command.Category, out val) && val == false) + perm.Modules.TryGetValue(command.Category, out val) && val == false) continue; - else { - foundNotBannedRole = true; - break; - } + foundNotBannedRole = true; + break; } if (!foundNotBannedRole) return PermissionBanType.RoleBanModule; @@ -124,7 +119,7 @@ namespace NadekoBot.Classes.Permissions { foreach (var role in user.Roles) { //if every role is banned from using the module -> rolebanmodule if (serverPerms.RolePermissions.TryGetValue(role.Id, out perm) && - perm.commands.TryGetValue(command.Text, out val) && val == false) + perm.Commands.TryGetValue(command.Text, out val) && val == false) continue; else { foundNotBannedRole = true; @@ -136,169 +131,175 @@ namespace NadekoBot.Classes.Permissions { //user if (serverPerms.UserPermissions.TryGetValue(user.Id, out perm) && - perm.modules.TryGetValue(command.Category, out val) && val == false) + perm.Modules.TryGetValue(command.Category, out val) && val == false) return PermissionBanType.UserBanModule; if (serverPerms.UserPermissions.TryGetValue(user.Id, out perm) && - perm.commands.TryGetValue(command.Text, out val) && val == false) + perm.Commands.TryGetValue(command.Text, out val) && val == false) return PermissionBanType.UserBanCommand; return PermissionBanType.None; } - private static void WriteServerToJson(ulong serverId) { - string pathToFile = $"data/permissions/{serverId}.json"; - File.WriteAllText(pathToFile, Newtonsoft.Json.JsonConvert.SerializeObject(_permissionsDict[serverId], Newtonsoft.Json.Formatting.Indented)); + private static void WriteServerToJson(ServerPermissions serverPerms) { + string pathToFile = $"data/permissions/{serverPerms}.json"; + File.WriteAllText(pathToFile, + Newtonsoft.Json.JsonConvert.SerializeObject(serverPerms, Newtonsoft.Json.Formatting.Indented)); } public static void WriteToJson() { Directory.CreateDirectory("data/permissions/"); - foreach (var kvp in _permissionsDict) { - WriteServerToJson(kvp.Key); + foreach (var kvp in PermissionsDict) { + WriteServerToJson(kvp.Value); } } public static string GetServerPermissionsRoleName(Server server) { - ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id, - serverPerms = new ServerPermissions(server.Id, server.Name)); + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); + return serverPerms.PermissionsControllerRole; } internal static void SetPermissionsRole(Server server, string roleName) { - ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id, - serverPerms = new ServerPermissions(server.Id, server.Name)); + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); + serverPerms.PermissionsControllerRole = roleName; - Task.Run(() => WriteServerToJson(server.Id)); + Task.Run(() => WriteServerToJson(serverPerms)); } internal static void SetVerbosity(Server server, bool val) { - ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id, - serverPerms = new ServerPermissions(server.Id, server.Name)); + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); + serverPerms.Verbose = val; - Task.Run(() => WriteServerToJson(server.Id)); + Task.Run(() => WriteServerToJson(serverPerms)); } public static void SetServerModulePermission(Server server, string moduleName, bool value) { - ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id, - serverPerms = new ServerPermissions(server.Id, server.Name)); - var modules = serverPerms.Permissions.modules; + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); + + var modules = serverPerms.Permissions.Modules; if (modules.ContainsKey(moduleName)) modules[moduleName] = value; else modules.Add(moduleName, value); - Task.Run(() => WriteServerToJson(server.Id)); + Task.Run(() => WriteServerToJson(serverPerms)); } public static void SetServerCommandPermission(Server server, string commandName, bool value) { - ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id, - serverPerms = new ServerPermissions(server.Id, server.Name)); - var commands = serverPerms.Permissions.commands; + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); + + var commands = serverPerms.Permissions.Commands; if (commands.ContainsKey(commandName)) commands[commandName] = value; else commands.Add(commandName, value); - Task.Run(() => WriteServerToJson(server.Id)); + Task.Run(() => WriteServerToJson(serverPerms)); } public static void SetChannelModulePermission(Channel channel, string moduleName, bool value) { var server = channel.Server; - ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id, - serverPerms = new ServerPermissions(server.Id, server.Name)); + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); if (!serverPerms.ChannelPermissions.ContainsKey(channel.Id)) serverPerms.ChannelPermissions.Add(channel.Id, new Permissions(channel.Name)); - var modules = serverPerms.ChannelPermissions[channel.Id].modules; + var modules = serverPerms.ChannelPermissions[channel.Id].Modules; if (modules.ContainsKey(moduleName)) modules[moduleName] = value; else modules.Add(moduleName, value); - Task.Run(() => WriteServerToJson(server.Id)); + Task.Run(() => WriteServerToJson(serverPerms)); } public static void SetChannelCommandPermission(Channel channel, string commandName, bool value) { var server = channel.Server; - ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id, - serverPerms = new ServerPermissions(server.Id, server.Name)); + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); if (!serverPerms.ChannelPermissions.ContainsKey(channel.Id)) serverPerms.ChannelPermissions.Add(channel.Id, new Permissions(channel.Name)); - var commands = serverPerms.ChannelPermissions[channel.Id].commands; + var commands = serverPerms.ChannelPermissions[channel.Id].Commands; if (commands.ContainsKey(commandName)) commands[commandName] = value; else commands.Add(commandName, value); - Task.Run(() => WriteServerToJson(server.Id)); + Task.Run(() => WriteServerToJson(serverPerms)); } public static void SetRoleModulePermission(Role role, string moduleName, bool value) { var server = role.Server; - ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id, - serverPerms = new ServerPermissions(server.Id, server.Name)); + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); if (!serverPerms.RolePermissions.ContainsKey(role.Id)) serverPerms.RolePermissions.Add(role.Id, new Permissions(role.Name)); - var modules = serverPerms.RolePermissions[role.Id].modules; + var modules = serverPerms.RolePermissions[role.Id].Modules; if (modules.ContainsKey(moduleName)) modules[moduleName] = value; else modules.Add(moduleName, value); - Task.Run(() => WriteServerToJson(server.Id)); + Task.Run(() => WriteServerToJson(serverPerms)); } public static void SetRoleCommandPermission(Role role, string commandName, bool value) { var server = role.Server; - ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id, - serverPerms = new ServerPermissions(server.Id, server.Name)); + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); if (!serverPerms.RolePermissions.ContainsKey(role.Id)) serverPerms.RolePermissions.Add(role.Id, new Permissions(role.Name)); - var commands = serverPerms.RolePermissions[role.Id].commands; + var commands = serverPerms.RolePermissions[role.Id].Commands; if (commands.ContainsKey(commandName)) commands[commandName] = value; else commands.Add(commandName, value); - Task.Run(() => WriteServerToJson(server.Id)); + Task.Run(() => WriteServerToJson(serverPerms)); } public static void SetUserModulePermission(User user, string moduleName, bool value) { var server = user.Server; - ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id, - serverPerms = new ServerPermissions(server.Id, server.Name)); + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); if (!serverPerms.UserPermissions.ContainsKey(user.Id)) serverPerms.UserPermissions.Add(user.Id, new Permissions(user.Name)); - var modules = serverPerms.UserPermissions[user.Id].modules; + var modules = serverPerms.UserPermissions[user.Id].Modules; if (modules.ContainsKey(moduleName)) modules[moduleName] = value; else modules.Add(moduleName, value); - Task.Run(() => WriteServerToJson(server.Id)); + Task.Run(() => WriteServerToJson(serverPerms)); } public static void SetUserCommandPermission(User user, string commandName, bool value) { var server = user.Server; - ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id, - serverPerms = new ServerPermissions(server.Id, server.Name)); + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); if (!serverPerms.UserPermissions.ContainsKey(user.Id)) serverPerms.UserPermissions.Add(user.Id, new Permissions(user.Name)); - var commands = serverPerms.UserPermissions[user.Id].commands; + var commands = serverPerms.UserPermissions[user.Id].Commands; if (commands.ContainsKey(commandName)) commands[commandName] = value; else commands.Add(commandName, value); - Task.Run(() => WriteServerToJson(server.Id)); + Task.Run(() => WriteServerToJson(serverPerms)); } } /// @@ -312,33 +313,31 @@ namespace NadekoBot.Classes.Permissions { /// /// Module name with allowed/disallowed /// - public Dictionary modules { get; set; } + public Dictionary Modules { get; set; } /// /// Command name with allowed/disallowed /// - public Dictionary commands { get; set; } + public Dictionary Commands { get; set; } public Permissions(string name) { Name = name; - modules = new Dictionary(); - commands = new Dictionary(); + Modules = new Dictionary(); + Commands = new Dictionary(); } public override string ToString() { - string toReturn = ""; - var bannedModules = modules.Where(kvp => kvp.Value == false); - if (bannedModules.Count() > 0) { + var toReturn = ""; + var bannedModules = Modules.Where(kvp => kvp.Value == false); + var bannedModulesArray = bannedModules as KeyValuePair[] ?? bannedModules.ToArray(); + if (bannedModulesArray.Any()) { toReturn += "`Banned Modules:`\n"; - foreach (var m in bannedModules) { - toReturn += $"\t`[x] {m.Key}`\n"; - } + toReturn = bannedModulesArray.Aggregate(toReturn, (current, m) => current + $"\t`[x] {m.Key}`\n"); } - var bannedCommands = commands.Where(kvp => kvp.Value == false); - if (bannedCommands.Count() > 0) { + var bannedCommands = Commands.Where(kvp => kvp.Value == false); + var bannedCommandsArr = bannedCommands as KeyValuePair[] ?? bannedCommands.ToArray(); + if (bannedCommandsArr.Any()) { toReturn += "`Banned Commands:`\n"; - foreach (var c in bannedCommands) { - toReturn += $"\t`[x] {c.Key}`\n"; - } + toReturn = bannedCommandsArr.Aggregate(toReturn, (current, c) => current + $"\t`[x] {c.Key}`\n"); } return toReturn; } diff --git a/NadekoBot/Classes/SearchHelper.cs b/NadekoBot/Classes/SearchHelper.cs index 0d7711fa..71b30fe2 100644 --- a/NadekoBot/Classes/SearchHelper.cs +++ b/NadekoBot/Classes/SearchHelper.cs @@ -20,31 +20,30 @@ namespace NadekoBot.Classes { public static class SearchHelper { private static DateTime lastRefreshed = DateTime.MinValue; - private static string token = ""; + private static string token { get; set; } = ""; public static async Task GetResponseStreamAsync(string url, IEnumerable> headers = null, RequestHttpMethod method = RequestHttpMethod.Get) { if (string.IsNullOrWhiteSpace(url)) throw new ArgumentNullException(nameof(url)); - using (var httpClient = new HttpClient()) { - switch (method) { - case RequestHttpMethod.Get: - if (headers != null) { - foreach (var header in headers) { - httpClient.DefaultRequestHeaders.Add(header.Key, header.Value); - } + var httpClient = new HttpClient(); + switch (method) { + case RequestHttpMethod.Get: + if (headers != null) { + foreach (var header in headers) { + httpClient.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, header.Value); } - return await httpClient.GetStreamAsync(url); - case RequestHttpMethod.Post: - FormUrlEncodedContent formContent = null; - if (headers != null) { - formContent = new FormUrlEncodedContent(headers); - } - var message = await httpClient.PostAsync(url, formContent); - return await message.Content.ReadAsStreamAsync(); - default: - throw new NotImplementedException("That type of request is unsupported."); - } + } + return await httpClient.GetStreamAsync(url); + case RequestHttpMethod.Post: + FormUrlEncodedContent formContent = null; + if (headers != null) { + formContent = new FormUrlEncodedContent(headers); + } + var message = await httpClient.PostAsync(url, formContent); + return await message.Content.ReadAsStreamAsync(); + default: + throw new NotImplementedException("That type of request is unsupported."); } } @@ -64,13 +63,19 @@ namespace NadekoBot.Classes { await RefreshAnilistToken(); var link = "http://anilist.co/api/anime/search/" + Uri.EscapeUriString(query); + try { + var headers = new Dictionary {{"'access_token'", "'"+token+"'"}}; + var smallContent = await GetResponseStringAsync(link, headers); + var smallObj = JArray.Parse(smallContent)[0]; + var content = await GetResponseStringAsync("http://anilist.co/api/anime/" + smallObj["id"], headers); - var headers = new Dictionary { { "access_token", token } }; - var smallContent = await GetResponseStringAsync(link, headers); - var smallObj = JArray.Parse(smallContent)[0]; - var content = await GetResponseStringAsync("http://anilist.co/api/anime/" + smallObj["id"], headers); + return await Task.Run(() => JsonConvert.DeserializeObject(content)); - return await Task.Run(() => JsonConvert.DeserializeObject(content)); + } + catch (Exception ex) { + Console.WriteLine(ex); + return new AnimeResult(); + } } public static async Task GetMangaQueryResultLink(string query) { @@ -90,6 +95,11 @@ namespace NadekoBot.Classes { } private static async Task RefreshAnilistToken() { + if (DateTime.Now - lastRefreshed > TimeSpan.FromMinutes(29)) + lastRefreshed=DateTime.Now; + else { + return; + } var headers = new Dictionary { {"grant_type", "client_credentials"}, {"client_id", "kwoth-w0ki9"}, diff --git a/NadekoBot/Commands/LoLCommands.cs b/NadekoBot/Commands/LoLCommands.cs index e5ff49db..a41bade0 100644 --- a/NadekoBot/Commands/LoLCommands.cs +++ b/NadekoBot/Commands/LoLCommands.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using Discord.Commands; using System.Drawing; +using NadekoBot.Classes; using NadekoBot.Extensions; using Newtonsoft.Json.Linq; @@ -22,7 +23,7 @@ namespace NadekoBot.Commands { private System.Timers.Timer clearTimer { get; } = new System.Timers.Timer(); - public LoLCommands() { + public LoLCommands() { clearTimer.Interval = new TimeSpan(0, 10, 0).TotalMilliseconds; clearTimer.Start(); clearTimer.Elapsed += (s, e) => { @@ -31,17 +32,16 @@ namespace NadekoBot.Commands { CachedChampionImages = CachedChampionImages .Where(kvp => DateTime.Now - kvp.Value.AddedAt > new TimeSpan(1, 0, 0)) .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); - } - catch { } + } catch { } }; } - private string[] trashTalk = new[] { "Better ban your counters. You are going to carry the game anyway.", - "Go with the flow. Don't think. Just ban one of these.", - "DONT READ BELOW! Ban Urgot mid OP 100%. Im smurf Diamond 1.", - "Ask your teammates what would they like to play, and ban that.", - "If you consider playing teemo, do it. If you consider teemo, you deserve him.", - "Doesn't matter what you ban really. Enemy will ban your main and you will lose." }; + private readonly string[] trashTalk = { "Better ban your counters. You are going to carry the game anyway.", + "Go with the flow. Don't think. Just ban one of these.", + "DONT READ BELOW! Ban Urgot mid OP 100%. Im smurf Diamond 1.", + "Ask your teammates what would they like to play, and ban that.", + "If you consider playing teemo, do it. If you consider teemo, you deserve him.", + "Doesn't matter what you ban really. Enemy will ban your main and you will lose." }; public override Func DoFunc() { throw new NotImplementedException(); @@ -63,15 +63,14 @@ namespace NadekoBot.Commands { .Do(async e => { try { //get role - string role = ResolvePos(e.GetArg("position")); - string resolvedRole = role; + var role = ResolvePos(e.GetArg("position")); + var resolvedRole = role; var name = e.GetArg("champ").Replace(" ", ""); CachedChampion champ = null; lock (cacheLock) { CachedChampionImages.TryGetValue(name + "_" + resolvedRole, out champ); } if (champ != null) { - Console.WriteLine("Sending lol image from cache."); champ.ImageStream.Position = 0; await e.Channel.SendFile("champ.png", champ.ImageStream); return; @@ -79,7 +78,7 @@ namespace NadekoBot.Commands { var allData = JArray.Parse(await Classes.SearchHelper.GetResponseStringAsync($"http://api.champion.gg/champion/{name}?api_key={NadekoBot.Creds.LOLAPIKey}")); JToken data = null; if (role != null) { - for (int i = 0; i < allData.Count; i++) { + for (var i = 0; i < allData.Count; i++) { if (allData[i]["role"].ToString().Equals(role)) { data = allData[i]; break; @@ -89,8 +88,7 @@ namespace NadekoBot.Commands { await e.Channel.SendMessage("💢 Data for that role does not exist."); return; } - } - else { + } else { data = allData[0]; role = allData[0]["role"].ToString(); resolvedRole = ResolvePos(role); @@ -107,14 +105,14 @@ namespace NadekoBot.Commands { //name = data["title"].ToString(); // get all possible roles, and "select" the shown one var roles = new string[allData.Count]; - for (int i = 0; i < allData.Count; i++) { + for (var i = 0; i < allData.Count; i++) { roles[i] = allData[i]["role"].ToString(); if (roles[i] == role) roles[i] = ">" + roles[i] + "<"; } - var general = JArray.Parse(await Classes.SearchHelper.GetResponseStringAsync($"http://api.champion.gg/stats/champs/{name}?api_key={NadekoBot.Creds.LOLAPIKey}")) - .Where(jt => jt["role"].ToString() == role) - .FirstOrDefault()?["general"]; + var general = JArray.Parse(await SearchHelper.GetResponseStringAsync($"http://api.champion.gg/stats/" + + $"champs/{name}?api_key={NadekoBot.Creds.LOLAPIKey}")) + .FirstOrDefault(jt => jt["role"].ToString() == role)?["general"]; if (general == null) { Console.WriteLine("General is null."); return; @@ -122,7 +120,7 @@ namespace NadekoBot.Commands { //get build data for this role var buildData = data["items"]["mostGames"]["items"]; var items = new string[6]; - for (int i = 0; i < 6; i++) { + for (var i = 0; i < 6; i++) { items[i] = buildData[i]["id"].ToString(); } @@ -147,13 +145,12 @@ namespace NadekoBot.Commands { var orderArr = (data["skills"]["mostGames"]["order"] as JArray); //todo save this for at least 1 hour - Image img = Image.FromFile("data/lol/bg.png"); - using (Graphics g = Graphics.FromImage(img)) { + var img = Image.FromFile("data/lol/bg.png"); + using (var g = Graphics.FromImage(img)) { g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; //g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy; - int statsFontSize = 15; - int margin = 5; - int imageSize = 75; + const int margin = 5; + const int imageSize = 75; var normalFont = new Font("Monaco", 8, FontStyle.Regular); var smallFont = new Font("Monaco", 7, FontStyle.Regular); //draw champ image @@ -168,18 +165,26 @@ namespace NadekoBot.Commands { //todo //draw skill order float orderFormula = 120 / orderArr.Count; - float orderVerticalSpacing = 10; - for (int i = 0; i < orderArr.Count; i++) { - float orderX = margin + margin + imageSize + orderFormula * i + i; + const float orderVerticalSpacing = 10; + for (var i = 0; i < orderArr.Count; i++) { + var orderX = margin + margin + imageSize + orderFormula * i + i; float orderY = margin + 35; - string spellName = orderArr[i].ToString().ToLowerInvariant(); + var spellName = orderArr[i].ToString().ToLowerInvariant(); - if (spellName == "w") - orderY += orderVerticalSpacing; - else if (spellName == "e") - orderY += orderVerticalSpacing * 2; - else if (spellName == "r") - orderY += orderVerticalSpacing * 3; + switch (spellName) { + case "w": + orderY += orderVerticalSpacing; + break; + case "e": + orderY += orderVerticalSpacing * 2; + break; + case "r": + orderY += orderVerticalSpacing * 3; + break; + default: + orderY += orderVerticalSpacing * 3; + break; + } g.DrawString(spellName.ToUpperInvariant(), new Font("Monaco", 7), Brushes.LimeGreen, orderX, orderY); } @@ -200,9 +205,9 @@ Assists: {general["assists"]} Ban: {general["banRate"]}% g.DrawString($"{runes}", smallFont, Brushes.WhiteSmoke, margin, margin + imageSize + margin + 40); //draw counters g.DrawString($"Best against", smallFont, Brushes.WhiteSmoke, margin, img.Height - imageSize + margin); - int smallImgSize = 50; + var smallImgSize = 50; - for (int i = 0; i < counters.Length; i++) { + for (var i = 0; i < counters.Length; i++) { g.DrawImage(GetImage(counters[i]), new Rectangle(i * (smallImgSize + margin) + margin, img.Height - smallImgSize - margin, smallImgSize, @@ -211,8 +216,8 @@ Assists: {general["assists"]} Ban: {general["banRate"]}% //draw countered by g.DrawString($"Worst against", smallFont, Brushes.WhiteSmoke, img.Width - 3 * (smallImgSize + margin), img.Height - imageSize + margin); - for (int i = 0; i < countered.Length; i++) { - int j = countered.Length - i; + for (var i = 0; i < countered.Length; i++) { + var j = countered.Length - i; g.DrawImage(GetImage(countered[i]), new Rectangle(img.Width - (j * (smallImgSize + margin) + margin), img.Height - smallImgSize - margin, smallImgSize, @@ -221,10 +226,10 @@ Assists: {general["assists"]} Ban: {general["banRate"]}% //draw item build g.DrawString("Popular build", normalFont, Brushes.WhiteSmoke, img.Width - (3 * (smallImgSize + margin) + margin), 77); - for (int i = 0; i < 6; i++) { - var inverse_i = 5 - i; - var j = inverse_i % 3 + 1; - var k = inverse_i / 3; + for (var i = 0; i < 6; i++) { + var inverseI = 5 - i; + var j = inverseI % 3 + 1; + var k = inverseI / 3; g.DrawImage(GetImage(items[i], GetImageType.Item), new Rectangle(img.Width - (j * (smallImgSize + margin) + margin), 92 + k * (smallImgSize + margin), smallImgSize, @@ -234,10 +239,8 @@ Assists: {general["assists"]} Ban: {general["banRate"]}% var cachedChamp = new CachedChampion { AddedAt = DateTime.Now, ImageStream = img.ToStream(System.Drawing.Imaging.ImageFormat.Png), Name = name.ToLower() + "_" + resolvedRole }; CachedChampionImages.Add(cachedChamp.Name, cachedChamp); await e.Channel.SendFile(data["title"] + "_stats.png", cachedChamp.ImageStream); - } - catch (Exception ex) { + } catch { await e.Channel.SendMessage("💢 Failed retreiving data for that champion."); - return; } }); @@ -245,7 +248,7 @@ Assists: {general["assists"]} Ban: {general["banRate"]}% .Description("Shows top 6 banned champions ordered by ban rate. Ban these champions and you will be Plat 5 in no time.") .Do(async e => { - int showCount = 6; + var showCount = 6; //http://api.champion.gg/stats/champs/mostBanned?api_key=YOUR_API_TOKEN&page=1&limit=2 try { var data = JObject.Parse( @@ -253,10 +256,10 @@ Assists: {general["assists"]} Ban: {general["banRate"]}% .SearchHelper .GetResponseStringAsync($"http://api.champion.gg/stats/champs/mostBanned?api_key={NadekoBot.Creds.LOLAPIKey}&page=1&limit={showCount}"))["data"] as JArray; - StringBuilder sb = new StringBuilder(); + var sb = new StringBuilder(); sb.AppendLine($"**Showing {showCount} top banned champions.**"); sb.AppendLine($"`{trashTalk[new Random().Next(0, trashTalk.Length)]}`"); - for (int i = 0; i < data.Count; i++) { + for (var i = 0; i < data.Count; i++) { if (i % 2 == 0 && i != 0) sb.AppendLine(); sb.Append($"`{i + 1}.` **{data[i]["name"]}** "); @@ -264,8 +267,7 @@ Assists: {general["assists"]} Ban: {general["banRate"]}% } await e.Channel.SendMessage(sb.ToString()); - } - catch (Exception ex) { + } catch (Exception ex) { await e.Channel.SendMessage($"Fail:\n{ex}"); } }); @@ -275,7 +277,7 @@ Assists: {general["assists"]} Ban: {general["banRate"]}% Champion, Item } - private Image GetImage(string id, GetImageType imageType = GetImageType.Champion) { + private static Image GetImage(string id, GetImageType imageType = GetImageType.Champion) { try { switch (imageType) { case GetImageType.Champion: @@ -284,13 +286,12 @@ Assists: {general["assists"]} Ban: {general["banRate"]}% default: return Image.FromFile($"data/lol/items/{id}.png"); } - } - catch (Exception) { + } catch (Exception) { return Image.FromFile("data/lol/_ERROR.png"); } } - private string ResolvePos(string pos) { + private static string ResolvePos(string pos) { if (string.IsNullOrWhiteSpace(pos)) return null; switch (pos.ToLowerInvariant()) { diff --git a/NadekoBot/Commands/PlayingRotate.cs b/NadekoBot/Commands/PlayingRotate.cs index 3008ad32..f6680df8 100644 --- a/NadekoBot/Commands/PlayingRotate.cs +++ b/NadekoBot/Commands/PlayingRotate.cs @@ -5,55 +5,58 @@ using System.Text; using System.Threading.Tasks; using Discord.Commands; using System.Timers; +using NadekoBot.Modules; namespace NadekoBot.Commands { internal class PlayingRotate : DiscordCommand { private static List rotatingStatuses = new List(); - private static Timer timer = new Timer(12000); + private static readonly Timer timer = new Timer(12000); - private Dictionary> playingPlaceholders => new Dictionary> { - {"%servers%", ()=> NadekoBot.Client.Servers.Count().ToString() }, - {"%users%", () => NadekoBot.Client.Servers.SelectMany(s=>s.Users).Count().ToString() }, - {"%playing%", () => { - var cnt = Modules.Music.musicPlayers.Where(kvp => kvp.Value.CurrentSong != null).Count(); - if(cnt == 1) { + public static Dictionary> PlayingPlaceholders { get; } = + new Dictionary> { + {"%servers%", () => NadekoBot.Client.Servers.Count().ToString()}, + {"%users%", () => NadekoBot.Client.Servers.SelectMany(s => s.Users).Count().ToString()}, { + "%playing%", () => { + var cnt = Music.MusicPlayers.Count(kvp => kvp.Value.CurrentSong != null); + if (cnt != 1) return cnt.ToString(); try { - var mp = Modules.Music.musicPlayers.FirstOrDefault(); + var mp = Music.MusicPlayers.FirstOrDefault(); return mp.Value.CurrentSong.SongInfo.Title; - } catch { } + } + catch { + return "No songs"; + } } - return cnt.ToString(); - } - }, - {"%queued%", () => Modules.Music.musicPlayers.Sum(kvp=>kvp.Value.Playlist.Count).ToString() }, - {"%trivia%", () => Commands.Trivia.runningTrivias.Count.ToString() } - }; - private object playingPlaceholderLock => new object(); + }, + {"%queued%", () => Music.MusicPlayers.Sum(kvp => kvp.Value.Playlist.Count).ToString()}, + {"%trivia%", () => Trivia.runningTrivias.Count.ToString()} + }; + + private readonly object playingPlaceholderLock = new object(); public PlayingRotate() { - int i = -1; + var i = -1; timer.Elapsed += (s, e) => { try { i++; - string status = ""; + var status = ""; lock (playingPlaceholderLock) { - if (playingPlaceholders.Count == 0) + if (PlayingPlaceholders.Count == 0) return; - if (i >= playingPlaceholders.Count) { + if (i >= PlayingPlaceholders.Count) { i = -1; return; } status = rotatingStatuses[i]; - foreach (var kvp in playingPlaceholders) { - status = status.Replace(kvp.Key, kvp.Value()); - } + status = PlayingPlaceholders.Aggregate(status, + (current, kvp) => current.Replace(kvp.Key, kvp.Value())); } if (string.IsNullOrWhiteSpace(status)) return; - Task.Run(() => { try { NadekoBot.Client.SetGame(status); } catch { } }); + Task.Run(() => { NadekoBot.Client.SetGame(status); }); } - catch { } + catch {} }; } @@ -74,7 +77,8 @@ namespace NadekoBot.Commands { cgb.CreateCommand(".addplaying") .Alias(".adpl") - .Description("Adds a specified string to the list of playing strings to rotate. Supported placeholders: " + string.Join(", ", playingPlaceholders.Keys)) + .Description("Adds a specified string to the list of playing strings to rotate. " + + "Supported placeholders: " + string.Join(", ", PlayingPlaceholders.Keys)) .Parameter("text", ParameterType.Unparsed) .AddCheck(Classes.Permissions.SimpleCheckers.OwnerOnly()) .Do(async e => { @@ -93,31 +97,32 @@ namespace NadekoBot.Commands { .AddCheck(Classes.Permissions.SimpleCheckers.OwnerOnly()) .Do(async e => { if (rotatingStatuses.Count == 0) - await e.Channel.SendMessage("`There are no playing strings. Add some with .addplaying [text] command.`"); - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < rotatingStatuses.Count; i++) { + await e.Channel.SendMessage("`There are no playing strings. " + + "Add some with .addplaying [text] command.`"); + var sb = new StringBuilder(); + for (var i = 0; i < rotatingStatuses.Count; i++) { sb.AppendLine($"`{i + 1}.` {rotatingStatuses[i]}"); } await e.Channel.SendMessage(sb.ToString()); }); cgb.CreateCommand(".removeplaying") - .Alias(".repl") - .Description("Removes a playing string on a given number.") - .Parameter("number", ParameterType.Required) - .AddCheck(Classes.Permissions.SimpleCheckers.OwnerOnly()) - .Do(async e => { - var arg = e.GetArg("number"); - int num; - string str; - lock (playingPlaceholderLock) { - if (!int.TryParse(arg.Trim(), out num) || num <= 0 || num > rotatingStatuses.Count) - return; - str = rotatingStatuses[num - 1]; - rotatingStatuses.RemoveAt(num - 1); - } - await e.Channel.SendMessage($"🆗 `Removed playing string #{num}`({str})"); - }); + .Alias(".repl", ".rmpl") + .Description("Removes a playing string on a given number.") + .Parameter("number", ParameterType.Required) + .AddCheck(Classes.Permissions.SimpleCheckers.OwnerOnly()) + .Do(async e => { + var arg = e.GetArg("number"); + int num; + string str; + lock (playingPlaceholderLock) { + if (!int.TryParse(arg.Trim(), out num) || num <= 0 || num > rotatingStatuses.Count) + return; + str = rotatingStatuses[num - 1]; + rotatingStatuses.RemoveAt(num - 1); + } + await e.Channel.SendMessage($"🆗 `Removed playing string #{num}`({str})"); + }); } } } diff --git a/NadekoBot/Commands/PollCommand.cs b/NadekoBot/Commands/PollCommand.cs index ad30aa91..61e84b02 100644 --- a/NadekoBot/Commands/PollCommand.cs +++ b/NadekoBot/Commands/PollCommand.cs @@ -20,19 +20,24 @@ namespace NadekoBot.Commands { cgb.CreateCommand(">poll") .Description("Creates a poll, only person who has manage server permission can do it.\n**Usage**: >poll Question?;Answer1;Answ 2;A_3") .Parameter("allargs", ParameterType.Unparsed) - .Do(e => { - if (!e.User.ServerPermissions.ManageChannels) - return; - if (ActivePolls.ContainsKey(e.Server)) - return; - var arg = e.GetArg("allargs"); - if (string.IsNullOrWhiteSpace(arg) || !arg.Contains(";")) - return; - var data = arg.Split(';'); - if (data.Length < 3) - return; + .Do(async e => { + await Task.Run(async () => { + if (!e.User.ServerPermissions.ManageChannels) + return; + if (ActivePolls.ContainsKey(e.Server)) + return; + var arg = e.GetArg("allargs"); + if (string.IsNullOrWhiteSpace(arg) || !arg.Contains(";")) + return; + var data = arg.Split(';'); + if (data.Length < 3) + return; - new Poll(e, data[0], data.Skip(1)); + var poll = new Poll(e, data[0], data.Skip(1)); + if (PollCommand.ActivePolls.TryAdd(e.Server, poll)) { + await poll.StartPoll(); + } + }); }); cgb.CreateCommand(">pollend") .Description("Stops active poll on this server and prints the results in this channel.") @@ -47,33 +52,27 @@ namespace NadekoBot.Commands { } internal class Poll { - private CommandEventArgs e; - private string[] answers; + private readonly CommandEventArgs e; + private readonly string[] answers; private ConcurrentDictionary participants = new ConcurrentDictionary(); - private string question; + private readonly string question; private DateTime started; private CancellationTokenSource pollCancellationSource = new CancellationTokenSource(); - public Poll(CommandEventArgs e, string v, IEnumerable enumerable) { + public Poll(CommandEventArgs e, string question, IEnumerable enumerable) { this.e = e; - this.question = v; - this.answers = enumerable.ToArray(); - - if (PollCommand.ActivePolls.TryAdd(e.Server, this)) { - Task.Factory.StartNew(async () => await StartPoll()); - } + this.question = question; + this.answers = enumerable as string[] ?? enumerable.ToArray(); } - private async Task StartPoll() { + public async Task StartPoll() { started = DateTime.Now; NadekoBot.Client.MessageReceived += Vote; var msgToSend = $"📃**{e.User.Name}** from **{e.Server.Name}** server has created a poll which requires your attention:\n\n" + $"**{question}**\n"; - int num = 1; - foreach (var answ in answers) { - msgToSend += $"`{num++}.` **{answ}**\n"; - } + 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); } @@ -87,16 +86,16 @@ namespace NadekoBot.Commands { .ToDictionary(x => x.Key, x => x.Sum(kvp => 1)) .OrderBy(kvp => kvp.Value); - int totalVotesCast = results.Sum(kvp => kvp.Value); + var totalVotesCast = results.Sum(kvp => kvp.Value); if (totalVotesCast == 0) { await ch.SendMessage("📄 **No votes have been cast.**"); return; } var closeMessage = $"--------------**POLL CLOSED**--------------\n" + $"📄 , here are the results:\n"; - foreach (var kvp in results) { - closeMessage += $"`{kvp.Key}.` **[{answers[kvp.Key - 1]}]** has {kvp.Value} votes.({kvp.Value * 1.0f / totalVotesCast * 100}%)\n"; - } + closeMessage = results.Aggregate(closeMessage, (current, kvp) => current + $"`{kvp.Key}.` **[{answers[kvp.Key - 1]}]**" + + $" has {kvp.Value} votes." + + $"({kvp.Value*1.0f/totalVotesCast*100}%)\n"); await ch.SendMessage($"📄 **Total votes cast**: {totalVotesCast}\n{closeMessage}"); } catch (Exception ex) { @@ -112,12 +111,11 @@ namespace NadekoBot.Commands { return; int vote; - if (int.TryParse(e.Message.Text, out vote)) { - if (vote < 1 || vote > answers.Length) - return; - if (participants.TryAdd(e.User, vote)) { - await e.User.SendMessage($"Thanks for voting **{e.User.Name}**."); - } + if (!int.TryParse(e.Message.Text, out vote)) return; + if (vote < 1 || vote > answers.Length) + return; + if (participants.TryAdd(e.User, vote)) { + await e.User.SendMessage($"Thanks for voting **{e.User.Name}**."); } } catch { } diff --git a/NadekoBot/Modules/Conversations.cs b/NadekoBot/Modules/Conversations.cs index 1f086a76..4267a3be 100644 --- a/NadekoBot/Modules/Conversations.cs +++ b/NadekoBot/Modules/Conversations.cs @@ -17,7 +17,7 @@ using NadekoBot.Commands; namespace NadekoBot.Modules { internal class Conversations : DiscordModule { private string firestr = "🔥 ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้ 🔥"; - public Conversations() { + public Conversations() { commands.Add(new CopyCommand()); commands.Add(new RequestsCommand()); } @@ -221,7 +221,8 @@ namespace NadekoBot.Modules { .Do(async e => { var count = 1; int.TryParse(e.Args[0], out count); - + if (count == 0) + count = 1; if (count < 1 || count > 12) { await e.Channel.SendMessage("Number must be between 0 and 12"); return; @@ -257,8 +258,7 @@ namespace NadekoBot.Modules { if (invite != null) { try { await invite.Accept(); - } - catch { + } catch { await e.Channel.SendMessage("Failed to accept invite."); } await e.Channel.SendMessage("I got in!"); diff --git a/NadekoBot/Modules/Music.cs b/NadekoBot/Modules/Music.cs index ed178ba3..59b52769 100644 --- a/NadekoBot/Modules/Music.cs +++ b/NadekoBot/Modules/Music.cs @@ -13,10 +13,10 @@ using Timer = System.Timers.Timer; namespace NadekoBot.Modules { internal class Music : DiscordModule { - public static ConcurrentDictionary musicPlayers = new ConcurrentDictionary(); - public static ConcurrentDictionary defaultMusicVolumes = new ConcurrentDictionary(); + public static ConcurrentDictionary MusicPlayers = new ConcurrentDictionary(); + public static ConcurrentDictionary DefaultMusicVolumes = new ConcurrentDictionary(); - private Timer setgameTimer => new Timer(); + private readonly Timer setgameTimer = new Timer(); private bool setgameEnabled = false; @@ -25,8 +25,8 @@ namespace NadekoBot.Modules { setgameTimer.Interval = 20000; setgameTimer.Elapsed += (s, e) => { try { - int num = musicPlayers.Where(kvp => kvp.Value.CurrentSong != null).Count(); - NadekoBot.Client.SetGame($"{num} songs".SnPl(num) + $", {musicPlayers.Sum(kvp => kvp.Value.Playlist.Count())} queued"); + var num = MusicPlayers.Count(kvp => kvp.Value.CurrentSong != null); + NadekoBot.Client.SetGame($"{num} songs".SnPl(num) + $", {MusicPlayers.Sum(kvp => kvp.Value.Playlist.Count())} queued"); } catch { } }; @@ -46,7 +46,7 @@ namespace NadekoBot.Modules { .Description("Goes to the next song in the queue.") .Do(e => { MusicPlayer musicPlayer; - if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) return; + if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) return; musicPlayer.Next(); }); @@ -55,7 +55,7 @@ namespace NadekoBot.Modules { .Description("Completely stops the music, unbinds the bot from the channel, and cleans up files.") .Do(async e => { MusicPlayer musicPlayer; - if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) return; + if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) return; musicPlayer.Stop(); var msg = await e.Channel.SendMessage("⚠Due to music issues, NadekoBot is unable to leave voice channels at this moment.\nIf this presents inconvenience, you can use `!m mv` command to make her join your current voice channel."); await Task.Delay(5000); @@ -69,7 +69,7 @@ namespace NadekoBot.Modules { .Description("Pauses or Unpauses the song.") .Do(async e => { MusicPlayer musicPlayer; - if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) return; + if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) return; musicPlayer.TogglePause(); if (musicPlayer.Paused) await e.Channel.SendMessage("🎵`Music musicPlayer paused.`"); @@ -90,11 +90,11 @@ namespace NadekoBot.Modules { .Description("Lists up to 15 currently queued songs.") .Do(async e => { MusicPlayer musicPlayer; - if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) { + if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) { await e.Channel.SendMessage("🎵 No active music musicPlayer."); return; } - string toSend = "🎵 **" + musicPlayer.Playlist.Count + "** `videos currently queued.` "; + string toSend = "🎵 **" + musicPlayer.Playlist.Count + "** `tracks currently queued.` "; if (musicPlayer.Playlist.Count >= MusicPlayer.MaximumPlaylistSize) toSend += "**Song queue is full!**\n"; else @@ -108,7 +108,7 @@ namespace NadekoBot.Modules { .Description("Shows the song currently playing.") .Do(async e => { MusicPlayer musicPlayer; - if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) + if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) return; await e.Channel.SendMessage($"🎵`Now Playing` {musicPlayer.CurrentSong.PrettyName}"); }); @@ -118,7 +118,7 @@ namespace NadekoBot.Modules { .Parameter("val", ParameterType.Required) .Do(async e => { MusicPlayer musicPlayer; - if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) + if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) return; var arg = e.GetArg("val"); int volume; @@ -141,7 +141,7 @@ namespace NadekoBot.Modules { await e.Channel.SendMessage("Volume number invalid."); return; } - defaultMusicVolumes.AddOrUpdate(e.Server.Id, volume / 100, (key, newval) => volume / 100); + DefaultMusicVolumes.AddOrUpdate(e.Server.Id, volume / 100, (key, newval) => volume / 100); await e.Channel.SendMessage($"🎵 `Default volume set to {volume}%`"); }); @@ -149,7 +149,7 @@ namespace NadekoBot.Modules { .Description("Sets the music volume to 0%") .Do(e => { MusicPlayer musicPlayer; - if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) + if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) return; musicPlayer.SetVolume(0); }); @@ -158,7 +158,7 @@ namespace NadekoBot.Modules { .Description("Sets the music volume to 100% (real max is actually 150%).") .Do(e => { MusicPlayer musicPlayer; - if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) + if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) return; musicPlayer.SetVolume(100); }); @@ -167,7 +167,7 @@ namespace NadekoBot.Modules { .Description("Sets the music volume to 50%.") .Do(e => { MusicPlayer musicPlayer; - if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) + if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) return; musicPlayer.SetVolume(50); }); @@ -176,7 +176,7 @@ namespace NadekoBot.Modules { .Description("Shuffles the current playlist.") .Do(async e => { MusicPlayer musicPlayer; - if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) + if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) return; if (musicPlayer.Playlist.Count < 2) { await e.Channel.SendMessage("💢 Not enough songs in order to perform the shuffle."); @@ -266,7 +266,7 @@ namespace NadekoBot.Modules { .Do(e => { MusicPlayer musicPlayer; var voiceChannel = e.User.VoiceChannel; - if (voiceChannel == null || voiceChannel.Server != e.Server || !musicPlayers.TryGetValue(e.Server, out musicPlayer)) + if (voiceChannel == null || voiceChannel.Server != e.Server || !MusicPlayers.TryGetValue(e.Server, out musicPlayer)) return; musicPlayer.MoveToVoiceChannel(voiceChannel); }); @@ -277,7 +277,7 @@ namespace NadekoBot.Modules { .Do(async e => { var arg = e.GetArg("num"); MusicPlayer musicPlayer; - if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) { + if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) { return; } if (arg?.ToLower() == "all") { @@ -306,39 +306,40 @@ namespace NadekoBot.Modules { }); } - private async Task QueueSong(Channel TextCh, Channel VoiceCh, string query, bool silent = false, MusicType musicType = MusicType.Normal) { - if (VoiceCh == null || VoiceCh.Server != TextCh.Server) { + private async Task QueueSong(Channel textCh, Channel voiceCh, string query, bool silent = false, MusicType musicType = MusicType.Normal) { + if (voiceCh == null || voiceCh.Server != textCh.Server) { if (!silent) - await TextCh.SendMessage("💢 You need to be in a voice channel on this server.\n If you are already in a voice channel, try rejoining."); - throw new ArgumentNullException(nameof(VoiceCh)); + await textCh.SendMessage("💢 You need to be in a voice channel on this server.\n If you are already in a voice channel, try rejoining."); + throw new ArgumentNullException(nameof(voiceCh)); } if (string.IsNullOrWhiteSpace(query) || query.Length < 3) throw new ArgumentException("💢 Invalid query for queue song.", nameof(query)); MusicPlayer musicPlayer = null; - if (!musicPlayers.TryGetValue(TextCh.Server, out musicPlayer)) { + if (!MusicPlayers.TryGetValue(textCh.Server, out musicPlayer)) { float? vol = null; float throwAway; - if (defaultMusicVolumes.TryGetValue(TextCh.Server.Id, out throwAway)) + if (DefaultMusicVolumes.TryGetValue(textCh.Server.Id, out throwAway)) vol = throwAway; - musicPlayer = new MusicPlayer(VoiceCh, vol) { - OnCompleted = async (song) => { + musicPlayer = new MusicPlayer(voiceCh, vol) { + OnCompleted = async song => { try { - await TextCh.SendMessage($"🎵`Finished`{song.PrettyName}"); - } catch { } + await textCh.SendMessage($"🎵`Finished`{song.PrettyName}"); + } + catch {} }, OnStarted = async (song) => { try { var msgTxt = $"🎵`Playing`{song.PrettyName} `Vol: {(int)(musicPlayer.Volume * 100)}%`"; - await TextCh.SendMessage(msgTxt); + await textCh.SendMessage(msgTxt); } catch { } }, }; - musicPlayers.TryAdd(TextCh.Server, musicPlayer); + MusicPlayers.TryAdd(textCh.Server, musicPlayer); } var resolvedSong = await Song.ResolveSong(query, musicType); resolvedSong.MusicPlayer = musicPlayer; if (!silent) - await TextCh.Send($"🎵`Queued`{resolvedSong.PrettyName}"); + await textCh.Send($"🎵`Queued`{resolvedSong.PrettyName}"); musicPlayer.AddSong(resolvedSong); } } diff --git a/NadekoBot/Modules/NSFW.cs b/NadekoBot/Modules/NSFW.cs index 0f74b89b..03708313 100644 --- a/NadekoBot/Modules/NSFW.cs +++ b/NadekoBot/Modules/NSFW.cs @@ -7,11 +7,7 @@ using NadekoBot.Classes; namespace NadekoBot.Modules { internal class NSFW : DiscordModule { - private Random _r = new Random(); - - public NSFW() { - - } + private readonly Random rng = new Random(); public override void Install(ModuleManager manager) { manager.CreateCommands("", cgb => { @@ -22,9 +18,7 @@ namespace NadekoBot.Modules { .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 +)\n**Usage**: ~hentai yuri+kissing") .Parameter("tag", ParameterType.Unparsed) .Do(async e => { - string tag = e.GetArg("tag"); - if (tag == null) - tag = ""; + var tag = e.GetArg("tag")?.Trim() ?? ""; await e.Channel.SendMessage(":heart: Gelbooru: " + await SearchHelper.GetGelbooruImageLink(tag)); await e.Channel.SendMessage(":heart: Danbooru: " + await SearchHelper.GetDanbooruImageLink(tag)); }); @@ -32,27 +26,21 @@ namespace NadekoBot.Modules { .Description("Shows a random hentai image from danbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +)\n**Usage**: ~danbooru yuri+kissing") .Parameter("tag", ParameterType.Unparsed) .Do(async e => { - string tag = e.GetArg("tag"); - if (tag == null) - tag = ""; + var tag = e.GetArg("tag")?.Trim() ?? ""; await e.Channel.SendMessage(await SearchHelper.GetDanbooruImageLink(tag)); }); cgb.CreateCommand("~gelbooru") .Description("Shows a random hentai image from gelbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +)\n**Usage**: ~gelbooru yuri+kissing") .Parameter("tag", ParameterType.Unparsed) .Do(async e => { - string tag = e.GetArg("tag"); - if (tag == null) - tag = ""; + var tag = e.GetArg("tag")?.Trim() ?? ""; await e.Channel.SendMessage(await SearchHelper.GetGelbooruImageLink(tag)); }); cgb.CreateCommand("~e621") .Description("Shows a random hentai image from e621.net with a given tag. Tag is optional but preffered. Use spaces for multiple tags.\n**Usage**: ~e621 yuri+kissing") .Parameter("tag", ParameterType.Unparsed) .Do(async e => { - string tag = e.GetArg("tag"); - if (tag == null) - tag = ""; + var tag = e.GetArg("tag")?.Trim() ?? ""; await e.Channel.SendMessage(await SearchHelper.GetE621ImageLink(tag)); }); cgb.CreateCommand("~cp") @@ -65,12 +53,23 @@ namespace NadekoBot.Modules { .Description("Real adult content.") .Do(async e => { try { - var obj = JArray.Parse(await SearchHelper.GetResponseStringAsync($"http://api.oboobs.ru/boobs/{_r.Next(0, 9304)}"))[0]; + var obj = JArray.Parse(await SearchHelper.GetResponseStringAsync($"http://api.oboobs.ru/boobs/{rng.Next(0, 9380)}"))[0]; await e.Channel.SendMessage($"http://media.oboobs.ru/{ obj["preview"].ToString() }"); } catch (Exception ex) { await e.Channel.SendMessage($"💢 {ex.Message}"); } }); + cgb.CreateCommand("~butts") + .Alias("~ass","~butt") + .Description("Real adult content.") + .Do(async e => { + try { + var obj = JArray.Parse(await SearchHelper.GetResponseStringAsync($"http://api.obutts.ru/butts/{rng.Next(0, 3373)}"))[0]; + await e.Channel.SendMessage($"http://media.obutts.ru/{ obj["preview"].ToString() }"); + } catch (Exception ex) { + await e.Channel.SendMessage($"💢 {ex.Message}"); + } + }); }); } } diff --git a/NadekoBot/Modules/Permissions.cs b/NadekoBot/Modules/Permissions.cs index dd415ba1..2f5bf86b 100644 --- a/NadekoBot/Modules/Permissions.cs +++ b/NadekoBot/Modules/Permissions.cs @@ -12,7 +12,7 @@ namespace NadekoBot.Modules { public PermissionModule() { //Empty for now } - + //todo word filtering/invite bans (?:discord(?:\.gg|app\.com\/invite)\/(?([\w]{16}|(?:[\w]+-?){3}))) public override void Install(ModuleManager manager) { var client = NadekoBot.Client; manager.CreateCommands("", cgb => { @@ -51,7 +51,7 @@ namespace NadekoBot.Modules { .Parameter("arg", ParameterType.Required) .Do(async e => { var arg = e.GetArg("arg"); - bool val = PermissionHelper.ValidateBool(arg); + var val = PermissionHelper.ValidateBool(arg); PermsHandler.SetVerbosity(e.Server, val); await e.Channel.SendMessage($"Verbosity set to {val}."); }); @@ -72,7 +72,7 @@ namespace NadekoBot.Modules { .Parameter("role", ParameterType.Unparsed) .Do(async e => { var arg = e.GetArg("role"); - Discord.Role role = e.Server.EveryoneRole; + var role = e.Server.EveryoneRole; if (!string.IsNullOrWhiteSpace(arg)) try { role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role")); @@ -95,7 +95,7 @@ namespace NadekoBot.Modules { .Parameter("channel", ParameterType.Unparsed) .Do(async e => { var arg = e.GetArg("channel"); - Discord.Channel channel = e.Channel; + var channel = e.Channel; if (!string.IsNullOrWhiteSpace(arg)) try { channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); @@ -117,7 +117,7 @@ namespace NadekoBot.Modules { .Parameter("user", ParameterType.Unparsed) .Do(async e => { var arg = e.GetArg("user"); - Discord.User user = e.User; + var user = e.User; if (!string.IsNullOrWhiteSpace(e.GetArg("user"))) try { user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user")); @@ -139,8 +139,8 @@ namespace NadekoBot.Modules { .Description("Sets a module's permission at the server level.\n**Usage**: ;sm [module_name] enable") .Do(async e => { try { - string module = PermissionHelper.ValidateModule(e.GetArg("module")); - bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var module = PermissionHelper.ValidateModule(e.GetArg("module")); + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); PermsHandler.SetServerModulePermission(e.Server, module, state); await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** on this server."); @@ -159,8 +159,8 @@ namespace NadekoBot.Modules { .Description("Sets a command's permission at the server level.\n**Usage**: ;sc [command_name] disable") .Do(async e => { try { - string command = PermissionHelper.ValidateCommand(e.GetArg("command")); - bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var command = PermissionHelper.ValidateCommand(e.GetArg("command")); + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); PermsHandler.SetServerCommandPermission(e.Server, command, state); await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** on this server."); @@ -180,8 +180,8 @@ namespace NadekoBot.Modules { .Description("Sets a module's permission at the role level.\n**Usage**: ;rm [module_name] enable [role_name]") .Do(async e => { try { - string module = PermissionHelper.ValidateModule(e.GetArg("module")); - bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var module = PermissionHelper.ValidateModule(e.GetArg("module")); + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); if (e.GetArg("role")?.ToLower() == "all") { foreach (var role in e.Server.Roles) { @@ -190,7 +190,7 @@ namespace NadekoBot.Modules { await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **ALL** roles."); } else { - Discord.Role role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role")); + var role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role")); PermsHandler.SetRoleModulePermission(role, module, state); await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role."); @@ -211,8 +211,8 @@ namespace NadekoBot.Modules { .Description("Sets a command's permission at the role level.\n**Usage**: ;rc [command_name] disable [role_name]") .Do(async e => { try { - string command = PermissionHelper.ValidateCommand(e.GetArg("command")); - bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var command = PermissionHelper.ValidateCommand(e.GetArg("command")); + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); if (e.GetArg("role")?.ToLower() == "all") { foreach (var role in e.Server.Roles) { @@ -221,7 +221,7 @@ namespace NadekoBot.Modules { await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **ALL** roles."); } else { - Discord.Role role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role")); + var role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role")); PermsHandler.SetRoleCommandPermission(role, command, state); await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role."); @@ -242,8 +242,8 @@ namespace NadekoBot.Modules { .Description("Sets a module's permission at the channel level.\n**Usage**: ;cm [module_name] enable [channel_name]") .Do(async e => { try { - string module = PermissionHelper.ValidateModule(e.GetArg("module")); - bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var module = PermissionHelper.ValidateModule(e.GetArg("module")); + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); if (e.GetArg("channel")?.ToLower() == "all") { foreach (var channel in e.Server.TextChannels) { @@ -252,7 +252,7 @@ namespace NadekoBot.Modules { await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** on **ALL** channels."); } else { - Discord.Channel channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); + var channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); PermsHandler.SetChannelModulePermission(channel, module, state); await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel."); @@ -273,8 +273,8 @@ namespace NadekoBot.Modules { .Description("Sets a command's permission at the channel level.\n**Usage**: ;cc [command_name] enable [channel_name]") .Do(async e => { try { - string command = PermissionHelper.ValidateCommand(e.GetArg("command")); - bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var command = PermissionHelper.ValidateCommand(e.GetArg("command")); + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); if (e.GetArg("channel")?.ToLower() == "all") { foreach (var channel in e.Server.TextChannels) { @@ -283,7 +283,7 @@ namespace NadekoBot.Modules { await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** on **ALL** channels."); } else { - Discord.Channel channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); + var channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); PermsHandler.SetChannelCommandPermission(channel, command, state); await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel."); @@ -304,9 +304,9 @@ namespace NadekoBot.Modules { .Description("Sets a module's permission at the user level.\n**Usage**: ;um [module_name] enable [user_name]") .Do(async e => { try { - string module = PermissionHelper.ValidateModule(e.GetArg("module")); - bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); - Discord.User user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user")); + var module = PermissionHelper.ValidateModule(e.GetArg("module")); + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user")); PermsHandler.SetUserModulePermission(user, module, state); await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for user **{user.Name}**."); @@ -326,9 +326,9 @@ namespace NadekoBot.Modules { .Description("Sets a command's permission at the user level.\n**Usage**: ;uc [command_name] enable [user_name]") .Do(async e => { try { - string command = PermissionHelper.ValidateCommand(e.GetArg("command")); - bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); - Discord.User user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user")); + var command = PermissionHelper.ValidateCommand(e.GetArg("command")); + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user")); PermsHandler.SetUserCommandPermission(user, command, state); await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for user **{user.Name}**."); @@ -346,7 +346,7 @@ namespace NadekoBot.Modules { .Description("Sets permissions for all modules at the server level.\n**Usage**: ;asm [enable/disable]") .Do(async e => { try { - bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); foreach (var module in NadekoBot.Client.GetService().Modules) { PermsHandler.SetServerModulePermission(e.Server, module.Name, state); @@ -367,8 +367,8 @@ namespace NadekoBot.Modules { .Description("Sets permissions for all commands from a certain module at the server level.\n**Usage**: ;asc [module_name] [enable/disable]") .Do(async e => { try { - bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); - string module = PermissionHelper.ValidateModule(e.GetArg("module")); + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var module = PermissionHelper.ValidateModule(e.GetArg("module")); foreach (var command in NadekoBot.Client.GetService().AllCommands.Where(c => c.Category == module)) { PermsHandler.SetServerCommandPermission(e.Server, command.Text, state); @@ -389,8 +389,8 @@ namespace NadekoBot.Modules { .Description("Sets permissions for all modules at the channel level.\n**Usage**: ;acm [enable/disable] [channel_name]") .Do(async e => { try { - bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); - Discord.Channel channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); foreach (var module in NadekoBot.Client.GetService().Modules) { PermsHandler.SetChannelModulePermission(channel, module.Name, state); } @@ -412,9 +412,9 @@ namespace NadekoBot.Modules { .Description("Sets permissions for all commands from a certain module at the channel level.\n**Usage**: ;acc [module_name] [enable/disable] [channel_name]") .Do(async e => { try { - bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); - string module = PermissionHelper.ValidateModule(e.GetArg("module")); - Discord.Channel channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var module = PermissionHelper.ValidateModule(e.GetArg("module")); + var channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); foreach (var command in NadekoBot.Client.GetService().AllCommands.Where(c => c.Category == module)) { PermsHandler.SetChannelCommandPermission(channel, command.Text, state); } @@ -434,8 +434,8 @@ namespace NadekoBot.Modules { .Description("Sets permissions for all modules at the role level.\n**Usage**: ;arm [enable/disable] [role_name]") .Do(async e => { try { - bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); - Discord.Role role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role")); + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role")); foreach (var module in NadekoBot.Client.GetService().Modules) { PermsHandler.SetRoleModulePermission(role, module.Name, state); } @@ -457,9 +457,9 @@ namespace NadekoBot.Modules { .Description("Sets permissions for all commands from a certain module at the role level.\n**Usage**: ;arc [module_name] [enable/disable] [channel_name]") .Do(async e => { try { - bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); - string module = PermissionHelper.ValidateModule(e.GetArg("module")); - Discord.Role role = PermissionHelper.ValidateRole(e.Server, e.GetArg("channel")); + var state = PermissionHelper.ValidateBool(e.GetArg("bool")); + var module = PermissionHelper.ValidateModule(e.GetArg("module")); + var role = PermissionHelper.ValidateRole(e.Server, e.GetArg("channel")); foreach (var command in NadekoBot.Client.GetService().AllCommands.Where(c => c.Category == module)) { PermsHandler.SetRoleCommandPermission(role, command.Text, state); } diff --git a/NadekoBot/NadekoBot.cs b/NadekoBot/NadekoBot.cs index 7fa2c592..c0af279e 100644 --- a/NadekoBot/NadekoBot.cs +++ b/NadekoBot/NadekoBot.cs @@ -8,6 +8,7 @@ using Discord.Modules; using Discord.Audio; using System.Timers; using System.Linq; +using System.Text; using System.Threading.Tasks; using NadekoBot.Classes; using NadekoBot.Classes.JSONModels; @@ -23,6 +24,7 @@ namespace NadekoBot { private static Channel OwnerPrivateChannel { get; set; } private static void Main() { + Console.OutputEncoding = Encoding.Unicode; try { //load credentials from credentials.json Creds = JsonConvert.DeserializeObject(File.ReadAllText("credentials.json")); diff --git a/NadekoBot/NadekoBot.csproj b/NadekoBot/NadekoBot.csproj index 2f2f839b..e39ae325 100644 --- a/NadekoBot/NadekoBot.csproj +++ b/NadekoBot/NadekoBot.csproj @@ -118,6 +118,7 @@ + diff --git a/NadekoBot/bin/Debug/Discord.Net.Audio.dll b/NadekoBot/bin/Debug/Discord.Net.Audio.dll index 11773713da3b0faf6753b62084b2864c152fbc0f..b7c2ab098ea5c8ff00a6093ccd32112a781bd08d 100644 GIT binary patch delta 68 zcmZo@U}aWY-J5*w0+=lpL)&kO)OvdrOi`rbx46^C(D186sWYV YpYtqG!F!XfO>!8s@5ap@Uw3c;06xJV7XSbN delta 68 zcmZo@U}aWc9lH)^uejjq4S>Zu{~*3OE*us)gc9voh<)VQlReb YR4M0k93C4t8odzRvt{OHkFPtp0K;t~LI3~& diff --git a/NadekoBot/bin/Debug/Discord.Net.Commands.dll b/NadekoBot/bin/Debug/Discord.Net.Commands.dll index 003b4515fac092dfd1b57e7ea0d02fdab904a9c0..2a9254f9ed577ca68921932f804e66ed5957ba74 100644 GIT binary patch delta 88 zcmZqJ!_=^cX+j5c#*OP6yG4{&V`eKf?>E;WK3PL(S*)RqmU;<(p oMg|6sO+Y+_fgvc^B{*wgk=oLa=?;5cjANGy)r4%8nev1a0NyMgx&QzG delta 88 zcmZqJ!_=^cX+j5cz^ls}yGO0W%Gqb1tA@vY#0L&Fafa) oBLf4+CLo@|zz`Jd5_~!R>f={(&JMGGmEPd;7LC~~Gvx^<0J}&a5dZ)H diff --git a/NadekoBot/bin/Debug/Discord.Net.Modules.dll b/NadekoBot/bin/Debug/Discord.Net.Modules.dll index 7110cea77fbc3589400bfc6d8ef70a0ce4ecfbde..b59068a11c4ac542f203d9f11a81bc49b4bddfe1 100644 GIT binary patch delta 88 zcmZpe!qhN@X+j5c#*OP6yBYHZ{w6g=OLJ(t&JfCQS+{k5&gMD!FZgtTvSAEBzy!oH oj0_BO<^XXW14B@-OK{$Y#pl0w%ynF#rWj=MQRM#S4RrzB0MIibU;qFB delta 88 zcmZpe!qhN@X+j5cz^ls}yBYHZVictOG6i=zPUn%eDP8$s>E=24FZgtTvSAEBzy!oH oj0_BO<^XXW14B@-OE9}`zf??rnAe2P{^H&LQ_pVRP#3@r0D6cYqyPW_ diff --git a/NadekoBot/bin/Debug/Discord.Net.dll b/NadekoBot/bin/Debug/Discord.Net.dll index a98ae3e76850033d50e3a40c7749dee4bd3d6ef7..62a21875736f4d81ded51ec04de27b8b29e94953 100644 GIT binary patch delta 112554 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≥~pT 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 delta 112760 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 V%m1<<&pC2$sh9t!Nb~r@{{v(|yrKXA