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
JavaScript
"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;