diff --git a/fingerd.py b/fingerd.py index c1fc364..730ba8e 100755 --- a/fingerd.py +++ b/fingerd.py @@ -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}') diff --git a/requirements.txt b/requirements.txt index 602cab9..4cbbfdb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ asyncpg ~= 0.28.0 qtoml ~= 0.3.1 +aiohttp ~= 3.8