/// <summary>
 /// Creates a new parameter attribute with a blank matching pattern
 /// </summary>
 /// <param name="usage">How the parameter is used in the command</param>
 /// <param name="type">The system type of the parameter expected</param>
 /// <param name="cacheTypes">How this parameter can be found (is it data, is it a live entity)</param>
 /// <param name="optional">Is this parameter optional</param>
 public CommandParameterAttribute(CommandUsage usage, Type type, CacheReferenceType[] cacheTypes, bool optional)
 {
     Usage = usage;
     ParameterType = type;
     CacheTypes = cacheTypes;
     RegExPattern = string.Empty;
     Optional = optional;
 }
        protected virtual void PrintUsage(CommandUsage usage)
        {
            var descriptors = CommandDescriptor.GetMemberDescriptors(this);
            var printer     = new CommandMemberUsagePrinter(this.ExecutionName, this, this.Aliases)
            {
                Usage           = usage,
                IsAnsiSupported = this.IsAnsiSupported
            };

            printer.Print(this.Out, descriptors.ToArray());
        }
示例#3
0
        private void ProcessTheCommand(CommandReceivedEventArgs e,
                                       IChatClient chatClient, IBotCommand botCommand, IList <string> args)
        {
            CommandUsage commandUsage       = AttemptToRunCommand(e, botCommand, chatClient, args);
            var          commandUsageEntity = new CommandUsageEntity(e.CommandWord,
                                                                     botCommand.GetType().FullName, e.ChatUser.UserId,
                                                                     e.ChatUser.DisplayName, chatClient.GetType().Name);

            _repository.Create(commandUsageEntity);
            _usageTracker.RecordUsage(commandUsage);
        }
示例#4
0
        private string ParseAvatars(GenshinIndex genshinIndex, CommandUsage command)
        {
            var avatarsText = genshinIndex.Avatars.Select(avatar =>
                                                          $"{avatar.Name} {avatar.Level}级 好感{avatar.RelationShip}级 {avatar.Constellations}命 ");

            if (!command.HasOption("-Avatar"))
            {
                return(string.Empty);
            }

            return($":\n{string.Join(";", avatarsText).Trim()}");
        }
示例#5
0
        public async Task <string[]> ExecuteCommand(CommandUsage command)
        {
            foreach (var commandBase in Commands)
            {
                if (commandBase.GetCommandPrefix() == command.Prefix)
                {
                    return(await commandBase.Execute(command));
                }
            }

            return(null);
        }
示例#6
0
        public void WriteCommandNotFound_WritesNotFound()
        {
            string outputString;

            using (var newOut = new StringWriter(CultureInfo.InvariantCulture))
            {
                var previousOut = Console.Out;
                Console.SetOut(newOut);

                CommandUsage.WriteCommandNotFound("TestCommand");

                Console.SetOut(previousOut);
                outputString = newOut.ToString();
            }

            Assert.That(
                outputString,
                Is.EqualTo("Invalid command 'TestCommand'." + Environment.NewLine));
        }
示例#7
0
        public void WriteCommandUsage_WritesUsage()
        {
            string outputString;

            using (var newOut = new StringWriter(CultureInfo.InvariantCulture))
            {
                var previousOut = Console.Out;
                Console.SetOut(newOut);

                CommandUsage.WriteCommandUsage(this.commandMetadata);

                Console.SetOut(previousOut);
                outputString = newOut.ToString();
            }

            Assert.That(outputString, Does.Contain("TestCommand"));
            Assert.That(outputString, Does.Not.Contain("This is a test command."));
            Assert.That(outputString, Does.Contain("Arg0"));
            Assert.That(outputString, Does.Contain("Arg1"));
            Assert.That(outputString, Does.Not.Contain("This is Arg0 help text."));
            Assert.That(outputString, Does.Not.Contain("This is Arg1 help text."));
        }
