const Discord = require("discord.js"); const TOKEN = require("./token.js"); const db = require("./db.js"); const RSSParser = require("rss-parser"); const interval = require("interval-promise"); const client = new Discord.Client(); const parser = new RSSParser(); const RSS_UPDATE_INTERVAL_MIN = 5; async function checkFeeds() { let feeds = db.get("rssFeeds").value(); let outlets = db.get("feedOutputs").value(); for(let feedEntry of feeds) { let feed = await parser.parseURL(feedEntry.url); if(feed.items.length == 0) continue; feed.items.filter(i => i.isoDate > feedEntry.lastUpdate).forEach(item => { outlets.forEach(ch => { client.channels.get(ch).send(`**${item.title}**\nPosted by ${item.creator}\n${item.link}`); }); }); db.get("rssFeeds").find({ url: feedEntry.url}).assign({lastUpdate: feed.items[0].isoDate}).write(); } } function isAuthorised(member) { if (db.get("editors.users").includes(member.id).value()) return true; if (db.get("editors.roles").intersectionWith(member.roles.keyArray()).isEmpty().value()) return false; return true; } const commands = { "make guide": msg => { if (!isAuthorised(msg.member)) return; let content = msg.content.substring(msg.content.indexOf("make guide") + "make guide ".length); let guideName = content.substring(0, content.indexOf("\n")).trim(); let guideContent = content.substring(content.indexOf("\n")).trim(); let guide = db.get("guides").find({ name: guideName }); if (!guide.isUndefined().value()) { guide.assign({ content: guideContent }).write(); } else { db.get("guides") .push({ name: guideName, content: guideContent }) .write(); } msg.channel.send( `${msg.author.toString()} Added/updated "${guideName}"!` ); }, "delete guide": (msg, s) => { if (!isAuthorised(msg.member)) return; let guideName = s.substring("delete guide ".length).trim(); let val = db.get("guides").find({ name: guideName }); if (val.isUndefined().value()) { msg.channel.send(`${msg.author.toString()} No guide "${guideName}"!`); return; } db.get("guides") .remove({ name: guideName }) .write(); msg.channel.send( `${msg.author.toString()} Removed guide "${guideName}!"` ); }, help: msg => { let guides = db .get("guides") .map(g => g.name) .reduce((p, c) => `${p}\n${c}`, "") .value(); msg.channel.send( `Hello! I am NoctBot! I have answers for the most common C(O)M-related questions.\nJust ping me with one of the following keywords:\n\`\`\`${guides}\`\`\`` ); } }; client.on("ready", () => { console.log("Ready!"); client.user.setActivity("@NoctBot help", { type: "PLAYING" }); interval(checkFeeds, RSS_UPDATE_INTERVAL_MIN * 60 * 1000); }); client.on("message", m => { if (m.author.id == client.user.id || m.mentions.users.size == 0) return; if (!db.get("reactableMentionedUsers").intersectionWith(m.mentions.users.map(u => u.id)).isEmpty().value()) { const emoteId = db .get("emotes") .get("angery") .randomElement() .value(); m.react(client.emojis.find(e => e.id == emoteId)); return; } if (m.mentions.users.first().id == client.user.id) { let content = m.cleanContent.trim(); if(content.startsWith(`@${client.user.username}`)) { content = content .substring(`@${client.user.username} `.length); let lowerCaseContent = content.toLowerCase().trim(); for (let c in commands) { if (lowerCaseContent.startsWith(c)) { commands[c](m, content); return; } } if (lowerCaseContent.length > 0) { let parts = lowerCaseContent.trim().split(" "); let guide = db .get("guides") .map(g => Object.assign({parts: g.name.toLowerCase().split(" ")}, g)) .sortBy(g => g.parts.length) .maxBy(k => db._.intersection(parts, k.parts).length) .value(); let hits = guide !== undefined && db._.intersection(guide.name.toLowerCase().split(" "), parts).length > 0; if (hits) { m.channel.send(guide.content); return; } } } let emoteType = "angery"; if(db.get("specialUsers").includes(m.author.id).value()) emoteType = "hug"; else if(db.get("bigUsers").includes(m.author.id).value()) emoteType = "big"; else if(db.get("dedUsers").includes(m.author.id).value()) emoteType = "ded"; const id = db .get("emotes") .get(emoteType) .randomElement() .value(); m.channel.send(client.emojis.find(e => e.id == id).toString()); } else if (m.content.includes("Noct")) { m.channel.send( client.emojis.find(e => e.name == "mukuNeighWaaaaaa").toString() ); } }); client.login(TOKEN);