diff --git a/src/test_server.py b/src/test_server.py index 376a632..6725d83 100644 --- a/src/test_server.py +++ b/src/test_server.py @@ -84,6 +84,47 @@ def valid_uuid(val): return False +async def hook_handler(request: web.Request) -> web.Response: + """Handle incoming JSON webhook POSTs on /hook endpoint""" + try: + # Verify request method + if request.method != "POST": + logger.error( + f"{time}\tInvalid request method to /hook from %s", request.remote + ) + return web.Response(status=405, text="Method not allowed. Use POST.") + + # Get JSON data from request + try: + data = await request.json() + except json.JSONDecodeError: + logger.error("Invalid JSON to /hook from %s", request.remote) + return web.Response(status=400, text="Invalid JSON in request body") + + # Log the received webhook + print(f"[@DEBUG] Webhook received at {time} from {request.remote}") + logger.info( + f"{time}\tWebhook received from {request.remote}: {json.dumps(data)}" + ) + + # Process the webhook data here + # TODO: Add your webhook processing logic + + response_data = { + "status": "success", + "message": "Webhook received", + "timestamp": time, + "data_received": data, + } + + return web.json_response(response_data) + + except Exception as e: + logger.error(f"Webhook handler error: {str(e)}") + print(f"Webhook handler error: {str(e)}") + return web.Response(status=500, text="Internal server error") + + async def request_handler(request: web.Request) -> web.Response: """Handle incoming POST requests with command processing""" try: @@ -144,16 +185,61 @@ async def request_handler(request: web.Request) -> web.Response: print("Starting web server...") os.system("cls" if os.name == "nt" else "clear") app = web.Application() -app.router.add_post("/", request_handler) +app.router.add_post("/api", request_handler) +app.router.add_post("/hook", hook_handler) parser = argparse.ArgumentParser(description="studspider") parser.add_argument( - "--host", type=str, default="localhost", help="IP address to listen on" + "--host", + type=str, + default="localhost", + help="IP address to listen on. default: localhost", +) +parser.add_argument( + "--port", type=int, default=7432, help="Port to listen on. default: 7432" +) +parser.add_argument( + "--hook-port", + type=int, + default=8080, + help="Optional separate port for webhook endpoint. default: 8080", ) -parser.add_argument("--port", type=int, default=7432, help="Port to listen on") args = parser.parse_args() if __name__ == "__main__": print(banner.generate("studspider v0.1")) print("Built for PLAY-WELL TEKNOLOGIES by contact@traps.moe\n\n") - web.run_app(app, host=args.host, port=args.port) + + # If hook-port is specified, run a separate server for webhooks + if args.hook_port: + print(f"Starting main server on {args.host}:{args.port}") + print(f"Starting webhook server on {args.host}:{args.hook_port}") + + # Create separate app for webhook + hook_app = web.Application() + hook_app.router.add_post("/hook", hook_handler) + + # Run both servers concurrently + async def run_servers(): + runner1 = web.AppRunner(app) + await runner1.setup() + site1 = web.TCPSite(runner1, args.host, args.port) + + runner2 = web.AppRunner(hook_app) + await runner2.setup() + site2 = web.TCPSite(runner2, args.host, args.hook_port) + + await site1.start() + await site2.start() + + print(f"Main server running on http://{args.host}:{args.port}") + print(f"Webhook server running on http://{args.host}:{args.hook_port}/hook") + + # Keep running + await asyncio.Event().wait() + + asyncio.run(run_servers()) + else: + print(f"Server running on {args.host}:{args.port}") + print(f"Webhook endpoint: http://{args.host}:{args.port}/hook") + web.run_app(app, host=args.host, port=args.port)