示例#8
0
        public override async Task <string[]> Execute(CommandUsage command)
        {
            var genshinQuery = new GenshinQuery
            {
                Uid = command.MainParam
            };
            var genshinIndex = await genshinQuery.QueryGenshinIndex();

            return(new[]
            {
                $"UID{genshinQuery.Uid}的账号",
                $"共有{genshinIndex.Stats.Avatars}个角色{ParseAvatars(genshinIndex, command)}",
                $"活跃了{genshinIndex.Stats.ActiveDays}天",
                $"取得了{genshinIndex.Stats.Achievements}个成就",
                $"找到了{genshinIndex.Stats.AnemoCulus}个风神瞳和{genshinIndex.Stats.GeoCulus}个岩神瞳",
                $"解锁了{genshinIndex.Stats.Waypoints}个传送点和{genshinIndex.Stats.Domains}个秘境",
                $"开启了{genshinIndex.Stats.LuxuriousChests}个华丽的宝箱",
                $"{genshinIndex.Stats.PreciousChests}个珍贵的宝箱",
                $"{genshinIndex.Stats.ExquisiteChests}个精致的宝箱",
                $"{genshinIndex.Stats.CommonChests}个普通的宝箱",
                $"凹到了深渊{genshinIndex.Stats.SpiralAbyss}"
            });
        }
示例#9
0
        public GeneralModule(RuntimeModule m)
        {
            EventSystem.Instance.AddCommandDoneEvent(x =>
            {
                x.Name         = "--count-commands";
                x.processEvent = async(msg, e, s, t) =>
                {
                    if (s)
                    {
                        using (var context = new MikiContext())
                        {
                            CommandUsage u = await context.CommandUsages.FindAsync(msg.Author.Id.ToDbLong(), e.Name);
                            if (u == null)
                            {
                                u = context.CommandUsages.Add(new CommandUsage()
                                {
                                    UserId = msg.Author.Id.ToDbLong(), Amount = 1, Name = e.Name
                                }).Entity;
                            }
                            else
                            {
                                u.Amount++;
                            }

                            User user = await User.GetAsync(context, msg.Author);

                            if (user != null)
                            {
                                user.Total_Commands++;
                            }

                            await context.SaveChangesAsync();
                        }
                    }
                };
            });
        }
示例#10
0
 public static bool HasOption(this CommandUsage ex, string optionName)
 {
     return(ex.Options.HasOptions() && ex.Options.Any(s => s == optionName));
 }
示例#11
0
 public abstract Task <string[]> Execute(CommandUsage command);
