Compare commits

...

8 commits
v1.1.0 ... main

Author SHA1 Message Date
f3d3fced24
Delete LICENSE.md
Some checks failed
Build Docker Image / push docker image to docker hub (push) Has been cancelled
2025-09-27 18:49:58 +02:00
8ac30fd663 update dependencies #1 2025-09-27 18:49:00 +02:00
566b7e8de1
add license
Some checks failed
Build Docker Image / push docker image to docker hub (push) Has been cancelled
2025-09-07 20:10:13 +02:00
85d05e0e66 fix typo in error message #1 2024-10-13 12:54:54 +02:00
0988256239 improved exception & error handling #1 2024-10-12 17:30:47 +02:00
5e07460615 fix: add requests as requirement 2024-10-12 13:36:32 +02:00
921442289a
change debian to ubuntu for building the image 2024-10-12 13:16:50 +02:00
06ba3ef0e1 create new github action for automated deployment 2024-10-12 13:13:33 +02:00
4 changed files with 78 additions and 45 deletions

View file

@ -1,18 +0,0 @@
name: Docker-Hub-Autopublishing
on:
push:
tags:
- '*'
jobs:
build:
runs-on: debian-latest
steps:
- uses: actions/checkout@v1
- name: Build docker image and push to docker hub
run: |
echo "${{ secrets.DOCKER_TOKEN }}" | docker login -u michivonah --password-stdin
docker image build -t michivonah/ep-alerts:latest .
docker push michivonah/ep-alerts:latest

25
.github/workflows/image-build.yml vendored Normal file
View file

@ -0,0 +1,25 @@
name: Build Docker Image
on:
push:
branches:
- main
jobs:
build:
name: push docker image to docker hub
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: login to docker hub
id: docker-hub
env:
username: ${{secrets.DOCKER_USERNAME}}
password: ${{secrets.DOCKER_TOKEN}}
run: |
docker login -u $username -p $password
- name: build the docker image
id: build-docker-image
run: |
docker build -t michivonah/ep-alerts:latest .
- name: push the docker image
id: push-docker-image
run: docker push michivonah/ep-alerts:latest

75
main.py
View file

@ -26,41 +26,63 @@ def sendMessage(message, notificationType):
header = {
"Authorization":f"Bearer {accessToken}"
}
response = requests.post(url=endpoint, headers=header, data=message)
else: response = requests.post(url=endpoint, data=message)
try:
response = requests.post(url=endpoint, headers=header, data=message)
except Exception as error:
raise Exception(f"Got an error while sending the notification: {error}")
else:
try:
response = requests.post(url=endpoint, data=message)
except Exception as error:
raise Exception(f"Got an error while sending the notification: {error}")
return response
case "discord" | _:
endpoint = os.getenv('DISCORD_WEBHOOK')
data = {
"content": message,
}
response = requests.post(url=endpoint, json=data)
return response
try:
response = requests.post(url=endpoint, json=data)
return response
except Exception as error:
raise Exception(f"Got an error while sending the notification: {error}")
# Check for the current waiting times
def checkTimes(subscribedAttractions, themepark):
endpoint = "https://api.wartezeiten.app/v1/waitingtimes"
try:
endpoint = "https://api.wartezeiten.app/v1/waitingtimes"
header = {
"language":"de",
"park":themepark
}
header = {
"language":"de",
"park":themepark
}
req = requests.get(url=endpoint, headers=header)
result = req.json()
attractions = result
for attraction in attractions:
if attraction["code"] in subscribedAttractions:
if attraction["status"] == "opened":
refreshTime = 30
if not attraction["code"] in currentTimes: currentTimes[attraction["code"]] = attraction["waitingtime"];
if currentTimes[attraction["code"]] > attraction["waitingtime"]:
sendMessage(f"Waiting time of {attraction['name']} sank to {attraction['waitingtime']} Minutes!", notificationType)
elif currentTimes[attraction["code"]] < attraction["waitingtime"]:
sendMessage(f"Waiting time for {attraction['name']} increased to {attraction['waitingtime']} Minutes!", notificationType)
currentTimes[attraction["code"]] = attraction["waitingtime"]
req = requests.get(url=endpoint, headers=header)
except:
raise Exception(f"API Request to endpoint {endpoint} failed.")
try:
result = req.json()
except:
raise Exception("Format of API response is invalid. (JSON expected)")
try:
attractions = result
for attraction in attractions:
if isinstance(attraction, dict) and "code" in attraction:
if attraction["code"] in subscribedAttractions:
if attraction["status"] == "opened":
refreshTime = 30
if not attraction["code"] in currentTimes: currentTimes[attraction["code"]] = attraction["waitingtime"];
if currentTimes[attraction["code"]] > attraction["waitingtime"]:
sendMessage(f"Waiting time of {attraction['name']} sank to {attraction['waitingtime']} Minutes!", notificationType)
elif currentTimes[attraction["code"]] < attraction["waitingtime"]:
sendMessage(f"Waiting time for {attraction['name']} increased to {attraction['waitingtime']} Minutes!", notificationType)
currentTimes[attraction["code"]] = attraction["waitingtime"]
else:
refreshTime = 180
else:
refreshTime = 180
print(f"Info: Attraction was skipped because it has an invalid data structure. Affected attraction: {attraction}")
except Exception as error:
raise Exception(f"Got an error while checking for differences since the last API call. Error: {error}")
# Main Loop
# Checks every 30 seconds for changes in the waiting times of the subscribed attractions
@ -70,7 +92,10 @@ if __name__ == '__main__':
print("By Michi von Ah")
print("Big thanks to the wartezeiten.app API!")
while True:
checkTimes(subscribedAttractions, themepark)
print(f"Checked for updates at {time.strftime('%H:%M:%S', time.localtime())}")
try:
checkTimes(subscribedAttractions, themepark)
print(f"Checked for updates at {time.strftime('%H:%M:%S', time.localtime())}")
except Exception as error:
raise Exception(error)
time.sleep(refreshTime)

View file

@ -1,3 +1,4 @@
# requirements.txt
python-dotenv==1.0.1
pipenv==2024.1.0
python-dotenv==1.1.1
pipenv==2025.0.4
requests==2.32.5