Beispiel #1
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            if (Constants.IsBotOwner(args.UserId))
            {
                Task.Run(async() =>
                {
                    string name = command.CommandDetail;
                    if (args.ChannelId != Constants.ConsoleId)
                    {
                        var guild = await client.GetGuildAsync(args.GuildId).ConfigureAwait(false);
                        var user  = guild.GetUser(client.CurrentUser.Id);
                        await user.ModifyAsync(x => x.Nickname = name).ConfigureAwait(false);
                    }
                    else
                    {
                        Console.Title = name;
                    }
                });
                return(new Response[] { Response.CreateFromReact(Emojis.ThumbsUpUnicode) });
            }
            else
            {
                return(Response.CreateArrayFromString($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, "Error_BotOwnerOnly")}."));
            }
        }
Beispiel #2
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            return(Response.CreateArrayFromString(AddZalgo(command.CommandDetail)));
        }
Beispiel #3
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            Response response = new Response
            {
                Embed        = EmbedUtility.ToEmbed(Help),
                Message      = Help,
                ResponseType = ResponseType.Default
            };

            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            string commandDetail = command.CommandDetail;

            response = waitHandler.CreatePleaseWaitResponse(senderDetail.ServerSettings.Language);

            Task.Run(async() =>
            {
                Response asyncResponse = await BuildMemeAsync(senderDetail.ServerSettings.Language, args);
                if (asyncResponse == null)
                {
                    string err    = ($"{Emojis.NoEntry} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoImageMessages")}");
                    asyncResponse = new Response
                    {
                        Embed        = EmbedUtility.ToEmbed(err),
                        Message      = err,
                        ResponseType = ResponseType.Default
                    };
                }
                await asyncResponder.SendResponseAsync(args, asyncResponse);
                waitHandler.PopPleaseWaitMessage();
            });

            return(new[] { response });
        }
Beispiel #4
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            // First, substitute the variables.
            string message = VariableStrings.Replace(command.CommandDetail, args.Username, args.UserId.ToString(), args.GuildName, command.CommandDetail);

            if (string.IsNullOrWhiteSpace(message))
            {
                // Use the command's name instead.
                message = command.FullCommandExcludingCommandPrefix;
            }

            // Shrug.
            message = message.StripAccents();

            // Now substitute the replacements from the table.
            StringBuilder sb = new StringBuilder();

            foreach (char c in message)
            {
                string letter = c.ToString();
                foreach (var replacementPair in replaceTable)
                {
                    letter = letter.Replace(replacementPair.Key, replacementPair.Value, (ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal));

                    // If a replacement was made.
                    if (letter != c.ToString())
                    {
                        break;
                    }
                }
                sb.Append(letter);
            }

            string          output    = reverse ? new string(sb.ToString().Reverse().ToArray()) : sb.ToString();
            List <Response> responses = new List <Response>
            {
                new Response
                {
                    Embed        = null,
                    Message      = output,
                    ResponseType = ResponseType.Default
                }
            };

            if (doTTS)
            {
                responses.Add(
                    new Response
                {
                    Embed        = null,
                    Message      = output,
                    ResponseType = ResponseType.Default_TTS
                }
                    );
            }
            return(responses.ToArray());
        }
Beispiel #5
0
        internal IList <Response> ExecuteCommand(SenderSettings senderDetail, IMessageDetail messageDetail)
        {
            List <Response>      responses = new List <Response>();
            CommandMessageHelper helper    = new CommandMessageHelper(senderDetail.ServerSettings.CommandSymbol, messageDetail.Message);

            Languages currentLanguage = senderDetail.ServerSettings.Language;

            // If we're running default, assume English.
            if (currentLanguage == Languages.Default)
            {
                currentLanguage = Languages.English;
            }

            if (helper.IsCommand || messageDetail.IsPrivate)
            {
                // Check language specific commands.
                foreach (Command command in commands[currentLanguage])
                {
                    if (command.Aliases.Contains(helper.CommandLower, StringComparer.OrdinalIgnoreCase) || command.NoSetAlias)
                    {
                        responses.AddRange(command.Execute(senderDetail, messageDetail));
                    }
                }

                // Then check defaults.
                foreach (Command command in commands[Languages.Default])
                {
                    if (command.Aliases.Contains(helper.CommandLower, StringComparer.OrdinalIgnoreCase) || command.NoSetAlias)
                    {
                        responses.AddRange(command.Execute(senderDetail, messageDetail));
                    }
                }
            }
            else
            {
                // Check only commands that do not require a command symbol.
                // Check language specific commands.
                foreach (Command command in commands[currentLanguage].Where(c => !c.RequiresSymbol))
                {
                    if (command.Aliases.Contains(helper.CommandLower, StringComparer.OrdinalIgnoreCase) || command.NoSetAlias)
                    {
                        responses.AddRange(command.Execute(senderDetail, messageDetail));
                    }
                }

                // Then check defaults.
                foreach (Command command in commands[Languages.Default].Where(c => !c.RequiresSymbol))
                {
                    if (command.Aliases.Contains(helper.CommandLower, StringComparer.OrdinalIgnoreCase) || command.NoSetAlias)
                    {
                        responses.AddRange(command.Execute(senderDetail, messageDetail));
                    }
                }
            }

            return(responses);
        }
Beispiel #6
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);
            string requestStr = command.CommandDetail;
            ulong  requestedId;

            if (string.IsNullOrWhiteSpace(requestStr))
            {
                // Default to the user asking.
                requestedId = args.UserId;
            }
            else
            {
                // Parse a mention?
                if (requestStr.StartsWith("<@") && requestStr.EndsWith(">"))
                {
                    requestStr = requestStr.Substring("<@".Length, requestStr.Length - 3); // Minus 3 for <@nnnnn>
                }

                // Id?
                if (!ulong.TryParse(requestStr, out requestedId))
                {
                    // No, fail.
                    return(Response.CreateArrayFromString($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}: {requestStr}"));
                }
            }

            if (client != null)
            {
                Task.Run(async() =>
                {
                    // From the id, determine if it's a user or server.
                    // Is it a server?
                    var candidateServer = await client.GetGuildAsync(requestedId).ConfigureAwait(false);
                    if (candidateServer != null)
                    {
                        await asyncResponder.SendResponseAsync(args, Response.CreateFromString($"{candidateServer.IconUrl}")).ConfigureAwait(false);
                    }

                    // Is it a channel?
                    IChannel candidateChannel = await client.GetDMChannelAsync(requestedId).ConfigureAwait(false);
                    if (candidateChannel != null)
                    {
                        await asyncResponder.SendResponseAsync(args, Response.CreateFromString($"{candidateChannel.GetGuild().IconUrl}")).ConfigureAwait(false);
                    }

                    // Is it a user?
                    IUser candidateUser = client.GetUser(requestedId);
                    if (candidateUser != null)
                    {
                        await asyncResponder.SendResponseAsync(args, Response.CreateFromString($"{candidateUser.GetAvatarUrl(ImageFormat.Auto, 2048)}")).ConfigureAwait(false);
                    }
                });
            }
            return(new Response[] { Response.WaitForAsync });
        }
Beispiel #7
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            StringBuilder sb        = new StringBuilder();
            string        charArray = command.CommandDetail.StripAccents();
            int           length    = charArray.Length;

            if (length > 80)
            {
                string err = ($"{Emojis.NoEntry} {languageHandler.GetPhrase(serverSettings.Language, "Error_NotAFile")}");
                sb.AppendLine(err);
            }
            else
            {
                sb.AppendLine();
                foreach (char c in charArray)
                {
                    if (char.IsLetterOrDigit(c))
                    {
                        sb.Append(":regional_indicator_").Append(char.ToLowerInvariant(c)).Append(": ");
                    }
                    else if (c == ' ')
                    {
                        sb.Append(":blue_heart: ");
                    }
                    else if (c == '!')
                    {
                        sb.Append(":grey_exclamation: ");
                    }
                    else if (c == '?')
                    {
                        sb.Append(":grey_question: ");
                    }
                    else if (c == '\'')
                    {
                        sb.Append(":arrow_down_small: ");
                    }
                    else
                    {
                        sb.Append(c);
                    }
                }

                sb.AppendLine();

                foreach (char _ in charArray)
                {
                    sb.Append(Emojis.CheerleaderSymbols[rand.Next(0, Emojis.CheerleaderSymbols.Count)]).Append(' ');
                }
            }

            return(Response.CreateArrayFromString(sb.ToString()));
        }
Beispiel #8
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);
            string responseMessage;

            if (Constants.IsBotOwner(args.UserId))
            {
                string channelIdStr = command.CommandParams[1];
                if (!string.IsNullOrWhiteSpace(channelIdStr))
                {
                    bool parsed = ulong.TryParse(channelIdStr, out ulong targetChannelId);
                    if (parsed)
                    {
                        string messageToSend = string.Join(" ", command.CommandParams, 2, command.CommandParams.Length - 2);
                        if (string.IsNullOrEmpty(messageToSend))
                        {
                            responseMessage = ($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: say <channel id> <message> -- message");
                        }
                        else
                        {
                            if (asyncResponder.SendResponse(targetChannelId, Response.CreateFromString(messageToSend)))
                            {
                                responseMessage = ($"{Emojis.TickSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "YourRequestHasBeenSent")}: {messageToSend} --> {channelIdStr}");
                            }
                            else
                            {
                                responseMessage = ($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}: {channelIdStr}");
                            }
                        }
                    }
                    else
                    {
                        responseMessage = ($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: say <channel id> <message> -- {channelIdStr}");
                    }
                }
                else
                {
                    responseMessage = $"{Emojis.CrossSymbol} say <channel id> <message>.";
                }
            }
            else
            {
                responseMessage = $"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, "Error_BotOwnerOnly")}.";
            }

            return(Response.CreateArrayFromString(responseMessage));
        }
Beispiel #9
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            StringBuilder        retVal         = new StringBuilder();
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            string[]      commandParams = command.CommandParams;
            Command[]     commands      = commandController.GetCommandsForLanguage(senderDetail.ServerSettings.Language);
            Discord.Color responseColor = Discord.Color.Green;

            if (string.IsNullOrWhiteSpace(command.CommandDetail))
            {
                var commandsByModule = commands.GroupBy(x => x.Module).ToDictionary(grouping => grouping.Key, grouping => grouping.ToList());
                foreach (var pair in commandsByModule)
                {
                    retVal.Append("**");
                    retVal.Append(pair.Key.ToString());
                    retVal.AppendLine("**");
                    retVal.AppendLine(string.Join(", ", pair.Value.Select(c => c.Aliases[0])));
                    retVal.AppendLine();
                }
            }
            else
            {
                string  search = command.CommandArgs.First().ToLowerInvariant();
                Command found  = commands.FirstOrDefault(c => c.Aliases.Contains(search, StringComparer.OrdinalIgnoreCase));
                if (found != null)
                {
                    retVal.AppendLine(found.Help + "\r\n" + found.Examples);
                }
                else
                {
                    retVal.AppendLine($"{Emojis.QuestionSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}");
                    responseColor = Discord.Color.Red;
                }
            }

            string   message  = retVal.ToString();
            Response response = new Response
            {
                Embed        = Utility.EmbedUtility.ToEmbed(message, responseColor),
                Message      = message,
                ResponseType = ResponseType.Default
            };

            return(new[] { response });
        }
