· 2 years ago · Jul 31, 2023, 07:35 AM
1const UPDATE_INTERVAL = 5 * 60 * 1000; //5 Minutes
2const API = "https://api.openweathermap.org/data/2.5/weather";
3
4let fieldData, channel;
5
6var div = document.getElementById('weather');
7
8const 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
17window.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
42function 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
51function 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
59window.addEventListener('onEventReceived', (evt) => {
60 switch (evt.detail.listener) {
61 case "message":
62 handleMessage(evt.detail.event.data);
63 break;
64 }
65});
66
67function 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
83function 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
99function 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
122function C2F(c) {
123 return (c * 9/5) + 32;
124}