support fingering the instance

This commit is contained in:
Kay Faraday 2023-09-22 02:39:36 +00:00
parent 6398840ee1
commit fc13d46022
2 changed files with 31 additions and 5 deletions

View File

@ -3,6 +3,7 @@
import os
import asyncio
import asyncpg
import aiohttp
import qtoml as toml
from contextvars import ContextVar
@ -22,6 +23,12 @@ async def handle_finger(reader, writer):
+ len(config['instance_name'])
)
handle = data.decode().rstrip()
if not handle:
# `finger @instance.example`
await handle_finger_instance(reader, writer)
return
username = handle.removeprefix('@').removesuffix('@' + config['instance_name'])
if '@' in username:
writer.write(b'Error: user must be local to this instance\n')
@ -42,14 +49,32 @@ async def handle_finger(reader, writer):
writer.close()
await writer.wait_closed()
async def handle_finger_instance(reader, writer):
async with http.get(f'https://{config["instance_name"]}/nodeinfo/2.0') as resp:
data = (await resp.json())['usage']
user_data = data['users']
resp = (
f'Total users: {user_data["total"]:,}\n'
f'Active users (past month): {user_data["activeMonth"]:,}\n'
f'Active users (past six months): {user_data["activeHalfyear"]:,}\n'
f'Total posts: {data["localPosts"]:,}\n'
).encode()
writer.write(resp)
async def main():
global http
db.set(await asyncpg.create_pool(**config['db']))
async with await asyncio.start_server(
handle_finger,
'0.0.0.0',
os.getenv('PORT', FINGER_PORT),
) as server:
async with (
# globals used here only because ContextVar wasn't working
aiohttp.ClientSession() as http,
await asyncio.start_server(
handle_finger,
'0.0.0.0',
os.getenv('PORT', FINGER_PORT),
) as server,
):
addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets)
print(f'Serving on {addrs}')

View File

@ -1,2 +1,3 @@
asyncpg ~= 0.28.0
qtoml ~= 0.3.1
aiohttp ~= 3.8