Add detection of links being posted and fix startup links retrieval
This commit is contained in:
parent
d5583b2c04
commit
ab300263ab
22
app/index.js
22
app/index.js
|
@ -22,11 +22,9 @@ module.exports = (client) => {
|
||||||
const guildsData = FileSystem.existsSync(SAVE_FILE) ? fromJSON(JsonFile.readFileSync(SAVE_FILE)) : {};
|
const guildsData = FileSystem.existsSync(SAVE_FILE) ? fromJSON(JsonFile.readFileSync(SAVE_FILE)) : {};
|
||||||
setInterval(() => writeFile(guildsData), config.saveIntervalSec * 1000);
|
setInterval(() => writeFile(guildsData), config.saveIntervalSec * 1000);
|
||||||
|
|
||||||
parseLinksInGuilds(client.guilds, guildsData).then(writeFile(guildsData));
|
parseLinksInGuilds(client.guilds, guildsData).then(() => writeFile(guildsData))
|
||||||
|
.then(() => checkFeedsInGuilds(client.guilds, guildsData))
|
||||||
//set up an interval to check all the feeds
|
.then(() => setInterval(() => checkFeedsInGuilds(client.guilds, guildsData), config.feedCheckIntervalSec * 1000)); //set up an interval to check all the feeds
|
||||||
checkFeedsInGuilds(client.guilds, guildsData);
|
|
||||||
setInterval(() => checkFeedsInGuilds(client.guilds, guildsData), config.feedCheckIntervalSec * 1000);
|
|
||||||
|
|
||||||
//set up an on message handler to detect when links are posted
|
//set up an on message handler to detect when links are posted
|
||||||
client.on("message", message => {
|
client.on("message", message => {
|
||||||
|
@ -59,6 +57,12 @@ const HandleMessage = {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (guildsData[message.guild.id]) {
|
||||||
|
guildsData[message.guild.id].feeds.forEach(feedData => {
|
||||||
|
if (message.channel.name === feedData.channelName)
|
||||||
|
feedData.cachedLinks.push(...GetUrls(message.content)); //spread the urlSet returned by GetUrls into the cache array
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -76,7 +80,7 @@ function addFeed(client, guildsData, message) {
|
||||||
const feedData = new FeedData({
|
const feedData = new FeedData({
|
||||||
url: feedUrl,
|
url: feedUrl,
|
||||||
channelName: channel.name,
|
channelName: channel.name,
|
||||||
roleName: role.name
|
roleName: role ? role.name : null
|
||||||
});
|
});
|
||||||
|
|
||||||
//ask the user if they're happy with the details they set up, save if yes, don't if no
|
//ask the user if they're happy with the details they set up, save if yes, don't if no
|
||||||
|
@ -103,10 +107,10 @@ function checkFeedsInGuilds(guilds, guildsData) {
|
||||||
|
|
||||||
function parseLinksInGuilds(guilds, guildsData) {
|
function parseLinksInGuilds(guilds, guildsData) {
|
||||||
const promises = [];
|
const promises = [];
|
||||||
for (let guild of guilds) {
|
for (let guildId of guilds.keys()) {
|
||||||
const guildData = guildsData[guild.id];
|
const guildData = guildsData[guildId];
|
||||||
if (guildData)
|
if (guildData)
|
||||||
promises.push(guildData.cachePastPostedLinks());
|
promises.push(guildData.cachePastPostedLinks(guilds.get(guildId)));
|
||||||
}
|
}
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ const DiscordUtil = require("discordjs-util");
|
||||||
const Dns = require("dns"); //for host resolution checking
|
const Dns = require("dns"); //for host resolution checking
|
||||||
const Url = require("url"); //for url parsing
|
const Url = require("url"); //for url parsing
|
||||||
const FeedRead = require("feed-read"); //for extracing new links from RSS feeds
|
const FeedRead = require("feed-read"); //for extracing new links from RSS feeds
|
||||||
|
const GetUrls = require("get-urls"); //for extracting urls from messages
|
||||||
|
|
||||||
module.exports = class FeedData {
|
module.exports = class FeedData {
|
||||||
constructor({ url, channelName, roleName, cachedLinks }) {
|
constructor({ url, channelName, roleName, cachedLinks }) {
|
||||||
|
@ -12,6 +13,13 @@ module.exports = class FeedData {
|
||||||
this.channelName = channelName;
|
this.channelName = channelName;
|
||||||
this.roleName = roleName;
|
this.roleName = roleName;
|
||||||
this.cachedLinks = cachedLinks || [];
|
this.cachedLinks = cachedLinks || [];
|
||||||
|
|
||||||
|
this.cachedLinks.push = (...elements) => {
|
||||||
|
const unique = elements
|
||||||
|
.map(el => normaliseUrl(el)) //normalise all the urls
|
||||||
|
.filter(el => !this.cachedLinks.includes(el)); //filter out any already cached
|
||||||
|
Array.prototype.push.apply(this.cachedLinks, unique);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -25,7 +33,7 @@ module.exports = class FeedData {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
channel.fetchMessages({ limit: 100 })
|
channel.fetchMessages({ limit: 100 })
|
||||||
.then(messages => {
|
.then(messages => {
|
||||||
messages.forEach(m => Array.prototype.push.apply(this.cachedLinks, getUrls(m))); //push all the links in each message into our links array
|
messages.forEach(m => this.cachedLinks.push(...GetUrls(m.content))); //push all the links in each message into our links array
|
||||||
resolve(this);
|
resolve(this);
|
||||||
})
|
})
|
||||||
.catch(reject);
|
.catch(reject);
|
||||||
|
@ -64,7 +72,7 @@ function normaliseUrl(url) {
|
||||||
if (Url.parse(url).host.includes("youtu")) //detect youtu.be and youtube.com - yes I know it's hacky
|
if (Url.parse(url).host.includes("youtu")) //detect youtu.be and youtube.com - yes I know it's hacky
|
||||||
url = url.split("&")[0]; //quick way to chop off stuff like &feature=youtube
|
url = url.split("&")[0]; //quick way to chop off stuff like &feature=youtube
|
||||||
|
|
||||||
url = url.replace("http://www.youtube.com/watch?v=", "http://youtu.be/"); //turn full url into share url
|
url = url.replace(/(www.)?youtube.com\/watch\?v=/, "youtu.be/"); //turn full url into share url
|
||||||
|
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,11 +7,11 @@ module.exports = class GuildData {
|
||||||
this.feeds = feeds.map(feed => new FeedData(feed));
|
this.feeds = feeds.map(feed => new FeedData(feed));
|
||||||
}
|
}
|
||||||
|
|
||||||
cachePastPostedLinks() {
|
cachePastPostedLinks(guild) {
|
||||||
const promises = [];
|
const promises = [];
|
||||||
|
|
||||||
this.feeds.forEach(feed => {
|
this.feeds.forEach(feed => {
|
||||||
promises.push(feed.cachePastPostedLinks(this).catch(Util.dateError));
|
promises.push(feed.updatePastPostedLinks(guild).catch(Util.dateError));
|
||||||
});
|
});
|
||||||
|
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
|
|
Loading…
Reference in New Issue