diff options
| author | kboz <kutayboz@gmail.com> | 2026-04-24 00:55:26 +0200 |
|---|---|---|
| committer | kboz <kutayboz@gmail.com> | 2026-04-24 00:55:26 +0200 |
| commit | e43c98997b0de6a8da989f68d97f1d4f7fb7bb6f (patch) | |
| tree | 1b9c8073acdef60af2ca3e19ae0c4a1b2c55410f /backend/src/main.py | |
| parent | acbf6d6bd6d63ab0e9f7c4e119827f76e0382aac (diff) | |
| download | haul-e43c98997b0de6a8da989f68d97f1d4f7fb7bb6f.tar.gz | |
feat(core): implement wallet trade tracking and sqlite market caching
- Transitioned primary ESI networking and dataset initialization to `asyncio` and `aiohttp` for non-blocking I/O.
- Introduced `aiosqlite` utilizing an in-memory database to significantly speed up arbitrage querying.
- Implemented character wallet tracking (added `esi-wallet.read_character_wallet.v1` scope) to automatically deduct filled market volumes internally instead of waiting for full region polling.
- Exposed `/settings` endpoint allowing dynamic tweaking of threshold variables (cargo size, limits, tax rate, ship speeds) directly from the React UI.
- Decoupled auto-waypoint submission during route planning; users now push routes selectively via a new "Set in Game" frontend action and `/set_waypoints` backend logic.
- Optimized order evaluations and triplet generation limits through `LegMetrics` to lower CPU footprint drastically on large dataset passes.
- Migrated React frontend completely to Server-Sent Events (SSE), cleanly ditching HTTP polling.
Diffstat (limited to 'backend/src/main.py')
| -rw-r--r-- | backend/src/main.py | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/backend/src/main.py b/backend/src/main.py index c1a76f5..fef58b0 100644 --- a/backend/src/main.py +++ b/backend/src/main.py @@ -3,6 +3,9 @@ import json import logging from typing import Any, Optional +from dotenv import load_dotenv +load_dotenv() + from fastapi import BackgroundTasks, FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import StreamingResponse @@ -21,7 +24,7 @@ async def start_manager() -> None: while True: try: logger.info("Starting manager update") - await asyncio.to_thread(manager.update) + await manager.update() logger.info("Manager update completed") except Exception as error: logger.exception("An error occurred during manager update: %s", error) @@ -64,7 +67,7 @@ async def read_route_info() -> Any: @app.post("/create_route") async def create_route(background_tasks: BackgroundTasks) -> dict: """Initiates route creation in the background.""" - background_tasks.add_task(manager.create_route) + asyncio.create_task(manager.create_route()) return {"status": "Route creation initiated"} @app.get("/data_stream") @@ -84,11 +87,33 @@ async def data_stream() -> StreamingResponse: @app.get("/logs") async def get_logs() -> Any: """Retrieves logs from the manager.""" - return manager.log_queue + return manager.log @app.post("/open_market_window/{type_id}") -async def open_market_window(type_id: int) -> Any: +async def open_market_window(type_id: int) -> dict: """Opens a market window for a given `type_id` using the ESI API.""" - result = esi.open_market_window(type_id) + await esi.open_market_window(type_id) logger.info("Opened market window for type_id %s", type_id) - return result + return {"status": "opened"} + +@app.get("/settings") +async def get_settings() -> dict: + """Returns the current ship settings.""" + return manager.ship + +@app.post("/settings") +async def update_settings(settings: dict) -> dict: + """Updates the ship settings.""" + for key, value in settings.items(): + if key in manager.ship: + manager.ship[key] = value + # Re-initialize the graph with new settings + from graph import NavigationGraph + manager.graph = NavigationGraph(manager.ship) + return {"status": "success", "settings": manager.ship} + +@app.post("/set_waypoints") +async def set_waypoints_endpoint() -> dict: + """Uses the ESI API to push the calculated route as in-game waypoints""" + return await manager.set_waypoints() + |
