-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGreenSurvivors_Status.scriptable
More file actions
12 lines (11 loc) · 6.47 KB
/
GreenSurvivors_Status.scriptable
File metadata and controls
12 lines (11 loc) · 6.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
{
"always_run_in_app" : false,
"icon" : {
"color" : "deep-green",
"glyph" : "leaf"
},
"name" : "GreenSurvivors Status",
"script" : "const debug = false\n\nconst widget = new ListWidget()\n\n\/\/ Lade externe Daten\nconst serverStatus = await fetchServerStatus()\nvar playerHeads = null\nif ((config.widgetFamily == \"large\" || debug)) {\n playerHeads = await loadPlayerHeads(serverStatus.players)\n}\nconst backgroundImage = await loadImageWithCache(\"https:\/\/greensurvivors.de\/wp-content\/uploads\/2017\/12\/Wallpaper.jpg\", \"grsv_bg\", 7)\n\ncreateWidget()\nif (!config.runsInWidget && debug) {\n await widget.presentLarge()\n}\nif (!config.runsInWidget && !debug) {\n const callback = new CallbackURL(\"https:greensurvivors.de\")\n callback.open()\n}\nScript.setWidget(widget)\nScript.complete()\n\n\/*****************\n * Methoden\n *****************\/\n\n \/**\n * Erzeugt das Widget\n *\/\nasync function createWidget() { \n widget.setPadding(0, 0, 0, 0)\n widget.backgroundColor = new Color(\"#181818\")\n widget.backgroundImage = backgroundImage\n \n const backgroundWrapper = widget.addStack()\n backgroundWrapper.backgroundColor = new Color(\"000000\", 0.6)\n backgroundWrapper.setPadding(10, 20, 10, 20)\n backgroundWrapper.layoutVertically()\n \n const titleFontSize = 26\n const mediumFontSize = 18\n \n const mainWrapper = backgroundWrapper.addStack()\n \/\/ Expand für Hintergrund\n backgroundWrapper.addSpacer()\n \/\/ Content nach oben schieben\n \n mainWrapper.layoutVertically()\n \n const serverStatusStack = mainWrapper.addStack()\n serverStatusStack.setPadding(8, 0, 8, 0)\n \n \/\/ Icon\n try {\n const faviconBase64 = serverStatus.favicon.split(\"base64,\")[1]\n \t const faviconData = Data.fromBase64String(faviconBase64)\n \tconst faviconImage = Image.fromData(faviconData)\n \tconst favicon = serverStatusStack.addImage(faviconImage)\n \tfavicon.imageSize = new Size(64, 64) \n } catch(e) {\n\t console.error(e.message) \n }\n \n serverStatusStack.addSpacer(8)\n \n \/\/ Servername\n const statusTextStack = serverStatusStack.addStack() \n statusTextStack.layoutVertically()\n const header = statusTextStack.addStack()\n const serverName = header.addText('GreenSurvivors.de') \n serverName.textColor = Color.white()\n serverName.font = Font.regularSystemFont(titleFontSize)\n\n \/\/ Players\n const playerCount = statusTextStack.addStack()\n const players = serverStatus.info.Players\n const maxPlayers = serverStatus.info.MaxPlayers\n const playerCountText = players + '\/' + maxPlayers\n const text = playerCount.addText(playerCountText)\n text.font = Font.regularSystemFont(mediumFontSize)\n text.textColor = Color.white()\n\n if (config.widgetFamily == \"large\" || debug) {\n await createPlayerList(mainWrapper)\n }\n}\n\n\/**\n * Lädt den Serverstatus vom Webservice\n *\/\nasync function fetchServerStatus() {\n let url = \"https:\/\/greensurvivors.de\/forum\/webservice\/minecraft\/serverQuery?url=greensurvivors.de&port=25565\"\n const request = new Request(url)\n let res = await request.loadString()\n let obj = JSON.parse(res)\n \n if (obj.players == false) {\n obj.players = []\n }\n \n return obj\n}\n\n\/**\n * Lädt die Spielerköpfe\n * @param players \n *\/\nasync function loadPlayerHeads(players) {\n heads = new Map()\n for (player of players) {\n let icon = await getPlayerhead(player, 16)\n heads.set(player, icon)\n }\n return heads\n}\n\n\/**\n * Erzeugt eine zweispaltige Spielerliste und hängt sie an view an\n * @param view Stack in den die Liste eingepflegt werden soll\n *\/\nasync function createPlayerList(view) {\n try {\n const playerListWrapper = view.addStack()\n playerListWrapper.layoutHorizontally()\n\n \/\/ left column\n const playerListLeft = playerListWrapper.addStack()\n playerListLeft.layoutVertically()\n playerListLeft.addStack().addSpacer()\n \/\/ right column\n const playerListRight = playerListWrapper.addStack()\n playerListRight.layoutVertically()\n playerListRight.addStack().addSpacer()\n\n\t let lic = 0 \/\/ List Item Count\n for ([player, icon] of playerHeads) {\n if (lic >= 18) {\n let more = view.addText(\"... und \" + (playerHeads.size - lic) + \" weitere Spieler\")\n more.font = Font.regularSystemFont(12)\n more.textColor = Color.white()\n break\n }\n let playerEntry = null\n if ((lic + 1) % 2 == 0) {\n playerEntry = playerListRight.addStack()\n } else {\n playerEntry = playerListLeft.addStack()\n }\n playerEntry.setPadding(4, 0, 4, 0)\n if (icon != null) {\n \tlet head = playerEntry.addImage(icon)\n head.imageSize = new Size(16, 16)\n } else {\n playerEntry.addSpacer(16)\n }\n playerEntry.addSpacer(4)\n let playerName = playerEntry.addText(player)\n playerName.font = Font.regularSystemFont(12)\n playerName.textColor = Color.white()\n lic++\n }\n } catch(e) {\n console.error(e.message)\n }\n}\n\n\/**\n * Spielerkopf herunterladen\n * @param player\n * @param size\n *\/\nasync function getPlayerhead(player, size) {\n try {\n let imageUrl = \"https:\/\/cravatar.eu\/helmavatar\/\" + player + \"\/\" + size + \".png\"\n let iconImage = loadImageWithCache(imageUrl, player, 7)\n return iconImage\n } catch (e) {\n console.error(e.message + \" Player: \" + player)\n }\n}\n\n\/**\n * Lädt ein Bild aus einer URL oder Cache\n * @param url \n * @param name \n * @param cacheTime \n *\/\nasync function loadImageWithCache(url, name, cacheTime) {\n try {\n let fm = FileManager.local()\n let dir = fm.joinPath(fm.documentsDirectory(), \"grsv_status\")\n if (!fm.fileExists(dir)) {\n fm.createDirectory(dir)\n }\n \n let path = fm.joinPath(dir, name)\n \n let cacheDate = new Date()\n cacheDate.setDate(cacheDate.getDate() - cacheTime)\n \n if (fm.fileExists(path) && fm.modificationDate(path) > cacheDate) {\n console.log(`Image found in cache ${name}`)\n return fm.readImage(path)\n } else {\n \/\/ download once\n let iconImage = await loadImage(url)\n fm.writeImage(path, iconImage)\n console.log(`Image downloaded ${name}`)\n return iconImage\n }\n } catch (e) {\n console.error(e.message + \" Name: \" + name)\n }\n}\n\n\/**\n * Lädt ein Bild von einer URL\n * @param imgUrl \n *\/\nasync function loadImage(imgUrl) {\n const req = new Request(imgUrl)\n return await req.loadImage()\n}",
"share_sheet_inputs" : [
]
}