#!/bin/env python3 # Pleroma2nip05: Server nip05 users for Pleroma users # AGPL v3.0 or later licensed # Copyright (C) Taurix IT 2023 import json from flask import Flask, jsonify import yaml import psycopg2 import psycopg2.extras from datetime import datetime __VERSION__ = '1.0.0' app = Flask('app') print("Pleroma2nip05 v%s" % (__VERSION__)) with open(r'/etc/pleroma2nip05/config.yml') as configfile: config = yaml.load(configfile, Loader=yaml.FullLoader) # https:///.well-known/nostr.json try: # Connect to an existing database connection = psycopg2.connect(user=config.get('pguser'), password=config.get('pgpass'), host=config.get('pghost'), database=config.get('pleromadb')) cursor = connection.cursor(cursor_factory = psycopg2.extras.RealDictCursor) print("PostgreSQL server information") print(connection.get_dsn_parameters(), "\n") except (Exception, Error) as error: print("Error while connecting to PostgreSQL", error) # Get local users only userquery = "SELECT nickname, fields FROM users WHERE nickname NOT LIKE '%@%';" relays = [ "wss://relay.rebelbase.site" , "wss://nostr-pub.wellorder.net" , "wss://relay.orangepill.dev", "wss://relay.shitforce.one" ] lastupdate = None localusers = None @app.route("/json") def get_json(): global lastupdate global localusers global userquery global userquery print(lastupdate) now = datetime.now() if lastupdate is not None: diff = (now - lastupdate) age = diff.total_seconds() else: age = 9999999 if age > int(config.get('ttl')): print('From DB') cursor.execute(userquery) localusers = cursor.fetchall() lastupdate = now else: print('From cache') nostr = {} nostr['names'] = {} nostr['relays'] = {} if localusers is not None: for user in localusers: if user['nickname'] == 'gvs': if user.get('fields') is not None: for field in user.get('fields'): if field.get('name').lower() == 'nostr': nostr['names'][user['nickname']] = field.get('value') nostr['relays'][field.get('value')] = relays # print(json.dumps(nostr)) return json.dumps(nostr)