pleroma2nip05/src/app.py

84 lines
2.4 KiB
Python

#!/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://<domain>/.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)