Skip to content

Instantly share code, notes, and snippets.

@matkoenig
Last active December 7, 2020 18:55
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matkoenig/b53d7746128c556ba598a1a19077813d to your computer and use it in GitHub Desktop.
Save matkoenig/b53d7746128c556ba598a1a19077813d to your computer and use it in GitHub Desktop.
// 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