Beispiel #10
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            string choice = choices[rand.Next(choices.Length)];
            string result = VariableStrings.Replace(choice, args.Username, args.UserId.ToString(), args.GuildName, command.CommandDetail);

            Response response = new Response
            {
                Embed        = null,
                Message      = result,
                ResponseType = responseType
            };

            return(new[] { response });
        }
Beispiel #11
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            UserSettings         userSettings   = senderDetail.UserSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            string[] commandParams = command.CommandParams;

            var allAchievements      = SaveData.Achievements.Achievement.AllAchievements;
            var unlockedAchievements = userSettings.UserStats.GetAchievements();

            // First, reply to the room that the command was written in.
            // This has minimal information so as to not spoil achievements
            // for other users.
            string   outputToChannel = ($"{languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Achievements_AchievementsUnlocked")}: {unlockedAchievements.Count}/{allAchievements.Count} {Emojis.Trophy}");
            Response channelResponse = new Response
            {
                Embed        = Utility.EmbedUtility.ToEmbed(outputToChannel, 200, 200, 50),
                ResponseType = ResponseType.Default
            };

            // Next, PM the user their achievements and any still to unlock.
            StringBuilder sb = new StringBuilder();

            foreach (var achievement in allAchievements)
            {
                if (achievement.HasAchieved(userSettings.UserStats))
                {
                    sb.AppendLine($"{Emojis.Trophy} {achievement.GetDescription(languageHandler, senderDetail.ServerSettings.Language)}");
                }
                else
                {
                    sb.AppendLine($"???");
                }
            }

            string   outputToPrivate = sb.ToString();
            Response privateResponse = new Response
            {
                Embed        = Utility.EmbedUtility.ToEmbed(outputToPrivate, 200, 200, 50),
                ResponseType = ResponseType.Private
            };

            return(new[] { channelResponse, privateResponse });
        }
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);
            StringBuilder        choice         = new StringBuilder(choiceFormat);

            for (int i = 0; i < choices.Length; i++)
            {
                choice.Replace($"{{{i}}}", choices[i][rand.Next(choices[i].Length)]);
            }

            string result = VariableStrings.Replace(choice, args.Username, args.UserId.ToString(), args.GuildName, command.CommandDetail).ToString();

            Response response = new Response
            {
                Embed        = null,
                Message      = result,
                ResponseType = responseType
            };

            return(new[] { response });
        }
Beispiel #13
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            StringBuilder        sb             = new StringBuilder();
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            string commandDetail = command.CommandDetail;

            // Split by or delimiter, not space.
            if (command.FullCommandExcludingCommandPrefix.ToLowerInvariant().Contains(delimiter))
            {
                string[] orChoices = commandDetail.Split(delimiter);
                if (!orChoices.Any())
                {
                    sb.AppendLine($"{command.CommandSymbol}{command.CommandLower} A{delimiter}B{delimiter}C...");
                }
                else
                {
                    sb.AppendLine(orChoices[rand.Next(orChoices.Length)].Trim());
                    sb.Append("_").Append(languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "IgnoredOr")).Append("_");
                }
            }

            // Else split by space
            else
            {
                string[] choices = command.CommandArgs.ToArray();
                if (!choices.Any())
                {
                    sb.AppendLine($"{command.CommandSymbol}{command.CommandLower} A B C ...");
                }
                else
                {
                    sb.AppendLine(choices[rand.Next(choices.Length)]);
                }
            }

            return(Response.CreateArrayFromString(sb.ToString()));
        }
Beispiel #14
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            string[] commandParams = command.CommandParams;

            if (Constants.IsBotOwner(args.UserId))
            {
                var    servers            = (client.Guilds).ToArray();
                string serverOutputString = string.Join("\n ",
                                                        servers.Select((server) =>
                {
                    var ss    = serverSettingsHandler.GetOrCreateServerSettings(server.Id);
                    var owner = server.Owner;
                    return($"`{server.Name}` ({ss.Language}): `{owner?.Username}`");
                }));

                return(Response.CreateArrayFromString(servers.Length + " servers: \n" + serverOutputString));
            }

            return(Response.CreateArrayFromString($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, "Error_BotOwnerOnly")}."));
        }
Beispiel #15
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            Discord.Color responseColor;
            string        message;

            if (ImageManipulator.FindHexColour(command.CommandDetail, out string foundColour))
            {
                var color = ImageManipulator.FromHexCode(foundColour);
                responseColor = new Discord.Color(color.R, color.G, color.B);

                var knownColor = color.ToKnownColor();
                message = knownColor != 0 ? $"✓ {knownColor}" : $"(~) {color.ToConsoleColor()}";
            }
            else if (Enum.TryParse(command.CommandDetail, true, out KnownColor knownColor))
            {
                var color = Color.FromKnownColor(knownColor);
                responseColor = new Discord.Color(color.R, color.G, color.B);
                message       = $"✓ {knownColor}";
            }
            else
            {
                responseColor = Discord.Color.Default;
                message       = $"{Emojis.QuestionSymbol} {command.CommandDetail}";
            }

            Response response = new Response
            {
                Embed        = Utility.EmbedUtility.ToEmbed(message, responseColor),
                Message      = message,
                ResponseType = ResponseType.Default
            };

            return(new[] { response });
        }
Beispiel #16
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            string               retVal         = "";
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            string[] commandParams = command.CommandParams;
            ushort   flips;

            Discord.Color responseColor = new Discord.Color(0);

            if (commandParams.Length == 1)
            {
                flips = 1;
            }
            else
            {
                if (!ushort.TryParse(commandParams[1], out flips) || flips <= 0)
                {
                    retVal = ($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, Errors.ErrorCode.IncorrectParameter)}: {commandParams[1]}. [1-{uint.MaxValue}].");
                }
            }

            if (flips > 0)
            {
                int    heads = 0, tails = 0;
                string localeHead = languageHandler.GetPhrase(serverSettings.Language, "CoinHead");
                string localeTail = languageHandler.GetPhrase(serverSettings.Language, "CoinTail");

                if (flips == 1)
                {
                    switch (rand.Next(2))
                    {
                    default:
                    case 0: retVal = localeHead; heads++; break;

                    case 1: retVal = localeTail; tails++; break;
                    }
                }
                else
                {
                    char headLetter = (localeHead)[0];
                    char tailLetter = (localeTail)[0];

                    string flipped = languageHandler.GetPhrase(serverSettings.Language, "Flipped");
                    if (flips > 100)
                    {
                        for (int i = 0; i < flips; i++)
                        {
                            switch (rand.Next(2))
                            {
                            case 0: heads++; break;

                            case 1: tails++; break;
                            }
                        }
                        retVal = ($"{flipped} {flips}x, `{localeHead}:` {heads}, `{localeTail}:` {tails}");
                    }
                    else
                    {
                        StringBuilder coinflips = new StringBuilder();
                        for (int i = 0; i < flips; i++)
                        {
                            switch (rand.Next(2))
                            {
                            case 0: coinflips.Append(headLetter); heads++; break;

                            case 1: coinflips.Append(tailLetter); tails++; break;
                            }
                        }

                        retVal = ($"{flipped} {flips}x, `{localeHead}:` {heads}, `{localeTail}:` {tails}: {coinflips.ToString()}");
                    }
                }

                if (heads < tails)
                {
                    responseColor = new Discord.Color(200, 50, 50);
                }
                else if (heads > tails)
                {
                    responseColor = new Discord.Color(50, 200, 50);
                }
                else
                {
                    responseColor = new Discord.Color(200, 200, 50);
                }
            }

            Response response = new Response
            {
                Embed        = Utility.EmbedUtility.ToEmbed(retVal, responseColor),
                Message      = retVal,
                ResponseType = ResponseType.Default
            };

            return(new[] { response });
        }
