webamp/experiments/discord-bot/utils.js
2019-03-27 23:56:31 -07:00

94 lines
2.9 KiB
JavaScript

const Discord = require("discord.js");
const rgbHex = require("rgb-hex");
const { getInfo } = require("./info");
const { approve, reject, getStatus } = require("./s3");
const filter = reaction => {
return ["👍", "👎"].some(name => reaction.emoji.name === name);
};
async function postSkin({ filename, md5, title, dest }) {
const screenshotUrl = `https://s3.amazonaws.com/webamp-uploaded-skins/screenshots/${md5}.png`;
const skinUrl = `https://s3.amazonaws.com/webamp-uploaded-skins/skins/${md5}.wsz`;
const webampUrl = `https://webamp.org?skinUrl=${skinUrl}`;
const embed = new Discord.RichEmbed()
.setTitle(title)
.addField("Try Online", `[webamp.org](${webampUrl})`, true)
.addField("Download", `[${filename}](${skinUrl})`, true)
.addField("Md5", md5, true)
.setImage(screenshotUrl);
const info = getInfo(md5);
if (info == null) {
embed.addField("Warning", "Cached metadata not found", true);
} else {
if (info.averageColor) {
const color = rgbHex(info.averageColor);
if (String(color).length === 6) {
embed.setColor(`#${color}`);
} else {
console.log("Did not get a safe color from ", info.averageColor);
console.log("Got ", color);
}
}
if (info.emails != null && info.emails.length) {
const uniqueEmails = Array.from(new Set(info.emails));
// TODO: Fix email parsing
embed.addField("Emails", uniqueEmails.join(", "), true);
}
if (info.tweetUrl != null) {
let likes = "";
if (info.twitterLikes != null) {
likes = `(${Number(info.twitterLikes).toLocaleString()} likes) `;
}
embed.addField(
"Tweet Status",
`[Tweeted](${info.tweetUrl}) ${likes}🐦`,
true
);
} else {
const status = await getStatus(md5);
if (status === "UNREVIEWED") {
embed.setFooter("React with 👍 or 👎 to approve or deny");
}
embed.addField("Tweet Status", getPrettyTwitterStatus(status), true);
}
}
const msg = await dest.send(embed);
await msg.awaitReactions(filter, { max: 1 }).then(async collected => {
const vote = collected.first();
const user = vote.users.first();
switch (vote.emoji.name) {
case "👍":
await approve(md5);
console.log(`${user.username} approved ${md5}`);
await msg.channel.send(`${filename} was approved by ${user.username}`);
msg.react("✅");
break;
case "👎":
await reject(md5);
console.log(`${user.username} rejected ${md5}`);
await msg.channel.send(`${filename} was rejected by ${user.username}`);
msg.react("❌");
break;
}
});
}
function getPrettyTwitterStatus(status) {
switch (status) {
case "APPROVED":
return "Approved ✅";
case "REJECTED":
return "Rejected ❌";
case "UNREVIEWED":
return "Unreviewed ❔";
case "TWEETED":
return "Tweeted 🐦";
}
}
module.exports = { postSkin };