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

问题描述 投票:0回答:1

我对制造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

结束)

lua bots discord
1个回答
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
    
© www.soinside.com 2019 - 2024. All rights reserved.