Beispiel #17
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            StringBuilder        output         = new StringBuilder();
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            string[] commandParams = command.CommandParams;

            long min = 0;
            long max;

            if (commandParams.Length == 1)
            {
                max = 10;
            }
            else if (commandParams.Length == 2)
            {
                if (!long.TryParse(commandParams[1], NumberStyles.Any, CultureInfo.InvariantCulture, out max))
                {
                    if (commandParams[1] == "∞" || commandParams[1].StartsWith("inf"))
                    {
                        max = long.MaxValue;
                    }
                    else if (commandParams[1] == "-∞" || commandParams[1].StartsWith("-inf"))
                    {
                        max = long.MinValue;
                    }
                    else
                    {
                        output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, Errors.ErrorCode.IncorrectParameter)}: {commandParams[1]}.");
                        max = 10;
                    }
                }
            }
            else
            {
                if (!long.TryParse(commandParams[1], NumberStyles.Any, CultureInfo.InvariantCulture, out min))
                {
                    if (commandParams[1] == "∞" || commandParams[1].StartsWith("inf"))
                    {
                        min = long.MaxValue;
                    }
                    else if (commandParams[1] == "-∞" || commandParams[1].StartsWith("-inf"))
                    {
                        min = long.MinValue;
                    }
                    else
                    {
                        output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, Errors.ErrorCode.IncorrectParameter)}: {commandParams[1]}.");
                        min = 0;
                    }
                }

                if (!long.TryParse(commandParams[2], NumberStyles.Any, CultureInfo.InvariantCulture, out max))
                {
                    if (commandParams[2] == "∞" || commandParams[2].StartsWith("inf"))
                    {
                        max = long.MaxValue;
                    }
                    else if (commandParams[2] == "-∞" || commandParams[2].StartsWith("-inf"))
                    {
                        max = long.MinValue;
                    }
                    else
                    {
                        output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, Errors.ErrorCode.IncorrectParameter)}: {commandParams[2]}.");
                        max = 10;
                    }
                }
            }
            if (min > max)
            {
                // Swap
                long temp = max;
                max = min;
                min = temp;
            }

            long num = rand.NextLong(min, max == long.MaxValue ? long.MaxValue : max + 1);

            output.AppendLine((min) + " -> " + (max) + ": " + num);

            ulong range = (ulong)(max - min);

            if (range == 0)
            {
                range = 1;
            }

            long  normNum    = (num - min);
            float percentage = (((float)normNum) / range) * 360;

            if (percentage > 360)
            {
                percentage = 360;
            }
            var drawingColour = Imaging.ImageManipulator.FromAHSB(255, percentage, 0.8f, 0.5f);
            var responseColor = new Discord.Color(drawingColour.R, drawingColour.G, drawingColour.B);

            string   retVal   = output.ToString();
            Response response = new Response
            {
                Embed        = Utility.EmbedUtility.ToEmbed(retVal, responseColor),
                Message      = retVal,
                ResponseType = ResponseType.Default
            };

            return(new[] { response });
        }
Beispiel #18
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            StringBuilder        output         = new StringBuilder();
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            bool   handled       = false;
            string toParse       = command.CommandLower;
            string commandDetail = command.CommandDetail;

            if (Aliases.Contains(toParse))
            {
                if (Regex.IsMatch(commandDetail, D_REGEX, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled | RegexOptions.Multiline))
                {
                    // Ignore the command entered because the full command is in the detail.
                    toParse = commandDetail;
                }
                else
                {
                    // Convert the command into a d6 command.
                    string timesToRollStr = "1";
                    string adjustmentStr  = "+0";

                    // If number of times to roll is specified.
                    if (!string.IsNullOrEmpty(commandDetail))
                    {
                        // If adjustments are specified.
                        if (commandDetail.Contains("-") || commandDetail.Contains("+"))
                        {
                            int index = commandDetail.LastIndexOf("+");
                            if (index == -1)
                            {
                                index = commandDetail.LastIndexOf("-");
                            }

                            if (index > 0)
                            {
                                adjustmentStr  = commandDetail.Substring(index, commandDetail.Length - index).Trim();
                                timesToRollStr = commandDetail.Substring(0, index).Trim();
                            }
                        }
                        else
                        {
                            timesToRollStr = commandDetail;
                        }
                    }

                    toParse = $"{timesToRollStr}d6{adjustmentStr}";
                }
            }
            else
            {
                // Parse the whole thing
                toParse += " " + commandDetail;
            }

            if (Regex.IsMatch(toParse, D_REGEX, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled | RegexOptions.Multiline))
            {
                handled = true;

                string[] diceParams    = toParse.Split('d', 'D');
                string   rollsStr      = string.IsNullOrEmpty(diceParams[0]) ? "1" : diceParams[0];
                string   diceTypeStr   = string.IsNullOrEmpty(diceParams[1]) ? "6" : diceParams[1];
                string   adjustmentStr = "0";
                if (diceTypeStr.Contains("-") || diceTypeStr.Contains("+"))
                {
                    int index = diceTypeStr.LastIndexOf("+");
                    if (index == -1)
                    {
                        index = diceTypeStr.LastIndexOf("-");
                    }

                    if (index > 0)
                    {
                        adjustmentStr = diceTypeStr.Substring(index, diceTypeStr.Length - index).Trim();
                        diceTypeStr   = diceTypeStr.Substring(0, index).Trim();
                    }
                }

                bool validNumberOfRolls  = ushort.TryParse(rollsStr, out ushort rolls);
                bool validDiceType       = byte.TryParse(diceTypeStr, out byte diceType) || diceTypeStr == "F" || diceTypeStr == "f";
                bool validAdjustmentDice = int.TryParse(adjustmentStr, NumberStyles.Any, CultureInfo.InvariantCulture, out int adjustment);

                if (validNumberOfRolls && validDiceType && validAdjustmentDice)
                {
                    if (diceTypeStr == "F" || diceTypeStr == "f")
                    {
                        RollFudgeDice(rolls, adjustment, languageHandler, serverSettings.Language, ref output);
                    }
                    else
                    {
                        RollDice(rolls, diceType, adjustment, languageHandler, serverSettings.Language, ref output);
                    }
                    if (diceType == 1)
                    {
                        output.AppendLine($"_{languageHandler.GetPhrase(serverSettings.Language, "WhatDidYouExpect")}_");
                    }
                }
                else
                {
                    if (!validNumberOfRolls)
                    {
                        output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, Errors.ErrorCode.IncorrectParameter)}: {rollsStr} [0-65535]");
                    }

                    if (!validDiceType)
                    {
                        output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, Errors.ErrorCode.IncorrectParameter)}: {diceTypeStr} [0-255]");
                    }

                    if (!validAdjustmentDice)
                    {
                        output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, Errors.ErrorCode.IncorrectParameter)}: {adjustmentStr} [+-F]");
                    }
                }
            }

            if (handled)
            {
                string   retVal   = output.ToString();
                Response response = new Response
                {
                    Embed        = Utility.EmbedUtility.ToEmbed(retVal),
                    Message      = retVal,
                    ResponseType = ResponseType.Default
                };
                return(new[] { response });
            }
            else
            {
                // Not handled.
                return(Response.NoResponse);
            }
        }
Beispiel #19
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            // Verify command.
            string[] splitCommand = command.CommandLower.Split('>', StringSplitOptions.RemoveEmptyEntries);
            if (splitCommand.Length == 2)
            {
                var sourceLanguage = splitCommand[0];
                if (!translateCodes.Contains(sourceLanguage))
                {
                    if (string.Equals(sourceLanguage, "?") || sourceLanguage.Equals("auto", StringComparison.OrdinalIgnoreCase))
                    {
                        sourceLanguage = "auto";
                    }
                    else
                    {
                        // If the source language is not found, then assume the command is not for us.
                        return(Response.NoResponse);
                    }
                }

                // Command verified, continue with the translation.
                var targetLanguage = splitCommand[1];
                var toTranslate    = command.CommandDetail;

                if (string.IsNullOrWhiteSpace(toTranslate))
                {
                    return(Response.CreateArrayFromString(TRANSLATE_HOMEPAGE));
                }
                else if (!translateCodes.Contains(targetLanguage))
                {
                    string err = ($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {targetLanguage}");
                    return(Response.CreateArrayFromString(err));
                }

                string query   = Uri.EscapeDataString(toTranslate);
                string request =
                    "https://translate.googleapis.com/translate_a/single?client=gtx&dt=t"
                    + $"&ie=UTF-8"
                    + $"&oe=UTF-8"
                    + $"&sl={sourceLanguage}"
                    + $"&tl={targetLanguage}"
                    + $"&q={query}";
                errorLogger.LogDebug(request, false);

                // Responds asynchronously.
                Task.Run(async() =>
                {
                    JContainer json;
                    string message = null;

                    try
                    {
                        json = (JContainer)await JSONHelper.GetJsonAsync(request).ConfigureAwait(false);
                    }
                    catch (Exception)
                    {
                        json    = null;
                        message = ($"{Emojis.NoEntry} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_ServerNotFound")}");
                    }

                    try
                    {
                        dynamic outer = json[0];
                        if (outer.Count > 0)
                        {
                            StringBuilder translation = new StringBuilder();
                            for (int i = 0; i < outer.Count; i++)
                            {
                                string translatedLine = outer[i][0]?.ToString();
                                if (translatedLine != null)
                                {
                                    translation.AppendLine(translatedLine);
                                }
                            }

                            if (translation.Length <= 0)
                            {
                                message = ($"{Emojis.Warning} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}");
                            }
                            else
                            {
                                message = translation.ToString();
                            }
                        }
                        else
                        {
                            message = ($"{Emojis.Warning} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}");
                        }
                    }
                    catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)
                    {
                        // Extra information for debugging.
                        errorLogger.LogException(ex, ErrorSeverity.Error);
                        errorLogger.LogDebug("Unable to process the translation response: " + ex, true);
                        errorLogger.LogDebug("Request: " + request, true);
                        errorLogger.LogDebug("Response: " + json, true);

                        // Let the usual error handling kick in.
                        throw;
                    }

                    Response asyncResponse = Response.CreateFromString(message);
                    await asyncResponder.SendResponseAsync(args, asyncResponse).ConfigureAwait(false);
                });

                // Return out the lifecycle with no response.
                return(new[] { Response.WaitForAsync });
            }
            else
            {
                return(Response.NoResponse);
            }
        }
