Skip to content

Instantly share code, notes, and snippets.

@Gregoor
Created December 6, 2016 21:04
Show Gist options
  • Save Gregoor/38e1fb0818341910cb97822bc0eb7cef to your computer and use it in GitHub Desktop.
Save Gregoor/38e1fb0818341910cb97822bc0eb7cef to your computer and use it in GitHub Desktop.
for API v0.13 with single pass (`STATUS_PASSWORD` as env var)
'''
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