Skip to content

Instantly share code, notes, and snippets.

@eopo
Last active November 5, 2023 14:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eopo/9344584035f487db0e229d655bdb39c4 to your computer and use it in GitHub Desktop.
Save eopo/9344584035f487db0e229d655bdb39c4 to your computer and use it in GitHub Desktop.
iOS widget powered by the Scriptable app that shows the current capacity of FitnessFirst Gyms
/**
* Script for scriptable to get the current capacity of FitnessFirst Gyms
*/
let gymId = 'essen1'
let param = args.widgetParameter
if (param != null && param.length > 0) {
gymId = param
}
const currentGymCapacity = await fetchGymCapacity(gymId)
const storeInfo = await fetchGymInfo(gymId)
const gymName = await fetchGymInfo(gymId)
const widget = new ListWidget()
await createWidget()
if (!config.runsInWidget) {
await widget.presentSmall()
}
Script.setWidget(widget)
Script.complete()
//Create the widget
async function createWidget() {
const headlineText = widget.addText("🏋️ Capacity")
headlineText.font = Font.mediumRoundedSystemFont(19)
widget.addSpacer()
const widgetStack = widget.addStack()
widgetStack.layoutVertically()
widgetStack.bottomAlignContent()
const capacityText = widgetStack.addText(currentGymCapacity.toString() + "%")
capacityText.font = Font.mediumRoundedSystemFont(50)
if (currentGymCapacity < 20) {
capacityText.textColor = new Color("#33cc33")
} else if (currentGymCapacity < 30){
capacityText.textColor = new Color("#ff9900")
}else{
capacityText.textColor = new Color("#ff3300")
}
widgetStack.addSpacer(1)
const gymNameText = widgetStack.addText(gymName)
gymNameText.font = Font.regularSystemFont(12)
}
//Fetches the current capacity of the John Reed gym
async function fetchGymCapacity(id) {
const url = 'https://www.fitnessfirst.de/club/api/checkins/' + id
const req = new Request(url)
const result = await req.loadJSON()
return Math.round(result.data.check_ins*100/ result.data.allowed_people)
}
//Fetches the name of the gym
async function fetchGymInfo(id) {
const url = 'https://www.fitnessfirst.de/api/v1/node/club_page?include=field_features,field_opening_times&filter[status][value]=1&page[limit]=40&sort=title'
const req = new Request(url)
const apiResult = await req.loadJSON()
for (var i in apiResult.data){
if(apiResult.data[i].attributes.field_easy_solution_club_id == id)
{
return apiResult.data[i].attributes.title;
}
}
return 'Your Gym'
}
@Brototype
Copy link

Brototype commented Apr 26, 2022

Thank you!

One studio to add to your list:

Studio ID
München Haidhausen muenchen6

I also adjusted the page[limit]=40 to 100 for my studio to be part of the result set.

Another nice thing i figured out. If you have the Fitness First App you can set the widget interaction to "URL" and the URL to com.netpulse.fitnessfirst:// that will open the App when you tap on the widget

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment