commit 9ce9e994dcccf8c3a477cb86e5a75f232d681afe Author: johnfacey Date: Thu Mar 18 13:16:42 2021 -0500 1st commit Discord Bot diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/commands/add.js b/commands/add.js new file mode 100644 index 0000000..5edeef8 --- /dev/null +++ b/commands/add.js @@ -0,0 +1,18 @@ +var libFlayer = require("../libFlayer.js"); + +module.exports = { + name: 'add', + description: 'Add RSS Source', + execute(message,args) { + + if (args.length < 2) { + message.reply(`Please use in !get [number] format`); + return; + } + var command = args[0]; + var param1 = args[1]; + libFlayer.addSource(param1); + libFlayer.loadFeeds(); + + }, +}; \ No newline at end of file diff --git a/commands/get.js b/commands/get.js new file mode 100644 index 0000000..65877a0 --- /dev/null +++ b/commands/get.js @@ -0,0 +1,18 @@ +var libFlayer = require("../libFlayer.js"); + +module.exports = { + name: 'get', + description: 'Get RSS Source Link', + execute(message, args) { + + if (args.length < 1) { + message.reply(`Please use in !get [number] format`); + return; + } + var search = args[0]; + + var feedArray = libFlayer.getFeeds(); + message.reply(`Retrieving: [Link](${feedArray[search].link})`); + + } +}; \ No newline at end of file diff --git a/commands/help.js b/commands/help.js new file mode 100644 index 0000000..13f15d7 --- /dev/null +++ b/commands/help.js @@ -0,0 +1,9 @@ +var libFlayer = require("../libFlayer.js"); + +module.exports = { + name: 'help', + description: 'Help', + execute(message) { + message.reply('For a list of available commands type !commands'); + } +}; \ No newline at end of file diff --git a/commands/ping.js b/commands/ping.js new file mode 100644 index 0000000..bb910ca --- /dev/null +++ b/commands/ping.js @@ -0,0 +1,7 @@ +module.exports = { + name: 'ping', + description: 'Ping!', + execute(message) { + message.channel.send('Pong.'); + } +}; \ No newline at end of file diff --git a/commands/search.js b/commands/search.js new file mode 100644 index 0000000..ca11479 --- /dev/null +++ b/commands/search.js @@ -0,0 +1,29 @@ +var libFlayer = require("../libFlayer.js"); + +module.exports = { + name: 'search', + description: 'Search RSS Sources', + execute(message, args) { + + if (args.length < 1) { + message.reply(`Missing arguments`); + return; + } + + var search = args[0]; + + message.reply('Searching for: ' + search); + + let i = 0; + var feedArray = libFlayer.getFeeds(); + feedArray.forEach(linkFlay => { + if (linkFlay.title.toLowerCase().indexOf(search.toLowerCase()) > -1) { + console.log(linkFlay.title); + message.reply(`Use !get ${i} to view: ${linkFlay.title}`); + + } + i++; + }); + + } +}; \ No newline at end of file diff --git a/commands/sources.js b/commands/sources.js new file mode 100644 index 0000000..b0e0f19 --- /dev/null +++ b/commands/sources.js @@ -0,0 +1,17 @@ +var libFlayer = require("../libFlayer.js"); + +module.exports = { + name: 'sources', + description: 'List RSS Sources', + execute(message, args) { + + var command = args[0]; + var search = args[1]; + + var sourceArray = libFlayer.getSources(); + sourceArray.forEach(source => { + message.reply(`[${source.title}](${source.link})`); + }); + + } +}; \ No newline at end of file diff --git a/commands/update.js b/commands/update.js new file mode 100644 index 0000000..9af3c29 --- /dev/null +++ b/commands/update.js @@ -0,0 +1,14 @@ +var libFlayer = require("../libFlayer.js"); + +module.exports = { + name: 'update', + description: 'Get RSS Source Link', + execute(message, args) { + + message.reply(`Updating Sources`); + libFlayer.loadFeeds(); + feedArray = libFlayer.getFeeds(); + message.reply(`Sources Updated`); + + } +}; \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..e3deead --- /dev/null +++ b/config.json @@ -0,0 +1,4 @@ +{ + "prefix": "!", + "token": "" +} \ No newline at end of file diff --git a/feeds.json b/feeds.json new file mode 100644 index 0000000..49ffa18 --- /dev/null +++ b/feeds.json @@ -0,0 +1,15 @@ +[ + { + "title": "CNN Top Stories", + "link": "http://rss.cnn.com/rss/cnn_topstories.rss" + }, + { + "title": "Reddit Front Page", + "link": "http://www.reddit.com/.rss" + }, + { + "title": "Arstechnica", + "link": "http://feeds.arstechnica.com/arstechnica/index" + } + +] \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..9524f5e --- /dev/null +++ b/index.js @@ -0,0 +1,39 @@ +const fs = require('fs'); +const { prefix, token } = require('./config.json'); +const Discord = require('discord.js'); +const client = new Discord.Client(); +client.commands = new Discord.Collection(); + +const commandFiles = fs.readdirSync('./commands').filter(file => file.endsWith('.js')); + +for (const file of commandFiles) { + const command = require(`./commands/${file}`); + client.commands.set(command.name, command); +} + +var libFlayer = require("./libFlayer.js"); +let linkFlayerMap = []; + +client.on('ready', () => { + console.log(`Logged in as ${client.user.tag}!`); +}); + +client.on('message', message => { + if (!message.content.startsWith(prefix) || message.author.bot) return; + + const args = message.content.slice(prefix.length).trim().split(/ +/); + const command = args.shift().toLowerCase(); + + if (!client.commands.has(command)) return; + + try { + client.commands.get(command).execute(message, args); + } catch (error) { + console.error(error); + message.reply('there was an error trying to execute that command!'); + } +}); + +console.log("Link Flayer Bot Activating"); +client.login(token); +libFlayer.loadFeeds(); diff --git a/libFlayer.js b/libFlayer.js new file mode 100644 index 0000000..03851c2 --- /dev/null +++ b/libFlayer.js @@ -0,0 +1,48 @@ +let Parser = require('rss-parser'); +let parser = new Parser(); +let feeds = require('./feeds.json'); + + +let linkFlayerMap = []; + +exports.addSource = function(source){ + var linkData = { + title: `${source}`, + link: `${source}` + } + feeds.push(linkData); +} + +exports.loadFeeds = function() { + linkFlayerMap = []; + feeds.forEach(feedBlock => { + (async () => { + const feed = parser.parseURL(feedBlock.link, function(err, feed) { + if (err) throw err; + console.log(feed.title); + feed.items.forEach(item => { + + var linkData = { + title: `${unescape(item.title)}`, + link: `${unescape(item.link)}` + } + linkFlayerMap.push(linkData); + }); + }) + + + + })().then(); + }); + +} + +exports.getFeeds = function () { + return linkFlayerMap; + +} + +exports.getSources = function () { + return feeds; + +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5c52e3b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,140 @@ +{ + "name": "discord-bot", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@discordjs/collection": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", + "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" + }, + "@discordjs/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "discord.js": { + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.1.tgz", + "integrity": "sha512-VwZkVaUAIOB9mKdca0I5MefPMTQJTNg0qdgi1huF3iwsFwJ0L5s/Y69AQe+iPmjuV6j9rtKoG0Ta0n9vgEIL6w==", + "requires": { + "@discordjs/collection": "^0.1.6", + "@discordjs/form-data": "^3.0.1", + "abort-controller": "^3.0.0", + "node-fetch": "^2.6.1", + "prism-media": "^1.2.2", + "setimmediate": "^1.0.5", + "tweetnacl": "^1.0.3", + "ws": "^7.3.1" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "mime-db": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", + "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==" + }, + "mime-types": { + "version": "2.1.29", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", + "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "requires": { + "mime-db": "1.46.0" + } + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "prism-media": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.8.tgz", + "integrity": "sha512-bJ8J9PKpUdG6GmtnlaPSi2cMdGDLsS9o4iOlOncJasku73uJucgcN9Yr7/jlENqfh7hoR6LDqPr17JEzp6srjg==" + }, + "rss-parser": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.12.0.tgz", + "integrity": "sha512-aqD3E8iavcCdkhVxNDIdg1nkBI17jgqF+9OqPS1orwNaOgySdpvq6B+DoONLhzjzwV8mWg37sb60e4bmLK117A==", + "requires": { + "entities": "^2.0.3", + "xml2js": "^0.4.19" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "ws": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", + "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..cb52baa --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "discord-bot", + "version": "1.0.0", + "description": "", + "main": "index.js", + "dependencies": { + "discord.js": "^12.5.1", + "rss-parser": "^3.12.0" + }, + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +}