我对于制造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
结束)
答案 0 :(得分:0)
我不了解有关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