summaryrefslogtreecommitdiffstats
path: root/users/tasks/inbox.py
blob: 27c602d5d8799255b37a8fb0a4664bfe463de072 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from asgiref.sync import sync_to_async

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 == "accept":
        inner_type = task_handler.payload["object"]["type"].lower()
        if inner_type == "follow":
            await sync_to_async(accept_follow)(task_handler.payload["object"])
        else:
            raise ValueError(f"Cannot handle activity of type accept.{inner_type}")
    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(f"Cannot handle activity of type undo.{inner_type}")
    else:
        raise ValueError(f"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


def accept_follow(payload):
    """
    Another server has acknowledged our follow request
    """
    source = Identity.by_actor_uri_with_create(payload["actor"])
    target = Identity.by_actor_uri(payload["object"])
    follow = Follow.maybe_get(source, target)
    if follow:
        follow.accepted = True
        follow.save()