Compare commits
No commits in common. "13dac398c5e2e8a8c10f0fd3b05e2e1a270df3cc" and "66ed711fec1e7b9a351bcd8284ff6631d97997b8" have entirely different histories.
13dac398c5
...
66ed711fec
3 changed files with 58 additions and 82 deletions
2
Makefile
2
Makefile
|
|
@ -1,2 +0,0 @@
|
|||
reformat:
|
||||
black *py
|
||||
40
db.py
40
db.py
|
|
@ -3,15 +3,13 @@ from typing import Dict
|
|||
|
||||
DB_FILE = "dereth.db"
|
||||
|
||||
|
||||
def init_db() -> None:
|
||||
"""Create tables if they do not exist (extended with kills_per_hour and onlinetime)."""
|
||||
conn = sqlite3.connect(DB_FILE)
|
||||
c = conn.cursor()
|
||||
|
||||
# History log
|
||||
c.execute(
|
||||
"""
|
||||
c.execute("""
|
||||
CREATE TABLE IF NOT EXISTS telemetry_log (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
character_name TEXT NOT NULL,
|
||||
|
|
@ -29,12 +27,10 @@ def init_db() -> None:
|
|||
prismatic_taper_count INTEGER,
|
||||
vt_state TEXT
|
||||
)
|
||||
"""
|
||||
)
|
||||
""")
|
||||
|
||||
# Live snapshot (upsert)
|
||||
c.execute(
|
||||
"""
|
||||
c.execute("""
|
||||
CREATE TABLE IF NOT EXISTS live_state (
|
||||
character_name TEXT PRIMARY KEY,
|
||||
char_tag TEXT,
|
||||
|
|
@ -51,36 +47,30 @@ def init_db() -> None:
|
|||
prismatic_taper_count INTEGER,
|
||||
vt_state TEXT
|
||||
)
|
||||
"""
|
||||
)
|
||||
""")
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
|
||||
def save_snapshot(data: Dict) -> None:
|
||||
"""Insert snapshot into history and upsert into live_state (with new fields)."""
|
||||
conn = sqlite3.connect(DB_FILE)
|
||||
c = conn.cursor()
|
||||
|
||||
# Insert full history row
|
||||
c.execute(
|
||||
"""
|
||||
c.execute("""
|
||||
INSERT INTO telemetry_log (
|
||||
character_name, char_tag, session_id, timestamp,
|
||||
ew, ns, z,
|
||||
kills, kills_per_hour, onlinetime,
|
||||
deaths, rares_found, prismatic_taper_count, vt_state
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
""",
|
||||
(
|
||||
""", (
|
||||
data["character_name"],
|
||||
data.get("char_tag", ""),
|
||||
data["session_id"],
|
||||
data["timestamp"],
|
||||
data["ew"],
|
||||
data["ns"],
|
||||
data.get("z", 0.0),
|
||||
data["ew"], data["ns"], data.get("z", 0.0),
|
||||
data["kills"],
|
||||
data.get("kills_per_hour", ""),
|
||||
data.get("onlinetime", ""),
|
||||
|
|
@ -88,12 +78,10 @@ def save_snapshot(data: Dict) -> None:
|
|||
data.get("rares_found", 0),
|
||||
data.get("prismatic_taper_count", 0),
|
||||
data.get("vt_state", "Unknown"),
|
||||
),
|
||||
)
|
||||
))
|
||||
|
||||
# Upsert into live_state
|
||||
c.execute(
|
||||
"""
|
||||
c.execute("""
|
||||
INSERT INTO live_state (
|
||||
character_name, char_tag, session_id, timestamp,
|
||||
ew, ns, z,
|
||||
|
|
@ -114,15 +102,12 @@ def save_snapshot(data: Dict) -> None:
|
|||
rares_found = excluded.rares_found,
|
||||
prismatic_taper_count = excluded.prismatic_taper_count,
|
||||
vt_state = excluded.vt_state
|
||||
""",
|
||||
(
|
||||
""", (
|
||||
data["character_name"],
|
||||
data.get("char_tag", ""),
|
||||
data["session_id"],
|
||||
data["timestamp"],
|
||||
data["ew"],
|
||||
data["ns"],
|
||||
data.get("z", 0.0),
|
||||
data["ew"], data["ns"], data.get("z", 0.0),
|
||||
data["kills"],
|
||||
data.get("kills_per_hour", ""),
|
||||
data.get("onlinetime", ""),
|
||||
|
|
@ -130,8 +115,7 @@ def save_snapshot(data: Dict) -> None:
|
|||
data.get("rares_found", 0),
|
||||
data.get("prismatic_taper_count", 0),
|
||||
data.get("vt_state", "Unknown"),
|
||||
),
|
||||
)
|
||||
))
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
|
|
|||
24
main.py
24
main.py
|
|
@ -23,7 +23,6 @@ SHARED_SECRET = "your_shared_secret"
|
|||
# ------------------------------------------------------------------
|
||||
ACTIVE_WINDOW = timedelta(seconds=30) # player is “online” if seen in last 30 s
|
||||
|
||||
|
||||
class TelemetrySnapshot(BaseModel):
|
||||
character_name: str
|
||||
char_tag: str
|
||||
|
|
@ -52,7 +51,8 @@ def on_startup():
|
|||
@app.post("/position")
|
||||
@app.post("/position/")
|
||||
async def receive_snapshot(
|
||||
snapshot: TelemetrySnapshot, x_plugin_secret: str = Header(None)
|
||||
snapshot: TelemetrySnapshot,
|
||||
x_plugin_secret: str = Header(None)
|
||||
):
|
||||
if x_plugin_secret != SHARED_SECRET:
|
||||
raise HTTPException(status_code=401, detail="Unauthorized")
|
||||
|
|
@ -67,9 +67,7 @@ async def receive_snapshot(
|
|||
#with open(LOG_FILE, "a") as f:
|
||||
# f.write(json.dumps(snapshot.dict(), default=str) + "\n")
|
||||
|
||||
print(
|
||||
f"[{datetime.now()}] {snapshot.character_name} @ NS={snapshot.ns:+.2f}, EW={snapshot.ew:+.2f}"
|
||||
)
|
||||
print(f"[{datetime.now()}] {snapshot.character_name} @ NS={snapshot.ns:+.2f}, EW={snapshot.ew:+.2f}")
|
||||
|
||||
return {"status": "ok"}
|
||||
|
||||
|
|
@ -92,14 +90,13 @@ def get_live_players():
|
|||
cutoff = datetime.utcnow().replace(tzinfo=timezone.utc) - ACTIVE_WINDOW
|
||||
|
||||
players = [
|
||||
dict(r)
|
||||
for r in rows
|
||||
if datetime.fromisoformat(r["timestamp"].replace("Z", "+00:00")) > cutoff
|
||||
dict(r) for r in rows
|
||||
if datetime.fromisoformat(
|
||||
r["timestamp"].replace('Z', '+00:00')
|
||||
) > cutoff
|
||||
]
|
||||
|
||||
return JSONResponse(content={"players": players})
|
||||
|
||||
|
||||
@app.get("/history/")
|
||||
@app.get("/history")
|
||||
def get_history(
|
||||
|
|
@ -154,7 +151,6 @@ def get_history(
|
|||
]
|
||||
return JSONResponse(content={"data": data})
|
||||
|
||||
|
||||
# ------------------------ GET Trails ---------------------------------
|
||||
@app.get("/trails")
|
||||
@app.get("/trails/")
|
||||
|
|
@ -166,9 +162,7 @@ def get_trails(
|
|||
for the past `seconds` seconds.
|
||||
"""
|
||||
# match the same string format as stored timestamps (via str(datetime))
|
||||
cutoff_dt = datetime.utcnow().replace(tzinfo=timezone.utc) - timedelta(
|
||||
seconds=seconds
|
||||
)
|
||||
cutoff_dt = datetime.utcnow().replace(tzinfo=timezone.utc) - timedelta(seconds=seconds)
|
||||
cutoff = str(cutoff_dt)
|
||||
conn = sqlite3.connect(DB_FILE)
|
||||
conn.row_factory = sqlite3.Row
|
||||
|
|
@ -179,7 +173,7 @@ def get_trails(
|
|||
WHERE timestamp >= ?
|
||||
ORDER BY character_name, timestamp
|
||||
""",
|
||||
(cutoff,),
|
||||
(cutoff,)
|
||||
).fetchall()
|
||||
conn.close()
|
||||
trails = [
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue