diff --git a/Config/README.md b/Config/README.md new file mode 100644 index 0000000..3c295ca --- /dev/null +++ b/Config/README.md @@ -0,0 +1 @@ +Config Dateien \ No newline at end of file diff --git a/Config/log/README.md b/Config/log/README.md new file mode 100644 index 0000000..ee971a2 --- /dev/null +++ b/Config/log/README.md @@ -0,0 +1 @@ +Log Dateien \ No newline at end of file diff --git a/Config/party.sql b/Config/party.sql new file mode 100644 index 0000000..6ec2a00 --- /dev/null +++ b/Config/party.sql @@ -0,0 +1,14 @@ +PRAGMA foreign_keys=ON; +CREATE TABLE user (userID INTEGER PRIMARY KEY,username TEXT, sessionID INTEGER NOT NULL, info TEXT); +CREATE TABLE seession (sessionID INTEGER PRIMARY KEY, sessionname TEXT, sessionstatus TEXT, seessiontyp TEXT, sessionstartzei TEXT); +CREATE TABLE chat (sessionID INTEGER, userID INTEGER, chatmessage TEXT, ZEIT TEXT); +CREATE TABLE game (sessionID INTEGER, userID INTEGER, Spielname TEXT, Spielaktivität TEXT, ZEIT TEXT); +CREATE TABLE pointgame (sessionID INTEGER, userID INTEGER, Spielname TEXT, Spielaktivität TEXT, Punkte INTEGER); +CREATE TABLE uploadgame (sessionID INTEGER, userID INTEGER, Spielname TEXT, Spielstand TEXT); +CREATE TABLE planer (eventid INTEGER PRIMARY KEY not NULL,eventname TEXT, eventzeit TEXT, sessionID INTEGER, eventstatus TEXT); +CREATE TABLE mate (matename TEXT, mateanzahl INTEGER, sessionID INTEGER); +CREATE TABLE mws (matekisten INTEGER, sessionID INTEGER NOT NULL); +CREATE TABLE spiel (spielname TEXT, Genre TEXT, Erscheinungsjahr TEXT, Gruppe TEXT, Teil INTEGER, sessionID INTEGER NOT NULL, Bildname TEXT); +CREATE TABLE dateien (dateiID INTEGER PRIMARY KEY NOT NULL, dateiname TEXT, sessionID INTEGER); +CREATE TABLE musikMetaDaten (songID INTEGER PRIMARY KEY Not NULL, artist TEXT, band TEXT, album TEXT, title TEXT, track TEXT, genre TEXT, composer TEXT, copyright TEXT, comment TEXT, releasedate TEXT, mp3_url TEXT, sessionID INTEGER, bildname TEXT); +CREATE TABLE queue (songID INTEGER, sessionID INTEGER) \ No newline at end of file diff --git a/Export/README.md b/Export/README.md new file mode 100644 index 0000000..55a96d8 --- /dev/null +++ b/Export/README.md @@ -0,0 +1 @@ +Hier können Exportierte Sessions gefunden werden \ No newline at end of file diff --git a/README.md b/README.md index f840255..978e521 100644 --- a/README.md +++ b/README.md @@ -10,5 +10,11 @@ Dies ist eine Software für Lan Partys ## Server starten + Clonen `git clone https://github.com/fingadumbledore/Party` + +### Nativ: + Wechseln`cd Party` + starten`./run.sh` + +### Mit Nix ++ `nix-shell` ++ `bash run.sh` diff --git a/ip.txt b/ip.txt new file mode 100644 index 0000000..7b9ad53 --- /dev/null +++ b/ip.txt @@ -0,0 +1 @@ +127.0.0.1 diff --git a/main.py b/main.py index 6ec1f6b..c0205d2 100644 --- a/main.py +++ b/main.py @@ -1,436 +1,30 @@ -from flask import Flask, render_template, jsonify, request, session, redirect -from picker import picker as pick -import sqlite3 -import os -import time -import qrcode -import shutil +import argparse +import ArgumentParser +from server import server -starttime = 0 -user_count = 0 -userid = 0 -app = Flask(__name__, template_folder='templates/') -date = time.strftime("%d-%m-%Y %H:%M:%S", time.localtime(time.time())) -zeit = time.strftime("%H%M", time.localtime(time.time())) -log = date -app.config['SECRET_KEY'] = 'party' +def main(): + parser = argparse.ArgumentParser( + prog = 'Party Controller', + description = 'Manage Lan parties', + epilog = 'thanks for using') + parser.add_argument('-s', '--start', action='store_true', help="startet Server") + parser.add_argument('-l', '--load', action='store_true', help="lädt alte Session") + parser.add_argument('-o', '--output', action='store_true', help="setzt output Pfad") -def dbcon(sql): - con = sqlite3.connect("party.db") - warning_log("verbindung mit db wurde aufgenommen") - cur = con.cursor() - cur.execute(sql) - con.commit() - return sql.fetchall() + args = parser.parse_args() + if args.start: + server() -def dbcon1(sql): - con = sqlite3.connect("party.db") - cur = con.cursor() - return cur.execute(sql) + elif args.load: + server() - -def uptime(): - time = int(zeit) - uptime = time - starttime - return uptime - - -# log system -def log_server(log): - log = date + log - datei = open('server.log', 'a') - datei.write('\n' + " " + log) - log = date - datei.close() - - -def error_log(error): - error = date + " [ERROR]" + error - datei = open('server.log', 'a') - datei.write('\n' + " " + error) - log = date - datei.close() - - -def problem_log(problem): - problem = date + " [PROBLEM]" + problem - datei = open('server.log', 'a') - datei.write('\n' + " " + problem) - log = date - datei.close() - - -def warning_log(warning): - warning = date + " [WARNING]" + warning - datei = open('server.log', 'a') - datei.write('\n' + " " + warning) - log = date - datei.close() - - -# Qr-code generator# -def create_qr(id): - if not os.path.exists("./static/img/qr.png"): - img = qrcode.make(f'127.0.0.1:5000/session/{id}') - type(img) - img.save("./static/img/qr.png") - else: - warning_log("QR-Code ist bereits vorhanden") - - -# Hauptseite -@app.route("/") -def index(): - log_server("called /") - return render_template("index.html") - - -# Neue Nachrichten -@app.route("/get_chat", methods=['POST']) -def get_chat(): - if session: - log_server("called /get_chat") - log_server("called /get_chat with POST") - userID = request.form['userid'] - sessionID = request.form['sessionid'] - message = request.form['message'] - zeit = date - l = f"INSERT INTO seession (sessionname, sesionstatus, seessiontyp) VALUES( \'{sessionID}\', \'{userID}\',\'{message}\', \'{zeit}\');" - log_server("neue Nachricht") - try: - dbcon(l) - log_server("message entered successfully") - - except e: - error_log("unable to get new Messages") - account = cur.fetchone() - return render_template("chat.html") - else: - warning_log(" called /get_chat without being logged in") - return "{ \"message\": \"you need to login\"'}" - - -@app.route("/get_game_file", methods=['POST']) -def get_game_file(): - log_server("called /get_game_file") - pick() - - -@app.route("/get_new_message") -def get_new_message(): - if session: - log_server("called /get_new_message") - return render_template("chat.html") - else: - warning_log(" called /get_new_message without being logged in") - return render_template('passwd.html') - - -@app.route("/message") -def message(): - if session: - log_server("called /message") - return render_template("message.html") - else: - warning_log(" called /message without being logged in") - return render_template('passwd.html') - - -# planer -@app.route("/get_planer", methods=['POST']) -def get_planer(): - if session: - log_server("called /get_planer") - log_server("called /get_planer with POST") - event = request.form['event'] - sessionID = request.form['sessionID'] - zeit = request.form['zeit'] - pfad = "/session/" + sessionID - l = f"INSERT INTO planer VALUES( \'{event}\', \'{zeit}\', \'{sessionID}\');" - log_server("neues Event") - try: - con = sqlite3.connect("party.db") - warning_log("verbindung mit db wurde aufgenommen") - cur = con.cursor() - cur.execute(l) - con.commit() - con.close() - log_server("event entered successfully /get_planer") - except e: - error_log("unable to insert event") - return redirect(f'/session/{sessionID}') + elif args.output: + print("schön für dich") else: - warning_log(" called /get_planer without being logged in") - return render_template('404.html') + parser.print_help() - -@app.route("/session/") -def session(id): - if session: - log_server(f"called /session/{id}") - con = sqlite3.connect("party.db") - cur = con.cursor() - l = f"SELECT eventname, eventzeit FROM planer WHERE sessionID = \'{id}\' ORDER BY eventzeit;" - asd = cur.execute(l).fetchall() - con.commit() - cur.close() - - con = sqlite3.connect("party.db") - warning_log("Verbindung mit Datenbank wurde aufgenommen /seession") - cur = con.cursor() - creator = cur.execute("SELECT username FROM user WHERE info = 'creator'").fetchall() - cur.close() - - con = sqlite3.connect("party.db") - warning_log("Verbindung mit Datenbank wurde aufgenommen /seession") - cur = con.cursor() - mate = cur.execute("SELECT matename, mateanzahl FROM mate WHERE sessionID = \'{id}\';").fetchall() - cur.close() - - con = sqlite3.connect("party.db") - cur = con.cursor() - l = f"SELECT userID, Spielname, Spielaktivität, ZEIT FROM game WHERE sessionID = \'{id}\' ORDER BY ZEIT;" - game = cur.execute(l).fetchall() - con.commit() - cur.close() - - return render_template("session.html", asd=asd, game=game, - das=user_count, er=creator, mate=mate, - der=uptime()) - else: - warning_log(" called /session without being logged in") - return render_template('passwd.html') - - -def mate_logik(sorte, anzahl): - anzahl = anzahl + 1 - koffeingehalt = 0 - match sorte: - case "Mio Mio": - koffeingehalt = - - -@app.route("/mate", methods=['POST']) -def mate(): - log_server("called /mate") - - if session: - mateFlaschen = request.form['mateFlaschen'] - sessionId = request.form['sessionID'] - mateSorte = request.form['mateSorte'] - mateSql = f"INSERT INTO mate VALUES (\"{mateSorte}\", \'{mateFlaschen}\', \'{sessionId}\');" - try: - con = sqlite3.connect("party.db") - warning_log("Verbindung mit Datenbank wurde aufgenommen /mate") - cur = con.cursor() - cur.execute(mateSql) - con.commit() - con.close() - - mate_logik(mateSorte, mateFlaschen) - log_server("mate wurde in Datenbank eingefügt") - except sqlite3.Error as e: - error_log(f"error while executing sql: {e}") - return redirect(f'/session/{sessionId}') - else: - warning_log(" called /mate without being logged in") - return render_template('/passwd') - -@app.route("/logout") -def logout(): - log_server("called /logout") - user_count = -1 - return render_template("logout.html") - -@app.route("/signin") -def signin(): - log_server("called /signin") - return render_template("signin.html") - -@app.route("/password") -def password(): - log_server("called /password") - return render_template("passwort_ver.html") - -@app.route("/create_session") -def create_session(): - log_server("called /create_session") - return render_template("createSession.html") - -@app.route("/get_creat_session", methods=['POST']) -def get_creat_session(): - log_server("called /get_creat_session with POST") - sessionname = request.form['sessionname'] - sessionID = request.form['sessionid'] - l = f"INSERT INTO seession (sessionname, sessionstatus, seessiontyp) VALUES( \'{sessionname}\', 'online','public');" - log_server("neue Session") - try: - con = sqlite3.connect("party.db") - warning_log("verbindung mit db wurde aufgenommen") - cur = con.cursor() - cur.execute(l) - con.commit() - con.close() - - try: - con = sqlite3.connect("party.db") - warning_log("verbindung mit db wurde aufgenommen") - cur = con.cursor() - username = "Host" - usertype = "admin" - userId = 1 - l = f"INSERT INTO user (username, sessionID, info) VALUES (\'{username}\', {sessionID}, \'{usertype}\');" - cur.execute(l) - con.commit() - con.close() - except: - warning_log("user admin konnte nicht angelegt werden") - - user_count = +1 - starttime = int(zeit) - create_qr(sessionID) - return redirect(f'/session/{sessionID}') - log_server("session successfully started") - except: - error_log("unable to create Session") - return "{ \"message\": \"Login failed\"'}" - - -@app.route("/login") -def login(): - log_server("called /login") - return render_template("login.html") - -@app.route("/stopuhr", methods=['POST']) -def stopuhr(): - if session: - log_server("called /stopuhr") - spielName = request.form['spielname'] - zeit = request.form['zeit'] - userId = request.form['userid'] - sessionId = request.form['sessionid'] - l = f"INSERT INTO game VALUES( \'{sessionID}\', \'{userId}\',\'{spielName}\', \'{zeit}\');" - try: - warning_log("verbindung mit Datenbank wurde aufgenommen") - dbcon(l) - log_server("time entered successfully /stopuhr") - except: - error_log("unable to run sql /stopuhr") - return render_template() - else: - warning_log(" called /stopuhr without being logged in") - return render_template('passwd.html') - -@app.route("/get_event", methods=['POST']) -def get_event(): - if session: - log_server("called /get_event") - event = request.form['event'] - zeit = request.form['zeit'] - sessionId = request.form['sessionid'] - l = f"INSERT INTO game VALUES( \'{event}\', \'{zeit}\', \'{sessionId}\');" - try: - con = sqlite3.connect("party.db") - warning_log("verbindung mit db wurde aufgenommen") - cur = con.cursor() - cur.execute(l) - con.commit() - con.close() - log_server("event entered successfully /get_event") - except: - error_log("unable to run sql /get_event") - return render_template("login.html") - else: - warning_log(" called /get_event without being logged in") - return render_template('passwd.html') - -@app.route("/controll") -def controll(): - if session: - log_server("called /controll") - return render_template("controll.html") - else: - warning_log(" called /controll without being logged in") - return render_template('passwd.html') - -@app.route("/game") -def game(): - if session: - log_server("called /game") - return render_template("game.html") - else: - warning_log(" called /game without being logged in") - - return render_template('passwd.html') - - -@app.route("/rgb") -def rgb(): - if session: - log_server("called /rgb") - return render_template("404.html") - else: - warning_log(" called /rgb without being logged in") - return render_template('passwd.html') - -@app.route("/get_login", methods=['POST']) -def get_login(): - log_server("called /get_login with POST") - username = request.form['username'] - sessionId = request.form['sessionID'] - userid = request.form['userID'] - l = f"select * from user where userID = \'{userid}\' and username=\'{username}\' and sessionID=\'{sessionId}\';" - account = dbcon(l) - if account: - session['loggedin'] = True - user_count = +1 - # session['username'] = account['username'] - log_server("loggedin successfully") - return redirect(f'/session/{sessionId}') - else: - return "{ \"message\": \"Login failed\"'}" - warning_log("unable to create new user /get_login") - con.close() - -@app.route("/new", methods=['POST']) -def new(): - log_server("called /new with POST") - username = request.form['username'] - sessionId = request.form['sessionID'] - userId = request.form['sessionID'] - info = "normal" - l = f"INSERT INTO user(username, sessionID, info) VALUES (\'{username}\',\'{sessionId}\',\'{info}\');" - con = sqlite3.connect("party.db") - warning_log("verbindung mit db wurde aufgenommen") - cur = con.cursor() - cur.execute(l) - con.commit() - con.close() - account = True - if account: - session['loggedin'] = True - user_count = +1 - # session['username'] = account['username'] - log_server("created new user successfully") - return redirect(f'/session/{sessionId}') - else: - return "{ \"message\": \"Login failed\"'}" - warning_log("unable to create new user /new") - con.close() - -@app.errorhandler(404) -def page_not_found(e): - error_log("called non-existing page") - # note that we set the 404 status explicitly - return render_template('404.html'), 404 - -def create_app(config_filename): - app.register_error_handler(404, page_not_found) - log_server("created app") - return app - -# Use this line to run it localy -#app.run(host="", port=80) +if __name__ == "__main__": + exit(main()) \ No newline at end of file diff --git a/party.sql b/party.sql deleted file mode 100644 index 1775527..0000000 --- a/party.sql +++ /dev/null @@ -1,8 +0,0 @@ -PRAGMA foreign_keys=ON; -CREATE TABLE user (userID INTEGER PRIMARY KEY,username TEXT, sessionID INTEGER NOT NULL, info TEXT); -CREATE TABLE seession (sessionID INTEGER PRIMARY KEY, sessionname TEXT, sessionstatus TEXT, seessiontyp TEXT); -CREATE TABLE chat (sessionID INTEGER, userID INTEGER, chatmessage TEXT, ZEIT TEXT); -CREATE TABLE game (sessionID INTEGER, userID INTEGER, Spielname TEXT, Spielaktivität TEXT, ZEIT TEXT); -CREATE TABLE uploadgame (sessionID INTEGER, userID INTEGER, Spielname TEXT, Spielstand TEXT); -CREATE TABLE planer (eventname TEXT, eventzeit TEXT, sessionID INTEGER); -CREATE TABLE mate (matename TEXT, mateanzahl INTEGER, sessionID INTEGER); \ No newline at end of file diff --git a/picker.py b/picker.py index cc27149..0d6eb83 100644 --- a/picker.py +++ b/picker.py @@ -1,4 +1,70 @@ import shutil, os +import matplotlib.pyplot as plt +import sqlite3 -def picker(): - datei = open('server.log', 'a') \ No newline at end of file + +def dbcon(sqlstring): + print ("test") + try: + con = sqlite3.connect("party.db") + cur = con.cursor() + cur.execute(sqlstring) + except: + return "error" + +def tmbr(): + print("tomb raider datei") + f = "sql" + dbcon(f) + +def nfsu2(): + print("nfsu2 datei") + e = "sql" + dbcon(e) + +def anno1602(): + print("Anno 1602 datei") + a = "sql" + dbcon(a) + +def picker(gamefile, sessionID, SpielerID): + datei = open(gamefile, 'a') + + if check == "nfsu2": + nfsu2() + if check == "anno16": + anno1602() + if check == tmbr: + tmbr() + + if not os.path.exists(sessionID): + os.makedirs(sessionID) + shutil.move(gamefile, sessionID) + + +def createChart(sessionID,Spielname): + con = sqlite3.connect("party.db") + cur = con.cursor() + dateiname = sessionID + Spielname + ".png" + try: + l = f"SELECT 'username' FROM user INNER JOIN game ON game.userID = user.userID;" + user = [i[0] for i in cur.execute(l).fetchall()] + except: + print("Fehler beim Ausführen von:" + l) + try: + l = f"SELECT ZEIT FROM game WHERE sessionID = \'{sessionID}\' AND Spielname = \'{Spielname}\';" + zeit = [i[0] for i in cur.execute(l).fetchall()] + except: + print("Fehler beim Ausführen von:" + l) + + colors = ['green','blue','purple','brown','teal', 'yellow', 'black', 'orange'] + plt.bar(user, zeit, color=colors) + plt.title(Spielname, fontsize=14) + plt.xlabel('User', fontsize=14) + plt.ylabel('Zeit in Sekunden', fontsize=14) + plt.grid(False) + plt.savefig(dateiname) + + +if __name__ == "__main__": + print("Use main.py to use program") \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a0a77b4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +matplotlib +random +time +numpy diff --git a/run.sh b/run.sh index 9cb0e8e..d487422 100755 --- a/run.sh +++ b/run.sh @@ -1,16 +1,10 @@ #!/bin/sh - -python -c "import qrcode" if [ $? -eq 1 ]; then pip install qrcode fi -md5sum -c .sums -if [ $? -eq 1 ]; then - rm party.db - cat party.sql | sqlite3 party.db -fi +cat ./Config/party.sql | sqlite3 party.db export FLASK_APP=main.py -flask run +sudo python3 main.py diff --git a/server.py b/server.py new file mode 100644 index 0000000..263dc45 --- /dev/null +++ b/server.py @@ -0,0 +1,679 @@ +from flask import Flask, render_template, jsonify, request, session, redirect +from picker import picker as pick +from picker import createChart +import sqlite3 +import os +import time +import qrcode +import shutil +import re +import numpy + +def server(): + starttime = 0 + app = Flask(__name__, template_folder='templates/') + date = time.strftime("%d-%m-%Y %H:%M:%S", time.localtime(time.time())) + zeit = time.strftime("%H%M", time.localtime(time.time())) + app.config['SECRET_KEY'] = 'party' + matekiste = 0 + + + def dbcon(sql): + con = sqlite3.connect("party.db") + warning_log("verbindung mit db wurde aufgenommen") + cur = con.cursor() + cur.execute(sql) + con.commit() + return sql.fetchall() + + def ipfin(): + datei = open('ip.txt', 'r') + print (datei.read()) + return datei.read() + + def dbcon1(sql): + con = sqlite3.connect("party.db") + cur = con.cursor() + return cur.execute(sql) + + + def uptime(): + time = int(zeit) + uptime = time - starttime + return uptime + + + # log system + def log_server(log): + log = date + " " + log + datei = open('server.log', 'a') + datei.write('\n' + " " + log) + log = date + datei.close() + + + def error_log(error): + error = date + " [ERROR] " + error + datei = open('server.log', 'a') + datei.write('\n' + " " + error) + log = date + datei.close() + + + def problem_log(problem): + problem = date + " [PROBLEM] " + problem + datei = open('server.log', 'a') + datei.write('\n' + " " + problem) + log = date + datei.close() + + + def warning_log(warning): + warning = date + " [WARNING]" + warning + datei = open('server.log', 'a') + datei.write('\n' + " " + warning) + log = date + datei.close() + + + # Materechner Logic + def mate_logik(sorte, anzahl): + if sorte == "Club Mate": + koffeingehalt = 100 + + if sorte == "Mio Mate": + koffeingehalt = 100 + + if sorte == "Flora Mate": + koffeingehalt = 90 + + if sorte == "Mate Mate": + koffeingehalt = 150 + + if sorte == "Buenos Mate": + koffeingehalt = 100 + + if sorte == "1337 Mate": + koffeingehalt = 145 + + if sorte == "Charitea Mate": + koffeingehalt = 15 + + if sorte == "Bionade Mate": + koffeingehalt = 20 + + + ''' + anzahl = anzahl + 1 + koffeingehalt = 0 + match sorte: + case "Mio Mio": + koffeingehalt = ''' + + + # mws = mate wirtschafts system + def mws(kisten): + log_server("mws wurde angefragt") + return mate + + + def sessionBeenden(sessionID): + con = sqlite3.connect("party.db") + warning_log("verbindung mit db wurde aufgenommen") + cur = con.cursor() + os.makedirs(sessionID) + + + # Qr-code generator# + def create_qr(id): + if not os.path.exists("./static/img/qr.png"): + qip = ipfin() + img = qrcode.make(f'{qip}:80/session/{id}') + type(img) + img.save("./static/img/qr.png") + else: + warning_log("QR-Code ist bereits vorhanden") + + + # Hauptseite + @app.route("/") + def index(): + log_server("called /") + return render_template("index.html") + + + # Neue Nachrichten + @app.route("/get_chat", methods=['POST']) + def get_chat(): + + log_server("called /get_chat") + log_server("called /get_chat with POST") + userID = request.form['userid'] + sessionID = request.form['sessionid'] + message = request.form['message'] + zeit = date + l = f"INSERT INTO seession (sessionname, sesionstatus, seessiontyp) VALUES( \'{sessionID}\', \'{userID}\',\'{message}\', \'{zeit}\');" + log_server("neue Nachricht") + try: + dbcon(l) + log_server("message entered successfully") + except Exception: + error_log("unable to get new Messages") + # account = cursor.fetchone() + return render_template("chat.html") + + @app.route("/get_game_file", methods=['POST']) + def get_game_file(): + log_server("called /get_game_file") + pick() + + @app.route("/get_new_message") + def get_new_message(): + + log_server("called /get_new_message") + return render_template("chat.html") + + @app.route("/message") + def message(): + + log_server("called /message") + return render_template("message.html") + + # planer + @app.route("/get_planer", methods=['POST']) + def get_planer(): + log_server("called /get_planer") + log_server("called /get_planer with POST") + event = request.form['event'] + sessionID = request.form['sessionID'] + zeit = request.form['zeit'] + pfad = "/session/" + sessionID + status = "running" + l = f"INSERT INTO planer VALUES( \'{event}\', \'{zeit}\', \'{sessionID}\',\'{status}\');" + log_server("neues Event") + try: + con = sqlite3.connect("party.db") + warning_log("verbindung mit db wurde aufgenommen") + cur = con.cursor() + cur.execute(l) + con.commit() + con.close() + log_server("event entered successfully /get_planer") + except Exception: + error_log("unable to insert event") + return redirect(f'/session/{sessionID}') + + + @app.route("/session/") + def _session(id): + #print(os.cpu_count()) + #createChart("41", "NFSU2") + log_server(f"called /session/{id}") + con = sqlite3.connect("party.db") + cur = con.cursor() + l = f"SELECT eventname FROM planer WHERE sessionID = \'{id}\' ORDER BY eventzeit;" + eventname = [i[0] for i in cur.execute(l).fetchall()] + con.commit() + + l = f"SELECT eventzeit FROM planer WHERE sessionID = \'{id}\' ORDER BY eventzeit;" + eventzeit = [i[0] for i in cur.execute(l).fetchall()] + #eventtime = re.split(',', eventzeit) + con.commit() + + creator = [i[0] for i in cur.execute("SELECT username FROM user WHERE info = 'Host'").fetchall()] + con.commit() + + l = f"SELECT count(username) FROM user WHERE sessionID = \'{id}\';" + useranzahl = cur.execute(l).fetchall() + + l = f"SELECT matename, mateanzahl FROM mate WHERE sessionID = \'{id}\' ORDER BY mateanzahl;" + mate = cur.execute(l).fetchall() + con.commit() + + l = f"SELECT Spielname FROM game WHERE sessionID = \'{id}\' ORDER BY ZEIT;" + game = [i[0] for i in cur.execute(l).fetchall()] + con.commit() + + l = f"SELECT userID FROM game WHERE sessionID = \'{id}\' ORDER BY ZEIT;" + user = [i[0] for i in cur.execute(l).fetchall()] + con.commit() + + l = f"SELECT Spielaktivität FROM game WHERE sessionID = \'{id}\' ORDER BY ZEIT;" + aktivitaet = [i[0] for i in cur.execute(l).fetchall()] + con.commit() + + l = f"SELECT username FROM user WHERE sessionID = \'{id}\';" + unames = [i[0] for i in cur.execute(l).fetchall()] + con.commit() + + l = f"SELECT userID FROM user WHERE sessionID = \'{id}\';" + uids = [i[0] for i in cur.execute(l).fetchall()] + con.commit() + + l = f"SELECT ZEIT FROM game WHERE sessionID = \'{id}\' ORDER BY ZEIT;" + zeit = [i[0] for i in cur.execute(l).fetchall()] + con.commit() + + + l = f"SELECT Punkte FROM pointgame WHERE sessionID = \'{id}\' ORDER BY Punkte;" + p_punkte = [i[0] for i in cur.execute(l).fetchall()] + con.commit() + + l = f"SELECT Spielname FROM pointgame WHERE sessionID = \'{id}\' ORDER BY Punkte;" + p_game = [i[0] for i in cur.execute(l).fetchall()] + con.commit() + + l = f"SELECT Spielaktivität FROM pointgame WHERE sessionID = \'{id}\' ORDER BY Punkte;" + p_aktivitaet = [i[0] for i in cur.execute(l).fetchall()] + con.commit() + + l = f"SELECT userID FROM pointgame WHERE sessionID = \'{id}\'ORDER BY Punkte;" + p_user = [i[0] for i in cur.execute(l).fetchall()] + con.commit() + cur.close() + + + class eventData: + def __init__(self, evn, evz): + self.eventname = evn + self.eventzeit = evz + + class userData: + def __init__(self, us, usid): + self.unames = us + self.uids = usid + + class gameData: + def __init__(self, ga, akt, usr, ze): + self.game = ga + self.aktivitaet = akt + self.user = usr + self.zeit = ze + + class pointgameData: + def __init__(self, ga, akt, usr, pu): + self.p_game = ga + self.p_aktivitaet = akt + self.p_user = usr + self.p_punkte = pu + + gameda = gameData(game, aktivitaet, user, zeit) + pointgameda = pointgameData(p_game, p_aktivitaet, p_user, p_punkte) + eventdata = eventData(eventname, eventzeit) + userdat = eventData(unames, uids) + + return render_template("session.html", + zeit=zeit, + aktivitaet=aktivitaet, + user=user, + eventdata=eventdata, + gameda=gameda, + pointgameda=pointgameda, + userdat=userdat, + game=game, + useranzahl=useranzahl, + creator=creator, + mate=mate, + uids=uids, + unames=unames, + der=uptime()) + + + @app.route("/mate", methods=['POST']) + def mate(): + log_server("called /mate") + + + mateFlaschen = request.form['mateFlaschen'] + sessionId = request.form['sessionID'] + mateSorte = request.form['mateSorte'] + + if mateSorte == "Club Mate" and mateFlaschen == 20: + matekiste + 1 + mws(matekiste) + if mateSorte == "Mio Mio" and mateFlaschen == 12: + matekiste + 1 + mws(matekiste) + if mateSorte == "Flora Mate" and mateFlaschen == 20: + matekiste + 1 + mws(matekiste) + if mateSorte == "Mate Mate" and mateFlaschen == 20: + martekiste + 1 + mws(martekiste) + if mateSorte == "Buenos Mate" and mateFlaschen == 20: + matekiste + 1 + mws(matekiste) + if mateSorte == "Charitea Mate" and mateFlaschen == 12: + matekiste + 1 + mws(matekiste) + if mateSorte == "1337 Mate" and mateFlaschen == 20: + matekiste + 1 + mws(matekiste) + if mateSorte == "Bionade Mate" and mateFlaschen == 20: + martekiste + 1 + mws(martekiste) + + mateSql = f"INSERT INTO mate VALUES (\"{mateSorte}\", \'{mateFlaschen}\', \'{sessionId}\');" + try: + con = sqlite3.connect("party.db") + warning_log("Verbindung mit Datenbank wurde aufgenommen /mate") + cur = con.cursor() + cur.execute(mateSql) + con.commit() + con.close() + + mate_logik(mateSorte, mateFlaschen) + log_server("mate wurde in Datenbank eingefügt") + except sqlite3.Error as e: + error_log(f"error while executing sql: {e}") + return redirect(f'/session/{sessionId}') + + + @app.route("/drink", methods=['POST']) + def drink(): + log_server("called /drink") + + con = sqlite3.connect("party.db") + warning_log("Verbindung mit Datenbank wurde aufgenommen /drink") + cur = con.cursor() + mateFlaschen = request.form['mateFlaschen'] + sessionId = request.form['sessionID'] + mateSorte = request.form['mateSorte'] + + l3 = f"SELECT mateanzahl FROM mate WHERE sessionID = \'{sessionId}\' AND matename = \'{mateSorte}\';" + manzahl = [i[0] for i in cur.execute(l3).fetchall()] + f = [mateFlaschen] + substracted = list() + for intem1, item2 in zip(manzahl, f): + substracted.append(intem1 - item2) + + k = substracted + + + mateSql = f"UPDATE mate SET mateanzahl = \'{k}\' WHERE sessionID = \'{sessionId}\' AND matename = \'{mateSorte}\');" + try: + con = sqlite3.connect("party.db") + warning_log("Verbindung mit Datenbank wurde aufgenommen /drink") + cur = con.cursor() + cur.execute(mateSql) + con.commit() + con.close() + + mate_logik(mateSorte, mateFlaschen) + log_server("mate wurde in Datenbank eingefügt") + except sqlite3.Error as e: + error_log(f"error while executing sql: {e}") + return redirect(f'/session/{sessionId}') + + + + @app.route("/logout") + def logout(): + log_server("called /logout") + user_count = -1 + return render_template("logout.html") + + @app.route("/spiel") + def spiel(): + log_server("called /spiel") + user_count = -1 + spiel = "Tomb raider" + return render_template("spiel.html", spiel=spiel,) + + @app.route("/get_spiel") + def get_spiel(): + log_server("called /get_spiel") + return render_template("spielt.html") + + + + @app.route("/signin") + def signin(): + log_server("called /signin") + return render_template("signin.html") + + + @app.route("/password") + def password(): + log_server("called /password") + return render_template("passwort_ver.html") + + + @app.route("/passwd") + def passwd(): + log_server("called /passwd") + return render_template("passwd.html") + + + @app.route("/change") + def change(): + log_server("called /change") + return render_template("changeSession.html") + + + @app.route("/create_session") + def create_session(): + log_server("called /create_session") + return render_template("createSession.html") + + + @app.route("/get_creat_session", methods=['POST']) + def get_creat_session(): + log_server("called /get_creat_session with POST") + Gsessionname = request.form['sessionname'] + GsessionID = request.form['sessionid'] + Gusername = "Host" + Gusertype = "admin" + GuserId = 1 + Gstatus = "online" + l1 = f'INSERT INTO seession VALUES({GsessionID}, \'{Gsessionname}\', \'online\', \'public\');' + print(l1) + log_server("neue Session") + + con = sqlite3.connect("party.db") + warning_log("verbindung mit db wurde aufgenommen") + cur = con.cursor() + log_server("a") + cur.execute(l1) + + log_server("f") + user_count = +1 + starttime = int(zeit) + create_qr(GsessionID) + try: + con = sqlite3.connect("party.db") + warning_log("verbindung mit db wurde aufgenommen") + cur = con.cursor() + username = "Host" + usertype = "admin" + userId = 1 + l = f'INSERT INTO user (username, sessionID, info) VALUES (\'{username}\', {GsessionID}, \'{usertype}\');' + cur.execute(l) + con.commit() + con.close() + except e: + warning_log("user admin konnte nicht angelegt werden") + return redirect(f'/session/{GsessionID}') + log_server("session successfully started") + + @app.route("/charts") + def charts(): + log_server("called /charts") + csessionID = request.form['sessionID'] + con = sqlite3.connect("party.db") + warning_log("verbindung mit db wurde aufgenommen") + cur = con.cursor() + k = f"SELCT COUNT(DISTINCT 'Spielname') FROM game WHERE sessionID = \'{csessionID}\';" + cur.execute(k) + + return redirect(f'/session/{csessionID}') + + @app.route("/login") + def login(): + log_server("called /login") + return render_template("login.html") + + + @app.route("/stopuhr", methods=['POST']) + def stopuhr(): + + log_server("called /stopuhr") + spielName = request.form['spiel'] + art = request.form['art'] + zeit = request.form['zeit'] + userId = request.form['userid'] + sessionId = request.form['sessionID'] + l = f"INSERT INTO game VALUES( \'{sessionId}\', \'{userId}\',\'{spielName}\',\'{art}\', \'{zeit}\');" + try: + warning_log("verbindung mit Datenbank wurde aufgenommen") + dbcon(l) + log_server("time entered successfully /stopuhr") + except Exception: + error_log("unable to run sql /stopuhr") + return redirect(f'/session/{sessionId}') + + + @app.route("/pointGame", methods=['POST']) + def pointgame(): + userId = request.form['userid'] + sessionId = request.form['sessionID'] + l = f"INSERT INTO pointgame VALUES( \'{sessionId}\', \'{userId}\',\'{spielName}\',\'{art}\', \'{punkte}\');" + try: + warning_log("verbindung mit Datenbank wurde aufgenommen") + dbcon(l) + log_server("time entered successfully /pointGame") + except Exception: + error_log("unable to run sql /pointGame") + return redirect(f'/session/{sessionId}') + + + + @app.route("/get_event", methods=['POST']) + def get_event(): + + log_server("called /get_event") + event = request.form['event'] + zeit = request.form['zeit'] + sessionId = request.form['sessionid'] + l = f"INSERT INTO game VALUES( \'{event}\', \'{zeit}\', \'{sessionId}\');" + try: + con = sqlite3.connect("party.db") + warning_log("verbindung mit db wurde aufgenommen") + cur = con.cursor() + cur.execute(l) + con.commit() + con.close() + log_server("event entered successfully /get_event") + except e: + error_log("unable to run sql /get_event") + return render_template("login.html") + + + + @app.route("/controll") + def controll(): + + log_server("called /controll") + return render_template("controll.html") + + @app.route("/statistik", methods=['POST']) + def statistik(): + sessionId = request.form['id'] + game = request.form['game'] + createChart(sessionId, game) + log_server("called /statistik") + return render_template("controll.html") + + + @app.route("/game") + def game(): + + log_server("called /game") + return render_template("game.html") + + + + @app.route("/rgb") + def rgb(): + + log_server("called /rgb") + return render_template("404.html") + + + @app.route("/get_login", methods=['POST']) + def get_login(): + log_server("called /get_login with POST") + username = request.form['username'] + sessionId = request.form['sessionID'] + userid = request.form['userID'] + l = f"select * from user where userID = \'{userid}\' and username=\'{username}\' and sessionID=\'{sessionId}\';" + con = sqlite3.connect("party.db") + warning_log("verbindung mit db wurde aufgenommen") + cur = con.cursor() + cur.execute(l) + con.commit() + con.close() + # session['username'] = account['username'] + log_server("loggedin successfully") + return redirect(f'/session/{sessionId}') + + con.close() + + + @app.route("/new", methods=['POST']) + def new(): + log_server("called /new with POST") + username = request.form['username'] + sessionId = request.form['sessionID'] + userId = request.form['sessionID'] + info = "normal" + l = f"INSERT INTO user(username, sessionID, info) VALUES (\'{username}\',\'{sessionId}\',\'{info}\');" + con = sqlite3.connect("party.db") + warning_log("verbindung mit db wurde aufgenommen") + cur = con.cursor() + cur.execute(l) + con.commit() + con.close() + account = True + + # session['username'] = account['username'] + log_server("created new user successfully") + return redirect(f'/session/{sessionId}') + + con.close() + + @app.route("/upload_file", methods=["POST"]) + def upload_file(): + """ + log_server("called /upload_file") + file = request.files + print(f"{file=}") + return render_template(f'404.html')""" + file = request.files["file"] + print (file) + + if file: + file.save("/Export", file.filename) + return "File uploaded successfully!" + return "No file found" + + @app.errorhandler(404) + def page_not_found(e): + error_log("called non-existing page") + # note that we set the 404 status explicitly + return render_template('404.html'), 404 + + + def create_app(config_filename): + app.register_error_handler(404, page_not_found) + log_server("created app") + return app + + + # Use this line to run it localy + + runip = ipfin() + app.run(host=runip, port=80) + +if __name__ == "__main__": + print("Use main.py to use program") diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..c9f813e --- /dev/null +++ b/shell.nix @@ -0,0 +1,17 @@ +{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixos-22.11.tar.gz") {} }: +pkgs.mkShell { + packages = [ + (pkgs.python3.withPackages (ps: [ + ps.flask + ps.qrcode + ps.numpy + ps.matplotlib + ])) + + pkgs.curl + pkgs.vim + pkgs.sqlite + pkgs.tmux + pkgs.tree + ]; +} diff --git a/static/css/style.css b/static/css/style.css index 96d27c3..7cffeae 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -10,7 +10,7 @@ a { /* Set a style for all buttons */ button { background-color: #6d4087; - color: white; + color: rgb(29, 24, 24); padding: 14px 20px; margin: 8px 0; border: none; @@ -85,15 +85,16 @@ a { } - input[type=text], input[type=password] input[type=time] input[type=date]{ + input[type=text], input[type=password] input[type=time]{ width: 30%; margin: 8px 0; padding: 12px 20px; display: inline-block; - border: 2px solid green; + border: 2px solid rgb(58, 58, 58); box-sizing: border-box; border-radius: 12px; - color: #839c87; + color: #050705; + background-color: rgb(142, 142, 143); } @@ -161,4 +162,28 @@ a { .dark-mode { background-image: linear-gradient(to right, rgb(5, 49, 16), rgb(63, 63, 236)) - } \ No newline at end of file + } + + summary::-webkit-details-marker, + summary::marker { + content: ""; /* Verwendung des "Pfeil"-Symbols anstelle des Dreiecks */ + color: rgb(0, 0, 0); + font-size: 2em; + font-weight: bold; + transition: all 0.5s; + } + + + details[open] summary::-webkit-details-marker, + details[open] summary::marker { + content: " "; + + } + table, th, td, caption { + border: thick solid #33363d; + border-collapse: collapse; + } + + + + \ No newline at end of file diff --git a/static/js/control.js b/static/js/control.js index 49881a2..ab51f3f 100644 --- a/static/js/control.js +++ b/static/js/control.js @@ -1,3 +1,9 @@ function save() { +} + +function export_session() { + + + } diff --git a/static/js/game.js b/static/js/game.js index 85ba215..af729ed 100644 --- a/static/js/game.js +++ b/static/js/game.js @@ -1,54 +1,41 @@ -var modal = document.getElementById('id01'); - // When the user clicks anywhere outside of the modal, close it - window.onclick = (event) => - event.target == modal ? - modal.style.display = "none" : undefined; +var h1 = document.getElementsByTagName('h1')[0]; +var start = document.getElementById('strt'); +var stop = document.getElementById('stp'); +var reset = document.getElementById('rst'); +var sec = 0; +var min = 0; +var hrs = 0; +var t; - window.onload = function () { - var seconds = 00; - var tens = 00; - var appendTens = document.getElementById("tens") - var appendSeconds = document.getElementById("seconds") - var buttonStart = document.getElementById('button-start'); - var buttonStop = document.getElementById('button-stop'); - var buttonReset = document.getElementById('button-reset'); - var Interval ; - var time = seconds + tens; - - function onclckfn() { - clearInterval(Interval); - Interval = setInterval(startTimer, 10); - } - - buttonStop.onclick = () => - clearInterval(Interval); - - buttonReset.onclick = function() { - clearInterval(Interval); - tens = "00"; - seconds = "00"; - appendTens.innerHTML = tens; - appendSeconds.innerHTML = seconds; - } - - function startTimer () { - tens++; - - if(tens <= 9) - appendTens.innerHTML = "0" + tens; - - if (tens > 9) - appendTens.innerHTML = tens; - - if (tens > 99) { - console.log("seconds"); - seconds++; - appendSeconds.innerHTML = "0" + seconds; - tens = 0; - appendTens.innerHTML = "0" + 0; - } - - if (seconds > 9) - appendSeconds.innerHTML = seconds; - } +function tick(){ + sec++; + if (sec >= 60) { + sec = 0; + min++; + if (min >= 60) { + min = 0; + hrs++; + } + } +} +function add() { + tick(); + h1.textContent = (hrs > 9 ? hrs : "0" + hrs) + + ":" + (min > 9 ? min : "0" + min) + + ":" + (sec > 9 ? sec : "0" + sec); + timer(); +} +function timer() { + t = setTimeout(add, 1000); +} + +timer(); +start.onclick = timer; +stop.onclick = function() { + clearTimeout(t); +} +reset.onclick = function() { + h1.textContent = "00:00:00"; + seconds = 0; minutes = 0; hours = 0; + sec = 0; min = 0; hrs = 0; } diff --git a/static/js/general.js b/static/js/general.js new file mode 100644 index 0000000..b315c56 --- /dev/null +++ b/static/js/general.js @@ -0,0 +1,25 @@ + +// zum prüfen ob Benutzer eingelogt ist +var s = sessionStorage.getItem("sessionID") +if (s == null) { +window.location.replace("http://127.0.0.1:5000/passwd") +} + +// Magie um die Tabs anzuzeigen +function change_div(pfad) +{ + for (var i = 0; i < document.getElementsByClassName("tmplt_tab").length; i++) document.getElementsByClassName("tmplt_tab")[i].hidden = true; + console.log(pfad) + document.getElementById(pfad).hidden = false; +} + +// Benutzer anzeigen unter session +let name = sessionStorage.getItem("name"); +document.getElementById("user").innerHTML = name; + + + + + + + diff --git a/templates/changeSession.html b/templates/changeSession.html new file mode 100644 index 0000000..c7f357f --- /dev/null +++ b/templates/changeSession.html @@ -0,0 +1,29 @@ + + + + + + + + Change Session + + +
+