Beispiel #20
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);
            string query = command.CommandDetail;

            // Responds asynchronously.
            Task.Run(async() =>
            {
                JContainer json;
                string message = null;

                string weapon = Splatoon.SplatoonDefs.TryFindWeapon(query);
                if (weapon != null)
                {
                    try
                    {
                        string buildsQuery = $@"query {{
  searchForBuilds(weapon: ""{weapon}"")
  {{
    headgear
    clothing
    shoes
  }}
}}";
                        string builtUrl    = $"{url}?query={Uri.EscapeUriString(buildsQuery)}";
                        json = (JContainer)JsonConvert.DeserializeObject(await RequestsHelper.CurlGetCommand(builtUrl, origin).ConfigureAwait(false));
                    }
                    catch (Exception ex)
                    {
                        json    = null;
                        message = ($"{Emojis.NoEntry} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_ServerNotFound")}");
                        Console.WriteLine(ex);
                    }

                    try
                    {
                        dynamic jsonResult = json["data"]["searchForBuilds"];
                        int count          = 0;
                        foreach (var node in jsonResult)
                        {
                            JArray headgear    = node["headgear"];
                            JArray clothing    = node["clothing"];
                            JArray shoes       = node["shoes"];
                            string[] mains     = new string[] { headgear[0].ToString(), clothing[0].ToString(), shoes[0].ToString() };
                            List <string> subs = new List <string>();
                            subs.AddRange(headgear.Skip <JToken>(1).Values <string>());
                            subs.AddRange(clothing.Skip <JToken>(1).Values <string>());
                            subs.AddRange(shoes.Skip <JToken>(1).Values <string>());
                            var mainsDict    = new Dictionary <string, int>(mains.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count()).OrderByDescending(pair => pair.Value));
                            var subsDict     = new Dictionary <string, int>(subs.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count()).OrderByDescending(pair => pair.Value));
                            StringBuilder sb = new StringBuilder();
                            foreach (var pair in mainsDict)
                            {
                                sb.Append(pair.Value).Append("m");
                                if (subsDict.ContainsKey(pair.Key))
                                {
                                    sb.Append(pair.Value).Append("s");
                                    subsDict.Remove(pair.Key);
                                }
                                sb.Append(" ").Append(pair.Key).Append(", ");
                            }
                            foreach (var pair in subsDict)
                            {
                                sb.Append(pair.Value).Append("s");
                                sb.Append(" ").Append(pair.Key).Append(", ");
                            }
                            sb.AppendLine();
                            message += sb.ToString();
                            count++;
                            if (count > 6)
                            {
                                break;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        message = ($"{Emojis.NoEntry} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_Oops")}");
                        Console.WriteLine(ex);
                    }
                }
                else
                {
                    message = ($"{Emojis.QuestionSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}");
                }

                Response asyncResponse = new Response
                {
                    ResponseType = ResponseType.Default,
                    Embed        = EmbedUtility.ToEmbed(message, null),
                    Message      = message
                };

                await asyncResponder.SendResponseAsync(args, asyncResponse);
            });

            // Return out the lifecycle with no response.
            return(new[] { Response.WaitForAsync });
        }
Beispiel #21
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);
            string query = command.CommandDetail;

            StringBuilder output = new StringBuilder();

            try
            {
                const string url    = "https://wiki.teamfortress.com/wiki/Crafting";
                const string urlRaw = url + "?action=raw";

                if (cachedText == null)
                {
                    cachedText = WebHelper.GetText(urlRaw);
                }

                string rawText = cachedText;

                // First we need to decide on what we're searching for.
                bool multiLookup =
                    (!query.Contains("Fabricate", StringComparison.OrdinalIgnoreCase) &&
                     !query.Contains("Smelt", StringComparison.OrdinalIgnoreCase) &&
                     !query.Contains("Combine", StringComparison.OrdinalIgnoreCase));

                if (multiLookup)
                {
                    query = "Fabricate " + query;
                }

                bool querySatisfied = rawText.ContainsIgnore(query, StringComparison.OrdinalIgnoreCase, " ", "_", "-", ".");

                if (!querySatisfied && multiLookup)
                {
                    query          = "Smelt " + query;
                    querySatisfied = rawText.ContainsIgnore(query, StringComparison.OrdinalIgnoreCase, " ", "_", "-", ".");
                }

                if (!querySatisfied && multiLookup)
                {
                    query          = "Combine " + query;
                    querySatisfied = rawText.ContainsIgnore(query, StringComparison.OrdinalIgnoreCase, " ", "_", "-", ".");
                }

                if (!querySatisfied)
                {
                    string error = ($"{Emojis.ExclamationSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_UnknownRecipe")}");
                    output.AppendLine(error + " " + query + ": " + url);
                }
                else
                {
                    // We're in business.
                    TextParser parser = new TextParser(rawText);
                    parser.MovePast(query, true);
                    parser.MovePast("|", true); // First parameter is blueprint name
                    string recipeTemplate = parser.ExtractUntil("bprow", false, true);
                    if (string.IsNullOrEmpty(recipeTemplate))
                    {
                        // Go to the end of the table instead.
                        recipeTemplate = parser.ExtractUntil("</", false, true);
                    }
                    recipeTemplate = recipeTemplate.Replace("{{Item icon|", "").Replace("'''", "").Replace("''", "").Replace("{", "").Replace("}", "").Replace("\r", "").Replace("\n", "").Replace("\\r", "").Replace("\\n", "").Replace("  ", " ").Replace("<small>", " ").Replace("</small>", " ").Replace("=", "").Replace("×", "x").Replace("→", "→").Trim('|', ' ');
                    string[] templateArgs = recipeTemplate.Split('|');

                    if (templateArgs.Length < 2)
                    {
                        string error = ($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_Oops")}");
                        output.Append(error).Append(' ').Append(query).Append(": ").AppendLine(url);
                    }
                    else
                    {
                        output.AppendLine("`Requirements: " + templateArgs[0].Trim() + "`");
                        output.AppendLine("`Produces: " + templateArgs[1].Trim() + "`");
                        for (int i = 2; i < templateArgs.Length; i++)
                        {
                            if (templateArgs[i].Contains("cost") || i == templateArgs.Length - 1)
                            {
                                string costStr = templateArgs[i].Replace("cost", "");
                                if (costStr.Contains("</"))
                                {
                                    costStr = (costStr.Substring(0, costStr.IndexOf("</")));
                                }
                                output.AppendLine("`Cost: " + costStr.Trim() + " weapon units.`");
                                break;
                            }
                            else
                            {
                                output.AppendLine("`" + templateArgs[i].Trim() + "`");
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string error = ($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_Oops")}");
                output.AppendLine(error + " " + query + " " + ex.Message);
            }

            return(Response.CreateArrayFromString(output.ToString()));
        }
Beispiel #22
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            Response response = new Response
            {
                Message      = "https://www.youtube.com",
                ResponseType = ResponseType.Default
            };

            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            string keywords = command.CommandDetail;

            if (!string.IsNullOrWhiteSpace(keywords))
            {
                if (keywords.Length > 150)
                {
                    response.Message = $"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, "Error_IncorrectParameter")}: {languageHandler.GetPhrase(serverSettings.Language, "Text")} < 150";
                }
                else
                {
                    // Already a YouTube URL? Extract the id and prepend it with youtube.com?v=
                    var match = youtubeRegex.Match(keywords);
                    if (match.Length > 1)
                    {
                        response.Message = $"https://www.youtube.com/watch?v={match.Groups["id"].Value}";
                    }
                    else
                    {
                        response = waitHandler.CreatePleaseWaitResponse(senderDetail.ServerSettings.Language);

                        Task.Run(async() =>
                        {
                            string asyncRetVal;
                            string query = $"https://www.googleapis.com/youtube/v3/search?" +
                                           $"part=snippet&maxResults=8" +
                                           $"&q={Uri.EscapeDataString(keywords)}" +
                                           $"&key={Tokens.GoogleAPIKey}";
                            string json  = await GetResponseStringAsync(query);
                            dynamic data = JsonConvert.DeserializeObject(json);

                            if (data.items.Count > 0)
                            {
                                // Attempt to get the first item that is a video.
                                int itemIndex = 0;
                                string videoId;

                                do
                                {
                                    videoId = (data.items[itemIndex].id.videoId);
                                    itemIndex++;
                                }while (itemIndex < data.items.Count && string.IsNullOrWhiteSpace(videoId));

                                if (string.IsNullOrWhiteSpace(videoId))
                                {
                                    asyncRetVal = ($"{Emojis.Warning} {languageHandler.GetPhrase(serverSettings.Language, "Error_NoResults")}");
                                }
                                else
                                {
                                    string youTubeURL = ("https://www.youtube.com/watch?v=" + videoId);
                                    switch (youTubeCommandType)
                                    {
                                    case YouTubeCommandType.YouTube:
                                        asyncRetVal = youTubeURL;
                                        break;

                                    case YouTubeCommandType.SaveFrom:
                                        asyncRetVal = ("http://en.savefrom.net/#url=" + youTubeURL);
                                        break;

                                    case YouTubeCommandType.Repeat:
                                        asyncRetVal = ("http://www.youtubeonrepeat.com/watch?v=" + videoId);
                                        break;

                                    default:
                                        asyncRetVal = $"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, "Error_Oops")}: {youTubeCommandType}";
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                asyncRetVal = $"{Emojis.Warning} {languageHandler.GetPhrase(serverSettings.Language, "Error_NoResults")}";
                            }

                            Response asyncResponse = new Response
                            {
                                Message      = asyncRetVal,
                                ResponseType = ResponseType.Default
                            };

                            await asyncResponder.SendResponseAsync(args, asyncResponse);
                            waitHandler.PopPleaseWaitMessage();
                        });
                    }
                }
            }

            response.Embed = EmbedUtility.ToEmbed(response.Message);
            return(new[] { response });
        }
Beispiel #23
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            // Responds asynchronously.
            Task.Run(async() =>
            {
                var now = DateTime.UtcNow;
                ServerSettings serverSettings = senderDetail.ServerSettings;
                CommandMessageHelper command  = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);
                string query = command.CommandDetail;

                Player[] matchedPlayers;
                Team[] matchedTeams;
                string title;

                // Call the Slapp
                if (string.IsNullOrWhiteSpace(query))
                {
                    matchedPlayers = new Player[0];
                    matchedTeams   = new Team[0];
                    title          = "Nothing to search!";
                }
                else
                {
                    Task.WaitAll(initialiseTask);
                    matchedPlayers = splatTagController.MatchPlayer(query);
                    matchedTeams   = splatTagController.MatchTeam(query);
                    title          = $"Found {matchedPlayers.Length} player{((matchedPlayers.Length == 1) ? "" : "s")} and {matchedTeams.Length} team{((matchedTeams.Length == 1) ? "" : "s")}! ";
                }

                bool hasMatchedPlayers  = matchedPlayers.Length != 0;
                bool hasMatchedTeams    = matchedTeams.Length != 0;
                bool showLimitedMessage = matchedPlayers.Length > 9 || matchedTeams.Length > 9;

                Color color =
                    (hasMatchedPlayers && hasMatchedTeams) ? Color.Green :
                    (hasMatchedPlayers && !hasMatchedTeams) ? Color.Blue :
                    (!hasMatchedPlayers && hasMatchedTeams) ? Color.Gold :
                    (!hasMatchedPlayers && !hasMatchedTeams) ? Color.Red :
                    Color.DarkRed;

                var builder = new EmbedBuilder()
                              .WithColor(color)
                              .WithAuthor(author => author.WithName(title));

                if (hasMatchedPlayers)
                {
                    for (int i = 0; i < matchedPlayers.Length && i < 9; i++)
                    {
                        var p           = matchedPlayers[i];
                        var teams       = p.Teams.Select(id => splatTagController.GetTeamById(id));
                        string oldTeams = teams.GetOldTeamsStrings();
                        var currentTeam = teams.FirstOrDefault();
                        string info     = $"Plays for {currentTeam} {oldTeams}\n _{string.Join(", ", p.Sources)}_";

                        var playerField = new EmbedFieldBuilder()
                                          .WithIsInline(false)
                                          .WithName(p.Name.Truncate(1000, ""))
                                          .WithValue(info.Truncate(1000, "…_"));
                        builder.AddField(playerField);
                    }
                }

                if (hasMatchedTeams)
                {
                    for (int i = 0; i < matchedTeams.Length && i < 9; i++)
                    {
                        var t            = matchedTeams[i];
                        string[] players = t.GetTeamPlayersStrings(splatTagController);
                        string divPhrase = t.GetBestTeamPlayerDivString(splatTagController);
                        string info      = $"{t.Div}. {divPhrase} Players: {string.Join(matchedTeams.Length == 1 ? ",\n" : ", ", players)}\n _{string.Join(", ", t.Sources)}_";

                        var teamField = new EmbedFieldBuilder()
                                        .WithIsInline(false)
                                        .WithName($"{t.Tag} {t.Name}".Truncate(1000, ""))
                                        .WithValue(info.Truncate(1000, "…_"));
                        builder.AddField(teamField);
                    }
                }
                builder.WithFooter($"Fetched in {Math.Floor((DateTime.UtcNow - now).TotalMilliseconds)} milliseconds. {(showLimitedMessage ? "Only the first 9 results are shown for players and teams." : "")}",
                                   "https://media.discordapp.net/attachments/471361750986522647/758104388824072253/icon.png");

                Response asyncResponse = new Response
                {
                    Embed        = builder,
                    ResponseType = ResponseType.Default,
                    Message      = ""
                };

                await asyncResponder.SendResponseAsync(args, asyncResponse).ConfigureAwait(false);
            });

            // Return out the lifecycle with no response.
            if (!initialiseTask.IsCompleted)
            {
                // Also react with a Sloth if the database hasn't loaded yet.
                return(new[] { Response.WaitForAsync, Response.CreateFromReact(Emojis.SlothUnicode) });
            }
            else
            {
                return(new[] { Response.WaitForAsync });
            }
        }
Beispiel #24
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CultureInfo          cultureInfo    = languageHandler.GetCultureInfo(serverSettings.Language);
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            string[]      commandParams = command.CommandParams;
            Discord.Color responseColor = Discord.Color.Green;

            string[] typeStrings;

            if (command.CommandDetail.Contains('-'))
            {
                // User wrote e.g. normal-flying
                typeStrings = command.CommandDetail.Split('-');
            }
            else
            {
                typeStrings = command.CommandArgs.Where(s => !string.IsNullOrWhiteSpace(s)).ToArray();
            }

            if (typeStrings.Length == 0)
            {
                // No types specified.
                return(Response.CreateArrayFromString("http://bulbapedia.bulbagarden.net/wiki/Type"));
            }

            List <string> incorrectTypes = new List <string>();
            List <string> duplicateTypes = new List <string>();

            var foundTypes = new HashSet <PokemonType>();

            // TODO - translate.
            if (typeStrings.Length == 1 && typeStrings[0].Equals("all", StringComparison.OrdinalIgnoreCase))
            {
                // Add all types.
                foreach (PokemonType t in PokemonTypeHandler.PokemonTypes)
                {
                    if (t != PokemonType.NumberOfTypes)
                    {
                        foundTypes.Add(t);
                    }
                }
            }
            else
            {
                foreach (string typeStr in typeStrings)
                {
                    bool found = PokemonTypeHandler.GetTypeFromLocalisedName(typeStr, cultureInfo, out PokemonType t);
                    if (found)
                    {
                        bool added = foundTypes.Add(t);
                        if (!added)
                        {
                            duplicateTypes.Add(typeStr);
                        }
                    }
                    else
                    {
                        incorrectTypes.Add(typeStr);
                    }
                }
            }

            bool foundAny = foundTypes.Any();

            if (!foundAny)
            {
                // Check if is actually a Pokémon.
                Pokemon pokemon = (KnowledgeBase.GetOrFetchPokémon(command.CommandDetail));
                if (pokemon != null)
                {
                    foundTypes.Add(pokemon.PrimaryType);
                    if (pokemon.SecondaryType != PokemonType.NumberOfTypes)
                    {
                        foundTypes.Add(pokemon.SecondaryType);
                    }

                    foundAny = true;

                    // Ignore the typing - it's a Pokémon.
                    incorrectTypes.Clear();
                    duplicateTypes.Clear();
                }
            }

            StringBuilder sb = new StringBuilder();

            // Incorrect types
            if (incorrectTypes.Any())
            {
                sb.Append($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}");
                sb.Append(": ");
                sb.AppendLine(string.Join(" ", incorrectTypes));
            }

            // Duplicate types
            if (duplicateTypes.Any())
            {
                sb.Append($"{Emojis.ExclamationSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Warning_SameType")}");
                sb.Append(": ");
                sb.AppendLine(string.Join(" ", duplicateTypes));
            }

            if (foundAny)
            {
                sb.AppendLine("```objectivec");
                sb.Append("// ");

                foreach (PokemonType foundType in foundTypes)
                {
                    string foundTypeName = PokemonTypeHandler.GetLocalisedName(foundType, cultureInfo);
                    sb.Append(foundTypeName);
                    sb.Append(" ");
                }
                sb.AppendLine();

                // Attacking
                if (foundTypes.Count < 3)
                {
                    sb.AppendLine($"# {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Attacking")}");
                    foreach (PokemonType foundType in foundTypes)
                    {
                        double[] attackingType1 = PokemonTypeHandler.GetAttacking(foundType);
                        for (int i = 0; i < attackingType1.Length; i++)
                        {
                            double eff = attackingType1[i];
                            if (eff != 1.0)
                            {
                                sb.Append(eff.ToString("G", cultureInfo.NumberFormat));
                                sb.Append($"x {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Against")} ");
                                sb.Append(PokemonTypeHandler.GetLocalisedName(PokemonTypeHandler.PokemonTypes[i], cultureInfo));
                                sb.Append($" {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "WhenAttackingWith")} ");
                                sb.Append(PokemonTypeHandler.GetLocalisedName(foundType, cultureInfo));
                                sb.AppendLine();
                            }
                        }
                    }
                }
                sb.AppendLine();

                // Defending
                sb.AppendLine($"# {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Defending")}");
                double[] defending = PokemonTypeHandler.GetDefending(foundTypes.ToArray());
                for (int i = 0; i < defending.Length; i++)
                {
                    double eff = defending[i];
                    if (eff != 1.0)
                    {
                        sb.Append(eff.ToString("G", cultureInfo.NumberFormat));
                        sb.Append($"x {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "DamageTakenFrom")} ");
                        sb.AppendLine(PokemonTypeHandler.GetLocalisedName(PokemonTypeHandler.PokemonTypes[i], cultureInfo));
                    }
                }

                // Add on status immunities.
                foreach (PokemonType foundType in foundTypes)
                {
                    string immunity = PokemonTypeHandler.GetTypeStatusImmunityString(foundType, cultureInfo);
                    if (immunity != string.Empty)
                    {
                        sb.AppendLine(immunity);
                    }
                }

                sb.Append("```");
            }

            return(Response.CreateArrayFromString(sb.ToString(), responseColor));
        }
