【问题标题】:Make bot type something if a specific user types something random?如果特定用户随机输入一些东西,让机器人输入一些东西?
【发布时间】:2017-10-14 12:04:25
【问题描述】:

我是 C# 新手。我希望我的 Discord 机器人在特定用户键入任何内容时说些什么。例如,如果他输入一些东西,机器人会回应“闭嘴”。对话如下:

用户:你好,机器人!
机器人:闭嘴

我能想到的只有这个:

                commands.CreateCommand("test")
                .AddCheck((command, user, channel) => user.Id == < user id >)
                .Do(async (e) =>
        {
                await e.User.SendMessage("shut up");
        });

这根本不是我想要它做的,因为这是一个使用 prefixchar = !test 并且还通过私人消息发送消息的命令。

【问题讨论】:

    标签: c# discord discord.net


    【解决方案1】:

    对于您心目中的特定用户,是否有任何有效的输入?如果没有,那么您可以尝试在您的异步消息接收函数被调用时进行条件用户检查:

            private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
            {
                var activity = await result as Activity;
    
                if (activity != null && activity.Text.ToLower().Contains(username))
                {
                    await context.PostAsync($"Shut up {username}!");
                }                      
    
                context.Wait(MessageReceivedAsync);
            }

    如果机器人需要回复“闭嘴 {username}!”对于每个用户,您可以将响应绑定到消息控制器中的 ConversationUpdate:

     private async Task<Activity> HandleSystemMessage(Activity message)
            {
                switch (message.Type)
                {
                    case ActivityTypes.ConversationUpdate: 
                        IConversationUpdateActivity update = message;
                        using (
                            var scope =
                                Microsoft.Bot.Builder.Dialogs.Internals.DialogModule.BeginLifetimeScope(Conversation.Container,
                                    message))
                        {
                            var client = scope.Resolve<IConnectorClient>();
    
                            if (!update.MembersAdded.Any()) return null;
    
                            foreach (var newMember in update.MembersAdded)
                            {
                                if (newMember.Id == message.Recipient.Id) continue;
                                await _configurationLibrary.MultiThreadLoadSettings();
    
                                var reply = message.CreateReply();
                                reply.Text = $"Shut up {username}";
                                await client.Conversations.ReplyToActivityAsync(reply);
                            }
                        }
                        break;
                }
                return null;
            }

    switch 语句是为了以防万一你想扩大规模。

    【讨论】:

    • 您好,感谢您的评论!机器人应该只能将关闭代码回复给在频道中键入的 1 个特定用户,而不是每个键入的用户,例如代码可以检测到用户的用户 ID 或特定角色:)
    • 您可以使用任何一个示例,但从干净的代码角度来看,我建议使用第一个示例并将 user.ID 作为用户名传递。您是对需要获得该回复的特定用户 ID 进行硬编码,还是将其存储在某个数据库中?
    • 我似乎在第一个代码中得到了这 2 个错误:错误 CS1061:'IAwaitable' 不包含 'GetAwaiter' 的定义,并且没有扩展方法 'GetAwaiter' 接受第一个参数可以找到类型“IAwaitable”(您是否缺少 using 指令或程序集引用?)并且错误 CS1061:“object”不包含“ToLower”的定义,并且没有扩展方法“ToLower”接受第一个参数可以找到“对象”类型的(您是否缺少 using 指令或程序集引用?)
    • 你如何调用私有异步任务 MessageReceivedAsync(IDialogContext context, IAwaitable result)?这些错误表明您传入的对象没有 toLower 函数(例如,不是字符串或字节)/不是实际对象,并且在调用该方法时没有正确使用多线程。
    • 是的,我可能做错了什么或将其插入错误的位置,我对此很陌生,所以我不确定我大部分时间都在做什么:P ..这就是我插入它的方式pastebin.com/n4icxe0H
    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2013-07-18
    • 2021-08-10
    • 2014-03-02
    相关资源
    最近更新 更多