discord.js - 自动更新嵌入 (discord.js)
问题描述
我正在制作一个不和谐的机器人命令,它充当一种排队系统的形式。
- 公告发出
- 该公告有一个字段,其中列出了执行命令的人员列表,该命令赋予了他们一个角色。
- 该角色使他们可以访问语音通道和文本通道,但是如果他们在特定时间(准确地说是 5 分钟)后离开语音通道,则该角色将被剥夺。
我只想知道这些是否可能:
我让机器人发送嵌入消息,该消息有一个字段。在该字段中,我可以让机器人使用具有特定角色的人的用户名自动更新该字段吗?
该角色将被赋予一个任何用户都可以执行的命令,并且该命令只能在嵌入发送出去时使用。
我只希望在特定频道中更新最新的嵌入。
什么可以做,什么不能做。Discord.js 版本 12
解决方案
我相信我已经做到了。我会给出代码,然后告诉你一切都在哪里。
require('dotenv').config();
const Discord = require('discord.js');
const client = new Discord.Client();
const fs = require("fs");
client.saves = require("./minutesLogs.json");
var embed;
var role;
var member;
var myMessage;
var canBecomeHejjo = false;
function updateEmbed() {
var channel = client.guilds.cache.get("753227876207165570").channels.cache.get("753227876207165573");
var withRole = channel.guild.roles.cache.get("753237265454465154").members.map(m => m.user.tag);
if (withRole[0] !== undefined) {
embed = new Discord.MessageEmbed()
.setColor('#8547cc')
.setTitle("People who have role")
.setAuthor("A bot")
.addField('List', withRole, true)
.setTimestamp()
.setFooter("The members with this role");
} else {
embed = new Discord.MessageEmbed()
.setColor('#8547cc')
.setTitle("People who have role")
.setAuthor("A bot")
.addField('List', 'No one with role', true)
.setTimestamp()
.setFooter("The members with this role");
}
myMessage.edit(embed);
}
setInterval(updateEmbed, 4000);
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
var channel = client.guilds.cache.get("753227876207165570").channels.cache.get("753227876207165573");
var withRole = channel.guild.roles.cache.get("753237265454465154").members.map(m => m.user.tag);
console.log(withRole);
if (withRole[0] !== undefined) {
embed = new Discord.MessageEmbed()
.setColor('#8547cc')
.setTitle("People who have role")
.setAuthor("A bot")
.addField('List', withRole, true)
.setTimestamp()
.setFooter("The members with this role");
} else {
embed = new Discord.MessageEmbed()
.setColor('#8547cc')
.setTitle("People who have role")
.setAuthor("A bot")
.addField('List', 'No one with role', true)
.setTimestamp()
.setFooter("The members with this role");
}
channel.send(embed).then(message => {
myMessage = message;
});
console.log(myMessage);
canBecomeHejjo = true;
setTimeout(() => {
canBecomeHejjo = false;
}, 10000);
});
client.on('voiceStateUpdate', (oldMember, newMember) => {
console.log(oldMember.channelID);
if (oldMember.channelID === undefined) {
console.log("undefined");
return;
}
const oldUserChannel = oldMember.channelID;
var memberToChange = client.guilds.cache.get("753227876207165570").members.cache.get(oldMember.id);
if (oldUserChannel === '760146985147433040') {
var fiveMinutesHappened = client.saves[oldMember.id].fiveminutesPassed;
if (fiveMinutesHappened) {
memberToChange.roles.remove(role);
}
}
});
client.on('message', msg => {
console.log(canBecomeHejjo);
if (msg.content === '!become role' && canBecomeHejjo === true) {
console.log("in");
member = msg.guild.members.cache.get(msg.member.id);
client.saves[member.id] = {
fiveminutesPassed: false
}
fs.writeFile("./minutesLogs.json", JSON.stringify(client.saves, null, 4), err => {
if (err) throw err;
});
channel = msg.channel;
channel.send("ok");
role = msg.guild.roles.cache.get("753237265454465154");
msg.member.roles.add(role);
setTimeout(() => {
client.saves[member.id] = {
fiveminutesPassed: true
}
fs.writeFile("./minutesLogs.json", JSON.stringify(client.saves, null, 4), err => {
if (err) throw err;
});
console.log("time passed");
}, 1000 * 10);
channel.send("done");
}
});
client.login(process.env.DISCORD_TOKEN);
这是正在发生的事情:
首先,我们定义一个函数,它定义了一个频道和具有角色的人员列表。然后,我们从稍后定义的消息中编辑嵌入。我们还声明我们将updateEmbed
每 4 秒重复一次。这
client.on('ready', () => {
});
部分与函数相同,最后updateEmbed
有一些额外的位。这些额外的部分可以:1. 允许人们成为 HeJjo,以及 2. 将其设置为 10 秒后,人们不能再改变他们的角色。(ps:这里的代码是命令中允许人们改变角色的代码)。
下一部分在有人进入或离开语音频道时触发。它检查是否有人离开,如果不是,则返回。如果是,那么我们检查它是否是我们角色成员限制的语音通道。如果是这样,我们确定是否已经过了五分钟。如果有,我们删除 HeJjo 角色。
下一段代码是当有人发消息时。如果消息是'!become role'
,它只运行里面的代码并且使用这个命令还为时不晚。里面的代码是这样的:
它在 Json 中写入五分钟还没有过去,并保存它。然后它给成员角色,然后等待五分钟,然后再写入五分钟过去的文件。
希望这可以帮助!!
推荐阅读
- php - 自动发送电子邮件(cron作业)
- javascript - 通过 JavaScript 将 php 变量传递到另一个 php 页面
- javascript - javascript从纪元值获取小时和分钟
- regex - Unix命令仅grep以“xyz ....”开头的子字符串直到第一个空格?
- git - Jenkins PollScm 用于特定存储库
- java - 在android的默认浏览器选择列表中添加我的浏览器?
- oauth-2.0 - 如何从 oauth2 传播已删除的用户 - JHipster,Okta
- c# - MailKit 设置附加后看到的 MessageFlag
- vb.net - MysqlDataAdapter.Update 不抛出异常
- javascript - 单击时停止音频并重播