Skip to content

Commit 9919109

Browse files
committed
Behebe Probleme mit zu vielen Spielern und Bedrock
* Liste wird trotz Bedrock-Spieler weiter geladen * Sind zu viele Spieler online wird die Liste mit einem Hinweis gekürzt
1 parent 84e5fa5 commit 9919109

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

GreenSurvivors_Status.js

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
// Variables used by Scriptable.
2+
// These must be at the very top of the file. Do not edit.
3+
// icon-color: deep-green; icon-glyph: leaf;
4+
15
/**
26
* GreenSurvivors Serverstatus Widget
37
* v1.1
@@ -11,7 +15,7 @@ const widget = new ListWidget()
1115
// Lade externe Daten
1216
const serverStatus = await fetchServerStatus()
1317
var playerHeads = null
14-
if ((config.widgetFamily == "large" || debug)) {
18+
if ((config.widgetFamily == "large" || debug)) {
1519
playerHeads = await loadPlayerHeads(serverStatus.players)
1620
}
1721
const backgroundImage = await loadImageWithCache("https://greensurvivors.de/wp-content/uploads/2017/12/Wallpaper.jpg", "grsv_bg", 7)
@@ -139,17 +143,27 @@ async function createPlayerList(view) {
139143
playerListRight.layoutVertically()
140144
playerListRight.addStack().addSpacer()
141145

142-
let lic = 1 // List Item Count
146+
let lic = 0 // List Item Count
143147
for ([player, icon] of playerHeads) {
148+
if (lic >= 18) {
149+
let more = view.addText("... und " + (playerHeads.size - lic) + " weitere Spieler")
150+
more.font = Font.regularSystemFont(12)
151+
more.textColor = Color.white()
152+
break
153+
}
144154
let playerEntry = null
145-
if (lic % 2 == 0) {
155+
if ((lic + 1) % 2 == 0) {
146156
playerEntry = playerListRight.addStack()
147157
} else {
148158
playerEntry = playerListLeft.addStack()
149159
}
150160
playerEntry.setPadding(4, 0, 4, 0)
151-
let head = playerEntry.addImage(icon)
152-
head.imageSize = new Size(16, 16)
161+
if (icon != null) {
162+
let head = playerEntry.addImage(icon)
163+
head.imageSize = new Size(16, 16)
164+
} else {
165+
playerEntry.addSpacer(16)
166+
}
153167
playerEntry.addSpacer(4)
154168
let playerName = playerEntry.addText(player)
155169
playerName.font = Font.regularSystemFont(12)
@@ -172,7 +186,7 @@ async function getPlayerhead(player, size) {
172186
let iconImage = loadImageWithCache(imageUrl, player, 7)
173187
return iconImage
174188
} catch (e) {
175-
console.error(e.message)
189+
console.error(e.message + " Player: " + player)
176190
}
177191
}
178192

@@ -206,7 +220,7 @@ async function loadImageWithCache(url, name, cacheTime) {
206220
return iconImage
207221
}
208222
} catch (e) {
209-
console.error(e.message)
223+
console.error(e.message + " Name: " + name)
210224
}
211225
}
212226

GreenSurvivors_Status.scriptable

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"glyph" : "leaf"
66
},
77
"name" : "GreenSurvivors Status",
8-
"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 = 1 \/\/ List Item Count\n for ([player, icon] of playerHeads) {\n let playerEntry = null\n if (lic % 2 == 0) {\n playerEntry = playerListRight.addStack()\n } else {\n playerEntry = playerListLeft.addStack()\n }\n playerEntry.setPadding(4, 0, 4, 0)\n let head = playerEntry.addImage(icon)\n head.imageSize = new Size(16, 16)\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)\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)\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}",
8+
"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}",
99
"share_sheet_inputs" : [
1010

1111
]

0 commit comments

Comments
 (0)