为什么这个不和谐的机器人告诉我:踢是一个零值?

时间:2020-05-14 18:24:24

标签: lua bots discord

我对于制造Discord机器人是极其陌生的。我正在使用discordia作为图书馆。当前,我正在执行kick命令,但是由于某种原因,当我尝试踢提到的用户时,它说“ bot.lua:52:尝试调用方法'kick'(nil值)”。但是,如果我要尝试踢发邮件的人,那很好。

client:on("messageCreate", function(msg)
local content = msg.content
local member = msg.member
local channel = msg.guild
local Author = msg.author

if content:sub(1,5) == prefix.."kick" then
    local isMod = false

    local function checkIfIsMod()
        for i, v in pairs(member.roles) do
            if v.name:lower() == "admin" then
                isMod = true
            end
        end
    end

    checkIfIsMod()

    if isMod then
        print("yes")
        if #msg.mentionedUsers > 1 then

        msg:reply("Mention one user at a time!")

        elseif #msg.mentionedUsers == 0 then

        msg:reply("Mention someone!")

        elseif #msg.mentionedUsers == 1 then
        local mentioned = msg.mentionedUsers[1]


        mentioned:kick()
        msg:reply("kicked")
        end
    else
        msg:reply("You aren't a mod!")
    end
end

结束)

1 个答案:

答案 0 :(得分:0)

我不了解有关Discordia的所有内容,但是我已经阅读了文档和测试,希望现在可以阐明问题: 每个连接的人都有机器人已知的两个对象:UserMember。用户是Discord帐户,成员是服务器中的某人。实际而言:您以用户身份登录 Discord 。您是多台服务器成员

您不能踢用户,因为用户未连接到服务器。成员是。 kick是会员的方法。

msg.author返回一个Usermsg.member返回一个Member。您在帖子中说,您可以踢信人。您没有显示此代码,但是我必须假设您正在kick上调用msg.member,因为它不适用于msg.author

当您提及用户时,它们将作为ID列表(msg.mentionedUsers)返回。每个ID都有一个用户,但一个用户可以是多个服务器上的多个“成员”。您需要获得被提及的User与被提及的公会(服务器)之间的成员关系。您可以使用Guild:getMember(ID)来实现。您也可以使用Guild.members:get(ID)(根据文档)执行此操作,但这已被缓存。脱机成员不一定要缓存(该方法已知),因此我发现使用Guild:getMember(ID)(将发出HTTP请求)更安全。您可以使用msg.guild获得公​​会(如原始代码所示)。

这是正在运行的代码,它遍历所有提到的用户并将其踢出。您可以对此进行重新设计以仅在需要时踢第一人称。您可以将其放在您的if isMod then语句中。

for id in msg.mentionedUsers:iter() do
    local u = msg.guild:getMember(id)
    print("kicking", u.name)
    u:kick()
end