84 lines
2.4 KiB
Python
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)
|