Beispiel #25
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            StringBuilder output = new StringBuilder();

            if ((Constants.IsBotOwner(args.UserId)) || (args.GuildOwnerId == args.UserId))
            {
                ServerSettings serverSettings = senderDetail.ServerSettings;
                IEnumerable <ScheduledMessageData> scheduledData = serverSettings.ScheduledMessages.Where(d => d.channelId == args.ChannelId);
                int scheduledDataLength            = scheduledData.Count();
                CommandMessageHelper command       = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);
                string[]             commandParams = command.CommandParams;

                switch (commandParams.Length)
                {
                case 0:
                    // Should not occur.
                    output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_Oops")}");
                    break;

                case 1:
                    // Show help.
                    output.AppendLine(Help);
                    output.AppendLine(Examples);
                    output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language));
                    break;

                case 2:
                {
                    // Remove without an id?
                    if (commandParams[1].Equals("remove", StringComparison.OrdinalIgnoreCase))
                    {
                        switch (scheduledDataLength)
                        {
                        case 0:
                        {
                            // No messages set up
                            output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}");
                            break;
                        }

                        case 1:
                        {
                            // Only one, remove that
                            ScheduledMessageData matchedData = serverSettings.ScheduledMessages.Single(d => d.channelId == args.ChannelId);
                            AttemptDisable(serverSettings, matchedData, output, senderDetail.ServerSettings.Language);

                            // And remove
                            serverSettings.ScheduledMessages.Remove(matchedData);
                            serverSettingsHandler.WriteServerSettings(serverSettings);
                            break;
                        }

                        default:
                        {
                            // More than one, require an id.
                            output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {Constants.BotMention_Nick} {command.CommandLower} remove _id_");
                            output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language));
                            break;
                        }
                        }
                    }
                    else if (commandParams[1].Equals("enable", StringComparison.OrdinalIgnoreCase))
                    {
                        switch (scheduledDataLength)
                        {
                        case 0:
                        {
                            // No messages set up
                            output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}");
                            break;
                        }

                        case 1:
                        {
                            // Only one, try to enable that
                            ScheduledMessageData matchedData = serverSettings.ScheduledMessages.Single(d => d.channelId == args.ChannelId);
                            AttemptEnable(serverSettings, matchedData, output, serverSettings.Language);
                            break;
                        }

                        default:
                        {
                            // More than one, require an id.
                            output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {Constants.BotMention_Nick} {command.CommandLower} enable _id_");
                            output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language));
                            break;
                        }
                        }
                    }
                    else if (commandParams[1].Equals("disable", StringComparison.OrdinalIgnoreCase))
                    {
                        switch (scheduledDataLength)
                        {
                        case 0:
                        {
                            // No messages set up
                            output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}");
                            break;
                        }

                        case 1:
                        {
                            // Only one, disable that
                            ScheduledMessageData matchedData = serverSettings.ScheduledMessages.Single(d => d.channelId == args.ChannelId);
                            AttemptDisable(serverSettings, matchedData, output, senderDetail.ServerSettings.Language);
                            break;
                        }

                        default:
                        {
                            // More than one, require an id.
                            output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {Constants.BotMention_Nick} {command.CommandLower} enable _id_");
                            output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language));
                            break;
                        }
                        }
                    }
                    else if (commandParams[1].Equals("list", StringComparison.OrdinalIgnoreCase))
                    {
                        string list = BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language);
                        if (list == string.Empty)
                        {
                            output.AppendLine("<none>");
                        }
                        else
                        {
                            output.AppendLine(list);
                        }
                    }
                    else if (commandParams[1].Equals("set", StringComparison.OrdinalIgnoreCase))
                    {
                        output.AppendLine($"{Constants.BotMention_Nick} {command.CommandLower} set _id_ <Due|Repeating|Message|Enabled> <_value_>");
                        output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language));
                    }
                    else if (commandParams[1].Equals("new", StringComparison.OrdinalIgnoreCase))
                    {
                        ushort id       = 1;
                        var    takenIds = serverSettings.ScheduledMessages.Select(d => d.id).ToArray();
                        while (takenIds.Contains(id))
                        {
                            ++id;
                        }
                        serverSettings.ScheduledMessages.Insert(id - 1, new ScheduledMessageData(args.ChannelId, id));
                        output.AppendLine($"{Constants.BotMention_Nick} {command.CommandLower} set **{id}** <Due|Repeating|Message|Enabled> <_value_>");
                        output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language));
                    }

                    break;
                }

                case 3:
                {
                    bool idParsed = ushort.TryParse(commandParams[2], out ushort id);

                    if (!idParsed)
                    {
                        // Id not in range
                        output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {id}");
                        output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language));
                    }
                    else
                    {
                        var matchedData = serverSettings.ScheduledMessages.Find(m => m.id == id);
                        if (matchedData != default(ScheduledMessageData))
                        {
                            if (commandParams[1].Equals("set", StringComparison.OrdinalIgnoreCase))
                            {
                                output.AppendLine($"{Constants.BotMention_Nick} {command.CommandLower} set _id_ <Due|Repeating|Message|Enabled> <value>");
                                output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language));
                            }
                            else if (commandParams[1].Equals("enable", StringComparison.OrdinalIgnoreCase))
                            {
                                AttemptEnable(serverSettings, matchedData, output, serverSettings.Language);
                            }
                            else if (commandParams[1].Equals("disable", StringComparison.OrdinalIgnoreCase))
                            {
                                AttemptDisable(serverSettings, matchedData, output, serverSettings.Language);
                            }
                            else
                            {
                                // Remove with an id?
                                if (commandParams[1].Equals("remove", StringComparison.OrdinalIgnoreCase))
                                {
                                    if (!scheduledData.Any())
                                    {
                                        output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoResults")}");
                                    }
                                    else
                                    {
                                        if (id > 0 && id <= scheduledDataLength)
                                        {
                                            AttemptDisable(serverSettings, matchedData, output, senderDetail.ServerSettings.Language);

                                            // And remove
                                            serverSettings.ScheduledMessages.Remove(matchedData);
                                            serverSettingsHandler.WriteServerSettings(serverSettings);
                                            output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language));
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            // Id not found
                            output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {id}");
                            output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language));
                        }
                    }
                    break;
                }

                // 4 or more
                default:
                {
                    bool idParsed = uint.TryParse(commandParams[2], out uint id);

                    if (!idParsed)
                    {
                        // Id not in range
                        output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {id}");
                        output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language));
                    }
                    else
                    {
                        var matchedData = serverSettings.ScheduledMessages.Find(m => m.id == id);
                        if (matchedData != default(ScheduledMessageData))
                        {
                            if (commandParams[1].Equals("set", StringComparison.OrdinalIgnoreCase))
                            {
                                // Due|Repeating|Message|Enabled
                                if (commandParams[3].Equals("Due", StringComparison.OrdinalIgnoreCase))
                                {
                                    string dueStr = string.Join(" ", commandParams.Skip(4));
                                    if (string.IsNullOrWhiteSpace(dueStr))
                                    {
                                        output.AppendLine($"{Emojis.InfoSymbol} Due is the next time to send the message e.g. 5:30pm, 00:00");
                                    }
                                    else
                                    {
                                        bool success = DateTime.TryParse(dueStr, languageHandler.GetCultureInfo(serverSettings.Language), DateTimeStyles.AssumeUniversal, out matchedData.nextDue);
                                        if (success)
                                        {
                                            matchedData.nextDue = matchedData.nextDue.ToUniversalTime();
                                            while (matchedData.nextDue < DateTime.UtcNow)
                                            {
                                                matchedData.nextDue = matchedData.nextDue.AddDays(1);
                                            }
                                            string localisedToGo = languageHandler.GetLocalisedTimeSpan(serverSettings.Language, matchedData.nextDue - DateTime.UtcNow);
                                            output.AppendLine($"{Emojis.TimerSymbol} {matchedData.nextDue.ToString("t")} UTC ({localisedToGo})");
                                            serverSettingsHandler.WriteServerSettings(serverSettings);
                                        }
                                        else
                                        {
                                            output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {dueStr}");
                                        }
                                    }
                                }
                                else if (commandParams[3].Equals("Repeating", StringComparison.OrdinalIgnoreCase))
                                {
                                    string repeatingStr = string.Join(" ", commandParams.Skip(4));
                                    if (string.IsNullOrWhiteSpace(repeatingStr))
                                    {
                                        output.AppendLine($"{Emojis.InfoSymbol} Repeating is the period to wait between each message, or 0 to not repeat. In form _days_ or _days_._hours_:_minutes_:_seconds_ or _hours_:_minutes_:_seconds_");
                                    }
                                    else
                                    {
                                        bool success = TimeSpan.TryParse(repeatingStr, languageHandler.GetCultureInfo(senderDetail.ServerSettings.Language), out matchedData.repetitionTimeSpan);
                                        if (success)
                                        {
                                            TimeSpan ts          = matchedData.repetitionTimeSpan;
                                            string   localisedTs = languageHandler.GetLocalisedTimeSpan(serverSettings.Language, ts);
                                            output.AppendLine($"{Emojis.RepeatSymbol} {localisedTs}");
                                            serverSettingsHandler.WriteServerSettings(serverSettings);
                                        }
                                        else
                                        {
                                            output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {repeatingStr}");
                                        }
                                    }
                                }
                                else if (commandParams[3].Equals("Message", StringComparison.OrdinalIgnoreCase))
                                {
                                    string messageStr = string.Join(" ", commandParams.Skip(4));
                                    if (string.IsNullOrWhiteSpace(messageStr))
                                    {
                                        output.AppendLine($"{Emojis.InfoSymbol} Message is the message to write.");
                                    }
                                    else
                                    {
                                        matchedData.message = messageStr;
                                        output.AppendLine($"{Emojis.MessageUnicode} {messageStr}");
                                        serverSettingsHandler.WriteServerSettings(serverSettings);
                                    }
                                }
                                else if (commandParams[3].Equals("Enabled", StringComparison.OrdinalIgnoreCase))
                                {
                                    string enabledStr = string.Join(" ", commandParams.Skip(4));
                                    if (string.IsNullOrWhiteSpace(enabledStr))
                                    {
                                        output.AppendLine($"{Emojis.InfoSymbol} Enabled is if the message should be enabled (true/false). Long hand for the enable/disable command.");
                                    }
                                    else
                                    {
                                        if (enabledStr.Equals("true", StringComparison.OrdinalIgnoreCase) || enabledStr.Equals("yes", StringComparison.OrdinalIgnoreCase) || enabledStr.Equals("y", StringComparison.OrdinalIgnoreCase))
                                        {
                                            AttemptEnable(serverSettings, matchedData, output, senderDetail.ServerSettings.Language);
                                            serverSettingsHandler.WriteServerSettings(serverSettings);
                                        }
                                        else if (enabledStr.Equals("false", StringComparison.OrdinalIgnoreCase) || enabledStr.Equals("no", StringComparison.OrdinalIgnoreCase) || enabledStr.Equals("n", StringComparison.OrdinalIgnoreCase))
                                        {
                                            AttemptDisable(serverSettings, matchedData, output, senderDetail.ServerSettings.Language);
                                            serverSettingsHandler.WriteServerSettings(serverSettings);
                                        }
                                        else
                                        {
                                            output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {enabledStr}");
                                        }
                                    }
                                }
                                else
                                {
                                    output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {commandParams[3]}");
                                    output.AppendLine($"{Constants.BotMention_Nick} {command.CommandLower} set _id_ <Due|Repeating|Message|Enabled> [value]");
                                }
                            }
                        }
                        else
                        {
                            // Id not found
                            output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_IncorrectParameter")}: {id}");
                            output.AppendLine(BuildScheduledMessageInformation(scheduledData, languageHandler.GetCultureInfo(serverSettings.Language), serverSettings.Language));
                        }
                    }

                    break;
                }
                }
            }
            else
            {
                output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_ServerOwnerOnly")}");
            }

            return(new[] { new Response
                           {
                               Message = output.ToString(),
                               ResponseType = ResponseType.Default
                           } });
        }
