Skip to content
Snippets Groups Projects

Add logging to sockets

Merged Victor Löfgren requested to merge 124-add-logging-to-sockets into dev
1 file
+ 54
35
Compare changes
  • Side-by-side
  • Inline
+ 54
35
import app.database.controller as dbc
import app.database.controller as dbc
from app.core import db
from app.core import db
from app.database.models import Competition, Slide, Team, ViewType
from app.database.models import Competition, Slide, Team, ViewType, Code
from flask.globals import request
from flask.globals import request
from flask_socketio import SocketIO, emit, join_room
from flask_socketio import SocketIO, emit, join_room
 
import logging
# Presentation is an active competition
logger = logging.getLogger(__name__)
 
logger.propagate = False
 
logger.setLevel(logging.INFO)
 
formatter = logging.Formatter('[%(levelname)s] %(funcName)s: %(message)s')
 
stream_handler = logging.StreamHandler()
 
stream_handler.setFormatter(formatter)
 
logger.addHandler(stream_handler)
sio = SocketIO(cors_allowed_origins="http://localhost:3000")
sio = SocketIO(cors_allowed_origins="http://localhost:3000")
@@ -14,7 +21,7 @@ presentations = {}
@@ -14,7 +21,7 @@ presentations = {}
@sio.on("connect")
@sio.on("connect")
def connect():
def connect():
print(f"[Connected]: {request.sid}")
logger.info(f"Client '{request.sid}' connected")
@sio.on("disconnect")
@sio.on("disconnect")
@@ -22,23 +29,22 @@ def disconnect():
@@ -22,23 +29,22 @@ def disconnect():
for competition_id, presentation in presentations.items():
for competition_id, presentation in presentations.items():
if request.sid in presentation["clients"]:
if request.sid in presentation["clients"]:
del presentation["clients"][request.sid]
del presentation["clients"][request.sid]
 
logger.debug(f"Client '{request.sid}' left presentation '{competition_id}'")
break
break
if presentations and not presentations[competition_id]["clients"]:
if presentations and not presentations[competition_id]["clients"]:
del presentations[competition_id]
del presentations[competition_id]
 
logger.info(f"No people left in presentation '{competition_id}', ended presentation")
print(f"{presentations=}")
logger.info(f"Client '{request.sid}' disconnected")
print(f"[Disconnected]: {request.sid}")
@sio.on("start_presentation")
@sio.on("start_presentation")
def start_presentation(data):
def start_presentation(data):
competition_id = data["competition_id"]
competition_id = data["competition_id"]
# TODO: Do proper error handling
if competition_id in presentations:
if competition_id in presentations:
print("THAT PRESENTATION IS ALREADY ACTIVE")
logger.error(f"Client '{request.sid}' failed to start competition '{competition_id}', presentation already active")
return
return
presentations[competition_id] = {
presentations[competition_id] = {
@@ -47,40 +53,44 @@ def start_presentation(data):
@@ -47,40 +53,44 @@ def start_presentation(data):
"timer": {"enabled": False, "start_value": None, "value": None},
"timer": {"enabled": False, "start_value": None, "value": None},
}
}
print(f"{presentations=}")
join_room(competition_id)
join_room(competition_id)
print(f"[start_presentation]: {request.sid} -> {competition_id}.")
logger.debug(f"Client '{request.sid}' joined room {competition_id}")
 
logger.info(f"Client '{request.sid}' started competition '{competition_id}'")
@sio.on("end_presentation")
@sio.on("end_presentation")
def end_presentation(data):
def end_presentation(data):
competition_id = data["competition_id"]
competition_id = data["competition_id"]
if competition_id not in presentations:
if competition_id not in presentations:
print("NO PRESENTATION WITH THAT NAME EXISTS")
logger.error(f"Client '{request.sid}' failed to end presentation '{competition_id}', no such presentation exists")
 
return
 
 
if request.sid not in presentations[competition_id]["clients"]:
 
logger.error(f"Client '{request.sid}' failed to end presentation '{competition_id}', client not in presentation")
return
return
if presentations[competition_id]["clients"][request.sid]["view_type"] != "Operator":
if presentations[competition_id]["clients"][request.sid]["view_type"] != "Operator":
print("YOU DONT HAVE ACCESS TO DO THAT")
logger.error(f"Client '{request.sid}' failed to end presentation '{competition_id}', client is not operator")
return
return
del presentations[competition_id]
del presentations[competition_id]
logger.debug(f"Deleted presentation {competition_id}")
print(f"{presentations=}")
emit("end_presentation", room=competition_id, include_self=True)
emit("end_presentation", room=competition_id, include_self=True)
 
