async def post_message(payload, client, user, db): """ Post a new chat message :param payload: received payload, containing team number :type payload: dict[str, Any] :param client: client that sent payload and will receive form :type client: websockets.WebSocketCommonProtocol :param user: user that sent payload :type user: ecusers.User :param db: database object :type db: ecdatabase.Database """ if (message := await ech.safe_extract(client, payload, {eclib.db.chat.message: str})) is not None: if user.role == eclib.roles.referee: author_type = eclib.db.chat.author_type_referee elif user.role in eclib.roles.STAFF_ROLES_: author_type = eclib.db.chat.author_type_staff else: if not ech.TEAM_CHAT_ENABLED: await ech.send_error(client, "Team chatting is currently disabled.") return author_type = eclib.db.chat.author_type_team message = bleach.clean(message, tags=list(), attributes=dict()) message = " ".join(message.split()) if len(message) == 0: await ech.send_error(client, "Invalid message") return await db.insert(eclib.db.chat.table_, { eclib.db.chat.timestamp: ech.current_time(), eclib.db.chat.author: user.name, eclib.db.chat.author_type: author_type, eclib.db.chat.message: message }) await push(db)
async def team_queue(purpose, client, team, db): """ Add team to queue. Executed by team. :param purpose: queue purpose :type purpose: int :param client: client that sent request :type client: websockets.WebSocketCommonProtocol :param team: team in question :type team: ecusers.User :param db: database object :type db: ecdatabase.Database """ db_result = await db.select(eclib.db.queue.table_, [(eclib.db.queue.team_num, "==", team.name), (eclib.db.queue.time_removed, "==", 0)]) if len(db_result) == 0: if purpose in (eclib.db.queue.purpose_driving_skills, eclib.db.queue.purpose_programming_skills): if not ech.SKILLS_OPEN: await ech.send_error(client, "Skills is currently closed.") return elif ech.SKILLS_ATTEMPTS[team.name][purpose - 1] >= 3: await ech.send_error( client, "You have exceeded your allowed " + ("Driving" if purpose == eclib.db.queue. purpose_driving_skills else "Programming") + " Skills attempts.") return elif team.name not in ech.INSPECTED_TEAMS: await ech.send_error(client, "You have not passed inspection.") return elif purpose == eclib.db.queue.purpose_inspection: if not ech.INSPECTION_OPEN: await ech.send_error(client, "Inspection is currently closed.") return else: await ech.send_error(client) return await db.insert( eclib.db.queue.table_, { eclib.db.queue.team_num: team.name, eclib.db.queue.purpose: purpose, eclib.db.queue.time_queued: ech.current_time() }) await push_update(db) else: await ech.send_error( client, "You must leave the queue before you can queue again!")
async def team_unqueue(team, db): """ Remove team from queue. Executed by team. :param team: team in question :type team: ecusers.User :param db: database object :type db: ecdatabase.Database """ await db.update( eclib.db.queue.table_, [(eclib.db.queue.team_num, "==", team.name), (eclib.db.queue.time_removed, "==", 0)], { eclib.db.queue.removed_by: team.name, eclib.db.queue.time_removed: ech.current_time() }) await push_update(db)
async def ctrl_remove(payload, client, user, db): """ Remove team from queue. Executed by referee or event partner. :param payload: received payload :type payload: dict[str, Any] :param client: client that sent request :type client: websockets.WebSocketCommonProtocol :param user: team in question :type user: ecusers.User :param db: database object :type db: ecdatabase.Database """ if (team_num := await ech.safe_extract(client, payload, {eclib.db.inspection.team_num: str})) is not None: db_result = await db.select(eclib.db.queue.table_, [(eclib.db.queue.team_num, "==", team_num), (eclib.db.queue.time_removed, "==", 0)]) if len(db_result) == 0: await ech.send_error(client) return if user.name == db_result[0][ eclib.db.queue. referee] or user.role == eclib.roles.event_partner: await db.update( eclib.db.queue.table_, [(eclib.db.queue.team_num, "==", team_num), (eclib.db.queue.time_removed, "==", 0)], { eclib.db.queue.removed_by: user.name, eclib.db.queue.time_removed: ech.current_time() }) await push_update(db) else: await ech.send_error(client)
"setting": bool })) is not None: if extracted["flag"] == "teamChat": ech.TEAM_CHAT_ENABLED = extracted["setting"] elif extracted["flag"] == "inspection": ech.INSPECTION_OPEN = extracted["setting"] elif extracted["flag"] == "skills": ech.SKILLS_OPEN = extracted["setting"] await ech.send_error( client, "Successfully " + ("enabled " if extracted["setting"] else "disabled ") + extracted["flag"]) elif operation == "announce": if (message := await ech.safe_extract(client, payload, {"message": str})) is not None: await ecsocket.send_by_role( { "api": eclib.apis.main, "modal": message }, eclib.roles.team) await db.insert( eclib.db.chat.table_, { eclib.db.chat.timestamp: ech.current_time(), eclib.db.chat.author: user.name, eclib.db.chat.author_type: eclib.db.chat.author_type_announcement, eclib.db.chat.message: message }) await ecmodules.chat.push(db)
async def ctrl_invite(payload, client, user, db): """ Invite team to meeting room. Executed by referee. :param payload: received payload :type payload: dict[str, Any] :param client: client that sent request :type client: websockets.WebSocketCommonProtocol :param user: team in question :type user: ecusers.User :param db: database object :type db: ecdatabase.Database :return: whether operation was successful :rtype: bool """ if (team_num := await ech.safe_extract(client, payload, { eclib.db.queue.team_num: str })) is not None and user.role == eclib.roles.referee: db_result = await db.select(eclib.db.queue.table_, [(eclib.db.queue.referee, "==", user.name), (eclib.db.queue.time_removed, "==", 0)]) if len(db_result) > 0: if db_result[0][eclib.db.queue.team_num] != team_num: await ech.send_error( client, "You can only invite one team at a time!") return False db_result = await db.select(eclib.db.queue.table_, [(eclib.db.queue.team_num, "==", team_num), (eclib.db.queue.time_removed, "==", 0)]) if len(db_result) == 0: await ech.send_error(client) return False if db_result[0][eclib.db.queue.referee] in ("", user.name): await db.update( eclib.db.queue.table_, [(eclib.db.queue.team_num, "==", team_num), (eclib.db.queue.time_removed, "==", 0)], { eclib.db.queue.time_invited: ech.current_time(), eclib.db.queue.referee: user.name }) password = (''.join( random.choice(string.digits) for _ in range(4))) await ecsocket.send_by_access( { "api": eclib.apis.meeting_ctrl, "room": user.room, "password": password }, eclib.apis.meeting_ctrl) team_msg = { "api": eclib.apis.main, "modal": "<p>You are invited to join the video call:</p>" + "<p><a href=\"https://meet.orcah.org/room" + str(user.room) + "\" target=\"_blank\">" + "https://meet.orcah.org/room" + str(user.room) + "</a></p>" + "<p>Password: <big><strong><tt>" + password + "</tt></strong></big></p>" } await ecsocket.send_by_user(team_msg, ecusers.User.find_user(team_num)) await push_update(db) await save_passwd(str(user.room), password) return True