59 lines
1.6 KiB
Python
59 lines
1.6 KiB
Python
from flask import request, Response, abort
|
|
from flask_restful import reqparse
|
|
|
|
def require_args(*args):
|
|
parser = reqparse.RequestParser()
|
|
for arg in args:
|
|
parser.add_argument(arg, required=True, help="{} required".format(arg))
|
|
return parser.parse_args()
|
|
|
|
|
|
class Challenge(object):
|
|
""" A sample challenge -- inherit this and overwrite accordingly """
|
|
|
|
points = 0
|
|
provides = []
|
|
requires = []
|
|
description = "This description should be overriden"
|
|
dependencies_provided_by = {}
|
|
|
|
def __init__(self, wrapper):
|
|
self.db = wrapper
|
|
|
|
def game(self):
|
|
if request.method == 'GET':
|
|
return self.describe()
|
|
if request.method == 'HEAD':
|
|
return self.describe()
|
|
if request.method == 'POST':
|
|
return self.solve()
|
|
|
|
def describe(self):
|
|
""" Describe what to do to solve this challenge"""
|
|
return self.description
|
|
|
|
def save_points(self, user):
|
|
""" should be called when the challenge was solved successfully"""
|
|
|
|
key = "points/{}".format(user, type(self).__name__)
|
|
self.db.set_user_key(user, key, self.points)
|
|
|
|
def solve(self):
|
|
""" Needs to be implemented per challenge """
|
|
pass
|
|
|
|
|
|
def error(self, msg=""):
|
|
""" Abort with an error """
|
|
return Response(status=400, response=msg)
|
|
|
|
def get_args(self, *args):
|
|
res = {}
|
|
f = request.form
|
|
for arg in args:
|
|
if arg not in f:
|
|
abort(Response("Missing argument: {}\n".format(arg)))
|
|
|
|
res[arg] = f[arg]
|
|
return res
|