diff --git a/VRR-Monitor/VRR-Monitor.js b/VRR-Monitor/VRR-Monitor.js new file mode 100644 index 0000000..338a6f0 --- /dev/null +++ b/VRR-Monitor/VRR-Monitor.js @@ -0,0 +1,184 @@ +// Variables used by Scriptable. +// These must be at the very top of the file. Do not edit. +// icon-color: deep-green; icon-glyph: bus-alt; + +let transportTypes = [ + { + name: 'ICE/IC/EC', + show: true, + code: 0 + }, + { + name: 'Zug', + show: true, + code: 1 + }, + { + name: 'S-Bahn', + show: true, + code: 2 + }, + { + name: 'U-Bahn', + show: true, + code: 3 + }, + { + name: 'Straßen-Bahn', + show: true, + code: 4 + }, + { + name: 'Bus', + show: true, + code: 15 + }, + { + name: 'Schwebe-Bahn', + show: true, + code: 6 + } + ] + +//////////////////////////////////////////////////////////////////////////////// +let backColor; //Widget background color +let backColor2; //Widget background color +let textColor; //Widget text color +let useGradient = true + +if (Device.isUsingDarkAppearance()) { + backColor = '111111'; + backColor2 = '222222'; + textColor = 'EDEDED'; +} else { + backColor = '145A32'; + backColor2 = '1E8449'; + textColor = 'FFFFFF'; +} + +async function fetchStationdata(Id, linesFilter, distance, transportCodes) { + let req = new Request("https://abfahrtsmonitor.vrr.de/backend/api/stations/table") + req.headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + } + req.method = "POST"; + req.addParameterToMultipart('table[departure][stationId]', Id) + req.addParameterToMultipart('table[departure][platformVisibility]', '1') + req.addParameterToMultipart('table[departure][transport]', transportCodes.join(',')) + req.addParameterToMultipart('table[departure][useAllLines]', '0') + req.addParameterToMultipart('table[departure][linesFilter]', linesFilter) + req.addParameterToMultipart('table[departure][rowCount]', '7') + req.addParameterToMultipart('table[departure][distance]', distance) + req.addParameterToMultipart('table[sortBy]', '0') + + try { + let res = await req.loadJSON() + return {departureData: res['departureData'], stationName: res['stationName']} + } catch (e) { + throw e + } +}; + +let widgetInputRAW = args.widgetParameter; +let widgetInput = null; + +if (widgetInputRAW !== null) { + widgetInput = widgetInputRAW.toString().split(";"); +} else { + throw new Error('No Station Code set!') +} + +console.log(widgetInput) + +let selectedTransportTypes = transportTypes.filter(function(v){ + return v.show +}) + +let selectedTransportTypesCodes = selectedTransportTypes.map(function(v){ + return v.code +}) + +let { departureData: data, stationName } = await fetchStationdata(widgetInput[0], '', widgetInput[1], selectedTransportTypesCodes); + +console.log(JSON.stringify(data, null, 2)) + +// Create Widget +let widget = new ListWidget(); + +widget.setPadding(10, 10, 10, 10) + +if (data) { + const gradient = new LinearGradient() + gradient.locations = [0, 1] + gradient.colors = [ + new Color(backColor), + new Color(backColor2) + ] + widget.backgroundGradient = gradient + + + let firstLineStack = widget.addStack() + + let provider = firstLineStack.addText("🚏 " + stationName) + provider.font = Font.boldSystemFont(12) + provider.textColor = new Color(textColor) + + // Last Update + firstLineStack.addSpacer() + let lastUpdateText = firstLineStack.addDate(new Date()) + lastUpdateText.font = Font.mediumSystemFont(10) + lastUpdateText.rightAlignText() + lastUpdateText.applyTimeStyle() + lastUpdateText.textColor = Color.lightGray() + + widget.addSpacer(10) + + let row = widget.addStack() + row.layoutHorizontally() + row.spacing = 15 + + let timeColumn = row.addStack() + timeColumn.layoutVertically(); + + let lineColumn = row.addStack() + lineColumn.layoutVertically() + + let directionColumn = row.addStack() + directionColumn.layoutVertically() + + data.forEach(function(l) { + + let timeText = timeColumn.addText(`${l.hour}:${l.minute}`) + timeText.font = Font.mediumSystemFont(12) + timeText.textColor = new Color(textColor) + timeText.leftAlignText() + + let lineText = lineColumn.addText(l.name) + lineText.font = Font.mediumSystemFont(12) + lineText.textColor = new Color(textColor) + lineText.leftAlignText() + + let directionText = directionColumn.addText(l.direction) + directionText.font = Font.mediumSystemFont(12) + directionText.textColor = new Color(textColor) + directionText.leftAlignText() + directionText.lineLimit = 1 + + }) + + widget.addSpacer() + +} else { + let fallbackText = widget.addText("Es ist ein Fehler aufgetreten! Bitte prüfen Sie die Logs direkt in der App.") + fallbackText.font = Font.mediumSystemFont(12) + fallbackText.textColor = new Color(textColor) +} + +if(!config.runsInWidget) { + await widget.presentMedium() +} else { + // Tell the system to show the widget. + Script.setWidget(widget) + Script.complete() +} + diff --git a/VRR-Monitor/previewDark.png b/VRR-Monitor/previewDark.png new file mode 100644 index 0000000..1b8d076 Binary files /dev/null and b/VRR-Monitor/previewDark.png differ diff --git a/VRR-Monitor/previewLight.png b/VRR-Monitor/previewLight.png new file mode 100644 index 0000000..95c27dc Binary files /dev/null and b/VRR-Monitor/previewLight.png differ