Beispiel #26
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            string[]      commandParams = command.CommandParams;
            Discord.Color responseColor = Discord.Color.Green;

            object        ans;
            StringBuilder output        = new StringBuilder();
            string        commandDetail = command.CommandDetail;

            try
            {
                if (commandDetail.Contains('!'))
                {
                    output.AppendLine("*! is ambiguous, use ~ for 'bitwise-not'. Factorial is not yet supported. Assuming conditional-not.*");
                }

                if (commandDetail.Contains('^'))
                {
                    output.AppendLine("*Assumed ^ means XOR. For Power, use Pow(x,y).*");
                }

                if (commandDetail.Contains('%'))
                {
                    output.AppendLine("*Assumed % means modulo. For percentages, simply divide by 100.*");
                }

                if (commandDetail.Count(c => c == '=') == 1)
                {
                    output.AppendLine($"*Assumed = means is equal. For an equation solver, use the `{senderDetail.ServerSettings.CommandSymbol}wolframalpha` (`{senderDetail.ServerSettings.CommandSymbol}wa`) command.*");
                }

                // Tidy up some common operator symbols.
                commandDetail = commandDetail
                                .Replace("fix", "floor") // before the x replacement
                                .Replace("x", "*")
                                .Replace("modulo", "mod")
                                .Replace("mod", "%")
                                .Replace("¬", "~")
                                .Replace("cosine", "cos")
                                .Replace("sine", "sin")
                                .Replace("tangent", "tan")
                                .Replace("sqr ", "sqrt ")
                                .Replace("root", "sqrt")
                                .Replace("√", "sqrt")
                                .Replace("atn", "atan")
                                .Replace("π", "[pi]")
                                .Replace("∞", "[infinity]")
                                .Replace("pi ", "[pi] ")
                                .Replace("infinity", "[infinity]")
                                .Replace("inf", "[infinity]");

                // Use ; to split statements. : can be used for more powerful functionality
                // such as [Convert]::ToString(1234, 16)
                foreach (string split in commandDetail.Split(';'))
                {
                    Expression e = new Expression(split, EvaluateOptions.NoCache | EvaluateOptions.IgnoreCase);
                    e.Parameters["pi"]       = Math.PI;
                    e.Parameters["e"]        = Math.E;
                    e.Parameters["infinity"] = double.MaxValue;
                    ans = e.Evaluate();
                    if (ans == null)
                    {
                        output.AppendLine("I don't understand your input (undefined). Please check constants are enclosed by parentheses.");
                    }
                    else
                    {
                        if (e.HasErrors())
                        {
                            output.AppendLine(e.Error);
                        }
                        else
                        {
                            output.AppendLine(split + " == " + ans.ToString());
                        }
                    }
                }
            }
            catch (EvaluationException eEx)
            {
                responseColor = Discord.Color.Red;
                output.AppendLine("I can't evaluate your input: " + eEx.Message + ".");
            }
            catch (DivideByZeroException)
            {
                output.AppendLine("NaN.");
            }
            catch (OverflowException)
            {
                responseColor = Discord.Color.Red;
                output.AppendLine("Overflow.");
            }

            Response response = new Response
            {
                Embed        = Utility.EmbedUtility.ToEmbed(output.ToString(), responseColor),
                Message      = output.ToString(),
                ResponseType = ResponseType.Default
            };

            return(new[] { response });
        }