示例#12
0
        public async Task ProfileAsync(EventContext e)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();

            using (var context = new MikiContext())
            {
                long  id  = 0;
                ulong uid = 0;

                if (e.message.MentionedUserIds.Any())
                {
                    uid = e.message.MentionedUserIds.First();
                    id  = uid.ToDbLong();
                }
                else
                {
                    uid = e.message.Author.Id;
                    id  = uid.ToDbLong();
                }

                Locale       locale      = new Locale(e.Channel.Id.ToDbLong());
                IDiscordUser discordUser = await e.Guild.GetUserAsync(uid);

                User account = await User.GetAsync(context, discordUser);

                EmojiBarSet onBarSet = new EmojiBarSet(
                    "<:mbarlefton:391971424442646534>",
                    "<:mbarmidon:391971424920797185>",
                    "<:mbarrighton:391971424488783875>");

                EmojiBarSet offBarSet = new EmojiBarSet(
                    "<:mbarleftoff:391971424824459265>",
                    "<:mbarmidoff:391971424824197123>",
                    "<:mbarrightoff:391971424862208000>");

                if (account != null)
                {
                    IDiscordEmbed embed = Utils.Embed
                                          .SetDescription(account.Title)
                                          .SetAuthor(locale.GetString("miki_global_profile_user_header", account.Name), "", "https://patreon.com/mikibot")
                                          .SetThumbnailUrl(discordUser.AvatarUrl);

                    long serverid = e.Guild.Id.ToDbLong();

                    LocalExperience localExp = account.LocalExperience.FirstOrDefault(x => x.ServerId == e.Guild.Id.ToDbLong());
                    if (localExp == null)
                    {
                        localExp = await LocalExperience.CreateAsync(context, serverid, id);
                    }

                    int rank = await localExp.GetRank(context);

                    int      localLevel  = User.CalculateLevel(localExp.Experience);
                    int      maxLocalExp = User.CalculateLevelExperience(localLevel);
                    int      minLocalExp = User.CalculateLevelExperience(localLevel - 1);
                    EmojiBar expBar      = new EmojiBar(maxLocalExp - minLocalExp, onBarSet, offBarSet, 6);

                    string infoValue = new MessageBuilder()
                                       .AppendText(locale.GetString("miki_module_accounts_information_level", localLevel, localExp.Experience, maxLocalExp))
                                       .AppendText(await expBar.Print(localExp.Experience - minLocalExp, e.Channel))
                                       .AppendText(locale.GetString("miki_module_accounts_information_rank", rank))
                                       .AppendText("Reputation: " + account.Reputation, MessageFormatting.Plain, false)
                                       .Build();
                    embed.AddInlineField(locale.GetString("miki_generic_information"), infoValue);

                    int globalLevel  = User.CalculateLevel(account.Total_Experience);
                    int maxGlobalExp = User.CalculateLevelExperience(globalLevel);
                    int minGlobalExp = User.CalculateLevelExperience(globalLevel - 1);

                    int globalRank = await account.GetGlobalRankAsync();

                    EmojiBar globalExpBar = new EmojiBar(maxGlobalExp - minGlobalExp, onBarSet, offBarSet, 6);

                    string globalInfoValue = new MessageBuilder()
                                             .AppendText(locale.GetString("miki_module_accounts_information_level", globalLevel, account.Total_Experience, maxGlobalExp))
                                             .AppendText(await globalExpBar.Print(account.Total_Experience - minGlobalExp, e.Channel))
                                             .AppendText(locale.GetString("miki_module_accounts_information_rank", globalRank), MessageFormatting.Plain, false)
                                             .Build();

                    embed.AddInlineField(locale.GetString("miki_generic_global_information"), globalInfoValue);
                    embed.AddInlineField(locale.GetString("miki_generic_mekos"), account.Currency + "🔸");

                    List <Marriage> Marriages = account.Marriages?
                                                .Select(x => x.Marriage)
                                                .Where(x => !x.IsProposing)
                                                .OrderBy(mar => mar.TimeOfMarriage)
                                                .ToList();

                    List <User> users = new List <User>();

                    int maxCount = Marriages?.Count ?? 0;

                    for (int i = 0; i < maxCount; i++)
                    {
                        users.Add(await context.Users.FindAsync(Marriages[i].GetOther(id)));
                    }

                    if (Marriages?.Count > 0)
                    {
                        List <string> MarriageStrings = new List <string>();

                        for (int i = 0; i < maxCount; i++)
                        {
                            if (Marriages[i].GetOther(id) != 0)
                            {
                                MarriageStrings.Add($"💕 {users[i].Name} (_{Marriages[i].TimeOfMarriage.ToShortDateString()}_)");
                            }
                        }

                        embed.AddInlineField(
                            locale.GetString("miki_module_accounts_profile_marriedto"),
                            string.Join("\n", MarriageStrings));
                    }

                    Random r = new Random((int)id - 3);

                    embed.Color = new Miki.Common.Color((float)r.NextDouble(), (float)r.NextDouble(),
                                                        (float)r.NextDouble());

                    CommandUsage favouriteCommand = account.CommandsUsed?
                                                    .OrderByDescending(c => c.Amount)
                                                    .FirstOrDefault();

                    string favCommand = $"{favouriteCommand?.Name ?? locale.GetString("miki_placeholder_null")} ({ favouriteCommand?.Amount ?? 0 })";

                    embed.AddInlineField(locale.GetString("miki_module_accounts_profile_favourite_command"),
                                         favCommand);

                    if (account.Achievements != null)
                    {
                        string achievements = AchievementManager.Instance.PrintAchievements(account.Achievements);

                        embed.AddInlineField(
                            locale.GetString("miki_generic_achievements"),
                            achievements != "" ? achievements : locale.GetString("miki_placeholder_null"));
                    }

                    embed.SetFooter(
                        locale.GetString("miki_module_accounts_profile_footer", account.DateCreated.ToShortDateString(),
                                         sw.ElapsedMilliseconds), "");

                    sw.Stop();

                    embed.QueueToChannel(e.Channel);
                }
                else
                {
                    e.ErrorEmbed(locale.GetString("error_account_null"))
                    .QueueToChannel(e.Channel);
                }
            }
        }
