<link rel="me" title="proven.lol" href="https://proven.lol/4cc26c"> <script src="https://tinylytics.app/embed/QUH6xcnWKYeUUYaMkDKd.js?kudos=👋" defer></script> <script> // get weather data from pastebin document.addEventListener("DOMContentLoaded", function() { const hasWeather = document.getElementById('conditions'); if (hasWeather) { const wx_endpoint = 'https://paste.jbowdre.lol/tempest.json/raw'; // get ready to calculate relative time const units = { year : 24 * 60 * 60 * 1000 * 365, month : 24 * 60 * 60 * 1000 * 365/12, day : 24 * 60 * 60 * 1000, hour : 60 * 60 * 1000, minute: 60 * 1000, second: 1000 } let rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' }) let getRelativeTime = (d1, d2 = new Date()) => { let elapsed = d1 - d2 for (var u in units) if (Math.abs(elapsed) > units[u] || u === 'second') return rtf.format(Math.round(elapsed/units[u]), u) } // set up temperature and rain ranges const tempRanges = [ { upper: 32, label: 'cold' }, { upper: 60, label: 'cool' }, { upper: 80, label: 'warm' }, { upper: Infinity, label: 'hot' } ]; const rainRanges = [ { upper: 0.02, label: 'none' }, { upper: 0.2, label: 'light' }, { upper: 1.4, label: 'moderate' }, { upper: Infinity, label: 'heavy' } ] // maps for selecting icons const CLASS_MAP_PRESS = { 'steady': 'fa-solid fa-arrow-right-long', 'rising': 'fa-solid fa-arrow-trend-up', 'falling': 'fa-solid fa-arrow-trend-down' } const CLASS_MAP_RAIN = { 'none': 'fa-solid fa-droplet-slash', 'light': 'fa-solid fa-glass-water-droplet', 'moderate': 'fa-solid fa-glass-water', 'heavy': 'fa-solid fa-bucket' } const CLASS_MAP_TEMP = { 'hot': 'fa-solid fa-thermometer-full', 'warm': 'fa-solid fa-thermometer-half', 'cool': 'fa-solid fa-thermometer-quarter', 'cold': 'fa-solid fa-thermometer-empty' } const CLASS_MAP_WX = { 'clear-day': 'fa-solid fa-sun', 'clear-night': 'fa-solid fa-moon', 'cloudy': 'fa-solid fa-cloud', 'foggy': 'fa-solid fa-cloud-showers-smog', 'partly-cloudy-day': 'fa-solid fa-cloud-sun', 'partly-cloudy-night': 'fa-solid fa-cloud-moon', 'possibly-rainy-day': 'fa-solid fa-cloud-sun-rain', 'possibly-rainy-night': 'fa-solid fa-cloud-moon-rain', 'possibly-sleet-day': 'fa-solid fa-cloud-meatball', 'possibly-sleet-night': 'fa-solid fa-cloud-moon-rain', 'possibly-snow-day': 'fa-solid fa-snowflake', 'possibly-snow-night': 'fa-solid fa-snowflake', 'possibly-thunderstorm-day': 'fa-solid fa-cloud-bolt', 'possibly-thunderstorm-night': 'fa-solid fa-cloud-bolt', 'rainy': 'fa-solid fa-cloud-showers-heavy', 'sleet': 'fa-solid fa-cloud-rain', 'snow': 'fa-solid fa-snowflake', 'thunderstorm': 'fa-solid fa-cloud-bolt', 'windy': 'fa-solid fa-wind', } // fetch data from pastebin fetch(wx_endpoint) .then(res => res.json()) .then(function(res){ // calculate age of last update let updateTime = res.time; updateTime = parseInt(updateTime); updateTime = updateTime*1000; updateTime = new Date(updateTime); let updateAge = getRelativeTime(updateTime); // parse data let conditions = (res.conditions).toLowerCase(); let tempDiff = Math.abs(res.temperature - res.feels_like); let temp = `${res.temperature}°f (${(((res.temperature - 32) * 5) / 9).toFixed(1)}°c)`; if (tempDiff >= 5) { temp += `, feels ${res.feels_like}°f (${(((res.feels_like - 32) *5) / 9).toFixed(1)}°c)`; } let tempLabel = (tempRanges.find(range => res.feels_like < range.upper)).label; let humidity = `${res.humidity}% humidity`; let wind = `${res.wind_gust}mph (${(res.wind_gust*1.609344).toFixed(1)}kph) from ${(res.wind_direction).toLowerCase()}`; let rainLabel = (rainRanges.find(range => res.rain_today < range.upper)).label; let rainToday; if (res.rain_today === 0) { rainToday = 'no rain today'; } else { rainToday = `${res.rain_today}" rain today`; } let pressureTrend = res.pressure_trend; let pressure = `${res.pressure}inhg and ${pressureTrend}`; let icon = res.icon; // display data document.getElementById('time').innerHTML = updateAge; document.getElementById('conditions').innerHTML = conditions; document.getElementById('temp').innerHTML = temp; document.getElementById('humidity').innerHTML = humidity; document.getElementById('wind').innerHTML = wind; document.getElementById('rainToday').innerHTML = rainToday; document.getElementById('pressure').innerHTML = pressure; // update icons document.getElementsByClassName('fa-cloud-sun-rain')[0].classList = CLASS_MAP_WX[icon]; document.getElementsByClassName('fa-temperature-half')[0].classList = CLASS_MAP_TEMP[tempLabel]; document.getElementsByClassName('fa-droplet-slash')[0].classList = CLASS_MAP_RAIN[rainLabel]; document.getElementsByClassName('fa-arrow-right-long')[0].classList = CLASS_MAP_PRESS[pressureTrend]; }); } }); </script> <script> // retrieves latest link from a musicthread thread and displays it on the page document.addEventListener("DOMContentLoaded", function() { const musicthread = 'https://musicthread.app/api/v0/thread/2aVjZUocjk96LELFbV5JvJjm14v'; const nowPlayingElement = document.getElementById('now-playing'); if (nowPlayingElement) { fetch(musicthread) .then(res => res.json()) .then(function(res){ let nowPlaying = res.links[0]; nowPlayingElement.innerHTML = "<a href='" + nowPlaying.page_url + "'>" + nowPlaying.title + "</a> by " + nowPlaying.artist; }); } }); </script>