Last active
December 7, 2020 18:55
-
-
Save matkoenig/b53d7746128c556ba598a1a19077813d to your computer and use it in GitHub Desktop.
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
// Telekom Datenvolumen 1.1 | Matthias Konig | 27.10.2020 | |
/*------------------------------------------------------------------------------ | |
Main | |
------------------------------------------------------------------------------*/ | |
var url = "https://pass.telekom.de/api/service/generic/v1/status"; | |
var widget = await buildWidget(); | |
widget.backgroundColor = new Color("#E20074"); | |
if (!config.runsInWidget) widget.presentSmall(); | |
Script.setWidget(widget); | |
Script.complete(); | |
/*------------------------------------------------------------------------------ | |
build widget | |
------------------------------------------------------------------------------*/ | |
async function buildWidget() { | |
// create widget | |
var widget = new ListWidget(); | |
// get data by telekom service (or memory) | |
var data = await getData(); | |
// no data available | |
if (!data) { | |
var txt = widget.addText("Bitte einmalig WLAN deaktivieren und das Widget erneut aufrufen."); | |
txt.font = Font.systemFont(14); | |
txt.textColor = Color.white(); | |
return widget; | |
} | |
// get unused volumne and percentage | |
var unused = (data.initialVolume - data.usedVolume) / 1048576; | |
if (unused > 1024) { | |
unused = (unused / 1024).toFixed(2) + " GB"; | |
} else { | |
unused = Math.floor(unused) + " MB"; | |
} | |
var unusedPercentage = 100 - data.usedPercentage; | |
// create stacks | |
var stackRow1 = widget.addStack(); | |
widget.addSpacer(); | |
var stackRow2 = widget.addStack(); | |
widget.addSpacer(4); | |
var stackRow3 = widget.addStack(); | |
stackRow3.layoutVertically(); | |
// circle + logo | |
var stackCircle = stackRow1.addStack(); | |
stackRow1.addSpacer(); | |
var stackLogo = stackRow1.addStack(); | |
stackLogo.layoutVertically(); | |
stackLogo.size = new Size(50, 0); | |
var stackLogo1 = stackLogo.addStack(); | |
var stackLogo2 = stackLogo.addStack(); | |
stackLogo2.addSpacer(8); | |
var stackLogo3 = stackLogo2.addStack(); | |
stackLogo3.layoutVertically(); | |
stackCircle.size = new Size(80, 80); | |
stackCircle.addImage(getCircle(Math.floor(unusedPercentage * 360 / 100), unusedPercentage + "%")); | |
var logo = await getLogo(); | |
imageLogo = stackLogo1.addImage(logo); | |
imageLogo.imageSize = new Size(50, 36); | |
imageLogo.rightAlignImage(); | |
var txtDate = stackLogo3.addText(data.responseDate); | |
txtDate.font = Font.systemFont(6); | |
txtDate.textColor = Color.white(); | |
// unused volumne | |
var txtRow2 = stackRow2.addText("noch " + unused); | |
txtRow2.font = Font.boldSystemFont(18); | |
txtRow2.textColor = Color.white(); | |
// initial volumne + remaining time | |
var txtRow3 = stackRow3.addText("von " + data.initialVolumeStr + " für " + data.remainingTimeStr.replace(/\s\d+\sStd./, "")); | |
txtRow3.font = Font.systemFont(10); | |
txtRow3.textColor = Color.white(); | |
txtRow3.lineLimit = 1; | |
txtRow3.minimumScaleFactor = 0.6; | |
// return widget | |
return widget; | |
} | |
/*------------------------------------------------------------------------------ | |
get data | |
------------------------------------------------------------------------------*/ | |
async function getData() { | |
var data = null; | |
var fm = FileManager.local(); | |
var dir = fm.documentsDirectory(); | |
var path = fm.joinPath(dir, "scriptable-telekom.json"); | |
try { | |
var req = new Request(url); | |
req.headers = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1"}; | |
data = await req.loadJSON(); | |
data.responseDate = formatDate(new Date()); | |
fm.writeString(path, JSON.stringify(data, null, 2)); | |
widget.refreshAfterDate = new Date(Date.now() + 30 * 60 * 1000); | |
} catch (err) { | |
data = JSON.parse(fm.readString(path), null); | |
if (!data || !data.usedPercentage) return null; | |
} | |
return data; | |
} | |
/*------------------------------------------------------------------------------ | |
get circle | |
------------------------------------------------------------------------------*/ | |
function getCircle(deg, txt) { | |
var canvas = new DrawContext(); | |
canvas.size = new Size(80, 80); | |
canvas.opaque = false; | |
canvas.respectScreenScale = true; | |
var rect = new Rect(4, 4, 72, 72); | |
canvas.setFillColor(Color.green()); | |
canvas.setStrokeColor(new Color("#FFFFFF")); | |
canvas.setLineWidth(8); | |
canvas.strokeEllipse(rect); | |
for (var i = 0; i < deg; i++) { | |
rect = new Rect(40 + 36 * Math.sin((i * Math.PI) / 180) - 4, 40 - 36 * Math.cos((i * Math.PI) / 180) - 4, 8, 8); | |
canvas.fillEllipse(rect); | |
} | |
rect = new Rect(4, 26, 72, 30); | |
canvas.setTextAlignedCenter(); | |
canvas.setTextColor(Color.white()); | |
canvas.setFont(Font.boldSystemFont(20)); | |
canvas.drawTextInRect(txt, rect); | |
return canvas.getImage(); | |
} | |
/*------------------------------------------------------------------------------ | |
get logo | |
------------------------------------------------------------------------------*/ | |
async function getLogo(url) { | |
var fm = FileManager.local(); | |
var dir = fm.documentsDirectory(); | |
var path = fm.joinPath(dir, "scriptable-telekom-logo.png"); | |
if (fm.fileExists(path)) { | |
return await fm.readImage(path); | |
} | |
var req = new Request("https://www.detim.de/wp-content/uploads/2017/03/Telekom-logo.png"); | |
var img = await req.loadImage(); | |
fm.writeImage(path, img); | |
return img; | |
} | |
/*------------------------------------------------------------------------------ | |
convert date to string | |
------------------------------------------------------------------------------*/ | |
function formatDate(d) { | |
var month = (d.getMonth() + 1).toString(); | |
var day = d.getDate().toString(); | |
var hour = d.getHours().toString(); | |
var minute = d.getMinutes().toString(); | |
if (month.length < 2) month = "0" + month; | |
if (day.length < 2) day = "0" + day; | |
if (hour.length < 2) hour = "0" + hour; | |
if (minute.length < 2) minute = "0" + minute; | |
return day + "." + month + ". " + hour + ":" + minute; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment