我对制造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
结束)
我不了解有关Discordia的所有内容,但是我已经阅读了文档和测试,希望现在可以阐明问题:每个连接的人都有机器人已知的两个对象:User
和Member
。用户是Discord帐户,成员是服务器中的某人。实际而言:您以用户身份登录Discord。您是多个服务器的成员。
您不能踢用户,因为用户未连接到服务器。会员是。 kick
是成员的方法。
[msg.author
返回User
,msg.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