Esempio n. 1
0
        internal static void AddCommands(Commands.CommandGroupBuilder group)
        {
            group.CreateCommand("rand")
                .Parameter("min", Commands.ParameterType.Optional)
                .Parameter("max", Commands.ParameterType.Optional)
                .Description("I'll give you a random number between *min* and *max*. Both are optional. If only one is given, it's *max*. (defaults: 1-100)")
                .Do(async e =>
                {
                    foreach (string s in e.Args)
                    {
                        int dummy = 0;
                        if (!int.TryParse(s, out dummy))
                        {
                            await e.Channel.SendMessage($"{s} is not a number!");
                            return;
                        }
                    }
                    int min = e.Args.Length > 1 ? int.Parse(e.Args[0]) : 1;
                    int max = e.Args.Length > 0 ? int.Parse(e.Args[e.Args.Length == 1 ? 0 : 1]) : 100;
                    if (min == max)
                    {
                        await e.Channel.SendMessage($"You're joking right? It's {min}.");
                        return;
                    }
                    if (min > max)
                    {
                        int z = min;
                        min = max;
                        max = z;
                    }
                    await e.Channel.SendMessage($"Your number is **{new Random().Next(min,max+1)}**.");
                });

            var dd = new DiceKernel().Init().Get<Dice>();
            group.CreateCommand("roll")
                .Parameter("[times]t [dice expressions]", Commands.ParameterType.Unparsed)
                .Description("I'll roll a dice expression([count]d[sides]k[kept][mods...]...) as many `times` as you ask(default 1). (If empty or just `times`, will roll default: 1d6.)")
                .Do(async e =>
                {
                    var chan = e.Channel;
                    if (e.Args[0].ToLower() == "rick")
                    {
                        await chan.SendMessage("https://youtu.be/dQw4w9WgXcQ");
                        return;
                    }
                    var args = string.Join(" ", e.Args);
                    int times;
                    if ((times = args.IndexOf("t")) != -1)
                    {
                        int t = times;
                        if (int.TryParse(args.Substring(0, t), out times))
                        {
                            if (times <= 0)
                            {
                                await chan.SendMessage($"0, baka!");
                                return;
                            }
                            args = args.Substring(t+1);
                        }
                        else times = 1;
                    }
                    else times = 1;

                    string response = "";
                    double? total = times > 1 ? (int?)0 : null;
                    bool do_default = args.Length == 0; // Default roll.
                    for (; times != 0; --times)
                    {
                        double val;
                        if (do_default)
                        {
                            val = dd.Roll().d6();
                            response += $"{val} {(total == null ? "" : times == 1 ? "=" : "+")} ";
                        }
                        else
                        {
                            try
                            {
                                var roll = dd.ReplaceRollsWithSum(args);
                                var eval = dd.Evaluate(roll);
                                val = Utils.ChangeType<double>(eval);
                                if (response != "") response += '\n';
                                var str = Utils.BooleanOrType<double>(eval);
                                if (roll != str) response += $"{Discord.Format.Code(roll)} = ";
                                response += $"**{str}**.";
                            }
                            catch (Exception ex)
                            {
                                await chan.SendMessage($"Invalid Arguments: {ex.Message}");
                                return;
                            }
                        }
                        if (total != null) total += val;
                    }
                    if (total != null)
                    {
                        if (!do_default) response += "\nTotal Result = ";
                        response += $"**{total}**.";
                    }
                    await chan.SendMessage(response);
                });

            group.CreateCommand("rollsentence")
                .Parameter("[sentence]", Commands.ParameterType.Unparsed)
                .Description("I'll replace all instances of dice expressions wrapped like {1d4} with their resolutions. (see ` help roll` for info on dice expressions)")
                .Do(async e => await e.Channel.SendMessage(e.Args[0].Length == 0 ? "" : dd.ReplaceWrappedExpressions<double>(e.Args[0])));
        }
