Skip to content
Snippets Groups Projects
Verified Commit d509c090 authored by Eliot Berriot's avatar Eliot Berriot
Browse files

Basic working poc with favorites send over websocket

parent e4902845
No related branches found
No related tags found
No related merge requests found
......@@ -4,14 +4,15 @@ from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from funkwhale_api.common.auth import TokenAuthMiddleware
from funkwhale_api.music import consumers
from funkwhale_api.instance import consumers
application = ProtocolTypeRouter({
# Empty for now (http->django views is added by default)
"websocket": TokenAuthMiddleware(
URLRouter([
url("^api/v1/test/$", consumers.MyConsumer),
url("^api/v1/instance/activity$",
consumers.InstanceActivityConsumer),
])
),
})
......@@ -3,3 +3,4 @@ from channels.layers import get_channel_layer
channel_layer = get_channel_layer()
group_send = async_to_sync(channel_layer.group_send)
group_add = async_to_sync(channel_layer.group_add)
from channels.generic.websocket import JsonWebsocketConsumer
from funkwhale_api.common import channels
class JsonAuthConsumer(JsonWebsocketConsumer):
......@@ -9,3 +10,8 @@ class JsonAuthConsumer(JsonWebsocketConsumer):
return self.close()
return self.accept()
def accept(self):
super().accept()
for group in self.groups:
channels.group_add(group, self.channel_name)
......@@ -8,10 +8,12 @@ record.registry.register_serializer(
@record.registry.register_consumer('favorites.TrackFavorite')
def broadcast_track_favorite_to_instance_timeline(data, obj):
def broadcast_track_favorite_to_instance_activity(data, obj):
if obj.user.privacy_level not in ['instance', 'everyone']:
return
channels.group_send('instance_timeline', {
'type': 'event',
channels.group_send('instance_activity', {
'type': 'event.send',
'text': '',
'data': data
})
from funkwhale_api.common.consumers import JsonAuthConsumer
class InstanceActivityConsumer(JsonAuthConsumer):
groups = ["instance_activity"]
def event_send(self, message):
self.send_json(message['data'])
from funkwhale_api.common.consumers import JsonAuthConsumer
class MyConsumer(JsonAuthConsumer):
groups = ["broadcast"]
def receive_json(self, payload):
print(payload, self.scope["user"])
# Called with either text_data or bytes_data for each frame
# You can call:
self.send_json({'test': 'me'})
# Or, to send a binary frame:
# self.send(bytes_data="{Hello} world!")
# Want to force-close the connection? Call:
# self.close()
# # Or add a custom WebSocket error code!
# self.close(code=4123)
......@@ -37,32 +37,32 @@ def test_track_favorite_serializer_is_connected(activity_registry):
def test_track_favorite_serializer_instance_activity_consumer(
activity_registry):
conf = activity_registry['favorites.TrackFavorite']
consumer = activities.broadcast_track_favorite_to_instance_timeline
consumer = activities.broadcast_track_favorite_to_instance_activity
assert consumer in conf['consumers']
def test_broadcast_track_favorite_to_instance_timeline(
def test_broadcast_track_favorite_to_instance_activity(
factories, mocker):
p = mocker.patch('funkwhale_api.common.channels.group_send')
favorite = factories['favorites.TrackFavorite']()
data = serializers.TrackFavoriteActivitySerializer(favorite).data
consumer = activities.broadcast_track_favorite_to_instance_timeline
consumer = activities.broadcast_track_favorite_to_instance_activity
message = {
"type": 'event',
"data": data
}
consumer(data=data, obj=favorite)
p.assert_called_once_with('instance_timeline', message)
p.assert_called_once_with('instance_activity', message)
def test_broadcast_track_favorite_to_instance_timeline_private(
def test_broadcast_track_favorite_to_instance_activity_private(
factories, mocker):
p = mocker.patch('funkwhale_api.common.channels.group_send')
favorite = factories['favorites.TrackFavorite'](
user__privacy_level='me'
)
data = serializers.TrackFavoriteActivitySerializer(favorite).data
consumer = activities.broadcast_track_favorite_to_instance_timeline
consumer = activities.broadcast_track_favorite_to_instance_activity
message = {
"type": 'event',
"data": data
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment