From d2e61a3b07e84178bd4dac3ffe713da0240bb357 Mon Sep 17 00:00:00 2001 From: Kierre Date: Sun, 19 Oct 2025 16:02:58 -0400 Subject: [PATCH] federation `state_ids` --- TODO.md | 2 +- vona/federation/__init__.py | 78 +++++++++++++++++++++++++++++++------ 2 files changed, 68 insertions(+), 12 deletions(-) diff --git a/TODO.md b/TODO.md index 569dcc8..2fc43b7 100644 --- a/TODO.md +++ b/TODO.md @@ -1 +1 @@ -Nothing yet... +- use `resolvematrix` async instead of sync diff --git a/vona/federation/__init__.py b/vona/federation/__init__.py index 560f1f7..cf4b8a0 100644 --- a/vona/federation/__init__.py +++ b/vona/federation/__init__.py @@ -1,13 +1,17 @@ from flask import jsonify, Response, request, send_file, abort, Blueprint +import json, time, os, threading import vona.globals as globals import vona.config as config -import json -import time -import os + server = Blueprint("federation", __name__) +http = globals.http_client() +class bullshit: + def get_json(): + return {} + def send_join(request, roomId) -> dict: event_chain = [] event_hashes = [] @@ -296,10 +300,6 @@ async def make_join(roomId, userId): except: return not_invited() - class bullshit: - def get_json(): - return {} - state = send_join( request=bullshit, roomId=roomId @@ -476,10 +476,6 @@ async def discover_common_rooms(): async def backfill(room): # TODO: burger king foot lettuce - class bullshit: - def get_json(): - return {} - return jsonify({ "origin": config.server_name, "origin_server_ts": int(str(time.time() * 1000).split(".")[0]), @@ -495,3 +491,63 @@ async def extremities(room): globals.make_event_id(seed=f"6_{room}"), ] }) + + +@server.route("/_matrix/federation/v1/state_ids/") +async def state_ids(room): + if ( + "event_id" in request.args + and request.args["event_id"].strip() != "" + ): + evt = request.args["event_id"] + def explode(): + return jsonify({ + "errcode": "M_NOT_FOUND", + "error": f"Could not find event {evt}" + }), 404 + + + if ":" not in evt: + return explode() + if ":" in room: + if room.split(":")[1] != config.server_name: + return explode() + else: + return explode() + + server_name = evt.split(":")[1] + + if server_name == config.server_name: + state = send_join(bullshit, room)["state"] + event_ids = [] + + for event in state: + event_ids.append(event["event_id"]) + + if evt in event_ids: + return jsonify({ + "auth_chain_ids": [event_ids], + "pdu_ids": [event_ids] + }) + else: + return explode() + + try: + resp = http.get( + path=request.full_path, + destination=server_name, + ) + + if resp.status_code != 200: + raise + + return jsonify(resp.json()) + except: + pass + + return explode() + + return jsonify({ + "errcode": "M_MISSING_PARAM", + "error": "Query parameter 'event_id' was not specified" + }), 400