neovibe-bots/bot.js

96 lines
2.3 KiB
JavaScript
Raw Normal View History

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-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-12 20:25:59 -05:00
.on("finish", () => resolve(true))
.on("error", (e) => reject(e))
);
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-11-23 16:34:57 -05:00
await postFeed();
setInterval(async () => {
2022-12-13 19:52:53 -05:00
console.log("Running postFeed()");
2022-11-23 16:34:57 -05:00
await postFeed();
2022-12-13 19:52:53 -05:00
console.log("Completed postFeed()");
2022-11-23 19:12:40 -05:00
}, 60 * 60 * 1000);
2022-11-23 16:34:57 -05:00
})();
async function postFeed() {
2022-11-23 15:30:51 -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-11-23 17:25:52 -05:00
let feed = await parser.parseURL("http://feeds.feedburner.com/ign/games-all");
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-11-23 16:34:57 -05:00
let count = 0;
2022-12-08 00:08:17 -05:00
feed.items.every(async (item) => {
let pubDate = new Date(item.pubDate);
2022-11-23 15:30:51 -05:00
2022-12-12 20:00:54 -05:00
if (pubDate > postDate) {
2022-12-12 15:41:11 -05:00
let currentCount = ++count;
2022-11-28 09:43:44 -05:00
2022-12-12 15:41:11 -05:00
if (currentCount > maxPostPerScan) return false;
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
await M.post("statuses", {
status: `${item.title}\n\n#NeoVibe #${process.env.POST_HASHTAG}\n\n${item.link}`,
media_ids: [mediaup.data.id],
2022-12-12 20:25:59 -05:00
});
2022-12-13 13:09:48 -05:00
return true;
2022-12-08 00:08:17 -05:00
}
2022-11-28 09:43:44 -05:00
2022-12-08 00:08:17 -05:00
return true;
});
2022-11-23 16:34:57 -05:00
2022-12-08 00:08:17 -05:00
return true;
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);