Ejemplo n.º 1
0
def question_mutation(json: dict, event: str, question_number=None):
    points = json["question_points"]
    content = json["question_content"]
    hints = json["question_hints"]
    answer = json["answer"]
    if question_number is None:
        number = get_next_q_level(event)

        question = Question(
            question_number=number,
            question_points=points,
            event=event,
            question_content=content,
            question_hints=hints,
            answer=answer,
        )
        js = question.as_json
        add_to_db(question)
    else:
        question = get_question_by_id(event, question_number)
        question.question_points = points or question.points
        question.question_content = (
            content if content is not None else question.question_content
        )
        question.question_hints = (
            hints if hints is not None else question.question_hints
        )
        question.answer = answer or question.answer
        js = question.as_json
    save_to_db()
    return invalidate(
        [f"question-{event}-{question_number}", f"{event}-questions-list"], js
    )
Ejemplo n.º 2
0
def answer(req: ParsedRequest, event, creds: CredManager = CredManager):
    # assert_hunt_running(event)
    js = req.json
    answer = sanitize(js.get("answer", ""))
    # don't even bother if the user is trying an absurdly large answer
    if len(answer) > 50 or not answer:
        return {"is_correct": False}
    user = get_user_by_id(creds.user)
    if user.event != event:
        raise AppException("Not your event..")
    if user.is_disqualified:
        return {"disqualified": True, "reason": user.disqualification_reason}
    try:
        try:
            q = get_question(event, user.level)
        except AppException:
            return {"game_over": True}
        is_correct = sanitize(q["_secure_"]["answer"]) == answer
        log_answer(user.user, q["question_number"], js["answer"], is_correct)
        if is_correct:
            user.level += 1
            user.points += q["question_points"]
            user.last_question_answered_at = time()
            save_to_db()
            return invalidate(f"{event}-leaderboard", {"is_correct": is_correct})
        return {"is_correct": is_correct}

    except Exception as e:
        print(e)
        raise Exception("An unknown error occured")
Ejemplo n.º 3
0
def requalify(user, creds=CredManager):
    user_data = get_user_by_id(user)
    user_data.is_disqualified = False
    user_data.disqualification_reason = None
    js = user_data.as_json
    save_to_db()
    send_admin_action_webhook([f"{user} was requalified by {creds.user}"])
    return invalidate(f"{user_data.event}-leaderboard", js)
Ejemplo n.º 4
0
def delete_notification(event_name: str, ts, creds=CredManager):
    event = get_event_by_id(event_name)
    notifs = event.notifications
    n = [x for x in notifs if x["ts"] != ts]
    n.sort(key=lambda x: x["ts"], reverse=True)
    event.notifications = n
    save_to_db()
    return invalidate(f"{event_name}-notifications", {"success": True})
Ejemplo n.º 5
0
def add_notification(req: ParsedRequest, event_name: str, creds=CredManager):
    event = get_event_by_id(event_name)
    notifs = event.notifications
    notifs.append({**req.json, "ts": js_time()})
    notifs.sort(key=lambda x: x["ts"], reverse=True)
    event.notifications = notifs
    flag_modified(event, "notifications")
    save_to_db()
    return invalidate(f"{event_name}-notifications", {"success": True})
Ejemplo n.º 6
0
def edit_event(req: ParsedRequest, event, creds=CredManager):
    ev = get_event_by_id(event)
    json = req.json

    start_time = json.get("event_start_time", ev.event_start_time)
    end_time = json.get("event_end_time", ev.event_end_time)
    is_over = json.get("is_over", ev.is_over)

    ev.event_start_time = start_time
    ev.event_end_time = end_time
    ev.is_over = is_over
    save_to_db()
    return invalidate(["events-list", f"{event}-event-details"], {"success": True})
Ejemplo n.º 7
0
def disqualify(req: ParsedRequest, user, *, creds: CredManager = CredManager):
    json = req.json
    reason = json.get("reason")
    deduct_points = json.get("points")
    if deduct_points < 0:
        raise AppException("You're adding points! Don't use negative symbol")
    user_data = get_user_by_id(user)
    if user_data.is_admin:
        raise AppException("Cannot disqualify an admin!")
    user_data.is_disqualified = True
    user_data.disqualification_reason = reason
    user_data.points -= deduct_points
    js = user_data.as_json
    send_admin_action_webhook([f"{user} was disqualified by {creds.user}"])
    save_to_db()
    return invalidate(f"{user_data.event}-leaderboard", js)