2023-05-31 20:33:45 +02:00
import queue
2023-06-09 21:22:25 +02:00
from flask import Flask , render_template , request , make_response , session
2023-06-16 19:29:49 +02:00
from flask_socketio import SocketIO , join_room , leave_room
2023-06-09 22:44:36 +02:00
from flask_session import Session
2023-05-31 20:33:45 +02:00
import sqlite3
import time
import atexit
import sys
2023-06-09 21:22:25 +02:00
import uuid
2023-06-21 19:03:59 +02:00
import json
2023-05-31 20:33:45 +02:00
db_path = ' mate.db '
2023-05-31 19:23:40 +00:00
conn = sqlite3 . connect ( db_path , check_same_thread = False )
2023-05-31 20:33:45 +02:00
c = conn . cursor ( )
app = Flask ( __name__ )
2023-06-09 22:27:45 +02:00
key = str ( uuid . uuid4 ( ) . hex )
2023-06-09 22:57:59 +02:00
app . config [ ' SESSION_TYPE ' ] = ' filesystem '
2023-06-09 22:54:01 +02:00
app . config [ ' SECRET_KEY ' ] = key
2023-06-09 22:39:09 +02:00
Session ( app )
2023-06-09 21:47:15 +02:00
socketio = SocketIO ( app )
2023-05-31 20:33:45 +02:00
status = True
users = queue . Queue ( )
finished = None
2023-06-14 21:37:51 +02:00
message = None
2023-05-31 20:33:45 +02:00
def exit_handler ( ) :
conn . close ( )
sys . exit ( " Program sucsesfully exited " )
#website
@app.route ( " / " )
def index ( ) :
2023-06-21 20:01:16 +02:00
return ' <a href= " /list " >user and tag list</a> <p>The creator of this website accepts no liability for any linguistic or technical errors!</p><br style= " line-height: 500 % ; " ></br><a href= " /documentation " >Doumentation</a> '
2023-05-31 20:33:45 +02:00
@app.route ( " /list " )
def list ( ) :
c . execute ( " SELECT * FROM users " )
users = c . fetchall ( )
text = " "
for i in users :
2023-06-09 20:11:51 +02:00
text = text + f ' <p><a href= " list/user?user= { i [ 1 ] } " > { i [ 1 ] } </a>: { i [ 2 ] } <form action= " /change " method= " get " ><input name= " id " type= " hidden " value= " { i [ 0 ] } " > Change balance: <input name= " change " ><input type= " submit " ></form></p> <br style= " line-height: 50%; " ></br> '
2023-06-14 20:55:54 +02:00
return ''' <!DOCTYPE html>
2023-06-14 21:06:50 +02:00
< html lang = " en " >
2023-06-14 20:55:54 +02:00
< script src = " https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js " integrity = " sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA== " crossorigin = " anonymous " > < / script >
< script type = " text/javascript " charset = " utf-8 " >
var socket = io ( ) ;
socket . on ( " update " , function ( ) {
window . location = " http://matekasse.server.c3h/list "
} ) ;
< / script >
< form action = " /list/user " method = " get " > Search for User : < input name = " user " > < input type = " submit " > < / form >
< form action = " /adduser " method = " get " > < button type = " submit " > Add User < / button > < / form >
< br > < / br >
''' + text + ' </html> '
2023-05-31 20:33:45 +02:00
@app.route ( " /list/user " , methods = [ ' GET ' ] )
2023-05-31 22:29:47 +02:00
def user_info ( ) :
2023-06-14 18:54:58 +02:00
username = request . args . get ( " user " )
2023-06-16 19:20:25 +02:00
c . execute ( " SELECT * FROM users WHERE username = ? " , [ username ] )
2023-06-14 18:54:58 +02:00
user_list = c . fetchall ( )
if user_list != [ ] :
user = user_list [ 0 ]
2023-06-10 00:09:52 +02:00
c . execute ( f " SELECT * FROM tags WHERE userid= { user [ 0 ] } " )
tags = c . fetchall ( )
text = " "
for tag in tags :
text = text + f " <p> { tag [ 0 ] } </p> "
2023-06-14 21:13:03 +02:00
return f """ <!DOCTYPE html>
2023-06-14 21:06:50 +02:00
< html lang = " en " >
< script src = " https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js " integrity = " sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA== " crossorigin = " anonymous " > < / script >
< script type = " text/javascript " charset = " utf-8 " >
2023-06-14 21:20:44 +02:00
var socket = io ( ) ;
""" + ' socket.on( " update " , function() { window.location= " http://matekasse.server.c3h/list/user?user= ' + username + ' " }); ' + f """
< / script >
2023-06-14 21:14:25 +02:00
< p > { user [ 1 ] } : { user [ 2 ] } < p >
2023-06-14 21:13:03 +02:00
< form action = " /addtag " method = " get " > < input name = " id " type = " hidden " value = " {user[0]} " > < button type = " submit " > Add Tag < / button > < / form >
< form action = " /removetag " method = " get " > < input name = " id " type = " hidden " value = " {user[0]} " > < button type = " submit " > Remove Tag < / button > < / form >
< / p > < form action = " /change " method = " get " > < input name = " id " type = " hidden " value = " {user[0]} " > Change balance : < input name = " change " > < input type = " submit " > < / form >
2023-06-14 21:06:50 +02:00
< / p >
< br > < / br >
< p > Tags : < / p >
2023-06-14 21:13:03 +02:00
{ text }
2023-06-14 21:06:50 +02:00
< br > < / br >
2023-06-14 21:26:03 +02:00
< form action = " /removeuser/confirmation " method = " get " > < input name = " id " type = " hidden " value = " {user[0]} " > < button type = " submit " > Remove User < / button > < / form >
2023-06-14 21:06:50 +02:00
< / html >
"""
2023-05-31 20:33:45 +02:00
else :
return " User does not exists "
@app.route ( " /adduser " )
def new_user ( ) :
return render_template ( " adduser.html " )
2023-06-14 19:49:28 +02:00
@app.route ( " /removeuser/confirmation " , methods = [ ' GET ' ] )
2023-06-14 19:48:21 +02:00
def confirm_remove_user ( ) :
user_id = request . args . get ( " id " )
2023-06-14 19:59:22 +02:00
return f ' Do your realy want to <a href= " /removeuser?id= { user_id } " >remove the user</a> '
2023-06-14 19:48:21 +02:00
2023-06-14 18:28:45 +02:00
@app.route ( " /removeuser " , methods = [ ' GET ' ] )
2023-06-10 00:09:52 +02:00
def remove_user ( ) :
2023-06-14 18:56:26 +02:00
user_id = request . args . get ( " id " )
2023-06-14 19:48:21 +02:00
c . execute ( f " SELECT * FROM users WHERE id= { user_id } " )
user_name = c . fetchall ( ) [ 0 ] [ 1 ]
2023-06-14 19:36:30 +02:00
c . execute ( f " DELETE FROM tags WHERE userid= { user_id } " )
c . execute ( f " DELETE FROM users WHERE id= { user_id } " )
2023-06-10 00:09:52 +02:00
conn . commit ( )
2023-06-16 19:29:49 +02:00
socketio . emit ( " update " , " update " )
2023-06-14 19:48:21 +02:00
return f ' <p>Deleted user { user_name } </p><a href= " /list " >return to the tags and user list</a> '
2023-06-10 00:09:52 +02:00
2023-05-31 20:33:45 +02:00
@app.route ( " /adduser/user " , methods = [ ' GET ' ] )
def adduser ( ) :
user = request . args . get ( " username " )
2023-06-16 19:20:25 +02:00
c . execute ( " SELECT * FROM users WHERE username=? " , [ user ] )
2023-05-31 20:33:45 +02:00
if c . fetchall ( ) == [ ] :
2023-06-16 19:20:25 +02:00
c . execute ( " INSERT or IGNORE INTO users (username, balance) VALUES (?, 0) " , [ user ] )
2023-05-31 20:33:45 +02:00
conn . commit ( )
2023-06-16 19:29:49 +02:00
socketio . emit ( " update " , " update " )
2023-05-31 19:23:40 +00:00
return ' Added user <a href= " /list " >user and tag list</a> <p>The creator of this website accepts no liability for any linguistic or technical errors!</p> '
2023-05-31 20:33:45 +02:00
else :
2023-06-16 18:54:34 +02:00
return ' <p>User already exists</p> <a href= " /list " >user and tag list</a> '
2023-05-31 20:33:45 +02:00
@app.route ( " /change " , methods = [ ' GET ' ] )
def change ( ) :
user_id = int ( request . args . get ( " id " ) )
try :
change = int ( request . args . get ( " change " ) )
except ValueError :
2023-06-09 19:53:27 +02:00
return ' <p>Please enter a number!</p><a href= " /list " >tags and user list</a> '
2023-06-09 20:17:30 +02:00
c . execute ( f " UPDATE users SET balance = balance + { change } WHERE id= { user_id } " )
2023-06-16 19:29:49 +02:00
socketio . emit ( " update " , " update " )
return """ <html>
< script src = " https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js " integrity = " sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA== " crossorigin = " anonymous " > < / script >
< script type = " text/javascript " charset = " utf-8 " >
window . location = " http://matekasse.server.c3h/list " ;
< / script >
< / html >
"""
#socketio.emit("update", "update")
#conn.commit()
#if change < 0:
# text = "removed from"
# change_text = change * -1
#elif change > 0:
# text = "added to"
# change_text = change
#elif change == 0:
# return "<p>Nothing was done!</p>"
#c.execute(f"SELECT * FROM users WHERE id={user_id}")
#user = c.fetchall()[0][1]
#return f'<p>{change_text} was {text} {user}</p> <a href="/list">back to the list</a>'
2023-05-31 20:33:45 +02:00
@app.route ( " /addtag " , methods = [ ' GET ' ] )
def get_addtag_request ( ) :
global users
try :
user_id = int ( request . args . get ( " id " ) )
except : #except im Normalen Code!
return " Wrong user id! "
2023-06-09 21:22:25 +02:00
session_id = uuid . uuid4 ( )
2023-06-09 22:23:01 +02:00
session [ id ] = session_id
2023-06-09 21:22:25 +02:00
users . put ( [ user_id , " add " , session_id ] )
2023-05-31 20:33:45 +02:00
return render_template ( " addtag.html " , user = user_id )
@socketio.on ( ' addtag ' )
def request_addtag ( data ) :
global finished
2023-06-14 21:35:11 +02:00
global message
2023-06-09 23:16:16 +02:00
join_room ( session [ id ] )
2023-05-31 20:33:45 +02:00
if len ( users . queue ) > 0 :
user = users . queue [ len ( users . queue ) - 1 ]
2023-06-09 21:22:25 +02:00
if user == [ data [ " data " ] , " add " , session [ id ] ] :
2023-06-09 23:16:16 +02:00
socketio . emit ( " wait " , " wait " , to = session [ id ] )
2023-05-31 20:33:45 +02:00
i = 0
2023-06-09 21:22:25 +02:00
while finished != [ data [ " data " ] , " add " , session [ id ] ] :
2023-05-31 20:33:45 +02:00
time . sleep ( 1 )
i + = 1
if i > 20 :
2023-06-09 23:16:16 +02:00
socketio . emit ( " error " , " timeout " , to = session [ id ] )
2023-06-09 19:11:45 +02:00
notimportant = users . get ( )
2023-05-31 22:29:47 +02:00
break
else :
finished = None
2023-06-10 00:09:52 +02:00
c . execute ( f " SELECT * FROM users WHERE id = { user [ 0 ] } " )
2023-05-31 22:29:47 +02:00
username = c . fetchall ( ) [ 0 ] [ 1 ]
2023-06-14 21:35:11 +02:00
if message == " Tag already exists " :
socketio . emit ( " finished " , f " { message } " )
else :
2023-06-14 21:46:10 +02:00
socketio . emit ( " finished " , f " Added { message } to { username } " , to = session [ id ] )
2023-05-31 20:33:45 +02:00
else :
2023-06-09 23:16:16 +02:00
socketio . emit ( " busy " , " busy " , to = session [ id ] )
2023-05-31 20:33:45 +02:00
else :
2023-06-09 23:19:11 +02:00
socketio . emit ( " error " , " error " , to = session [ id ] )
leave_room ( session [ id ] )
2023-05-31 20:33:45 +02:00
2023-06-09 21:22:25 +02:00
@app.route ( " /removetag " , methods = [ ' GET ' ] )
2023-06-09 21:26:17 +02:00
def get_removetag_request ( ) :
2023-06-09 21:22:25 +02:00
global users
try :
user_id = int ( request . args . get ( " id " ) )
except : #except im Normalen Code!
return " Wrong user id! "
session_id = uuid . uuid4 ( )
2023-06-09 22:59:30 +02:00
session [ id ] = session_id
2023-06-09 23:01:55 +02:00
users . put ( [ user_id , " remove " , session_id ] )
2023-06-09 21:22:25 +02:00
return render_template ( " removetag.html " , user = user_id )
@socketio.on ( ' removetag ' )
2023-06-09 21:26:17 +02:00
def request_removetag ( data ) :
2023-06-09 21:22:25 +02:00
global finished
2023-06-14 21:35:11 +02:00
global message
2023-06-09 23:19:11 +02:00
join_room ( session [ id ] )
2023-06-09 21:22:25 +02:00
if len ( users . queue ) > 0 :
2023-06-10 00:09:52 +02:00
queue_item = users . queue [ len ( users . queue ) - 1 ]
2023-06-14 20:32:50 +02:00
user = queue_item [ 0 ]
2023-06-10 00:09:52 +02:00
if queue_item == [ data [ " data " ] , " remove " , session [ id ] ] :
2023-06-09 23:19:11 +02:00
socketio . emit ( " wait " , " wait " , to = session [ id ] )
2023-06-09 21:22:25 +02:00
i = 0
while finished != [ data [ " data " ] , " remove " , session [ id ] ] :
time . sleep ( 1 )
i + = 1
if i > 20 :
2023-06-09 23:19:11 +02:00
socketio . emit ( " error " , " timeout " , to = session [ id ] )
2023-06-09 21:22:25 +02:00
notimportant = users . get ( )
break
else :
finished = None
c . execute ( f " SELECT * FROM users WHERE id = { user } " )
username = c . fetchall ( ) [ 0 ] [ 1 ]
2023-06-14 21:35:11 +02:00
if message == " Tag does not exist " :
socketio . emit ( " finished " , f " { message } " )
else :
socketio . emit ( " finished " , f " removed { message } from { username } " )
2023-06-09 21:22:25 +02:00
else :
2023-06-09 23:19:11 +02:00
socketio . emit ( " busy " , " busy " , to = session [ id ] )
2023-06-09 21:22:25 +02:00
else :
2023-06-09 23:19:11 +02:00
socketio . emit ( " error " , " error " , to = session [ id ] )
leave_room ( session [ id ] )
2023-06-09 21:22:25 +02:00
2023-05-31 20:33:45 +02:00
#api
@app.route ( " /api/tag_id " , methods = [ ' GET ' ] )
def get_id ( ) :
global finished
2023-06-14 21:39:13 +02:00
global message
2023-05-31 20:33:45 +02:00
tag_id = int ( request . args . get ( " id " ) )
c . execute ( f " SELECT * FROM tags WHERE tagid = { tag_id } " )
2023-06-09 23:24:44 +02:00
tag_list = c . fetchall ( )
if users . qsize ( ) > 0 :
2023-06-09 21:22:25 +02:00
queue_item = users . get ( )
user = queue_item [ 0 ]
state = queue_item [ 1 ]
if state == " add " :
2023-06-14 21:35:11 +02:00
c . execute ( f " SELECT * FROM tags WHERE tagid= { tag_id } " )
if c . fetchall ( ) != [ ] :
message = " Tag already exists "
2023-06-21 19:39:13 +02:00
finished = queue_item
return make_response ( json . dumps ( { " mode " : " 0 " , " error " : " 170 " } ) )
2023-06-14 21:35:11 +02:00
else :
c . execute ( f " INSERT OR IGNORE INTO tags (tagid, userid) VALUES ( { tag_id } , { user } ) " )
message = tag_id
2023-06-21 19:39:13 +02:00
finished = queue_item
c . execute ( f " SELECT * FROM users WHERE id= { user } " )
username = c . fetchall ( )
2023-06-21 20:08:31 +02:00
conn . commit ( )
2023-06-21 20:01:16 +02:00
return make_response ( json . dumps ( { " mode " : " 2 " , " username " : username , " code " : " 1 " } ) )
2023-06-09 21:22:25 +02:00
elif state == " remove " :
2023-06-14 21:35:11 +02:00
c . execute ( f " SELECT * FROM tags WHERE (tagid = { tag_id } AND userid = { user } ) " )
2023-06-14 21:43:41 +02:00
tags = c . fetchall ( )
if tags != [ ] :
2023-06-14 21:35:11 +02:00
c . execute ( f " DELETE FROM tags WHERE (tagid = { tag_id } AND userid = { user } ) " )
message = tag_id
2023-06-21 19:39:13 +02:00
finished = queue_item
c . execute ( f " SELECT * FROM users WHERE id= { user } " )
username = c . fetchall ( )
2023-06-21 20:08:31 +02:00
conn . commit ( )
2023-06-21 19:39:13 +02:00
return make_response ( json ( { " mode " : " 2 " , " username " : username , " code " : " 2 " } ) )
2023-06-14 21:35:11 +02:00
else :
message = " Tag does not exist "
2023-06-21 19:39:13 +02:00
finished = queue_item
return make_response ( json . dumps ( { " mode " : " 0 " , " error " : " 054 " } ) )
2023-06-09 21:22:25 +02:00
finished = queue_item
2023-06-14 20:58:22 +02:00
socketio . emit ( " update " , " update " )
2023-06-21 20:08:31 +02:00
return make_response ( json . dumps ( { " mode " : " 0 " , " error " : " 418 " } ) )
2023-06-09 23:24:44 +02:00
elif tag_list != [ ] :
tag = tag_list [ 0 ]
if users . qsize ( ) == 0 :
c . execute ( f " UPDATE users SET balance = balance - 1 WHERE id= { tag [ 1 ] } " )
conn . commit ( )
2023-06-21 19:03:59 +02:00
c . execute ( f " SELECT * FROM users WHERE id= { tag [ 1 ] } " )
2023-06-21 19:07:02 +02:00
user = c . fetchall ( ) [ 0 ]
2023-06-21 19:39:13 +02:00
socketio . emit ( " update " , " upfinished = queue_itemdate " )
return make_response ( json . dumps ( { " mode " : " 1 " , " username " : user [ 1 ] , " balance " : user [ 2 ] } ) )
2023-06-14 20:58:22 +02:00
socketio . emit ( " update " , " update " )
2023-06-21 20:01:16 +02:00
return make_response ( json . dumps ( { " mode " : " 0 " , " error " : " 418 " } ) )
2023-05-31 20:33:45 +02:00
2023-06-21 20:01:16 +02:00
#Documentation
2023-06-21 20:12:06 +02:00
@app.route ( " /documentation " )
2023-06-21 20:01:16 +02:00
def documentation ( ) :
return render_template ( " documentation.html " )
2023-06-21 20:12:06 +02:00
2023-05-31 20:33:45 +02:00
def main ( ) :
atexit . register ( exit_handler )
2023-06-16 19:29:49 +02:00
socketio . run ( app , host = ' 0.0.0.0 ' , port = 5000 )