Beispiel #27
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            // Responds asynchronously.
            Task.Run(async() =>
            {
                CommandMessageHelper command    = new CommandMessageHelper(senderDetail.ServerSettings.CommandSymbol, args.Message);
                string manualUrl                = "http://minecraft.gamepedia.com/index.php?search=" + command.EscapedCommandDetail + "&title=Special%3ASearch&go=Go";
                StringBuilder output            = new StringBuilder(manualUrl + " \n");
                string[] craftingTemplateParams = new string[] { "\n", "|" };

                string query = command.EscapedCommandDetail;
                string json  = "";

                try
                {
                    bool redirectResolved = true;

                    // Resolve redirects
                    do
                    {
                        json = await WebHelper.GetTextAsync($"http://minecraft.gamepedia.com/api.php?format=json&action=query&titles={query}&prop=revisions&rvprop=content&callback=?");

                        if (json.Contains(RedirectString))
                        {
                            // Resolve redirect
                            TextParser parser = new TextParser(json);
                            parser.MovePast(RedirectString, true);
                            parser.MovePast("[[", true);
                            string article  = parser.ExtractUntil("]]", false, true);
                            string newQuery = Uri.EscapeDataString(article);
                            if (query == newQuery)
                            {
                                output.AppendLine(Emojis.ExclamationSymbol + " infinite recursion error on: " + query);
                                redirectResolved = false;
                                break;
                            }
                            else
                            {
                                query = newQuery;
                            }
                        }
                    }while (json.Contains(RedirectString));

                    if (redirectResolved)
                    {
                        string url = "http://minecraft.gamepedia.com/" + query;

                        // Get the recipe.
                        if (!json.ContainsIgnore(CraftingString, StringComparison.OrdinalIgnoreCase, " ", "\n", "\r"))
                        {
                            string error = Emojis.InfoSymbol + " " + languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_UnknownRecipe");
                            output.AppendLine(error + " " + command.CommandDetail + ": " + url);
                        }
                        else
                        {
                            // We're in business.
                            TextParser parser = new TextParser(json);
                            parser.MovePast(CraftingString, true);
                            string recipeTemplate = parser.ExtractUntil("}}", false, true).Replace("|head=0", "").Replace("|head=1", "").Replace("|showdescription=0", "").Replace("|showdescription=1", "").Replace("|showname=0", "").Replace("|showname=1", "");
                            parser = new TextParser(recipeTemplate);
                            parser.MovePast("|", true); // First parameter is template name

                            string[,] recipe = new string[3, 3];
                            // Initialise all elements with an empty string.
                            for (int x = 0; x < 3; x++)
                            {
                                for (int y = 0; y < 3; y++)
                                {
                                    recipe[x, y] = "";
                                }
                            }

                            if (recipeTemplate.Contains("A2") || recipeTemplate.Contains("B2") || recipeTemplate.Contains("C2"))
                            {
                                // Method 1, cells specified
                                string a1Cell = parser.ExtractBetween("A1", craftingTemplateParams, true);
                                recipe[0, 0]  = TidyRecipeParameter(a1Cell);

                                string b1Cell = parser.ExtractBetween("B1", craftingTemplateParams, true);
                                recipe[1, 0]  = TidyRecipeParameter(b1Cell);

                                string c1Cell = parser.ExtractBetween("C1", craftingTemplateParams, true);
                                recipe[2, 0]  = TidyRecipeParameter(c1Cell);

                                string a2Cell = parser.ExtractBetween("A2", craftingTemplateParams, true);
                                recipe[0, 1]  = TidyRecipeParameter(a2Cell);

                                string b2Cell = parser.ExtractBetween("B2", craftingTemplateParams, true);
                                recipe[1, 1]  = TidyRecipeParameter(b2Cell);

                                string c2Cell = parser.ExtractBetween("C2", craftingTemplateParams, true);
                                recipe[2, 1]  = TidyRecipeParameter(c2Cell);

                                string a3Cell = parser.ExtractBetween("A3", craftingTemplateParams, true);
                                recipe[0, 2]  = TidyRecipeParameter(a3Cell);

                                string b3Cell = parser.ExtractBetween("B3", craftingTemplateParams, true);
                                recipe[1, 2]  = TidyRecipeParameter(b3Cell);

                                string c3Cell = parser.ExtractBetween("C3", craftingTemplateParams, true);
                                recipe[2, 2]  = TidyRecipeParameter(c3Cell);
                            }
                            else
                            {
                                // Method 2, all fields present -OR- clockwise layout.
                                List <string> items = new List <string>();
                                for (int i = 0; i < 9; i++)
                                {
                                    string candidateItem = TidyRecipeParameter(parser.ExtractUntil(craftingTemplateParams, false, true));
                                    if (candidateItem.Contains("output", StringComparison.OrdinalIgnoreCase))
                                    {
                                        break;
                                    }
                                    else
                                    {
                                        items.Add(candidateItem);
                                        parser.MovePast("|");
                                    }
                                }

                                // If we have less than 4, then it's constructed in a clockwise fashion.
                                switch (items.Count)
                                {
                                case 0:
                                    break;

                                case 1:
                                    recipe[0, 1] = items[0];
                                    break;

                                case 2:
                                    recipe[0, 1] = items[0];
                                    recipe[1, 1] = items[1];
                                    break;

                                case 3:
                                    recipe[0, 1] = items[0];
                                    recipe[1, 1] = items[1];
                                    recipe[1, 2] = items[2];
                                    break;

                                case 4:
                                    recipe[0, 1] = items[0];
                                    recipe[1, 1] = items[1];
                                    recipe[1, 2] = items[2];
                                    recipe[0, 2] = items[3];
                                    break;

                                default:
                                    {
                                        recipe[0, 1] = items[0];
                                        recipe[1, 1] = items[1];
                                        recipe[1, 2] = items[2];
                                        recipe[0, 2] = items[3];
                                        break;
                                    }

                                case 9:
                                    // Otherwise, all parameters are specified and just go from top left to bottom right.
                                    for (int x = 0; x < 3; x++)
                                    {
                                        for (int y = 0; y < 3; y++)
                                        {
                                            recipe[x, y] = items[(x * 3) + y];
                                        }
                                    }
                                    break;
                                }
                            }

                            parser.MovePast(OutputNameString, true);
                            string outputName = TidyRecipeParameter(parser.ExtractUntil(craftingTemplateParams, false, true));
                            if (string.IsNullOrWhiteSpace(outputName))
                            {
                                string error = Emojis.ExclamationSymbol + " " + languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_UnknownRecipe");
                                output.AppendLine($"{error}{command.CommandDetail}: " + url);
                            }
                            else
                            {
                                const int pad = 14;
                                output.AppendLine($"```"); // Mono-space engage!
                                output.AppendLine($"|--------------|--------------|--------------|");
                                output.AppendLine($"|{recipe[0, 0].CentreString(pad)}|{recipe[1, 0].CentreString(pad)}|{recipe[2, 0].CentreString(pad)}|");
                                output.AppendLine($"|--------------|--------------|--------------|");
                                output.AppendLine($"|{recipe[0, 1].CentreString(pad)}|{recipe[1, 1].CentreString(pad)}|{recipe[2, 1].CentreString(pad)}|");
                                output.AppendLine($"|--------------|--------------|--------------|");
                                output.AppendLine($"|{recipe[0, 2].CentreString(pad)}|{recipe[1, 2].CentreString(pad)}|{recipe[2, 2].CentreString(pad)}|");
                                output.AppendLine($"|--------------|--------------|--------------|");
                                output.AppendLine($"```");
                                output.AppendLine($"{outputName}");
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    string error = Emojis.CrossSymbol + " " + languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_Oops");
                    output.AppendLine(error + " " + command.CommandDetail);
                    errorLogger.LogDebug("Query: " + query, true);
                    errorLogger.LogDebug("JSON: " + json, true);
                    errorLogger.LogDebug(ex.ToString(), true);
                }

                Response asyncResponse = new Response
                {
                    ResponseType = ResponseType.Default,
                    Embed        = EmbedUtility.ToEmbed(output.ToString(), null),
                    Message      = output.ToString()
                };

                await asyncResponder.SendResponseAsync(args, asyncResponse);
            });

            // Return out the lifecycle with no response.
            return(new[] { Response.WaitForAsync });
        }
Beispiel #28
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CultureInfo          cultureInfo    = languageHandler.GetCultureInfo(serverSettings.Language);
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            Discord.Color responseColor = Discord.Color.Green;
            // First, check the cache if we already have this pokémon.
            string query = command.CommandDetail;

            if (args.URLs.Length > 0)
            {
                var response = new[] { waitHandler.CreatePleaseWaitResponse(senderDetail.ServerSettings.Language) };

                Task.Run(async() =>
                {
                    Response asyncResponse = await CorrelatePokemonAsync(senderDetail.ServerSettings.Language, args);
                    if (asyncResponse == null)
                    {
                        string err    = ($"{Emojis.NoEntry} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_NoImageMessages")}");
                        asyncResponse = new Response
                        {
                            Embed        = EmbedUtility.ToEmbed(err),
                            Message      = err,
                            ResponseType = ResponseType.Default
                        };
                    }
                    await asyncResponder.SendResponseAsync(args, asyncResponse);
                    waitHandler.PopPleaseWaitMessage();
                });

                return(response);
            }

            query = query.Replace("(Pokemon)", "").Replace("(Pokémon)", "").Trim();
            query = query.Replace("(move)", "").Trim();

            StringBuilder output   = new StringBuilder();
            Pokemon       pokemon  = KnowledgeBase.GetPokémon(query);
            string        imageUrl = null;
            bool          isCached = (pokemon != null);

            try
            {
                // For now, assume that it is a Pokémon.
                string url    = "https://bulbapedia.bulbagarden.net/wiki/" + query.Capitalize() + "_(Pokémon)";
                string urlRaw = url + "?action=raw";

                if (!isCached)
                {
                    // Assume correct URL
                    pokemon = Pokemon.ParsePage(urlRaw);
                }

                if (pokemon != null)
                {
                    string  p         = pokemon.Name + "_(Pokémon)";
                    dynamic imageJson = null;
                    output
                    .Append("https://bulbapedia.bulbagarden.net/wiki/")
                    .Append(p)
                    .AppendLine("#") // # is for mobile where () is not correctly parsed in the URL parser
                    .AppendLine(MakeAPokemonString(pokemon, cultureInfo, serverSettings.Language));

                    try
                    {
                        cancellationTokenSource.CancelAfter(300000);
                        Task.Run(async() =>
                        {
                            imageJson = await JSONHelper.GetJsonAsync(Uri.EscapeUriString("https://bulbapedia.bulbagarden.net/w/api.php?action=query&format=json&prop=pageimages&titles=" + p)).ConfigureAwait(false);
                        }, cancellationTokenSource.Token).Wait();
                        JToken token = imageJson["query"]["pages"];
                        token    = token.First.First;
                        imageUrl = token["thumbnail"]["source"]?.ToString();
                    }
                    catch (TaskCanceledException tcex)
                    {
                        errorLogger.LogDebug("Did not query Bulbapedia in time to retrieve the Pokemon image.", true);
                        errorLogger.LogException(tcex, ErrorSeverity.Warning);
                    }
                    catch (Exception ex)
                    {
                        errorLogger.LogDebug($"Exception occurred retrieving the Pokemon image for {pokemon?.Name}.\n" +
                                             $"imageUrl: {imageUrl}\n" +
                                             $"imageJson: {imageJson}", true);
                        errorLogger.LogException(ex, ErrorSeverity.Error);
                    }
                }
                else
                {
                    output.AppendLine($"{Emojis.ExclamationSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_PokemonNotFound")}: {urlRaw}");
                }
            }
            catch (WebException)
            {
                output.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_PokemonNotFound")}: {query}");
            }
            catch (Exception ex)
            {
                output.AppendLine($"{languageHandler.GetPhrase(senderDetail.ServerSettings.Language, "Error_Oops")}: {ex.Message}");
            }

            return(Response.CreateArrayFromString(output.ToString(), responseColor, pokemon.Name, imageUrl));
        }