Esempio n. 2
0
        internal static void AddCommands(Commands.CommandGroupBuilder group)
        {
            group.CreateCommand("rand")
            .Parameter("min", Commands.ParameterType.Optional)
            .Parameter("max", Commands.ParameterType.Optional)
            .Description("I'll give you a random number between *min* and *max*. Both are optional. If only one is given, it's *max*. (defaults: 1-100)")
            .Do(async e =>
            {
                foreach (string s in e.Args)
                {
                    if (!int.TryParse(s, out int dummy))
                    {
                        await e.Channel.SendMessageAsync($"{s} is not a number!");
                        return;
                    }
                }
                int min = e.Args.Length > 1 ? int.Parse(e.Args[0]) : 1;
                int max = e.Args.Length > 0 ? int.Parse(e.Args[e.Args.Length == 1 ? 0 : 1]) : 100;
                if (min == max)
                {
                    await e.Channel.SendMessageAsync($"You're joking right? It's {min}.");
                    return;
                }
                if (min > max)
                {
                    int z = min;
                    min   = max;
                    max   = z;
                }
                await e.Channel.SendMessageAsync($"Your number is **{new Random().Next(min,max+1)}**.");
            });

            var dk = new DiceKernel().Init();
            var dd = dk.Get <Dice>();

            group.CreateCommand("roll")
            .Parameter("[times]t [dice expressions]", Commands.ParameterType.Unparsed)
            .Description("I'll roll a dice expression([count]d[sides]k[kept][mods...]...) as many `times` as you ask(default 1). (If empty or just `times`, will roll default: 1d6.)")
            .Do(async e =>
            {
                var chan = e.Channel;
                if (e.Args[0].ToLower() == "rick")
                {
                    await chan.SendMessageAsync("https://youtu.be/dQw4w9WgXcQ");
                    return;
                }
                var args = string.Join(" ", e.Args);
                int times;
                if ((times = args.IndexOf("t")) != -1)
                {
                    int t = times;
                    if (int.TryParse(args.Substring(0, t), out times))
                    {
                        if (times <= 0)
                        {
                            await chan.SendMessageAsync($"0, baka!");
                            return;
                        }
                        args = args.Substring(t + 1);
                    }
                    else
                    {
                        times = 1;
                    }
                }
                else
                {
                    times = 1;
                }

                string response = "";
                double?total    = times > 1 ? (int?)0 : null;
                bool do_default = args.Length == 0;     // Default roll.
                for (; times != 0; --times)
                {
                    double val;
                    if (do_default)
                    {
                        val       = dd.Roll().d6().AsSum();
                        response += $"{val} {(total == null ? "" : times == 1 ? "=" : "+")} ";
                    }
                    else
                    {
                        try
                        {
                            var roll = dd.ReplaceRollsWithSumExpression(args);
                            var eval = dk.Get <IParser>().Compile(roll).EvalValue(null);
                            val      = Utils.ChangeType <double>(eval);
                            if (response != "")
                            {
                                response += '\n';
                            }
                            var str = Utils.BooleanOrType <double>(eval);
                            if (roll != str)
                            {
                                response += $"{Discord.Format.Code(roll)} = ";
                            }
                            response += $"**{str}**.";
                        }
                        catch (Exception ex)
                        {
                            await chan.SendMessageAsync($"Invalid Arguments: {ex.Message}");
                            return;
                        }
                    }
                    if (total != null)
                    {
                        total += val;
                    }
                }
                if (total != null)
                {
                    if (!do_default)
                    {
                        response += "\nTotal Result = ";
                    }
                    response += $"**{total}**.";
                }
                await chan.SendMessageAsync(response);
            });

            group.CreateCommand("rollsentence")
            .Parameter("[sentence]", Commands.ParameterType.Unparsed)
            .Description("I'll replace all instances of dice expressions wrapped like {1d4} with their resolutions. (see ` help roll` for info on dice expressions)")
            .Do(async e => await e.Channel.SendMessageAsync(e.Args[0].Length == 0 ? "" : dd.ReplaceWrappedExpressions <double>(e.Args[0])));
        }