使用图像创建定时静音命令
Posted
技术标签:
【中文标题】使用图像创建定时静音命令【英文标题】:Creating a timed mute command with an image 【发布时间】:2019-01-04 06:38:58 【问题描述】:我正在和朋友一起为我的私人 Discord 服务器制作一个机器人,我们喜欢《星球大战》,所以我将它命名为 Darth Vader。我一直在看教程,使用这个机器人我已经做得很好,但我被困在一个命令上。此命令称为forcechoke
。它的作用是在聊天中添加一条消息:
Darth Vader: Forcechokes @fakeplayer for (时间以秒为单位)。 我在文件夹中包含我所有代码的附件(达斯维德窒息某人)。
基本上,它会将该人静音 60 秒,然后显示达斯维达窒息某人。命令:!forcechoke <@person> <time in seconds>
。我已经完成了!forcechoke
,您只需看看即可。
const commando = require('discord.js-commando');
class ForceChokeCommand extends commando.Command
constructor(client)
super(client,
name: 'forcechoke',
group: 'sith',
memberName: 'forcechoke',
description: 'Darth Vader will choke the person of your choice!',
args: [
key: 'user',
prompt: 'Who would you like me to forcechoke?',
type: 'user'
]
);
// THIS IS WHERE I NEED HELP
module.exports = ForceChokeCommand;
另外,如果我需要 npm 安装,请告诉我。
【问题讨论】:
【参考方案1】:1.将用户静音: 没有内置的方法可以使用户静音,您必须使用角色来做到这一点。创建一个角色(假设它称为静音)并撤销每个频道中的“发送消息”、“连接”、“发言”等权限。然后为该角色分配如下内容:
run(msg)
let mute_role = msg.guild.roles.find("name", "Mute");
let member = msg.mentions.members.first();
member.addRole(mute_role); // <- this assign the role
setTimeout(() => member.removeRole(mute_role);, 60 * 1000); // <- sets a timeout to unmute the user.
或者,您可以使用guild.channels.forEach()
和GuildChannel.overwritePermissions()
覆盖每个频道中该用户(甚至角色)的权限,这取决于您。
2。发送图片: 您可以使用在线图片的 URL 或路径:
msg.say(`Forcechockes $member for 60 seconds.`, file: "path or URL as a string");
- 回顾: 创建一个名为“静音”的角色(或任何您想要的角色,只需在代码中替换“静音”即可)。 找到一张图片,然后您既可以从网络上使用它,也可以将其保存在本地。我将从网络上获取一个,您可以将我的 URL 替换为另一个 URL 或文件的本地路径。 将此代码添加到您的命令文件中:
run(msg)
let mute_role = msg.guild.roles.find("name", "Mute"); // this is where you can replace the role name
let member = msg.mentions.members.first();
member.addRole(mute_role); // <- this assign the role
setTimeout(() => member.removeRole(mute_role);, 60 * 1000); // <- sets a timeout to unmute the user.
// V this is where the URL or the local path goes V
msg.say(`Forcechockes $member for 60 seconds.`, file: "https://lumiere-a.akamaihd.net/v1/images/databank_forcechoke_01_169_93e4b0cf.jpeg");
【讨论】:
我不是很擅长 javascript,所以你能帮我设置一下吗? Federico,我似乎收到错误消息:“ReferenceError: guild is not defined”。我的代码可能有问题吗?顺便说一句,感谢您的所有帮助。 对不起,我的错:我曾经将公会存储在guild
变量中,我编辑了我的答案。将我的代码第二行中的 guild.roles.find("name", "Mute")
替换为 msg.guild.roles.find("name", "Mute")
【参考方案2】:
使用恒定计时器静音
我的回答基本上是 Federico Grandi 所做的,但清除了更多内容并在 discord.js-commando 中实现。在扩展的Command
类中添加这个run()
方法。 run()
是 commando 中用于执行用户请求启动的进程的主要方法。
给你:
async run(message, args)
// get the user from the required args object
const userToMute = message.guild.members.find('id', args.user.id);
// find the name of a role called Muted in the guild that the message
// was sent from
const muteRole = message.guild.roles.find("name", "Muted");
// add that role to the user that should be muted
userToMute.addRole(muteRole);
// the time it takes for the mute to be removed
// in miliseconds
const MUTE_TIME = 60 * 1000;
// wait MUTE_TIME miliseconds and then remove the role
setTimeout(() =>
userToMute.removeRole(muteRole);
, MUTE_TIME);
message.channel.send(`*$message.author.username forcechockes $userToMute.user.username for $MUTE_TIME / 60 seconds*`, file: 'url/path' );
return;
如果您想知道 javascript 中的 async
关键字,这是一个相当新的东西,但它只是允许您运行此方法,而无需让您的机器人等待它完成。
setTimeout()
是一个 global javascript 函数,它只是告诉您的程序在运行该进程之前等待一定的时间。
() =>
基本上是function helloworld()
的简写
`$`
奇怪的字符串格式尝试读一点this。
希望这会有所帮助,学习一些 javascript 玩得开心 :) !
【讨论】:
我得到一个错误:TypeError: userToMute.addRole is not a function 更新了代码。没有意识到您从 args 返回的对象实际上并没有方法,只是数据!您必须将第一行更改为我更新的代码 在尝试使用您的代码时,我在 CommandMessage 下得到一条红线(错误),以及其他一些。将鼠标悬停在它上面的错误是:[js] 'types' 只能在 .ts 文件中使用。我需要用 npm 安装什么吗? 不,我的错误只是更新了代码以消除错误!以上是关于使用图像创建定时静音命令的主要内容,如果未能解决你的问题,请参考以下文章