moviewyrm/bookwyrm/wellknown.py

113 lines
3.1 KiB
Python
Raw Normal View History

2020-02-15 19:31:35 +00:00
''' responds to various requests to /.well-know '''
2020-11-01 18:42:48 +00:00
from django.http import HttpResponseNotFound
2020-02-15 19:31:35 +00:00
from django.http import JsonResponse
from bookwyrm import models
from bookwyrm.settings import DOMAIN
2020-02-15 19:31:35 +00:00
def webfinger(request):
''' allow other servers to ask about a user '''
if request.method != 'GET':
return HttpResponseNotFound()
resource = request.GET.get('resource')
if not resource and not resource.startswith('acct:'):
2020-11-01 18:42:48 +00:00
return HttpResponseNotFound()
username = resource.replace('acct:@', '')
try:
user = models.User.objects.get(username=username)
except models.User.DoesNotExist:
2020-02-15 19:31:35 +00:00
return HttpResponseNotFound('No account found')
2020-11-01 18:42:48 +00:00
2020-02-15 19:31:35 +00:00
return JsonResponse({
2020-11-01 18:53:47 +00:00
'subject': 'acct:@%s' % (user.username),
2020-02-15 19:31:35 +00:00
'links': [
{
'rel': 'self',
'type': 'application/activity+json',
'href': user.remote_id
2020-02-15 19:31:35 +00:00
}
]
})
2020-02-15 19:40:21 +00:00
def nodeinfo_pointer(request):
''' direct servers to nodeinfo '''
2020-02-15 19:31:35 +00:00
if request.method != 'GET':
return HttpResponseNotFound()
return JsonResponse({
'links': [
{
'rel': 'http://nodeinfo.diaspora.software/ns/schema/2.0',
'href': 'https://%s/nodeinfo/2.0' % DOMAIN
}
]
})
2020-03-29 07:05:09 +00:00
2020-02-15 19:40:21 +00:00
def nodeinfo(request):
''' basic info about the server '''
if request.method != 'GET':
return HttpResponseNotFound()
2020-03-29 07:05:09 +00:00
status_count = models.Status.objects.filter(user__local=True).count()
2020-02-15 19:40:21 +00:00
user_count = models.User.objects.count()
return JsonResponse({
2020-05-09 21:26:27 +00:00
'version': '2.0',
'software': {
'name': 'bookwyrm',
2020-05-09 21:26:27 +00:00
'version': '0.0.1'
2020-02-15 19:40:21 +00:00
},
2020-05-09 21:26:27 +00:00
'protocols': [
'activitypub'
2020-02-15 19:40:21 +00:00
],
2020-05-09 21:26:27 +00:00
'usage': {
'users': {
'total': user_count,
'activeMonth': user_count, # TODO
'activeHalfyear': user_count, # TODO
2020-02-15 19:40:21 +00:00
},
2020-05-09 21:26:27 +00:00
'localPosts': status_count,
2020-02-15 19:40:21 +00:00
},
2020-05-09 21:26:27 +00:00
'openRegistrations': True,
2020-02-15 19:40:21 +00:00
})
2020-02-15 19:31:35 +00:00
def instance_info(request):
''' what this place is TODO: should be settable/editable '''
if request.method != 'GET':
return HttpResponseNotFound()
user_count = models.User.objects.count()
status_count = models.Status.objects.count()
return JsonResponse({
'uri': DOMAIN,
2020-09-21 15:35:22 +00:00
'title': 'BookWyrm',
2020-02-15 19:31:35 +00:00
'short_description': 'Social reading, decentralized',
'description': '',
'email': 'mousereeve@riseup.net',
'version': '0.0.1',
'stats': {
'user_count': user_count,
'status_count': status_count,
},
'thumbnail': '', # TODO: logo thumbnail
'languages': [
'en'
],
'registrations': True,
'approval_required': False,
})
2020-03-29 07:05:09 +00:00
def peers(request):
''' list of federated servers this instance connects with '''
if request.method != 'GET':
return HttpResponseNotFound()
2020-03-29 22:51:43 +00:00
names = models.FederatedServer.objects.values_list('server_name', flat=True)
return JsonResponse(list(names), safe=False)