From 12c261b0b1e27a4db356aeaca5a019a947040b9d Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 26 Sep 2024 20:52:45 +0200 Subject: [PATCH] updates --- chat.py | 150 ++++++++++++++++++++++---------------------- pyserial.py | 10 +++ requirements.txt | 3 + restart.sh | 11 +--- run.py | 6 ++ run.sh | 7 --- templates/chat.html | 16 +---- 7 files changed, 96 insertions(+), 107 deletions(-) create mode 100644 pyserial.py create mode 100644 requirements.txt create mode 100755 run.py delete mode 100755 run.sh diff --git a/chat.py b/chat.py index 5e97891..17c3ceb 100644 --- a/chat.py +++ b/chat.py @@ -1,77 +1,73 @@ #!/bin/false # Don't run directly, use gunicorn -from flask import Flask, request, escape, render_template +from flask import Flask, request, render_template from flask_socketio import SocketIO, emit, send import subprocess import json from datetime import datetime from collections import defaultdict -import mpd from urllib.parse import urlencode import urllib.request import base64 import requests - -mpc = mpd.MPDClient() -mpc.timeout = 0.2 - +import socket app = Flask(__name__) # This is fine socketio = SocketIO(app, cors_allowed_origins='*') messages = [] -last_sent = defaultdict(lambda: datetime(1970,1,1)) timeout = 1 class Message: - def __init__(self, time, sender, sendertype, msg): + def __init__(self, time, sender, sendertype, msg, sid = None): self.time = time + self.sid = sid self.sender = sender self.sendertype = sendertype self.msg = msg +def send_message(message) -> tuple: -@app.route("/messages/") -def messages_get(): + if not message.msg: + return (False,"No message found") + + if len(message.msg) > 200: + return (False,"Message too long, maximum 200") + + messages.append(message) + + # Send message to MessageOS + msg_with_sendr: str = "<{}> {}".format(message.sender, message.msg) if message.sender != "somebody" else message.msg + msg_b64 = base64.b64encode(msg_with_sendr.encode()) + + url = "http://10.0.5.42:8000/" # Set destination URL here + post_fields = {"X-Messages": msg_b64} + assembly_request = urllib.request.Request(url, urlencode(post_fields).encode()) + assembly_request.add_header("X-Messages", msg_b64) + urllib.request.urlopen(assembly_request).read().decode() try: - mpc.connect("localhost", 6600) - song = mpc.currentsong() - status = mpc.status() - except: - status = {"state": "not connected"} - song = {} - try: - mpc.disconnect() + requests.put("http://10.0.0.10/api/mailbox.json", json={"topic": "morsemessage", "message": msg_with_sendr}) except: pass - return render_template("chat.html", messages=messages[::-1], mpd_song=song, mpd_status=status) + return (True,"OK") + +def reverse_lookup(ip): + rdns = socket.getnameinfo((ip, 0), 0) + if rdns: + ip = rdns[0] + return ip + + +@app.route("/messages/") +def messages_get(): + return render_template("chat.html", messages=messages[::-1]) @app.route("/reply/", methods = ["POST"]) def reply_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.decode() @@ -80,66 +76,70 @@ def reply_post(): if not message: return "No message found" - socketio.emit('replymessage', {'message': message}, broadcast=True) - return "Message sent\n" + if len(messages) > 0 and messages[-1].sid: + socketio.emit('replymessage', {'message': message},to=messages[-1].sid) + return "Message sent\n" + else: + return "Could not reply" return "Failed\n" +@socketio.on('message') +def message_socket(data): + if data.get("username"): + sender = data.get("username") + sendertype = "name" + elif "X-Real-IP" in request.headers: + sender = reverse_lookup(request.headers["X-Real-IP"]) + sendertype = "ip" + else: + sender = "somebody" + sendertype = "unknown" + + ok, return_message = send_message(Message(datetime.now(), sender, sendertype, data.get("message"), sid = request.sid)) + + return return_message + @app.route("/messages/", methods = ["POST"]) def messages_post(): if request.data: - if "X-Username" in request.headers: + if "X-Username" in request.headers and len(request.headers["X-Username"]) > 0: sender = request.headers["X-Username"] sendertype = "name" elif "X-Real-IP" in request.headers: - sender = request.headers["X-Real-IP"] + sender = reverse_lookup(request.headers["X-Real-IP"]) sendertype = "ip" else: - sender = "somebody" + sender = "-" 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.decode() - - if len(message) > 200: - return "Message too long, maximum 200" - if not message: return "No message found" - if "spam" in message.lower(): - messages.append(Message(time, "1.3.3.7", "ip", "Nee")) - return "OK" + headers = { + 'X-Username': sender, + } + data = { + 'message': message + } + try: + response = requests.post("http://10.0.0.171:8080/message", headers=headers, json=data) + response.raise_for_status() + except: + pass - # Save message to serve it in this application - messages.append(Message(time, sender, sendertype, message)) - - # Send message to MessageOS msg_with_sendr: str = "<{}> {}".format(sender, message) if sender != "somebody" else message - msg_b64 = base64.b64encode(msg_with_sendr.encode()) - - url = "http://10.0.5.42:8000/" # Set destination URL here - post_fields = {"X-Messages": msg_b64} - assembly_request = urllib.request.Request(url, urlencode(post_fields).encode()) - assembly_request.add_header("X-Messages", msg_b64) - urllib.request.urlopen(assembly_request).read().decode() try: requests.put("http://10.0.0.10/api/mailbox.json", json={"topic": "morsemessage", "message": msg_with_sendr}) except: pass - return "OK" + messages.append(Message(datetime.now(), sender, sendertype, message)) + return "" + else: + return "" # make sure only messages from the last hour are sent # this command also only sends messages the user doesn't have yet. @@ -153,4 +153,4 @@ def api(last_index): if __name__ == "__main__": - socketio.run(app) + socketio.run(app,port=3000,host='0.0.0.0') diff --git a/pyserial.py b/pyserial.py new file mode 100644 index 0000000..5db7556 --- /dev/null +++ b/pyserial.py @@ -0,0 +1,10 @@ +import serial +import requests +ser = serial.Serial('/dev/ttyUSB0') + +while True: + line = ser.readline() + out = requests.post("http://localhost:3000/reply",data=line.decode()[:-1]) + + +ser.close() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..253f144 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +flask +requests +flask_socketio diff --git a/restart.sh b/restart.sh index 644a66c..86defa6 100755 --- a/restart.sh +++ b/restart.sh @@ -2,13 +2,4 @@ killall gunicorn ./run.sh & disown -sleep 1 -DISPLAY=:0 xdotool key ctrl+F5 -sleep 5 -DISPLAY=:0 xdotool key ctrl+F5 -sleep 10 -DISPLAY=:0 xdotool key ctrl+F5 -sleep 10 -DISPLAY=:0 xdotool key ctrl+F5 -sleep 10 -DISPLAY=:0 xdotool key ctrl+F5 + diff --git a/run.py b/run.py new file mode 100755 index 0000000..7b84536 --- /dev/null +++ b/run.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 + +from chat import app +from chat import socketio + +socketio.run(app,port=3000,host='0.0.0.0',allow_unsafe_werkzeug=True) diff --git a/run.sh b/run.sh deleted file mode 100755 index 1ddeefa..0000000 --- a/run.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -cd "$(dirname "$0")" - -poetry install -export FLASK_APP=chat.py -exec poetry run gunicorn --worker-class eventlet -w 1 -b0.0.0.0:5000 chat:app diff --git a/templates/chat.html b/templates/chat.html index 10fab9f..617cef7 100644 --- a/templates/chat.html +++ b/templates/chat.html @@ -37,31 +37,17 @@ .msg .sender.name:before { content: "<"; } .msg .sender.name:after { content: ">"; } .msg .sender.ip:before { content: "["; } .msg .sender.ip:after { content: "]"; } - .mpd-status { margin-bottom: 0.2em; } - .mpd-status:before { content: " ▶ "; } Messages from the world to kelder - {% if mpd_status["state"] == "play" %} - {% if mpd_song["artist"] and mpd_song["title"] %} -
{{ mpd_song["artist"] }}{{ mpd_song["title"] }}
- {% elif mpd_song["title"] %} -
{{ mpd_song["title"] }}
- {% elif mpd_song["artist"] %} -
{{ mpd_song["artist"] }}
- {% else %} -
Unknown music, fix your metadata!
- {% endif %} - {% endif %}

Messages

{% for m in messages %}
- {{ m.sender }}: {{ m.msg }}