Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. require('dotenv').config();
  2. const axios = require('axios');
  3. const xpath = require('xpath');
  4. const Dom = require('xmldom').DOMParser;
  5. const Snoowrap = require('snoowrap');
  6.  
  7. function rand(list) {
  8.   return list[Math.floor((Math.random() * list.length))];
  9. }
  10.  
  11. async function getHurricane() {
  12.   const data = await axios.default.get(
  13.     'http://www.prh.noaa.gov/cphc/gis-cp.xml'
  14.   );
  15.   const doc = new Dom().parseFromString(data.data);
  16.   const select = xpath.useNamespaces({ nhc: 'http://www.nhc.noaa.gov' });
  17.  
  18.   const element = select('/rss/channel/item[1]/nhc:Cyclone', doc)[0];
  19.   const type = element.getElementsByTagName('nhc:type')[0].textContent;
  20.   const name = element.getElementsByTagName('nhc:name')[0].textContent;
  21.   const datetime = element.getElementsByTagName('nhc:datetime')[0].textContent;
  22.   const movement = element.getElementsByTagName('nhc:movement')[0].textContent;
  23.   const windspeed = element.getElementsByTagName('nhc:wind')[0].textContent;
  24.   const pressure = element.getElementsByTagName('nhc:pressure')[0].textContent;
  25.  
  26.   const element2 = select('/rss/channel/item[2]', doc)[0];
  27.   const guid = element2.getElementsByTagName('guid')[0].textContent;
  28.  
  29.   let stormId, advisoryNumber, imgLink;
  30.  
  31.   try {
  32.     stormId = guid.match(/ep\d{6}/);
  33.     advisoryNumber = guid.match(/\d{2}A/);
  34.  
  35.     if (stormId && advisoryNumber) {
  36.       imgLink = `http://www.prh.noaa.gov/cphc/tc_graphics/2018/graphics/${stormId[0].toUpperCase()}_3day_cone_with_line_${advisoryNumber}.png`;
  37.     }
  38.   } catch (e) {
  39.     console.error(e);
  40.   }
  41.  
  42.   return {
  43.     type,
  44.     name,
  45.     datetime,
  46.     movement,
  47.     windspeed,
  48.     pressure,
  49.     stormId,
  50.     imgLink,
  51.     advisoryNumber,
  52.     guid,
  53.   };
  54. }
  55.  
  56. const QUOTES = [
  57.   'Brought to you by your friendly /u/vlt-bot',
  58.   'Stay safe out there. /u/vlt-bot',
  59.   'This automated message brought to you by /u/vlt-bot',
  60.   'Up-to-date information from NOAA and /u/vlt-bot',
  61. ];
  62.  
  63. function promisifyGet(func) {
  64.   return () => {
  65.     return new Promise((resolve, reject) => {
  66.       func((err, res) => {
  67.         if (err) {
  68.           reject(err);
  69.         } else {
  70.           resolve(res);
  71.         }
  72.       });
  73.     });
  74.   };
  75. }
  76.  
  77. function promisifySet(func) {
  78.   return args => {
  79.     return new Promise((resolve, reject) => {
  80.       func(...args, (err, res) => {
  81.         if (err) {
  82.           reject(err);
  83.         } else {
  84.           resolve(res);
  85.         }
  86.       });
  87.     });
  88.   };
  89. }
  90.  
  91. module.exports = async (ctx, cb) => {
  92.   try {
  93.     ctx.storage.get(async function(err, data) {
  94.       try {
  95.         const { lastProcessed } = data;
  96.         const r = new Snoowrap({
  97.           clientId: ctx.secrets.REDDIT_ID,
  98.           clientSecret: ctx.secrets.REDDIT_SECRET,
  99.           username: ctx.secrets.REDDIT_USERNAME,
  100.           password: ctx.secrets.REDDIT_PASSWORD,
  101.           userAgent: ctx.secrets.REDDIT_USER_AGENT,
  102.         });
  103.  
  104.         const {
  105.           type,
  106.           name,
  107.           datetime,
  108.           movement,
  109.           windspeed,
  110.           pressure,
  111.           imgLink,
  112.           guid,
  113.         } = await getHurricane();
  114.  
  115.         if (guid === lastProcessed) {
  116.           cb(null, 'Nothing to do.');
  117.           return;
  118.         }
  119.  
  120.         const msg = textOnly => `${type} ${name} is moving ${movement}. Winds at ${windspeed}, air pressure ${pressure}.
  121.    
  122. ${!textOnly && imgLink ? imgLink : ''}
  123.  
  124. Data as of ${datetime}. *${rand(QUOTES)}*`;
  125.         console.log(msg);
  126.         await r.getLivethread(ctx.secrets.LIVE_THREAD_ID).addUpdate(msg(false));
  127.         await r
  128.           .getLivethread(ctx.secrets.TEXT_ONLY_THREAD_ID)
  129.           .addUpdate(msg(true));
  130.         ctx.storage.set({ lastProcessed: guid }, cb);
  131.       } catch (e) {
  132.         cb(e);
  133.       }
  134.     });
  135.   } catch (e) {
  136.     cb(e);
  137.   }
  138. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement