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.api.key import check_request_for_key, check_key from GeoffreyApp.errors import * from GeoffreyApp.models import PermissionLevel 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)