Created
December 6, 2016 21:04
-
-
Save Gregoor/38e1fb0818341910cb97822bc0eb7cef to your computer and use it in GitHub Desktop.
for API v0.13 with single pass (`STATUS_PASSWORD` as env var)
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
''' | |
Implement the SpaceApi (<https://github.com/SpaceApi/SpaceApi>) | |
for Chaos Darmstadt (<https://www.chaos-darmstadt.de/>). | |
''' | |
import os | |
import json | |
import time | |
from flask import Flask, Response, request | |
from jsonschema import validate | |
static_info = { | |
'address': 'Wilhelminenstra\u00dfe 17, 64283 Darmstadt, Germany', | |
'api': '0.13', | |
'contact': { | |
'email': 'info@chaos-darmstadt.de', | |
'issue_mail': 'noc@chaos-darmstadt.de', | |
'irc': 'irc://hackint/#chaos-darmstadt', | |
'ml': 'public@darmstadt.ccc.de', | |
'phone': '+49 6151 6274854', | |
'twitter': '@chaosdarmstadt', | |
'twitter2': '@trollhoehle', | |
'facebook': 'Chaos-Darmstadt-476384005725422', | |
}, | |
'icon': { | |
# TODO: icons | |
'closed': 'http://status.chaos-darmstadt.de/cda_closed.png', | |
'open': 'http://status.chaos-darmstadt.de/cda_open.png', | |
}, | |
'logo': 'http://status.chaos-darmstadt.de/cda_logo_plain.png', | |
'lat': 49.87065, | |
'lon': 8.65146, | |
'space': 'Chaos Darmstadt', | |
'url': 'https://www.chaos-darmstadt.de', | |
'issue_report_channels': [ | |
'issue_mail', | |
], | |
} | |
# duplicate some information to comply with SpaceApi v0.13 | |
static_info['location'] = { | |
'address': static_info['address'], | |
'lat': static_info['lat'], | |
'lon': static_info['lon'], | |
} | |
static_info['state'] = { | |
'icon': static_info['icon'], | |
} | |
STATUS_FILE_NAME = 'status.json' | |
STATUS_SCHEMA = { | |
'type': 'object', | |
'properties': { | |
'open': {'type': 'boolean'}, | |
'last_change': {'type': 'number'} | |
}, | |
'required': ['open', 'last_change'] | |
} | |
def validate_status(status): | |
validate(status, STATUS_SCHEMA) | |
def save_status(status): | |
validate_status(status) | |
with open(STATUS_FILE_NAME, 'w+') as status_file: | |
json.dump(status, status_file) | |
def load_status(): | |
with open(STATUS_FILE_NAME) as status_file: | |
new_status = json.load(status_file) | |
validate_status(new_status) | |
return new_status | |
status = {} | |
if os.path.isfile(STATUS_FILE_NAME): | |
status = load_status() | |
else: | |
status = {'open': False, 'last_change': time.time()} | |
save_status(status) | |
app = Flask(__name__) | |
@app.route('/', methods=['GET']) | |
def show(): | |
data = static_info.copy() | |
data['state']['open'] = data['open'] = bool(status['open']) | |
data['lastchange'] = int(status['last_change']) | |
return Response(json.dumps(data), | |
mimetype='application/json', | |
headers={'Cache-Control': 'no-cache'}) | |
@app.route('/api/door/<state>') | |
def change_status(state): | |
auth = request.authorization | |
if not auth or auth.password != os.environ['STATUS_PASSWORD']: | |
return Response('Access denied', 401) | |
state_lower = state.lower() | |
status['open'] = state_lower in ('true', '1')\ | |
and state_lower not in ('false', '0') | |
status['last_change'] = time.time() | |
save_status(status) | |
return '' | |
payback_cache = {} | |
@app.route('/api/payback') | |
def payback(): | |
global payback_cache | |
try: | |
with open('/home/payback/payback.json', 'r') as handle: | |
payback_cache = json.loads(handle.read()) | |
except IOError: | |
pass | |
return json.dumps(payback_cache) | |
if __name__ == '__main__': | |
app.run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment