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 )
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")
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)
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})
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})
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})
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)