more skeleton
authorWilliam Pitcock <nenolod@dereferenced.org>
Fri, 10 Aug 2018 19:59:46 +0000 (14:59 -0500)
committerWilliam Pitcock <nenolod@dereferenced.org>
Fri, 10 Aug 2018 19:59:46 +0000 (14:59 -0500)
viera/__init__.py
viera/actor.py
viera/database.py [new file with mode: 0644]

index 4cfb05c..c32462d 100644 (file)
@@ -4,9 +4,19 @@ from . import logging
 import asyncio
 import aiohttp
 import aiohttp.web
+import yaml
+
+
+def load_config():
+    with open('viera.yaml') as f:
+         return yaml.load(f)
+
+
+CONFIG = load_config()
 
 
 app = aiohttp.web.Application()
 
 
+from . import database
 from . import actor
index e69de29..7d0329f 100644 (file)
@@ -0,0 +1,43 @@
+import aiohttp.web
+import logging
+from Crypto.PublicKey import RSA
+from .database import DATABASE
+
+
+# generate actor keys if not present
+if "actorKeys" not in DATABASE:
+    logging.info("No actor keys present, generating 4096-bit RSA keypair.")
+
+    privkey = RSA.generate(4096)
+    pubkey = privkey.publickey()
+
+    DATABASE["actorKeys"] = {
+        "publicKey": pubkey.exportKey('PEM'),
+        "privateKey": privkey.exportKey('PEM')
+    }
+
+
+from . import app
+
+
+async def actor(request):
+    data = {
+        "@context": "https://www.w3.org/ns/activitystreams",
+        "endpoints": {
+            "sharedInbox": "https://{}/inbox".format(request.host)
+        },
+        "followers": "https://{}/followers".format(request.host),
+        "inbox": "https://{}/inbox".format(request.host),
+        "name": "Viera",
+        "type": "Application",
+        "publicKey": {
+            "id": "https://{}/actor#main-key".format(request.host),
+            "owner": "https://{}/actor".format(request.host),
+            "publicKeyPem": DATABASE["actorKeys"]["publicKey"]
+        },
+        "summary": "Viera, the bot"
+    }
+    return aiohttp.web.json_response(data)
+
+
+app.router.add_get('/actor', actor)
diff --git a/viera/database.py b/viera/database.py
new file mode 100644 (file)
index 0000000..857af93
--- /dev/null
@@ -0,0 +1,24 @@
+import asyncio
+import logging
+import simplejson as json
+
+
+from . import CONFIG
+
+
+try:
+    with open(CONFIG['db']) as f:
+        DATABASE = json.load(f)
+except:
+    logging.info('No database was found, making a new one.')
+    DATABASE = {}
+
+
+async def database_save():
+    while True:
+        with open(CONFIG['db'], 'w') as f:
+            json.dump(DATABASE, f)
+        await asyncio.sleep(30)
+
+
+asyncio.ensure_future(database_save())