Files
echoes-of-the-ash/web-map/server.py

118 lines
4.7 KiB
Python

from http.server import HTTPServer, SimpleHTTPRequestHandler
import os
import sys
import json
from pathlib import Path
# Get the directory of this script
SCRIPT_DIR = Path(__file__).parent.resolve()
class MapServerHandler(SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
# Set the directory to serve files from
super().__init__(*args, directory=str(SCRIPT_DIR), **kwargs)
def end_headers(self):
# Add CORS headers to allow access from anywhere
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Methods', 'GET, OPTIONS')
self.send_header('Access-Control-Allow-Headers', '*')
self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate')
super().end_headers()
def do_GET(self):
# Handle map_data.json request
if self.path == '/map_data.json':
try:
# Try to load from parent directory's data module
sys.path.insert(0, str(SCRIPT_DIR.parent))
from data.world_loader import export_map_data
map_data = export_map_data()
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps(map_data, indent=2).encode())
return
except Exception as e:
print(f"Error generating map data: {e}")
# Fall back to static file if it exists
map_file = SCRIPT_DIR / 'map_data.json'
if map_file.exists():
with open(map_file, 'r') as f:
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(f.read().encode())
return
self.send_error(500, f"Failed to generate map data: {str(e)}")
return
# Handle image requests from parent images directory
if self.path.startswith('/images/'):
try:
# Construct path to image in parent directory
image_path = SCRIPT_DIR.parent / self.path.lstrip('/')
if image_path.exists() and image_path.is_file():
# Determine content type based on file extension
content_types = {
'.png': 'image/png',
'.jpg': 'image/jpeg',
'.jpeg': 'image/jpeg',
'.gif': 'image/gif',
'.webp': 'image/webp',
'.svg': 'image/svg+xml'
}
ext = image_path.suffix.lower()
content_type = content_types.get(ext, 'application/octet-stream')
with open(image_path, 'rb') as f:
self.send_response(200)
self.send_header('Content-type', content_type)
self.end_headers()
self.wfile.write(f.read())
return
else:
self.send_error(404, f"Image not found: {self.path}")
return
except Exception as e:
print(f"Error serving image {self.path}: {e}")
self.send_error(500, f"Failed to serve image: {str(e)}")
return
# Serve other files normally
return super().do_GET()
def run_server(port=8080):
server_address = ('', port)
httpd = HTTPServer(server_address, MapServerHandler)
print(f"""
╔════════════════════════════════════════════╗
║ Echoes of the Ashes - Map Server ║
╚════════════════════════════════════════════╝
🗺️ Map server running on:
→ http://localhost:{port}
→ http://0.0.0.0:{port}
📊 Serving from: {SCRIPT_DIR}
Press Ctrl+C to stop the server
""")
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("\n\n👋 Shutting down server...")
httpd.shutdown()
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description='Run the RPG map visualization server')
parser.add_argument('--port', type=int, default=8080, help='Port to run the server on (default: 8080)')
args = parser.parse_args()
run_server(args.port)