Last active
November 4, 2024 11:04
-
-
Save dioncodes/cd4554d8593814a94925735cbcdea0c8 to your computer and use it in GitHub Desktop.
Scriptable iOS Server Status Widget
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const initialData = { | |
servers: [ | |
{ | |
url: 'https://1.example.com/', | |
title: 'Server 1', | |
online: null, | |
}, | |
{ | |
url: 'https://2.example.com/', | |
title: 'Server 2', | |
online: null, | |
}, | |
{ | |
url: 'https://3.example.com/', | |
title: 'Server 3', | |
online: null, | |
}, | |
], | |
lastUpdate: null | |
} | |
// Refresh Interval in seconds | |
const refreshInterval = 300 | |
const widget = await createWidget() | |
if (!config.runsInWidget) { | |
await widget.presentSmall() | |
} | |
Script.setWidget(widget) | |
Script.complete() | |
async function createWidget(items) { | |
const data = await refresh() | |
const list = new ListWidget() | |
// uncomment the lines below if you want to show the header (not working with more than ~5 servers) | |
// const header = list.addText("Server Status") | |
// header.font = Font.mediumSystemFont(13) | |
// list.addSpacer() | |
data.servers.forEach((server) => { | |
const label = list.addText((server.online ? '🟢' : (server.online === false ? '🔴' : '❔')) + ' ' + server.title) | |
label.font = Font.boldSystemFont(12) | |
label.textColor = Color.gray() | |
list.refreshAfterDate = new Date(Date.now() + refreshInterval) | |
list.addSpacer(3) | |
}) | |
if (data.lastUpdate) { | |
list.addSpacer() | |
const lastRefreshLabel = list.addText('Last refresh: ' + data.lastUpdate) | |
lastRefreshLabel.font = Font.mediumSystemFont(8) | |
} | |
return list | |
} | |
async function refresh() { | |
let data = initialData | |
for (let server of data.servers) { | |
try { | |
let response = await new Request(server.url).loadString() | |
server.online = response && response.length > 0 | |
} catch (e) { | |
server.online = false | |
} | |
} | |
let now = new Date() | |
let hours = now.getHours() | |
let mins = now.getMinutes() | |
data.lastUpdate = (hours > 9 ? hours : '0' + hours) + ':' + (mins > 9 ? mins : '0' + mins) | |
return data | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Incorporating the advantages of the aforementioned modifications, this version also utilizes Promise.all for concurrent network requests to enhance the efficiency of checking server statuses. Additionally, it implements a retry mechanism among other optimization features. Moreover, this widget can display a list of up to 6-7 servers while showing a title.