diff --git a/api/config/routing.py b/api/config/routing.py index 249bf51a8..574d5a18e 100644 --- a/api/config/routing.py +++ b/api/config/routing.py @@ -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), ]) ), }) diff --git a/api/funkwhale_api/common/channels.py b/api/funkwhale_api/common/channels.py index a2f85ee4e..a009ab5ab 100644 --- a/api/funkwhale_api/common/channels.py +++ b/api/funkwhale_api/common/channels.py @@ -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) diff --git a/api/funkwhale_api/common/consumers.py b/api/funkwhale_api/common/consumers.py index 26e57fc8a..300ce5e26 100644 --- a/api/funkwhale_api/common/consumers.py +++ b/api/funkwhale_api/common/consumers.py @@ -1,4 +1,5 @@ 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) diff --git a/api/funkwhale_api/favorites/activities.py b/api/funkwhale_api/favorites/activities.py index a9deef552..a2dbc4e2f 100644 --- a/api/funkwhale_api/favorites/activities.py +++ b/api/funkwhale_api/favorites/activities.py @@ -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 }) diff --git a/api/funkwhale_api/instance/consumers.py b/api/funkwhale_api/instance/consumers.py new file mode 100644 index 000000000..eee5f7f0e --- /dev/null +++ b/api/funkwhale_api/instance/consumers.py @@ -0,0 +1,8 @@ +from funkwhale_api.common.consumers import JsonAuthConsumer + + +class InstanceActivityConsumer(JsonAuthConsumer): + groups = ["instance_activity"] + + def event_send(self, message): + self.send_json(message['data']) diff --git a/api/funkwhale_api/music/consumers.py b/api/funkwhale_api/music/consumers.py deleted file mode 100644 index 452346d19..000000000 --- a/api/funkwhale_api/music/consumers.py +++ /dev/null @@ -1,17 +0,0 @@ -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) diff --git a/api/tests/favorites/test_activity.py b/api/tests/favorites/test_activity.py index 84778fd0f..74695ed8d 100644 --- a/api/tests/favorites/test_activity.py +++ b/api/tests/favorites/test_activity.py @@ -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