From 630c71de6303230d75ad53ac8c6b93760b285696 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Wed, 1 Feb 2017 17:50:14 +0100 Subject: [PATCH 01/19] Download users back? --- Discord.Net | 2 +- src/NadekoBot/NadekoBot.cs | 3 +- src/NadekoBot/ShardedDiscordClient.cs | 199 -------------------------- 3 files changed, 3 insertions(+), 201 deletions(-) delete mode 100644 src/NadekoBot/ShardedDiscordClient.cs diff --git a/Discord.Net b/Discord.Net index 80384323..b57d5d73 160000 --- a/Discord.Net +++ b/Discord.Net @@ -1 +1 @@ -Subproject commit 80384323790471d254c7db5c237a49dc62624378 +Subproject commit b57d5d738921021f6e366ab6b4eb13cd0501959d diff --git a/src/NadekoBot/NadekoBot.cs b/src/NadekoBot/NadekoBot.cs index 02c60720..a6842797 100644 --- a/src/NadekoBot/NadekoBot.cs +++ b/src/NadekoBot/NadekoBot.cs @@ -67,7 +67,8 @@ namespace NadekoBot MessageCacheSize = 10, LogLevel = LogSeverity.Warning, TotalShards = Credentials.TotalShards, - ConnectionTimeout = int.MaxValue + ConnectionTimeout = int.MaxValue, + AlwaysDownloadUsers = true, }); #if GLOBAL_NADEKO Client.Log += Client_Log; diff --git a/src/NadekoBot/ShardedDiscordClient.cs b/src/NadekoBot/ShardedDiscordClient.cs deleted file mode 100644 index daa5276e..00000000 --- a/src/NadekoBot/ShardedDiscordClient.cs +++ /dev/null @@ -1,199 +0,0 @@ -using Discord; -using Discord.WebSocket; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using NLog; -using System.Diagnostics; - -namespace NadekoBot -{ - public class ShardedDiscordClient - { - private DiscordSocketConfig discordSocketConfig; - private Logger _log { get; } - - public event Action UserJoined = delegate { }; - public event Action MessageReceived = delegate { }; - public event Action UserLeft = delegate { }; - public event Action UserUpdated = delegate { }; - public event Action GuildUserUpdated = delegate { }; - public event Action, SocketMessage> MessageUpdated = delegate { }; - public event Action> MessageDeleted = delegate { }; - public event Action UserBanned = delegate { }; - public event Action UserUnbanned = delegate { }; - public event Action, SocketUser, SocketPresence, SocketPresence> UserPresenceUpdated = delegate { }; - public event Action UserVoiceStateUpdated = delegate { }; - public event Action ChannelCreated = delegate { }; - public event Action ChannelDestroyed = delegate { }; - public event Action ChannelUpdated = delegate { }; - public event Action, SocketReaction> ReactionAdded = delegate { }; - public event Action, SocketReaction> ReactionRemoved = delegate { }; - public event Action> ReactionsCleared = delegate { }; - - public event Action JoinedGuild = delegate { }; - public event Action LeftGuild = delegate { }; - - public event Action Disconnected = delegate { }; - public event Action Connected = delegate { }; - - private uint _connectedCount = 0; - private uint _downloadedCount = 0; - - private int _guildCount = 0; - - private IReadOnlyList Clients { get; } - - public ShardedDiscordClient(DiscordSocketConfig discordSocketConfig) - { - _log = LogManager.GetCurrentClassLogger(); - this.discordSocketConfig = discordSocketConfig; - - var clientList = new List(); - for (int i = 0; i < discordSocketConfig.TotalShards; i++) - { - discordSocketConfig.ShardId = i; - var client = new DiscordSocketClient(discordSocketConfig); - clientList.Add(client); - client.UserJoined += arg1 => { UserJoined(arg1); return Task.CompletedTask; }; - client.MessageReceived += arg1 => - { - if (arg1.Author == null || arg1.Author.IsBot) - return Task.CompletedTask; - MessageReceived(arg1); - return Task.CompletedTask; - }; - client.UserLeft += arg1 => { UserLeft(arg1); return Task.CompletedTask; }; - client.UserUpdated += (arg1, gu2) => { UserUpdated(arg1, gu2); return Task.CompletedTask; }; - client.GuildMemberUpdated += (arg1, arg2) => { GuildUserUpdated(arg1, arg2); return Task.CompletedTask; }; - client.MessageUpdated += (arg1, m2) => { MessageUpdated(arg1, m2); return Task.CompletedTask; }; - client.MessageDeleted += (arg1, arg2) => { MessageDeleted(arg1, arg2); return Task.CompletedTask; }; - client.UserBanned += (arg1, arg2) => { UserBanned(arg1, arg2); return Task.CompletedTask; }; - client.UserUnbanned += (arg1, arg2) => { UserUnbanned(arg1, arg2); return Task.CompletedTask; }; - client.UserPresenceUpdated += (arg1, arg2, arg3, arg4) => { UserPresenceUpdated(arg1, arg2, arg3, arg4); return Task.CompletedTask; }; - client.UserVoiceStateUpdated += (arg1, arg2, arg3) => { UserVoiceStateUpdated(arg1, arg2, arg3); return Task.CompletedTask; }; - client.ChannelCreated += arg => { ChannelCreated(arg); return Task.CompletedTask; }; - client.ChannelDestroyed += arg => { ChannelDestroyed(arg); return Task.CompletedTask; }; - client.ChannelUpdated += (arg1, arg2) => { ChannelUpdated(arg1, arg2); return Task.CompletedTask; }; - client.JoinedGuild += (arg1) => { JoinedGuild(arg1); ++_guildCount; return Task.CompletedTask; }; - client.LeftGuild += (arg1) => { LeftGuild(arg1); --_guildCount; return Task.CompletedTask; }; - client.ReactionAdded += (arg1, arg2, arg3) => { ReactionAdded(arg1, arg2, arg3); return Task.CompletedTask; }; - client.ReactionRemoved += (arg1, arg2, arg3) => { ReactionRemoved(arg1, arg2, arg3); return Task.CompletedTask; }; - client.ReactionsCleared += (arg1, arg2) => { ReactionsCleared(arg1, arg2); return Task.CompletedTask; }; - - _log.Info($"Shard #{i} initialized."); -#if GLOBAL_NADEKO - client.Log += Client_Log; -#endif - var j = i; - client.Disconnected += (ex) => - { - _log.Error("Shard #{0} disconnected", j); - _log.Error(ex, ex?.Message ?? "No error"); - return Task.CompletedTask; - }; - } - - Clients = clientList.AsReadOnly(); - } - - private Task Client_Log(LogMessage arg) - { - _log.Warn(arg.Message); - _log.Error(arg.Exception); - return Task.CompletedTask; - } - - public DiscordSocketClient MainClient => - Clients[0]; - - public SocketSelfUser CurrentUser => - Clients[0].CurrentUser; - - public IEnumerable GetGuilds() => - Clients.SelectMany(c => c.Guilds); - - public int GetGuildsCount() => - _guildCount; - - public SocketGuild GetGuild(ulong id) - { - foreach (var c in Clients) - { - var g = c.GetGuild(id); - if (g != null) - return g; - } - return null; - } - - public Task GetDMChannelAsync(ulong channelId) => - Clients[0].GetDMChannelAsync(channelId); - - internal async Task LoginAsync(TokenType tokenType, string token) - { - foreach (var c in Clients) - { - await c.LoginAsync(tokenType, token).ConfigureAwait(false); - _log.Info($"Shard #{c.ShardId} logged in."); - } - } - - internal async Task ConnectAsync() - { - - foreach (var c in Clients) - { - try - { - var sw = Stopwatch.StartNew(); - await c.ConnectAsync().ConfigureAwait(false); - sw.Stop(); - _log.Info($"Shard #{c.ShardId} connected after {sw.Elapsed.TotalSeconds:F2}s ({++_connectedCount}/{Clients.Count})"); - _guildCount += c.Guilds.Count; - } - catch - { - _log.Error($"Shard #{c.ShardId} FAILED CONNECTING."); - try { await c.ConnectAsync().ConfigureAwait(false); } - catch (Exception ex2) - { - _log.Error($"Shard #{c.ShardId} FAILED CONNECTING TWICE."); - _log.Error(ex2); - } - } - } - Connected(); - } - - internal Task DownloadAllUsersAsync() => - Task.WhenAll(Clients.Select(async c => - { - var sw = Stopwatch.StartNew(); - await c.DownloadAllUsersAsync().ConfigureAwait(false); - sw.Stop(); - _log.Info($"Shard #{c.ShardId} downloaded {c.Guilds.Sum(g => g.Users.Count)} users after {sw.Elapsed.TotalSeconds:F2}s ({++_downloadedCount}/{Clients.Count})."); - })); - - public Task SetGame(string game) => Task.WhenAll(Clients.Select(ms => ms.SetGameAsync(game))); - - - public Task SetStream(string name, string url) => Task.WhenAll(Clients.Select(ms => ms.SetGameAsync(name, url, StreamType.Twitch))); - - //public Task SetStatus(SettableUserStatus status) => Task.WhenAll(Clients.Select(ms => ms.SetStatusAsync(SettableUserStatusToUserStatus(status)))); - } - - public enum SettableUserStatus - { - Online = 1, - On = 1, - Invisible = 2, - Invis = 2, - Idle = 3, - Afk = 3, - Dnd = 4, - DoNotDisturb = 4, - Busy = 4, - } -} \ No newline at end of file From a9ab99a29bd38105362df914ad3861f72c83ae54 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Thu, 2 Feb 2017 03:21:02 +0100 Subject: [PATCH 02/19] Compile error --- .../Modules/Administration/Commands/SelfCommands.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs b/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs index 13817a65..a56ee402 100644 --- a/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs @@ -184,6 +184,14 @@ namespace NadekoBot.Modules.Administration return UserStatus.Online; } + + public enum SettableUserStatus + { + Online, + Invisible, + Idle, + Dnd + } } } } From 258b90e48278ac68de8e51dd54644f4027292b4d Mon Sep 17 00:00:00 2001 From: Kwoth Date: Thu, 2 Feb 2017 03:21:32 +0100 Subject: [PATCH 03/19] upped version --- src/NadekoBot/Services/Impl/StatsService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NadekoBot/Services/Impl/StatsService.cs b/src/NadekoBot/Services/Impl/StatsService.cs index ab72769d..d8995c59 100644 --- a/src/NadekoBot/Services/Impl/StatsService.cs +++ b/src/NadekoBot/Services/Impl/StatsService.cs @@ -15,7 +15,7 @@ namespace NadekoBot.Services.Impl private DiscordShardedClient client; private DateTime started; - public const string BotVersion = "1.1.5a"; + public const string BotVersion = "1.1.6"; public string Author => "Kwoth#2560"; public string Library => "Discord.Net"; From aef7302513030c6e09eee663d9029597284294d8 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Thu, 2 Feb 2017 04:55:51 +0100 Subject: [PATCH 04/19] log for public bot --- Discord.Net | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Discord.Net b/Discord.Net index b57d5d73..979eecab 160000 --- a/Discord.Net +++ b/Discord.Net @@ -1 +1 @@ -Subproject commit b57d5d738921021f6e366ab6b4eb13cd0501959d +Subproject commit 979eecabfe0654db0be27cba71ecb398848f2c0c From e7fcac3c8fd9374c13644387f365e54a3d0b92de Mon Sep 17 00:00:00 2001 From: Kwoth Date: Thu, 2 Feb 2017 04:58:39 +0100 Subject: [PATCH 05/19] gelbooru and danbooru back on public bot --- src/NadekoBot/Modules/NSFW/NSFW.cs | 43 +++++++++++++++--------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/src/NadekoBot/Modules/NSFW/NSFW.cs b/src/NadekoBot/Modules/NSFW/NSFW.cs index 266ffa68..cd87454a 100644 --- a/src/NadekoBot/Modules/NSFW/NSFW.cs +++ b/src/NadekoBot/Modules/NSFW/NSFW.cs @@ -140,24 +140,6 @@ namespace NadekoBot.Modules.NSFW } } - - [NadekoCommand, Usage, Description, Aliases] - public async Task Danbooru([Remainder] string tag = null) - { - tag = tag?.Trim() ?? ""; - - var url = await GetDanbooruImageLink(tag).ConfigureAwait(false); - - if (url == null) - await Context.Channel.SendErrorAsync(Context.User.Mention + " No results.").ConfigureAwait(false); - else - await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor() - .WithDescription(Context.User.Mention + " " + tag) - .WithImageUrl(url) - .WithFooter(efb => efb.WithText("Danbooru"))) - .ConfigureAwait(false); - } - [NadekoCommand, Usage, Description, Aliases] public Task Yandere([Remainder] string tag = null) => Searches.Searches.InternalDapiCommand(Context.Message, tag, Searches.Searches.DapiSearchType.Yandere); @@ -166,10 +148,6 @@ namespace NadekoBot.Modules.NSFW public Task Konachan([Remainder] string tag = null) => Searches.Searches.InternalDapiCommand(Context.Message, tag, Searches.Searches.DapiSearchType.Konachan); - [NadekoCommand, Usage, Description, Aliases] - public Task Gelbooru([Remainder] string tag = null) - => Searches.Searches.InternalDapiCommand(Context.Message, tag, Searches.Searches.DapiSearchType.Gelbooru); - [NadekoCommand, Usage, Description, Aliases] public Task Rule34([Remainder] string tag = null) => Searches.Searches.InternalDapiCommand(Context.Message, tag, Searches.Searches.DapiSearchType.Rule34); @@ -191,6 +169,27 @@ namespace NadekoBot.Modules.NSFW .ConfigureAwait(false); } #endif + [NadekoCommand, Usage, Description, Aliases] + public async Task Danbooru([Remainder] string tag = null) + { + tag = tag?.Trim() ?? ""; + + var url = await GetDanbooruImageLink(tag).ConfigureAwait(false); + + if (url == null) + await Context.Channel.SendErrorAsync(Context.User.Mention + " No results.").ConfigureAwait(false); + else + await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor() + .WithDescription(Context.User.Mention + " " + tag) + .WithImageUrl(url) + .WithFooter(efb => efb.WithText("Danbooru"))) + .ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + public Task Gelbooru([Remainder] string tag = null) + => Searches.Searches.InternalDapiCommand(Context.Message, tag, Searches.Searches.DapiSearchType.Gelbooru); + [NadekoCommand, Usage, Description, Aliases] public async Task Cp() { From 3488eb8152ea136f7d9bc5141f98b8e21f6f7517 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Thu, 2 Feb 2017 05:02:37 +0100 Subject: [PATCH 06/19] compile error --- src/NadekoBot/Modules/NSFW/NSFW.cs | 43 +++++++++++++++--------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/NadekoBot/Modules/NSFW/NSFW.cs b/src/NadekoBot/Modules/NSFW/NSFW.cs index cd87454a..9698379a 100644 --- a/src/NadekoBot/Modules/NSFW/NSFW.cs +++ b/src/NadekoBot/Modules/NSFW/NSFW.cs @@ -186,6 +186,28 @@ namespace NadekoBot.Modules.NSFW .ConfigureAwait(false); } + public static Task GetDanbooruImageLink(string tag) => Task.Run(async () => + { + try + { + using (var http = new HttpClient()) + { + http.AddFakeHeaders(); + var data = await http.GetStreamAsync("https://danbooru.donmai.us/posts.xml?limit=100&tags=" + tag).ConfigureAwait(false); + var doc = new XmlDocument(); + doc.Load(data); + var nodes = doc.GetElementsByTagName("file-url"); + + var node = nodes[new NadekoRandom().Next(0, nodes.Count)]; + return "https://danbooru.donmai.us" + node.InnerText; + } + } + catch + { + return null; + } + }); + [NadekoCommand, Usage, Description, Aliases] public Task Gelbooru([Remainder] string tag = null) => Searches.Searches.InternalDapiCommand(Context.Message, tag, Searches.Searches.DapiSearchType.Gelbooru); @@ -232,27 +254,6 @@ namespace NadekoBot.Modules.NSFW } } #if !GLOBAL_NADEKO - public static Task GetDanbooruImageLink(string tag) => Task.Run(async () => - { - try - { - using (var http = new HttpClient()) - { - http.AddFakeHeaders(); - var data = await http.GetStreamAsync("https://danbooru.donmai.us/posts.xml?limit=100&tags=" + tag).ConfigureAwait(false); - var doc = new XmlDocument(); - doc.Load(data); - var nodes = doc.GetElementsByTagName("file-url"); - - var node = nodes[new NadekoRandom().Next(0, nodes.Count)]; - return "https://danbooru.donmai.us" + node.InnerText; - } - } - catch - { - return null; - } - }); public static Task GetE621ImageLink(string tag) => Task.Run(async () => From a0e23b4c2cf0a0552eed78447d729eaaabd11c7a Mon Sep 17 00:00:00 2001 From: Kwoth Date: Thu, 2 Feb 2017 05:08:28 +0100 Subject: [PATCH 07/19] Fixed public bot connection logging --- Discord.Net | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Discord.Net b/Discord.Net index 979eecab..0fd1e70a 160000 --- a/Discord.Net +++ b/Discord.Net @@ -1 +1 @@ -Subproject commit 979eecabfe0654db0be27cba71ecb398848f2c0c +Subproject commit 0fd1e70a22612ff9fa697dace96f22780080b01f From dfbabea8b904ec980f9277e57dcc8096123170ea Mon Sep 17 00:00:00 2001 From: Kwoth Date: Thu, 2 Feb 2017 14:16:28 +0100 Subject: [PATCH 08/19] performance improvements? --- .../Modules/Administration/Administration.cs | 28 ++-- src/NadekoBot/Services/CommandHandler.cs | 137 +++++++++--------- 2 files changed, 87 insertions(+), 78 deletions(-) diff --git a/src/NadekoBot/Modules/Administration/Administration.cs b/src/NadekoBot/Modules/Administration/Administration.cs index 45e99b8e..cf92fb4b 100644 --- a/src/NadekoBot/Modules/Administration/Administration.cs +++ b/src/NadekoBot/Modules/Administration/Administration.cs @@ -38,20 +38,24 @@ namespace NadekoBot.Modules.Administration } - private static async Task DelMsgOnCmd_Handler(SocketUserMessage msg, CommandInfo cmd) + private static Task DelMsgOnCmd_Handler(SocketUserMessage msg, CommandInfo cmd) { - try + var _ = Task.Run(async () => { - var channel = msg.Channel as SocketTextChannel; - if (channel == null) - return; - if (DeleteMessagesOnCommand.Contains(channel.Guild.Id) && cmd.Name != "prune") - await msg.DeleteAsync().ConfigureAwait(false); - } - catch (Exception ex) - { - _log.Warn(ex, "Delmsgoncmd errored..."); - } + try + { + var channel = msg.Channel as SocketTextChannel; + if (channel == null) + return; + if (DeleteMessagesOnCommand.Contains(channel.Guild.Id) && cmd.Name != "prune") + await msg.DeleteAsync().ConfigureAwait(false); + } + catch (Exception ex) + { + _log.Warn(ex, "Delmsgoncmd errored..."); + } + }); + return Task.CompletedTask; } [NadekoCommand, Usage, Description, Aliases] diff --git a/src/NadekoBot/Services/CommandHandler.cs b/src/NadekoBot/Services/CommandHandler.cs index 09080f12..8cc68001 100644 --- a/src/NadekoBot/Services/CommandHandler.cs +++ b/src/NadekoBot/Services/CommandHandler.cs @@ -105,9 +105,8 @@ namespace NadekoBot.Services BlacklistCommands.BlacklistedUsers.Contains(usrMsg.Author.Id); const float oneThousandth = 1.0f / 1000; - private async Task LogSuccessfulExecution(SocketUserMessage usrMsg, ExecuteCommandResult exec, SocketTextChannel channel, int ticks) + private Task LogSuccessfulExecution(SocketUserMessage usrMsg, ExecuteCommandResult exec, SocketTextChannel channel, int ticks) { - await CommandExecuted(usrMsg, exec.CommandInfo).ConfigureAwait(false); _log.Info("Command Executed after {4}s\n\t" + "User: {0}\n\t" + "Server: {1}\n\t" + @@ -118,6 +117,7 @@ namespace NadekoBot.Services (channel == null ? "PRIVATE" : channel.Name + " [" + channel.Id + "]"), // {2} usrMsg.Content, // {3} ticks * oneThousandth); + return Task.CompletedTask; } private void LogErroredExecution(SocketUserMessage usrMsg, ExecuteCommandResult exec, SocketTextChannel channel, int ticks) @@ -184,93 +184,98 @@ namespace NadekoBot.Services return false; } - private async Task MessageReceivedHandler(SocketMessage msg) + private Task MessageReceivedHandler(SocketMessage msg) { - try + var _ = Task.Run(async () => { - if (msg.Author.IsBot || !NadekoBot.Ready) //no bots, wait until bot connected and initialized - return; + try + { + if (msg.Author.IsBot || !NadekoBot.Ready) //no bots, wait until bot connected and initialized + return; - var execTime = Environment.TickCount; + var execTime = Environment.TickCount; - var usrMsg = msg as SocketUserMessage; - if (usrMsg == null) //has to be an user message, not system/other messages. - return; + var usrMsg = msg as SocketUserMessage; + if (usrMsg == null) //has to be an user message, not system/other messages. + return; #if !GLOBAL_NADEKO - // track how many messagges each user is sending - UserMessagesSent.AddOrUpdate(usrMsg.Author.Id, 1, (key, old) => ++old); + // track how many messagges each user is sending + UserMessagesSent.AddOrUpdate(usrMsg.Author.Id, 1, (key, old) => ++old); #endif - var channel = msg.Channel as SocketTextChannel; - var guild = channel?.Guild; + var channel = msg.Channel as SocketTextChannel; + var guild = channel?.Guild; - if (guild != null && guild.OwnerId != msg.Author.Id) - { - if (await InviteFiltered(guild, usrMsg).ConfigureAwait(false)) + if (guild != null && guild.OwnerId != msg.Author.Id) + { + if (await InviteFiltered(guild, usrMsg).ConfigureAwait(false)) + return; + + if (await WordFiltered(guild, usrMsg).ConfigureAwait(false)) + return; + } + + if (IsBlacklisted(guild, usrMsg)) return; - if (await WordFiltered(guild, usrMsg).ConfigureAwait(false)) + var cleverBotRan = await Task.Run(() => TryRunCleverbot(usrMsg, guild)).ConfigureAwait(false); + if (cleverBotRan) return; - } - if (IsBlacklisted(guild, usrMsg)) - return; + // maybe this message is a custom reaction + // todo log custom reaction executions. return struct with info + var crExecuted = await Task.Run(() => CustomReactions.TryExecuteCustomReaction(usrMsg)).ConfigureAwait(false); + if (crExecuted) //if it was, don't execute the command + return; - var cleverBotRan = await Task.Run(() => TryRunCleverbot(usrMsg, guild)).ConfigureAwait(false); - if (cleverBotRan) - return; + string messageContent = usrMsg.Content; - // maybe this message is a custom reaction - // todo log custom reaction executions. return struct with info - var crExecuted = await Task.Run(() => CustomReactions.TryExecuteCustomReaction(usrMsg)).ConfigureAwait(false); - if (crExecuted) //if it was, don't execute the command - return; + // execute the command and measure the time it took + var exec = await Task.Run(() => ExecuteCommand(new CommandContext(_client, usrMsg), messageContent, DependencyMap.Empty, MultiMatchHandling.Best)).ConfigureAwait(false); + execTime = Environment.TickCount - execTime; - string messageContent = usrMsg.Content; - - // execute the command and measure the time it took - var exec = await Task.Run(() => ExecuteCommand(new CommandContext(_client, usrMsg), messageContent, DependencyMap.Empty, MultiMatchHandling.Best)).ConfigureAwait(false); - execTime = Environment.TickCount - execTime; - - if (exec.Result.IsSuccess) - { - await LogSuccessfulExecution(usrMsg, exec, channel, execTime).ConfigureAwait(false); - } - else if (!exec.Result.IsSuccess && exec.Result.Error != CommandError.UnknownCommand) - { - LogErroredExecution(usrMsg, exec, channel, execTime); - if (guild != null && exec.CommandInfo != null && exec.Result.Error == CommandError.Exception) + if (exec.Result.IsSuccess) { - if (exec.PermissionCache != null && exec.PermissionCache.Verbose) - try { await msg.Channel.SendMessageAsync("⚠️ " + exec.Result.ErrorReason).ConfigureAwait(false); } catch { } + await CommandExecuted(usrMsg, exec.CommandInfo).ConfigureAwait(false); + await LogSuccessfulExecution(usrMsg, exec, channel, execTime).ConfigureAwait(false); + } + else if (!exec.Result.IsSuccess && exec.Result.Error != CommandError.UnknownCommand) + { + LogErroredExecution(usrMsg, exec, channel, execTime); + if (guild != null && exec.CommandInfo != null && exec.Result.Error == CommandError.Exception) + { + if (exec.PermissionCache != null && exec.PermissionCache.Verbose) + try { await msg.Channel.SendMessageAsync("⚠️ " + exec.Result.ErrorReason).ConfigureAwait(false); } catch { } + } + } + else + { + if (msg.Channel is IPrivateChannel) + { + // rofl, gotta do this to prevent dm help message being sent to + // users who are voting on private polls (sending a number in a DM) + int vote; + if (int.TryParse(msg.Content, out vote)) return; + + await msg.Channel.SendMessageAsync(Help.DMHelpString).ConfigureAwait(false); + + await DMForwardCommands.HandleDMForwarding(msg, ownerChannels).ConfigureAwait(false); + } } } - else + catch (Exception ex) { - if (msg.Channel is IPrivateChannel) + _log.Warn("Error in CommandHandler"); + _log.Warn(ex); + if (ex.InnerException != null) { - // rofl, gotta do this to prevent dm help message being sent to - // users who are voting on private polls (sending a number in a DM) - int vote; - if (int.TryParse(msg.Content, out vote)) return; - - await msg.Channel.SendMessageAsync(Help.DMHelpString).ConfigureAwait(false); - - await DMForwardCommands.HandleDMForwarding(msg, ownerChannels).ConfigureAwait(false); + _log.Warn("Inner Exception of the error in CommandHandler"); + _log.Warn(ex.InnerException); } } - } - catch (Exception ex) - { - _log.Warn("Error in CommandHandler"); - _log.Warn(ex); - if (ex.InnerException != null) - { - _log.Warn("Inner Exception of the error in CommandHandler"); - _log.Warn(ex.InnerException); - } - } + }); + return Task.CompletedTask; } public Task ExecuteCommandAsync(CommandContext context, int argPos, IDependencyMap dependencyMap = null, MultiMatchHandling multiMatchHandling = MultiMatchHandling.Exception) From 9791b5b9e367311ad719671b78da1380ed27755b Mon Sep 17 00:00:00 2001 From: Kwoth Date: Thu, 2 Feb 2017 21:00:38 +0100 Subject: [PATCH 09/19] v+t slower but much better and reliable. Need to check ratelimits before speeding it up. --- .../Commands/ProtectionCommands.cs | 109 ++++++----- .../Commands/VoicePlusTextCommands.cs | 182 ++++++++++++------ src/NadekoBot/NadekoBot.cs | 2 +- 3 files changed, 185 insertions(+), 108 deletions(-) diff --git a/src/NadekoBot/Modules/Administration/Commands/ProtectionCommands.cs b/src/NadekoBot/Modules/Administration/Commands/ProtectionCommands.cs index e37f4850..3e3b217a 100644 --- a/src/NadekoBot/Modules/Administration/Commands/ProtectionCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/ProtectionCommands.cs @@ -105,74 +105,85 @@ namespace NadekoBot.Modules.Administration antiSpamGuilds.TryAdd(gc.GuildId, new AntiSpamStats() { AntiSpamSettings = spam }); } - NadekoBot.Client.MessageReceived += async (imsg) => + NadekoBot.Client.MessageReceived += (imsg) => { + var msg = imsg as IUserMessage; + if (msg == null || msg.Author.IsBot) + return Task.CompletedTask; - try + var channel = msg.Channel as ITextChannel; + if (channel == null) + return Task.CompletedTask; + var _ = Task.Run(async () => { - var msg = imsg as IUserMessage; - if (msg == null || msg.Author.IsBot) - return; - - var channel = msg.Channel as ITextChannel; - if (channel == null) - return; - AntiSpamStats spamSettings; - if (!antiSpamGuilds.TryGetValue(channel.Guild.Id, out spamSettings) || - spamSettings.AntiSpamSettings.IgnoredChannels.Contains(new AntiSpamIgnore() - { - ChannelId = channel.Id - })) - return; - - var stats = spamSettings.UserStats.AddOrUpdate(msg.Author.Id, new UserSpamStats(msg.Content), - (id, old) => { old.ApplyNextMessage(msg.Content); return old; }); - - if (stats.Count >= spamSettings.AntiSpamSettings.MessageThreshold) + try { - if (spamSettings.UserStats.TryRemove(msg.Author.Id, out stats)) + AntiSpamStats spamSettings; + if (!antiSpamGuilds.TryGetValue(channel.Guild.Id, out spamSettings) || + spamSettings.AntiSpamSettings.IgnoredChannels.Contains(new AntiSpamIgnore() + { + ChannelId = channel.Id + })) + return; + + var stats = spamSettings.UserStats.AddOrUpdate(msg.Author.Id, new UserSpamStats(msg.Content), + (id, old) => + { + old.ApplyNextMessage(msg.Content); return old; + }); + + if (stats.Count >= spamSettings.AntiSpamSettings.MessageThreshold) { - await PunishUsers(spamSettings.AntiSpamSettings.Action, ProtectionType.Spamming, (IGuildUser)msg.Author) - .ConfigureAwait(false); + if (spamSettings.UserStats.TryRemove(msg.Author.Id, out stats)) + { + await PunishUsers(spamSettings.AntiSpamSettings.Action, ProtectionType.Spamming, (IGuildUser)msg.Author) + .ConfigureAwait(false); + } } } - } - catch { } + catch { } + }); + return Task.CompletedTask; }; - NadekoBot.Client.UserJoined += async (usr) => + NadekoBot.Client.UserJoined += (usr) => { - try + if (usr.IsBot) + return Task.CompletedTask; + AntiRaidStats settings; + if (!antiRaidGuilds.TryGetValue(usr.Guild.Id, out settings)) + return Task.CompletedTask; + if (!settings.RaidUsers.Add(usr)) + return Task.CompletedTask; + + var _ = Task.Run(async () => { - if (usr.IsBot) - return; - AntiRaidStats settings; - if (!antiRaidGuilds.TryGetValue(usr.Guild.Id, out settings)) - return; - if (!settings.RaidUsers.Add(usr)) - return; - - ++settings.UsersCount; - - if (settings.UsersCount >= settings.AntiRaidSettings.UserThreshold) + try { - var users = settings.RaidUsers.ToArray(); - settings.RaidUsers.Clear(); + ++settings.UsersCount; + + if (settings.UsersCount >= settings.AntiRaidSettings.UserThreshold) + { + var users = settings.RaidUsers.ToArray(); + settings.RaidUsers.Clear(); + + await PunishUsers(settings.AntiRaidSettings.Action, ProtectionType.Raiding, users).ConfigureAwait(false); + } + await Task.Delay(1000 * settings.AntiRaidSettings.Seconds).ConfigureAwait(false); + + settings.RaidUsers.TryRemove(usr); + --settings.UsersCount; - await PunishUsers(settings.AntiRaidSettings.Action, ProtectionType.Raiding, users).ConfigureAwait(false); } - await Task.Delay(1000 * settings.AntiRaidSettings.Seconds).ConfigureAwait(false); - - settings.RaidUsers.TryRemove(usr); - --settings.UsersCount; - - } - catch { } + catch { } + }); + return Task.CompletedTask; }; } private static async Task PunishUsers(PunishmentAction action, ProtectionType pt, params IGuildUser[] gus) { + _log.Warn($"[{pt}] - Punishing [{gus.Length}] users with [{action}] in {gus[0].Guild.Name} guild"); foreach (var gu in gus) { switch (action) diff --git a/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs b/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs index 9d92ff98..3b68f36f 100644 --- a/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs @@ -7,9 +7,11 @@ using NadekoBot.Services; using NLog; using System; using System.Collections.Concurrent; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text.RegularExpressions; +using System.Threading; using System.Threading.Tasks; namespace NadekoBot.Modules.Administration @@ -22,6 +24,8 @@ namespace NadekoBot.Modules.Administration private static Regex channelNameRegex = new Regex(@"[^a-zA-Z0-9 -]", RegexOptions.Compiled); private static ConcurrentHashSet voicePlusTextCache { get; } + + private static ConcurrentDictionary guildLockObjects = new ConcurrentDictionary(); static VoicePlusTextCommands() { var _log = LogManager.GetCurrentClassLogger(); @@ -36,78 +40,119 @@ namespace NadekoBot.Modules.Administration _log.Debug($"Loaded in {sw.Elapsed.TotalSeconds:F2}s"); } - private static async Task UserUpdatedEventHandler(SocketUser iuser, SocketVoiceState before, SocketVoiceState after) + private static Task UserUpdatedEventHandler(SocketUser iuser, SocketVoiceState before, SocketVoiceState after) { var user = (iuser as SocketGuildUser); var guild = user?.Guild; if (guild == null) - return; + return Task.CompletedTask; - try + var botUserPerms = guild.CurrentUser.GuildPermissions; + + if (before.VoiceChannel == after.VoiceChannel) + return Task.CompletedTask; + + if (!voicePlusTextCache.Contains(guild.Id)) + return Task.CompletedTask; + + var _ = Task.Run(async () => { - var botUserPerms = guild.CurrentUser.GuildPermissions; - - if (before.VoiceChannel == after.VoiceChannel) return; - - if (!voicePlusTextCache.Contains(guild.Id)) - return; - - if (!botUserPerms.ManageChannels || !botUserPerms.ManageRoles) + try { + + if (!botUserPerms.ManageChannels || !botUserPerms.ManageRoles) + { + try + { + await guild.Owner.SendErrorAsync( + "⚠️ I don't have **manage server** and/or **manage channels** permission," + + $" so I cannot run `voice+text` on **{guild.Name}** server.").ConfigureAwait(false); + } + catch { } + using (var uow = DbHandler.UnitOfWork()) + { + uow.GuildConfigs.For(guild.Id, set => set).VoicePlusTextEnabled = false; + voicePlusTextCache.TryRemove(guild.Id); + await uow.CompleteAsync().ConfigureAwait(false); + } + return; + } + + var semaphore = guildLockObjects.GetOrAdd(guild.Id, (key) => new SemaphoreSlim(1, 1)); + try { - await guild.Owner.SendErrorAsync( - "⚠️ I don't have **manage server** and/or **manage channels** permission," + - $" so I cannot run `voice+text` on **{guild.Name}** server.").ConfigureAwait(false); - } - catch { } - using (var uow = DbHandler.UnitOfWork()) - { - uow.GuildConfigs.For(guild.Id, set => set).VoicePlusTextEnabled = false; - voicePlusTextCache.TryRemove(guild.Id); - await uow.CompleteAsync().ConfigureAwait(false); - } - return; - } + await semaphore.WaitAsync().ConfigureAwait(false); + var beforeVch = before.VoiceChannel; + if (beforeVch != null) + { + var beforeRoleName = GetRoleName(beforeVch); + var beforeRole = guild.Roles.FirstOrDefault(x => x.Name == beforeRoleName); + if (beforeRole != null) + try + { + _log.Warn("Removing role " + beforeRoleName + " from user " + user.Username); + await user.RemoveRolesAsync(beforeRole).ConfigureAwait(false); + await Task.Delay(200).ConfigureAwait(false); + } + catch (Exception ex) + { + _log.Warn(ex); + } + } + var afterVch = after.VoiceChannel; + if (afterVch != null && guild.AFKChannel?.Id != afterVch.Id) + { + var roleName = GetRoleName(afterVch); + IRole roleToAdd = guild.Roles.FirstOrDefault(x => x.Name == roleName); + if (roleToAdd == null) + roleToAdd = await guild.CreateRoleAsync(roleName).ConfigureAwait(false); - var beforeVch = before.VoiceChannel; - if (beforeVch != null) - { - var textChannel = guild.TextChannels.Where(t => t.Name == GetChannelName(beforeVch.Name).ToLowerInvariant()).FirstOrDefault(); - if (textChannel != null) - await textChannel.AddPermissionOverwriteAsync(user, - new OverwritePermissions(readMessages: PermValue.Deny, - sendMessages: PermValue.Deny)).ConfigureAwait(false); - } - var afterVch = after.VoiceChannel; - if (afterVch != null && guild.AFKChannel?.Id != afterVch.Id) - { - ITextChannel textChannel = guild.TextChannels - .Where(t => t.Name == GetChannelName(afterVch.Name).ToLowerInvariant()) - .FirstOrDefault(); - if (textChannel == null) - { - textChannel = (await guild.CreateTextChannelAsync(GetChannelName(afterVch.Name).ToLowerInvariant()).ConfigureAwait(false)); - await textChannel.AddPermissionOverwriteAsync(guild.EveryoneRole, - new OverwritePermissions(readMessages: PermValue.Deny, - sendMessages: PermValue.Deny)).ConfigureAwait(false); + ITextChannel textChannel = guild.TextChannels + .Where(t => t.Name == GetChannelName(afterVch.Name).ToLowerInvariant()) + .FirstOrDefault(); + if (textChannel == null) + { + var created = (await guild.CreateTextChannelAsync(GetChannelName(afterVch.Name).ToLowerInvariant()).ConfigureAwait(false)); + + try { await guild.CurrentUser.AddRolesAsync(roleToAdd).ConfigureAwait(false); } catch { } + await Task.Delay(50).ConfigureAwait(false); + await created.AddPermissionOverwriteAsync(roleToAdd, new OverwritePermissions( + readMessages: PermValue.Allow, + sendMessages: PermValue.Allow)) + .ConfigureAwait(false); + await Task.Delay(50).ConfigureAwait(false); + await created.AddPermissionOverwriteAsync(guild.EveryoneRole, new OverwritePermissions( + readMessages: PermValue.Deny, + sendMessages: PermValue.Deny)) + .ConfigureAwait(false); + await Task.Delay(50).ConfigureAwait(false); + } + _log.Warn("Adding role " + roleToAdd.Name + " to user " + user.Username); + await user.AddRolesAsync(roleToAdd).ConfigureAwait(false); + } + } + finally + { + semaphore.Release(); } - await textChannel.AddPermissionOverwriteAsync(user, - new OverwritePermissions(readMessages: PermValue.Allow, - sendMessages: PermValue.Allow)).ConfigureAwait(false); } - } - catch (Exception ex) - { - Console.WriteLine(ex); - } + catch (Exception ex) + { + _log.Warn(ex); + } + }); + return Task.CompletedTask; } private static string GetChannelName(string voiceName) => channelNameRegex.Replace(voiceName, "").Trim().Replace(" ", "-").TrimTo(90, true) + "-voice"; + private static string GetRoleName(IVoiceChannel ch) => + "nvoice-" + ch.Id; + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageRoles)] @@ -127,7 +172,7 @@ namespace NadekoBot.Modules.Administration { try { - await Context.Channel.SendErrorAsync("⚠️ You are enabling this feature and **I do not have ADMINISTRATOR permissions**. " + + await Context.Channel.SendErrorAsync("⚠️ You are enabling/disabling this feature and **I do not have ADMINISTRATOR permissions**. " + "`This may cause some issues, and you will have to clean up text channels yourself afterwards.`"); } catch { } @@ -147,6 +192,13 @@ namespace NadekoBot.Modules.Administration foreach (var textChannel in (await guild.GetTextChannelsAsync().ConfigureAwait(false)).Where(c => c.Name.EndsWith("-voice"))) { try { await textChannel.DeleteAsync().ConfigureAwait(false); } catch { } + await Task.Delay(500).ConfigureAwait(false); + } + + foreach (var role in guild.Roles.Where(c => c.Name.StartsWith("nvoice-"))) + { + try { await role.DeleteAsync().ConfigureAwait(false); } catch { } + await Task.Delay(500).ConfigureAwait(false); } await Context.Channel.SendConfirmAsync("ℹ️ Successfuly **removed** voice + text feature.").ConfigureAwait(false); return; @@ -163,7 +215,9 @@ namespace NadekoBot.Modules.Administration [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageChannels)] + [RequireBotPermission(GuildPermission.ManageChannels)] [RequireUserPermission(GuildPermission.ManageRoles)] + //[RequireBotPermission(GuildPermission.ManageRoles)] public async Task CleanVPlusT() { var guild = Context.Guild; @@ -174,15 +228,27 @@ namespace NadekoBot.Modules.Administration return; } - var allTxtChannels = (await guild.GetTextChannelsAsync()).Where(c => c.Name.EndsWith("-voice")); - var validTxtChannelNames = (await guild.GetVoiceChannelsAsync()).Select(c => GetChannelName(c.Name).ToLowerInvariant()); + var textChannels = await guild.GetTextChannelsAsync().ConfigureAwait(false); + var voiceChannels = await guild.GetVoiceChannelsAsync().ConfigureAwait(false); - var invalidTxtChannels = allTxtChannels.Where(c => !validTxtChannelNames.Contains(c.Name)); + var boundTextChannels = textChannels.Where(c => c.Name.EndsWith("-voice")); + var validTxtChannelNames = new HashSet(voiceChannels.Select(c => GetChannelName(c.Name).ToLowerInvariant())); + var invalidTxtChannels = boundTextChannels.Where(c => !validTxtChannelNames.Contains(c.Name)); foreach (var c in invalidTxtChannels) { try { await c.DeleteAsync().ConfigureAwait(false); } catch { } - await Task.Delay(500); + await Task.Delay(500).ConfigureAwait(false); + } + + var boundRoles = guild.Roles.Where(r => r.Name.StartsWith("nvoice-")); + var validRoleNames = new HashSet(voiceChannels.Select(c => GetRoleName(c).ToLowerInvariant())); + var invalidRoles = boundRoles.Where(r => !validRoleNames.Contains(r.Name)); + + foreach (var r in invalidRoles) + { + try { await r.DeleteAsync().ConfigureAwait(false); } catch { } + await Task.Delay(500).ConfigureAwait(false); } await Context.Channel.SendConfirmAsync("Cleaned v+t.").ConfigureAwait(false); diff --git a/src/NadekoBot/NadekoBot.cs b/src/NadekoBot/NadekoBot.cs index a6842797..ba411cea 100644 --- a/src/NadekoBot/NadekoBot.cs +++ b/src/NadekoBot/NadekoBot.cs @@ -113,7 +113,7 @@ namespace NadekoBot await CommandHandler.StartHandling().ConfigureAwait(false); - await CommandService.AddModulesAsync(this.GetType().GetTypeInfo().Assembly).ConfigureAwait(false); + var _ = await Task.Run(() => CommandService.AddModulesAsync(this.GetType().GetTypeInfo().Assembly)).ConfigureAwait(false); #if !GLOBAL_NADEKO await CommandService.AddModuleAsync().ConfigureAwait(false); #endif From 4a3d66e712505aaf2417459d992e33dfb7b0b1ca Mon Sep 17 00:00:00 2001 From: Kwoth Date: Thu, 2 Feb 2017 21:59:01 +0100 Subject: [PATCH 10/19] Images service. Preloads images bot uses. Holds heads and tails images only for now. --- .../Gambling/Commands/FlipCoinCommand.cs | 30 +++++++----- src/NadekoBot/NadekoBot.cs | 5 ++ src/NadekoBot/Services/IImagesService.cs | 17 +++++++ src/NadekoBot/Services/Impl/ImagesService.cs | 46 +++++++++++++++++++ 4 files changed, 86 insertions(+), 12 deletions(-) create mode 100644 src/NadekoBot/Services/IImagesService.cs create mode 100644 src/NadekoBot/Services/Impl/ImagesService.cs diff --git a/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs b/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs index 85092dc7..74e201c0 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs @@ -16,32 +16,38 @@ namespace NadekoBot.Modules.Gambling [Group] public class FlipCoinCommands : ModuleBase { + private readonly IImagesService _images; + private static NadekoRandom rng { get; } = new NadekoRandom(); - private const string headsPath = "data/images/coins/heads.png"; - private const string tailsPath = "data/images/coins/tails.png"; - + + public FlipCoinCommands() + { + //todo DI in the future, can't atm + this._images = NadekoBot.Images; + } + [NadekoCommand, Usage, Description, Aliases] public async Task Flip(int count = 1) { if (count == 1) { if (rng.Next(0, 2) == 1) - await Context.Channel.SendFileAsync(File.Open(headsPath, FileMode.OpenOrCreate), "heads.jpg", $"{Context.User.Mention} flipped " + Format.Code("Heads") + ".").ConfigureAwait(false); + await Context.Channel.SendFileAsync(_images.Heads, "heads.jpg", $"{Context.User.Mention} flipped " + Format.Code("Heads") + ".").ConfigureAwait(false); else - await Context.Channel.SendFileAsync(File.Open(tailsPath, FileMode.OpenOrCreate), "tails.jpg", $"{Context.User.Mention} flipped " + Format.Code("Tails") + ".").ConfigureAwait(false); + await Context.Channel.SendFileAsync(_images.Tails, "tails.jpg", $"{Context.User.Mention} flipped " + Format.Code("Tails") + ".").ConfigureAwait(false); return; } if (count > 10 || count < 1) { - await Context.Channel.SendErrorAsync("`Invalid number specified. You can flip 1 to 10 coins.`"); + await Context.Channel.SendErrorAsync("`Invalid number specified. You can flip 1 to 10 coins.`").ConfigureAwait(false); return; } var imgs = new Image[count]; for (var i = 0; i < count; i++) { imgs[i] = rng.Next(0, 10) < 5 ? - new Image(File.OpenRead(headsPath)) : - new Image(File.OpenRead(tailsPath)); + new Image(_images.Heads) : + new Image(_images.Tails); } await Context.Channel.SendFileAsync(imgs.Merge().ToStream(), $"{count} coins.png").ConfigureAwait(false); } @@ -70,15 +76,15 @@ namespace NadekoBot.Modules.Gambling var isHeads = guessStr == "HEADS" || guessStr == "H"; bool result = false; - string imgPathToSend; + Stream imageToSend; if (rng.Next(0, 2) == 1) { - imgPathToSend = headsPath; + imageToSend = _images.Heads; result = true; } else { - imgPathToSend = tailsPath; + imageToSend = _images.Tails; } string str; @@ -93,7 +99,7 @@ namespace NadekoBot.Modules.Gambling str = $"{Context.User.Mention}`Better luck next time.`"; } - await Context.Channel.SendFileAsync(File.Open(imgPathToSend, FileMode.OpenOrCreate), new FileInfo(imgPathToSend).Name, str).ConfigureAwait(false); + await Context.Channel.SendFileAsync(imageToSend, "result.png", str).ConfigureAwait(false); } } } diff --git a/src/NadekoBot/NadekoBot.cs b/src/NadekoBot/NadekoBot.cs index ba411cea..a32abc73 100644 --- a/src/NadekoBot/NadekoBot.cs +++ b/src/NadekoBot/NadekoBot.cs @@ -33,6 +33,7 @@ namespace NadekoBot public static GoogleApiService Google { get; private set; } public static StatsService Stats { get; private set; } + public static IImagesService Images { get; private set; } public static ConcurrentDictionary ModulePrefixes { get; private set; } public static bool Ready { get; private set; } @@ -68,8 +69,11 @@ namespace NadekoBot LogLevel = LogSeverity.Warning, TotalShards = Credentials.TotalShards, ConnectionTimeout = int.MaxValue, +#if !GLOBAL_NADEKO AlwaysDownloadUsers = true, +#endif }); + #if GLOBAL_NADEKO Client.Log += Client_Log; #endif @@ -82,6 +86,7 @@ namespace NadekoBot Google = new GoogleApiService(); CommandHandler = new CommandHandler(Client, CommandService); Stats = new StatsService(Client, CommandHandler); + Images = await ImagesService.Create().ConfigureAwait(false); ////setup DI //var depMap = new DependencyMap(); diff --git a/src/NadekoBot/Services/IImagesService.cs b/src/NadekoBot/Services/IImagesService.cs new file mode 100644 index 00000000..b00b4a4a --- /dev/null +++ b/src/NadekoBot/Services/IImagesService.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Services +{ + public interface IImagesService + { + Stream Heads { get; } + Stream Tails { get; } + + Task Reload(); + } +} diff --git a/src/NadekoBot/Services/Impl/ImagesService.cs b/src/NadekoBot/Services/Impl/ImagesService.cs new file mode 100644 index 00000000..e57636c1 --- /dev/null +++ b/src/NadekoBot/Services/Impl/ImagesService.cs @@ -0,0 +1,46 @@ +using NLog; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Services.Impl +{ + public class ImagesService : IImagesService + { + private readonly Logger _log; + + private const string headsPath = "data/images/coins/heads.png"; + private const string tailsPath = "data/images/coins/tails.png"; + + private byte[] heads; + public Stream Heads => new MemoryStream(heads, false); + + private byte[] tails; + public Stream Tails => new MemoryStream(tails, false); + + private ImagesService() + { + _log = LogManager.GetCurrentClassLogger(); + } + + public static async Task Create() + { + var srvc = new ImagesService(); + await srvc.Reload().ConfigureAwait(false); + return srvc; + } + + public Task Reload() => Task.Run(() => + { + _log.Info("Loading images..."); + var sw = Stopwatch.StartNew(); + heads = File.ReadAllBytes(headsPath); + tails = File.ReadAllBytes(tailsPath); + _log.Info($"Images loaded after {sw.Elapsed.TotalSeconds:F2}s!"); + }); + } +} \ No newline at end of file From 22f7443f0b1fe3b2b447afec7fd9641339556594 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Thu, 2 Feb 2017 22:05:53 +0100 Subject: [PATCH 11/19] punishments and v+t info is info now, not warning --- .../Modules/Administration/Commands/ProtectionCommands.cs | 2 +- .../Modules/Administration/Commands/VoicePlusTextCommands.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NadekoBot/Modules/Administration/Commands/ProtectionCommands.cs b/src/NadekoBot/Modules/Administration/Commands/ProtectionCommands.cs index 3e3b217a..7639a4dc 100644 --- a/src/NadekoBot/Modules/Administration/Commands/ProtectionCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/ProtectionCommands.cs @@ -183,7 +183,7 @@ namespace NadekoBot.Modules.Administration private static async Task PunishUsers(PunishmentAction action, ProtectionType pt, params IGuildUser[] gus) { - _log.Warn($"[{pt}] - Punishing [{gus.Length}] users with [{action}] in {gus[0].Guild.Name} guild"); + _log.Info($"[{pt}] - Punishing [{gus.Length}] users with [{action}] in {gus[0].Guild.Name} guild"); foreach (var gu in gus) { switch (action) diff --git a/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs b/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs index 3b68f36f..d0c905bb 100644 --- a/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs @@ -93,7 +93,7 @@ namespace NadekoBot.Modules.Administration if (beforeRole != null) try { - _log.Warn("Removing role " + beforeRoleName + " from user " + user.Username); + _log.Info("Removing role " + beforeRoleName + " from user " + user.Username); await user.RemoveRolesAsync(beforeRole).ConfigureAwait(false); await Task.Delay(200).ConfigureAwait(false); } From a728e6f670d6556768918918d1e887fc84faaee2 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Fri, 3 Feb 2017 00:22:29 +0100 Subject: [PATCH 12/19] Currency images are preloaded now too.(>plant/>gc) --- .../Games/Commands/PlantAndPickCommands.cs | 16 +++++----- src/NadekoBot/Services/IImagesService.cs | 3 ++ src/NadekoBot/Services/Impl/ImagesService.cs | 29 +++++++++++++++--- src/NadekoBot/data/currency_images/img2.jpg | Bin 230256 -> 33845 bytes 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs b/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs index 6b5da1b1..0fe72678 100644 --- a/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs @@ -93,10 +93,10 @@ namespace NadekoBot.Modules.Games { firstPart = $"{dropAmount} random { NadekoBot.BotConfig.CurrencyPluralName } appeared!"; } - var file = GetRandomCurrencyImagePath(); + var file = GetRandomCurrencyImage(); var sent = await channel.SendFileAsync( - File.Open(file, FileMode.OpenOrCreate), - new FileInfo(file).Name, + file.Item2, + file.Item1, $"❗ {firstPart} Pick it up by typing `{NadekoBot.ModulePrefixes[typeof(Games).Name]}pick`") .ConfigureAwait(false); @@ -159,7 +159,7 @@ namespace NadekoBot.Modules.Games return; } - var file = GetRandomCurrencyImagePath(); + var file = GetRandomCurrencyImage(); IUserMessage msg; var vowelFirst = new[] { 'a', 'e', 'i', 'o', 'u' }.Contains(NadekoBot.BotConfig.CurrencyName[0]); @@ -170,7 +170,7 @@ namespace NadekoBot.Modules.Games } else { - msg = await Context.Channel.SendFileAsync(File.Open(file, FileMode.OpenOrCreate), new FileInfo(file).Name, msgToSend).ConfigureAwait(false); + msg = await Context.Channel.SendFileAsync(file.Item2, file.Item1, msgToSend).ConfigureAwait(false); } var msgs = new IUserMessage[amount]; @@ -220,10 +220,12 @@ namespace NadekoBot.Modules.Games } } - private static string GetRandomCurrencyImagePath() + private static Tuple GetRandomCurrencyImage() { var rng = new NadekoRandom(); - return Directory.GetFiles("data/currency_images").OrderBy(s => rng.Next()).FirstOrDefault(); + var images = NadekoBot.Images.CurrencyImages; + + return images[rng.Next(0, images.Count)]; } int GetRandomNumber() diff --git a/src/NadekoBot/Services/IImagesService.cs b/src/NadekoBot/Services/IImagesService.cs index b00b4a4a..192ee842 100644 --- a/src/NadekoBot/Services/IImagesService.cs +++ b/src/NadekoBot/Services/IImagesService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.Immutable; using System.IO; using System.Linq; using System.Text; @@ -12,6 +13,8 @@ namespace NadekoBot.Services Stream Heads { get; } Stream Tails { get; } + IImmutableList> CurrencyImages { get; } + Task Reload(); } } diff --git a/src/NadekoBot/Services/Impl/ImagesService.cs b/src/NadekoBot/Services/Impl/ImagesService.cs index e57636c1..f63e2eb5 100644 --- a/src/NadekoBot/Services/Impl/ImagesService.cs +++ b/src/NadekoBot/Services/Impl/ImagesService.cs @@ -1,6 +1,8 @@ using NLog; using System; using System.Collections.Generic; +using System.Collections.Immutable; +using System.Collections.ObjectModel; using System.Diagnostics; using System.IO; using System.Linq; @@ -16,11 +18,18 @@ namespace NadekoBot.Services.Impl private const string headsPath = "data/images/coins/heads.png"; private const string tailsPath = "data/images/coins/tails.png"; + private const string currencyImagesPath = "data/currency_images"; + private byte[] heads; public Stream Heads => new MemoryStream(heads, false); private byte[] tails; public Stream Tails => new MemoryStream(tails, false); + //todo tuple + private IReadOnlyDictionary currencyImages; + public IImmutableList> CurrencyImages => + currencyImages.Select(x => new Tuple(x.Key, (Stream)new MemoryStream(x.Value, false))) + .ToImmutableArray(); private ImagesService() { @@ -36,11 +45,21 @@ namespace NadekoBot.Services.Impl public Task Reload() => Task.Run(() => { - _log.Info("Loading images..."); - var sw = Stopwatch.StartNew(); - heads = File.ReadAllBytes(headsPath); - tails = File.ReadAllBytes(tailsPath); - _log.Info($"Images loaded after {sw.Elapsed.TotalSeconds:F2}s!"); + try + { + _log.Info("Loading images..."); + var sw = Stopwatch.StartNew(); + heads = File.ReadAllBytes(headsPath); + tails = File.ReadAllBytes(tailsPath); + + currencyImages = Directory.GetFiles(currencyImagesPath).ToDictionary(x => Path.GetFileName(x), x => File.ReadAllBytes(x)); + _log.Info($"Images loaded after {sw.Elapsed.TotalSeconds:F2}s!"); + } + catch (Exception ex) + { + _log.Error(ex); + throw; + } }); } } \ No newline at end of file diff --git a/src/NadekoBot/data/currency_images/img2.jpg b/src/NadekoBot/data/currency_images/img2.jpg index 5697f8bbf5319a59a7b0494ba2c57fd942a87426..cb22be2c9270022ae11c4d95b17b4bac0c16a219 100644 GIT binary patch delta 29564 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 C$!b&p delta 227522 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 Date: Fri, 3 Feb 2017 09:54:22 +0100 Subject: [PATCH 13/19] .reloadimages owner-only command added. --- .../Administration/Commands/SelfCommands.cs | 18 ++++ .../Games/Commands/PlantAndPickCommands.cs | 98 ++++++++++--------- .../Resources/CommandStrings.Designer.cs | 27 +++++ src/NadekoBot/Resources/CommandStrings.resx | 9 ++ 4 files changed, 107 insertions(+), 45 deletions(-) diff --git a/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs b/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs index a56ee402..b2af48ab 100644 --- a/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs @@ -3,6 +3,7 @@ using Discord.Commands; using NadekoBot.Attributes; using NadekoBot.Extensions; using System; +using System.Diagnostics; using System.IO; using System.Linq; using System.Net.Http; @@ -168,6 +169,23 @@ namespace NadekoBot.Modules.Administration await Context.Channel.SendConfirmAsync("🆗").ConfigureAwait(false); } + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task ReloadImages() + { + var channel = (ITextChannel)Context.Channel; + + var msg = await Context.Channel.SendMessageAsync("Reloading Images...").ConfigureAwait(false); + var sw = Stopwatch.StartNew(); + await NadekoBot.Images.Reload().ConfigureAwait(false); + sw.Stop(); + await msg.ModifyAsync(x => + { + x.Content = "✅ Images reloaded."; + }).ConfigureAwait(false); + } + private static UserStatus SettableUserStatusToUserStatus(SettableUserStatus sus) { switch (sus) diff --git a/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs b/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs index 0fe72678..ab40b511 100644 --- a/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs @@ -51,62 +51,70 @@ namespace NadekoBot.Modules.Games .SelectMany(c => c.GenerateCurrencyChannelIds.Select(obj => obj.ChannelId))); } - private static async Task PotentialFlowerGeneration(SocketMessage imsg) + private static Task PotentialFlowerGeneration(SocketMessage imsg) { - try + var msg = imsg as SocketUserMessage; + if (msg == null || msg.IsAuthor() || msg.Author.IsBot) + return Task.CompletedTask; + + var channel = imsg.Channel as ITextChannel; + if (channel == null) + return Task.CompletedTask; + + if (!generationChannels.Contains(channel.Id)) + return Task.CompletedTask; + + var _ = Task.Run(async () => { - var msg = imsg as SocketUserMessage; - if (msg == null || msg.IsAuthor() || msg.Author.IsBot) - return; - - var channel = imsg.Channel as ITextChannel; - if (channel == null) - return; - - if (!generationChannels.Contains(channel.Id)) - return; - - var lastGeneration = lastGenerations.GetOrAdd(channel.Id, DateTime.MinValue); - var rng = new NadekoRandom(); - - if (DateTime.Now - TimeSpan.FromSeconds(NadekoBot.BotConfig.CurrencyGenerationCooldown) < lastGeneration) //recently generated in this channel, don't generate again - return; - - var num = rng.Next(1, 101) + NadekoBot.BotConfig.CurrencyGenerationChance * 100; - - if (num > 100) + try { - lastGenerations.AddOrUpdate(channel.Id, DateTime.Now, (id, old) => DateTime.Now); + var lastGeneration = lastGenerations.GetOrAdd(channel.Id, DateTime.MinValue); + var rng = new NadekoRandom(); - var dropAmount = NadekoBot.BotConfig.CurrencyDropAmount; + //todo i'm stupid :rofl: wtg kwoth. real async programming :100: :ok_hand: :100: :100: :thumbsup: + if (DateTime.Now - TimeSpan.FromSeconds(NadekoBot.BotConfig.CurrencyGenerationCooldown) < lastGeneration) //recently generated in this channel, don't generate again + return; - if (dropAmount > 0) + var num = rng.Next(1, 101) + NadekoBot.BotConfig.CurrencyGenerationChance * 100; + + if (num > 100) { - var msgs = new IUserMessage[dropAmount]; + lastGenerations.AddOrUpdate(channel.Id, DateTime.Now, (id, old) => DateTime.Now); - string firstPart; - if (dropAmount == 1) + var dropAmount = NadekoBot.BotConfig.CurrencyDropAmount; + + if (dropAmount > 0) { - firstPart = $"A random { NadekoBot.BotConfig.CurrencyName } appeared!"; - } - else - { - firstPart = $"{dropAmount} random { NadekoBot.BotConfig.CurrencyPluralName } appeared!"; - } - var file = GetRandomCurrencyImage(); - var sent = await channel.SendFileAsync( - file.Item2, - file.Item1, - $"❗ {firstPart} Pick it up by typing `{NadekoBot.ModulePrefixes[typeof(Games).Name]}pick`") - .ConfigureAwait(false); + var msgs = new IUserMessage[dropAmount]; - msgs[0] = sent; + string firstPart; + if (dropAmount == 1) + { + firstPart = $"A random { NadekoBot.BotConfig.CurrencyName } appeared!"; + } + else + { + firstPart = $"{dropAmount} random { NadekoBot.BotConfig.CurrencyPluralName } appeared!"; + } + var file = GetRandomCurrencyImage(); + var sent = await channel.SendFileAsync( + file.Item2, + file.Item1, + $"❗ {firstPart} Pick it up by typing `{NadekoBot.ModulePrefixes[typeof(Games).Name]}pick`") + .ConfigureAwait(false); - plantedFlowers.AddOrUpdate(channel.Id, msgs.ToList(), (id, old) => { old.AddRange(msgs); return old; }); + msgs[0] = sent; + + plantedFlowers.AddOrUpdate(channel.Id, msgs.ToList(), (id, old) => { old.AddRange(msgs); return old; }); + } } } - } - catch { } + catch (Exception ex) + { + _log.Warn(ex); + } + }); + return Task.CompletedTask; } [NadekoCommand, Usage, Description, Aliases] @@ -162,7 +170,7 @@ namespace NadekoBot.Modules.Games var file = GetRandomCurrencyImage(); IUserMessage msg; var vowelFirst = new[] { 'a', 'e', 'i', 'o', 'u' }.Contains(NadekoBot.BotConfig.CurrencyName[0]); - + var msgToSend = $"Oh how Nice! **{Context.User.Username}** planted {(amount == 1 ? (vowelFirst ? "an" : "a") : amount.ToString())} {(amount > 1 ? NadekoBot.BotConfig.CurrencyPluralName : NadekoBot.BotConfig.CurrencyName)}. Pick it using {NadekoBot.ModulePrefixes[typeof(Games).Name]}pick"; if (file == null) { diff --git a/src/NadekoBot/Resources/CommandStrings.Designer.cs b/src/NadekoBot/Resources/CommandStrings.Designer.cs index e89ba368..634991da 100644 --- a/src/NadekoBot/Resources/CommandStrings.Designer.cs +++ b/src/NadekoBot/Resources/CommandStrings.Designer.cs @@ -5621,6 +5621,33 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to reloadimages. + /// + public static string reloadimages_cmd { + get { + return ResourceManager.GetString("reloadimages_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reloads images bot is using. Safe to use even when bot is being used heavily.. + /// + public static string reloadimages_desc { + get { + return ResourceManager.GetString("reloadimages_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `{0}reloadimages`. + /// + public static string reloadimages_usage { + get { + return ResourceManager.GetString("reloadimages_usage", resourceCulture); + } + } + /// /// Looks up a localized string similar to remind. /// diff --git a/src/NadekoBot/Resources/CommandStrings.resx b/src/NadekoBot/Resources/CommandStrings.resx index 7ee5714b..9b0b01be 100644 --- a/src/NadekoBot/Resources/CommandStrings.resx +++ b/src/NadekoBot/Resources/CommandStrings.resx @@ -3042,4 +3042,13 @@ `{0}smch` + + reloadimages + + + Reloads images bot is using. Safe to use even when bot is being used heavily. + + + `{0}reloadimages` + \ No newline at end of file From 0b9c52fc63533841d697baf8e2e67b9d7f6e07dd Mon Sep 17 00:00:00 2001 From: Kwoth Date: Fri, 3 Feb 2017 09:56:27 +0100 Subject: [PATCH 14/19] commandlist update --- docs/Commands List.md | 301 +++++++++++++++++++++--------------------- 1 file changed, 152 insertions(+), 149 deletions(-) diff --git a/docs/Commands List.md b/docs/Commands List.md index ed71757c..d73852f3 100644 --- a/docs/Commands List.md +++ b/docs/Commands List.md @@ -18,56 +18,6 @@ You can support the project on patreon: or paypa ### Administration Command and aliases | Description | Usage ----------------|--------------|------- -`.voice+text` `.v+t` | Creates a text channel for each voice channel only users in that voice channel can see.If you are server owner, keep in mind you will see them all the time regardless. **Requires ManageRoles server permission.** **Requires ManageChannels server permission.** | `.voice+text` -`.cleanvplust` `.cv+t` | Deletes all text channels ending in `-voice` for which voicechannels are not found. Use at your own risk. **Requires ManageChannels server permission.** **Requires ManageRoles server permission.** | `.cleanv+t` -`.greetdel` `.grdel` | Sets the time it takes (in seconds) for greet messages to be auto-deleted. Set 0 to disable automatic deletion. **Requires ManageServer server permission.** | `.greetdel 0` or `.greetdel 30` -`.greet` | Toggles anouncements on the current channel when someone joins the server. **Requires ManageServer server permission.** | `.greet` -`.greetmsg` | Sets a new join announcement message which will be shown in the server's channel. Type %user% if you want to mention the new member. Using it with no message will show the current greet message. **Requires ManageServer server permission.** | `.greetmsg Welcome, %user%.` -`.greetdm` | Toggles whether the greet messages will be sent in a DM (This is separate from greet - you can have both, any or neither enabled). **Requires ManageServer server permission.** | `.greetdm` -`.greetdmmsg` | Sets a new join announcement message which will be sent to the user who joined. Type %user% if you want to mention the new member. Using it with no message will show the current DM greet message. **Requires ManageServer server permission.** | `.greetdmmsg Welcome to the server, %user%`. -`.bye` | Toggles anouncements on the current channel when someone leaves the server. **Requires ManageServer server permission.** | `.bye` -`.byemsg` | Sets a new leave announcement message. Type %user% if you want to show the name the user who left. Type %id% to show id. Using this command with no message will show the current bye message. **Requires ManageServer server permission.** | `.byemsg %user% has left.` -`.byedel` | Sets the time it takes (in seconds) for bye messages to be auto-deleted. Set 0 to disable automatic deletion. **Requires ManageServer server permission.** | `.byedel 0` or `.byedel 30` -`.leave` | Makes Nadeko leave the server. Either name or id required. **Bot Owner only.** | `.leave 123123123331` -`.die` | Shuts the bot down. **Bot Owner only.** | `.die` -`.setname` `.newnm` | Gives the bot a new name. **Bot Owner only.** | `.newnm BotName` -`.setstatus` | Sets the bot's status. (Online/Idle/Dnd/Invisible) **Bot Owner only.** | `.setstatus Idle` -`.setavatar` `.setav` | Sets a new avatar image for the NadekoBot. Argument is a direct link to an image. **Bot Owner only.** | `.setav http://i.imgur.com/xTG3a1I.jpg` -`.setgame` | Sets the bots game. **Bot Owner only.** | `.setgame with snakes` -`.setstream` | Sets the bots stream. First argument is the twitch link, second argument is stream name. **Bot Owner only.** | `.setstream TWITCHLINK Hello` -`.send` | Sends a message to someone on a different server through the bot. Separate server and channel/user ids with `|` and prepend channel id with `c:` and user id with `u:`. **Bot Owner only.** | `.send serverid|c:channelid message` or `.send serverid|u:userid message` -`.announce` | Sends a message to all servers' general channel bot is connected to. **Bot Owner only.** | `.announce Useless spam` -`.adsarm` | Toggles the automatic deletion of confirmations for .iam and .iamn commands. **Requires ManageMessages server permission.** | `.adsarm` -`.asar` | Adds a role to the list of self-assignable roles. **Requires ManageRoles server permission.** | `.asar Gamer` -`.rsar` | Removes a specified role from the list of self-assignable roles. **Requires ManageRoles server permission.** | `.rsar` -`.lsar` | Lists all self-assignable roles. | `.lsar` -`.togglexclsar` `.tesar` | Toggles whether the self-assigned roles are exclusive. (So that any person can have only one of the self assignable roles) **Requires ManageRoles server permission.** | `.tesar` -`.iam` | Adds a role to you that you choose. Role must be on a list of self-assignable roles. | `.iam Gamer` -`.iamnot` `.iamn` | Removes a role to you that you choose. Role must be on a list of self-assignable roles. | `.iamn Gamer` -`.slowmode` | Toggles slowmode. Disable by specifying no parameters. To enable, specify a number of messages each user can send, and an interval in seconds. For example 1 message every 5 seconds. **Requires ManageMessages server permission.** | `.slowmode 1 5` or `.slowmode` -`.antiraid` | Sets an anti-raid protection on the server. First argument is number of people which will trigger the protection. Second one is a time interval in which that number of people needs to join in order to trigger the protection, and third argument is punishment for those people (Kick, Ban, Mute) **Requires Administrator server permission.** | `.antiraid 5 20 Kick` -`.antispam` | Stops people from repeating same message X times in a row. You can specify to either mute, kick or ban the offenders. **Requires Administrator server permission.** | `.antispam 3 Mute` or `.antispam 4 Kick` or `.antispam 6 Ban` -`.antispamignore` | Toggles whether antispam ignores current channel. Antispam must be enabled. | `.antispamignore` -`.antilist` `.antilst` | Shows currently enabled protection features. | `.antilist` -`.rotateplaying` `.ropl` | Toggles rotation of playing status of the dynamic strings you previously specified. **Bot Owner only.** | `.ropl` -`.addplaying` `.adpl` | Adds a specified string to the list of playing strings to rotate. Supported placeholders: %servers%, %users%, %playing%, %queued% **Bot Owner only.** | `.adpl` -`.listplaying` `.lipl` | Lists all playing statuses with their corresponding number. **Bot Owner only.** | `.lipl` -`.removeplaying` `.rmpl` `.repl` | Removes a playing string on a given number. **Bot Owner only.** | `.rmpl` -`.setmuterole` | Sets a name of the role which will be assigned to people who should be muted. Default is nadeko-mute. **Requires ManageRoles server permission.** | `.setmuterole Silenced` -`.mute` | Mutes a mentioned user both from speaking and chatting. **Requires ManageRoles server permission.** **Requires MuteMembers server permission.** | `.mute @Someone` -`.unmute` | Unmutes a mentioned user previously muted with `.mute` command. **Requires ManageRoles server permission.** **Requires MuteMembers server permission.** | `.unmute @Someone` -`.chatmute` | Prevents a mentioned user from chatting in text channels. **Requires ManageRoles server permission.** | `.chatmute @Someone` -`.chatunmute` | Removes a mute role previously set on a mentioned user with `.chatmute` which prevented him from chatting in text channels. **Requires ManageRoles server permission.** | `.chatunmute @Someone` -`.voicemute` | Prevents a mentioned user from speaking in voice channels. **Requires MuteMembers server permission.** | `.voicemute @Someone` -`.voiceunmute` | Gives a previously voice-muted user a permission to speak. **Requires MuteMembers server permission.** | `.voiceunmute @Someguy` -`.migratedata` | Migrate data from old bot configuration **Bot Owner only.** | `.migratedata` -`.logserver` | Enables or Disables ALL log events. If enabled, all log events will log to this channel. **Requires Administrator server permission.** **Bot Owner only.** | `.logserver enable` or `.logserver disable` -`.logignore` | Toggles whether the .logserver command ignores this channel. Useful if you have hidden admin channel and public log channel. **Requires Administrator server permission.** **Bot Owner only.** | `.logignore` -`.logevents` | Shows a list of all events you can subscribe to with `.log` **Requires Administrator server permission.** **Bot Owner only.** | `.logevents` -`.log` | Toggles logging event. Disables it if it's active anywhere on the server. Enables if it's not active. Use `.logevents` to see a list of all events you can subscribe to. **Requires Administrator server permission.** **Bot Owner only.** | `.log userpresence` or `.log userbanned` -`.fwmsgs` | Toggles forwarding of non-command messages sent to bot's DM to the bot owners **Bot Owner only.** | `.fwmsgs` -`.fwtoall` | Toggles whether messages will be forwarded to all bot owners or only to the first one specified in the credentials.json **Bot Owner only.** | `.fwtoall` -`.autoassignrole` `.aar` | Automaticaly assigns a specified role to every user who joins the server. **Requires ManageRoles server permission.** | `.aar` to disable, `.aar Role Name` to enable `.resetperms` | Resets BOT's permissions module on this server to the default value. **Requires Administrator server permission.** | `.resetperms` `.delmsgoncmd` | Toggles the automatic deletion of user's successful command message to prevent chat flood. **Requires Administrator server permission.** | `.delmsgoncmd` `.setrole` `.sr` | Sets a role for a given user. **Requires ManageRoles server permission.** | `.sr @User Guest` @@ -91,6 +41,57 @@ Command and aliases | Description | Usage `.mentionrole` `.menro` | Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have mention everyone permission. **Requires MentionEveryone server permission.** | `.menro RoleName` `.donators` | List of lovely people who donated to keep this project alive. | `.donators` `.donadd` | Add a donator to the database. **Bot Owner only.** | `.donadd Donate Amount` +`.autoassignrole` `.aar` | Automaticaly assigns a specified role to every user who joins the server. **Requires ManageRoles server permission.** | `.aar` to disable, `.aar Role Name` to enable +`.fwmsgs` | Toggles forwarding of non-command messages sent to bot's DM to the bot owners **Bot Owner only.** | `.fwmsgs` +`.fwtoall` | Toggles whether messages will be forwarded to all bot owners or only to the first one specified in the credentials.json **Bot Owner only.** | `.fwtoall` +`.logserver` | Enables or Disables ALL log events. If enabled, all log events will log to this channel. **Requires Administrator server permission.** **Bot Owner only.** | `.logserver enable` or `.logserver disable` +`.logignore` | Toggles whether the .logserver command ignores this channel. Useful if you have hidden admin channel and public log channel. **Requires Administrator server permission.** **Bot Owner only.** | `.logignore` +`.logevents` | Shows a list of all events you can subscribe to with `.log` **Requires Administrator server permission.** **Bot Owner only.** | `.logevents` +`.log` | Toggles logging event. Disables it if it's active anywhere on the server. Enables if it's not active. Use `.logevents` to see a list of all events you can subscribe to. **Requires Administrator server permission.** **Bot Owner only.** | `.log userpresence` or `.log userbanned` +`.migratedata` | Migrate data from old bot configuration **Bot Owner only.** | `.migratedata` +`.setmuterole` | Sets a name of the role which will be assigned to people who should be muted. Default is nadeko-mute. **Requires ManageRoles server permission.** | `.setmuterole Silenced` +`.mute` | Mutes a mentioned user both from speaking and chatting. **Requires ManageRoles server permission.** **Requires MuteMembers server permission.** | `.mute @Someone` +`.unmute` | Unmutes a mentioned user previously muted with `.mute` command. **Requires ManageRoles server permission.** **Requires MuteMembers server permission.** | `.unmute @Someone` +`.chatmute` | Prevents a mentioned user from chatting in text channels. **Requires ManageRoles server permission.** | `.chatmute @Someone` +`.chatunmute` | Removes a mute role previously set on a mentioned user with `.chatmute` which prevented him from chatting in text channels. **Requires ManageRoles server permission.** | `.chatunmute @Someone` +`.voicemute` | Prevents a mentioned user from speaking in voice channels. **Requires MuteMembers server permission.** | `.voicemute @Someone` +`.voiceunmute` | Gives a previously voice-muted user a permission to speak. **Requires MuteMembers server permission.** | `.voiceunmute @Someguy` +`.rotateplaying` `.ropl` | Toggles rotation of playing status of the dynamic strings you previously specified. **Bot Owner only.** | `.ropl` +`.addplaying` `.adpl` | Adds a specified string to the list of playing strings to rotate. Supported placeholders: %servers%, %users%, %playing%, %queued%, %time%,%shardid%,%shardcount%, %shardguilds% **Bot Owner only.** | `.adpl` +`.listplaying` `.lipl` | Lists all playing statuses with their corresponding number. **Bot Owner only.** | `.lipl` +`.removeplaying` `.rmpl` `.repl` | Removes a playing string on a given number. **Bot Owner only.** | `.rmpl` +`.antiraid` | Sets an anti-raid protection on the server. First argument is number of people which will trigger the protection. Second one is a time interval in which that number of people needs to join in order to trigger the protection, and third argument is punishment for those people (Kick, Ban, Mute) **Requires Administrator server permission.** | `.antiraid 5 20 Kick` +`.antispam` | Stops people from repeating same message X times in a row. You can specify to either mute, kick or ban the offenders. **Requires Administrator server permission.** | `.antispam 3 Mute` or `.antispam 4 Kick` or `.antispam 6 Ban` +`.antispamignore` | Toggles whether antispam ignores current channel. Antispam must be enabled. | `.antispamignore` +`.antilist` `.antilst` | Shows currently enabled protection features. | `.antilist` +`.slowmode` | Toggles slowmode. Disable by specifying no parameters. To enable, specify a number of messages each user can send, and an interval in seconds. For example 1 message every 5 seconds. **Requires ManageMessages server permission.** | `.slowmode 1 5` or `.slowmode` +`.adsarm` | Toggles the automatic deletion of confirmations for .iam and .iamn commands. **Requires ManageMessages server permission.** | `.adsarm` +`.asar` | Adds a role to the list of self-assignable roles. **Requires ManageRoles server permission.** | `.asar Gamer` +`.rsar` | Removes a specified role from the list of self-assignable roles. **Requires ManageRoles server permission.** | `.rsar` +`.lsar` | Lists all self-assignable roles. | `.lsar` +`.togglexclsar` `.tesar` | Toggles whether the self-assigned roles are exclusive. (So that any person can have only one of the self assignable roles) **Requires ManageRoles server permission.** | `.tesar` +`.iam` | Adds a role to you that you choose. Role must be on a list of self-assignable roles. | `.iam Gamer` +`.iamnot` `.iamn` | Removes a role to you that you choose. Role must be on a list of self-assignable roles. | `.iamn Gamer` +`.leave` | Makes Nadeko leave the server. Either name or id required. **Bot Owner only.** | `.leave 123123123331` +`.die` | Shuts the bot down. **Bot Owner only.** | `.die` +`.setname` `.newnm` | Gives the bot a new name. **Bot Owner only.** | `.newnm BotName` +`.setstatus` | Sets the bot's status. (Online/Idle/Dnd/Invisible) **Bot Owner only.** | `.setstatus Idle` +`.setavatar` `.setav` | Sets a new avatar image for the NadekoBot. Argument is a direct link to an image. **Bot Owner only.** | `.setav http://i.imgur.com/xTG3a1I.jpg` +`.setgame` | Sets the bots game. **Bot Owner only.** | `.setgame with snakes` +`.setstream` | Sets the bots stream. First argument is the twitch link, second argument is stream name. **Bot Owner only.** | `.setstream TWITCHLINK Hello` +`.send` | Sends a message to someone on a different server through the bot. Separate server and channel/user ids with `|` and prepend channel id with `c:` and user id with `u:`. **Bot Owner only.** | `.send serverid|c:channelid message` or `.send serverid|u:userid message` +`.announce` | Sends a message to all servers' general channel bot is connected to. **Bot Owner only.** | `.announce Useless spam` +`.reloadimages` | Reloads images bot is using. Safe to use even when bot is being used heavily. **Bot Owner only.** | `.reloadimages` +`.greetdel` `.grdel` | Sets the time it takes (in seconds) for greet messages to be auto-deleted. Set 0 to disable automatic deletion. **Requires ManageServer server permission.** | `.greetdel 0` or `.greetdel 30` +`.greet` | Toggles anouncements on the current channel when someone joins the server. **Requires ManageServer server permission.** | `.greet` +`.greetmsg` | Sets a new join announcement message which will be shown in the server's channel. Type %user% if you want to mention the new member. Using it with no message will show the current greet message. **Requires ManageServer server permission.** | `.greetmsg Welcome, %user%.` +`.greetdm` | Toggles whether the greet messages will be sent in a DM (This is separate from greet - you can have both, any or neither enabled). **Requires ManageServer server permission.** | `.greetdm` +`.greetdmmsg` | Sets a new join announcement message which will be sent to the user who joined. Type %user% if you want to mention the new member. Using it with no message will show the current DM greet message. **Requires ManageServer server permission.** | `.greetdmmsg Welcome to the server, %user%`. +`.bye` | Toggles anouncements on the current channel when someone leaves the server. **Requires ManageServer server permission.** | `.bye` +`.byemsg` | Sets a new leave announcement message. Type %user% if you want to show the name the user who left. Type %id% to show id. Using this command with no message will show the current bye message. **Requires ManageServer server permission.** | `.byemsg %user% has left.` +`.byedel` | Sets the time it takes (in seconds) for bye messages to be auto-deleted. Set 0 to disable automatic deletion. **Requires ManageServer server permission.** | `.byedel 0` or `.byedel 30` +`.voice+text` `.v+t` | Creates a text channel for each voice channel only users in that voice channel can see.If you are server owner, keep in mind you will see them all the time regardless. **Requires ManageRoles server permission.** **Requires ManageChannels server permission.** | `.v+t` +`.cleanvplust` `.cv+t` | Deletes all text channels ending in `-voice` for which voicechannels are not found. Use at your own risk. **Requires ManageChannels server permission.** **Requires ManageRoles server permission.** | `.cleanv+t` ###### [Back to TOC](#table-of-contents) @@ -125,24 +126,6 @@ Command and aliases | Description | Usage ### Gambling Command and aliases | Description | Usage ----------------|--------------|------- -`$claimwaifu` `$claim` | Claim a waifu for yourself by spending currency. You must spend atleast 10% more than her current value unless she set `$affinity` towards you. | `$claim 50 @Himesama` -`$divorce` | Releases your claim on a specific waifu. You will get some of the money you've spent back unless that waifu has an affinity towards you. 6 hours cooldown. | `$divorce @CheatingSloot` -`$affinity` | Sets your affinity towards someone you want to be claimed by. Setting affinity will reduce their `$claim` on you by 20%. You can leave second argument empty to clear your affinity. 30 minutes cooldown. | `$affinity @MyHusband` or `$affinity` -`$waifus` `$waifulb` | Shows top 9 waifus. | `$waifus` -`$waifuinfo` `$waifustats` | Shows waifu stats for a target person. Defaults to you if no user is provided. | `$waifuinfo @MyCrush` or `$waifuinfo` -`$slotstats` | Shows the total stats of the slot command for this bot's session. **Bot Owner only.** | `$slotstats` -`$slottest` | Tests to see how much slots payout for X number of plays. **Bot Owner only.** | `$slottest 1000` -`$slot` | Play Nadeko slots. Max bet is 999. 3 seconds cooldown per user. | `$slot 5` -`$flip` | Flips coin(s) - heads or tails, and shows an image. | `$flip` or `$flip 3` -`$betflip` `$bf` | Bet to guess will the result be heads or tails. Guessing awards you 1.8x the currency you've bet. | `$bf 5 heads` or `$bf 3 t` -`$draw` | Draws a card from the deck.If you supply number X, she draws up to 5 cards from the deck. | `$draw` or `$draw 5` -`$shuffle` `$sh` | Reshuffles all cards back into the deck. | `$sh` -`$roll` | Rolls 0-100. If you supply a number [x] it rolls up to 30 normal dice. If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. Y can be a letter 'F' if you want to roll fate dice instead of dnd. | `$roll` or `$roll 7` or `$roll 3d5` or `$roll 5dF` -`$rolluo` | Rolls X normal dice (up to 30) unordered. If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. | `$rolluo` or `$rolluo 7` or `$rolluo 3d5` -`$nroll` | Rolls in a given range. | `$nroll 5` (rolls 0-5) or `$nroll 5-15` -`$startevent` | Starts one of the events seen on public nadeko. **Bot Owner only.** | `$startevent flowerreaction` -`$race` | Starts a new animal race. | `$race` -`$joinrace` `$jr` | Joins a new race. You can specify an amount of currency for betting (optional). You will get YourBet*(participants-1) back if you win. | `$jr` or `$jr 5` `$raffle` | Prints a name and ID of a random user from the online list from the (optional) role. | `$raffle` or `$raffle RoleName` `$cash` `$$$` | Check how much currency a person has. (Defaults to yourself) | `$$$` or `$$$ @SomeGuy` `$give` | Give someone a certain amount of currency. | `$give 1 "@SomeGuy"` @@ -150,36 +133,54 @@ Command and aliases | Description | Usage `$take` | Takes a certain amount of currency from someone. **Bot Owner only.** | `$take 1 "@someguy"` `$betroll` `$br` | Bets a certain amount of currency and rolls a dice. Rolling over 66 yields x2 of your currency, over 90 - x3 and 100 x10. | `$br 5` `$leaderboard` `$lb` | Displays bot currency leaderboard. | `$lb` +`$race` | Starts a new animal race. | `$race` +`$joinrace` `$jr` | Joins a new race. You can specify an amount of currency for betting (optional). You will get YourBet*(participants-1) back if you win. | `$jr` or `$jr 5` +`$startevent` | Starts one of the events seen on public nadeko. **Bot Owner only.** | `$startevent flowerreaction` +`$roll` | Rolls 0-100. If you supply a number [x] it rolls up to 30 normal dice. If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. Y can be a letter 'F' if you want to roll fate dice instead of dnd. | `$roll` or `$roll 7` or `$roll 3d5` or `$roll 5dF` +`$rolluo` | Rolls X normal dice (up to 30) unordered. If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. | `$rolluo` or `$rolluo 7` or `$rolluo 3d5` +`$nroll` | Rolls in a given range. | `$nroll 5` (rolls 0-5) or `$nroll 5-15` +`$draw` | Draws a card from the deck.If you supply number X, she draws up to 5 cards from the deck. | `$draw` or `$draw 5` +`$shuffle` `$sh` | Reshuffles all cards back into the deck. | `$sh` +`$flip` | Flips coin(s) - heads or tails, and shows an image. | `$flip` or `$flip 3` +`$betflip` `$bf` | Bet to guess will the result be heads or tails. Guessing awards you 1.95x the currency you've bet (rounded up). Multiplier can be changed by the bot owner. | `$bf 5 heads` or `$bf 3 t` +`$slotstats` | Shows the total stats of the slot command for this bot's session. **Bot Owner only.** | `$slotstats` +`$slottest` | Tests to see how much slots payout for X number of plays. **Bot Owner only.** | `$slottest 1000` +`$slot` | Play Nadeko slots. Max bet is 999. 3 seconds cooldown per user. | `$slot 5` +`$claimwaifu` `$claim` | Claim a waifu for yourself by spending currency. You must spend atleast 10% more than her current value unless she set `$affinity` towards you. | `$claim 50 @Himesama` +`$divorce` | Releases your claim on a specific waifu. You will get some of the money you've spent back unless that waifu has an affinity towards you. 6 hours cooldown. | `$divorce @CheatingSloot` +`$affinity` | Sets your affinity towards someone you want to be claimed by. Setting affinity will reduce their `$claim` on you by 20%. You can leave second argument empty to clear your affinity. 30 minutes cooldown. | `$affinity @MyHusband` or `$affinity` +`$waifus` `$waifulb` | Shows top 9 waifus. | `$waifus` +`$waifuinfo` `$waifustats` | Shows waifu stats for a target person. Defaults to you if no user is provided. | `$waifuinfo @MyCrush` or `$waifuinfo` ###### [Back to TOC](#table-of-contents) ### Games Command and aliases | Description | Usage ----------------|--------------|------- -`>trivia` `>t` | Starts a game of trivia. You can add nohint to prevent hints.First player to get to 10 points wins by default. You can specify a different number. 30 seconds per question. | `>t` or `>t 5 nohint` -`>tl` | Shows a current trivia leaderboard. | `>tl` -`>tq` | Quits current trivia after current question. | `>tq` -`>typestart` | Starts a typing contest. | `>typestart` -`>typestop` | Stops a typing contest on the current channel. | `>typestop` -`>typeadd` | Adds a new article to the typing contest. **Bot Owner only.** | `>typeadd wordswords` -`>typelist` | Lists added typing articles with their IDs. 15 per page. | `>typelist` or `>typelist 3` -`>typedel` | Deletes a typing article given the ID. **Bot Owner only.** | `>typedel 3` -`>poll` | Creates a poll which requires users to send the number of the voting option to the bot. **Requires ManageMessages server permission.** | `>poll Question?;Answer1;Answ 2;A_3` -`>publicpoll` `>ppoll` | Creates a public poll which requires users to type a number of the voting option in the channel command is ran in. **Requires ManageMessages server permission.** | `>ppoll Question?;Answer1;Answ 2;A_3` -`>pollstats` | Shows the poll results without stopping the poll on this server. **Requires ManageMessages server permission.** | `>pollstats` -`>pollend` | Stops active poll on this server and prints the results in this channel. **Requires ManageMessages server permission.** | `>pollend` -`>pick` | Picks the currency planted in this channel. 60 seconds cooldown. | `>pick` -`>plant` | Spend a unit of currency to plant it in this channel. (If bot is restarted or crashes, the currency will be lost) | `>plant` -`>gencurrency` `>gc` | Toggles currency generation on this channel. Every posted message will have chance to spawn currency. Chance is specified by the Bot Owner. (default is 2%) **Requires ManageMessages server permission.** | `>gc` -`>hangmanlist` | Shows a list of hangman term types. | `> hangmanlist` -`>hangman` | Starts a game of hangman in the channel. Use `>hangmanlist` to see a list of available term types. Defaults to 'all'. | `>hangman` or `>hangman movies` -`>cleverbot` | Toggles cleverbot session. When enabled, the bot will reply to messages starting with bot mention in the server. Custom reactions starting with %mention% won't work if cleverbot is enabled. **Requires ManageMessages server permission.** | `>cleverbot` -`>acrophobia` `>acro` | Starts an Acrophobia game. Second argment is optional round length in seconds. (default is 60) | `>acro` or `>acro 30` `>choose` | Chooses a thing from a list of things | `>choose Get up;Sleep;Sleep more` `>8ball` | Ask the 8ball a yes/no question. | `>8ball should I do something` `>rps` | Play a game of rocket paperclip scissors with Nadeko. | `>rps scissors` `>linux` | Prints a customizable Linux interjection | `>linux Spyware Windows` `>leet` | Converts a text to leetspeak with 6 (1-6) severity levels | `>leet 3 Hello` +`>acrophobia` `>acro` | Starts an Acrophobia game. Second argment is optional round length in seconds. (default is 60) | `>acro` or `>acro 30` +`>cleverbot` | Toggles cleverbot session. When enabled, the bot will reply to messages starting with bot mention in the server. Custom reactions starting with %mention% won't work if cleverbot is enabled. **Requires ManageMessages server permission.** | `>cleverbot` +`>hangmanlist` | Shows a list of hangman term types. | `> hangmanlist` +`>hangman` | Starts a game of hangman in the channel. Use `>hangmanlist` to see a list of available term types. Defaults to 'all'. | `>hangman` or `>hangman movies` +`>pick` | Picks the currency planted in this channel. 60 seconds cooldown. | `>pick` +`>plant` | Spend an amount of currency to plant it in this channel. Default is 1. (If bot is restarted or crashes, the currency will be lost) | `>plant` or `>plant 5` +`>gencurrency` `>gc` | Toggles currency generation on this channel. Every posted message will have chance to spawn currency. Chance is specified by the Bot Owner. (default is 2%) **Requires ManageMessages server permission.** | `>gc` +`>poll` | Creates a poll which requires users to send the number of the voting option to the bot. **Requires ManageMessages server permission.** | `>poll Question?;Answer1;Answ 2;A_3` +`>publicpoll` `>ppoll` | Creates a public poll which requires users to type a number of the voting option in the channel command is ran in. **Requires ManageMessages server permission.** | `>ppoll Question?;Answer1;Answ 2;A_3` +`>pollstats` | Shows the poll results without stopping the poll on this server. **Requires ManageMessages server permission.** | `>pollstats` +`>pollend` | Stops active poll on this server and prints the results in this channel. **Requires ManageMessages server permission.** | `>pollend` +`>typestart` | Starts a typing contest. | `>typestart` +`>typestop` | Stops a typing contest on the current channel. | `>typestop` +`>typeadd` | Adds a new article to the typing contest. **Bot Owner only.** | `>typeadd wordswords` +`>typelist` | Lists added typing articles with their IDs. 15 per page. | `>typelist` or `>typelist 3` +`>typedel` | Deletes a typing article given the ID. **Bot Owner only.** | `>typedel 3` +`>trivia` `>t` | Starts a game of trivia. You can add nohint to prevent hints.First player to get to 10 points wins by default. You can specify a different number. 30 seconds per question. | `>t` or `>t 5 nohint` +`>tl` | Shows a current trivia leaderboard. | `>tl` +`>tq` | Quits current trivia after current question. | `>tq` ###### [Back to TOC](#table-of-contents) @@ -227,6 +228,7 @@ Command and aliases | Description | Usage `!!deleteplaylist` `!!delpls` | Deletes a saved playlist. Only if you made it or if you are the bot owner. | `!!delpls animu-5` `!!goto` | Goes to a specific time in seconds in a song. | `!!goto 30` `!!autoplay` `!!ap` | Toggles autoplay - When the song is finished, automatically queue a related youtube song. (Works only for youtube songs and when queue is empty) | `!!ap` +`!!setmusicchannel` `!!smch` | Sets the current channel as the default music output channel. This will output playing, finished, paused and removed songs to that channel instead of the channel where the first song was queued in. **Requires ManageMessages server permission.** | `!!smch` ###### [Back to TOC](#table-of-contents) @@ -236,12 +238,12 @@ Command and aliases | Description | Usage `~hentai` | Shows a hentai image from a random website (gelbooru or danbooru or konachan or atfbooru or yandere) with a given tag. Tag is optional but preferred. Only 1 tag allowed. | `~hentai yuri` `~autohentai` | Posts a hentai every X seconds with a random tag from the provided tags. Use `|` to separate tags. 20 seconds minimum. Provide no arguments to disable. **Requires ManageMessages channel permission.** | `~autohentai 30 yuri|tail|long_hair` or `~autohentai` `~hentaibomb` | Shows a total 5 images (from gelbooru, danbooru, konachan, yandere and atfbooru). Tag is optional but preferred. | `~hentaibomb yuri` -`~danbooru` | Shows a random hentai image from danbooru with a given tag. Tag is optional but preferred. (multiple tags are appended with +) | `~danbooru yuri+kissing` `~yandere` | Shows a random image from yandere with a given tag. Tag is optional but preferred. (multiple tags are appended with +) | `~yandere tag1+tag2` `~konachan` | Shows a random hentai image from konachan with a given tag. Tag is optional but preferred. | `~konachan yuri` -`~gelbooru` | Shows a random hentai image from gelbooru with a given tag. Tag is optional but preferred. (multiple tags are appended with +) | `~gelbooru yuri+kissing` `~rule34` | Shows a random image from rule34.xx with a given tag. Tag is optional but preferred. (multiple tags are appended with +) | `~rule34 yuri+kissing` `~e621` | Shows a random hentai image from e621.net with a given tag. Tag is optional but preferred. Use spaces for multiple tags. | `~e621 yuri kissing` +`~danbooru` | Shows a random hentai image from danbooru with a given tag. Tag is optional but preferred. (multiple tags are appended with +) | `~danbooru yuri+kissing` +`~gelbooru` | Shows a random hentai image from gelbooru with a given tag. Tag is optional but preferred. (multiple tags are appended with +) | `~gelbooru yuri+kissing` `~cp` | We all know where this will lead you to. | `~cp` `~boobs` | Real adult content. | `~boobs` `~butts` `~ass` `~butt` | Real adult content. | `~butts` or `~ass` @@ -251,18 +253,6 @@ Command and aliases | Description | Usage ### Permissions Command and aliases | Description | Usage ----------------|--------------|------- -`;srvrfilterinv` `;sfi` | Toggles automatic deleting of invites posted in the server. Does not affect Bot Owner. | `;sfi` -`;chnlfilterinv` `;cfi` | Toggles automatic deleting of invites posted in the channel. Does not negate the ;srvrfilterinv enabled setting. Does not affect Bot Owner. | `;cfi` -`;srvrfilterwords` `;sfw` | Toggles automatic deleting of messages containing forbidden words on the server. Does not affect Bot Owner. | `;sfw` -`;chnlfilterwords` `;cfw` | Toggles automatic deleting of messages containing banned words on the channel. Does not negate the ;srvrfilterwords enabled setting. Does not affect bot owner. | `;cfw` -`;fw` | Adds or removes (if it exists) a word from the list of filtered words. Use`;sfw` or `;cfw` to toggle filtering. | `;fw poop` -`;lstfilterwords` `;lfw` | Shows a list of filtered words. | `;lfw` -`;cmdcosts` | Shows a list of command costs. Paginated with 9 command per page. | `;cmdcosts` or `;cmdcosts 2` -`;cmdcooldown` `;cmdcd` | Sets a cooldown per user for a command. Set to 0 to remove the cooldown. | `;cmdcd "some cmd" 5` -`;allcmdcooldowns` `;acmdcds` | Shows a list of all commands and their respective cooldowns. | `;acmdcds` -`;ubl` | Either [add]s or [rem]oves a user specified by a mention or ID from a blacklist. **Bot Owner only.** | `;ubl add @SomeUser` or `;ubl rem 12312312313` -`;cbl` | Either [add]s or [rem]oves a channel specified by an ID from a blacklist. **Bot Owner only.** | `;cbl rem 12312312312` -`;sbl` | Either [add]s or [rem]oves a server specified by a Name or ID from a blacklist. **Bot Owner only.** | `;sbl add 12312321312` or `;sbl rem SomeTrashServer` `;verbose` `;v` | Sets whether to show when a command/module is blocked. | `;verbose true` `;permrole` `;pr` | Sets a role which can change permissions. Or supply no parameters to find out the current one. Default one is 'Nadeko'. | `;pr role` `;listperms` `;lp` | Lists whole permission chain with their indexes. You can specify an optional page number if there are a lot of permissions. | `;lp` or `;lp 3` @@ -280,6 +270,18 @@ Command and aliases | Description | Usage `;allrolemdls` `;arm` | Enable or disable all modules for a specific role. | `;arm [enable/disable] MyRole` `;allusrmdls` `;aum` | Enable or disable all modules for a specific user. | `;aum enable @someone` `;allsrvrmdls` `;asm` | Enable or disable all modules for your server. | `;asm [enable/disable]` +`;ubl` | Either [add]s or [rem]oves a user specified by a mention or ID from a blacklist. **Bot Owner only.** | `;ubl add @SomeUser` or `;ubl rem 12312312313` +`;cbl` | Either [add]s or [rem]oves a channel specified by an ID from a blacklist. **Bot Owner only.** | `;cbl rem 12312312312` +`;sbl` | Either [add]s or [rem]oves a server specified by a Name or ID from a blacklist. **Bot Owner only.** | `;sbl add 12312321312` or `;sbl rem SomeTrashServer` +`;cmdcooldown` `;cmdcd` | Sets a cooldown per user for a command. Set to 0 to remove the cooldown. | `;cmdcd "some cmd" 5` +`;allcmdcooldowns` `;acmdcds` | Shows a list of all commands and their respective cooldowns. | `;acmdcds` +`;cmdcosts` | Shows a list of command costs. Paginated with 9 command per page. | `;cmdcosts` or `;cmdcosts 2` +`;srvrfilterinv` `;sfi` | Toggles automatic deleting of invites posted in the server. Does not affect Bot Owner. | `;sfi` +`;chnlfilterinv` `;cfi` | Toggles automatic deleting of invites posted in the channel. Does not negate the ;srvrfilterinv enabled setting. Does not affect Bot Owner. | `;cfi` +`;srvrfilterwords` `;sfw` | Toggles automatic deleting of messages containing forbidden words on the server. Does not affect Bot Owner. | `;sfw` +`;chnlfilterwords` `;cfw` | Toggles automatic deleting of messages containing banned words on the channel. Does not negate the ;srvrfilterwords enabled setting. Does not affect bot owner. | `;cfw` +`;fw` | Adds or removes (if it exists) a word from the list of filtered words. Use`;sfw` or `;cfw` to toggle filtering. | `;fw poop` +`;lstfilterwords` `;lfw` | Shows a list of filtered words. | `;lfw` ###### [Back to TOC](#table-of-contents) @@ -297,32 +299,6 @@ Command and aliases | Description | Usage ### Searches Command and aliases | Description | Usage ----------------|--------------|------- -`~xkcd` | Shows a XKCD comic. No arguments will retrieve random one. Number argument will retrieve a specific comic, and "latest" will get the latest one. | `~xkcd` or `~xkcd 1400` or `~xkcd latest` -`~translate` `~trans` | Translates from>to text. From the given language to the destination language. | `~trans en>fr Hello` -`~autotrans` `~at` | Starts automatic translation of all messages by users who set their `~atl` in this channel. You can set "del" argument to automatically delete all translated user messages. **Requires Administrator server permission.** **Bot Owner only.** | `~at` or `~at del` -`~autotranslang` `~atl` | `~atl en>fr` | Sets your source and target language to be used with `~at`. Specify no arguments to remove previously set value. -`~translangs` | Lists the valid languages for translation. | `~translangs` -`~hitbox` `~hb` | Notifies this channel when a certain user starts streaming. **Requires ManageMessages server permission.** | `~hitbox SomeStreamer` -`~twitch` `~tw` | Notifies this channel when a certain user starts streaming. **Requires ManageMessages server permission.** | `~twitch SomeStreamer` -`~beam` `~bm` | Notifies this channel when a certain user starts streaming. **Requires ManageMessages server permission.** | `~beam SomeStreamer` -`~liststreams` `~ls` | Lists all streams you are following on this server. | `~ls` -`~removestream` `~rms` | Removes notifications of a certain streamer from a certain platform on this channel. **Requires ManageMessages server permission.** | `~rms Twitch SomeGuy` or `~rms Beam SomeOtherGuy` -`~checkstream` `~cs` | Checks if a user is online on a certain streaming platform. | `~cs twitch MyFavStreamer` -`~pokemon` `~poke` | Searches for a pokemon. | `~poke Sylveon` -`~pokemonability` `~pokeab` | Searches for a pokemon ability. | `~pokeab overgrow` -`~placelist` | Shows the list of available tags for the `~place` command. | `~placelist` -`~place` | Shows a placeholder image of a given tag. Use `~placelist` to see all available tags. You can specify the width and height of the image as the last two optional arguments. | `~place Cage` or `~place steven 500 400` -`~overwatch` `~ow` | Show's basic stats on a player (competitive rank, playtime, level etc) Region codes are: `eu` `us` `cn` `kr` | `~ow us Battletag#1337` or `~overwatch eu Battletag#2016` -`~osu` | Shows osu stats for a player. | `~osu Name` or `~osu Name taiko` -`~osub` | Shows information about an osu beatmap. | `~osub https://osu.ppy.sh/s/127712` -`~osu5` | Displays a user's top 5 plays. | `~osu5 Name` -`~yomama` `~ym` | Shows a random joke from | `~ym` -`~randjoke` `~rj` | Shows a random joke from | `~rj` -`~chucknorris` `~cn` | Shows a random chucknorris joke from | `~cn` -`~wowjoke` | Get one of Kwoth's penultimate WoW jokes. | `~wowjoke` -`~magicitem` `~mi` | Shows a random magicitem from | `~mi` -`~anime` `~ani` `~aq` | Queries anilist for an anime and shows the first result. | `~ani aquarion evol` -`~manga` `~mang` `~mq` | Queries anilist for a manga and shows the first result. | `~mq Shingeki no kyojin` `~weather` `~we` | Shows weather data for a specified city. You can also specify a country after a comma. | `~we Moscow, RU` `~youtube` `~yt` | Searches youtubes and shows the first result | `~yt query` `~imdb` `~omdb` | Queries omdb for movies or series, show first result. | `~imdb Batman vs Superman` @@ -353,34 +329,40 @@ Command and aliases | Description | Usage `~lolban` | Shows top banned champions ordered by ban rate. | `~lolban` `~memelist` | Pulls a list of memes you can use with `~memegen` from http://memegen.link/templates/ | `~memelist` `~memegen` | Generates a meme from memelist with top and bottom text. | `~memegen biw "gets iced coffee" "in the winter"` +`~mal` | Shows basic info from myanimelist profile. | `~mal straysocks` +`~anime` `~ani` `~aq` | Queries anilist for an anime and shows the first result. | `~ani aquarion evol` +`~manga` `~mang` `~mq` | Queries anilist for a manga and shows the first result. | `~mq Shingeki no kyojin` +`~yomama` `~ym` | Shows a random joke from | `~ym` +`~randjoke` `~rj` | Shows a random joke from | `~rj` +`~chucknorris` `~cn` | Shows a random chucknorris joke from | `~cn` +`~wowjoke` | Get one of Kwoth's penultimate WoW jokes. | `~wowjoke` +`~magicitem` `~mi` | Shows a random magicitem from | `~mi` +`~osu` | Shows osu stats for a player. | `~osu Name` or `~osu Name taiko` +`~osub` | Shows information about an osu beatmap. | `~osub https://osu.ppy.sh/s/127712` +`~osu5` | Displays a user's top 5 plays. | `~osu5 Name` +`~overwatch` `~ow` | Show's basic stats on a player (competitive rank, playtime, level etc) Region codes are: `eu` `us` `cn` `kr` | `~ow us Battletag#1337` or `~overwatch eu Battletag#2016` +`~placelist` | Shows the list of available tags for the `~place` command. | `~placelist` +`~place` | Shows a placeholder image of a given tag. Use `~placelist` to see all available tags. You can specify the width and height of the image as the last two optional arguments. | `~place Cage` or `~place steven 500 400` +`~pokemon` `~poke` | Searches for a pokemon. | `~poke Sylveon` +`~pokemonability` `~pokeab` | Searches for a pokemon ability. | `~pokeab overgrow` +`~hitbox` `~hb` | Notifies this channel when a certain user starts streaming. **Requires ManageMessages server permission.** | `~hitbox SomeStreamer` +`~twitch` `~tw` | Notifies this channel when a certain user starts streaming. **Requires ManageMessages server permission.** | `~twitch SomeStreamer` +`~beam` `~bm` | Notifies this channel when a certain user starts streaming. **Requires ManageMessages server permission.** | `~beam SomeStreamer` +`~liststreams` `~ls` | Lists all streams you are following on this server. | `~ls` +`~removestream` `~rms` | Removes notifications of a certain streamer from a certain platform on this channel. **Requires ManageMessages server permission.** | `~rms Twitch SomeGuy` or `~rms Beam SomeOtherGuy` +`~checkstream` `~cs` | Checks if a user is online on a certain streaming platform. | `~cs twitch MyFavStreamer` +`~translate` `~trans` | Translates from>to text. From the given language to the destination language. | `~trans en>fr Hello` +`~autotrans` `~at` | Starts automatic translation of all messages by users who set their `~atl` in this channel. You can set "del" argument to automatically delete all translated user messages. **Requires Administrator server permission.** **Bot Owner only.** | `~at` or `~at del` +`~autotranslang` `~atl` | `~atl en>fr` | Sets your source and target language to be used with `~at`. Specify no arguments to remove previously set value. +`~translangs` | Lists the valid languages for translation. | `~translangs` +`~xkcd` | Shows a XKCD comic. No arguments will retrieve random one. Number argument will retrieve a specific comic, and "latest" will get the latest one. | `~xkcd` or `~xkcd 1400` or `~xkcd latest` ###### [Back to TOC](#table-of-contents) ### Utility Command and aliases | Description | Usage ----------------|--------------|------- -`.convertlist` | List of the convertible dimensions and currencies. | `.convertlist` -`.convert` | Convert quantities. Use `.convertlist` to see supported dimensions and currencies. | `.convert m km 1000` -`.remind` | Sends a message to you or a channel after certain amount of time. First argument is me/here/'channelname'. Second argument is time in a descending order (mo>w>d>h>m) example: 1w5d3h10m. Third argument is a (multiword)message. | `.remind me 1d5h Do something` or `.remind #general 1m Start now!` -`.remindtemplate` | Sets message for when the remind is triggered. Available placeholders are %user% - user who ran the command, %message% - Message specified in the remind, %target% - target channel of the remind. **Bot Owner only.** | `.remindtemplate %user%, do %message%!` -`.listquotes` `.liqu` | `.liqu` or `.liqu 3` | Lists all quotes on the server ordered alphabetically. 15 Per page. -`...` | Shows a random quote with a specified name. | `... abc` -`..` | Adds a new quote with the specified name and message. | `.. sayhi Hi` -`.deletequote` `.delq` | Deletes a random quote with the specified keyword. You have to either be server Administrator or the creator of the quote to delete it. | `.delq abc` -`.delallq` `.daq` | Deletes all quotes on a specified keyword. **Requires Administrator server permission.** | `.delallq kek` -`.repeatinvoke` `.repinv` | Immediately shows the repeat message on a certain index and restarts its timer. **Requires ManageMessages server permission.** | `.repinv 1` -`.repeatremove` `.reprm` | Removes a repeating message on a specified index. Use `.repeatlist` to see indexes. **Requires ManageMessages server permission.** | `.reprm 2` -`.repeat` | Repeat a message every X minutes in the current channel. You can have up to 5 repeating messages on the server in total. **Requires ManageMessages server permission.** | `.repeat 5 Hello there` -`.repeatlist` `.replst` | Shows currently repeating messages and their indexes. **Requires ManageMessages server permission.** | `.repeatlist` -`.serverinfo` `.sinfo` | Shows info about the server the bot is on. If no channel is supplied, it defaults to current one. | `.sinfo Some Server` -`.channelinfo` `.cinfo` | Shows info about the channel. If no channel is supplied, it defaults to current one. | `.cinfo #some-channel` -`.userinfo` `.uinfo` | Shows info about the user. If no user is supplied, it defaults a user running the command. | `.uinfo @SomeUser` -`.scsc` | Starts an instance of cross server channel. You will get a token as a DM that other people will use to tune in to the same instance. **Bot Owner only.** | `.scsc` -`.jcsc` | Joins current channel to an instance of cross server channel using the token. **Requires ManageServer server permission.** | `.jcsc TokenHere` -`.lcsc` | Leaves Cross server channel instance from this channel. **Requires ManageServer server permission.** | `.lcsc` -`.calculate` `.calc` | Evaluate a mathematical expression. | `.calc 1+1` -`.calcops` | Shows all available operations in .calc command | `.calcops` -`.rotaterolecolor` `.rrc` | Rotates a roles color on an interval with a list of supplied colors. First argument is interval in seconds (Minimum 60). Second argument is a role, followed by a space-separated list of colors in hex. Provide a rolename with a 0 interval to disable. **Bot Owner only.** | `.rrc 60 MyLsdRole #ff0000 #00ff00 #0000ff` or `.rrc 0 MyLsdRole` +`.rotaterolecolor` `.rrc` | Rotates a roles color on an interval with a list of supplied colors. First argument is interval in seconds (Minimum 60). Second argument is a role, followed by a space-separated list of colors in hex. Provide a rolename with a 0 interval to disable. **Requires ManageRoles server permission.** **Bot Owner only.** | `.rrc 60 MyLsdRole #ff0000 #00ff00 #0000ff` or `.rrc 0 MyLsdRole` `.togethertube` `.totube` | Creates a new room on and shows the link in the chat. | `.totube` `.whosplaying` `.whpl` | Shows a list of users who are playing the specified game. | `.whpl Overwatch` `.inrole` | Lists every person from the provided role or roles (separated by a ',') on this server. If the list is too long for 1 message, you must have Manage Messages permission. | `.inrole Role` @@ -396,3 +378,24 @@ Command and aliases | Description | Usage `.listservers` | Lists servers the bot is on with some basic info. 15 per page. **Bot Owner only.** | `.listservers 3` `.savechat` | Saves a number of messages to a text file and sends it to you. **Bot Owner only.** | `.savechat 150` `.activity` | Checks for spammers. **Bot Owner only.** | `.activity` +`.calculate` `.calc` | Evaluate a mathematical expression. | `.calc 1+1` +`.calcops` | Shows all available operations in .calc command | `.calcops` +`.scsc` | Starts an instance of cross server channel. You will get a token as a DM that other people will use to tune in to the same instance. **Bot Owner only.** | `.scsc` +`.jcsc` | Joins current channel to an instance of cross server channel using the token. **Requires ManageServer server permission.** | `.jcsc TokenHere` +`.lcsc` | Leaves Cross server channel instance from this channel. **Requires ManageServer server permission.** | `.lcsc` +`.serverinfo` `.sinfo` | Shows info about the server the bot is on. If no channel is supplied, it defaults to current one. | `.sinfo Some Server` +`.channelinfo` `.cinfo` | Shows info about the channel. If no channel is supplied, it defaults to current one. | `.cinfo #some-channel` +`.userinfo` `.uinfo` | Shows info about the user. If no user is supplied, it defaults a user running the command. | `.uinfo @SomeUser` +`.repeatinvoke` `.repinv` | Immediately shows the repeat message on a certain index and restarts its timer. **Requires ManageMessages server permission.** | `.repinv 1` +`.repeatremove` `.reprm` | Removes a repeating message on a specified index. Use `.repeatlist` to see indexes. **Requires ManageMessages server permission.** | `.reprm 2` +`.repeat` | Repeat a message every X minutes in the current channel. You can have up to 5 repeating messages on the server in total. **Requires ManageMessages server permission.** | `.repeat 5 Hello there` +`.repeatlist` `.replst` | Shows currently repeating messages and their indexes. **Requires ManageMessages server permission.** | `.repeatlist` +`.listquotes` `.liqu` | `.liqu` or `.liqu 3` | Lists all quotes on the server ordered alphabetically. 15 Per page. +`...` | Shows a random quote with a specified name. | `... abc` +`..` | Adds a new quote with the specified name and message. | `.. sayhi Hi` +`.deletequote` `.delq` | Deletes a random quote with the specified keyword. You have to either be server Administrator or the creator of the quote to delete it. | `.delq abc` +`.delallq` `.daq` | Deletes all quotes on a specified keyword. **Requires Administrator server permission.** | `.delallq kek` +`.remind` | Sends a message to you or a channel after certain amount of time. First argument is me/here/'channelname'. Second argument is time in a descending order (mo>w>d>h>m) example: 1w5d3h10m. Third argument is a (multiword)message. | `.remind me 1d5h Do something` or `.remind #general 1m Start now!` +`.remindtemplate` | Sets message for when the remind is triggered. Available placeholders are %user% - user who ran the command, %message% - Message specified in the remind, %target% - target channel of the remind. **Bot Owner only.** | `.remindtemplate %user%, do %message%!` +`.convertlist` | List of the convertible dimensions and currencies. | `.convertlist` +`.convert` | Convert quantities. Use `.convertlist` to see supported dimensions and currencies. | `.convert m km 1000` From 9d5c977b485fc76f2c4b030c210bfc95219556b4 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Fri, 3 Feb 2017 09:59:18 +0100 Subject: [PATCH 15/19] .reloadimages can be ran in DM now --- src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs b/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs index b2af48ab..e787b83a 100644 --- a/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs @@ -170,12 +170,9 @@ namespace NadekoBot.Modules.Administration } [NadekoCommand, Usage, Description, Aliases] - [RequireContext(ContextType.Guild)] [OwnerOnly] public async Task ReloadImages() { - var channel = (ITextChannel)Context.Channel; - var msg = await Context.Channel.SendMessageAsync("Reloading Images...").ConfigureAwait(false); var sw = Stopwatch.StartNew(); await NadekoBot.Images.Reload().ConfigureAwait(false); From 8791bc55f508523f04406801db8fa47051b0988f Mon Sep 17 00:00:00 2001 From: Kwoth Date: Fri, 3 Feb 2017 10:01:29 +0100 Subject: [PATCH 16/19] Just a bit better formatting. --- .../Modules/Administration/Commands/SelfCommands.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs b/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs index e787b83a..137fa10c 100644 --- a/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs @@ -173,14 +173,10 @@ namespace NadekoBot.Modules.Administration [OwnerOnly] public async Task ReloadImages() { - var msg = await Context.Channel.SendMessageAsync("Reloading Images...").ConfigureAwait(false); var sw = Stopwatch.StartNew(); await NadekoBot.Images.Reload().ConfigureAwait(false); sw.Stop(); - await msg.ModifyAsync(x => - { - x.Content = "✅ Images reloaded."; - }).ConfigureAwait(false); + await Context.Channel.SendConfirmAsync("Images Reloaded").ConfigureAwait(false); } private static UserStatus SettableUserStatusToUserStatus(SettableUserStatus sus) From f850d62c89d9051ad5342d0928c2e4bc4f23cc1c Mon Sep 17 00:00:00 2001 From: Kwoth Date: Fri, 3 Feb 2017 11:36:58 +0100 Subject: [PATCH 17/19] sneaky game will say a number of rewarded users at the end --- .../Modules/Gambling/Commands/CurrencyEvents.cs | 4 +++- .../Games/Commands/PlantAndPickCommands.cs | 2 +- src/NadekoBot/Services/IImagesService.cs | 3 ++- src/NadekoBot/Services/Impl/ImagesService.cs | 17 ++++++++++++----- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/NadekoBot/Modules/Gambling/Commands/CurrencyEvents.cs b/src/NadekoBot/Modules/Gambling/Commands/CurrencyEvents.cs index 927f8a72..bea309af 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/CurrencyEvents.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/CurrencyEvents.cs @@ -78,6 +78,7 @@ namespace NadekoBot.Modules.Gambling _secretCode += _sneakyGameStatusChars[rng.Next(0, _sneakyGameStatusChars.Length)]; } + var game = NadekoBot.Client.Game?.Name; await NadekoBot.Client.SetGameAsync($"type {_secretCode} for " + NadekoBot.BotConfig.CurrencyPluralName) .ConfigureAwait(false); try @@ -94,10 +95,11 @@ namespace NadekoBot.Modules.Gambling await Task.Delay(num * 1000); NadekoBot.Client.MessageReceived -= SneakyGameMessageReceivedEventHandler; + var cnt = _sneakyGameAwardedUsers.Count; _sneakyGameAwardedUsers.Clear(); _secretCode = String.Empty; - await NadekoBot.Client.SetGameAsync($"SneakyGame event ended.") + await NadekoBot.Client.SetGameAsync($"SneakyGame event ended. {cnt} users received a reward.") .ConfigureAwait(false); } diff --git a/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs b/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs index ab40b511..0ae16be6 100644 --- a/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs @@ -231,7 +231,7 @@ namespace NadekoBot.Modules.Games private static Tuple GetRandomCurrencyImage() { var rng = new NadekoRandom(); - var images = NadekoBot.Images.CurrencyImages; + var images = NadekoBot.Images.Currency; return images[rng.Next(0, images.Count)]; } diff --git a/src/NadekoBot/Services/IImagesService.cs b/src/NadekoBot/Services/IImagesService.cs index 192ee842..7d98cd06 100644 --- a/src/NadekoBot/Services/IImagesService.cs +++ b/src/NadekoBot/Services/IImagesService.cs @@ -13,7 +13,8 @@ namespace NadekoBot.Services Stream Heads { get; } Stream Tails { get; } - IImmutableList> CurrencyImages { get; } + IImmutableList> Currency { get; } + IImmutableList> Dice { get; } Task Reload(); } diff --git a/src/NadekoBot/Services/Impl/ImagesService.cs b/src/NadekoBot/Services/Impl/ImagesService.cs index f63e2eb5..80898dc1 100644 --- a/src/NadekoBot/Services/Impl/ImagesService.cs +++ b/src/NadekoBot/Services/Impl/ImagesService.cs @@ -19,16 +19,22 @@ namespace NadekoBot.Services.Impl private const string tailsPath = "data/images/coins/tails.png"; private const string currencyImagesPath = "data/currency_images"; + private const string diceImagesPath = "data/images/dice"; private byte[] heads; public Stream Heads => new MemoryStream(heads, false); private byte[] tails; public Stream Tails => new MemoryStream(tails, false); - //todo tuple - private IReadOnlyDictionary currencyImages; - public IImmutableList> CurrencyImages => - currencyImages.Select(x => new Tuple(x.Key, (Stream)new MemoryStream(x.Value, false))) + //todo C#7 + private IReadOnlyDictionary currency; + public IImmutableList> Currency => + currency.Select(x => new Tuple(x.Key, new MemoryStream(x.Value, false))) + .ToImmutableArray(); + + private IReadOnlyDictionary dice; + public IImmutableList> Dice => + dice.Select(x => new Tuple(x.Key, new MemoryStream(x.Value, false))) .ToImmutableArray(); private ImagesService() @@ -52,7 +58,8 @@ namespace NadekoBot.Services.Impl heads = File.ReadAllBytes(headsPath); tails = File.ReadAllBytes(tailsPath); - currencyImages = Directory.GetFiles(currencyImagesPath).ToDictionary(x => Path.GetFileName(x), x => File.ReadAllBytes(x)); + currency = Directory.GetFiles(currencyImagesPath).ToDictionary(x => Path.GetFileName(x), x => File.ReadAllBytes(x)); + dice = Directory.GetFiles(diceImagesPath).ToDictionary(x => Path.GetFileName(x), x => File.ReadAllBytes(x)); _log.Info($"Images loaded after {sw.Elapsed.TotalSeconds:F2}s!"); } catch (Exception ex) From 5fba2de3a6da273ec5cadbe073e06ae0675c6b8d Mon Sep 17 00:00:00 2001 From: Kwoth Date: Sat, 4 Feb 2017 06:44:27 +0100 Subject: [PATCH 18/19] Don't download users. --- src/NadekoBot/NadekoBot.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NadekoBot/NadekoBot.cs b/src/NadekoBot/NadekoBot.cs index a32abc73..49d0d5c4 100644 --- a/src/NadekoBot/NadekoBot.cs +++ b/src/NadekoBot/NadekoBot.cs @@ -70,7 +70,7 @@ namespace NadekoBot TotalShards = Credentials.TotalShards, ConnectionTimeout = int.MaxValue, #if !GLOBAL_NADEKO - AlwaysDownloadUsers = true, + //AlwaysDownloadUsers = true, #endif }); From d39e544567c9bc5d3c85fff121d6310a4af9e597 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Sat, 4 Feb 2017 09:34:51 +0100 Subject: [PATCH 19/19] Images service almost done. Slots images moved to /data/images/slots currency_images renamed to currency and moved to data/images/ --- .../DataStructures/DisposableImutableList.cs | 82 ++++++++++++++++++ .../Administration/Commands/SelfCommands.cs | 6 +- .../Gambling/Commands/DiceRollCommand.cs | 42 ++++----- .../Gambling/Commands/FlipCoinCommand.cs | 38 +++++--- .../Modules/Gambling/Commands/Slots.cs | 60 +++---------- .../Games/Commands/PlantAndPickCommands.cs | 33 +++---- src/NadekoBot/Services/IImagesService.cs | 17 ++-- src/NadekoBot/Services/Impl/ImagesService.cs | 71 ++++++++++----- src/NadekoBot/_Extensions/Extensions.cs | 5 +- .../currency}/img1.jpg | Bin .../currency}/img2.jpg | Bin .../currency}/img3.jpg | Bin .../data/{ => images}/slots/background.png | Bin .../data/{ => images}/slots/emojis/0.png | Bin .../data/{ => images}/slots/emojis/1.png | Bin .../data/{ => images}/slots/emojis/2.png | Bin .../data/{ => images}/slots/emojis/3.png | Bin .../data/{ => images}/slots/emojis/4.png | Bin .../data/{ => images}/slots/emojis/5.png | Bin .../{slots => images/slots/numbers}/0.png | Bin .../{slots => images/slots/numbers}/1.png | Bin .../{slots => images/slots/numbers}/2.png | Bin .../{slots => images/slots/numbers}/3.png | Bin .../{slots => images/slots/numbers}/4.png | Bin .../{slots => images/slots/numbers}/5.png | Bin .../{slots => images/slots/numbers}/6.png | Bin .../{slots => images/slots/numbers}/7.png | Bin .../{slots => images/slots/numbers}/8.png | Bin .../{slots => images/slots/numbers}/9.png | Bin 29 files changed, 228 insertions(+), 126 deletions(-) create mode 100644 src/NadekoBot/DataStructures/DisposableImutableList.cs rename src/NadekoBot/data/{currency_images => images/currency}/img1.jpg (100%) rename src/NadekoBot/data/{currency_images => images/currency}/img2.jpg (100%) rename src/NadekoBot/data/{currency_images => images/currency}/img3.jpg (100%) rename src/NadekoBot/data/{ => images}/slots/background.png (100%) rename src/NadekoBot/data/{ => images}/slots/emojis/0.png (100%) rename src/NadekoBot/data/{ => images}/slots/emojis/1.png (100%) rename src/NadekoBot/data/{ => images}/slots/emojis/2.png (100%) rename src/NadekoBot/data/{ => images}/slots/emojis/3.png (100%) rename src/NadekoBot/data/{ => images}/slots/emojis/4.png (100%) rename src/NadekoBot/data/{ => images}/slots/emojis/5.png (100%) rename src/NadekoBot/data/{slots => images/slots/numbers}/0.png (100%) rename src/NadekoBot/data/{slots => images/slots/numbers}/1.png (100%) rename src/NadekoBot/data/{slots => images/slots/numbers}/2.png (100%) rename src/NadekoBot/data/{slots => images/slots/numbers}/3.png (100%) rename src/NadekoBot/data/{slots => images/slots/numbers}/4.png (100%) rename src/NadekoBot/data/{slots => images/slots/numbers}/5.png (100%) rename src/NadekoBot/data/{slots => images/slots/numbers}/6.png (100%) rename src/NadekoBot/data/{slots => images/slots/numbers}/7.png (100%) rename src/NadekoBot/data/{slots => images/slots/numbers}/8.png (100%) rename src/NadekoBot/data/{slots => images/slots/numbers}/9.png (100%) diff --git a/src/NadekoBot/DataStructures/DisposableImutableList.cs b/src/NadekoBot/DataStructures/DisposableImutableList.cs new file mode 100644 index 00000000..71bda6de --- /dev/null +++ b/src/NadekoBot/DataStructures/DisposableImutableList.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.DataStructures +{ + + public static class DisposableReadOnlyListExtensions + { + public static IDisposableReadOnlyList AsDisposable(this IReadOnlyList arr) where T : IDisposable + => new DisposableReadOnlyList(arr); + + public static IDisposableReadOnlyList> AsDisposable(this IReadOnlyList> arr) where TValue : IDisposable + => new DisposableReadOnlyList(arr); + } + + public interface IDisposableReadOnlyList : IReadOnlyList, IDisposable + { + } + + public class DisposableReadOnlyList : IDisposableReadOnlyList + where T : IDisposable + { + private readonly IReadOnlyList _arr; + + public int Count => _arr.Count; + + public T this[int index] => _arr[index]; + + public DisposableReadOnlyList(IReadOnlyList arr) + { + this._arr = arr; + } + + public IEnumerator GetEnumerator() + => _arr.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() + => _arr.GetEnumerator(); + + public void Dispose() + { + foreach (var item in _arr) + { + item.Dispose(); + } + } + } + + public class DisposableReadOnlyList : IDisposableReadOnlyList> + where U : IDisposable + { + private readonly IReadOnlyList> _arr; + + public int Count => _arr.Count; + + KeyValuePair IReadOnlyList>.this[int index] => _arr[index]; + + public DisposableReadOnlyList(IReadOnlyList> arr) + { + this._arr = arr; + } + + public IEnumerator> GetEnumerator() => + _arr.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => + _arr.GetEnumerator(); + + public void Dispose() + { + foreach (var item in _arr) + { + item.Value.Dispose(); + } + } + } +} diff --git a/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs b/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs index 137fa10c..80356f73 100644 --- a/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs @@ -173,10 +173,8 @@ namespace NadekoBot.Modules.Administration [OwnerOnly] public async Task ReloadImages() { - var sw = Stopwatch.StartNew(); - await NadekoBot.Images.Reload().ConfigureAwait(false); - sw.Stop(); - await Context.Channel.SendConfirmAsync("Images Reloaded").ConfigureAwait(false); + var time = await NadekoBot.Images.Reload().ConfigureAwait(false); + await Context.Channel.SendConfirmAsync($"Images loaded after {time.TotalSeconds:F3}s!").ConfigureAwait(false); } private static UserStatus SettableUserStatusToUserStatus(SettableUserStatus sus) diff --git a/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs b/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs index 01283c83..4616aa91 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs @@ -34,15 +34,11 @@ namespace NadekoBot.Modules.Gambling var num2 = gen % 10; var imageStream = await Task.Run(() => { - try - { - var ms = new MemoryStream(); - new[] { GetDice(num1), GetDice(num2) }.Merge().SaveAsPng(ms); - ms.Position = 0; - return ms; - } - catch { return new MemoryStream(); } - }); + var ms = new MemoryStream(); + new[] { GetDice(num1), GetDice(num2) }.Merge().SaveAsPng(ms); + ms.Position = 0; + return ms; + }).ConfigureAwait(false); await Context.Channel.SendFileAsync(imageStream, "dice.png", $"{Context.User.Mention} rolled " + Format.Code(gen.ToString())).ConfigureAwait(false); } @@ -82,7 +78,7 @@ namespace NadekoBot.Modules.Gambling await InternallDndRoll(arg, false).ConfigureAwait(false); } - private async Task InternalRoll( int num, bool ordered) + private async Task InternalRoll(int num, bool ordered) { if (num < 1 || num > 30) { @@ -209,20 +205,24 @@ namespace NadekoBot.Modules.Gambling private Image GetDice(int num) { - const string pathToImage = "data/images/dice"; - if (num != 10) + if (num < 0 || num > 10) + throw new ArgumentOutOfRangeException(nameof(num)); + + if (num == 10) { - using (var stream = File.OpenRead(Path.Combine(pathToImage, $"{num}.png"))) - return new Image(stream); + var images = NadekoBot.Images.Dice; + using (var imgOneStream = images[1].Value.ToStream()) + using (var imgZeroStream = images[0].Value.ToStream()) + { + Image imgOne = new Image(imgOneStream); + Image imgZero = new Image(imgZeroStream); + + return new[] { imgOne, imgZero }.Merge(); + } } - - using (var one = File.OpenRead(Path.Combine(pathToImage, "1.png"))) - using (var zero = File.OpenRead(Path.Combine(pathToImage, "0.png"))) + using (var die = NadekoBot.Images.Dice[num].Value.ToStream()) { - Image imgOne = new Image(one); - Image imgZero = new Image(zero); - - return new[] { imgOne, imgZero }.Merge(); + return new Image(die); } } } diff --git a/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs b/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs index 74e201c0..6ccfe786 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs @@ -5,6 +5,7 @@ using NadekoBot.Attributes; using NadekoBot.Extensions; using NadekoBot.Services; using System; +using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Image = ImageSharp.Image; @@ -32,9 +33,19 @@ namespace NadekoBot.Modules.Gambling if (count == 1) { if (rng.Next(0, 2) == 1) - await Context.Channel.SendFileAsync(_images.Heads, "heads.jpg", $"{Context.User.Mention} flipped " + Format.Code("Heads") + ".").ConfigureAwait(false); + { + using (var heads = _images.Heads.ToStream()) + { + await Context.Channel.SendFileAsync(heads, "heads.jpg", $"{Context.User.Mention} flipped " + Format.Code("Heads") + ".").ConfigureAwait(false); + } + } else - await Context.Channel.SendFileAsync(_images.Tails, "tails.jpg", $"{Context.User.Mention} flipped " + Format.Code("Tails") + ".").ConfigureAwait(false); + { + using (var tails = _images.Tails.ToStream()) + { + await Context.Channel.SendFileAsync(tails, "tails.jpg", $"{Context.User.Mention} flipped " + Format.Code("Tails") + ".").ConfigureAwait(false); + } + } return; } if (count > 10 || count < 1) @@ -43,13 +54,17 @@ namespace NadekoBot.Modules.Gambling return; } var imgs = new Image[count]; - for (var i = 0; i < count; i++) + using (var heads = _images.Heads.ToStream()) + using(var tails = _images.Tails.ToStream()) { - imgs[i] = rng.Next(0, 10) < 5 ? - new Image(_images.Heads) : - new Image(_images.Tails); + for (var i = 0; i < count; i++) + { + imgs[i] = rng.Next(0, 10) < 5 ? + new Image(heads) : + new Image(tails); + } + await Context.Channel.SendFileAsync(imgs.Merge().ToStream(), $"{count} coins.png").ConfigureAwait(false); } - await Context.Channel.SendFileAsync(imgs.Merge().ToStream(), $"{count} coins.png").ConfigureAwait(false); } [NadekoCommand, Usage, Description, Aliases] @@ -74,9 +89,10 @@ namespace NadekoBot.Modules.Gambling //heads = true //tails = false + //todo this seems stinky, no time to look at it right now var isHeads = guessStr == "HEADS" || guessStr == "H"; bool result = false; - Stream imageToSend; + IEnumerable imageToSend; if (rng.Next(0, 2) == 1) { imageToSend = _images.Heads; @@ -98,8 +114,10 @@ namespace NadekoBot.Modules.Gambling { str = $"{Context.User.Mention}`Better luck next time.`"; } - - await Context.Channel.SendFileAsync(imageToSend, "result.png", str).ConfigureAwait(false); + using (var toSend = imageToSend.ToStream()) + { + await Context.Channel.SendFileAsync(toSend, "result.png", str).ConfigureAwait(false); + } } } } diff --git a/src/NadekoBot/Modules/Gambling/Commands/Slots.cs b/src/NadekoBot/Modules/Gambling/Commands/Slots.cs index e1671a6d..445d6c48 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/Slots.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/Slots.cs @@ -21,52 +21,19 @@ namespace NadekoBot.Modules.Gambling private static int totalBet = 0; private static int totalPaidOut = 0; - private const string backgroundPath = "data/slots/background.png"; - - private static readonly byte[] backgroundBuffer; - private static readonly byte[][] numbersBuffer = new byte[10][]; - private static readonly byte[][] emojiBuffer; - const int alphaCutOut = byte.MaxValue / 3; - static Slots() - { - backgroundBuffer = File.ReadAllBytes(backgroundPath); - - for (int i = 0; i < 10; i++) - { - numbersBuffer[i] = File.ReadAllBytes("data/slots/" + i + ".png"); - } - int throwaway; - var emojiFiles = Directory.GetFiles("data/slots/emojis/", "*.png") - .Where(f => int.TryParse(Path.GetFileNameWithoutExtension(f), out throwaway)) - .OrderBy(f => int.Parse(Path.GetFileNameWithoutExtension(f))) - .ToArray(); - - emojiBuffer = new byte[emojiFiles.Length][]; - for (int i = 0; i < emojiFiles.Length; i++) - { - emojiBuffer[i] = File.ReadAllBytes(emojiFiles[i]); - } - } - - - private static MemoryStream InternalGetStream(string path) - { - var ms = new MemoryStream(); - using (var fs = File.Open(path, FileMode.Open)) - { - fs.CopyTo(ms); - fs.Flush(); - } - ms.Position = 0; - return ms; - } - //here is a payout chart //https://lh6.googleusercontent.com/-i1hjAJy_kN4/UswKxmhrbPI/AAAAAAAAB1U/82wq_4ZZc-Y/DE6B0895-6FC1-48BE-AC4F-14D1B91AB75B.jpg //thanks to judge for helping me with this + private readonly IImagesService _images; + + public Slots() + { + this._images = NadekoBot.Images; + } + public class SlotMachine { public const int MaxValue = 5; @@ -154,7 +121,7 @@ namespace NadekoBot.Modules.Gambling var sb = new StringBuilder(); const int bet = 1; int payout = 0; - foreach (var key in dict.Keys.OrderByDescending(x=>x)) + foreach (var key in dict.Keys.OrderByDescending(x => x)) { sb.AppendLine($"x{key} occured {dict[key]} times. {dict[key] * 1.0f / tests * 100}%"); payout += key * dict[key]; @@ -164,6 +131,7 @@ namespace NadekoBot.Modules.Gambling } static HashSet runningUsers = new HashSet(); + [NadekoCommand, Usage, Description, Aliases] public async Task Slot(int amount = 0) { @@ -189,7 +157,7 @@ namespace NadekoBot.Modules.Gambling return; } Interlocked.Add(ref totalBet, amount); - using (var bgFileStream = new MemoryStream(backgroundBuffer)) + using (var bgFileStream = NadekoBot.Images.SlotBackground.ToStream()) { var bgImage = new ImageSharp.Image(bgFileStream); @@ -199,7 +167,7 @@ namespace NadekoBot.Modules.Gambling { for (int i = 0; i < 3; i++) { - using (var file = new MemoryStream(emojiBuffer[numbers[i]])) + using (var file = _images.SlotEmojis[numbers[i]].ToStream()) { var randomImage = new ImageSharp.Image(file); using (var toAdd = randomImage.Lock()) @@ -226,7 +194,7 @@ namespace NadekoBot.Modules.Gambling do { var digit = printWon % 10; - using (var fs = new MemoryStream(numbersBuffer[digit])) + using (var fs = NadekoBot.Images.SlotNumbers[digit].ToStream()) { var img = new ImageSharp.Image(fs); using (var pixels = img.Lock()) @@ -251,7 +219,7 @@ namespace NadekoBot.Modules.Gambling do { var digit = printAmount % 10; - using (var fs = new MemoryStream(numbersBuffer[digit])) + using (var fs = _images.SlotNumbers[digit].ToStream()) { var img = new ImageSharp.Image(fs); using (var pixels = img.Lock()) @@ -301,4 +269,4 @@ namespace NadekoBot.Modules.Gambling } } } -} +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs b/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs index 0ae16be6..1c8671f8 100644 --- a/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs @@ -10,6 +10,7 @@ using NLog; using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics; using System.IO; using System.Linq; @@ -97,13 +98,16 @@ namespace NadekoBot.Modules.Games firstPart = $"{dropAmount} random { NadekoBot.BotConfig.CurrencyPluralName } appeared!"; } var file = GetRandomCurrencyImage(); - var sent = await channel.SendFileAsync( - file.Item2, - file.Item1, - $"❗ {firstPart} Pick it up by typing `{NadekoBot.ModulePrefixes[typeof(Games).Name]}pick`") - .ConfigureAwait(false); + using (var fileStream = file.Value.ToStream()) + { + var sent = await channel.SendFileAsync( + fileStream, + file.Key, + $"❗ {firstPart} Pick it up by typing `{NadekoBot.ModulePrefixes[typeof(Games).Name]}pick`") + .ConfigureAwait(false); - msgs[0] = sent; + msgs[0] = sent; + } plantedFlowers.AddOrUpdate(channel.Id, msgs.ToList(), (id, old) => { old.AddRange(msgs); return old; }); } @@ -167,18 +171,15 @@ namespace NadekoBot.Modules.Games return; } - var file = GetRandomCurrencyImage(); - IUserMessage msg; + var imgData = GetRandomCurrencyImage(); var vowelFirst = new[] { 'a', 'e', 'i', 'o', 'u' }.Contains(NadekoBot.BotConfig.CurrencyName[0]); var msgToSend = $"Oh how Nice! **{Context.User.Username}** planted {(amount == 1 ? (vowelFirst ? "an" : "a") : amount.ToString())} {(amount > 1 ? NadekoBot.BotConfig.CurrencyPluralName : NadekoBot.BotConfig.CurrencyName)}. Pick it using {NadekoBot.ModulePrefixes[typeof(Games).Name]}pick"; - if (file == null) + + IUserMessage msg; + using (var toSend = imgData.Value.ToStream()) { - msg = await Context.Channel.SendConfirmAsync(NadekoBot.BotConfig.CurrencySign).ConfigureAwait(false); - } - else - { - msg = await Context.Channel.SendFileAsync(file.Item2, file.Item1, msgToSend).ConfigureAwait(false); + msg = await Context.Channel.SendFileAsync(toSend, imgData.Key, msgToSend).ConfigureAwait(false); } var msgs = new IUserMessage[amount]; @@ -228,12 +229,12 @@ namespace NadekoBot.Modules.Games } } - private static Tuple GetRandomCurrencyImage() + private static KeyValuePair> GetRandomCurrencyImage() { var rng = new NadekoRandom(); var images = NadekoBot.Images.Currency; - return images[rng.Next(0, images.Count)]; + return images[rng.Next(0, images.Length)]; } int GetRandomNumber() diff --git a/src/NadekoBot/Services/IImagesService.cs b/src/NadekoBot/Services/IImagesService.cs index 7d98cd06..81e21907 100644 --- a/src/NadekoBot/Services/IImagesService.cs +++ b/src/NadekoBot/Services/IImagesService.cs @@ -1,4 +1,5 @@ -using System; +using NadekoBot.DataStructures; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.IO; @@ -10,12 +11,16 @@ namespace NadekoBot.Services { public interface IImagesService { - Stream Heads { get; } - Stream Tails { get; } + ImmutableArray Heads { get; } + ImmutableArray Tails { get; } - IImmutableList> Currency { get; } - IImmutableList> Dice { get; } + ImmutableArray>> Currency { get; } + ImmutableArray>> Dice { get; } - Task Reload(); + ImmutableArray SlotBackground { get; } + ImmutableArray> SlotEmojis { get; } + ImmutableArray> SlotNumbers { get; } + + Task Reload(); } } diff --git a/src/NadekoBot/Services/Impl/ImagesService.cs b/src/NadekoBot/Services/Impl/ImagesService.cs index 80898dc1..02bcb1cd 100644 --- a/src/NadekoBot/Services/Impl/ImagesService.cs +++ b/src/NadekoBot/Services/Impl/ImagesService.cs @@ -1,4 +1,5 @@ -using NLog; +using NadekoBot.DataStructures; +using NLog; using System; using System.Collections.Generic; using System.Collections.Immutable; @@ -15,27 +16,30 @@ namespace NadekoBot.Services.Impl { private readonly Logger _log; - private const string headsPath = "data/images/coins/heads.png"; - private const string tailsPath = "data/images/coins/tails.png"; + private const string basePath = "data/images/"; - private const string currencyImagesPath = "data/currency_images"; - private const string diceImagesPath = "data/images/dice"; + private const string headsPath = basePath + "coins/heads.png"; + private const string tailsPath = basePath + "coins/tails.png"; - private byte[] heads; - public Stream Heads => new MemoryStream(heads, false); + private const string currencyImagesPath = basePath + "currency"; + private const string diceImagesPath = basePath + "dice"; + + private const string slotBackgroundPath = basePath + "slots/background.png"; + private const string slotNumbersPath = basePath + "slots/numbers/"; + private const string slotEmojisPath = basePath + "slots/emojis/"; + + + public ImmutableArray Heads { get; private set; } + public ImmutableArray Tails { get; private set; } - private byte[] tails; - public Stream Tails => new MemoryStream(tails, false); //todo C#7 - private IReadOnlyDictionary currency; - public IImmutableList> Currency => - currency.Select(x => new Tuple(x.Key, new MemoryStream(x.Value, false))) - .ToImmutableArray(); + public ImmutableArray>> Currency { get; private set; } - private IReadOnlyDictionary dice; - public IImmutableList> Dice => - dice.Select(x => new Tuple(x.Key, new MemoryStream(x.Value, false))) - .ToImmutableArray(); + public ImmutableArray>> Dice { get; private set; } + + public ImmutableArray SlotBackground { get; private set; } + public ImmutableArray> SlotNumbers { get; private set; } + public ImmutableArray> SlotEmojis { get; private set; } private ImagesService() { @@ -49,18 +53,41 @@ namespace NadekoBot.Services.Impl return srvc; } - public Task Reload() => Task.Run(() => + public Task Reload() => Task.Run(() => { try { _log.Info("Loading images..."); var sw = Stopwatch.StartNew(); - heads = File.ReadAllBytes(headsPath); - tails = File.ReadAllBytes(tailsPath); + Heads = File.ReadAllBytes(headsPath).ToImmutableArray(); + Tails = File.ReadAllBytes(tailsPath).ToImmutableArray(); - currency = Directory.GetFiles(currencyImagesPath).ToDictionary(x => Path.GetFileName(x), x => File.ReadAllBytes(x)); - dice = Directory.GetFiles(diceImagesPath).ToDictionary(x => Path.GetFileName(x), x => File.ReadAllBytes(x)); + Currency = Directory.GetFiles(currencyImagesPath) + .Select(x => new KeyValuePair>( + Path.GetFileName(x), + File.ReadAllBytes(x).ToImmutableArray())) + .ToImmutableArray(); + + Dice = Directory.GetFiles(diceImagesPath) + .OrderBy(x => int.Parse(Path.GetFileNameWithoutExtension(x))) + .Select(x => new KeyValuePair>(x, + File.ReadAllBytes(x).ToImmutableArray())) + .ToImmutableArray(); + + SlotBackground = File.ReadAllBytes(slotBackgroundPath).ToImmutableArray(); + + SlotNumbers = Directory.GetFiles(slotNumbersPath) + .OrderBy(f => int.Parse(Path.GetFileNameWithoutExtension(f))) + .Select(x => File.ReadAllBytes(x).ToImmutableArray()) + .ToImmutableArray(); + + SlotEmojis = Directory.GetFiles(slotEmojisPath) + .Select(x => File.ReadAllBytes(x).ToImmutableArray()) + .ToImmutableArray(); + + sw.Stop(); _log.Info($"Images loaded after {sw.Elapsed.TotalSeconds:F2}s!"); + return sw.Elapsed; } catch (Exception ex) { diff --git a/src/NadekoBot/_Extensions/Extensions.cs b/src/NadekoBot/_Extensions/Extensions.cs index 56479a6f..4c32a542 100644 --- a/src/NadekoBot/_Extensions/Extensions.cs +++ b/src/NadekoBot/_Extensions/Extensions.cs @@ -20,7 +20,10 @@ namespace NadekoBot.Extensions { private const string arrow_left = "⬅"; private const string arrow_right = "➡"; - + + public static Stream ToStream(this IEnumerable bytes, bool canWrite = false) + => new MemoryStream(bytes as byte[] ?? bytes.ToArray(), canWrite); + /// /// danny kamisama /// diff --git a/src/NadekoBot/data/currency_images/img1.jpg b/src/NadekoBot/data/images/currency/img1.jpg similarity index 100% rename from src/NadekoBot/data/currency_images/img1.jpg rename to src/NadekoBot/data/images/currency/img1.jpg diff --git a/src/NadekoBot/data/currency_images/img2.jpg b/src/NadekoBot/data/images/currency/img2.jpg similarity index 100% rename from src/NadekoBot/data/currency_images/img2.jpg rename to src/NadekoBot/data/images/currency/img2.jpg diff --git a/src/NadekoBot/data/currency_images/img3.jpg b/src/NadekoBot/data/images/currency/img3.jpg similarity index 100% rename from src/NadekoBot/data/currency_images/img3.jpg rename to src/NadekoBot/data/images/currency/img3.jpg diff --git a/src/NadekoBot/data/slots/background.png b/src/NadekoBot/data/images/slots/background.png similarity index 100% rename from src/NadekoBot/data/slots/background.png rename to src/NadekoBot/data/images/slots/background.png diff --git a/src/NadekoBot/data/slots/emojis/0.png b/src/NadekoBot/data/images/slots/emojis/0.png similarity index 100% rename from src/NadekoBot/data/slots/emojis/0.png rename to src/NadekoBot/data/images/slots/emojis/0.png diff --git a/src/NadekoBot/data/slots/emojis/1.png b/src/NadekoBot/data/images/slots/emojis/1.png similarity index 100% rename from src/NadekoBot/data/slots/emojis/1.png rename to src/NadekoBot/data/images/slots/emojis/1.png diff --git a/src/NadekoBot/data/slots/emojis/2.png b/src/NadekoBot/data/images/slots/emojis/2.png similarity index 100% rename from src/NadekoBot/data/slots/emojis/2.png rename to src/NadekoBot/data/images/slots/emojis/2.png diff --git a/src/NadekoBot/data/slots/emojis/3.png b/src/NadekoBot/data/images/slots/emojis/3.png similarity index 100% rename from src/NadekoBot/data/slots/emojis/3.png rename to src/NadekoBot/data/images/slots/emojis/3.png diff --git a/src/NadekoBot/data/slots/emojis/4.png b/src/NadekoBot/data/images/slots/emojis/4.png similarity index 100% rename from src/NadekoBot/data/slots/emojis/4.png rename to src/NadekoBot/data/images/slots/emojis/4.png diff --git a/src/NadekoBot/data/slots/emojis/5.png b/src/NadekoBot/data/images/slots/emojis/5.png similarity index 100% rename from src/NadekoBot/data/slots/emojis/5.png rename to src/NadekoBot/data/images/slots/emojis/5.png diff --git a/src/NadekoBot/data/slots/0.png b/src/NadekoBot/data/images/slots/numbers/0.png similarity index 100% rename from src/NadekoBot/data/slots/0.png rename to src/NadekoBot/data/images/slots/numbers/0.png diff --git a/src/NadekoBot/data/slots/1.png b/src/NadekoBot/data/images/slots/numbers/1.png similarity index 100% rename from src/NadekoBot/data/slots/1.png rename to src/NadekoBot/data/images/slots/numbers/1.png diff --git a/src/NadekoBot/data/slots/2.png b/src/NadekoBot/data/images/slots/numbers/2.png similarity index 100% rename from src/NadekoBot/data/slots/2.png rename to src/NadekoBot/data/images/slots/numbers/2.png diff --git a/src/NadekoBot/data/slots/3.png b/src/NadekoBot/data/images/slots/numbers/3.png similarity index 100% rename from src/NadekoBot/data/slots/3.png rename to src/NadekoBot/data/images/slots/numbers/3.png diff --git a/src/NadekoBot/data/slots/4.png b/src/NadekoBot/data/images/slots/numbers/4.png similarity index 100% rename from src/NadekoBot/data/slots/4.png rename to src/NadekoBot/data/images/slots/numbers/4.png diff --git a/src/NadekoBot/data/slots/5.png b/src/NadekoBot/data/images/slots/numbers/5.png similarity index 100% rename from src/NadekoBot/data/slots/5.png rename to src/NadekoBot/data/images/slots/numbers/5.png diff --git a/src/NadekoBot/data/slots/6.png b/src/NadekoBot/data/images/slots/numbers/6.png similarity index 100% rename from src/NadekoBot/data/slots/6.png rename to src/NadekoBot/data/images/slots/numbers/6.png diff --git a/src/NadekoBot/data/slots/7.png b/src/NadekoBot/data/images/slots/numbers/7.png similarity index 100% rename from src/NadekoBot/data/slots/7.png rename to src/NadekoBot/data/images/slots/numbers/7.png diff --git a/src/NadekoBot/data/slots/8.png b/src/NadekoBot/data/images/slots/numbers/8.png similarity index 100% rename from src/NadekoBot/data/slots/8.png rename to src/NadekoBot/data/images/slots/numbers/8.png diff --git a/src/NadekoBot/data/slots/9.png b/src/NadekoBot/data/images/slots/numbers/9.png similarity index 100% rename from src/NadekoBot/data/slots/9.png rename to src/NadekoBot/data/images/slots/numbers/9.png