84 lines
2.3 KiB
Python
84 lines
2.3 KiB
Python
import json
|
|
|
|
from django.http import HttpResponse, JsonResponse
|
|
from django.shortcuts import get_object_or_404
|
|
|
|
from apps.lyric.models import User
|
|
|
|
|
|
AP_CONTEXT = [
|
|
"https://www.w3.org/ns/activitystreams",
|
|
{"earthman": "https://earthmanrpg.me/ns#"},
|
|
]
|
|
|
|
|
|
def _base_url(request):
|
|
return f"{request.scheme}://{request.get_host()}"
|
|
|
|
|
|
def _ap_response(data):
|
|
return HttpResponse(
|
|
json.dumps(data),
|
|
content_type="application/activity+json",
|
|
)
|
|
|
|
|
|
def webfinger(request):
|
|
resource = request.GET.get("resource", "")
|
|
if not resource:
|
|
return HttpResponse(status=400)
|
|
# Expect acct:username@host
|
|
if not resource.startswith("acct:"):
|
|
return HttpResponse(status=400)
|
|
username = resource[len("acct:"):].split("@")[0]
|
|
user = get_object_or_404(User, username=username)
|
|
base = _base_url(request)
|
|
data = {
|
|
"subject": resource,
|
|
"links": [
|
|
{
|
|
"rel": "self",
|
|
"type": "application/activity+json",
|
|
"href": f"{base}/ap/users/{user.username}/",
|
|
}
|
|
],
|
|
}
|
|
return HttpResponse(json.dumps(data), content_type="application/jrd+json")
|
|
|
|
|
|
def actor(request, username):
|
|
user = get_object_or_404(User, username=username)
|
|
user.ensure_keypair()
|
|
base = _base_url(request)
|
|
actor_url = f"{base}/ap/users/{username}/"
|
|
data = {
|
|
"@context": AP_CONTEXT,
|
|
"id": actor_url,
|
|
"type": "Person",
|
|
"preferredUsername": username,
|
|
"inbox": f"{actor_url}inbox/",
|
|
"outbox": f"{actor_url}outbox/",
|
|
"publicKey": {
|
|
"id": f"{actor_url}#main-key",
|
|
"owner": actor_url,
|
|
"publicKeyPem": user.ap_public_key,
|
|
},
|
|
}
|
|
return _ap_response(data)
|
|
|
|
|
|
def outbox(request, username):
|
|
user = get_object_or_404(User, username=username)
|
|
base = _base_url(request)
|
|
events = user.game_events.select_related("room").order_by("timestamp")
|
|
activities = [a for e in events if (a := e.to_activity(base)) is not None]
|
|
actor_url = f"{base}/ap/users/{username}/"
|
|
data = {
|
|
"@context": AP_CONTEXT,
|
|
"id": f"{actor_url}outbox/",
|
|
"type": "OrderedCollection",
|
|
"totalItems": len(activities),
|
|
"orderedItems": activities,
|
|
}
|
|
return _ap_response(data)
|