Merge branch 'Hiroyuki/communityrelations-master' into dev

merge-requests/25/merge
Matthew 2021-03-24 00:36:35 -04:00
commit f9ae2136b0
No known key found for this signature in database
GPG Key ID: 210AF32ADE3B5C4B
4 changed files with 82 additions and 40 deletions

View File

@ -41,7 +41,8 @@
"keyword-spacing": "off", "keyword-spacing": "off",
"no-multiple-empty-lines": "off", "no-multiple-empty-lines": "off",
"consistent-return": "off", "consistent-return": "off",
"no-continue": "off" "no-continue": "off",
"no-plusplus": "off"
}, },
"ignorePatterns": "**/*.js" "ignorePatterns": "**/*.js"
} }

View File

@ -349,6 +349,13 @@ export default class Root extends Route {
oID: id, oID: id,
processed: false, processed: false,
msg: msg.id, msg: msg.id,
results: {
yea: 0,
nay: 0,
present: 0,
absent: 0,
},
votedDirectors: [],
}); });
res.status(200).json({ res.status(200).json({
@ -961,8 +968,8 @@ export default class Root extends Route {
confirmationEmbed.addField('Results', `**Total:** ${total.length}\n**Yea:** ${yea}\n**Nay:** ${nay}\n**Present:** ${present}\n**Absent:** ${absent}`); confirmationEmbed.addField('Results', `**Total:** ${total.length}\n**Yea:** ${yea}\n**Nay:** ${nay}\n**Present:** ${present}\n**Absent:** ${absent}`);
await this.directorLogs.createMessage({ embed: confirmationEmbed }); await this.directorLogs.createMessage({ embed: confirmationEmbed });
const excludingYea = nay + present + absent; const totalDirectors = yea + nay + present + absent;
if (yea > excludingYea) { if (yea / totalDirectors >= 0.6) {
const resolutionEmbed = this.genEmbed( const resolutionEmbed = this.genEmbed(
motion.oID, motion.oID,
'res', 'res',

View File

@ -1,5 +1,5 @@
import { Emoji, GuildTextableChannel, Member, Message } from 'eris'; import { Emoji, GuildTextableChannel, Member, Message } from 'eris';
import { Client, Event } from '../class'; import { Client, Event, RichEmbed } from '../class';
export default class MessageReactionAdd extends Event { export default class MessageReactionAdd extends Event {
public client: Client; public client: Client;
@ -17,8 +17,11 @@ export default class MessageReactionAdd extends Event {
private directorRole: string; private directorRole: string;
public async run(message: Message<GuildTextableChannel>, _emoji: Emoji, reactor: Member) { public async run(message: Message<GuildTextableChannel>, emoji: Emoji, reactor: Member) {
if (message.channel.id !== this.directorLogs) return; if (message.channel.id !== this.directorLogs) return;
if (!(message instanceof Message)) {
message = <Message<GuildTextableChannel>>(await (message as Message).channel.getMessage((message as Message).id));
}
if (message.author.id !== this.client.user.id) return; if (message.author.id !== this.client.user.id) return;
if (!reactor.roles[0]) { if (!reactor.roles[0]) {
@ -28,46 +31,79 @@ export default class MessageReactionAdd extends Event {
if (!reactor.roles.includes(this.directorRole)) return; if (!reactor.roles.includes(this.directorRole)) return;
const proc = await this.client.db.Proclamation.findOne({ msg: message.id, processed: false }); const proc = await this.client.db.Proclamation.findOne({ msg: message.id, processed: false });
if (proc) {
if (proc.votedDirectors?.includes(message.author.id)) return;
let yea = await message.getReaction('modSuccess:578750988907970567'); if (!proc?.votedDirectors.includes(reactor.id)) {
yea = yea.filter((val) => !val.bot); let type: 'yea' | 'nay' | 'present';
let nay = await message.getReaction('modError:578750737920688128');
nay = nay.filter((val) => !val.bot);
let present = await message.getReaction('🙋');
present = present.filter((val) => !val.bot);
const totalDirectors = message.channel.guild.members.filter((member) => member.roles.includes(this.directorRole)).length; if (emoji.id === '578750988907970567') type = 'yea';
else if (emoji.id === '578750737920688128') type = 'nay';
else if (emoji.name === '🙋') type = 'present';
const processed = totalDirectors === (yea.length + nay.length + present.length) || Date.now() - proc.at > 604800000; const votes = proc.results;
const absent = totalDirectors - (yea.length + nay.length + present.length);
switch (type) {
case 'yea':
votes.yea++;
await proc.updateOne({ await proc.updateOne({
results: { results: {
yea: yea.length, ...proc.results,
nay: nay.length, yea: votes.yea,
present: present.length,
absent,
}, },
processed, votedDirectors: [...proc.votedDirectors, reactor.id],
votedDirectors: [...(proc.votedDirectors || []), message.author.id],
}); });
const inTheMajority = yea.length > nay.length + present.length; break;
if (processed) { case 'nay':
const author = this.client.users.get(proc.issuer) || await this.client.getRESTUser(proc.issuer); votes.nay++;
await proc.updateOne({
results: {
...proc.results,
nay: votes.nay,
},
votedDirectors: [...proc.votedDirectors, reactor.id],
});
break;
if (inTheMajority) { case 'present':
await author.createMessage(`__**Proclamation Majority Vote Received**__\nThe Proclamation you created at Library of Code sp-us, titled **${proc.subject}** (\`${proc.oID}\`) received the majority vote.`); votes.present++;
await message.channel.createMessage(`__**Proclamation Results**__\nProclamation issued by ${author.mention} **received** the majority vote. Proclamation ID: ${proc.oID}\n\n__Results:__\n**Yea:** ${yea.length}\n**Nay:** ${nay.length}\n**Present:** ${present.length}\n**Absent:** ${absent}`); await proc.updateOne({
} else { results: {
await author.createMessage(`__**Proclamation Majority Vote Lost**__\nThe Proclamation you created at Library of Code sp-us, titled **${proc.subject}** (\`${proc.oID}\`) lost the majority vote.`); ...proc.results,
await message.channel.createMessage(`__**Proclamation Results**__\nProclamation issued by ${author.mention} **lost** the majority vote. Proclamation ID: ${proc.oID}\n\n__Results:__\n**Yea:** ${yea.length}\n**Nay:** ${nay.length}\n**Present:** ${present.length}\n**Absent:** ${absent}`); 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();
await message.channel.createMessage({ embed });
}
}
} }
} }
reactor.user.createMessage(`__**Vote Recorded**__\nYour vote on the proclamation with ID \`${proc.id}\` at Library of Code sp-us was successfully recorded.`);
}
}
}

View File

@ -12,7 +12,6 @@ export interface ProclamationInterface extends Document {
present: number; present: number;
absent: number; absent: number;
}; };
acceptedAt: number;
msg: string; msg: string;
processed?: boolean; processed?: boolean;
votedDirectors: string[]; votedDirectors: string[];
@ -30,10 +29,9 @@ const Proclamation = new Schema({
present: Number, present: Number,
absent: Number, absent: Number,
}, },
acceptedAt: Number,
msg: { type: String, required: true, unique: true }, msg: { type: String, required: true, unique: true },
processed: Boolean, processed: Boolean,
votedDirectors: Array, votedDirectors: { type: Array, required: true },
}); });
export default model<ProclamationInterface>('Proclamations', Proclamation); export default model<ProclamationInterface>('Proclamations', Proclamation);