diff --git a/nomen/notifications.py b/nomen/notifications.py index 970f5ca..9d9bc89 100644 --- a/nomen/notifications.py +++ b/nomen/notifications.py @@ -132,6 +132,13 @@ async def handle_triggers(ctx, message): db_updates = [] search_query = """ + WITH + pauses AS (SELECT user_id FROM user_pauses WHERE guild_id=:guild), + ignores AS ( + SELECT target, user_id FROM user_ignores WHERE guild_id=:guild + UNION + SELECT target, user_id FROM user_blocks + ) SELECT keyword, user_id, use_embed FROM ( -- Deduplicate notification recipients by user_id SELECT keyword, user_id, use_embed, row_number() over (partition by user_id) n @@ -140,14 +147,11 @@ async def handle_triggers(ctx, message): WHERE likely(disabled IS NOT 1) -- Don't notify users who opted out AND (unlikely(notify_self IS 1) OR user_id IS NOT :author) -- Don't notify author unless wanted AND (unlikely(bots_notify IS 1) OR :is_bot IS NOT 1) -- Don't notify from bots unless wanted - AND likely(NOT EXISTS(SELECT * FROM ( -- Don't notify if... - SELECT target FROM user_ignores -- Author or channel is ignored in this guild - WHERE user_id=user_id AND guild_id=:guild - UNION - SELECT target FROM user_blocks -- Author is blocked - WHERE user_id=user_id - ) WHERE target IN (:author, :channel, :category, :parent))) - AND likely(NOT EXISTS(SELECT * FROM user_pauses WHERE user_id=user_id AND guild_id=:guild)) + AND likely(:author NOT IN (SELECT target FROM ignores WHERE user_id=user_id)) + AND likely(:channel NOT IN (SELECT target FROM ignores WHERE user_id=user_id)) + AND likely(:category NOT IN (SELECT target FROM ignores WHERE user_id=user_id)) + AND likely(:parent NOT IN (SELECT target FROM ignores WHERE user_id=user_id)) + AND likely(user_id NOT IN pauses) AND guild_id=:guild AND unlikely(contains(:content, keyword, regex)) ) WHERE n=1