2022-11-23 15:30:51 -05:00
|
|
|
if (process.env.NODE_ENV !== "production") {
|
|
|
|
require("dotenv").config();
|
|
|
|
}
|
2022-12-12 15:41:11 -05:00
|
|
|
const http = require("http");
|
2022-12-10 01:50:54 -05:00
|
|
|
var fs = require("fs");
|
2022-12-12 13:04:59 -05:00
|
|
|
const Path = require("path");
|
2022-12-10 01:50:54 -05:00
|
|
|
const axios = require("axios");
|
|
|
|
const urlMetadata = require("url-metadata");
|
2022-11-23 15:30:51 -05:00
|
|
|
let Mastodon = require("mastodon-api");
|
|
|
|
let Parser = require("rss-parser");
|
|
|
|
let parser = new Parser();
|
2022-11-23 16:34:57 -05:00
|
|
|
let maxPostPerScan = process.env.MAX_POST_PER_SCAN;
|
2022-11-23 15:30:51 -05:00
|
|
|
|
2022-12-14 12:41:23 -05:00
|
|
|
const M = new Mastodon({
|
|
|
|
access_token: `${process.env.MASTODON_ACCESS_KEY}`,
|
|
|
|
timeout_ms: 60 * 1000, // optional HTTP request timeout to apply to all requests.
|
|
|
|
api_url: `${process.env.MASTODON_API_URL}`,
|
|
|
|
});
|
|
|
|
|
2022-12-12 17:43:00 -05:00
|
|
|
const download_image = async (url, image_path) => {
|
|
|
|
let response = await axios({
|
2022-12-10 01:50:54 -05:00
|
|
|
url,
|
|
|
|
responseType: "stream",
|
2022-12-12 17:43:00 -05:00
|
|
|
});
|
|
|
|
|
2022-12-12 20:25:59 -05:00
|
|
|
return new Promise((resolve, reject) =>
|
2022-12-12 17:43:00 -05:00
|
|
|
response.data
|
|
|
|
.pipe(fs.createWriteStream(image_path))
|
2022-12-14 10:24:57 -05:00
|
|
|
.on("finish", () => {
|
|
|
|
console.log("---- Image Written Succesfully");
|
|
|
|
resolve(true);
|
|
|
|
})
|
|
|
|
.on("error", (e) => {
|
|
|
|
console.log("---- Image Written Failure");
|
|
|
|
reject(e);
|
|
|
|
})
|
2022-12-12 20:25:59 -05:00
|
|
|
);
|
2022-12-12 15:41:11 -05:00
|
|
|
};
|
2022-12-10 01:50:54 -05:00
|
|
|
|
2022-11-23 15:30:51 -05:00
|
|
|
(async () => {
|
2022-12-14 12:41:23 -05:00
|
|
|
runBot();
|
2022-11-23 16:34:57 -05:00
|
|
|
|
|
|
|
setInterval(async () => {
|
2022-12-14 12:41:23 -05:00
|
|
|
await runBot();
|
2022-11-23 19:12:40 -05:00
|
|
|
}, 60 * 60 * 1000);
|
2022-11-23 16:34:57 -05:00
|
|
|
})();
|
|
|
|
|
2022-12-14 12:41:23 -05:00
|
|
|
async function getLastPostDate() {
|
2022-11-23 15:30:51 -05:00
|
|
|
let timeline = await M.get(
|
|
|
|
`accounts/${process.env.MASTODON_ACCOUNT_ID}/statuses`,
|
|
|
|
{}
|
|
|
|
);
|
2022-12-07 23:55:32 -05:00
|
|
|
let postDate = new Date(timeline.data[0].created_at);
|
2022-11-23 15:30:51 -05:00
|
|
|
|
2022-12-14 12:41:23 -05:00
|
|
|
return postDate;
|
|
|
|
}
|
|
|
|
|
|
|
|
async function readFeeds() {
|
|
|
|
console.log("Processing Feeds: readFeeds()");
|
|
|
|
let feed = await parser.parseURL("http://feeds.feedburner.com/ign/games-all");
|
|
|
|
return feed;
|
|
|
|
}
|
|
|
|
|
|
|
|
async function processFeed(feed, postDate) {
|
2022-11-23 16:34:57 -05:00
|
|
|
let count = 0;
|
2022-12-14 12:41:23 -05:00
|
|
|
let validFeeds = feed.items
|
|
|
|
.filter(async (item) => {
|
|
|
|
let pubDate = new Date(item.pubDate);
|
2022-11-23 15:30:51 -05:00
|
|
|
|
2022-12-14 12:41:23 -05:00
|
|
|
if (pubDate > postDate) {
|
|
|
|
return item;
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.slice(0, maxPostPerScan);
|
2022-11-28 09:43:44 -05:00
|
|
|
|
2022-12-14 12:41:23 -05:00
|
|
|
return Promise.all(
|
|
|
|
validFeeds.map(async (item) => {
|
|
|
|
let currentCount = count++;
|
2022-12-07 23:55:32 -05:00
|
|
|
|
2022-12-10 01:50:54 -05:00
|
|
|
let metadata = await urlMetadata(item.link);
|
|
|
|
|
|
|
|
// Download feed item image
|
2022-12-12 15:41:11 -05:00
|
|
|
let path = Path.resolve(
|
|
|
|
__dirname,
|
|
|
|
"images",
|
|
|
|
`post-image-${currentCount}`
|
|
|
|
);
|
2022-12-13 12:33:24 -05:00
|
|
|
await download_image(metadata.image, path);
|
2022-12-10 01:50:54 -05:00
|
|
|
|
2022-12-13 13:09:48 -05:00
|
|
|
let mediaup = await M.post("media", {
|
|
|
|
file: fs.createReadStream(path),
|
2022-12-12 20:25:59 -05:00
|
|
|
});
|
2022-12-13 13:09:48 -05:00
|
|
|
|
2022-12-14 12:41:23 -05:00
|
|
|
return M.post("statuses", {
|
|
|
|
status: `${
|
|
|
|
item.contentSnippet ? item.contentSnippet : item.title
|
|
|
|
}\n\n#NeoVibe #${process.env.POST_HASHTAG}\n\n${item.link}`,
|
2022-12-13 13:09:48 -05:00
|
|
|
media_ids: [mediaup.data.id],
|
2022-12-12 20:25:59 -05:00
|
|
|
});
|
2022-12-14 12:41:23 -05:00
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|
2022-11-28 09:43:44 -05:00
|
|
|
|
2022-12-14 12:41:23 -05:00
|
|
|
async function runBot() {
|
|
|
|
console.log("Running Bot: runBot()");
|
|
|
|
|
|
|
|
let feed = await readFeeds();
|
|
|
|
|
|
|
|
let postDate = await getLastPostDate();
|
|
|
|
|
|
|
|
let processedFeed = await processFeed(feed, postDate);
|
|
|
|
|
|
|
|
console.log("Completed Running Bot: runBot()");
|
|
|
|
|
|
|
|
return processedFeed;
|
2022-11-23 16:34:57 -05:00
|
|
|
}
|
2022-12-12 15:41:11 -05:00
|
|
|
|
|
|
|
const requestListener = function (req, res) {
|
|
|
|
res.writeHead(200);
|
|
|
|
res.end("Hello, World!");
|
|
|
|
};
|
|
|
|
|
|
|
|
const server = http.createServer(requestListener);
|
|
|
|
server.listen(8080);
|