Advertisement
Dreigon

JS

Jul 31st, 2023
838
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const UPDATE_INTERVAL = 5 * 60 * 1000; //5 Minutes
  2. const API = "https://api.openweathermap.org/data/2.5/weather";
  3.  
  4. let fieldData, channel;
  5.  
  6. var div = document.getElementById('weather');
  7.  
  8. const COMMANDS = {
  9.   setlocation: (args) => {
  10.     if (args.length == 0) return;
  11.     fieldData.location = args.join(" ");
  12.     SE_API.store.set('dreigonWidget', {loc: fieldData.location});
  13.     update();
  14.   }
  15. };
  16.  
  17. window.addEventListener('onWidgetLoad', function (obj) {
  18.     //console.log(obj);
  19.     fieldData = obj.detail.fieldData;
  20.     channel = obj.detail.channel.username;
  21.     setLabel("lblTemp");
  22.     setLabel("lblHumidity");
  23.     setLabel("lblForecast");
  24.     if (fieldData.lblPosition === "after") {
  25.         swapNodes("lblTemp", "temperature");
  26.         swapNodes("lblHumidity", "humidity");
  27.         swapNodes("lblForecast", "forecast");
  28.         //$("#lblTemp").after($("#temperature"));
  29.         //$("#lblHumidity").after($("#humidity"));
  30.         //$("#lblForecast").after($("#forecast"));
  31.     }
  32.     if (fieldData.showHumidity === "no") document.getElementById("sectionHumidity").style.display = "none";
  33.     if (fieldData.showTemp === "no") document.getElementById("sectionTemp").style.display = "none";
  34.     if (fieldData.showForecast === "no") document.getElementById("sectionForecast").style.display = "none";
  35.     SE_API.store.get('dreigonWidget').then(obj => {
  36.         if (obj && obj.loc) fieldData.location = obj.loc;
  37.         update();
  38.     });
  39.     setInterval(update, UPDATE_INTERVAL);
  40. });
  41.  
  42. function swapNodes(aId, bId) {
  43.     var a = document.getElementById(aId);
  44.     var b = document.getElementById(bId);
  45.     var aparent = a.parentNode;
  46.     var asibling = a.nextSibling === b ? a : a.nextSibling;
  47.     b.parentNode.insertBefore(a, b);
  48.     aparent.insertBefore(b, asibling);
  49. }
  50.  
  51. function setLabel(lbl) {
  52.     if (fieldData[lbl].length == 0) {
  53.         document.getElementById(lbl).style.display = "none";
  54.     } else {
  55.         document.getElementById(lbl).innerHTML = fieldData[lbl];
  56.     }
  57. }
  58.  
  59. window.addEventListener('onEventReceived', (evt) => {
  60.   switch (evt.detail.listener) {
  61.     case "message":
  62.       handleMessage(evt.detail.event.data);
  63.       break;
  64.   }
  65. });
  66.  
  67. function handleMessage(evt) {
  68.     var userState = { mod: parseInt(evt.tags.mod), broadcaster: evt.nick === channel };
  69.     if (!(userState.mod == 1 || userState.broadcaster)) return;
  70.     var msg = evt.text;
  71.     if (!msg.startsWith("!")) return;
  72.     var args = msg.substring(1).split(" ");
  73.     var cmd = args.shift().toLowerCase();
  74.    
  75.     for (var key in COMMANDS) {
  76.         if (key === cmd) {
  77.           COMMANDS[key](args);
  78.         }
  79.     }
  80.    
  81. }
  82.  
  83. function update() {
  84.  
  85.     var url = new URL(API);
  86.     url.searchParams.append("q", fieldData.location);
  87.     url.searchParams.append("appid", fieldData.apikey);
  88.     url.searchParams.append("units", "metric");
  89.     if (fieldData.showLocation === "yes") {
  90.         document.getElementById("location").innerHTML = fieldData.location;
  91.     } else {
  92.         document.getElementById("location").style.display = "none";
  93.     }
  94.     fetch(url)
  95.         .then(response => response.json())
  96.         .then(data => displayWeather(data));
  97. }
  98.  
  99. function displayWeather(data) {
  100.     if (data.cod == 401) {
  101.         return console.log("Invalid API Key");
  102.     }
  103.     var celcius = data.main.temp;
  104.     var tempDisplay = "";
  105.     switch(fieldData.units) {
  106.         case "C":
  107.             tempDisplay = celcius.toFixed(fieldData.rounding) + "°C";
  108.             break;
  109.         case "F":
  110.             tempDisplay = C2F(celcius).toFixed(fieldData.rounding) + "°F";
  111.             break;
  112.         case "CF":
  113.             tempDisplay = celcius.toFixed(fieldData.rounding) + "°C | " + C2F(celcius).toFixed(fieldData.rounding) + "°F";
  114.             break;
  115.     }  
  116.     document.getElementById("temperature").innerHTML = tempDisplay;
  117.     document.getElementById("humidity").innerHTML = data.main.humidity + "%";
  118.     document.getElementById("forecast").src = `https://openweathermap.org/img/w/${data.weather[0].icon}.png`;
  119. }
  120.  
  121.  
  122. function C2F(c) {
  123.     return (c * 9/5) + 32;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement