~ani, ~mang, and @nadekobot how are you are the only things that don't work now
This commit is contained in:
		
							
								
								
									
										10
									
								
								NadekoBot/Classes/JSONModels/Config.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								NadekoBot/Classes/JSONModels/Config.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -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 { | ||||
|     } | ||||
| } | ||||
| @@ -21,7 +21,7 @@ namespace NadekoBot.Classes.Music { | ||||
|     /// </summary> | ||||
|     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,15 +251,15 @@ namespace NadekoBot.Classes.Music { | ||||
|             } | ||||
|  | ||||
|             try { | ||||
|                 if (musicType == MusicType.Local) { | ||||
|                 switch (musicType) { | ||||
|                     case MusicType.Local: | ||||
|                         return new Song(new SongInfo { | ||||
|                             Uri = "\"" + Path.GetFullPath(query) + "\"", | ||||
|                             Title = Path.GetFileNameWithoutExtension(query), | ||||
|                             Provider = "Local File", | ||||
|                             ProviderType = musicType, | ||||
|                         }); | ||||
|                 } | ||||
|                 else if (musicType == MusicType.Radio) { | ||||
|                     case MusicType.Radio: | ||||
|                         return new Song(new SongInfo { | ||||
|                             Uri = query, | ||||
|                             Title = $"{query}", | ||||
| @@ -270,7 +267,7 @@ namespace NadekoBot.Classes.Music { | ||||
|                             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,7 +276,6 @@ 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."); | ||||
| @@ -298,10 +294,7 @@ namespace NadekoBot.Classes.Music { | ||||
|                     Uri = video.Uri, | ||||
|                     ProviderType = musicType, | ||||
|                 }); | ||||
|  | ||||
|                 } | ||||
|             } | ||||
|             catch (Exception ex) { | ||||
|             } 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=(?<url>.*?)\\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, "(?<url>^[^#].*)", 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")) { | ||||
|                 //<ref href="http://armitunes.com:8000"/> | ||||
|                 try { | ||||
|                     var m = Regex.Match(file, "<ref href=\"(?<url>.*?)\""); | ||||
|                     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")) { | ||||
|                 /* | ||||
|                 <?xml version="1.0" encoding="UTF-8"?> | ||||
|                     <playlist version="1" xmlns="http://xspf.org/ns/0/"> | ||||
| @@ -368,8 +357,7 @@ namespace NadekoBot.Classes.Music { | ||||
|                     var m = Regex.Match(file, "<location>(?<url>.*?)</location>"); | ||||
|                     var res = m.Groups["url"]?.ToString(); | ||||
|                     return res?.Trim(); | ||||
|                 } | ||||
|                 catch { | ||||
|                 } catch { | ||||
|                     Console.WriteLine($"Failed reading .xspf:\n{file}"); | ||||
|                     return null; | ||||
|                 } | ||||
|   | ||||
| @@ -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; | ||||
|             } | ||||
|   | ||||
| @@ -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<ulong, ServerPermissions> _permissionsDict = | ||||
|         public static ConcurrentDictionary<ulong, ServerPermissions> PermissionsDict = | ||||
|             new ConcurrentDictionary<ulong, ServerPermissions>(); | ||||
|  | ||||
|         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<ServerPermissions>(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,17 +98,15 @@ 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; | ||||
|             } | ||||
|             } | ||||
|             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)); | ||||
|         } | ||||
|     } | ||||
|     /// <summary> | ||||
| @@ -312,33 +313,31 @@ namespace NadekoBot.Classes.Permissions { | ||||
|         /// <summary> | ||||
|         /// Module name with allowed/disallowed | ||||
|         /// </summary> | ||||
|         public Dictionary<string, bool> modules { get; set; } | ||||
|         public Dictionary<string, bool> Modules { get; set; } | ||||
|         /// <summary> | ||||
|         /// Command name with allowed/disallowed | ||||
|         /// </summary> | ||||
|         public Dictionary<string, bool> commands { get; set; } | ||||
|         public Dictionary<string, bool> Commands { get; set; } | ||||
|  | ||||
|         public Permissions(string name) { | ||||
|             Name = name; | ||||
|             modules = new Dictionary<string, bool>(); | ||||
|             commands = new Dictionary<string, bool>(); | ||||
|             Modules = new Dictionary<string, bool>(); | ||||
|             Commands = new Dictionary<string, bool>(); | ||||
|         } | ||||
|  | ||||
|         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<string, bool>[] ?? 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<string, bool>[] ?? 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; | ||||
|         } | ||||
|   | ||||
| @@ -20,18 +20,18 @@ 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<Stream> GetResponseStreamAsync(string url, | ||||
|             IEnumerable<KeyValuePair<string, string>> headers = null, RequestHttpMethod method = RequestHttpMethod.Get) { | ||||
|             if (string.IsNullOrWhiteSpace(url)) | ||||
|                 throw new ArgumentNullException(nameof(url)); | ||||
|             using (var httpClient = new HttpClient()) { | ||||
|             var httpClient = new HttpClient(); | ||||
|             switch (method) { | ||||
|                 case RequestHttpMethod.Get: | ||||
|                     if (headers != null) { | ||||
|                         foreach (var header in headers) { | ||||
|                                 httpClient.DefaultRequestHeaders.Add(header.Key, header.Value); | ||||
|                             httpClient.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, header.Value); | ||||
|                         } | ||||
|                     } | ||||
|                     return await httpClient.GetStreamAsync(url); | ||||
| @@ -46,7 +46,6 @@ namespace NadekoBot.Classes { | ||||
|                     throw new NotImplementedException("That type of request is unsupported."); | ||||
|             } | ||||
|         } | ||||
|         } | ||||
|  | ||||
|         public static async Task<string> GetResponseStringAsync(string url, | ||||
|             IEnumerable<KeyValuePair<string, string>> headers = null, | ||||
| @@ -64,13 +63,19 @@ namespace NadekoBot.Classes { | ||||
|             await RefreshAnilistToken(); | ||||
|  | ||||
|             var link = "http://anilist.co/api/anime/search/" + Uri.EscapeUriString(query); | ||||
|  | ||||
|             var headers = new Dictionary<string, string> { { "access_token", token } }; | ||||
|             try { | ||||
|                 var headers = new Dictionary<string, string> {{"'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<AnimeResult>(content)); | ||||
|  | ||||
|             } | ||||
|             catch (Exception ex) { | ||||
|                 Console.WriteLine(ex); | ||||
|                 return new AnimeResult(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public static async Task<MangaResult> 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<string, string> { | ||||
|                 {"grant_type", "client_credentials"}, | ||||
|                 {"client_id", "kwoth-w0ki9"}, | ||||
|   | ||||
| @@ -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; | ||||
|  | ||||
| @@ -31,12 +32,11 @@ 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.", | ||||
|         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.", | ||||
| @@ -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") | ||||
|                                   switch (spellName) { | ||||
|                                       case "w": | ||||
|                                           orderY += orderVerticalSpacing; | ||||
|                                   else if (spellName == "e") | ||||
|                                           break; | ||||
|                                       case "e": | ||||
|                                           orderY += orderVerticalSpacing * 2; | ||||
|                                   else if (spellName == "r") | ||||
|                                           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()) { | ||||
|   | ||||
| @@ -5,53 +5,56 @@ 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<string> rotatingStatuses = new List<string>(); | ||||
|         private static Timer timer = new Timer(12000); | ||||
|         private static readonly Timer timer = new Timer(12000); | ||||
|  | ||||
|         private Dictionary<string, Func<string>> playingPlaceholders => new Dictionary<string, Func<string>> { | ||||
|         public static Dictionary<string, Func<string>> PlayingPlaceholders { get; } = | ||||
|             new Dictionary<string, Func<string>> { | ||||
|                 {"%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) { | ||||
|                 {"%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 { } | ||||
|                         } | ||||
|                     return cnt.ToString(); | ||||
|                         catch { | ||||
|                             return "No songs"; | ||||
|                         } | ||||
|                     } | ||||
|                 }, | ||||
|             {"%queued%", () => Modules.Music.musicPlayers.Sum(kvp=>kvp.Value.Playlist.Count).ToString() }, | ||||
|             {"%trivia%", () => Commands.Trivia.runningTrivias.Count.ToString() } | ||||
|                 {"%queued%", () => Music.MusicPlayers.Sum(kvp => kvp.Value.Playlist.Count).ToString()}, | ||||
|                 {"%trivia%", () => Trivia.runningTrivias.Count.ToString()} | ||||
|             }; | ||||
|         private object playingPlaceholderLock => new object(); | ||||
|  | ||||
|         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 {} | ||||
|             }; | ||||
| @@ -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,16 +97,17 @@ 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") | ||||
|                 .Alias(".repl", ".rmpl") | ||||
|                 .Description("Removes a playing string on a given number.") | ||||
|                 .Parameter("number", ParameterType.Required) | ||||
|                 .AddCheck(Classes.Permissions.SimpleCheckers.OwnerOnly()) | ||||
|   | ||||
| @@ -20,7 +20,8 @@ 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 => { | ||||
|                   .Do(async e => { | ||||
|                       await Task.Run(async () => { | ||||
|                           if (!e.User.ServerPermissions.ManageChannels) | ||||
|                               return; | ||||
|                           if (ActivePolls.ContainsKey(e.Server)) | ||||
| @@ -32,7 +33,11 @@ namespace NadekoBot.Commands { | ||||
|                           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<User, int> participants = new ConcurrentDictionary<User, int>(); | ||||
|         private string question; | ||||
|         private readonly string question; | ||||
|         private DateTime started; | ||||
|         private CancellationTokenSource pollCancellationSource = new CancellationTokenSource(); | ||||
|  | ||||
|         public Poll(CommandEventArgs e, string v, IEnumerable<string> enumerable) { | ||||
|         public Poll(CommandEventArgs e, string question, IEnumerable<string> 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,14 +111,13 @@ namespace NadekoBot.Commands { | ||||
|                     return; | ||||
|  | ||||
|                 int vote; | ||||
|                 if (int.TryParse(e.Message.Text, out vote)) { | ||||
|                 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 { } | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -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!"); | ||||
|   | ||||
| @@ -13,10 +13,10 @@ using Timer = System.Timers.Timer; | ||||
| namespace NadekoBot.Modules { | ||||
|     internal class Music : DiscordModule { | ||||
|  | ||||
|         public static ConcurrentDictionary<Server, MusicPlayer> musicPlayers = new ConcurrentDictionary<Server, MusicPlayer>(); | ||||
|         public static ConcurrentDictionary<ulong, float> defaultMusicVolumes = new ConcurrentDictionary<ulong, float>(); | ||||
|         public static ConcurrentDictionary<Server, MusicPlayer> MusicPlayers = new ConcurrentDictionary<Server, MusicPlayer>(); | ||||
|         public static ConcurrentDictionary<ulong, float> DefaultMusicVolumes = new ConcurrentDictionary<ulong, float>(); | ||||
|  | ||||
|         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); | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -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}"); | ||||
|                         } | ||||
|                     }); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -12,7 +12,7 @@ namespace NadekoBot.Modules { | ||||
|         public PermissionModule()  { | ||||
|             //Empty for now | ||||
|         } | ||||
|  | ||||
|         //todo word filtering/invite bans (?:discord(?:\.gg|app\.com\/invite)\/(?<id>([\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<ModuleService>().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<CommandService>().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<ModuleService>().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<CommandService>().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<ModuleService>().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<CommandService>().AllCommands.Where(c => c.Category == module)) { | ||||
|                                 PermsHandler.SetRoleCommandPermission(role, command.Text, state); | ||||
|                             } | ||||
|   | ||||
| @@ -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<Credentials>(File.ReadAllText("credentials.json")); | ||||
|   | ||||
| @@ -118,6 +118,7 @@ | ||||
|     <Compile Include="Classes\DBHandler.cs" /> | ||||
|     <Compile Include="Classes\FlowersHandler.cs" /> | ||||
|     <Compile Include="Classes\JSONModels\AnimeResult.cs" /> | ||||
|     <Compile Include="Classes\JSONModels\Config.cs" /> | ||||
|     <Compile Include="Classes\JSONModels\MangaResult.cs" /> | ||||
|     <Compile Include="Classes\JSONModels\_JSONModels.cs" /> | ||||
|     <Compile Include="Classes\Music\MusicControls.cs" /> | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user