Skip to content
Snippets Groups Projects
warpapi.py 4.84 KiB
from flask import Flask
from flask import request
from flask import redirect
from flask import render_template
from flask import send_from_directory
from flask import json
from flask_mqtt import Mqtt
from logging.config import dictConfig

dictConfig({
    'version': 1,
    'formatters': {'default': {
        'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
    }},
    'handlers': {'wsgi': {
        'class': 'logging.StreamHandler',
        'stream': 'ext://flask.logging.wsgi_errors_stream',
        'formatter': 'default'
    }},
    'root': {
        'level': 'INFO',
        'handlers': ['wsgi']
    }
})

app = Flask(__name__, static_url_path='')
app.config['MQTT_BROKER_URL'] = '192.168.0.201'  
app.config['MQTT_BROKER_PORT'] = 1883 
app.config['MQTT_USERNAME'] = ''  
app.config['MQTT_PASSWORD'] = ''  
app.config['MQTT_KEEPALIVE'] = 5  
app.config['MQTT_TLS_ENABLED'] = False  
zone_door_status = "UNKNOWN"
mqtt = Mqtt(app)

if __name__ == "__main__":
    app.run()

@mqtt.on_connect()
def handle_connect(client, userdata, flags, rc):
    app.logger.info("mqtt connected")
    mqtt.subscribe("warpzone/door/status")
    app.logger.info("mqtt subscribed: warpzone/door/status")

@mqtt.on_message()
def handle_mqtt_message(client, userdata, message):
    global zone_door_status
    data = dict(
        topic=message.topic,
        payload=message.payload.decode()
    )
    app.logger.info("mqtt message")
    app.logger.info(data)
    zone_door_status = message.payload.decode()
    app.logger.info("zone_door_status = " + zone_door_status)

# CORS Header setzen     
@app.after_request 
def after_request(response):
    header = response.headers
    header['Access-Control-Allow-Origin'] = '*'
    return response

# Startseite
@app.route('/')
def view_index():
    global zone_door_status   
    return 'Warpzone API, current status = ' + zone_door_status + ', see: https://gitlab.warpzone.ms/infrastruktur/warpapi/blob/master/README.md'

# Statische Dateien 
@app.route('/files/<path:path>')
def send_file(path):
    return send_from_directory('files', path)

# Statusanzeige auf der Webseite 
@app.route('/static')
def view_static():
    global zone_door_status   
    spaceopen = False
    if zone_door_status == "OPEN":
      spaceopen = True
    return render_template('static.html', open = spaceopen)

# Statusanzeige auf der Webseite 
@app.route('/status')
def data_status():
    global zone_door_status   
    spaceopen = 0
    if zone_door_status == "OPEN":
      spaceopen = 1
    data = {
        "tuerOffen": spaceopen,
        "tempLounge": 250,
        "tempWerkstatt": 250,
        "timestamp": 0,
        "age": 500
    } 
    response = app.response_class(
        response=json.dumps(data),
        status=200,
        mimetype='application/json'
    )
    return response

# Endpunkt für Einbindung in cpu.ccc.de 
# Eigentlich die SpaceAPI, aber so können einfacher Abweichungen implementiert werden
@app.route('/cccapi')
def data_cccapi():
    return redirect('/spaceapi', code=302)

# Kompatibilität für alte urls 
@app.route('/spaceapi.php')
def data_spaceapiphp():
    return redirect('/spaceapi', code=302)

# Implementierung der SpaceAPI
@app.route('/spaceapi')
def data_spaceapi():
    global zone_door_status   
    spaceopen = False
    if zone_door_status == "OPEN":
      spaceopen = True
    data = {
        "api": "0.14",
        "space": "warpzone ", 
        "logo": "https://api.warpzone.ms/files/warpzone_logo.png",
        "url": "https://www.warpzone.ms",
        "location": {
            "address": "warpzone e.V., Am Hawerkamp 31 Maus G, 48155 Münster, Germany",
            "lat": 51.9436176,
            "lon": 7.6381682,
        },
        "contact": {
            "phone": "+49 251 39500271",
            "twitter": "@warpzone_ms",
            "mastodon": "@warpzone@social.bau-ha.us",
            "email": "verwaltung@warpzone.ms",
            "irc": "irc://hackint.org/#warpzone",
            "ml": "warpzone@warpzone.ms",
            "matrix": "#warpzone:matrix.warpzone.ms"
        },
        "issue_report_channels": [ 
            "email" 
        ],
        "feeds": {
            "blog": { 
                "type": "application/rss+xml",
                "url": "https://www.warpzone.ms/feed/",
            },
            "calendar": {
                "type": "application/calendar",
                "url": "https://www.google.com/calendar/ical/hc82sdjshuf1ru9f9eqcfq9bvs%40group.calendar.google.com/public/basic.ics",
            },
        },
        "state": {
            "open": spaceopen,
            "icon": {
                "open": "https://api.warpzone.ms/files/warpzone_open.png",
                "closed": "https://api.warpzone.ms/files/warpzone_closed.png",
            },
        },
    }
    
    response = app.response_class(
        response=json.dumps(data),
        status=200,
        mimetype='application/json'
    )
    return response