/* eslint-disable newline-per-chained-call */ import { Emoji, GuildTextableChannel, Member, Message } from 'eris'; import { Client, Event, RichEmbed } from '../class'; export default class MessageReactionAdd extends Event { public client: Client; constructor(client: Client) { super(client); this.event = 'messageReactionAdd'; this.directorLogs = '807444198969835550'; this.directorRole = '662163685439045632'; } private directorLogs: string; private directorRole: string; public async run(message: Message, emoji: Emoji, reactor: Member) { if (message.channel.id !== this.directorLogs) return; if (!(message instanceof Message)) { message = >(await (message as Message).channel.getMessage((message as Message).id)); } if (message.author.id !== this.client.user.id) return; if (!reactor.roles[0]) { reactor = await message.channel.guild.getRESTMember(reactor.id); } if (!reactor.roles.includes(this.directorRole)) return; const proc = await this.client.db.mongo.Proclamation.findOne({ msg: message.id, processed: false }); if (!proc?.votedDirectors.includes(reactor.id)) { let type: 'yea' | 'nay' | 'present'; if (emoji.id === '578750988907970567') type = 'yea'; else if (emoji.id === '578750737920688128') type = 'nay'; else if (emoji.name === '🙋') type = 'present'; const votes = proc.results; switch (type) { case 'yea': votes.yea++; await proc.updateOne({ results: { ...proc.results, yea: votes.yea, }, votedDirectors: [...proc.votedDirectors, reactor.id], }); break; case 'nay': votes.nay++; await proc.updateOne({ results: { ...proc.results, nay: votes.nay, }, votedDirectors: [...proc.votedDirectors, reactor.id], }); break; case 'present': votes.present++; await proc.updateOne({ results: { ...proc.results, present: votes.present, }, votedDirectors: [...proc.votedDirectors, reactor.id], }); break; default: return; } const totalDirectors = message.channel.guild.members.filter((member) => member.roles.includes('662163685439045632')); if (votes.yea / totalDirectors.length >= 0.6) { await proc.updateOne({ processed: true, results: { ...votes, absent: totalDirectors.length - (votes.present + votes.nay + votes.present), }, }); await message.delete(`Proclamation with ID ${proc.oID} processed.`); const embed = new RichEmbed(); embed.setAuthor(message.embeds[0].author.name, message.embeds[0].author.icon_url); embed.setTitle('Proclamation'); embed.setDescription(`${proc.oID}\n\n_This action is available on the Board Register System Directory. You can make changes or edit it [here](https://board.ins/repository)._\n\n__This proclamation was confirmed at ${new Date().toLocaleString()}.__`); embed.addField('Subject', proc.subject); embed.addField('Body', proc.body); embed.setColor(0x29b350); embed.setFooter('Library of Code sp-us | Board Register System', 'https://static.libraryofcode.org/library_of_code.png'); embed.setTimestamp(); this.client.util.transporter.sendMail({ to: 'all-staff@lists.libraryofcode.org', from: 'Board Register System ', subject: `PROCLAMATION ${proc.oID}`, text: ` PROCLAMATION ${proc.oID} SPONSOR: ${message.embeds[0].author.name.split('#').slice(0, 1)}, ${message.embeds[0].author.name.split('#').slice(1).join(' ').split(', ').slice(1).join(', ')} VOTING RESULTS: YEA: ${proc.results.yea} NAY: ${proc.results.nay} PRESENT ${proc.results.present} SUBJECT: ${proc.subject} BODY: ${proc.body} _____________________________________________________________________ LIBRARY OF CODE SP-US | BOARD OF DIRECTORS BOARD REGISTER SYSTEM https://board.ins/ `, }); await message.channel.createMessage({ embed }); await (this.client.getChannel('858547883853873173')).createMessage({ embed }); } } } }