Du bist bereits in Session:

+

+

Möchtest du diese Verlassen, und in eine andere Session?

+ + + + + + + + + +
+ + \ No newline at end of file diff --git a/templates/createSession.html b/templates/createSession.html index 95adbc6..396b9a9 100644 --- a/templates/createSession.html +++ b/templates/createSession.html @@ -8,24 +8,34 @@

Create Session

- - \ No newline at end of file + diff --git a/templates/index.html b/templates/index.html index dfd1d8a..32b3d17 100644 --- a/templates/index.html +++ b/templates/index.html @@ -35,10 +35,10 @@

Willkommen beim Party-Controller

- + - +
diff --git a/templates/login.html b/templates/login.html index d6dc9ae..1f1c429 100644 --- a/templates/login.html +++ b/templates/login.html @@ -33,18 +33,18 @@

Login

- @@ -54,18 +54,18 @@

User erstellen

- @@ -74,17 +74,37 @@ - -
- \ No newline at end of file diff --git a/templates/logout.html b/templates/logout.html index 85812d1..b6ed401 100644 --- a/templates/logout.html +++ b/templates/logout.html @@ -1,6 +1,6 @@ - logout + logout 👋 @@ -8,10 +8,24 @@
-

Adios

-
+

Adios 👋

+

+ + +