示例#13
0
 public CommandUsageAttribute(CommandUsage usage)
 {
     Usage = usage;
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="name">名稱</param>
 /// <param name="usage">用法</param>
 public RelayCommandAttribute(string name, CommandUsage usage)
 {
     Name = name;
     Usage = usage;
 }
示例#15
0
 public IrcCommandAttribute(string commandName, CommandUsage usage = CommandUsage.All)
     : base()
 {
     _commandUsage = usage;
     _commandName = commandName;
 }
示例#16
0
 void ICommandUsage.Print(CommandUsage usage)
 {
     this.PrintUsage(usage);
 }
示例#17
0
        public async Task ProfileAsync(EventContext e)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();

            using (var context = new MikiContext())
            {
                long  id  = 0;
                ulong uid = 0;

                var arg = e.Arguments.FirstOrDefault();

                if (arg != null)
                {
                    uid = (await arg.GetUserAsync(e.Guild)).Id;
                    id  = uid.ToDbLong();
                }
                else
                {
                    uid = e.message.Author.Id;
                    id  = uid.ToDbLong();
                }

                IDiscordGuildUser discordUser = await e.Guild.GetUserAsync(uid);

                User account = await User.GetAsync(context, discordUser);

                string icon = "";

                if (await account.IsDonatorAsync(context))
                {
                    icon = "https://cdn.discordapp.com/emojis/421969679561785354.png";
                }

                if (account != null)
                {
                    EmbedBuilder embed = Utils.Embed
                                         .SetDescription(account.Title)
                                         .SetAuthor(e.GetResource("miki_global_profile_user_header", account.Name), icon, "https://patreon.com/mikibot")
                                         .SetThumbnail(discordUser.GetAvatarUrl());

                    long serverid = e.Guild.Id.ToDbLong();

                    LocalExperience localExp = await LocalExperience.GetAsync(context, e.Guild.Id.ToDbLong(), discordUser);

                    if (localExp == null)
                    {
                        localExp = await LocalExperience.CreateAsync(context, serverid, discordUser);
                    }

                    int rank = await localExp.GetRank(context);

                    int localLevel  = User.CalculateLevel(localExp.Experience);
                    int maxLocalExp = User.CalculateLevelExperience(localLevel);
                    int minLocalExp = User.CalculateLevelExperience(localLevel - 1);

                    EmojiBar expBar = new EmojiBar(maxLocalExp - minLocalExp, onBarSet, offBarSet, 6);

                    string infoValue = new MessageBuilder()
                                       .AppendText(e.GetResource("miki_module_accounts_information_level", localLevel, localExp.Experience, maxLocalExp))
                                       .AppendText(await expBar.Print(localExp.Experience - minLocalExp, (IDiscordGuildChannel)e.Channel))
                                       .AppendText(e.GetResource("miki_module_accounts_information_rank", rank))
                                       .AppendText("Reputation: " + account.Reputation, MessageFormatting.Plain, false)
                                       .Build();

                    embed.AddInlineField(e.GetResource("miki_generic_information"), infoValue);

                    int globalLevel  = User.CalculateLevel(account.Total_Experience);
                    int maxGlobalExp = User.CalculateLevelExperience(globalLevel);
                    int minGlobalExp = User.CalculateLevelExperience(globalLevel - 1);

                    int globalRank = await account.GetGlobalRankAsync();

                    EmojiBar globalExpBar = new EmojiBar(maxGlobalExp - minGlobalExp, onBarSet, offBarSet, 6);

                    string globalInfoValue = new MessageBuilder()
                                             .AppendText(e.GetResource("miki_module_accounts_information_level", globalLevel, account.Total_Experience, maxGlobalExp))
                                             .AppendText(
                        await globalExpBar.Print(account.Total_Experience - minGlobalExp, e.Channel as IDiscordGuildChannel)
                        )
                                             .AppendText(e.GetResource("miki_module_accounts_information_rank", globalRank), MessageFormatting.Plain, false)
                                             .Build();

                    embed.AddInlineField(e.GetResource("miki_generic_global_information"), globalInfoValue);
                    embed.AddInlineField(e.GetResource("miki_generic_mekos"), account.Currency + "<:mekos:421972155484471296>");

                    List <UserMarriedTo> Marriages = await Marriage.GetMarriagesAsync(context, id);

                    Marriages.RemoveAll(x => x.Marriage.IsProposing);

                    List <string> users = new List <string>();

                    int maxCount = Marriages?.Count ?? 0;

                    for (int i = 0; i < maxCount; i++)
                    {
                        users.Add(await User.GetNameAsync(context, Marriages[i].GetOther(id)));
                    }

                    if (Marriages?.Count > 0)
                    {
                        List <string> MarriageStrings = new List <string>();

                        for (int i = 0; i < maxCount; i++)
                        {
                            if (Marriages[i].GetOther(id) != 0)
                            {
                                MarriageStrings.Add($"💕 {users[i]} (_{Marriages[i].Marriage.TimeOfMarriage.ToShortDateString()}_)");
                            }
                        }

                        string marriageText = string.Join("\n", MarriageStrings);
                        if (string.IsNullOrEmpty(marriageText))
                        {
                            marriageText = e.GetResource("miki_placeholder_null");
                        }

                        embed.AddInlineField(
                            e.GetResource("miki_module_accounts_profile_marriedto"),
                            marriageText);
                    }

                    Random r = new Random((int)id - 3);
                    Color  c = new Color((float)r.NextDouble(), (float)r.NextDouble(), (float)r.NextDouble());

                    embed.SetColor(c);

                    CommandUsage favouriteCommand = await context.CommandUsages
                                                    .OrderByDescending(x => x.Amount)
                                                    .FirstOrDefaultAsync(x => x.UserId == id);

                    string favCommand = $"{favouriteCommand?.Name ?? e.GetResource("miki_placeholder_null")} ({ favouriteCommand?.Amount ?? 0 })";

                    embed.AddInlineField(e.GetResource("miki_module_accounts_profile_favourite_command"),
                                         favCommand);

                    List <Achievement> allAchievements = await context.Achievements.Where(x => x.Id == id).ToListAsync();

                    string achievements = e.GetResource("miki_placeholder_null");

                    if (allAchievements != null)
                    {
                        if (allAchievements.Count > 0)
                        {
                            achievements = AchievementManager.Instance.PrintAchievements(allAchievements);
                        }
                    }

                    embed.AddInlineField(
                        e.GetResource("miki_generic_achievements"),
                        achievements);

                    embed.SetFooter(
                        e.GetResource("miki_module_accounts_profile_footer", account.DateCreated.ToShortDateString(),
                                      sw.ElapsedMilliseconds), "");

                    sw.Stop();

                    embed.ToEmbed().QueueToChannel(e.Channel);
                }
                else
                {
                    e.ErrorEmbed(e.GetResource("error_account_null"))
                    .ToEmbed().QueueToChannel(e.Channel);
                }
            }
        }
示例#18
0
 private bool Equals(CommandUsage other)
 {
     return string.Equals(Usage, other.Usage) && string.Equals(Description, other.Description) && Order == other.Order;
 }