Pronto logo

Pronto

source

handlers/unsubmittedLessons.js

View on GitHub

'use strict';

const Discord = require('discord.js');
// eslint-disable-next-line no-unused-vars
const Typings = require('../typings');

const dateFormat = require('dateformat');

const { Lesson } = require('../models');
const { dateTimeGroup } = require('../modules');
const { emojiReact, findGuildConfiguration, sendMsg } = require('../handlers');

/** */

/**
 *
 * @function handlers.unsubmittedLessons
 * @param {Discord.Guild} guild The guild to update lessons for
 */
module.exports = async guild => {
	const { settings: { shortDate }, ids: { lessonReferenceId }, colours } = await findGuildConfiguration(guild);

	/**
	 * @type {Typings.Lesson[]}
	 */
	const unsubmitted = await Lesson.find({ submitted: false }).sort({ dueTimestamp: 'ascending' }).exec()
		.catch(error => console.error(error));

	const embedTitle = 'Lessons To Be Submitted';

	const unsubmittedEmbed = new Discord.MessageEmbed()
		.setColor(colours.primary)
		.setTitle(embedTitle)
		.setAuthor(guild.name, guild.iconURL({ dynamic: true }))
		.setFooter(`Last updated at ${await dateTimeGroup(guild)}`);

	if (!unsubmitted.length) {
		/**
		 * @type {Typings.Lesson[]}
		 */
		const lessons = await Lesson.find().exec()
			.catch(error => console.error(error));

		if (!lessons.length) return;

		unsubmittedEmbed.setDescription('All lesson plans have been submitted!');
	}

	else if (unsubmitted.length) {
		for (const lesson of unsubmitted) {
			try {
				const lessonChannel = guild.channels.cache.get(lesson.lessonId);
				const lastMessage = await lessonChannel.messages.fetch(lessonChannel.lastMessageId);
				const channelURL = lastMessage.url.split('/').slice(0, -1).join('/');

				const dueString = `Due \`${dateFormat(lesson.dueTimestamp, shortDate)}\` — `;

				for (const instructor of Object.values(lesson.instructors)) {
					const instructorMember = await guild.members.fetch(instructor.id);

					if (!instructorMember || !lessonChannel) continue;

					const instructorField = unsubmittedEmbed.fields.find(field => field.name === instructorMember.displayName);

					(instructorField)
						? instructorField.value += `${dueString} [${lesson.lessonName}](${channelURL})\n`
						: unsubmittedEmbed.addField(instructorMember.displayName, `${dueString} [${lesson.lessonName}](${channelURL})\n`);
				}
			}
			catch { continue; }
		}
	}

	const referenceChannel = guild.channels.cache.get(lessonReferenceId);
	await referenceChannel.messages.fetch();

	const existingMsg = referenceChannel.messages.cache.find(msg => {
		return (msg.embeds[0])
			? (msg.embeds[0].title)
				? (msg.embeds[0].title === embedTitle)
				: false
			: false;
	});

	if (!existingMsg) emojiReact(await sendMsg(referenceChannel, { embeds: [unsubmittedEmbed] }), '🔄');

	else existingMsg.edit(unsubmittedEmbed);
};