-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathapi.py
116 lines (92 loc) · 3.57 KB
/
api.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
"""
This file contains all API routes.
An API route is used either by external applications (for example the StudBot), or client side javascript.
"""
import sys
from flask_login import login_required, current_user
import webapp.database as db
from webapp import app
from flask import request
from flask import Response
import requests
import json
# General API file
# Read and eval config file
with open("config.json", "r") as f:
config = json.loads(f.read())
@app.route('/api/challenges/categories')
def api_get_categories():
return Response(json.dumps(db.get_categories()),
mimetype="application/json")
@app.route('/api/challenges/<category>')
def api_get_challenges(category):
ret = {}
for subcategory in db.get_challenges(category):
ret[subcategory[0]] = {
"description": subcategory[1],
"challenges": [
{
"id": challenge[0],
"name": challenge[1],
"description": challenge[2],
"points": challenge[3],
"url": challenge[4],
"solves": challenge[5],
"handout": challenge[6]
}
for challenge in subcategory[2]
]
}
return Response(json.dumps(ret),
mimetype="application/json")
@app.route('/api/challenges/submit/<challenge_id>', methods=["POST"])
@login_required
def api_submit_challenge(challenge_id):
try:
status = db.submit_flag(challenge_id, request.form['flag'], current_user.id)
if status != "OK":
return Response(json.dumps({"status": status}),
mimetype="application/json")
data = {
"content": f"{db.get_user(user_id=current_user.id)['username']} solved {db.get_challenge_name(challenge_id)}!"
}
requests.post(config["webhook_url"], json=data)
return Response(json.dumps({"status": status}),
mimetype="application/json")
except KeyError:
return Response(json.dumps({"Error": "Flag missing."}), mimetype="application/json")
@app.route('/api/profile/update', methods=["POST"])
@login_required
def api_update_profile():
try:
university_id = int(request.form["university"])
if len([university for university in db.get_universities() if university[0] == university_id]) == 0:
return Response(json.dumps({"Error": "Invalid university id"}), mimetype="application/json")
db.update_user_university(current_user.id, request.form["university"])
return Response(json.dumps({"Status": "OK"}), mimetype="application/json")
except KeyError:
return Response(json.dumps({"Error": "Missing parameters"}), mimetype="application/json")
except ValueError:
return Response(json.dumps({"Error": "Invalid datatype"}), mimetype="application/json")
@app.route('/api/scoreboard')
def api_scoreboard():
ret = []
scoreboard = db.get_scoreboard()
for rank, user in enumerate(scoreboard):
ret.append({
"username": user[1],
"university": user[3],
"position": rank+1,
"score": user[4],
"user_id": user[0]
})
return Response(json.dumps(ret),
mimetype="application/json")
@app.route('/api/discord_id/<user_id>')
def api_discord_id(user_id):
user_data = db.get_user(user_id=user_id)
ret = {
"discord_id": user_data["discord_id"]
}
return Response(json.dumps(ret),
mimetype="application/json")