Esempio n. 1
0
        public async Task RollAsync(ICommandContext e)
        {
            string rollResult;
            string args = e.Arguments.Pack.TakeAll();

            if (string.IsNullOrWhiteSpace(args)) // No Arguments.
            {
                rollResult = MikiRandom.Roll(100).ToString();
            }
            else
            {
                if (int.TryParse(args, out int max))                 // Simple number argument.
                {
                    rollResult = MikiRandom.Roll(max).ToString();
                }
                else                 // Assume the user has entered an advanced expression.
                {
                    Regex  regex           = new Regex(@"(\d+)?d(\d+)");
                    string fullExpression  = args;
                    int    expressionCount = 0;

                    foreach (Match match in regex.Matches(args))
                    {
                        GroupCollection groupCollection   = match.Groups;
                        int             dieCount          = groupCollection[1].Success ? int.Parse(groupCollection[1].Value) : 1;
                        int             dieSides          = int.Parse(groupCollection[2].Value);
                        List <string>   partialExpression = new List <string>();

                        for (int i = 0; i < dieCount; i++)
                        {
                            partialExpression.Add(MikiRandom.Roll(dieSides).ToString());
                        }

                        fullExpression = regex.Replace(fullExpression,
                                                       $"({string.Join(" + ", partialExpression)})", 1);
                        expressionCount++;
                    }

                    if (expressionCount > 1)
                    {
                        fullExpression = $"({fullExpression})";
                    }

                    Expression evaluation = new Expression(fullExpression);
                    rollResult = evaluation.Evaluate().ToString() + $" `{fullExpression}`";
                }
            }

            if (rollResult == "1" || rollResult.StartsWith("1 "))
            {
                await AchievementManager.Instance.GetContainerById("badluck").CheckAsync(new BasePacket()
                {
                    discordUser    = e.Author,
                    discordChannel = e.Channel
                });
            }

            e.Channel.QueueMessage(e.Locale.GetString("miki_module_fun_roll_result", e.Author.Username, rollResult));
        }
Esempio n. 2
0
        public async Task RollAsync(EventContext e)
        {
            string rollResult;

            if (string.IsNullOrWhiteSpace(e.Arguments.ToString()))             // No Arguments.
            {
                rollResult = MikiRandom.Roll(100).ToString();
            }
            else
            {
                if (int.TryParse(e.Arguments.ToString(), out int max))                 // Simple number argument.
                {
                    rollResult = MikiRandom.Roll(max).ToString();
                }
                else                 // Assume the user has entered an advanced expression.
                {
                    Regex  regex           = new Regex(@"(?<dieCount>\d+)d(?<dieSides>\d+)");
                    string fullExpression  = e.Arguments.ToString();
                    int    expressionCount = 0;

                    foreach (Match match in regex.Matches(e.Arguments.ToString()))
                    {
                        GroupCollection groupCollection   = match.Groups;
                        int             dieCount          = int.Parse(groupCollection["dieCount"].Value);
                        int             dieSides          = int.Parse(groupCollection["dieSides"].Value);
                        string          partialExpression = "";

                        for (int i = 0; i < dieCount; i++)
                        {
                            partialExpression += MikiRandom.Roll(dieSides).ToString();
                            if (i + 1 < dieCount)
                            {
                                partialExpression += " + ";
                            }
                        }

                        fullExpression = regex.Replace(fullExpression, $"( {partialExpression} )", 1);
                        expressionCount++;
                    }

                    if (expressionCount > 1)
                    {
                        fullExpression = $"( {fullExpression} )";
                    }

                    Expression evaluation = new Expression(fullExpression);
                    rollResult = evaluation.Evaluate().ToString() + $" `{fullExpression}`";
                }
            }

            if (rollResult == "1" || rollResult.StartsWith("1 "))
            {
                await AchievementManager.Instance.GetContainerById("badluck").CheckAsync(new BasePacket()
                {
                    discordUser    = e.Author,
                    discordChannel = e.Channel
                });
            }

            rollResult = Regex.Replace(rollResult, @"(\s)\s+", "$1");
            rollResult = Regex.Replace(rollResult, @"(\S)([^\d\s])", "$1 $2");

            e.Channel.QueueMessageAsync(e.GetResource(LocaleTags.RollResult, e.Author.Username, rollResult));
        }
Esempio n. 3
0
        public async Task RollAsync(IContext e)
        {
            string rollResult;
            var    args = e.GetArgumentPack().Pack.TakeAll();

            if (string.IsNullOrWhiteSpace(args)) // No Arguments.
            {
                rollResult = MikiRandom.Roll(100).ToString();
            }
            else
            {
                if (int.TryParse(args, out var max))                 // Simple number argument.
                {
                    rollResult = MikiRandom.Roll(max).ToString();
                }
                else                 // Assume the user has entered an advanced expression.
                {
                    var regex           = new Regex(@"(\d+)?d(\d+)");
                    var fullExpression  = args;
                    var expressionCount = 0;
                    var characterLimit  = 256;

                    foreach (Match match in regex.Matches(args))
                    {
                        var groupCollection   = match.Groups;
                        var dieCount          = groupCollection[1].Success ? int.Parse(groupCollection[1].Value) : 1;
                        var dieSides          = int.Parse(groupCollection[2].Value);
                        var partialExpression = new List <string>();

                        for (var i = 0; i < dieCount; i++)
                        {
                            partialExpression.Add(MikiRandom.Roll(dieSides).ToString());
                        }

                        fullExpression = regex.Replace(fullExpression,
                                                       $"({string.Join(" + ", partialExpression)})", 1);
                        expressionCount++;
                    }

                    if (expressionCount > 1)
                    {
                        fullExpression = $"({fullExpression})";
                    }

                    var evaluation = new Expression(fullExpression);
                    if (fullExpression.Length > characterLimit)
                    {
                        fullExpression = $"(...)";
                    }
                    rollResult = evaluation.Evaluate() + $" `{fullExpression}`";
                }
            }

            if (rollResult == "1" || rollResult.StartsWith("1 "))
            {
                var achievements       = e.GetService <AchievementService>();
                var badLuckAchievement = achievements.GetAchievement(AchievementIds.UnluckyId);
                await achievements.UnlockAsync(e, badLuckAchievement, e.GetAuthor().Id);
            }

            e.GetChannel()
            .QueueMessage(e, null, e.GetLocale().GetString(
                              "miki_module_fun_roll_result",
                              e.GetAuthor().Username,
                              rollResult));
        }