Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require('dotenv').config();
- const axios = require('axios');
- const xpath = require('xpath');
- const Dom = require('xmldom').DOMParser;
- const Snoowrap = require('snoowrap');
- function rand(list) {
- return list[Math.floor((Math.random() * list.length))];
- }
- async function getHurricane() {
- const data = await axios.default.get(
- 'http://www.prh.noaa.gov/cphc/gis-cp.xml'
- );
- const doc = new Dom().parseFromString(data.data);
- const select = xpath.useNamespaces({ nhc: 'http://www.nhc.noaa.gov' });
- const element = select('/rss/channel/item[1]/nhc:Cyclone', doc)[0];
- const type = element.getElementsByTagName('nhc:type')[0].textContent;
- const name = element.getElementsByTagName('nhc:name')[0].textContent;
- const datetime = element.getElementsByTagName('nhc:datetime')[0].textContent;
- const movement = element.getElementsByTagName('nhc:movement')[0].textContent;
- const windspeed = element.getElementsByTagName('nhc:wind')[0].textContent;
- const pressure = element.getElementsByTagName('nhc:pressure')[0].textContent;
- const element2 = select('/rss/channel/item[2]', doc)[0];
- const guid = element2.getElementsByTagName('guid')[0].textContent;
- let stormId, advisoryNumber, imgLink;
- try {
- stormId = guid.match(/ep\d{6}/);
- advisoryNumber = guid.match(/\d{2}A/);
- if (stormId && advisoryNumber) {
- imgLink = `http://www.prh.noaa.gov/cphc/tc_graphics/2018/graphics/${stormId[0].toUpperCase()}_3day_cone_with_line_${advisoryNumber}.png`;
- }
- } catch (e) {
- console.error(e);
- }
- return {
- type,
- name,
- datetime,
- movement,
- windspeed,
- pressure,
- stormId,
- imgLink,
- advisoryNumber,
- guid,
- };
- }
- const QUOTES = [
- 'Brought to you by your friendly /u/vlt-bot',
- 'Stay safe out there. /u/vlt-bot',
- 'This automated message brought to you by /u/vlt-bot',
- 'Up-to-date information from NOAA and /u/vlt-bot',
- ];
- function promisifyGet(func) {
- return () => {
- return new Promise((resolve, reject) => {
- func((err, res) => {
- if (err) {
- reject(err);
- } else {
- resolve(res);
- }
- });
- });
- };
- }
- function promisifySet(func) {
- return args => {
- return new Promise((resolve, reject) => {
- func(...args, (err, res) => {
- if (err) {
- reject(err);
- } else {
- resolve(res);
- }
- });
- });
- };
- }
- module.exports = async (ctx, cb) => {
- try {
- ctx.storage.get(async function(err, data) {
- try {
- const { lastProcessed } = data;
- const r = new Snoowrap({
- clientId: ctx.secrets.REDDIT_ID,
- clientSecret: ctx.secrets.REDDIT_SECRET,
- username: ctx.secrets.REDDIT_USERNAME,
- password: ctx.secrets.REDDIT_PASSWORD,
- userAgent: ctx.secrets.REDDIT_USER_AGENT,
- });
- const {
- type,
- name,
- datetime,
- movement,
- windspeed,
- pressure,
- imgLink,
- guid,
- } = await getHurricane();
- if (guid === lastProcessed) {
- cb(null, 'Nothing to do.');
- return;
- }
- const msg = textOnly => `${type} ${name} is moving ${movement}. Winds at ${windspeed}, air pressure ${pressure}.
- ${!textOnly && imgLink ? imgLink : ''}
- Data as of ${datetime}. *${rand(QUOTES)}*`;
- console.log(msg);
- await r.getLivethread(ctx.secrets.LIVE_THREAD_ID).addUpdate(msg(false));
- await r
- .getLivethread(ctx.secrets.TEXT_ONLY_THREAD_ID)
- .addUpdate(msg(true));
- ctx.storage.set({ lastProcessed: guid }, cb);
- } catch (e) {
- cb(e);
- }
- });
- } catch (e) {
- cb(e);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement