Geoffrey-Django/GeoffreyApp/api/views.py

104 lines
3.0 KiB
Python

from django.views.generic import View
from django.http import JsonResponse
from django.conf import settings
import traceback
import sys
from GeoffreyApp.api.commands import RequestTypes
import GeoffreyApp.api.commands as commands
from GeoffreyApp.errors import *
from GeoffreyApp.models import APIToken, PermissionLevel
def check_key(key, **kwargs):
if APIToken.objects.filter(key=key, **kwargs).exists():
return True
else:
return False
def check_request_for_key(request):
if "api" in request:
key = request["api"]
return APIToken.objects.get(key=key)
return None
def run_command(request, command_name, req_type, key):
params = request.dict()
params.pop("api")
command_name = command_name.lower()
try:
if command_name in commands.command_dict[req_type]:
command = commands.command_dict[req_type][command_name]
if key.has_command_permission(command.permission_level):
response = command.func(**params)
else:
response = {}
else:
raise CommandNotFound
except Exception as e:
response = {"error": e.__class__.__name__, "error_message": str(e)}
if getattr(settings, "DEBUG", False):
traceback.print_exception(type(e), e, e.__traceback__, file=sys.stderr)
return JsonResponse(response, safe=False)
def get_commands(key):
command_list = []
for request in commands.command_dict:
for command_name in commands.command_dict[request]:
command = commands.command_dict[request][command_name]
json = command.json
if key.has_command_permission(command.permission_level):
command_list.append(json)
return command_list
class CommandAPI(View):
def get(self, request, command):
get = request.GET
key = check_request_for_key(get)
if key is not None:
if command.lower() == "commands":
return JsonResponse(get_commands(key), safe=False)
else:
return run_command(get, command, RequestTypes.GET, key)
return JsonResponse({})
def post(self, request, command):
post = request.POST
key = check_request_for_key(request)
if key is not None:
return run_command(post, command, RequestTypes.POST, key)
else:
return JsonResponse({})
class SettingsAPI(View):
def get(self, request):
key = check_request_for_key(request.GET)
if key.has_command_permission(PermissionLevel.PLAYER):
response = {
"BOT_PREFIX": getattr(settings, 'GEOFFREY_BOT_PREFIX', '?'),
"ERROR_USERS": getattr(settings, 'GEOFFREY_BOT_ERROR_USERS', []),
"MOD_RANKS": getattr(settings, 'GEOFFREY_BOT_MOD_RANK', []),
"STATUS": getattr(settings, 'GEOFFREY_BOT_STATUS', 'sed')
}
else:
response = {}
return JsonResponse(response)