logger.debug(f"Emitting event 'end_presentation' to room {competition_id} including self")
 
 
logger.info(f"Client '{request.sid}' ended presentation '{competition_id}'")
@sio.on("join_presentation")
@sio.on("join_presentation")
def join_presentation(data):
def join_presentation(data):
team_view_id = 1
team_view_id = 1
code = data["code"]
code = data["code"]
item_code = dbc.get.code_by_code(code)
item_code = db.session.query(Code).filter(Code.code == code).first()
# TODO: Do proper error handling
if not item_code:
if not item_code:
print("CODE DOES NOT EXIST")
logger.error(f"Client '{request.sid}' failed to join presentation with code '{code}', no such code exists")
return
return
competition_id = (
competition_id = (
@@ -90,22 +100,22 @@ def join_presentation(data):
@@ -90,22 +100,22 @@ def join_presentation(data):
)
)
if competition_id not in presentations:
if competition_id not in presentations:
print("THAT COMPETITION IS CURRENTLY NOT ACTIVE")
logger.error(f"Client '{request.sid}' failed to join presentation '{competition_id}', no such presentation exists")
return
return
if request.sid in presentations[competition_id]["clients"]:
if request.sid in presentations[competition_id]["clients"]:
print("CLIENT ALREADY IN COMPETITION")
logger.error(f"Client '{request.sid}' failed to join presentation '{competition_id}', client already in presentation")
return
return
# TODO: Write function in database controller to do this
# TODO: Write function in database controller to do this
view_type_name = db.session.query(ViewType).filter(ViewType.id == item_code.view_type_id).one().name
view_type_name = db.session.query(ViewType).filter(ViewType.id == item_code.view_type_id).one().name
presentations[competition_id]["clients"][request.sid] = {"view_type": view_type_name}
presentations[competition_id]["clients"][request.sid] = {"view_type": view_type_name}
join_room(competition_id)
print(f"{presentations=}")
join_room(competition_id)
 
logger.debug(f"Client '{request.sid}' joined room {competition_id}")
print(f"[Join presentation]: {request.sid} -> {competition_id}. {view_type_name=}")
logger.info(f"Client '{request.sid}' joined competition '{competition_id}'")
@sio.on("set_slide")
@sio.on("set_slide")
@@ -114,43 +124,52 @@ def set_slide(data):
@@ -114,43 +124,52 @@ def set_slide(data):
slide_order = data["slide_order"]
slide_order = data["slide_order"]
if competition_id not in presentations:
if competition_id not in presentations:
print("CANT SET SLIDE IN NON ACTIVE COMPETITION")
logger.error(f"Client '{request.sid}' failed to set slide in presentation '{competition_id}', no such presentation exists")
 
return
 
 
if request.sid not in presentations[competition_id]["clients"]:
 
logger.error(f"Client '{request.sid}' failed to set slide in presentation '{competition_id}', client not in presentation")
return
return
if presentations[competition_id]["clients"][request.sid]["view_type"] != "Operator":
if presentations[competition_id]["clients"][request.sid]["view_type"] != "Operator":
print("YOU DONT HAVE ACCESS TO DO THAT")
logger.error(f"Client '{request.sid}' failed to set slide in presentation '{competition_id}', client is not operator")
return
return
num_slides = db.session.query(Slide).filter(Slide.competition_id == competition_id).count()
num_slides = db.session.query(Slide).filter(Slide.competition_id == competition_id).count()
if not (0 <= slide_order < num_slides):
if not (0 <= slide_order < num_slides):
print("CANT CHANGE TO NON EXISTENT SLIDE")
logger.error(f"Client '{request.sid}' failed to set slide in presentation '{competition_id}', slide number {slide_order} does not exist")
return
return
presentations[competition_id]["slide"] = slide_order
presentations[competition_id]["slide"] = slide_order
print(f"{presentations=}")
emit("set_slide", {"slide_order": slide_order}, room=competition_id, include_self=True)
emit("set_slide", {"slide_order": slide_order}, room=competition_id, include_self=True)
print(f"[Set slide]: {slide_order} -> {competition_id}")
logger.debug(f"Emitting event 'set_slide' to room {competition_id} including self")
 
 
logger.info(f"Client '{request.sid}' set slide '{slide_order}' in competition '{competition_id}'")
@sio.on("set_timer")
@sio.on("set_timer")
def sync_timer(data):
def set_timer(data):
competition_id = data["competition_id"]
competition_id = data["competition_id"]
timer = data["timer"]
timer = data["timer"]
if competition_id not in presentations:
if competition_id not in presentations:
print("CANT SET TIMER IN NON EXISTENT COMPETITION")
logger.error(f"Client '{request.sid}' failed to set slide in presentation '{competition_id}', no such presentation exists")
 
return
 
 
if request.sid not in presentations[competition_id]["clients"]:
 
logger.error(f"Client '{request.sid}' failed to set slide in presentation '{competition_id}', client not in presentation")
return
return
if presentations[competition_id]["clients"][request.sid]["view_type"] != "Operator":
if presentations[competition_id]["clients"][request.sid]["view_type"] != "Operator":
print("YOU DONT HAVE ACCESS TO DO THAT")
logger.error(f"Client '{request.sid}' failed to set slide in presentation '{competition_id}', client is not operator")
return
return
# TODO: Save timer in presentation, maybe?
# TODO: Save timer in presentation, maybe?
print(f"{presentations=}")
emit("set_timer", {"timer": timer}, room=competition_id, include_self=True)
emit("set_timer", {"timer": timer}, room=competition_id, include_self=True)
print(f"[Set timer]: {timer=}, {competition_id=}")
logger.debug(f"Emitting event 'set_timer' to room {competition_id} including self")
 
 
logger.info(f"Client '{request.sid}' set timer '{timer}' in presentation '{competition_id}'")
 
Loading