Compare commits
3
Commits
5440da0bdf
...
uv
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
10537855f6 | ||
|
|
3a5f477914 | ||
|
|
de9852e374 |
No files matched your search
+3
-1
@@ -33,4 +33,6 @@ studspider.db-journal
|
|||||||
.states
|
.states
|
||||||
assets/external/
|
assets/external/
|
||||||
__pycache__/
|
__pycache__/
|
||||||
win/
|
win/
|
||||||
|
.github/
|
||||||
|
activate/
|
||||||
+97
-2
@@ -1,3 +1,4 @@
|
|||||||
|
import argparse
|
||||||
import asyncio
|
import asyncio
|
||||||
import json
|
import json
|
||||||
from aiohttp import web
|
from aiohttp import web
|
||||||
@@ -7,6 +8,7 @@ import uuid
|
|||||||
|
|
||||||
import dotenv
|
import dotenv
|
||||||
import os
|
import os
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import logging
|
import logging
|
||||||
from logging.handlers import RotatingFileHandler
|
from logging.handlers import RotatingFileHandler
|
||||||
@@ -82,6 +84,47 @@ def valid_uuid(val):
|
|||||||
return False
|
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:
|
async def request_handler(request: web.Request) -> web.Response:
|
||||||
"""Handle incoming POST requests with command processing"""
|
"""Handle incoming POST requests with command processing"""
|
||||||
try:
|
try:
|
||||||
@@ -142,9 +185,61 @@ async def request_handler(request: web.Request) -> web.Response:
|
|||||||
print("Starting web server...")
|
print("Starting web server...")
|
||||||
os.system("cls" if os.name == "nt" else "clear")
|
os.system("cls" if os.name == "nt" else "clear")
|
||||||
app = web.Application()
|
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. 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",
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
print(banner.generate("studspider v0.1"))
|
print(banner.generate("studspider v0.1"))
|
||||||
print("Built for PLAY-WELL TEKNOLOGIES by contact@traps.moe\n\n")
|
print("Built for PLAY-WELL TEKNOLOGIES by contact@traps.moe\n\n")
|
||||||
web.run_app(app, host="localhost", port=7432)
|
|
||||||
|
# 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)
|
||||||
Reference in new issue
Block a user