summaryrefslogtreecommitdiffstats
path: root/users/tasks/inbox.py
diff options
context:
space:
mode:
Diffstat (limited to 'users/tasks/inbox.py')
-rw-r--r--users/tasks/inbox.py36
1 files changed, 36 insertions, 0 deletions
diff --git a/users/tasks/inbox.py b/users/tasks/inbox.py
new file mode 100644
index 0000000..ab80648
--- /dev/null
+++ b/users/tasks/inbox.py
@@ -0,0 +1,36 @@
+from users.models import Follow, Identity
+
+
+async def handle_inbox_item(task_handler):
+ type = task_handler.payload["type"].lower()
+ if type == "follow":
+ await inbox_follow(task_handler.payload)
+ elif type == "undo":
+ inner_type = task_handler.payload["object"]["type"].lower()
+ if inner_type == "follow":
+ await inbox_unfollow(task_handler.payload["object"])
+ else:
+ raise ValueError("Cannot undo activity of type {inner_type}")
+ else:
+ raise ValueError("Cannot handle activity of type {inner_type}")
+
+
+async def inbox_follow(payload):
+ """
+ Handles an incoming follow request
+ """
+ # TODO: Manually approved follows
+ source = Identity.by_actor_uri_with_create(payload["actor"])
+ target = Identity.by_actor_uri(payload["object"])
+ # See if this follow already exists
+ try:
+ follow = Follow.objects.get(source=source, target=target)
+ except Follow.DoesNotExist:
+ follow = Follow.objects.create(source=source, target=target, uri=payload["id"])
+ # See if we need to acknowledge it
+ if not follow.acknowledged:
+ pass
+
+
+async def inbox_unfollow(payload):
+ pass