Last active
August 30, 2024 08:37
-
-
Save drewkerr/1471a660d41bb349c45ff5459b0ab7f5 to your computer and use it in GitHub Desktop.
Olympic Medal Tally widget
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
// Variables used by Scriptable. | |
// These must be at the very top of the file. Do not edit. | |
// icon-color: deep-blue; icon-glyph: medal; | |
async function getData() { | |
//const url = "https://sph-c-api.olympics.com/summer/competition/api/ENG/medals" // Olympic Games | |
const url = "https://sph-c-api.olympics.com/summer-para/competition/api/ENG/medals" // Paralympic Games | |
const req = new Request(url) | |
const res = await req.loadJSON() | |
return await res.medalStandings.medalsTable | |
} | |
// emoji flags in Olympic 'protocol order' as used by API | |
// const getFlag = order => "๐ฆ๐ซ๐ฟ๐ฆ๐ฆ๐ฑ๐ฉ๐ฟ๐ฉ๐ช๐ฆ๐ฉ๐ฆ๐ด๐ฆ๐ฌ๐ธ๐ฆ๐ฆ๐ท๐ฆ๐ฒ๐ฆ๐ผ๐ฆ๐บ๐ฆ๐น๐ฆ๐ฟ๐ง๐ธ๐ง๐ญ๐ง๐ฉ๐ง๐ง๐ง๐พ๐ง๐ช๐ง๐ฟ๐ง๐ฏ๐ง๐ฒ๐ง๐น๐ง๐ด๐ง๐ฆ๐ง๐ผ๐ง๐ท๐ง๐ณ๐ง๐ฌ๐ง๐ซ๐ง๐ฎ๐ฐ๐พ๐ฐ๐ญ๐จ๐ฒ๐จ๐ฆ๐จ๐ป๐จ๐ซ๐จ๐ฑ๐จ๐ณ๐จ๐พ๐จ๐ด๐ฐ๐ฒ๐จ๐ฌ๐จ๐ฉ๐จ๐ฐ๐ท๐บ๐ฐ๐ท๐จ๐ท๐จ๐ฎ๐ญ๐ท๐จ๐บ๐ฉ๐ฐ๐ฉ๐ฏ๐ฉ๐ด๐ฉ๐ฒ๐ช๐ฌ๐ธ๐ป๐ฆ๐ช๐ช๐จ๐ช๐ท๐ช๐ธ๐ช๐ช๐ธ๐ฟ๐บ๐ธ๐ช๐น๐ซ๐ฏ๐ซ๐ฎ๐ซ๐ท๐ฌ๐ฆ๐ฌ๐ฒ๐ฌ๐ช๐ฌ๐ญ๐ฌ๐ง๐ฌ๐ท๐ฌ๐ฉ๐ฌ๐บ๐ฌ๐น๐ฌ๐ณ๐ฌ๐ผ๐ฌ๐ถ๐ฌ๐พ๐ญ๐น๐ญ๐ณ๐ญ๐ฐ๐ญ๐บ๐ฎ๐ณ๐ฎ๐ฉ๐ฎ๐ท๐ฎ๐ถ๐ฎ๐ช๐ฎ๐ธ๐ฎ๐ฑ๐ฎ๐น๐ฏ๐ฒ๐ฏ๐ต๐ฏ๐ด๐ฐ๐ฟ๐ฐ๐ช๐ฐ๐ฌ๐ฐ๐ฎ๐ฝ๐ฐ๐ฐ๐ผ๐ฑ๐ฆ๐ฑ๐ธ๐ฑ๐ป๐ฑ๐ง๐ฑ๐ท๐ฑ๐พ๐ฑ๐ฎ๐ฑ๐น๐ฑ๐บ๐ฒ๐ฐ๐ฒ๐ฌ๐ฒ๐พ๐ฒ๐ผ๐ฒ๐ป๐ฒ๐ฑ๐ฒ๐น๐ฒ๐ฆ๐ฒ๐ญ๐ฒ๐บ๐ฒ๐ท๐ฒ๐ฝ๐ซ๐ฒ๐ฒ๐ฉ๐ฒ๐จ๐ฒ๐ณ๐ฒ๐ช๐ฒ๐ฟ๐ฒ๐ฒ๐ณ๐ฆ๐ณ๐ท๐ณ๐ต๐ณ๐ฎ๐ณ๐ช๐ณ๐ฌ๐ณ๐ด๐ณ๐ฟ๐ด๐ฒ๐บ๐ฌ๐บ๐ฟ๐ต๐ฐ๐ต๐ผ๐ต๐ธ๐ต๐ฆ๐ต๐ฌ๐ต๐พ๐ณ๐ฑ๐ต๐ช๐ต๐ญ๐ต๐ฑ๐ต๐ท๐ต๐น๐ถ๐ฆ๐ฐ๐ต๐ท๐ด๐ท๐ผ๐ฐ๐ณ๐ฑ๐จ๐ธ๐ฒ๐ป๐จ๐ธ๐ง๐ผ๐ธ๐ฆ๐ธ๐ธ๐น๐ธ๐ณ๐ท๐ธ๐ธ๐จ๐ธ๐ฑ๐ธ๐ฌ๐ธ๐ฐ๐ธ๐ฎ๐ธ๐ด๐ธ๐ธ๐ธ๐ฉ๐ฑ๐ฐ๐ธ๐ช๐จ๐ญ๐ธ๐ท๐ธ๐พ๐น๐ฏ๐น๐ผ๐น๐ฟ๐น๐ฉ๐จ๐ฟ๐น๐ญ๐น๐ฑ๐น๐ฌ๐น๐ด๐น๐น๐น๐ณ๐น๐ฒ๐น๐ท๐น๐ป๐บ๐ฆ๐บ๐พ๐ป๐บ๐ป๐ช๐ป๐ฌ๐ป๐ฎ๐ป๐ณ๐พ๐ช๐ฟ๐ฒ๐ฟ๐ผ๐บ๐ณ".slice(order*4-4, order*4) // Olympic Games | |
const getFlag = order => "๐ฆ๐ซ๐ฉ๐ฟ๐ฆ๐ฉ๐ฆ๐ด๐ฆ๐ฌ๐ฆ๐ท๐ฆ๐ฒ๐ฆ๐ผ๐ฆ๐บ๐ฆ๐น๐ฆ๐ฟ๐ง๐ญ๐ง๐ฉ๐ง๐ง๐ง๐พ๐ง๐ช๐ง๐ฏ๐ง๐ฒ๐ง๐น๐ง๐ฆ๐ง๐ผ๐ง๐ท๐ง๐ณ๐ง๐ฌ๐ง๐ซ๐ง๐ฎ๐ฐ๐ญ๐จ๐ฒ๐จ๐ฆ๐จ๐ป๐จ๐ซ๐จ๐ฑ๐จ๐ณ๐จ๐ด๐ฐ๐ฒ๐จ๐ฌ๐จ๐ท๐จ๐ฎ๐ญ๐ท๐จ๐บ๐จ๐พ๐จ๐ฟ๐ฐ๐ต๐จ๐ฉ๐ฉ๐ฐ๐ฉ๐ด๐ช๐จ๐ช๐ฌ๐ธ๐ป๐ช๐ท๐ช๐ช๐ธ๐ฟ๐ช๐น๐ซ๐ด๐ซ๐ฏ๐ซ๐ฎ๐ซ๐ท๐ฌ๐ฆ๐ฌ๐ฒ๐ฌ๐ช๐ฉ๐ช๐ฌ๐ญ๐ฌ๐ง๐ฌ๐ท๐ฌ๐ฉ๐ฌ๐น๐ฌ๐ณ๐ฌ๐ผ๐ฌ๐พ๐ญ๐น๐ญ๐ณ๐ญ๐ฐ๐ญ๐บ๐ฎ๐ธ๐ฎ๐ณ๐ฎ๐ฉ๐ฎ๐ท๐ฎ๐ถ๐ฎ๐ช๐ฎ๐ฑ๐ฎ๐น๐ฏ๐ฒ๐ฏ๐ต๐ฏ๐ด๐ฐ๐ฟ๐ฐ๐ช๐ฐ๐ฎ๐ฐ๐ท๐ฝ๐ฐ๐ฐ๐ผ๐ฐ๐ฌ๐ฑ๐ฆ๐ฑ๐ป๐ฑ๐ง๐ฑ๐ธ๐ฑ๐ท๐ฑ๐พ๐ฑ๐ฎ๐ฑ๐น๐ฑ๐บ๐ฒ๐ด๐ฒ๐ฐ๐ฒ๐ฌ๐ฒ๐ผ๐ฒ๐พ๐ฒ๐ป๐ฒ๐ฑ๐ฒ๐น๐ฒ๐บ๐ฒ๐ฝ๐ฒ๐ฉ๐ฒ๐ณ๐ฒ๐ช๐ฒ๐ฆ๐ฒ๐ฟ๐ฒ๐ฒ๐ณ๐ฆ๐ณ๐ต๐ณ๐ฑ๐ณ๐ฟ๐ณ๐ฎ๐ณ๐ช๐ณ๐ฌ๐ณ๐ด๐ด๐ฒ๐ต๐ฐ๐ต๐ธ๐ต๐ฆ๐ต๐ฌ๐ต๐พ๐ต๐ช๐ต๐ญ๐ต๐ฑ๐ต๐น๐ต๐ท๐ถ๐ฆ๐ท๐ธ๐ท๐ด๐ท๐บ๐ท๐ผ๐ธ๐ฒ๐ธ๐น๐ธ๐ฆ๐ธ๐ณ๐ท๐ธ๐ธ๐จ๐ธ๐ฑ๐ธ๐ฌ๐ธ๐ฐ๐ธ๐ฎ๐ธ๐ง๐ธ๐ด๐ฟ๐ฆ๐ช๐ธ๐ฑ๐ฐ๐ป๐จ๐ธ๐ท๐ธ๐ช๐จ๐ญ๐ธ๐พ๐น๐ผ๐น๐ฏ๐น๐ฟ๐น๐ญ๐น๐ฑ๐น๐ฌ๐น๐ด๐น๐น๐น๐ณ๐น๐ท๐น๐ฒ๐บ๐ฌ๐บ๐ฆ๐ฆ๐ช๐บ๐ธ๐บ๐พ๐ป๐ฎ๐บ๐ฟ๐ป๐บ๐ป๐ช๐ป๐ณ๐พ๐ช๐ฟ๐ฒ๐ฟ๐ผ".slice(order*4-4, order*4) // Paralympic Games | |
// show table of results when run in Scriptable | |
function createTable(data) { | |
let table = new UITable() | |
const addRow = (rank, country, gold, silver, bronze, total, header = false) => { | |
let row = new UITableRow() | |
row.isHeader = header | |
row.addText(`${rank}`).widthWeight = 10 | |
row.addText(`${country}`).widthWeight = 50 | |
for (let medal of [gold, silver, bronze, total]) { | |
row.addText(`${medal}`).widthWeight = 10 | |
} | |
table.addRow(row) | |
} | |
addRow("", "Country", "๐ฅ", "๐ฅ", "๐ฅ", "ฮฃ", true) | |
for (let country of data) { | |
let flag = getFlag(country.protocolOrder) | |
let medals = country.medalsNumber.find(m => m.type === "Total") | |
addRow(country.rank, flag + ' ' + country.description, medals.gold, medals.silver, medals.bronze, medals.total) | |
} | |
table.present() | |
} | |
// show top five results when displaying as small widget | |
function createWidget(data) { | |
let widget = new ListWidget() | |
const addRow = (label, gold, silver, bronze) => { | |
let row = widget.addStack() | |
let col = row.addStack() | |
col.addText(`${label}`) | |
col.addSpacer() | |
for (let medal of [gold, silver, bronze]) { | |
let col = row.addStack() | |
col.size = new Size(30, 0) | |
col.addText(`${medal}`) | |
} | |
} | |
addRow("","๐ฅ","๐ฅ","๐ฅ") | |
for (let i =0; i < 5 && i < data.length; i++) { | |
let country = data[i] | |
let flag = getFlag(country.protocolOrder) | |
let medals = country.medalsNumber.find(m => m.type === "Total") | |
addRow(flag, medals.gold, medals.silver, medals.bronze) | |
} | |
return widget | |
} | |
let data = await getData() | |
if (config.runsInApp) { | |
createTable(data) | |
} else if (config.runsInWidget) { | |
let widget = createWidget(data) | |
Script.setWidget(widget) | |
} | |
Script.complete() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment