Бот Discord отправляет сообщение о дне рождения

#node.js #discord #discord.js

#node.js #Discord #discord.js

Вопрос:

Я создал 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')  

Редактировать:

Я понимаю, что написал оператор «if (date)» в «client.on (‘message’,message => {})», так что, очевидно, это не будет проверяться, если вы не напишете команду в это конкретное время. Какую функцию я бы использовал?

Ответ №1:

Вы можете ознакомиться с полным списком Discord.js события здесь.
В нем нет встроенных событий Discord.js которые запускаются в соответствии с запланированным временем.

Чтобы сделать это, вы могли бы создать систему времени, которая запускает события каждый день на основе тайм-аута или интервала. Или… вы могли бы использовать библиотеку, например, node-cron, которая сделает это за вас.

Я попытаюсь показать на примере, как вы могли бы сделать это, используя только что упомянутый узел-cron.

Во-первых, вам потребуется пакет node-cron, поэтому вы можете использовать npm его так же, как и с discord.js сама по себе. Итак, вставьте и выполните эту команду на своем терминале:

 npm install node-cron
  

К сожалению, Discord.js не предлагает вам способа узнать дату рождения пользователя. Итак, жестко запрограммировав дни рождения (как вы заявили, что это нормально), а также, для этого примера, общий идентификатор канала, по которому вы будете отправлять сообщение с поздравлениями, вы могли бы сделать что-то вроде этого:

 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.