Wollen Sie die Session verlassen?

+
+ +
+ + \ No newline at end of file diff --git a/templates/mate.html b/templates/mate.html deleted file mode 100644 index fae8028..0000000 --- a/templates/mate.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - Mate Rechner - - -
-
-

hello

-
-
- - \ No newline at end of file diff --git a/templates/passwd.html b/templates/passwd.html index e9dd164..29df3ec 100644 --- a/templates/passwd.html +++ b/templates/passwd.html @@ -16,6 +16,10 @@
+
+
+ +
\ No newline at end of file diff --git a/templates/session.html b/templates/session.html index 52356b4..11cbad4 100644 --- a/templates/session.html +++ b/templates/session.html @@ -1,156 +1,374 @@ - + + 🎉 Party - - -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - +
+
+
+ Punkte-Spiele + + + + + + + + + {% for i in range(pointgameda.p_user|length) %} + + + + + + + {% endfor %} +
SpielerGameAktivitätPunkte
{{ pointgameda.p_user[i] }}{{ pointgameda.p_game[i] }}{{ pointgameda.p_aktivitaet[i] }}{{ pointgameda.p_zeit[i] }}
+
+
+ + + + + + + + + + + + + + + + + + + + + + - - - - - diff --git a/templates/signin.html b/templates/signin.html deleted file mode 100644 index eab50e6..0000000 --- a/templates/signin.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - -

