cammiechat/chat.py

111 lines
2.8 KiB
Python

#!/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()