diff --git a/src/NadekoBot/Modules/Administration/Administration.cs b/src/NadekoBot/Modules/Administration/Administration.cs index 77260348..3a33a41d 100644 --- a/src/NadekoBot/Modules/Administration/Administration.cs +++ b/src/NadekoBot/Modules/Administration/Administration.cs @@ -24,7 +24,7 @@ namespace NadekoBot.Modules.Administration NadekoBot.CommandHandler.CommandExecuted += DelMsgOnCmd_Handler; } - private void DelMsgOnCmd_Handler(object sender, CommandExecutedEventArgs e) + private async void DelMsgOnCmd_Handler(object sender, CommandExecutedEventArgs e) { try { @@ -39,7 +39,7 @@ namespace NadekoBot.Modules.Administration } if (shouldDelete) - e.Message.DeleteAsync(); + await e.Message.DeleteAsync(); } catch (Exception ex) { diff --git a/src/NadekoBot/Modules/Administration/Commands/AutoAssignRoleCommands.cs b/src/NadekoBot/Modules/Administration/Commands/AutoAssignRoleCommands.cs index cd74103a..1cde1716 100644 --- a/src/NadekoBot/Modules/Administration/Commands/AutoAssignRoleCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/AutoAssignRoleCommands.cs @@ -19,22 +19,26 @@ namespace NadekoBot.Modules.Administration public AutoAssignRoleCommands() { var _client = NadekoBot.Client; - _client.UserJoined += async (user) => + _client.UserJoined += (user) => { - GuildConfig conf; - using (var uow = DbHandler.UnitOfWork()) + var t = Task.Run(async () => { - conf = uow.GuildConfigs.For(user.Guild.Id); - } - var aarType = conf.AutoAssignRoleId.GetType(); + GuildConfig conf; + using (var uow = DbHandler.UnitOfWork()) + { + conf = uow.GuildConfigs.For(user.Guild.Id); + } + var aarType = conf.AutoAssignRoleId.GetType(); - if (conf.AutoAssignRoleId == 0) - return; + if (conf.AutoAssignRoleId == 0) + return; - var role = user.Guild.Roles.FirstOrDefault(r => r.Id == conf.AutoAssignRoleId); + var role = user.Guild.Roles.FirstOrDefault(r => r.Id == conf.AutoAssignRoleId); - if (role != null) - await user.AddRolesAsync(role); + if (role != null) + await user.AddRolesAsync(role); + }); + return Task.CompletedTask; }; } diff --git a/src/NadekoBot/Modules/Administration/Commands/CrossServerTextChannel.cs b/src/NadekoBot/Modules/Administration/Commands/CrossServerTextChannel.cs index f5f2cfe9..b5a665e8 100644 --- a/src/NadekoBot/Modules/Administration/Commands/CrossServerTextChannel.cs +++ b/src/NadekoBot/Modules/Administration/Commands/CrossServerTextChannel.cs @@ -46,7 +46,6 @@ namespace NadekoBot.Modules.Administration } catch { } }); - return Task.CompletedTask; }; } diff --git a/src/NadekoBot/Modules/Administration/Commands/LogCommand - Copy.cs b/src/NadekoBot/Modules/Administration/Commands/LogCommand - Copy.cs index 220c1d51..6940324b 100644 --- a/src/NadekoBot/Modules/Administration/Commands/LogCommand - Copy.cs +++ b/src/NadekoBot/Modules/Administration/Commands/LogCommand - Copy.cs @@ -24,9 +24,13 @@ namespace NadekoBot.Modules.Administration _client.MessageReceived += _client_MessageReceived; } - private Task _client_MessageReceived(IMessage arg) + private Task _client_MessageReceived(IMessage imsg) { - throw new NotImplementedException(); + var msg = imsg as IUserMessage; + if (msg == null) + return Task.CompletedTask; + + return Task.CompletedTask; } } } diff --git a/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs b/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs index a9d60515..75f4d649 100644 --- a/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs @@ -28,7 +28,7 @@ namespace NadekoBot.Modules.Administration private Task UserUpdatedEventHandler(IGuildUser before, IGuildUser after) { - Task.Run(async () => + var task = Task.Run(async () => { var guild = before.Guild ?? after.Guild; var botUserPerms = guild.GetCurrentUser().GuildPermissions; diff --git a/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs b/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs index e7787e9e..779fa68a 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs @@ -143,7 +143,6 @@ namespace NadekoBot.Modules.Gambling //update the state participants.ForEach(p => { - p.Total += 1 + rng.Next(0, 10); if (p.Total > 60) { diff --git a/src/NadekoBot/Modules/Games/Commands/PollCommands.cs b/src/NadekoBot/Modules/Games/Commands/PollCommands.cs index 37cae486..7456b9a8 100644 --- a/src/NadekoBot/Modules/Games/Commands/PollCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/PollCommands.cs @@ -107,26 +107,36 @@ namespace NadekoBot.Modules.Games } } - private async Task Vote(IMessage imsg) + private Task Vote(IMessage imsg) { - var msg = imsg as ISystemMessage; + // has to be a user message + var msg = imsg as IUserMessage; if (msg == null) - return; - try + return Task.CompletedTask; + // channel must be private + IPrivateChannel ch; + if ((ch = msg.Channel as IPrivateChannel) == null) + return Task.CompletedTask; + + // has to be an integer + int vote; + if (!int.TryParse(msg.Content, out vote)) return Task.CompletedTask; + + var t = Task.Run(async () => { - IPrivateChannel ch; - if ((ch = msg.Channel as IPrivateChannel) == null) - return; - int vote; - if (!int.TryParse(msg.Content, out vote)) return; - if (vote < 1 || vote > answers.Length) - return; - if (participants.TryAdd(msg.Author, vote)) + try { - await (ch as ITextChannel).SendMessageAsync($"Thanks for voting **{msg.Author.Username}**.").ConfigureAwait(false); + + if (vote < 1 || vote > answers.Length) + return; + if (participants.TryAdd(msg.Author, vote)) + { + await (ch as ITextChannel).SendMessageAsync($"Thanks for voting **{msg.Author.Username}**.").ConfigureAwait(false); + } } - } - catch { } + catch { } + }); + return Task.CompletedTask; } } } \ No newline at end of file diff --git a/src/NadekoBot/Modules/Games/Commands/SpeedTypingCommands.cs b/src/NadekoBot/Modules/Games/Commands/SpeedTypingCommands.cs index 54ce8226..f20bf8dd 100644 --- a/src/NadekoBot/Modules/Games/Commands/SpeedTypingCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/SpeedTypingCommands.cs @@ -92,30 +92,34 @@ namespace NadekoBot.Modules.Games NadekoBot.Client.MessageReceived += AnswerReceived; } - private async Task AnswerReceived(IMessage imsg) + private Task AnswerReceived(IMessage imsg) { var msg = imsg as IUserMessage; if (msg == null) - return; - try + return Task.CompletedTask; + var t = Task.Run(async () => { - if (channel== null || channel.Id != channel.Id || msg.Author.Id == NadekoBot.Client.GetCurrentUser().Id) return; - - var guess = msg.Content; - - var distance = CurrentSentence.LevenshteinDistance(guess); - var decision = Judge(distance, guess.Length); - if (decision && !finishedUserIds.Contains(msg.Author.Id)) + try { - finishedUserIds.Add(msg.Author.Id); - await channel.SendMessageAsync($"{msg.Author.Mention} finished in **{sw.Elapsed.Seconds}** seconds with { distance } errors, **{ CurrentSentence.Length / WORD_VALUE / sw.Elapsed.Seconds * 60 }** WPM!").ConfigureAwait(false); - if (finishedUserIds.Count % 2 == 0) + if (channel == null || channel.Id != channel.Id || msg.Author.Id == NadekoBot.Client.GetCurrentUser().Id) return; + + var guess = msg.Content; + + var distance = CurrentSentence.LevenshteinDistance(guess); + var decision = Judge(distance, guess.Length); + if (decision && !finishedUserIds.Contains(msg.Author.Id)) { - await channel.SendMessageAsync($":exclamation: `A lot of people finished, here is the text for those still typing:`\n\n:book:**{CurrentSentence}**:book:").ConfigureAwait(false); + finishedUserIds.Add(msg.Author.Id); + await channel.SendMessageAsync($"{msg.Author.Mention} finished in **{sw.Elapsed.Seconds}** seconds with { distance } errors, **{ CurrentSentence.Length / WORD_VALUE / sw.Elapsed.Seconds * 60 }** WPM!").ConfigureAwait(false); + if (finishedUserIds.Count % 2 == 0) + { + await channel.SendMessageAsync($":exclamation: `A lot of people finished, here is the text for those still typing:`\n\n:book:**{CurrentSentence}**:book:").ConfigureAwait(false); + } } } - } - catch { } + catch { } + }); + return Task.CompletedTask; } private bool Judge(int errors, int textLength) => errors <= textLength / 25; diff --git a/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaGame.cs b/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaGame.cs index 2aebbc74..4b1d793f 100644 --- a/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaGame.cs +++ b/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaGame.cs @@ -105,34 +105,36 @@ namespace NadekoBot.Modules.Games.Trivia var umsg = imsg as IUserMessage; if (umsg == null) return; - - try + var t = Task.Run(async () => { - if (!(umsg.Channel is IGuildChannel && umsg.Channel is ITextChannel)) return; - if ((umsg.Channel as ITextChannel).Guild != guild) return; - if (umsg.Author.Id == (await NadekoBot.Client.GetCurrentUserAsync()).Id) return; - - var guildUser = umsg.Author as IGuildUser; - - var guess = false; - await _guessLock.WaitAsync().ConfigureAwait(false); try { - if (GameActive && CurrentQuestion.IsAnswerCorrect(umsg.Content) && !triviaCancelSource.IsCancellationRequested) + if (!(umsg.Channel is IGuildChannel && umsg.Channel is ITextChannel)) return; + if ((umsg.Channel as ITextChannel).Guild != guild) return; + if (umsg.Author.Id == (await NadekoBot.Client.GetCurrentUserAsync()).Id) return; + + var guildUser = umsg.Author as IGuildUser; + + var guess = false; + await _guessLock.WaitAsync().ConfigureAwait(false); + try { - Users.AddOrUpdate(guildUser, 0, (gu, old) => old++); - guess = true; + if (GameActive && CurrentQuestion.IsAnswerCorrect(umsg.Content) && !triviaCancelSource.IsCancellationRequested) + { + Users.AddOrUpdate(guildUser, 0, (gu, old) => old++); + guess = true; + } } + finally { _guessLock.Release(); } + if (!guess) return; + triviaCancelSource.Cancel(); + await channel.SendMessageAsync($"☑️ {guildUser.Mention} guessed it! The answer was: **{CurrentQuestion.Answer}**").ConfigureAwait(false); + if (Users[guildUser] != WinRequirement) return; + ShouldStopGame = true; + await channel.SendMessageAsync($":exclamation: We have a winner! It's {guildUser.Mention}.").ConfigureAwait(false); } - finally { _guessLock.Release(); } - if (!guess) return; - triviaCancelSource.Cancel(); - await channel.SendMessageAsync($"☑️ {guildUser.Mention} guessed it! The answer was: **{CurrentQuestion.Answer}**").ConfigureAwait(false); - if (Users[guildUser] != WinRequirement) return; - ShouldStopGame = true; - await channel.SendMessageAsync($":exclamation: We have a winner! It's {guildUser.Mention}.").ConfigureAwait(false); - } - catch { } + catch { } + }); } public string GetLeaderboard() diff --git a/src/NadekoBot/_Classes/ObservableConcurrentDictionary.cs b/src/NadekoBot/_Classes/ObservableConcurrentDictionary.cs deleted file mode 100644 index cd364328..00000000 --- a/src/NadekoBot/_Classes/ObservableConcurrentDictionary.cs +++ /dev/null @@ -1,204 +0,0 @@ -//-------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// File: ObservableConcurrentDictionary.cs -// -//-------------------------------------------------------------------------- - -using System.Collections.Generic; -using System.Collections.Specialized; -using System.ComponentModel; -using System.Diagnostics; -using System.Threading; - -namespace System.Collections.Concurrent -{ - /// - /// Provides a thread-safe dictionary for use with data binding. - /// - /// Specifies the type of the keys in this collection. - /// Specifies the type of the values in this collection. - [DebuggerDisplay("Count={Count}")] - public class ObservableConcurrentDictionary : - ICollection>, IDictionary, - INotifyCollectionChanged, INotifyPropertyChanged - { - private readonly SynchronizationContext _context; - private readonly ConcurrentDictionary _dictionary; - - /// - /// Initializes an instance of the ObservableConcurrentDictionary class. - /// - public ObservableConcurrentDictionary() - { - _context = AsyncOperationManager.SynchronizationContext; - _dictionary = new ConcurrentDictionary(); - } - - /// Event raised when the collection changes. - public event NotifyCollectionChangedEventHandler CollectionChanged; - /// Event raised when a property on the collection changes. - public event PropertyChangedEventHandler PropertyChanged; - - /// - /// Notifies observers of CollectionChanged or PropertyChanged of an update to the dictionary. - /// - private void NotifyObserversOfChange() - { - var collectionHandler = CollectionChanged; - var propertyHandler = PropertyChanged; - if (collectionHandler != null || propertyHandler != null) - { - _context.Post(s => - { - if (collectionHandler != null) - { - collectionHandler(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); - } - if (propertyHandler != null) - { - propertyHandler(this, new PropertyChangedEventArgs("Count")); - propertyHandler(this, new PropertyChangedEventArgs("Keys")); - propertyHandler(this, new PropertyChangedEventArgs("Values")); - } - }, null); - } - } - - /// Attempts to add an item to the dictionary, notifying observers of any changes. - /// The item to be added. - /// Whether the add was successful. - private bool TryAddWithNotification(KeyValuePair item) - { - return TryAddWithNotification(item.Key, item.Value); - } - - /// Attempts to add an item to the dictionary, notifying observers of any changes. - /// The key of the item to be added. - /// The value of the item to be added. - /// Whether the add was successful. - private bool TryAddWithNotification(TKey key, TValue value) - { - bool result = _dictionary.TryAdd(key, value); - if (result) NotifyObserversOfChange(); - return result; - } - - /// Attempts to remove an item from the dictionary, notifying observers of any changes. - /// The key of the item to be removed. - /// The value of the item removed. - /// Whether the removal was successful. - private bool TryRemoveWithNotification(TKey key, out TValue value) - { - bool result = _dictionary.TryRemove(key, out value); - if (result) NotifyObserversOfChange(); - return result; - } - - /// Attempts to add or update an item in the dictionary, notifying observers of any changes. - /// The key of the item to be updated. - /// The new value to set for the item. - /// Whether the update was successful. - private void UpdateWithNotification(TKey key, TValue value) - { - _dictionary[key] = value; - NotifyObserversOfChange(); - } - - #region ICollection> Members - void ICollection>.Add(KeyValuePair item) - { - TryAddWithNotification(item); - } - - void ICollection>.Clear() - { - ((ICollection>)_dictionary).Clear(); - NotifyObserversOfChange(); - } - - bool ICollection>.Contains(KeyValuePair item) - { - return ((ICollection>)_dictionary).Contains(item); - } - - void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) - { - ((ICollection>)_dictionary).CopyTo(array, arrayIndex); - } - - int ICollection>.Count { - get { return ((ICollection>)_dictionary).Count; } - } - - bool ICollection>.IsReadOnly { - get { return ((ICollection>)_dictionary).IsReadOnly; } - } - - bool ICollection>.Remove(KeyValuePair item) - { - TValue temp; - return TryRemoveWithNotification(item.Key, out temp); - } - #endregion - - #region IEnumerable> Members - IEnumerator> IEnumerable>.GetEnumerator() - { - return ((ICollection>)_dictionary).GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return ((ICollection>)_dictionary).GetEnumerator(); - } - #endregion - - #region IDictionary Members - public void Add(TKey key, TValue value) - { - TryAddWithNotification(key, value); - } - - public bool ContainsKey(TKey key) - { - return _dictionary.ContainsKey(key); - } - - public ICollection Keys { - get { return _dictionary.Keys; } - } - - public bool Remove(TKey key) - { - TValue temp; - return TryRemoveWithNotification(key, out temp); - } - - public bool TryGetValue(TKey key, out TValue value) - { - return _dictionary.TryGetValue(key, out value); - } - - public bool TryAdd(TKey key, TValue value) - { - return TryAddWithNotification(key, value); - } - - public ICollection Values { - get { return _dictionary.Values; } - } - - public TValue this[TKey key] { - get { return _dictionary[key]; } - set { UpdateWithNotification(key, value); } - } - - public bool TryRemove(TKey key, out TValue value) - { - return TryRemoveWithNotification(key, out value); - } - #endregion - } -} \ No newline at end of file diff --git a/src/NadekoBot/_Classes/SearchHelper.cs b/src/NadekoBot/_Classes/SearchHelper.cs deleted file mode 100644 index 8b434786..00000000 --- a/src/NadekoBot/_Classes/SearchHelper.cs +++ /dev/null @@ -1,287 +0,0 @@ -using NadekoBot.Classes.JSONModels; -using NadekoBot.Extensions; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Security.Authentication; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Xml.Linq; - -namespace NadekoBot.Classes -{ - public enum RequestHttpMethod - { - Get, - Post - } - - public static class SearchHelper - { - private static DateTime lastRefreshed = DateTime.MinValue; - private static string token { get; set; } = ""; - - public static async Task GetResponseStreamAsync(string url, - IEnumerable> headers = null, RequestHttpMethod method = RequestHttpMethod.Get) - { - if (string.IsNullOrWhiteSpace(url)) - throw new ArgumentNullException(nameof(url)); - var cl = new HttpClient(); - cl.DefaultRequestHeaders.Clear(); - switch (method) - { - case RequestHttpMethod.Get: - if (headers != null) - { - foreach (var header in headers) - { - cl.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, header.Value); - } - } - return await cl.GetStreamAsync(url).ConfigureAwait(false); - case RequestHttpMethod.Post: - FormUrlEncodedContent formContent = null; - if (headers != null) - { - formContent = new FormUrlEncodedContent(headers); - } - var message = await cl.PostAsync(url, formContent).ConfigureAwait(false); - return await message.Content.ReadAsStreamAsync().ConfigureAwait(false); - default: - throw new NotImplementedException("That type of request is unsupported."); - } - } - - public static async Task GetResponseStringAsync(string url, - IEnumerable> headers = null, - RequestHttpMethod method = RequestHttpMethod.Get) - { - - using (var streamReader = new StreamReader(await GetResponseStreamAsync(url, headers, method).ConfigureAwait(false))) - { - return await streamReader.ReadToEndAsync().ConfigureAwait(false); - } - } - - public static async Task GetAnimeData(string query) - { - if (string.IsNullOrWhiteSpace(query)) - throw new ArgumentNullException(nameof(query)); - - await RefreshAnilistToken().ConfigureAwait(false); - - var link = "http://anilist.co/api/anime/search/" + Uri.EscapeUriString(query); - var smallContent = ""; - var cl = new RestSharp.RestClient("http://anilist.co/api"); - var rq = new RestSharp.RestRequest("/anime/search/" + Uri.EscapeUriString(query)); - rq.AddParameter("access_token", token); - smallContent = cl.Execute(rq).Content; - var smallObj = JArray.Parse(smallContent)[0]; - - rq = new RestSharp.RestRequest("/anime/" + smallObj["id"]); - rq.AddParameter("access_token", token); - var content = cl.Execute(rq).Content; - - return await Task.Run(() => JsonConvert.DeserializeObject(content)).ConfigureAwait(false); - } - - public static async Task GetMangaData(string query) - { - if (string.IsNullOrWhiteSpace(query)) - throw new ArgumentNullException(nameof(query)); - - await RefreshAnilistToken().ConfigureAwait(false); - - var link = "http://anilist.co/api/anime/search/" + Uri.EscapeUriString(query); - var smallContent = ""; - var cl = new RestSharp.RestClient("http://anilist.co/api"); - var rq = new RestSharp.RestRequest("/manga/search/" + Uri.EscapeUriString(query)); - rq.AddParameter("access_token", token); - smallContent = cl.Execute(rq).Content; - var smallObj = JArray.Parse(smallContent)[0]; - - rq = new RestSharp.RestRequest("/manga/" + smallObj["id"]); - rq.AddParameter("access_token", token); - var content = cl.Execute(rq).Content; - - return await Task.Run(() => JsonConvert.DeserializeObject(content)).ConfigureAwait(false); - } - - private static async Task RefreshAnilistToken() - { - if (DateTime.Now - lastRefreshed > TimeSpan.FromMinutes(29)) - lastRefreshed = DateTime.Now; - else - { - return; - } - var headers = new Dictionary { - {"grant_type", "client_credentials"}, - {"client_id", "kwoth-w0ki9"}, - {"client_secret", "Qd6j4FIAi1ZK6Pc7N7V4Z"}, - }; - var content = await GetResponseStringAsync( - "http://anilist.co/api/auth/access_token", - headers, - RequestHttpMethod.Post).ConfigureAwait(false); - - token = JObject.Parse(content)["access_token"].ToString(); - } - - public static async Task FindYoutubeUrlByKeywords(string keywords) - { - if (string.IsNullOrWhiteSpace(keywords)) - throw new ArgumentNullException(nameof(keywords), "Query not specified."); - if (keywords.Length > 150) - throw new ArgumentException("Query is too long."); - - //maybe it is already a youtube url, in which case we will just extract the id and prepend it with youtube.com?v= - var match = new Regex("(?:youtu\\.be\\/|v=)(?[\\da-zA-Z\\-_]*)").Match(keywords); - if (match.Length > 1) - { - return $"https://www.youtube.com/watch?v={match.Groups["id"].Value}"; - } - - if (string.IsNullOrWhiteSpace(NadekoBot.Credentials.GoogleAPIKey)) - throw new InvalidCredentialException("Google API Key is missing."); - - var response = await GetResponseStringAsync( - $"https://www.googleapis.com/youtube/v3/search?" + - $"part=snippet&maxResults=1" + - $"&q={Uri.EscapeDataString(keywords)}" + - $"&key={NadekoBot.Credentials.GoogleAPIKey}").ConfigureAwait(false); - JObject obj = JObject.Parse(response); - - var data = JsonConvert.DeserializeObject(response); - - if (data.items.Length > 0) - { - var toReturn = "http://www.youtube.com/watch?v=" + data.items[0].id.videoId.ToString(); - return toReturn; - } - else - return null; - } - - public static async Task> GetRelatedVideoIds(string id, int count = 1) - { - if (string.IsNullOrWhiteSpace(id)) - throw new ArgumentNullException(nameof(id)); - var match = new Regex("(?:youtu\\.be\\/|v=)(?[\\da-zA-Z\\-_]*)").Match(id); - if (match.Length > 1) - { - id = match.Groups["id"].Value; - } - var response = await GetResponseStringAsync( - $"https://www.googleapis.com/youtube/v3/search?" + - $"part=snippet&maxResults={count}&type=video" + - $"&relatedToVideoId={id}" + - $"&key={NadekoBot.Credentials.GoogleAPIKey}").ConfigureAwait(false); - JObject obj = JObject.Parse(response); - - var data = JsonConvert.DeserializeObject(response); - - return data.items.Select(v => "http://www.youtube.com/watch?v=" + v.id.videoId); - } - - public static async Task GetPlaylistIdByKeyword(string query) - { - if (string.IsNullOrWhiteSpace(NadekoBot.Credentials.GoogleAPIKey)) - throw new ArgumentNullException(nameof(query)); - var match = new Regex("(?:youtu\\.be\\/|list=)(?[\\da-zA-Z\\-_]*)").Match(query); - if (match.Length > 1) - { - return match.Groups["id"].Value.ToString(); - } - var link = "https://www.googleapis.com/youtube/v3/search?part=snippet" + - "&maxResults=1&type=playlist" + - $"&q={Uri.EscapeDataString(query)}" + - $"&key={NadekoBot.Credentials.GoogleAPIKey}"; - - var response = await GetResponseStringAsync(link).ConfigureAwait(false); - var data = JsonConvert.DeserializeObject(response); - JObject obj = JObject.Parse(response); - - return data.items.Length > 0 ? data.items[0].id.playlistId.ToString() : null; - } - - public static async Task> GetVideoIDs(string playlist, int number = 50) - { - if (string.IsNullOrWhiteSpace(NadekoBot.Credentials.GoogleAPIKey)) - { - throw new ArgumentNullException(nameof(playlist)); - } - if (number < 1) - throw new ArgumentOutOfRangeException(); - - string nextPageToken = null; - - List toReturn = new List(); - - do - { - var toGet = number > 50 ? 50 : number; - number -= toGet; - var link = - $"https://www.googleapis.com/youtube/v3/playlistItems?part=contentDetails" + - $"&maxResults={toGet}" + - $"&playlistId={playlist}" + - $"&key={NadekoBot.Credentials.GoogleAPIKey}"; - if (!string.IsNullOrWhiteSpace(nextPageToken)) - link += $"&pageToken={nextPageToken}"; - var response = await GetResponseStringAsync(link).ConfigureAwait(false); - var data = await Task.Run(() => JsonConvert.DeserializeObject(response)).ConfigureAwait(false); - nextPageToken = data.nextPageToken; - toReturn.AddRange(data.items.Select(i => i.contentDetails.videoId)); - } while (number > 0 && !string.IsNullOrWhiteSpace(nextPageToken)); - - return toReturn; - } - - public static async Task ShortenUrl(string url) - { - if (string.IsNullOrWhiteSpace(NadekoBot.Credentials.GoogleAPIKey)) return url; - try - { - var httpWebRequest = - (HttpWebRequest)WebRequest.Create("https://www.googleapis.com/urlshortener/v1/url?key=" + - NadekoBot.Credentials.GoogleAPIKey); - httpWebRequest.ContentType = "application/json"; - httpWebRequest.Method = "POST"; - - using (var streamWriter = new StreamWriter(await httpWebRequest.GetRequestStreamAsync().ConfigureAwait(false))) - { - var json = "{\"longUrl\":\"" + Uri.EscapeDataString(url) + "\"}"; - streamWriter.Write(json); - } - - var httpResponse = (await httpWebRequest.GetResponseAsync().ConfigureAwait(false)) as HttpWebResponse; - var responseStream = httpResponse.GetResponseStream(); - using (var streamReader = new StreamReader(responseStream)) - { - var responseText = await streamReader.ReadToEndAsync().ConfigureAwait(false); - return Regex.Match(responseText, @"""id"": ?""(?.+)""").Groups["id"].Value; - } - } - catch (Exception ex) - { - Console.WriteLine("Shortening of this url failed: " + url); - Console.WriteLine(ex.ToString()); - return url; - } - } - - public static string ShowInPrettyCode(IEnumerable items, Func howToPrint, int cols = 3) - { - var i = 0; - return "```xl\n" + string.Join("\n", items.GroupBy(item => (i++) / cols) - .Select(ig => string.Concat(ig.Select(el => howToPrint(el))))) - + $"\n```"; - } - } -} diff --git a/src/NadekoBot/_Classes/ServerSpecificConfig.cs b/src/NadekoBot/_Classes/ServerSpecificConfig.cs deleted file mode 100644 index 46351c82..00000000 --- a/src/NadekoBot/_Classes/ServerSpecificConfig.cs +++ /dev/null @@ -1,292 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.IO; -using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; - -namespace NadekoBot.Classes -{ - public class SpecificConfigurations - { - public static SpecificConfigurations Default { get; } = new SpecificConfigurations(); - public static bool Instantiated { get; private set; } - - private const string filePath = "data/ServerSpecificConfigs.json"; - - static SpecificConfigurations() { } - - private SpecificConfigurations() - { - - if (File.Exists(filePath)) - { - try - { - configs = JsonConvert - .DeserializeObject>( - File.ReadAllText(filePath), new JsonSerializerSettings() - { - Error = (s, e) => - { - if (e.ErrorContext.Member.ToString() == "GenerateCurrencyChannels") - { - e.ErrorContext.Handled = true; - } - } - }); - } - catch (Exception ex) - { - Console.WriteLine($"Deserialization failing: {ex}"); - } - } - if (configs == null) - configs = new ConcurrentDictionary(); - Instantiated = true; - } - - private readonly ConcurrentDictionary configs; - - public IEnumerable AllConfigs => configs.Values; - - public ServerSpecificConfig Of(ulong id) => - configs.GetOrAdd(id, _ => new ServerSpecificConfig()); - - private readonly SemaphoreSlim saveLock = new SemaphoreSlim(1, 1); - - public async Task Save() - { - await saveLock.WaitAsync(); - try - { - File.WriteAllText(filePath, JsonConvert.SerializeObject(configs, Formatting.Indented)); - } - finally - { - saveLock.Release(); - } - } - } - - public class ServerSpecificConfig : INotifyPropertyChanged - { - [JsonProperty("VoicePlusTextEnabled")] - private bool voicePlusTextEnabled; - [JsonIgnore] - public bool VoicePlusTextEnabled { - get { return voicePlusTextEnabled; } - set { - voicePlusTextEnabled = value; - if (!SpecificConfigurations.Instantiated) return; - OnPropertyChanged(); - } - } - [JsonProperty("SendPrivateMessageOnMention")] - private bool sendPrivateMessageOnMention; - [JsonIgnore] - public bool SendPrivateMessageOnMention { - get { return sendPrivateMessageOnMention; } - set { - sendPrivateMessageOnMention = value; - if (!SpecificConfigurations.Instantiated) return; - OnPropertyChanged(); - } - } - - [JsonProperty("LogChannel")] - private ulong? logServerChannel = null; - [JsonIgnore] - public ulong? LogServerChannel { - get { return logServerChannel; } - set { - logServerChannel = value; - if (!SpecificConfigurations.Instantiated) return; - OnPropertyChanged(); - } - } - - [JsonIgnore] - private ObservableCollection logserverIgnoreChannels; - public ObservableCollection LogserverIgnoreChannels { - get { return logserverIgnoreChannels; } - set { - logserverIgnoreChannels = value; - if (value != null) - logserverIgnoreChannels.CollectionChanged += (s, e) => - { - if (!SpecificConfigurations.Instantiated) return; - OnPropertyChanged(); - }; - } - } - - [JsonProperty("LogPresenceChannel")] - private ulong? logPresenceChannel = null; - [JsonIgnore] - public ulong? LogPresenceChannel { - get { return logPresenceChannel; } - set { - logPresenceChannel = value; - if (!SpecificConfigurations.Instantiated) return; - OnPropertyChanged(); - } - } - - [JsonIgnore] - private ObservableConcurrentDictionary voiceChannelLog; - public ObservableConcurrentDictionary VoiceChannelLog { - get { return voiceChannelLog; } - set { - voiceChannelLog = value; - if (value != null) - voiceChannelLog.CollectionChanged += (s, e) => - { - if (!SpecificConfigurations.Instantiated) return; - OnPropertyChanged(); - }; - } - } - - [JsonIgnore] - private ObservableCollection listOfSelfAssignableRoles; - public ObservableCollection ListOfSelfAssignableRoles { - get { return listOfSelfAssignableRoles; } - set { - listOfSelfAssignableRoles = value; - if (value != null) - listOfSelfAssignableRoles.CollectionChanged += (s, e) => - { - if (!SpecificConfigurations.Instantiated) return; - OnPropertyChanged(); - }; - } - } - - - - [JsonIgnore] - private ulong autoAssignedRole = 0; - public ulong AutoAssignedRole { - get { return autoAssignedRole; } - set { - autoAssignedRole = value; - if (!SpecificConfigurations.Instantiated) return; - OnPropertyChanged(); - } - } - - [JsonIgnore] - private ObservableConcurrentDictionary generateCurrencyChannels; - public ObservableConcurrentDictionary GenerateCurrencyChannels { - get { return generateCurrencyChannels; } - set { - generateCurrencyChannels = value; - if (value != null) - generateCurrencyChannels.CollectionChanged += (s, e) => - { - if (!SpecificConfigurations.Instantiated) return; - OnPropertyChanged(); - }; - } - } - - [JsonIgnore] - private bool autoDeleteMessagesOnCommand = false; - public bool AutoDeleteMessagesOnCommand { - get { return autoDeleteMessagesOnCommand; } - set { - autoDeleteMessagesOnCommand = value; - if (!SpecificConfigurations.Instantiated) return; - OnPropertyChanged(); - } - } - - [JsonIgnore] - private bool exclusiveSelfAssignedRoles = false; - public bool ExclusiveSelfAssignedRoles - { - get { return exclusiveSelfAssignedRoles; } - set - { - exclusiveSelfAssignedRoles = value; - if (!SpecificConfigurations.Instantiated) return; - OnPropertyChanged(); - } - } - - - [JsonIgnore] - private ObservableCollection observingStreams; - public ObservableCollection ObservingStreams { - get { return observingStreams; } - set { - observingStreams = value; - if (value != null) - observingStreams.CollectionChanged += (s, e) => - { - if (!SpecificConfigurations.Instantiated) return; - OnPropertyChanged(); - }; - } - } - - [JsonIgnore] - private float defaultMusicVolume = 1f; - public float DefaultMusicVolume { - get { return defaultMusicVolume; } - set { - defaultMusicVolume = value; - if (!SpecificConfigurations.Instantiated) return; - OnPropertyChanged(); - } - } - - public ServerSpecificConfig() - { - ListOfSelfAssignableRoles = new ObservableCollection(); - ObservingStreams = new ObservableCollection(); - GenerateCurrencyChannels = new ObservableConcurrentDictionary(); - VoiceChannelLog = new ObservableConcurrentDictionary(); - LogserverIgnoreChannels = new ObservableCollection(); - } - - public event PropertyChangedEventHandler PropertyChanged = async delegate { await SpecificConfigurations.Default.Save().ConfigureAwait(false); }; - - private void OnPropertyChanged([CallerMemberName] string propertyName = null) - { - PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); - } - } - - public class StreamNotificationConfig : IEquatable - { - public string Username { get; set; } - public StreamType Type { get; set; } - public ulong ServerId { get; set; } - public ulong ChannelId { get; set; } - public bool LastStatus { get; set; } - - public enum StreamType - { - Twitch, - Beam, - Hitbox, - YoutubeGaming - } - - public bool Equals(StreamNotificationConfig other) => - this.Username.ToLower().Trim() == other.Username.ToLower().Trim() && - this.Type == other.Type && - this.ServerId == other.ServerId; - - public override int GetHashCode() - { - return (int)ServerId + Username.Length + (int)Type; - } - } -} diff --git a/src/NadekoBot/_Modules/CustomReactions/CustomReactions.cs b/src/NadekoBot/_Modules/CustomReactions/CustomReactions.cs deleted file mode 100644 index 8e9aa652..00000000 --- a/src/NadekoBot/_Modules/CustomReactions/CustomReactions.cs +++ /dev/null @@ -1,67 +0,0 @@ -using Discord.Commands; -using Discord.Modules; -using NadekoBot.Extensions; -using NadekoBot.Modules.Permissions.Classes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; - -namespace NadekoBot.Modules.CustomReactions -{ - public class CustomReactionsModule : DiscordModule - { - public override string Prefix { get; } = ""; - - private Random rng = new Random(); - - private Dictionary> commandFuncs; - - public CustomReactionsModule() - { - commandFuncs = new Dictionary> - { - {new Regex(@"(?:%rng%|%rng:(\d{1,9})-(\d{1,9})%)"), (e,m) => { - int start, end; - if (m.Groups[1].Success) - { - start = int.Parse(m.Groups[1].Value); - end = int.Parse(m.Groups[2].Value); - return rng.Next(start, end).ToString(); - }else return rng.Next().ToString(); - } }, - {new Regex("%mention%"), (e,m) => NadekoBot.BotMention }, - {new Regex("%user%"), (e,m) => umsg.Author.Mention }, - {new Regex("%target%"), (e,m) => args?.Trim() ?? "" }, - - }; - } - - public override void Install(ModuleManager manager) - { - manager.CreateCommands("", cgb => - { - cgb.AddCheck(PermissionChecker.Instance); - - foreach (var command in NadekoBot.Config.CustomReactions) - { - var commandName = command.Key.Replace("%mention%", NadekoBot.BotMention); - - var c = cgb.CreateCommand(commandName); - if (commandName.Contains(NadekoBot.BotMention)) - c.Alias(commandName.Replace("<@", "<@!")); - c.Description($"Custom reaction. | `{command.Key}`") - .Parameter("args", ParameterType.Unparsed) - .Do(async e => - { - string str = command.Value[rng.Next(0, command.Value.Count())]; - commandFuncs.Keys.ForEach(key => str = key.Replace(str, m => commandFuncs[key](e, m))); - - - await channel.SendMessageAsync(str).ConfigureAwait(false); - }); - } - }); - } - } -} diff --git a/src/NadekoBot/_Modules/DiscordCommand.cs b/src/NadekoBot/_Modules/DiscordCommand.cs deleted file mode 100644 index 39637e1b..00000000 --- a/src/NadekoBot/_Modules/DiscordCommand.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Discord.Commands; -using NadekoBot.Modules; - -namespace NadekoBot.Classes -{ - /// - /// Base DiscordCommand Class. - /// Inherit this class to create your own command. - /// - public abstract class DiscordCommand - { - - /// - /// Parent module - /// - protected DiscordModule Module { get; } - - /// - /// Parent module's prefix - /// - protected string Prefix => Module.Prefix; - - /// - /// Creates a new instance of discord command, - /// use ": base(module)" in the derived class' - /// constructor to make sure module is assigned - /// - /// Module this command resides in - protected DiscordCommand(DiscordModule module) - { - this.Module = module; - } - - /// - /// Initializes the CommandBuilder with values using CommandGroupBuilder - /// - public abstract void Init(CommandGroupBuilder cgb); - } -} diff --git a/src/NadekoBot/_Modules/DiscordModule.cs b/src/NadekoBot/_Modules/DiscordModule.cs deleted file mode 100644 index 5e131233..00000000 --- a/src/NadekoBot/_Modules/DiscordModule.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Discord.Modules; -using System.Collections.Generic; -using NadekoBot.Classes; - -namespace NadekoBot.Modules { - public abstract class DiscordModule : IModule { - protected readonly HashSet commands = new HashSet(); - - public abstract string Prefix { get; } - - public abstract void Install(ModuleManager manager); - } -} diff --git a/src/NadekoBot/_Modules/Permissions/Classes/PermissionChecker.cs b/src/NadekoBot/_Modules/Permissions/Classes/PermissionChecker.cs deleted file mode 100644 index 6c1fcd89..00000000 --- a/src/NadekoBot/_Modules/Permissions/Classes/PermissionChecker.cs +++ /dev/null @@ -1,175 +0,0 @@ -using Discord; -using Discord.Commands; -using Discord.Commands.Permissions; -using NadekoBot.Classes.JSONModels; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace NadekoBot.Modules.Permissions.Classes -{ - - public class PermissionChecker : IPermissionChecker - { - public static PermissionChecker Instance { get; } = new PermissionChecker(); - - //key - sid:command - //value - userid - private ConcurrentDictionary commandCooldowns = new ConcurrentDictionary(); - private HashSet timeBlackList { get; } = new HashSet(); - - static PermissionChecker() { } - private PermissionChecker() - { - Task.Run(async () => - { - while (true) - { - //blacklist is cleared every 1.00 seconds. That is the most time anyone will be blocked - await Task.Delay(1000).ConfigureAwait(false); - timeBlackList.Clear(); - } - }); - } - - public bool CanRun(Command command, User user, Channel channel, out string error) - { - error = String.Empty; - - if (!NadekoBot.Ready) - return false; - - if (channel.IsPrivate || channel.Server == null) - return command.Category == "Help"; - - if (ConfigHandler.IsUserBlacklisted(user.Id) || - (!channel.IsPrivate && - (ConfigHandler.IsServerBlacklisted(channel.Server.Id) || ConfigHandler.IsChannelBlacklisted(channel.Id)))) - { - return false; - } - if (timeBlackList.Contains(user.Id)) - return false; - - if (!channel.IsPrivate && !channel.Server.CurrentUser.GetPermissions(channel).SendMessages) - { - return false; - } - - timeBlackList.Add(user.Id); - - ServerPermissions perms; - PermissionsHandler.PermissionsDict.TryGetValue(user.Server.Id, out perms); - - AddUserCooldown(user.Server.Id, user.Id, command.Text.ToLower()); - if (commandCooldowns.Keys.Contains(user.Server.Id + ":" + command.Text.ToLower())) - { - if (perms?.Verbose == true) - error = $"{user.Mention} You have a cooldown on that command."; - return false; - } - - try - { - //is it a permission command? - // if it is, check if the user has the correct role - // if yes return true, if no return false - if (command.Category == "Permissions") - { - Discord.Role role = null; - try - { - role = PermissionHelper.ValidateRole(user.Server, - PermissionsHandler.GetServerPermissionsRoleName(user.Server)); - } - catch { } - if (user.Server.Owner.Id == user.Id || (role != null && user.HasRole(role))) - return true; - throw new Exception($"You don't have the necessary role (**{(perms?.PermissionsControllerRole ?? "Nadeko")}**) to change permissions."); - } - - var permissionType = PermissionsHandler.GetPermissionBanType(command, user, channel); - - string msg; - - if (permissionType == PermissionsHandler.PermissionBanType.ServerBanModule && - command.Category.ToLower() == "nsfw") - msg = $"**{command.Category}** module has been banned from use on this **server**.\nNSFW module is disabled by default. Server owner can type `;sm nsfw enable` to enable it."; - else - switch (permissionType) - { - case PermissionsHandler.PermissionBanType.None: - return true; - case PermissionsHandler.PermissionBanType.ServerBanCommand: - msg = $"**{command.Text}** command has been banned from use on this **server**."; - break; - case PermissionsHandler.PermissionBanType.ServerBanModule: - msg = $"**{command.Category}** module has been banned from use on this **server**."; - break; - case PermissionsHandler.PermissionBanType.ChannelBanCommand: - msg = $"**{command.Text}** command has been banned from use on this **channel**."; - break; - case PermissionsHandler.PermissionBanType.ChannelBanModule: - msg = $"**{command.Category}** module has been banned from use on this **channel**."; - break; - case PermissionsHandler.PermissionBanType.RoleBanCommand: - msg = $"You do not have a **role** which permits you the usage of **{command.Text}** command."; - break; - case PermissionsHandler.PermissionBanType.RoleBanModule: - msg = $"You do not have a **role** which permits you the usage of **{command.Category}** module."; - break; - case PermissionsHandler.PermissionBanTypumsg.AuthorBanCommand: - msg = $"{user.Mention}, You have been banned from using **{command.Text}** command."; - break; - case PermissionsHandler.PermissionBanTypumsg.AuthorBanModule: - msg = $"{user.Mention}, You have been banned from using **{command.Category}** module."; - break; - default: - return true; - } - if (PermissionsHandler.PermissionsDict[user.Server.Id].Verbose) //if verbose - print errors - error = msg; - return false; - } - catch (Exception ex) - { - Console.WriteLine($"Exception in canrun: {ex}"); - try - { - if (perms != null && perms.Verbose) - //if verbose - print errors - error = ex.Message; - } - catch (Exception ex2) - { - Console.WriteLine($"SERIOUS PERMISSION ERROR {ex2}\n\nUser:{user} Server: {user?.Server?.Name}/{user?.Server?.Id}"); - } - return false; - } - } - - public void AddUserCooldown(ulong serverId, ulong userId, string commandName) - { - commandCooldowns.TryAdd(commandName, userId); - var tosave = serverId + ":" + commandName; - Task.Run(async () => - { - ServerPermissions perms; - PermissionsHandler.PermissionsDict.TryGetValue(serverId, out perms); - int cd; - if (!perms.CommandCooldowns.TryGetValue(commandName, out cd)) - { - return; - } - if (commandCooldowns.TryAdd(tosave, userId)) - { - await Task.Delay(cd * 1000); - ulong throwaway; - commandCooldowns.TryRemove(tosave, out throwaway); - } - - }); - } - } -} diff --git a/src/NadekoBot/_Modules/Permissions/Classes/PermissionHelper.cs b/src/NadekoBot/_Modules/Permissions/Classes/PermissionHelper.cs deleted file mode 100644 index e17801d9..00000000 --- a/src/NadekoBot/_Modules/Permissions/Classes/PermissionHelper.cs +++ /dev/null @@ -1,101 +0,0 @@ -using Discord; -using Discord.Commands; -using Discord.Modules; -using System; -using System.Linq; - -namespace NadekoBot.Modules.Permissions.Classes -{ - public static class PermissionHelper - { - public static bool ValidateBool(string passedArg) - { - if (string.IsNullOrWhiteSpace(passedArg)) - { - throw new ArgumentException("No value supplied! Missing argument"); - } - switch (passedArg.ToLower()) - { - case "1": - case "t": - case "true": - case "enable": - case "enabled": - case "allow": - case "unban": - return true; - case "0": - case "f": - case "false": - case "disable": - case "disabled": - case "disallow": - case "ban": - return false; - default: - throw new ArgumentException("Did not receive a valid boolean value"); - } - } - - public static string ValidateModule(string mod) - { - if (string.IsNullOrWhiteSpace(mod)) - throw new ArgumentNullException(nameof(mod)); - - foreach (var m in NadekoBot.Client.GetService().Modules) - { - if (m.Name.ToLower().Equals(mod.Trim().ToLower())) - return m.Name; - } - throw new ArgumentException("That module does not exist."); - } - - public static string ValidateCommand(string commandText) - { - if (string.IsNullOrWhiteSpace(commandText)) - throw new ArgumentNullException(nameof(commandText)); - - var normalizedCmdTxt = commandText.Trim().ToUpperInvariant(); - - foreach (var com in NadekoBot.Client.GetService().AllCommands) - { - if (com.Text.ToUpperInvariant().Equals(normalizedCmdTxt) || com.Aliases.Select(c=>c.ToUpperInvariant()).Contains(normalizedCmdTxt)) - return com.Text; - } - throw new NullReferenceException("That command does not exist."); - } - - public static Role ValidateRole(Server server, string roleName) - { - if (string.IsNullOrWhiteSpace(roleName)) - throw new ArgumentNullException(nameof(roleName)); - - if (roleName.Trim() == "everyone") - roleName = "@everyone"; - var role = server.FindRoles(roleName.Trim()).FirstOrDefault(); - if (role == null) - throw new NullReferenceException("That role does not exist."); - return role; - } - - public static Channel ValidateChannel(Server server, string channelName) - { - if (string.IsNullOrWhiteSpace(channelName)) - throw new ArgumentNullException(nameof(channelName)); - var channel = server.FindChannels(channelName.Trim(), ChannelType.Text).FirstOrDefault(); - if (channel == null) - throw new NullReferenceException("That channel does not exist."); - return channel; - } - - public static User ValidateUser(Server server, string userName) - { - if (string.IsNullOrWhiteSpace(userName)) - throw new ArgumentNullException(nameof(userName)); - var user = server.FindUsers(userName.Trim()).FirstOrDefault(); - if (user == null) - throw new NullReferenceException("That user does not exist."); - return user; - } - } -} diff --git a/src/NadekoBot/_Modules/Permissions/Classes/PermissionsHandler.cs b/src/NadekoBot/_Modules/Permissions/Classes/PermissionsHandler.cs deleted file mode 100644 index 29ebeb20..00000000 --- a/src/NadekoBot/_Modules/Permissions/Classes/PermissionsHandler.cs +++ /dev/null @@ -1,575 +0,0 @@ -using Discord; -using Discord.Commands; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; - -namespace NadekoBot.Modules.Permissions.Classes -{ - public static class PermissionsHandler - { - public static ConcurrentDictionary PermissionsDict = - new ConcurrentDictionary(); - - public enum PermissionBanType - { - None, ServerBanCommand, ServerBanModule, - ChannelBanCommand, ChannelBanModule, RoleBanCommand, - RoleBanModule, UserBanCommand, UserBanModule - } - - - public static void Initialize() - { - Console.WriteLine("Reading from the permission files."); - Directory.CreateDirectory("data/permissions"); - foreach (var file in Directory.EnumerateFiles("data/permissions/")) - { - try - { - var strippedFileName = Path.GetFileNameWithoutExtension(file); - if (string.IsNullOrWhiteSpace(strippedFileName)) continue; - var id = ulong.Parse(strippedFileName); - var data = Newtonsoft.Json.JsonConvert.DeserializeObject(File.ReadAllText(file)); - PermissionsDict.TryAdd(id, data); - } - catch { } - } - Console.WriteLine("Permission initialization complete."); - } - - public static Permissions GetRolePermissionsById(Server server, ulong id) - { - ServerPermissions serverPerms; - if (!PermissionsDict.TryGetValue(server.Id, out serverPerms)) - return null; - - Permissions toReturn; - serverPerms.RolePermissions.TryGetValue(id, out toReturn); - return toReturn; - } - - public static Permissions GetUserPermissionsById(Server server, ulong id) - { - ServerPermissions serverPerms; - if (!PermissionsDict.TryGetValue(server.Id, out serverPerms)) - return null; - - Permissions toReturn; - serverPerms.UserPermissions.TryGetValue(id, out toReturn); - return toReturn; - } - - public static Permissions GetChannelPermissionsById(Server server, ulong id) - { - ServerPermissions serverPerms; - if (!PermissionsDict.TryGetValue(server.Id, out serverPerms)) - return null; - - Permissions toReturn; - serverPerms.ChannelPermissions.TryGetValue(id, out toReturn); - return toReturn; - } - - public static Permissions GetServerPermissions(Server server) - { - ServerPermissions serverPerms; - return !PermissionsDict.TryGetValue(server.Id, out serverPerms) ? null : serverPerms.Permissions; - } - - public static PermissionBanType GetPermissionBanType(Command command, User user, Channel channel) - { - var server = user.Server; - ServerPermissions serverPerms = PermissionsDict.GetOrAdd(server.Id, id => new ServerPermissions(id, server.Name)); - bool val; - Permissions perm; - //server - 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) - return PermissionBanType.ServerBanCommand; - //channel - if (serverPerms.ChannelPermissions.TryGetValue(channel.Id, out perm) && - 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) - return PermissionBanType.ChannelBanCommand; - - //ROLE PART - TWO CASES - // FIRST CASE: - // IF EVERY ROLE USER HAS IS BANNED FROM THE MODULE, - // THAT MEANS USER CANNOT RUN THIS COMMAND - // IF AT LEAST ONE ROLE EXIST THAT IS NOT BANNED, - // USER CAN RUN THE COMMAND - 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) - continue; - foundNotBannedRole = true; - break; - } - if (!foundNotBannedRole) - return PermissionBanType.RoleBanModule; - - // SECOND CASE: - // IF EVERY ROLE USER HAS IS BANNED FROM THE COMMAND, - // THAT MEANS USER CANNOT RUN THAT COMMAND - // IF AT LEAST ONE ROLE EXISTS THAT IS NOT BANNED, - // USER CAN RUN THE COMMAND - 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.Commands.TryGetValue(command.Text, out val) && val == false) - continue; - else - { - foundNotBannedRole = true; - break; - } - } - if (!foundNotBannedRole) - return PermissionBanType.RoleBanCommand; - - //user - if (serverPerms.UserPermissions.TryGetValue(user.Id, out perm) && - perm.Modules.TryGetValue(command.Category, out val) && val == false) - return PermissionBanTypumsg.AuthorBanModule; - if (serverPerms.UserPermissions.TryGetValue(user.Id, out perm) && - perm.Commands.TryGetValue(command.Text, out val) && val == false) - return PermissionBanTypumsg.AuthorBanCommand; - - return PermissionBanType.None; - } - - private static Task WriteServerToJson(ServerPermissions serverPerms) => Task.Run(() => - { - string pathToFile = $"data/permissions/{serverPerms.Id}.json"; - File.WriteAllText(pathToFile, - Newtonsoft.Json.JsonConvert.SerializeObject(serverPerms, Newtonsoft.Json.Formatting.Indented)); - }); - - public static Task WriteToJson() => Task.Run(() => - { - Directory.CreateDirectory("data/permissions/"); - foreach (var kvp in PermissionsDict) - { - WriteServerToJson(kvp.Value); - } - }); - - public static string GetServerPermissionsRoleName(Server server) - { - var serverPerms = PermissionsDict.GetOrAdd(server.Id, - new ServerPermissions(server.Id, server.Name)); - - return serverPerms.PermissionsControllerRole; - } - - public static async Task SetPermissionsRole(Server server, string roleName) - { - var serverPerms = PermissionsDict.GetOrAdd(server.Id, - new ServerPermissions(server.Id, server.Name)); - - serverPerms.PermissionsControllerRole = roleName; - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task SetVerbosity(Server server, bool val) - { - var serverPerms = PermissionsDict.GetOrAdd(server.Id, - new ServerPermissions(server.Id, server.Name)); - - serverPerms.Verbose = val; - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task CopyRolePermissions(Role fromRole, Role toRole) - { - var server = fromRole.Server; - var serverPerms = PermissionsDict.GetOrAdd(server.Id, - new ServerPermissions(server.Id, server.Name)); - - var from = GetRolePermissionsById(server, fromRole.Id); - if (from == null) - serverPerms.RolePermissions.Add(fromRole.Id, from = new Permissions(fromRole.Name)); - var to = GetRolePermissionsById(server, toRole.Id); - if (to == null) - serverPerms.RolePermissions.Add(toRole.Id, to = new Permissions(toRole.Name)); - - to.CopyFrom(from); - - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task CopyChannelPermissions(Channel fromChannel, Channel toChannel) - { - var server = fromChannel.Server; - var serverPerms = PermissionsDict.GetOrAdd(server.Id, - new ServerPermissions(server.Id, server.Name)); - - var from = GetChannelPermissionsById(server, fromChannel.Id); - if (from == null) - serverPerms.ChannelPermissions.Add(fromChannel.Id, from = new Permissions(fromChannel.Name)); - var to = GetChannelPermissionsById(server, toChannel.Id); - if (to == null) - serverPerms.ChannelPermissions.Add(toChannel.Id, to = new Permissions(toChannel.Name)); - - to.CopyFrom(from); - - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task CopyUserPermissions(User fromUser, User toUser) - { - var server = fromUser.Server; - var serverPerms = PermissionsDict.GetOrAdd(server.Id, - new ServerPermissions(server.Id, server.Name)); - - var from = GetUserPermissionsById(server, fromUser.Id); - if (from == null) - serverPerms.UserPermissions.Add(fromUser.Id, from = new Permissions(fromUser.Name)); - var to = GetUserPermissionsById(server, toUser.Id); - if (to == null) - serverPerms.UserPermissions.Add(toUser.Id, to = new Permissions(toUser.Name)); - - to.CopyFrom(from); - - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task SetServerModulePermission(Server server, string moduleName, bool value) - { - 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.TryAdd(moduleName, value); - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task SetServerCommandPermission(Server server, string commandName, bool value) - { - 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.TryAdd(commandName, value); - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task SetChannelModulePermission(Channel channel, string moduleName, bool value) - { - var server = channel.Server; - - 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; - - if (modules.ContainsKey(moduleName)) - modules[moduleName] = value; - else - modules.TryAdd(moduleName, value); - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task SetChannelCommandPermission(Channel channel, string commandName, bool value) - { - var server = channel.Server; - 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; - - if (commands.ContainsKey(commandName)) - commands[commandName] = value; - else - commands.TryAdd(commandName, value); - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task SetRoleModulePermission(Role role, string moduleName, bool value) - { - var server = role.Server; - 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; - - if (modules.ContainsKey(moduleName)) - modules[moduleName] = value; - else - modules.TryAdd(moduleName, value); - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task SetRoleCommandPermission(Role role, string commandName, bool value) - { - var server = role.Server; - 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; - - if (commands.ContainsKey(commandName)) - commands[commandName] = value; - else - commands.TryAdd(commandName, value); - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task SetUserModulePermission(User user, string moduleName, bool value) - { - var server = user.Server; - 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; - - if (modules.ContainsKey(moduleName)) - modules[moduleName] = value; - else - modules.TryAdd(moduleName, value); - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task SetUserCommandPermission(User user, string commandName, bool value) - { - var server = user.Server; - 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; - - if (commands.ContainsKey(commandName)) - commands[commandName] = value; - else - commands.TryAdd(commandName, value); - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task SetServerWordPermission(Server server, bool value) - { - var serverPerms = PermissionsDict.GetOrAdd(server.Id, - new ServerPermissions(server.Id, server.Name)); - - serverPerms.Permissions.FilterWords = value; - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task SetChannelWordPermission(Channel channel, bool value) - { - var server = channel.Server; - 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)); - - serverPerms.ChannelPermissions[channel.Id].FilterWords = value; - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task SetServerFilterInvitesPermission(Server server, bool value) - { - var serverPerms = PermissionsDict.GetOrAdd(server.Id, - new ServerPermissions(server.Id, server.Name)); - - serverPerms.Permissions.FilterInvites = value; - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task SetChannelFilterInvitesPermission(Channel channel, bool value) - { - var server = channel.Server; - 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)); - - serverPerms.ChannelPermissions[channel.Id].FilterInvites = value; - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task SetCommandCooldown(Server server, string commandName, int value) - { - var serverPerms = PermissionsDict.GetOrAdd(server.Id, - new ServerPermissions(server.Id, server.Name)); - if (value == 0) { - int throwaway; - serverPerms.CommandCooldowns.TryRemove(commandName, out throwaway); - } - else { - serverPerms.CommandCooldowns.AddOrUpdate(commandName, value, (str, v) => value); - } - - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - - public static async Task AddFilteredWord(Server server, string word) - { - var serverPerms = PermissionsDict.GetOrAdd(server.Id, - new ServerPermissions(server.Id, server.Name)); - if (serverPerms.Words.Contains(word)) - throw new InvalidOperationException("That word is already banned."); - serverPerms.Words.Add(word); - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - public static async Task RemoveFilteredWord(Server server, string word) - { - var serverPerms = PermissionsDict.GetOrAdd(server.Id, - new ServerPermissions(server.Id, server.Name)); - if (!serverPerms.Words.Contains(word)) - throw new InvalidOperationException("That word is not banned."); - serverPerms.Words.Remove(word); - await WriteServerToJson(serverPerms).ConfigureAwait(false); - } - } - /// - /// Holds a permission list - /// - public class Permissions - { - /// - /// Name of the parent object whose permissions these are - /// - public string Name { get; set; } - /// - /// Module name with allowed/disallowed - /// - public ConcurrentDictionary Modules { get; set; } - /// - /// Command name with allowed/disallowed - /// - public ConcurrentDictionary Commands { get; set; } - /// - /// Should the bot filter invites to other discord servers (and ref links in the future) - /// - public bool FilterInvites { get; set; } - /// - /// Should the bot filter words which are specified in the Words hashset - /// - public bool FilterWords { get; set; } - - public Permissions(string name) - { - Name = name; - Modules = new ConcurrentDictionary(); - Commands = new ConcurrentDictionary(); - FilterInvites = false; - FilterWords = false; - } - - public void CopyFrom(Permissions other) - { - Modules.Clear(); - foreach (var mp in other.Modules) - Modules.AddOrUpdate(mp.Key, mp.Value, (s, b) => mp.Value); - Commands.Clear(); - foreach (var cp in other.Commands) - Commands.AddOrUpdate(cp.Key, cp.Value, (s, b) => cp.Value); - FilterInvites = other.FilterInvites; - FilterWords = other.FilterWords; - } - - public override string ToString() - { - var toReturn = ""; - var bannedModules = Modules.Where(kvp => kvp.Value == false); - var bannedModulesArray = bannedModules as KeyValuePair[] ?? bannedModules.ToArray(); - if (bannedModulesArray.Any()) - { - toReturn += "`Banned Modules:`\n"; - toReturn = bannedModulesArray.Aggregate(toReturn, (current, m) => current + $"\t`[x] {m.Key}`\n"); - } - var bannedCommands = Commands.Where(kvp => kvp.Value == false); - var bannedCommandsArr = bannedCommands as KeyValuePair[] ?? bannedCommands.ToArray(); - if (bannedCommandsArr.Any()) - { - toReturn += "`Banned Commands:`\n"; - toReturn = bannedCommandsArr.Aggregate(toReturn, (current, c) => current + $"\t`[x] {c.Key}`\n"); - } - return toReturn; - } - } - - public class ServerPermissions - { - /// - /// The guy who can edit the permissions - /// - public string PermissionsControllerRole { get; set; } - /// - /// Does it print the error when a restriction occurs - /// - public bool Verbose { get; set; } - /// - /// The id of the thing (user/server/channel) - /// - public ulong Id { get; set; } //a string because of the role name. - /// - /// Permission object bound to the id of something/role name - /// - public Permissions Permissions { get; set; } - /// - /// Banned words, usually profanities, like word "java" - /// - public HashSet Words { get; set; } - - public Dictionary UserPermissions { get; set; } - public Dictionary ChannelPermissions { get; set; } - public Dictionary RolePermissions { get; set; } - /// - /// Dictionary of command names with their respective cooldowns - /// - public ConcurrentDictionary CommandCooldowns { get; set; } - - public ServerPermissions(ulong id, string name) - { - Id = id; - PermissionsControllerRole = "Nadeko"; - Verbose = true; - - Permissions = new Permissions(name); - Permissions.Modules.TryAdd("NSFW", false); - UserPermissions = new Dictionary(); - ChannelPermissions = new Dictionary(); - RolePermissions = new Dictionary(); - CommandCooldowns = new ConcurrentDictionary(); - Words = new HashSet(); - } - } -} \ No newline at end of file diff --git a/src/NadekoBot/_Modules/Permissions/Classes/SimpleCheckers.cs b/src/NadekoBot/_Modules/Permissions/Classes/SimpleCheckers.cs deleted file mode 100644 index 3ab0650d..00000000 --- a/src/NadekoBot/_Modules/Permissions/Classes/SimpleCheckers.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Discord; -using Discord.Commands; -using Discord.Commands.Permissions; -using System; - -namespace NadekoBot.Modules.Permissions.Classes -{ - public static class SimpleCheckers - { - public static ManageRoles CanManageRoles { get; } = new ManageRoles(); - - public static Func OwnerOnly() => - (com, user, ch) => NadekoBot.IsOwner(user.Id); - - public static Func ManageMessages() => - (com, user, ch) => user.ServerPermissions.ManageMessages; - - public static Func ManageChannels() => - (com, user, ch) => user.ServerPermissions.ManageChannels; - - public static Func ManageServer() => - (com, user, ch) => user.ServerPermissions.ManageServer; - - public class ManageRoles : IPermissionChecker - { - public bool CanRun(Command command, User user, Channel channel, out string error) - { - error = string.Empty; - if (user.ServerPermissions.ManageRoles) - return true; - error = "You do not have a permission to manage roles."; - return false; - } - } - } -} diff --git a/src/NadekoBot/_Modules/Permissions/Commands/FilterInvitesCommand.cs b/src/NadekoBot/_Modules/Permissions/Commands/FilterInvitesCommand.cs deleted file mode 100644 index 0eb94cec..00000000 --- a/src/NadekoBot/_Modules/Permissions/Commands/FilterInvitesCommand.cs +++ /dev/null @@ -1,117 +0,0 @@ -using Discord; -using Discord.Commands; -using NadekoBot.Classes; -using NadekoBot.Modules.Permissions.Classes; -using System; -using System.Text.RegularExpressions; - -namespace NadekoBot.Modules.Permissions -{ - public class FilterInvitesCommand : DiscordCommand - { - private readonly Regex filterRegex = new Regex(@"(?:discord(?:\.gg|app\.com\/invite)\/(?([\w]{16}|(?:[\w]+-?){3})))"); - - - public FilterInvitesCommand(DiscordModule module) : base(module) - { - NadekoBot.Client.MessageReceived += async (sender, args) => - { - if (args.Channel.IsPrivate || args.User.Id == NadekoBot.Client.CurrentUser.Id) return; - try - { - Classes.ServerPermissions serverPerms; - if (!IsChannelOrServerFiltering(args.Channel, out serverPerms)) return; - - if (filterRegex.IsMatch(args.Message.RawText)) - { - await args.Message.Delete().ConfigureAwait(false); - IncidentsHandler.Add(args.Server.Id, args.Channel.Id, $"User [{args.User.Name}/{args.User.Id}] posted " + - $"INVITE LINK in [{args.Channel.Name}/{args.Channel.Id}] channel.\n" + - $"`Full message:` {args.Message.Text}"); - if (serverPerms.Verbose) - await args.Channel.SendMessageAsync($"{args.User.Mention} Invite links are not " + - $"allowed on this channel.") - .ConfigureAwait(false); - } - } - catch { } - }; - } - - private static bool IsChannelOrServerFiltering(Channel channel, out Classes.ServerPermissions serverPerms) - { - if (!PermissionsHandler.PermissionsDict.TryGetValue(channel.Server.Id, out serverPerms)) return false; - - if (serverPerms.Permissions.FilterInvites) - return true; - - Classes.Permissions perms; - return serverPerms.ChannelPermissions.TryGetValue(channel.Id, out perms) && perms.FilterInvites; - } - - public override void Init(CommandGroupBuilder cgb) - { - cgb.CreateCommand(Module.Prefix + "chnlfilterinv") - .Alias(Module.Prefix + "cfi") - .Description("Enables or disables automatic deleting of invites on the channel." + - "If no channel supplied, it will default to current one. Use ALL to apply to all existing channels at once." + - $" | `{Prefix}cfi enable #general-chat`") - .Parameter("bool") - .Parameter("channel", ParameterType.Optional) - .Do(async e => - { - try - { - var state = PermissionHelper.ValidateBool(bool); - var chanStr = channel; - - if (chanStr?.ToLowerInvariant().Trim() != "all") - { - - var chan = string.IsNullOrWhiteSpace(chanStr) - ? e.Channel - : PermissionHelper.ValidateChannel(e.Server, chanStr); - await PermissionsHandler.SetChannelFilterInvitesPermission(chan, state).ConfigureAwait(false); - await channel.SendMessageAsync($"Invite Filter has been **{(state ? "enabled" : "disabled")}** for **{chan.Name}** channel.") - .ConfigureAwait(false); - return; - } - //all channels - - foreach (var curChannel in e.Server.TextChannels) - { - await PermissionsHandler.SetChannelFilterInvitesPermission(curChannel, state).ConfigureAwait(false); - } - await channel.SendMessageAsync($"Invite Filter has been **{(state ? "enabled" : "disabled")}** for **ALL** channels.") - .ConfigureAwait(false); - - } - catch (Exception ex) - { - await channel.SendMessageAsync($"💢 Error: {ex.Message}") - .ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Module.Prefix + "srvrfilterinv") - .Alias(Module.Prefix + "sfi") - .Description($"Enables or disables automatic deleting of invites on the server. | `{Prefix}sfi disable`") - .Parameter("bool") - .Do(async e => - { - try - { - var state = PermissionHelper.ValidateBool(bool); - await PermissionsHandler.SetServerFilterInvitesPermission(e.Server, state).ConfigureAwait(false); - await channel.SendMessageAsync($"Invite Filter has been **{(state ? "enabled" : "disabled")}** for this server.") - .ConfigureAwait(false); - - } - catch (Exception ex) - { - await channel.SendMessageAsync($"💢 Error: {ex.Message}").ConfigureAwait(false); - } - }); - } - } -} diff --git a/src/NadekoBot/_Modules/Permissions/Commands/FilterWordsCommand.cs b/src/NadekoBot/_Modules/Permissions/Commands/FilterWordsCommand.cs deleted file mode 100644 index 2c0c3cdf..00000000 --- a/src/NadekoBot/_Modules/Permissions/Commands/FilterWordsCommand.cs +++ /dev/null @@ -1,174 +0,0 @@ -using Discord; -using Discord.Commands; -using NadekoBot.Classes; -using NadekoBot.Modules.Permissions.Classes; -using System; -using System.Linq; - -namespace NadekoBot.Modules.Permissions -{ - public class FilterWords : DiscordCommand - { - public FilterWords(DiscordModule module) : base(module) - { - NadekoBot.Client.MessageReceived += async (sender, args) => - { - if (args.Channel.IsPrivate || args.User.Id == NadekoBot.Client.CurrentUser.Id) return; - try - { - Classes.ServerPermissions serverPerms; - if (!IsChannelOrServerFiltering(args.Channel, out serverPerms)) return; - - var wordsInMessage = args.Message.RawText.ToLowerInvariant().Split(' '); - if (serverPerms.Words.Any(w => wordsInMessage.Contains(w))) - { - await args.Message.Delete().ConfigureAwait(false); - IncidentsHandler.Add(args.Server.Id, args.Channel.Id, $"User [{args.User.Name}/{args.User.Id}] posted " + - $"BANNED WORD in [{args.Channel.Name}/{args.Channel.Id}] channel.\n" + - $"`Full message:` {args.Message.Text}"); - if (serverPerms.Verbose) - await args.Channel.SendMessageAsync($"{args.User.Mention} One or more of the words you used " + - $"in that sentence are not allowed here.") - .ConfigureAwait(false); - } - } - catch { } - }; - } - - private static bool IsChannelOrServerFiltering(Channel channel, out Classes.ServerPermissions serverPerms) - { - if (!PermissionsHandler.PermissionsDict.TryGetValue(channel.Server.Id, out serverPerms)) return false; - - if (serverPerms.Permissions.FilterWords) - return true; - - Classes.Permissions perms; - return serverPerms.ChannelPermissions.TryGetValue(channel.Id, out perms) && perms.FilterWords; - } - - public override void Init(CommandGroupBuilder cgb) - { - cgb.CreateCommand(Module.Prefix + "chnlfilterwords") - .Alias(Module.Prefix + "cfw") - .Description("Enables or disables automatic deleting of messages containing banned words on the channel." + - "If no channel supplied, it will default to current one. Use ALL to apply to all existing channels at once." + - $" | `{Prefix}cfw enable #general-chat`") - .Parameter("bool") - .Parameter("channel", ParameterType.Optional) - .Do(async e => - { - try - { - var state = PermissionHelper.ValidateBool(bool); - var chanStr = channel?.ToLowerInvariant().Trim(); - - if (chanStr != "all") - { - var chan = string.IsNullOrWhiteSpace(chanStr) - ? e.Channel - : PermissionHelper.ValidateChannel(e.Server, chanStr); - await PermissionsHandler.SetChannelWordPermission(chan, state).ConfigureAwait(false); - await channel.SendMessageAsync($"Word filtering has been **{(state ? "enabled" : "disabled")}** for **{chan.Name}** channel.").ConfigureAwait(false); - return; - } - //all channels - - foreach (var curChannel in e.Server.TextChannels) - { - await PermissionsHandler.SetChannelWordPermission(curChannel, state).ConfigureAwait(false); - } - await channel.SendMessageAsync($"Word filtering has been **{(state ? "enabled" : "disabled")}** for **ALL** channels.").ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync($"💢 Error: {ex.Message}").ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Module.Prefix + "addfilterword") - .Alias(Module.Prefix + "afw") - .Description("Adds a new word to the list of filtered words" + - $" | `{Prefix}afw poop`") - .Parameter("word", ParameterType.Unparsed) - .Do(async e => - { - try - { - var word = word; - if (string.IsNullOrWhiteSpace(word)) - return; - await PermissionsHandler.AddFilteredWord(e.Server, word.ToLowerInvariant().Trim()).ConfigureAwait(false); - await channel.SendMessageAsync($"Successfully added new filtered word.").ConfigureAwait(false); - - } - catch (Exception ex) - { - await channel.SendMessageAsync($"💢 Error: {ex.Message}").ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Module.Prefix + "rmvfilterword") - .Alias(Module.Prefix + "rfw") - .Description("Removes the word from the list of filtered words" + - $" | `{Prefix}rw poop`") - .Parameter("word", ParameterType.Unparsed) - .Do(async e => - { - try - { - var word = word; - if (string.IsNullOrWhiteSpace(word)) - return; - await PermissionsHandler.RemoveFilteredWord(e.Server, word.ToLowerInvariant().Trim()).ConfigureAwait(false); - await channel.SendMessageAsync($"Successfully removed filtered word.").ConfigureAwait(false); - - } - catch (Exception ex) - { - await channel.SendMessageAsync($"💢 Error: {ex.Message}").ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Module.Prefix + "lstfilterwords") - .Alias(Module.Prefix + "lfw") - .Description("Shows a list of filtered words" + - $" | `{Prefix}lfw`") - .Do(async e => - { - try - { - Classes.ServerPermissions serverPerms; - if (!PermissionsHandler.PermissionsDict.TryGetValue(e.Server.Id, out serverPerms)) - return; - await channel.SendMessageAsync($"There are `{serverPerms.Words.Count}` filtered words.\n" + - string.Join("\n", serverPerms.Words)).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync($"💢 Error: {ex.Message}").ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Module.Prefix + "srvrfilterwords") - .Alias(Module.Prefix + "sfw") - .Description($"Enables or disables automatic deleting of messages containing forbidden words on the server. | `{Prefix}sfw disable`") - .Parameter("bool") - .Do(async e => - { - try - { - var state = PermissionHelper.ValidateBool(bool); - await PermissionsHandler.SetServerWordPermission(e.Server, state).ConfigureAwait(false); - await channel.SendMessageAsync($"Word filtering has been **{(state ? "enabled" : "disabled")}** on this server.") - .ConfigureAwait(false); - - } - catch (Exception ex) - { - await channel.SendMessageAsync($"💢 Error: {ex.Message}").ConfigureAwait(false); - } - }); - } - } -} diff --git a/src/NadekoBot/_Modules/Permissions/PermissionsModule.cs b/src/NadekoBot/_Modules/Permissions/PermissionsModule.cs deleted file mode 100644 index b9d6dc38..00000000 --- a/src/NadekoBot/_Modules/Permissions/PermissionsModule.cs +++ /dev/null @@ -1,834 +0,0 @@ -using Discord.Commands; -using Discord.Modules; -using NadekoBot.Classes; -using NadekoBot.Classes.JSONModels; -using NadekoBot.Extensions; -using NadekoBot.Modules.Games.Commands; -using NadekoBot.Modules.Permissions.Classes; -using NadekoBot.Modules.Permissions.Commands; -using System; -using System.Linq; -using System.Threading.Tasks; - -namespace NadekoBot.Modules.Permissions -{ - public class PermissionModule : DiscordModule - { - public override string Prefix { get; } = NadekoBot.Config.CommandPrefixes.Permissions; - - public PermissionModule() - { - commands.Add(new FilterInvitesCommand(this)); - commands.Add(new FilterWords(this)); - } - - public override void Install(ModuleManager manager) - { - manager.CreateCommands("", cgb => - { - - cgb.AddCheck(PermissionChecker.Instance); - - commands.ForEach(cmd => cmd.Init(cgb)); - - cgb.CreateCommand(Prefix + "permrole") - .Alias(Prefix + "pr") - .Description($"Sets a role which can change permissions. Or supply no parameters to find out the current one. Default one is 'Nadeko'. | `{Prefix}pr role`") - .Parameter("role", ParameterType.Unparsed) - .Do(async e => - { - if (string.IsNullOrWhiteSpace(role)) - { - await channel.SendMessageAsync($"Current permissions role is `{PermissionsHandler.GetServerPermissionsRoleName(e.Server)}`").ConfigureAwait(false); - return; - } - - var arg = role; - Discord.Role role = null; - try - { - role = PermissionHelper.ValidateRole(e.Server, arg); - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - await channel.SendMessageAsync($"Role `{arg}` probably doesn't exist. Create the role with that name first.").ConfigureAwait(false); - return; - } - await PermissionsHandler.SetPermissionsRole(e.Server, role.Name).ConfigureAwait(false); - await channel.SendMessageAsync($"Role `{role.Name}` is now required in order to change permissions.").ConfigureAwait(false); - }); - - cgb.CreateCommand(Prefix + "rolepermscopy") - .Alias(Prefix + "rpc") - .Description($"Copies BOT PERMISSIONS (not discord permissions) from one role to another. |`{Prefix}rpc Some Role ~ Some other role`") - .Parameter("from_to", ParameterType.Unparsed) - .Do(async e => - { - var arg = from_to?.Trim(); - if (string.IsNullOrWhiteSpace(arg) || !arg.Contains('~')) - return; - var args = arg.Split('~').Select(a => a.Trim()).ToArray(); - if (args.Length > 2) - { - await channel.SendMessageAsync("💢Invalid number of '~'s in the argument.").ConfigureAwait(false); - return; - } - try - { - var fromRole = PermissionHelper.ValidateRole(e.Server, args[0]); - var toRole = PermissionHelper.ValidateRole(e.Server, args[1]); - - await PermissionsHandler.CopyRolePermissions(fromRole, toRole).ConfigureAwait(false); - await channel.SendMessageAsync($"Copied permission settings from **{fromRole.Name}** to **{toRole.Name}**.").ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync($"💢{ex.Message}").ConfigureAwait(false); - } - }); - cgb.CreateCommand(Prefix + "chnlpermscopy") - .Alias(Prefix + "cpc") - .Description($"Copies BOT PERMISSIONS (not discord permissions) from one channel to another. |`{Prefix}cpc Some Channel ~ Some other channel`") - .Parameter("from_to", ParameterType.Unparsed) - .Do(async e => - { - var arg = from_to?.Trim(); - if (string.IsNullOrWhiteSpace(arg) || !arg.Contains('~')) - return; - var args = arg.Split('~').Select(a => a.Trim()).ToArray(); - if (args.Length > 2) - { - await channel.SendMessageAsync("💢Invalid number of '~'s in the argument."); - return; - } - try - { - var fromChannel = PermissionHelper.ValidateChannel(e.Server, args[0]); - var toChannel = PermissionHelper.ValidateChannel(e.Server, args[1]); - - await PermissionsHandler.CopyChannelPermissions(fromChannel, toChannel).ConfigureAwait(false); - await channel.SendMessageAsync($"Copied permission settings from **{fromChannel.Name}** to **{toChannel.Name}**.").ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync($"💢{ex.Message}"); - } - }); - cgb.CreateCommand(Prefix + "usrpermscopy") - .Alias(Prefix + "upc") - .Description($"Copies BOT PERMISSIONS (not discord permissions) from one role to another. |`{Prefix}upc @SomeUser ~ @SomeOtherUser`") - .Parameter("from_to", ParameterType.Unparsed) - .Do(async e => - { - var arg = from_to?.Trim(); - if (string.IsNullOrWhiteSpace(arg) || !arg.Contains('~')) - return; - var args = arg.Split('~').Select(a => a.Trim()).ToArray(); - if (args.Length > 2) - { - await channel.SendMessageAsync("💢Invalid number of '~'s in the argument.").ConfigureAwait(false); - return; - } - try - { - var fromUser = PermissionHelper.ValidateUser(e.Server, args[0]); - var toUser = PermissionHelper.ValidateUser(e.Server, args[1]); - - await PermissionsHandler.CopyUserPermissions(fromUser, toUser).ConfigureAwait(false); - await channel.SendMessageAsync($"Copied permission settings from **{fromUser.ToString()}**to * *{toUser.ToString()}**.").ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync($"💢{ex.Message}"); - } - }); - - cgb.CreateCommand(Prefix + "verbose") - .Alias(Prefix + "v") - .Description($"Sets whether to show when a command/module is blocked. | `{Prefix}verbose true`") - .Parameter("arg", ParameterType.Required) - .Do(async e => - { - var arg = arg; - var val = PermissionHelper.ValidateBool(arg); - await PermissionsHandler.SetVerbosity(e.Server, val).ConfigureAwait(false); - await channel.SendMessageAsync($"Verbosity set to {val}.").ConfigureAwait(false); - }); - - cgb.CreateCommand(Prefix + "srvrperms") - .Alias(Prefix + "sp") - .Description($"Shows banned permissions for this server. | `{Prefix}sp`") - .Do(async e => - { - var perms = PermissionsHandler.GetServerPermissions(e.Server); - if (string.IsNullOrWhiteSpace(perms?.ToString())) - await channel.SendMessageAsync("No permissions set for this server.").ConfigureAwait(false); - await channel.SendMessageAsync(perms.ToString()).ConfigureAwait(false); - }); - - cgb.CreateCommand(Prefix + "roleperms") - .Alias(Prefix + "rp") - .Description($"Shows banned permissions for a certain role. No argument means for everyone. | `{Prefix}rp AwesomeRole`") - .Parameter("role", ParameterType.Unparsed) - .Do(async e => - { - var arg = role; - var role = e.Server.EveryoneRole; - if (!string.IsNullOrWhiteSpace(arg)) - try - { - role = PermissionHelper.ValidateRole(e.Server, arg); - } - catch (Exception ex) - { - await channel.SendMessageAsync("💢 Error: " + ex.Message).ConfigureAwait(false); - return; - } - - var perms = PermissionsHandler.GetRolePermissionsById(e.Server, role.Id); - - if (string.IsNullOrWhiteSpace(perms?.ToString())) - await channel.SendMessageAsync($"No permissions set for **{role.Name}** role.").ConfigureAwait(false); - await channel.SendMessageAsync(perms.ToString()).ConfigureAwait(false); - }); - - cgb.CreateCommand(Prefix + "chnlperms") - .Alias(Prefix + "cp") - .Description($"Shows banned permissions for a certain channel. No argument means for this channel. | `{Prefix}cp #dev`") - .Parameter("channel", ParameterType.Unparsed) - .Do(async e => - { - var arg = channel; - var channel = e.Channel; - if (!string.IsNullOrWhiteSpace(arg)) - try - { - channel = PermissionHelper.ValidateChannel(e.Server, arg); - } - catch (Exception ex) - { - await channel.SendMessageAsync("💢 Error: " + ex.Message).ConfigureAwait(false); - return; - } - - var perms = PermissionsHandler.GetChannelPermissionsById(e.Server, channel.Id); - if (string.IsNullOrWhiteSpace(perms?.ToString())) - await channel.SendMessageAsync($"No permissions set for **{channel.Name}** channel.").ConfigureAwait(false); - await channel.SendMessageAsync(perms.ToString()).ConfigureAwait(false); - }); - - cgb.CreateCommand(Prefix + "userperms") - .Alias(Prefix + "up") - .Description($"Shows banned permissions for a certain user. No argument means for yourself. | `{Prefix}up Kwoth`") - .Parameter("user", ParameterType.Unparsed) - .Do(async e => - { - var user = umsg.Author; - if (!string.IsNullOrWhiteSpace(user)) - try - { - user = PermissionHelper.ValidateUser(e.Server, user); - } - catch (Exception ex) - { - await channel.SendMessageAsync("💢 Error: " + ex.Message).ConfigureAwait(false); - return; - } - - var perms = PermissionsHandler.GetUserPermissionsById(e.Server, user.Id); - if (string.IsNullOrWhiteSpace(perms?.ToString())) - await channel.SendMessageAsync($"No permissions set for user **{user.Name}**.").ConfigureAwait(false); - await channel.SendMessageAsync(perms.ToString()).ConfigureAwait(false); - }); - - cgb.CreateCommand(Prefix + "srvrmdl") - .Alias(Prefix + "sm") - .Parameter("module", ParameterType.Required) - .Parameter("bool", ParameterType.Required) - .Description($"Sets a module's permission at the server level. | `{Prefix}sm \"module name\" enable`") - .Do(async e => - { - try - { - var module = PermissionHelper.ValidateModule(module); - var state = PermissionHelper.ValidateBool(bool); - - await PermissionsHandler.SetServerModulePermission(e.Server, module, state).ConfigureAwait(false); - await channel.SendMessageAsync($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false); - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "srvrcmd").Alias(Prefix + "sc") - .Parameter("command", ParameterType.Required) - .Parameter("bool", ParameterType.Required) - .Description($"Sets a command's permission at the server level. | `{Prefix}sc \"command name\" disable`") - .Do(async e => - { - try - { - var command = PermissionHelper.ValidateCommand(command); - var state = PermissionHelper.ValidateBool(bool); - - await PermissionsHandler.SetServerCommandPermission(e.Server, command, state).ConfigureAwait(false); - await channel.SendMessageAsync($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false); - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "rolemdl").Alias(Prefix + "rm") - .Parameter("module", ParameterType.Required) - .Parameter("bool", ParameterType.Required) - .Parameter("role", ParameterType.Unparsed) - .Description($"Sets a module's permission at the role level. | `{Prefix}rm \"module name\" enable MyRole`") - .Do(async e => - { - try - { - var module = PermissionHelper.ValidateModule(module); - var state = PermissionHelper.ValidateBool(bool); - - if (role?.ToLower() == "all") - { - foreach (var role in e.Server.Roles) - { - await PermissionsHandler.SetRoleModulePermission(role, module, state).ConfigureAwait(false); - } - await channel.SendMessageAsync($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **ALL** roles.").ConfigureAwait(false); - } - else - { - var role = PermissionHelper.ValidateRole(e.Server, role); - - await PermissionsHandler.SetRoleModulePermission(role, module, state).ConfigureAwait(false); - await channel.SendMessageAsync($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false); - } - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "rolecmd").Alias(Prefix + "rc") - .Parameter("command", ParameterType.Required) - .Parameter("bool", ParameterType.Required) - .Parameter("role", ParameterType.Unparsed) - .Description($"Sets a command's permission at the role level. | `{Prefix}rc \"command name\" disable MyRole`") - .Do(async e => - { - try - { - var command = PermissionHelper.ValidateCommand(command); - var state = PermissionHelper.ValidateBool(bool); - - if (role?.ToLower() == "all") - { - foreach (var role in e.Server.Roles) - { - await PermissionsHandler.SetRoleCommandPermission(role, command, state).ConfigureAwait(false); - } - await channel.SendMessageAsync($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **ALL** roles.").ConfigureAwait(false); - } - else - { - var role = PermissionHelper.ValidateRole(e.Server, role); - - await PermissionsHandler.SetRoleCommandPermission(role, command, state).ConfigureAwait(false); - await channel.SendMessageAsync($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false); - } - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "chnlmdl").Alias(Prefix + "cm") - .Parameter("module", ParameterType.Required) - .Parameter("bool", ParameterType.Required) - .Parameter("channel", ParameterType.Unparsed) - .Description($"Sets a module's permission at the channel level. | `{Prefix}cm \"module name\" enable SomeChannel`") - .Do(async e => - { - try - { - var module = PermissionHelper.ValidateModule(module); - var state = PermissionHelper.ValidateBool(bool); - var channelArg = channel; - if (channelArg?.ToLower() == "all") - { - foreach (var channel in e.Server.TextChannels) - { - await PermissionsHandler.SetChannelModulePermission(channel, module, state).ConfigureAwait(false); - } - await channel.SendMessageAsync($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** on **ALL** channels.").ConfigureAwait(false); - } - else if (string.IsNullOrWhiteSpace(channelArg)) - { - await PermissionsHandler.SetChannelModulePermission(e.Channel, module, state).ConfigureAwait(false); - await channel.SendMessageAsync($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{e.Channel.Name}** channel.").ConfigureAwait(false); - } - else - { - var channel = PermissionHelper.ValidateChannel(e.Server, channelArg); - - await PermissionsHandler.SetChannelModulePermission(channel, module, state).ConfigureAwait(false); - await channel.SendMessageAsync($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false); - } - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "chnlcmd").Alias(Prefix + "cc") - .Parameter("command", ParameterType.Required) - .Parameter("bool", ParameterType.Required) - .Parameter("channel", ParameterType.Unparsed) - .Description($"Sets a command's permission at the channel level. | `{Prefix}cc \"command name\" enable SomeChannel`") - .Do(async e => - { - try - { - var command = PermissionHelper.ValidateCommand(command); - var state = PermissionHelper.ValidateBool(bool); - - if (channel?.ToLower() == "all") - { - foreach (var channel in e.Server.TextChannels) - { - await PermissionsHandler.SetChannelCommandPermission(channel, command, state).ConfigureAwait(false); - } - await channel.SendMessageAsync($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** on **ALL** channels.").ConfigureAwait(false); - } - else - { - var channel = PermissionHelper.ValidateChannel(e.Server, channel); - - await PermissionsHandler.SetChannelCommandPermission(channel, command, state).ConfigureAwait(false); - await channel.SendMessageAsync($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false); - } - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "usrmdl").Alias(Prefix + "um") - .Parameter("module", ParameterType.Required) - .Parameter("bool", ParameterType.Required) - .Parameter("user", ParameterType.Unparsed) - .Description($"Sets a module's permission at the user level. | `{Prefix}um \"module name\" enable SomeUsername`") - .Do(async e => - { - try - { - var module = PermissionHelper.ValidateModule(module); - var state = PermissionHelper.ValidateBool(bool); - var user = PermissionHelper.ValidateUser(e.Server, user); - - await PermissionsHandler.SetUserModulePermission(user, module, state).ConfigureAwait(false); - await channel.SendMessageAsync($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for user **{user.Name}**.").ConfigureAwait(false); - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "usrcmd").Alias(Prefix + "uc") - .Parameter("command", ParameterType.Required) - .Parameter("bool", ParameterType.Required) - .Parameter("user", ParameterType.Unparsed) - .Description($"Sets a command's permission at the user level. | `{Prefix}uc \"command name\" enable SomeUsername`") - .Do(async e => - { - try - { - var command = PermissionHelper.ValidateCommand(command); - var state = PermissionHelper.ValidateBool(bool); - var user = PermissionHelper.ValidateUser(e.Server, user); - - await PermissionsHandler.SetUserCommandPermission(user, command, state).ConfigureAwait(false); - await channel.SendMessageAsync($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for user **{user.Name}**.").ConfigureAwait(false); - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "allsrvrmdls").Alias(Prefix + "asm") - .Parameter("bool", ParameterType.Required) - .Description($"Sets permissions for all modules at the server level. | `{Prefix}asm [enable/disable]`") - .Do(async e => - { - try - { - var state = PermissionHelper.ValidateBool(bool); - - foreach (var module in NadekoBot.Client.GetService().Modules) - { - await PermissionsHandler.SetServerModulePermission(e.Server, module.Name, state).ConfigureAwait(false); - } - await channel.SendMessageAsync($"All modules have been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false); - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "allsrvrcmds").Alias(Prefix + "asc") - .Parameter("module", ParameterType.Required) - .Parameter("bool", ParameterType.Required) - .Description($"Sets permissions for all commands from a certain module at the server level. | `{Prefix}asc \"module name\" [enable/disable]`") - .Do(async e => - { - try - { - var state = PermissionHelper.ValidateBool(bool); - var module = PermissionHelper.ValidateModule(module); - - foreach (var command in NadekoBot.Client.GetService().AllCommands.Where(c => c.Category == module)) - { - await PermissionsHandler.SetServerCommandPermission(e.Server, command.Text, state).ConfigureAwait(false); - } - await channel.SendMessageAsync($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** on this server.").ConfigureAwait(false); - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "allchnlmdls").Alias(Prefix + "acm") - .Parameter("bool", ParameterType.Required) - .Parameter("channel", ParameterType.Unparsed) - .Description($"Sets permissions for all modules at the channel level. | `{Prefix}acm [enable/disable] SomeChannel`") - .Do(async e => - { - try - { - var state = PermissionHelper.ValidateBool(bool); - var chArg = channel; - var channel = string.IsNullOrWhiteSpace(chArg) ? e.Channel : PermissionHelper.ValidateChannel(e.Server, chArg); - foreach (var module in NadekoBot.Client.GetService().Modules) - { - await PermissionsHandler.SetChannelModulePermission(channel, module.Name, state).ConfigureAwait(false); - } - - await channel.SendMessageAsync($"All modules have been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false); - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "allchnlcmds").Alias(Prefix + "acc") - .Parameter("module", ParameterType.Required) - .Parameter("bool", ParameterType.Required) - .Parameter("channel", ParameterType.Unparsed) - .Description($"Sets permissions for all commands from a certain module at the channel level. | `{Prefix}acc \"module name\" [enable/disable] SomeChannel`") - .Do(async e => - { - try - { - var state = PermissionHelper.ValidateBool(bool); - var module = PermissionHelper.ValidateModule(module); - var channel = PermissionHelper.ValidateChannel(e.Server, channel); - foreach (var command in NadekoBot.Client.GetService().AllCommands.Where(c => c.Category == module)) - { - await PermissionsHandler.SetChannelCommandPermission(channel, command.Text, state).ConfigureAwait(false); - } - await channel.SendMessageAsync($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.").ConfigureAwait(false); - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "allrolemdls").Alias(Prefix + "arm") - .Parameter("bool", ParameterType.Required) - .Parameter("role", ParameterType.Unparsed) - .Description($"Sets permissions for all modules at the role level. | `{Prefix}arm [enable/disable] MyRole`") - .Do(async e => - { - try - { - var state = PermissionHelper.ValidateBool(bool); - var role = PermissionHelper.ValidateRole(e.Server, role); - foreach (var module in NadekoBot.Client.GetService().Modules) - { - await PermissionsHandler.SetRoleModulePermission(role, module.Name, state).ConfigureAwait(false); - } - - await channel.SendMessageAsync($"All modules have been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false); - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "allrolecmds").Alias(Prefix + "arc") - .Parameter("module", ParameterType.Required) - .Parameter("bool", ParameterType.Required) - .Parameter("role", ParameterType.Unparsed) - .Description($"Sets permissions for all commands from a certain module at the role level. | `{Prefix}arc \"module name\" [enable/disable] MyRole`") - .Do(async e => - { - try - { - var state = PermissionHelper.ValidateBool(bool); - var module = PermissionHelper.ValidateModule(module); - if (role?.ToLower() == "all") - { - foreach (var role in e.Server.Roles) - { - foreach (var command in NadekoBot.Client.GetService().AllCommands.Where(c => c.Category == module)) - { - await PermissionsHandler.SetRoleCommandPermission(role, command.Text, state).ConfigureAwait(false); - } - } - await channel.SendMessageAsync($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** for **all roles** role.").ConfigureAwait(false); - } - else - { - var role = PermissionHelper.ValidateRole(e.Server, role); - - foreach (var command in NadekoBot.Client.GetService().AllCommands.Where(c => c.Category == module)) - { - await PermissionsHandler.SetRoleCommandPermission(role, command.Text, state).ConfigureAwait(false); - } - await channel.SendMessageAsync($"All commands from the **{module}** module have been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.").ConfigureAwait(false); - } - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "ubl") - .Description($"Blacklists a mentioned user. | `{Prefix}ubl [user_mention]`") - .Parameter("user", ParameterType.Unparsed) - .AddCheck(SimpleCheckers.OwnerOnly()) - .Do(async e => - { - await Task.Run(async () => - { - if (!e.Message.MentionedUsers.Any()) return; - var usr = e.Message.MentionedUsers.First(); - NadekoBot.Config.UserBlacklist.Add(usr.Id); - await ConfigHandler.SaveConfig().ConfigureAwait(false); - await channel.SendMessageAsync($"`Sucessfully blacklisted user {usr.Name}`").ConfigureAwait(false); - }).ConfigureAwait(false); - }); - - cgb.CreateCommand(Prefix + "uubl") - .Description($"Unblacklists a mentioned user. | `{Prefix}uubl [user_mention]`") - .Parameter("user", ParameterType.Unparsed) - .AddCheck(SimpleCheckers.OwnerOnly()) - .Do(async e => - { - await Task.Run(async () => - { - if (!e.Message.MentionedUsers.Any()) return; - var usr = e.Message.MentionedUsers.First(); - if (NadekoBot.Config.UserBlacklist.Contains(usr.Id)) - { - NadekoBot.Config.UserBlacklist.Remove(usr.Id); - await ConfigHandler.SaveConfig().ConfigureAwait(false); - await channel.SendMessageAsync($"`Sucessfully unblacklisted user {usr.Name}`").ConfigureAwait(false); - } - else - { - await channel.SendMessageAsync($"`{usr.Name} was not in blacklist`").ConfigureAwait(false); - } - }).ConfigureAwait(false); - }); - - cgb.CreateCommand(Prefix + "cbl") - .Description($"Blacklists a mentioned channel (#general for example). | `{Prefix}cbl #some_channel`") - .Parameter("channel", ParameterType.Unparsed) - .Do(async e => - { - await Task.Run(async () => - { - if (!e.Message.MentionedChannels.Any()) return; - var ch = e.Message.MentionedChannels.First(); - NadekoBot.Config.UserBlacklist.Add(ch.Id); - await ConfigHandler.SaveConfig().ConfigureAwait(false); - await channel.SendMessageAsync($"`Sucessfully blacklisted channel {ch.Name}`").ConfigureAwait(false); - }).ConfigureAwait(false); - }); - - cgb.CreateCommand(Prefix + "cubl") - .Description($"Unblacklists a mentioned channel (#general for example). | `{Prefix}cubl #some_channel`") - .Parameter("channel", ParameterType.Unparsed) - .Do(async e => - { - await Task.Run(async () => - { - if (!e.Message.MentionedChannels.Any()) return; - var ch = e.Message.MentionedChannels.First(); - NadekoBot.Config.UserBlacklist.Remove(ch.Id); - await ConfigHandler.SaveConfig().ConfigureAwait(false); - await channel.SendMessageAsync($"`Sucessfully blacklisted channel {ch.Name}`").ConfigureAwait(false); - }).ConfigureAwait(false); - }); - - cgb.CreateCommand(Prefix + "sbl") - .Description($"Blacklists a server by a name or id (#general for example). **BOT OWNER ONLY** | `{Prefix}sbl [servername/serverid]`") - .Parameter("server", ParameterType.Unparsed) - .AddCheck(SimpleCheckers.OwnerOnly()) - .Do(async e => - { - await Task.Run(async () => - { - var arg = server?.Trim(); - if (string.IsNullOrWhiteSpace(arg)) - return; - var server = NadekoBot.Client.Servers.FirstOrDefault(s => s.Id.ToString() == arg) ?? - NadekoBot.Client.FindServers(arg.Trim()).FirstOrDefault(); - if (server == null) - { - await channel.SendMessageAsync("Cannot find that server").ConfigureAwait(false); - return; - } - var serverId = server.Id; - NadekoBot.Config.ServerBlacklist.Add(serverId); - await ConfigHandler.SaveConfig().ConfigureAwait(false); - //cleanup trivias and typeracing - Modules.Games.Commands.Trivia.TriviaGame trivia; - TriviaCommands.RunningTrivias.TryRemove(serverId, out trivia); - TypingGame typeracer; - SpeedTyping.RunningContests.TryRemove(serverId, out typeracer); - - await channel.SendMessageAsync($"`Sucessfully blacklisted server {server.Name}`").ConfigureAwait(false); - }).ConfigureAwait(false); - }); - - cgb.CreateCommand(Prefix + "cmdcooldown") - .Alias(Prefix+ "cmdcd") - .Description($"Sets a cooldown per user for a command. Set 0 to clear. | `{Prefix}cmdcd \"some cmd\" 5`") - .Parameter("command", ParameterType.Required) - .Parameter("secs",ParameterType.Required) - .AddCheck(SimpleCheckers.ManageMessages()) - .Do(async e => - { - try - { - var command = PermissionHelper.ValidateCommand(command); - var secsStr = secs.Trim(); - int secs; - if (!int.TryParse(secsStr, out secs) || secs < 0 || secs > 3600) - throw new ArgumentOutOfRangeException("secs", "Invalid second parameter. (Must be a number between 0 and 3600)"); - - - await PermissionsHandler.SetCommandCooldown(e.Server, command, secs).ConfigureAwait(false); - if(secs == 0) - await channel.SendMessageAsync($"Command **{command}** has no coooldown now.").ConfigureAwait(false); - else - await channel.SendMessageAsync($"Command **{command}** now has a **{secs} {(secs==1 ? "second" : "seconds")}** cooldown.").ConfigureAwait(false); - } - catch (ArgumentException exArg) - { - await channel.SendMessageAsync(exArg.Message).ConfigureAwait(false); - } - catch (Exception ex) - { - await channel.SendMessageAsync("Something went terribly wrong - " + ex.Message).ConfigureAwait(false); - } - }); - - cgb.CreateCommand(Prefix + "allcmdcooldowns") - .Alias(Prefix + "acmdcds") - .Description("Shows a list of all commands and their respective cooldowns. | `{Prefix}acmdcds`") - .Do(async e => - { - ServerPermissions perms; - PermissionsHandler.PermissionsDict.TryGetValue(e.Server.Id, out perms); - if (perms == null) - return; - - if (!perms.CommandCooldowns.Any()) - { - await channel.SendMessageAsync("`No command cooldowns set.`").ConfigureAwait(false); - return; - } - await channel.SendMessageAsync(SearchHelper.ShowInPrettyCode(perms.CommandCooldowns.Select(c=>c.Key+ ": "+c.Value+" secs"),s=>$"{s,-30}",2)).ConfigureAwait(false); - }); - }); - } - } -}