Signin

- - - \ No newline at end of file diff --git a/templates/spiel.html b/templates/spiel.html new file mode 100644 index 0000000..56ae451 --- /dev/null +++ b/templates/spiel.html @@ -0,0 +1,65 @@ + + + + + + + + Spiel + + +
+

Spiel(e) hinzufügen

+ + + + +
+

Bereits hinzugefügte Spiele

+ + + {% block content %} + + + + + + {% endblock %} + + + + + + + + + + +
{{spiel}}GenreErscheinungsjahrGruppeTeil
fffff
+
+ + \ No newline at end of file diff --git a/upload/Dateien/README.md b/upload/Dateien/README.md new file mode 100644 index 0000000..b8ae545 --- /dev/null +++ b/upload/Dateien/README.md @@ -0,0 +1 @@ +Hier werden die Hochgeladenen Dateien gelagert \ No newline at end of file diff --git a/upload/Musik/README.md b/upload/Musik/README.md new file mode 100644 index 0000000..facc819 --- /dev/null +++ b/upload/Musik/README.md @@ -0,0 +1 @@ +Hier wird die hochgeladene Musik gelagert \ No newline at end of file diff --git a/upload/README.md b/upload/README.md new file mode 100644 index 0000000..afcf4db --- /dev/null +++ b/upload/README.md @@ -0,0 +1,2 @@ +Hier ist Platz für Spiele Dateien +Lade sie in deiner Session einfach über den Upload Button hoch! \ No newline at end of file diff --git a/upload/Spielstand/README.md b/upload/Spielstand/README.md new file mode 100644 index 0000000..97beaed --- /dev/null +++ b/upload/Spielstand/README.md @@ -0,0 +1 @@ +Hier werden die hochgeladenen Spieldateien gelagert \ No newline at end of file