From 2322c2603c6319f132d732ba90a6ecca402e33d2 Mon Sep 17 00:00:00 2001 From: Luna Date: Tue, 18 Jun 2019 16:42:08 -0300 Subject: [PATCH] guilds: add message contexts - guilds: fix fetch_readable_channels() --- litecord/blueprints/guilds.py | 41 +++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/litecord/blueprints/guilds.py b/litecord/blueprints/guilds.py index 9535367..e3938f0 100644 --- a/litecord/blueprints/guilds.py +++ b/litecord/blueprints/guilds.py @@ -391,7 +391,7 @@ async def fetch_readable_channels(guild_id: int, user_id: int) -> List[int]: for channel_id in channel_ids: perms = await get_permissions(user_id, channel_id) - if perms.read_messages: + if perms.bits.read_messages: res.append(channel_id) return res @@ -416,30 +416,39 @@ async def search_messages(guild_id): can_read = await fetch_readable_channels(guild_id, user_id) rows = await app.db.fetch(f""" - SELECT messages.id, - COUNT(*) OVER() as total_results - FROM messages + SELECT orig.id AS current_id, + COUNT(*) OVER() as total_results, + array((SELECT messages.id AS before_id + FROM messages WHERE messages.id < orig.id + ORDER BY messages.id DESC LIMIT 2)) AS before, + array((SELECT messages.id AS after_id + FROM messages WHERE messages.id > orig.id + ORDER BY messages.id ASC LIMIT 2)) AS after + + FROM messages AS orig WHERE guild_id = $1 - AND messages.content LIKE '%'||$2||'%' - AND ARRAY[messages.channel_id] <@ $4::bigint[] - ORDER BY messages.id DESC + AND orig.content LIKE '%'||$2||'%' + AND ARRAY[orig.channel_id] <@ $4::bigint[] + ORDER BY orig.id DESC LIMIT 50 OFFSET $3 """, guild_id, j['content'], j['offset'], can_read) results = 0 if not rows else rows[0]['total_results'] - main_messages = [r['id'] for r in rows] - - # fetch contexts for each message - # (2 messages before, 2 messages after). - - # TODO: actual contexts res = [] - for message_id in main_messages: - msg = await app.storage.get_message(message_id) + for row in rows: + before, after = [], [] + + for before_id in reversed(row['before']): + before.append(await app.storage.get_message(before_id)) + + for after_id in row['after']: + after.append(await app.storage.get_message(after_id)) + + msg = await app.storage.get_message(row['current_id']) msg['hit'] = True - res.append([msg]) + res.append(before + [msg] + after) return jsonify({ 'total_results': results,