UNPKG

discord-birthday

Version:

discord-birthday is a powerful package that allows you to create a birthday system on your discord bot easily and quickly.

236 lines (235 loc) 11.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Birthday = exports.Timezone = void 0; const tslib_1 = require("tslib"); const path = tslib_1.__importStar(require("path")); const cron = require('node-cron'); const fs = require('fs'); const EventEmitter = require('events'); const events = new EventEmitter(); const types_1 = require("./struct/types"); Object.defineProperty(exports, "Timezone", { enumerable: true, get: function () { return types_1.Timezone; } }); class Birthday { constructor(Client, Options) { this.on = (event, listener) => { events.on(event, listener); }; this.emit = (event, ...args) => { events.emit(event, ...args); }; this.save = () => { return new Promise((resolve, reject) => { fs.writeFile(path.join(__dirname + "../../birthday.json"), JSON.stringify(this.birthdays, null, 4), (err) => { if (err) return reject(err); else return resolve(); }); }); }; this.checkBirthdays = () => { let now = new Date(); let guilds = []; for (let userId in this.birthdays.birthdays) { const birthday = this.birthdays.birthdays[userId]; let date = new Date(birthday.date); if (date.getDate() == now.getDate() && date.getMonth() == now.getMonth()) { this.client.users.fetch(userId).then((user) => tslib_1.__awaiter(this, void 0, void 0, function* () { yield birthday.guilds.forEach((guildId) => { this.client.guilds.fetch(guildId).then((guild) => { guilds.push(guild); }); }); if (guilds.length > 0) this.emit("isBirthday", user, guilds); })).catch((err) => { throw err; }); } } }; this.setUserBirthday = (user, date, seeAge = true) => { if (isNaN(date.getTime())) throw new Error("Invalid date"); date.setHours(23, 59, 59, 999); this.birthdays.birthdays[user.id] = { userId: user.id, seeAge: seeAge, date: date, guilds: this.birthdays.birthdays[user.id] ? this.birthdays.birthdays[user.id].guilds : [] }; this.save().then(() => { this.emit("birthdayUserSet", user, date); }).catch((err) => { throw err; }); return this; }; this.getUserBirthday = (user) => tslib_1.__awaiter(this, void 0, void 0, function* () { return new Promise((resolve) => tslib_1.__awaiter(this, void 0, void 0, function* () { let guilds = []; if (!this.birthdays.birthdays[user.id]) return resolve(undefined); const date = new Date(this.birthdays.birthdays[user.id].date); date.setFullYear(new Date().getFullYear()); if (date.getTime() < Date.now()) { date.setFullYear(new Date().getFullYear() + 1); } let daysBeforeNext = Math.floor((Date.now() - date.getTime()) / (60 * 60 * 24 * 1000)) < 0 ? Math.floor((Date.now() - date.getTime()) / (60 * 60 * 24 * 1000)) * -1 : Math.floor((Date.now() - date.getTime()) / (60 * 60 * 24 * 1000)); yield this.birthdays.birthdays[user.id].guilds.forEach((guildId) => { this.client.guilds.fetch(guildId).then((guild) => { guilds.push(guild); }); }); const data = { user: user, seeAge: this.birthdays.birthdays[user.id].seeAge, date: new Date(this.birthdays.birthdays[user.id].date), age: Math.floor((Date.now() - new Date(this.birthdays.birthdays[user.id].date).getTime()) / (60 * 60 * 24 * 365.25 * 1000)), nextBirthday: date, daysBeforeNext: daysBeforeNext - 1, guilds: guilds }; return resolve(data); })); }); this.deleteUserBirthday = (user) => { if (!this.birthdays.birthdays[user.id]) return this; this.birthdays.birthdays[user.id].guilds.forEach((guildId) => { this.birthdays.guilds[guildId].birthdays.splice(this.birthdays.guilds[guildId].birthdays.indexOf(user.id), 1); }); delete this.birthdays.birthdays[user.id]; this.save().then(() => { this.emit("birthdayUserDelete", user); }).catch((err) => { throw err; }); return this; }; this.getGuildBirthdays = (guild) => tslib_1.__awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => tslib_1.__awaiter(this, void 0, void 0, function* () { if (!this.birthdays.guilds[guild.id]) return resolve(undefined); guild.members.fetch({ user: this.birthdays.guilds[guild.id].birthdays }).then((guildMembers) => tslib_1.__awaiter(this, void 0, void 0, function* () { let birthdays = []; yield guildMembers.forEach(guildMember => { this.getUserBirthday(guildMember.user).then((userData) => { if (!userData) return; const data = { member: guildMember, seeAge: userData.seeAge, date: new Date(userData.date), age: userData.age, nextBirthday: userData.nextBirthday, daysBeforeNext: userData.daysBeforeNext, guild: guild }; birthdays.push(data); }); }); return resolve(birthdays); })).catch((err) => { return reject(err); }); })); }); this.activateMemberBirthday = (member) => { if (!this.birthdays.birthdays[member.id]) throw new Error("Birthday not defined for this user."); if (!this.birthdays.guilds[member.guild.id]) { this.birthdays.guilds[member.guild.id] = { channels: "", birthdays: [] }; } if (this.birthdays.guilds[member.guild.id].birthdays.indexOf(member.id) !== -1) throw new Error("Birthday already activated for this user."); this.birthdays.guilds[member.guild.id].birthdays.push(member.id); this.birthdays.birthdays[member.id].guilds.push(member.guild.id); this.save().then(() => { this.emit("birthdayMemberActivate", member); }).catch((err) => { throw err; }); return this; }; this.deactivateMemberBirthday = (member) => { if (!this.birthdays.birthdays[member.id]) throw new Error("Birthday not defined for this user."); if (!this.birthdays.guilds[member.guild.id]) throw new Error("Birthday not activated for this user."); if (this.birthdays.guilds[member.guild.id].birthdays.indexOf(member.id) === -1) throw new Error("Birthday not activated for this user."); this.birthdays.guilds[member.guild.id].birthdays.splice(this.birthdays.guilds[member.guild.id].birthdays.indexOf(member.id), 1); this.birthdays.birthdays[member.id].guilds.splice(this.birthdays.birthdays[member.id].guilds.indexOf(member.guild.id), 1); this.save().then(() => { this.emit("birthdayMemberDeactivate", member); }).catch((err) => { throw err; }); return this; }; this.checkMemberGuildBirthdaysStatus = (member) => { if (!this.birthdays.guilds[member.guild.id]) return false; return this.birthdays.guilds[member.guild.id].birthdays.indexOf(member.id) !== -1; }; this.setGuildBirthdayChannel = (channel) => { if (!this.birthdays.guilds[channel.guild.id]) { this.birthdays.guilds[channel.guild.id] = { channels: "", birthdays: [] }; } this.birthdays.guilds[channel.guild.id].channels = channel.id; this.save().then(() => { this.emit("birthdayGuildChannelSet", channel); }).catch((err) => { throw err; }); return this; }; this.getGuildBirthdayChannel = (guild) => tslib_1.__awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => tslib_1.__awaiter(this, void 0, void 0, function* () { if (!this.birthdays.guilds[guild.id]) return resolve(undefined); if (!this.birthdays.guilds[guild.id].channels.length) return resolve(undefined); guild.channels.fetch(this.birthdays.guilds[guild.id].channels).then(channel => { return resolve(channel); }).catch((err) => { return reject(err); }); })); }); this.deleteGuildBirthdayChannel = (guild) => { if (!this.birthdays.guilds[guild.id]) return this; if (this.birthdays.guilds[guild.id].channels.length === 0) return this; this.birthdays.guilds[guild.id].channels = ""; this.save().then(() => { this.emit("birthdayGuildChannelDelete", guild); }).catch((err) => { throw err; }); return this; }; this.client = Client; this.options = Options || { timezone: types_1.Timezone.UTC, hour: 10, minute: 0 }; if (this.options.timezone === undefined) this.options.timezone = types_1.Timezone.UTC; if (this.options.hour === undefined) this.options.hour = 10; if (this.options.minute === undefined) this.options.minute = 0; if (this.options.hour < 0 || this.options.hour > 23) throw new Error("Invalid hour."); if (this.options.minute < 0 || this.options.minute > 59) throw new Error("Invalid minute."); try { this.birthdays = require(path.join(__dirname + "../../birthday.json")); } catch (err) { this.birthdays = { guilds: {}, birthdays: {} }; this.save(); } cron.schedule(`${this.options.minute} ${this.options.hour} * * *`, () => { this.checkBirthdays(); }, { timezone: this.options.timezone }); } } exports.Birthday = Birthday;