1/**
2 * This tool fetches real-time data from various free APIs to create a JSON object
3 * representing the current state of the world from different perspectives.
4 * Data is cached for 30 minutes using Val Town's SQLite database to reduce API calls and improve performance.
21}
22
23// Utility function for fetching JSON data
24async function fetchJSON(url: string) {
25 try {
26 const response = await fetch(url);
27 if (!response.ok) {
28 throw new Error(`HTTP error! status: ${response.status}`);
30 return await response.json();
31 } catch (error) {
32 console.error(`Error fetching ${url}:`, error);
33 return null;
34 }
40}
41
42// Utility function for fetching Wolfram Alpha data
43async function fetchWolframData(query: string) {
44 const appId = 'K8UTGR-8Y5G3A3VTP';
45 const url = `http://api.wolframalpha.com/v1/result?appid=${appId}&i=${encodeURIComponent(query)}`;
46 try {
47 const response = await fetch(url);
48 if (!response.ok) {
49 throw new Error(`HTTP error! status: ${response.status}`);
51 return await response.text();
52 } catch (error) {
53 console.error(`Error fetching Wolfram data for query "${query}":`, error);
54 return null;
55 }
56}
57
58// Utility function for fetching Alpha Vantage stock data
59async function fetchStockData(symbol: string) {
60 const apiKey = 'TD7I78XY3N2AGKWP';
61 const url = `https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=${symbol}&interval=5min&apikey=${apiKey}`;
62 try {
63 const data = await fetchJSON(url);
64 if (data && data['Time Series (5min)']) {
65 const latestTimestamp = Object.keys(data['Time Series (5min)'])[0];
70 }
71 } catch (error) {
72 console.error(`Error fetching stock data for symbol ${symbol}:`, error);
73 return null;
74 }
90 }
91
92 // If no valid cache, fetch new data
93 const issData = await fetchJSON('http://api.open-notify.org/iss-now.json');
94 const weatherData = await fetchJSON('https://api.open-meteo.com/v1/forecast?latitude=40.71&longitude=-74.01¤t_weather=true&temperature_unit=celsius&daily=temperature_2m_max,temperature_2m_min,sunrise,sunset&timezone=America%2FNew_York');
95 const airQualityData = await fetchJSON('https://api.waqi.info/feed/geo:40.71;-74.01/?token=demo');
96 const cryptoData = await fetchJSON('https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum,dogecoin,ripple,cardano,polkadot,litecoin&vs_currencies=usd');
97 const peopleInSpaceData = await fetchJSON('http://api.open-notify.org/astros.json');
98 const timeData = await fetchJSON('https://worldtimeapi.org/api/timezone/America/New_York,Europe/London,Asia/Tokyo');
99 const exchangeRateData = await fetchJSON('https://api.exchangerate-api.com/v4/latest/USD');
100 const usaCovidData = await fetchJSON('https://disease.sh/v3/covid-19/countries/USA');
101 const solarData = await fetchJSON('https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json');
102 const earthquakeData = await fetchJSON('https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson');
103
104 const worldPopulation = await fetchWolframData('current world population');
105 const carbonDioxide = await fetchWolframData('current atmospheric CO2');
106 const internetUsers = await fetchWolframData('number of internet users');
107 const globalTemperature = await fetchWolframData('current global average temperature');
108 const moonPhase = await fetchWolframData('current moon phase');
109 const usUnemploymentRate = await fetchWolframData('current US unemployment rate');
110 const globalInflationRate = await fetchWolframData('current global inflation rate');
111 const oilPrice = await fetchWolframData('current oil price');
112 const goldPrice = await fetchWolframData('current gold price');
113
114 const sp500 = await fetchStockData('SPY');
115 const dowJones = await fetchStockData('DIA');
116 const nasdaq = await fetchStockData('QQQ');
117 const appleStock = await fetchStockData('AAPL');
118 const nvidiaStock = await fetchStockData('NVDA');
119 const teslaStock = await fetchStockData('TSLA');
120 const amazonStock = await fetchStockData('AMZN');
121 const googleStock = await fetchStockData('GOOGL');
122
123 const worldState = {
267 </div>
268 <script>
269 async function fetchData() {
270 try {
271 const response = await fetch(window.location.href);
272 const data = await response.json();
273 document.getElementById('data').textContent = JSON.stringify(data, null, 2);
274 } catch (error) {
275 console.error('Error:', error);
276 document.getElementById('data').textContent = 'Error fetching data';
277 }
278 }
279 fetchData();
280 </script>
281</body>