【问题标题】:Is there a way to overload commands in Discord.net?有没有办法在 Discord.net 中重载命令?
【发布时间】:2022-05-03 02:39:03
【问题描述】:

我的 Discord Bot 有两个模块:第一个是 UserModule,用户可以执行每个命令,第二个是 AdminModule,服务器管理员可以在其中自定义和设置机器人。现在我在我的 UserModule 中得到了命令Money,这使得机器人告诉执行者他有多少钱。但是管理员还有另一个金钱命令:

[Group("Money")]
    class Credits : ModuleBase
    {
        [Command("add")]
        public void AddMoney(IGuildUser user, int amount)
        {
            int money = Convert.ToInt32(DBConnector.GetInstance().GetDBData
                ($"SELECT Money FROM Users WHERE UserID = {user.Id} AND ServerID = {Context.Guild.Id}")[0]);

            //This will be read from the database in the future
            bool capped = false;

            if (capped)
            {
                int maxAmount = Convert.ToInt32(DBConnector.GetInstance().GetDBData
                ($"SELECT Money FROM Users WHERE UserID = {user.Id} AND ServerID = {Context.Guild.Id}")[0]);

                if (money + amount > maxAmount)
                {
                    amount = maxAmount - money;
                }
            }

            DBConnector.GetInstance().ExecuteCommand($"UPDATE Users SET Money=Money+{amount} WHERE UserID = {user.Id} AND ServerID = {Context.Guild.Id}");
        }
//some more commands
...

这是 AdminModule 中的一个子模块,显然用于手动向用户添加或移除资金。但是当我想用//money add @user 10 测试命令时,我得到了错误,“输入文本的参数太多”。 这表明,bot 使用的是 UserCommand 而不是 AdminCommand,所以我想知道如何让 bot 实现

"Hey, that command has a usermention and an integer. This is also the case for the admin command. Let me execute that one"

【问题讨论】:

    标签: c# discord.net


    【解决方案1】:

    如果我看到这个问题,你有两个解决这个问题的方法。

    1。解决方案

    我假设您的不同用户具有不同的角色。因此,您的管理员获得了一个名为 Server Admin 或类似的角色。您可以创建自定义 PreconditionAttribute,请参阅 documentation 以获取示例。此属性可能会为提供的所有角色返回错误。这样你就可以为管理员“禁止”//money add 命令。然后另一个只允许管理员执行它的管理员版本。

    2。解决方案

    这个有点脏,不推荐。您只能保留一个 Add 命令,其中包含普通用户和管理员用户的逻辑。使用 if 语句,您可以检查他们的角色并决定下一步。

    我很确定第一个解决方案会更好地满足您的需求。

    【讨论】:

    • 但是如果每个模块中都有相同的命令,并且用户模块中的命令仅限于每个人,那么当管理员执行它时我会得到一个成功和一个错误消息.我还想避免模块中的角色先决条件,这就是我使用这些模块的原因。每个人的用户模块,管理员的管理模块。如果我在用户模块中放置了一个管理员命令,并且有它的前提条件,那么如果我不遵守“没有直接对命令进行角色限制”的规则,那么整个模块设置将毫无用处
    • 我明白你的问题了。你可以再尝试一件事。尝试手动添加模块,而不仅仅是整个程序集。您可以通过更改添加模块的顺序来实现您想要的。我不确定它是如何实现的。你还是应该试一试。
    • 如果这不起作用,您需要编写自定义 CommandService 或使用 RolePreconditions。
    • 奇怪的是,我在 UserModule 中已经有了一个/Money 命令。用户得到他自己的钱作为输出。对于管理员,我有相同的命令,但使用 IGuildUser 作为参数。在那里你得到你提到的任何人的钱。这也有效。在它不起作用后,我将命令从 Group("Money") -> Command("add"), Command("delete"), Command("info") 更改为 3 个单独的命令:Command("Money add")、Command("Money remove")、Command("Money info")
    • @Deantwo 已更新。
    猜你喜欢
    • 2021-07-07
    • 2020-12-02
    • 1970-01-01
    • 2019-10-12
    • 2022-12-12
    • 2022-06-10
    • 2015-05-16
    • 2020-05-04
    • 2011-12-05
    相关资源
    最近更新 更多