Discord 机器人发送生日消息

Posted

技术标签:

【中文标题】Discord 机器人发送生日消息【英文标题】:Discord bot send birthday message 【发布时间】:2021-01-08 00:17:46 【问题描述】:

我制作了一个 Discord 机器人,我希望它能够检查当前日期,如果当前日期是任何用户的生日,那么它会标记他们并说生日快乐。我试过使用 Node.js 的日期,比如

if(Date === "this or that")

但这似乎不起作用。所以我需要帮助的是:

检查当前日期(例如每天检查一次或某事) 在当前日期发送消息

我可能只是硬编码所有的生日,因为我们没有那么多(我知道这不是一个好的做法,但我只是希望它现在可以工作,我可以稍后再完善它)

如果有人可以帮助我,那就太好了。

这就是我的 index.js 文件的样子(如果相关的话):

const discord = require("discord.js");
const config = require("./config.json");
const client = new discord.Client();
const prefix = '>';
const fs = require('fs');
const  time, debug  = require("console");
client.commands = new discord.Collection();
const commandFiles = fs.readdirSync('./commands/').filter(file => file.endsWith('.js'));
for(const file of commandFiles)

    const command = require(`./commands/$file`)
    client.commands.set(command.name, command);


client.once('ready', () => 

    console.log(`$client.user.username is online`);
)

client.on('message', message =>

    if(!message.content.startsWith(prefix) || message.author.bot) return;
    const args = message.content.slice(prefix.length).split(/ + /);
    const command = args.shift().toLowerCase();

    if(command === 'ping')
    
        client.commands.get('ping').execute(message, args);
    else if(command === 'wololo')
    
        client.commands.get('wololo').execute(message, args);        
    
)

client.login('TOKEN')

编辑:

我意识到我在“client.on('message',message =>)”中编写了“if(date)”语句,因此除非您在特定时间编写命令,否则显然不会检查。我会使用什么功能?

【问题讨论】:

【参考方案1】:

您可以查看 Discord.js 事件的完整列表 here。 Discord.js 中没有基于预定时间触发的内置事件。

为了做到这一点,您可以构建一个时间系统,每天根据超时或间隔触发事件。或者...您可以使用一个库,例如 node-cron 为您执行此操作。

我将尝试举例说明一种方法,您可以使用刚才所说的 node-cron 来做到这一点。

首先,您必须需要 node-cron 包,因此您可以使用 npm,就像使用 discord.js 本身一样。所以粘贴并在你的终端上执行这个命令:

npm install node-cron

很遗憾,Discord.js 没有为您提供获取用户生日日期的方法。因此,对生日进行硬编码(正如您所说的那样),并且对于本示例,您将发送祝贺消息的通用频道 ID,您可以这样:

const Discord = require('discord.js');
const cron = require('node-cron');

const client = new Discord.Client();

// Hard Coded Storing Birthdays in a Map
// With the key beeing the user ID
// And the value a simplified date object
const birthdays = new Map();
birthdays.set('User 1 Birthday Id',  month: 'Jan', day: 26 );
birthdays.set('User 2 Birthday Id',  month: 'Jun', day: 13 );
birthdays.set('User 3 Birthday Id',  month: 'Aug', day: 17 );

const setSchedules = () => 
  // Fetch the general channel that you'll send the birthday message
  const general = client.channels.cache.get('Your General Channels Id Go Here');

  // For every birthday
  birthdays.forEach((birthday, userId) => 
    // Define the user object of the user Id
    const user = client.users.cache.get(userId);
    
    // Create a cron schedule
    cron.schedule(`* * $birthday.day $birthday.month *`, () => 
      general.send(`Today's $user.toString() birthday, congratulations!`);
    );
  );
;

client.on('ready', setSchedules);
client.login('Your Token Goes Here');

这不是优化的,只是为了让您大致了解如何做到这一点。请注意,在设置任务之前应该先实例化客户端,所以我建议您像这个示例一样执行此操作并将计划设置为就绪。

无论如何,您始终可以使用已经创建并经过测试的机器人,例如 Birthday Bot。

【讨论】:

以上是关于Discord 机器人发送生日消息的主要内容,如果未能解决你的问题,请参考以下文章

(Discord 机器人)当用户加入 Discord 服务器(discord.js)时,如何发送欢迎消息?

Discord.js 机器人无法向特定频道发送消息

Discord.js 机器人在频道中的 10 条消息后发送消息

如何查找机器人在特定频道中发送的消息? [discord.js]

Discord 机器人停止发送欢迎消息

Discord 机器人不会向我标记的用户发送消息