mirror of
https://github.com/captbaritone/webamp.git
synced 2026-07-22 17:47:16 +00:00
122 lines
3.3 KiB
JavaScript
122 lines
3.3 KiB
JavaScript
const Discord = require("discord.js");
|
|
const rgbHex = require("rgb-hex");
|
|
const Skins = require("../data/skins");
|
|
const logger = require("../logger");
|
|
const { approve, reject } = require("./s3");
|
|
|
|
const filter = reaction => {
|
|
return ["👍", "👎"].some(name => reaction.emoji.name === name);
|
|
};
|
|
|
|
async function postSkin({ md5, title, dest }) {
|
|
const skin = await Skins.getSkinByMd5(md5);
|
|
if (skin == null) {
|
|
logger.warn("Could not find skin for md5", { md5, alert: true });
|
|
return;
|
|
}
|
|
const {
|
|
canonicalFilename,
|
|
screenshotUrl,
|
|
skinUrl,
|
|
webampUrl,
|
|
averageColor,
|
|
emails,
|
|
tweetUrl,
|
|
twitterLikes,
|
|
tweetStatus,
|
|
internetArchiveUrl,
|
|
internetArchiveItemName,
|
|
readmeText
|
|
} = skin;
|
|
title = title ? title(canonicalFilename) : canonicalFilename;
|
|
|
|
const embed = new Discord.RichEmbed()
|
|
.setTitle(title)
|
|
.addField("Try Online", `[webamp.org](${webampUrl})`, true)
|
|
.addField("Download", `[${canonicalFilename}](${skinUrl})`, true)
|
|
.addField("Md5", md5, true)
|
|
.setImage(screenshotUrl);
|
|
|
|
if (readmeText) {
|
|
// Trim the readme since Discord will reject it otherwise.
|
|
embed.setDescription(`\`\`\`${readmeText.slice(0, 2000)}\`\`\``);
|
|
}
|
|
if (averageColor) {
|
|
try {
|
|
const color = rgbHex(averageColor);
|
|
if (String(color).length === 6) {
|
|
embed.setColor(`#${color}`);
|
|
} else {
|
|
logger.warn("Did not get a safe color", {
|
|
averageColor,
|
|
color,
|
|
warn: true
|
|
});
|
|
}
|
|
} catch (e) {
|
|
logger.error("Could not use color", { averageColor, alert: true });
|
|
}
|
|
}
|
|
if (emails != null && emails.length) {
|
|
embed.addField("Emails", emails.join(", "), true);
|
|
}
|
|
if (tweetUrl != null) {
|
|
let likes = "";
|
|
if (twitterLikes != null) {
|
|
likes = `(${Number(twitterLikes).toLocaleString()} likes) `;
|
|
}
|
|
embed.addField("Tweet Status", `[Tweeted](${tweetUrl}) ${likes}🐦`, true);
|
|
} else {
|
|
if (tweetStatus === "UNREVIEWED") {
|
|
embed.setFooter("React with 👍 or 👎 to approve or deny");
|
|
}
|
|
embed.addField("Tweet Status", getPrettyTwitterStatus(tweetStatus), true);
|
|
}
|
|
if (internetArchiveUrl) {
|
|
embed.addField(
|
|
"Internet Archive",
|
|
`[${internetArchiveItemName || "Permalink"}](${internetArchiveUrl})`,
|
|
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);
|
|
logger.info(`${user.username} approved ${md5}`);
|
|
await msg.channel.send(
|
|
`${canonicalFilename} was approved by ${user.username}`
|
|
);
|
|
msg.react("✅");
|
|
break;
|
|
case "👎":
|
|
await reject(md5);
|
|
logger.info(`${user.username} rejected ${md5}`);
|
|
await msg.channel.send(
|
|
`${canonicalFilename} 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 };
|