示例#1
0
文件: chat.py 项目: TaranMayer/ORCAH
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)
示例#2
0
文件: queue.py 项目: TaranMayer/ORCAH
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!")
示例#3
0
文件: queue.py 项目: TaranMayer/ORCAH
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)
示例#4
0
文件: queue.py 项目: TaranMayer/ORCAH
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)
示例#5
0
                "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)
示例#6
0
文件: queue.py 项目: TaranMayer/ORCAH
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