Pull all members from the server and welcome those who joined a week, a month, a year and more than a year ago TODAY.
const lib = require('lib')({token: process.env.STDLIB_SECRET_TOKEN});
class JoinTracker {
memberCollection = {
yearsAgo: [],
lastYear: [],
lastMonth: [],
lastWeek: [],
};
async run() {
let members = [];
do {
members = await this.getMembers(this.memberAfterID, process.env.GUILD_ID);
this.compareDateOfMembers(members);
} while (members.length > 0);
let messageText =
'Wir feiern heute die Mitgliedschaft auf diesem Server:\n';
if (this.memberCollection.yearsAgo.length > 0) {
this.memberCollection.yearsAgo.sort(this.sortByDate);
messageText += '\n**__Mehr als ein Jahr am Start:__**\n';
for await (let mmbr of this.memberCollection.yearsAgo) {
messageText += `**${this.getYearsDiff(
mmbr
)} Jahre** am ${this.getDateFormatted(mmbr)} Uhr | <@${
mmbr.user.id
}> \n`;
}
}
if (this.memberCollection.lastYear.length > 0) {
this.memberCollection.lastYear.sort(this.sortByDate);
messageText += `\n<${process.env.MIDDLE_ID}> <${process.env.MIDDLE_ID}> <${process.env.MIDDLE_ID}> \n\n**__Vor einem Jahr beigetreten:__**\n`;
for await (let mmbr of this.memberCollection.lastYear) {
messageText += `${this.getDateFormatted(mmbr)} Uhr | <@${
mmbr.user.id
}> \n`;
}
}
if (this.memberCollection.lastMonth.length > 0) {
this.memberCollection.lastMonth.sort(this.sortByDate);
messageText += `\n<${process.env.MIDDLE_ID}> <${process.env.MIDDLE_ID}> <${process.env.MIDDLE_ID}> \n\n**__Jetzt einen Monat dabei:__**\n`;
for await (let mmbr of this.memberCollection.lastMonth) {
messageText += `${this.getDateFormatted(mmbr)} Uhr | <@${
mmbr.user.id
}> \n`;
}
}
if (this.memberCollection.lastWeek.length > 0) {
this.memberCollection.lastWeek.sort(this.sortByDate);
messageText += `\n<${process.env.MIDDLE_ID}> <${process.env.MIDDLE_ID}> <${process.env.MIDDLE_ID}> \n\n**__Seit letzte Woche neu:__**\n`;
for await (let mmbr of this.memberCollection.lastWeek) {
messageText += `${this.getDateFormatted(mmbr)} Uhr | <@${
mmbr.user.id
}> \n`;
}
}
if (
this.memberCollection.yearsAgo.length > 0 ||
this.memberCollection.lastYear.length > 0 ||
this.memberCollection.lastMonth.length > 0 ||
this.memberCollection.lastWeek.length > 0
)
await lib.discord.channels['@0.3.0'].messages.create({
channel_id: `${process.env.CHANNEL_ID}`,
content: messageText,
});
}
getYearsDiff(yearsAgoMember) {
let joinedDate = new Date(yearsAgoMember.joined_at);
let today = new Date();
return today.getFullYear() - joinedDate.getFullYear();
}
getDateFormatted(yearsAgoMember) {
let date = new Date(yearsAgoMember.joined_at);
return date.toLocaleString('de-DE', {
day: 'numeric',
month: 'short',
year: 'numeric',
hour: 'numeric',
minute: '2-digit',
});
}
sortByDate(a, b) {
return new Date(a.joined_at) - new Date(b.joined_at);
}
compareDateOfMembers(members) {
let today = new Date();
let lastYear = new Date();
let lastMonth = new Date();
let lastWeek = new Date();
lastYear.setFullYear(today.getFullYear() - 1);
lastMonth.setMonth(today.getMonth() - 1);
lastWeek.setDate(today.getDate() - 7);
for (let member of members) {
let joinedDate = new Date(member.joined_at);
//test if Math.floor(Math.random() * 4 + 1) === 1
if (this.isSameDate(joinedDate, lastYear)) {
this.memberCollection.lastYear.push(member);
continue;
}
if (this.isSameDayAnyYear(joinedDate, lastYear)) {
this.memberCollection.yearsAgo.push(member);
continue;
}
if (this.isSameDate(joinedDate, lastMonth)) {
this.memberCollection.lastMonth.push(member);
continue;
}
if (this.isSameDate(joinedDate, lastWeek)) {
this.memberCollection.lastWeek.push(member);
continue;
}
}
}
isSameDate(joinedDate, compareDate) {
return (
joinedDate.getDate() == compareDate.getDate() &&
joinedDate.getMonth() == compareDate.getMonth() &&
joinedDate.getFullYear() == compareDate.getFullYear()
);
}
isSameDayAnyYear(joinedDate, compareDate) {
let today = new Date();
return (
joinedDate.getDate() == compareDate.getDate() &&
joinedDate.getMonth() == compareDate.getMonth() &&
joinedDate.getFullYear() !== today.getFullYear() //exclude people joined today
);
}
async getMembers(after = false, guild_id) {
let params = {
guild_id: `${guild_id}`,
limit: 1000,
};
if (after !== false) {
params.after = after;
}
let members = await lib.discord.guilds['@0.2.4'].members.list(params);
if (members.length > 0) {
this.memberAfterID = members[members.length - 1].user.id;
}
return members;
}
}
let joinTracker = new JoinTracker();
await joinTracker.run();