From 39c4fc991b5fbba29c852a10b53f8f80276ac5d0 Mon Sep 17 00:00:00 2001 From: Luna Date: Tue, 19 Feb 2019 18:54:20 -0300 Subject: [PATCH] add gdm channel destruction - channels: destroy pubsub channel when deleting a guild channel --- litecord/blueprints/channels.py | 18 +++++++++++++-- litecord/blueprints/dm_channels.py | 35 ++++++++++++++++++++++++++---- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/litecord/blueprints/channels.py b/litecord/blueprints/channels.py index 76324dd..f263f38 100644 --- a/litecord/blueprints/channels.py +++ b/litecord/blueprints/channels.py @@ -31,6 +31,9 @@ from litecord.schemas import ( from litecord.blueprints.checks import channel_check, channel_perm_check from litecord.system_messages import send_sys_message +from litecord.blueprints.dm_channels import ( + gdm_add_recipient, gdm_remove_recipient, gdm_destroy +) log = Logger(__name__) bp = Blueprint('channels', __name__) @@ -211,6 +214,8 @@ async def close_channel(channel_id): await app.dispatcher.dispatch_guild( guild_id, 'CHANNEL_DELETE', chan) + + await app.dispatcher.remove('channel', channel_id) return jsonify(chan) if ctype == ChannelType.DM: @@ -234,8 +239,17 @@ async def close_channel(channel_id): return jsonify(chan) if ctype == ChannelType.GROUP_DM: - # TODO: group dm - pass + await gdm_remove_recipient(channel_id, user_id) + + gdm_count = await app.db.fetchval(""" + SELECT COUNT(*) + FROM group_dm_members + WHERE id = $1 + """, channel_id) + + if gdm_count == 0: + # destroy dm + await gdm_destroy(channel_id) raise ChannelNotFound() diff --git a/litecord/blueprints/dm_channels.py b/litecord/blueprints/dm_channels.py index a79ed8b..192c12a 100644 --- a/litecord/blueprints/dm_channels.py +++ b/litecord/blueprints/dm_channels.py @@ -75,7 +75,7 @@ async def _gdm_create(user_id, peer_id) -> int: return channel_id -async def _gdm_add_recipient(channel_id: int, peer_id: int, *, user_id=None): +async def gdm_add_recipient(channel_id: int, peer_id: int, *, user_id=None): """Add a recipient to a Group DM. Dispatches: @@ -96,6 +96,7 @@ async def _gdm_add_recipient(channel_id: int, peer_id: int, *, user_id=None): await app.dispatcher.sub('channel', peer_id) + # TODO: if not user id, userid=peerid if user_id: await send_sys_message( app, channel_id, MessageType.RECIPIENT_ADD, @@ -103,7 +104,7 @@ async def _gdm_add_recipient(channel_id: int, peer_id: int, *, user_id=None): ) -async def _gdm_remove_recipient(channel_id: int, peer_id: int, *, user_id=None): +async def gdm_remove_recipient(channel_id: int, peer_id: int, *, user_id=None): """Remove a member from a GDM. Dispatches: @@ -134,6 +135,32 @@ async def _gdm_remove_recipient(channel_id: int, peer_id: int, *, user_id=None): ) +async def gdm_destroy(channel_id): + """Destroy a Group DM.""" + chan = await app.storage.get_channel(channel_id) + + await app.db.execute(""" + DELETE FROM group_dm_members + WHERE id = $1 + """, channel_id) + + await app.db.execute(""" + DELETE FROM group_dm_channels + WHERE id = $1 + """, channel_id) + + await app.db.execute(""" + DELETE FROM channels + WHERE id = $1 + """, channel_id) + + await app.dispatcher.dispatch( + 'channel', channel_id, 'CHANNEL_DELETE', chan + ) + + await app.dispatcher.remove('channel', channel_id) + + @bp.route('//recipients/', methods=['PUT']) async def add_to_group_dm(dm_chan, peer_id): """Adds a member to a group dm OR creates a group dm.""" @@ -160,7 +187,7 @@ async def add_to_group_dm(dm_chan, peer_id): user_id, other_id ) - await _gdm_add_recipient(dm_chan, peer_id, user_id=user_id) + await gdm_add_recipient(dm_chan, peer_id, user_id=user_id) return jsonify( await app.storage.get_channel(dm_chan) @@ -178,5 +205,5 @@ async def remove_from_group_dm(dm_chan, peer_id): if owner_id != user_id: raise Forbidden('You are now the owner of the group DM') - await _gdm_remove_recipient(dm_chan, peer_id) + await gdm_remove_recipient(dm_chan, peer_id) return '', 204