Geoffrey-Django/api/views.py

81 lines
2.3 KiB
Python

from django.views.generic import View
from django.http import JsonResponse
from django.conf import settings
import traceback
import sys
import GeoffreyApp.api.commands as commands
from GeoffreyApp.errors import *
from GeoffreyApp.models import APIToken
def check_token(request, **kwargs):
if "api" in request:
key = request["api"]
if APIToken.objects.filter(key=key, **kwargs).exists():
return True
return False
def run_command(request, command, req_type):
command = command.lower()
try:
if command in commands.command_dict[req_type]:
params = request.dict()
params.pop("api")
response = commands.command_dict[req_type][command]["func"](**params)
else:
raise CommandNotFound
except Exception as e:
response = {"error": e.__class__.__name__, "error_message": str(e)}
traceback.print_exception(type(e), e, e.__traceback__, file=sys.stderr)
return JsonResponse(response, safe=False)
class CommandAPI(View):
def get(self, request, command):
get = request.GET
if check_token(get, commands_perm=True):
if command.lower() == "commands":
return JsonResponse(commands.command_dict)
else:
return run_command(get, command, "GET")
else:
return JsonResponse({})
def post(self, request, command):
post = request.POST
if check_token(post, commands_perm=True):
return run_command(post, command, "POST")
else:
return JsonResponse({})
def delete(self, request, command):
delete = request.DELETE
if check_token(delete, commands_perm=True):
return run_command(delete, command, "DELETE")
else:
return JsonResponse({})
class SettingsAPI(View):
def get(self, request):
if check_token(request.GET, commands_perm=True):
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)