自动更新嵌入(discord.js)

时间:2020-09-27 15:55:27

标签: discord.js

我正在制作一种不和谐的bot命令,该命令充当一种排队系统。

  1. 公告已发送
  2. 公告中有一个字段,该字段列出了执行命令并赋予角色的人员列表。
  3. 该角色使他们可以访问语音通道和文本通道,但是,如果他们在特定时间段(准确地说是5分钟)后离开语音通道,则该角色将被剥夺。 li>

我只想知道这些是否可行:

我让机器人发送了一条嵌入消息,该消息包含一个字段。在该字段中,机器人可以自动使用具有特定角色的人员的用户名来更新该字段吗?

该角色将由任何用户都可以执行的命令赋予,并且仅当嵌入发送出去时才能使用该命令。

我只希望在特定频道中更新最近嵌入的MOST。

可以做什么和不能做什么。 Discord.js版本12

1 个答案:

答案 0 :(得分:0)

我相信我已经做到了。我将给出代码,然后向您显示所有内容。

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);

这是正在发生的事情:

首先,我们定义一个函数,该函数定义一个频道和具有角色的人员列表。 然后,我们稍后再根据定义的消息编辑嵌入。 我们还声明,我们将每4秒重复updateEmbed

client.on('ready', () => {

});

part与updateEmbed函数相同,最后还有一些额外的位。 这些额外的功能可以做到:1.允许人们成为HeJjo,并且2.对其进行设置,以便在10秒后人们不再可以更改其角色。 (ps:这里的代码就是命令中允许人们更改角色的代码。)

当有人进入或离开语音通道时,下一部分将触发。 它检查是否有人离开,否则返回。如果是,则我们检查该角色成员是否限制了语音通道。如果是这样,我们确定是否已经过去了五分钟。如果有,我们将删除HeJjo角色。

下一段代码是当有人发消息时。仅当消息为'!become role'时才在内部运行代码,并且使用此命令还为时不晚。里面的代码是这样的:

它在Json中写道,五分钟还没有过去,然后保存它。然后,它将角色赋予该成员,然后等待五分钟,然后再写五分钟。

希望这会有所帮助!! ??