自动更新嵌入 (discord.js)

Posted

技术标签:

【中文标题】自动更新嵌入 (discord.js)【英文标题】:Automatically updating embeds (discord.js) 【发布时间】:2021-01-13 08:13:26 【问题描述】:

我正在制作一个不和谐的机器人命令,它充当一种排队系统的形式。

    通知已发出 公告有一个字段,其中列出了执行命令的人员列表。 该角色允许他们访问语音通道和文本通道,但如果他们在特定时间(准确地说是 5 分钟)后离开语音通道,则该角色将被剥夺。李>

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

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

角色将被赋予一个任何用户都可以执行的命令,并且该命令只能在嵌入发送出去时使用。

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

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

【问题讨论】:

如果可能的话,请给我一个简短的总结。 您的问题需要更加集中。 我现在更新了,我想不出另一种方式来解释我想要什么。 【参考方案1】:

我相信我已经做到了。我会给出代码,然后告诉你一切在哪里。

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 中写入五分钟还没有过去,并保存它。然后它给成员角色,然后等待五分钟,然后再写入五分钟过去的文件。

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

【讨论】:

以上是关于自动更新嵌入 (discord.js)的主要内容,如果未能解决你的问题,请参考以下文章

discord.js 如何编辑/更新嵌入?

Discord.js 使用来自其他消息的附件来更新嵌入中的图像

嵌入中的 Discord.js 秒精度更新计时器

Discord.js - 在以下代码中更新 MessageEmbed

使用 Discord 按钮的建议命令 Discord.JS

Discord.js V13:如何编辑交互的消息对象?