Beispiel #29
0
        public override IList <Response> Execute(SenderSettings senderDetail, IMessageDetail args)
        {
            StringBuilder        sb             = new StringBuilder();
            ServerSettings       serverSettings = senderDetail.ServerSettings;
            CommandMessageHelper command        = new CommandMessageHelper(serverSettings.CommandSymbol, args.Message);

            string commandDetail = command.CommandDetail;

            Discord.Color?embedColour = null;

            if (string.IsNullOrEmpty(commandDetail))
            {
                sb.AppendLine(Help);
            }
            else
            {
                // Remove decorators
                commandDetail = commandDetail.Replace("0x", "").Replace("0b", "").Replace("#", "");

                // Replace commas with spaces
                commandDetail = commandDetail.Replace(",", " ").Trim();

                // Special case hex to decimal in cases of 6 or 8 characters.
                bool is6Chars = commandDetail.Length == 6;
                bool is8Chars = commandDetail.Length == 8;
                if (fromBase == 16 && (is6Chars || is8Chars))
                {
                    // Try and convert the source hex number into a colour.
                    if (uint.TryParse(commandDetail, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out uint argb))
                    {
                        // Remove alpha channel (N.B. this usually makes it transparent as a = 0, but Discord fixes this to fully opaque)
                        argb       &= 0x00FFFFFF;
                        embedColour = new Discord.Color(argb);
                    }

                    commandDetail += " ";
                    commandDetail += commandDetail.Substring(0, 2);
                    commandDetail += " ";
                    commandDetail += commandDetail.Substring(2, 2);
                    commandDetail += " ";
                    commandDetail += commandDetail.Substring(4, 2);
                    if (is8Chars)
                    {
                        commandDetail += " ";
                        commandDetail += commandDetail.Substring(6, 2);
                    }
                }

                string[] commandParams = commandDetail.Split(' ').Where(s => !string.IsNullOrWhiteSpace(s)).ToArray();

                if (fromBase == 10)
                {
                    // Try and convert the source decimal number(s) into a colour.
                    if (commandParams.Length == 1)
                    {
                        if (uint.TryParse(commandParams[0], out uint argb))
                        {
                            // Remove alpha channel (N.B. this usually makes it transparent as a = 0, but Discord fixes this to fully opaque)
                            argb       &= 0x00FFFFFF;
                            embedColour = new Discord.Color(argb);
                        }
                    }
                    else if (commandParams.Length == 3 || commandParams.Length == 4)
                    {
                        // Using -n here as alpha could be included at the front.
                        bool canParseColour = (byte.TryParse(commandParams[commandParams.Length - 3], out byte r));
                        canParseColour &= (byte.TryParse(commandParams[commandParams.Length - 2], out byte g));
                        canParseColour &= (byte.TryParse(commandParams[commandParams.Length - 1], out byte b));

                        if (canParseColour)
                        {
                            embedColour = new Discord.Color(r, g, b);
                        }
                    }
                }

                foreach (string col in commandParams)
                {
                    try
                    {
                        switch (fromBase)
                        {
                        case 2:
                        case 8:
                        case 10:
                        case 16:
                        {
                            long   part  = Convert.ToInt64(col, fromBase);
                            byte[] parts = BitConverter.GetBytes(part);
                            if (toBase == 64)
                            {
                                sb.Append(Convert.ToBase64String(parts) + " ");
                            }
                            else if (toBase == 16)
                            {
                                sb.Append(part.ToString("X2") + " ");
                            }
                            else
                            {
                                sb.Append(Convert.ToString(part, toBase) + " ");
                            }
                            break;
                        }

                        case 64:
                        {
                            byte[] parts = Convert.FromBase64String(col);
                            long   part  = BitConverter.ToInt64(parts, 0);

                            if (toBase == 64)
                            {
                                sb.Append(Convert.ToBase64String(parts) + " ");
                            }
                            else if (toBase == 16)
                            {
                                sb.Append(part.ToString("X2") + " ");
                            }
                            else
                            {
                                sb.Append(Convert.ToString(part, toBase) + " ");
                            }
                            break;
                        }
                        }
                    }
                    catch (FormatException)
                    {
                        sb.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, "Error_IncorrectParameter")}: {col}.");
                    }
                    catch (Exception ex)
                    {
                        sb.AppendLine($"{Emojis.CrossSymbol} {languageHandler.GetPhrase(serverSettings.Language, "Error_Oops")}: {col} {ex.Message}");
                    }
                }

                // If multiple things to translate, also provide the answer without spaces.
                if (command.CommandParams.Length > 2)
                {
                    string outputWithoutSpace = sb.ToString().Replace(" ", "");
                    sb.AppendLine();
                    switch (toBase)
                    {
                    case 2: sb.Append("0b "); break;

                    case 8: sb.Append("0o "); break;

                    case 16: sb.Append("0x "); break;
                    }
                    sb.AppendLine(outputWithoutSpace);
                }
            }

            string   output   = sb.ToString();
            Response response = new Response
            {
                Embed        = EmbedUtility.ToEmbed(output, embedColour),
                Message      = output,
                ResponseType = ResponseType.Default
            };

            return(new[] { response });
        }