#!/bin/false # Don't run directly, use gunicorn from flask import Flask, request, escape, render_template import subprocess import json from datetime import datetime from collections import defaultdict import mpd from urllib.parse import urlencode import urllib.request import base64 mpc = mpd.MPDClient() mpc.timeout = 0.2 app = Flask(__name__) messages = [] last_sent = defaultdict(lambda: datetime(1970,1,1)) timeout = 1 def speak(text): espk_proc = subprocess.Popen(("espeak", "-vnl"), stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) espk_proc.stdin.write(text) espk_proc.stdin.close() class Message: def __init__(self, time, sender, sendertype, msg): self.time = time self.sender = sender self.sendertype = sendertype self.msg = msg @app.route("/messages/") def messages_get(): try: mpc.connect("localhost", 6600) song = mpc.currentsong() status = mpc.status() except: status = {"state": "not connected"} song = {} try: mpc.disconnect() except: pass return render_template("chat.html", messages=messages[::-1], mpd_song=song, mpd_status=status) @app.route("/messages/", methods = ["POST"]) def messages_post(): if request.data: if "X-Username" in request.headers: sender = request.headers["X-Username"] sendertype = "name" elif "X-Real-IP" in request.headers: sender = request.headers["X-Real-IP"] sendertype = "ip" else: sender = "somebody" sendertype = "unknown" if sender[:6] == "abefor": sender = "abeforkelder" time = datetime.now() last_sent_from_ip = last_sent[sendertype + sender] last_sent[sendertype + sender] = time if (time-last_sent_from_ip).total_seconds() < timeout: return "OK Felix" message = request.data if len(message) > 200: return "Message too long, maximum 200" if not message: return "No message found" message_str = message.decode() if "spam" in message_str.lower(): messages.append(Message(time, "1.3.3.7", "ip", "Nee")) return "OK" if sender != "somebody": message_str = "<{}> {}".format(sender, message_str) messages.append(Message(time, sender, sendertype, message_str)) url = 'http://10.0.5.42:8000/' # Set destination URL here post_fields = {'X-Messages': base64.b64encode(message)} assembly_request = urllib.request.Request(url, urlencode(post_fields).encode()) assembly_request.add_header('X-Messages', base64.b64encode(message)) urllib.request.urlopen(assembly_request).read().decode() speak(message) return "OK" if __name__ == "__main__": app.run()