From e042b9174854db5a4c04ff85e8b94bbe579f970a Mon Sep 17 00:00:00 2001 From: MarkusRost <2701034-MarkusRost@users.noreply.gitlab.com> Date: Wed, 26 May 2021 10:46:14 +0000 Subject: [PATCH 1/7] Don't try to follow the logic, you can't --- extensions/hooks/edit_alerts.py | 124 ++++++++++++++++++++++++++++++++ extensions/hooks/usertalk.py | 5 +- 2 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 extensions/hooks/edit_alerts.py diff --git a/extensions/hooks/edit_alerts.py b/extensions/hooks/edit_alerts.py new file mode 100644 index 0000000..4086fed --- /dev/null +++ b/extensions/hooks/edit_alerts.py @@ -0,0 +1,124 @@ +# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw). +# +# RcGcDw is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# RcGcDw is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with RcGcDw. If not, see . + +from src.api.hook import post_hook +from src.configloader import settings + +# { +# "hooks": { +# "edit_alerts": [ +# { +# "content": "DISCORD MARKDOWN TEXT", +# "allowed_mentions": { +# "users": ["USERID"], +# "roles": ["ROLEID"] +# }, +# "requirements": [ +# { +# "action": [ +# "edit", +# "delete/delete", +# "delete" +# ], +# "user": [ +# "USERNAME", +# "@__anon__", +# "@__user__" +# ], +# "title": [ +# "PAGETITLE" +# ], +# "tags": [ +# ["EDIT TAG", "AND EDIT TAG"], +# ["OR EDIT TAG"] +# ], +# "categories": [ +# { +# "added": [ +# ["CATEGORY", "AND CATEGORY"], +# ["OR CATEGORY"] +# ], +# "removed": [ +# ["CATEGORY", "AND CATEGORY"], +# ["OR CATEGORY"] +# ] +# } +# ] +# } +# ] +# } +# ] +# } +# } +edit_alerts = settings.get("hooks", {}).get("edit_alerts", []) + +@post_hook +def edit_alerts_hook(message, metadata, context, change): + for alert in edit_alerts: + for requirement in alert.get("requirements", []): + reqAction = requirement.get("action", []) + if reqAction and context.event not in reqAction and context.event.split('/', 1)[0] not in reqAction: + continue + reqUser = requirement.get("user", []) + if reqUser and change["user"] not in reqUser and ("@__anon__" if "anon" in change else "@__user__") not in reqUser: + continue + reqTitle = requirement.get("title", []) + if reqTitle and change["title"] not in reqTitle: + continue + if requirement.get("tags", []): + for reqTags in requirement.get("tags", []): + for reqTag in reqTags: + if reqTag not in change.get("tags", []): + break + else: + break + else: + continue + if requirement.get("categories", []): + for reqCats in requirement.get("categories", []): + if reqCats.get("added", []): + for addedCats in reqCats.get("added", []): + for addedCat in addedCats: + if addedCat not in context.categories.new: + break + else: + break + else: + continue + if reqCats.get("removed", []): + for removedCats in reqCats.get("removed", []): + for removedCat in removedCats: + if removedCat not in context.categories.removed: + break + else: + break + else: + continue + break + else: + continue + break + else: + continue + message.webhook_object["content"] = (message.webhook_object.get("content", "") or "") + alert["content"] + allowed_mentions = message.webhook_object["allowed_mentions"] + if alert.get("allowed_mentions", {}).get("users", []): + if not allowed_mentions.get("users", []): + allowed_mentions["users"] = [] + allowed_mentions["users"].extend(alert["allowed_mentions"]["users"]) + if alert.get("allowed_mentions", {}).get("roles", []): + if not allowed_mentions.get("roles", []): + allowed_mentions["roles"] = [] + allowed_mentions["roles"].extend(alert["allowed_mentions"]["roles"]) diff --git a/extensions/hooks/usertalk.py b/extensions/hooks/usertalk.py index cffd44f..75911aa 100644 --- a/extensions/hooks/usertalk.py +++ b/extensions/hooks/usertalk.py @@ -26,12 +26,13 @@ from src.configloader import settings discord_users = settings.get("hooks", {}).get("usertalk", {}) @post_hook -def example_post_hook(message, metadata, context, change): +def usertalk_hook(message, metadata, context, change): if discord_users and change["ns"] in [2, 3, 202] and not "/" in change["title"]: username = change["title"].split(':', 1)[1] if discord_users.get(username, "") and username != change["user"]: message.webhook_object["content"] = (message.webhook_object.get("content", "") or "") + " <@{}>".format(discord_users[username]) if message.webhook_object["allowed_mentions"].get("users", []): - message.webhook_object["allowed_mentions"]["users"].append(discord_users[username]) + if discord_users[username] not in message.webhook_object["allowed_mentions"]["users"]: + message.webhook_object["allowed_mentions"]["users"].append(discord_users[username]) else: message.webhook_object["allowed_mentions"]["users"] = [discord_users[username]] From 6a8a67e9c54bef7eff55004615cb3f75c2291493 Mon Sep 17 00:00:00 2001 From: Frisk Date: Wed, 26 May 2021 14:36:02 +0200 Subject: [PATCH 2/7] Simplification --- extensions/hooks/edit_alerts.py | 77 +++++++++++++++------------------ 1 file changed, 36 insertions(+), 41 deletions(-) diff --git a/extensions/hooks/edit_alerts.py b/extensions/hooks/edit_alerts.py index 4086fed..a71d1b7 100644 --- a/extensions/hooks/edit_alerts.py +++ b/extensions/hooks/edit_alerts.py @@ -64,52 +64,47 @@ from src.configloader import settings # } edit_alerts = settings.get("hooks", {}).get("edit_alerts", []) + +class RequirementNotMet(Exception): + pass + + +def check_group_requirements(change_data: list, settings_data: list): + """This function resolves group discussions and raises RequirementNotMet when requirement is not met""" + if settings_data: + for required_group in settings_data: + for required_item in required_group: + if required_item not in change_data: + raise RequirementNotMet + + @post_hook def edit_alerts_hook(message, metadata, context, change): + # For every alert in edit_alerts, they can have different functions and so on for alert in edit_alerts: + # For every requirement, if one of the requirements passes the alert gets executed for requirement in alert.get("requirements", []): - reqAction = requirement.get("action", []) - if reqAction and context.event not in reqAction and context.event.split('/', 1)[0] not in reqAction: + try: + req_action = requirement.get("action", []) + # If current action isn't in config for this requirement AND current event type is not in the requirements in settings skip this requirement + if req_action and context.event not in req_action and context.event.split('/', 1)[0] not in req_action: + raise RequirementNotMet + req_user = requirement.get("user", []) + # If current user is not in config AND checkings for anon and user fail + if req_user and change["user"] not in req_user and ("@__anon__" if "anon" in change else "@__user__") not in req_user: + raise RequirementNotMet + req_title = requirement.get("title", []) + if req_title and change["title"] not in req_title: + raise RequirementNotMet + check_group_requirements(change.get("tags", []), requirement.get("tags", [])) + if requirement.get("categories", []): + for reqCats in requirement.get("categories", []): + check_group_requirements(context.categories.new, reqCats.get("added", [])) + check_group_requirements(context.categories.new, reqCats.get("removed", [])) + except RequirementNotMet: continue - reqUser = requirement.get("user", []) - if reqUser and change["user"] not in reqUser and ("@__anon__" if "anon" in change else "@__user__") not in reqUser: - continue - reqTitle = requirement.get("title", []) - if reqTitle and change["title"] not in reqTitle: - continue - if requirement.get("tags", []): - for reqTags in requirement.get("tags", []): - for reqTag in reqTags: - if reqTag not in change.get("tags", []): - break - else: - break - else: - continue - if requirement.get("categories", []): - for reqCats in requirement.get("categories", []): - if reqCats.get("added", []): - for addedCats in reqCats.get("added", []): - for addedCat in addedCats: - if addedCat not in context.categories.new: - break - else: - break - else: - continue - if reqCats.get("removed", []): - for removedCats in reqCats.get("removed", []): - for removedCat in removedCats: - if removedCat not in context.categories.removed: - break - else: - break - else: - continue - break - else: - continue - break + else: + break else: continue message.webhook_object["content"] = (message.webhook_object.get("content", "") or "") + alert["content"] From ad7b0fd207206e1c3306213fdcc286ea0b27be55 Mon Sep 17 00:00:00 2001 From: Frisk Date: Wed, 26 May 2021 14:42:06 +0200 Subject: [PATCH 3/7] Fixed copy-paste error --- extensions/hooks/edit_alerts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/hooks/edit_alerts.py b/extensions/hooks/edit_alerts.py index a71d1b7..87105e7 100644 --- a/extensions/hooks/edit_alerts.py +++ b/extensions/hooks/edit_alerts.py @@ -100,7 +100,7 @@ def edit_alerts_hook(message, metadata, context, change): if requirement.get("categories", []): for reqCats in requirement.get("categories", []): check_group_requirements(context.categories.new, reqCats.get("added", [])) - check_group_requirements(context.categories.new, reqCats.get("removed", [])) + check_group_requirements(context.categories.removed, reqCats.get("removed", [])) except RequirementNotMet: continue else: From 69efcf26507de0b1732bac9363f350aa71dd656b Mon Sep 17 00:00:00 2001 From: Frisk Date: Wed, 26 May 2021 15:38:36 +0200 Subject: [PATCH 4/7] Fixed both issues, partially returned the older code --- extensions/hooks/edit_alerts.py | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/extensions/hooks/edit_alerts.py b/extensions/hooks/edit_alerts.py index 87105e7..c0f0252 100644 --- a/extensions/hooks/edit_alerts.py +++ b/extensions/hooks/edit_alerts.py @@ -66,6 +66,7 @@ edit_alerts = settings.get("hooks", {}).get("edit_alerts", []) class RequirementNotMet(Exception): + """Exception raised when the requirement is not met and another requirement must be processed""" pass @@ -73,9 +74,11 @@ def check_group_requirements(change_data: list, settings_data: list): """This function resolves group discussions and raises RequirementNotMet when requirement is not met""" if settings_data: for required_group in settings_data: - for required_item in required_group: - if required_item not in change_data: - raise RequirementNotMet + # test all items in required_group are in change_data (one group fulfills the requirement) return the function + if all([required_item in change_data for required_item in required_group]): + return + raise RequirementNotMet + @post_hook @@ -98,9 +101,26 @@ def edit_alerts_hook(message, metadata, context, change): raise RequirementNotMet check_group_requirements(change.get("tags", []), requirement.get("tags", [])) if requirement.get("categories", []): - for reqCats in requirement.get("categories", []): - check_group_requirements(context.categories.new, reqCats.get("added", [])) - check_group_requirements(context.categories.removed, reqCats.get("removed", [])) + for req_cats in requirement.get("categories", []): + if req_cats.get("added", []): + for added_cats in req_cats.get("added", []): + for added_cat in added_cats: + if added_cat not in context.categories.new: + break + else: + break + else: + raise RequirementNotMet + if req_cats.get("removed", []): + for removed_cats in req_cats.get("removed", []): + for removed_cat in removed_cats: + if removed_cat not in context.categories.removed: + break + else: + break + else: + raise RequirementNotMet + break except RequirementNotMet: continue else: From 139385bd80cca61af7cef55653f5cb4fdb2f9bbf Mon Sep 17 00:00:00 2001 From: MarkusRost <2701034-MarkusRost@users.noreply.gitlab.com> Date: Wed, 26 May 2021 13:46:59 +0000 Subject: [PATCH 5/7] use function again --- extensions/hooks/edit_alerts.py | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/extensions/hooks/edit_alerts.py b/extensions/hooks/edit_alerts.py index c0f0252..a96582a 100644 --- a/extensions/hooks/edit_alerts.py +++ b/extensions/hooks/edit_alerts.py @@ -102,25 +102,15 @@ def edit_alerts_hook(message, metadata, context, change): check_group_requirements(change.get("tags", []), requirement.get("tags", [])) if requirement.get("categories", []): for req_cats in requirement.get("categories", []): - if req_cats.get("added", []): - for added_cats in req_cats.get("added", []): - for added_cat in added_cats: - if added_cat not in context.categories.new: - break - else: - break - else: - raise RequirementNotMet - if req_cats.get("removed", []): - for removed_cats in req_cats.get("removed", []): - for removed_cat in removed_cats: - if removed_cat not in context.categories.removed: - break - else: - break - else: - raise RequirementNotMet - break + try: + check_group_requirements(context.categories.new, reqCats.get("added", [])) + check_group_requirements(context.categories.removed, reqCats.get("removed", [])) + except RequirementNotMet: + continue + else: + break + else: + raise RequirementNotMet except RequirementNotMet: continue else: From 0cd1b7ad74ba646df21d706b9a36e0305666b7cc Mon Sep 17 00:00:00 2001 From: MarkusRost <2701034-MarkusRost@users.noreply.gitlab.com> Date: Wed, 26 May 2021 14:06:16 +0000 Subject: [PATCH 6/7] make function readable, fix copy paste error --- extensions/hooks/edit_alerts.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/extensions/hooks/edit_alerts.py b/extensions/hooks/edit_alerts.py index a96582a..005fb05 100644 --- a/extensions/hooks/edit_alerts.py +++ b/extensions/hooks/edit_alerts.py @@ -75,9 +75,12 @@ def check_group_requirements(change_data: list, settings_data: list): if settings_data: for required_group in settings_data: # test all items in required_group are in change_data (one group fulfills the requirement) return the function - if all([required_item in change_data for required_item in required_group]): - return - raise RequirementNotMet + for required_item in required_group: + if required_item not in change_data: + continue + break + else: + raise RequirementNotMet @@ -103,8 +106,8 @@ def edit_alerts_hook(message, metadata, context, change): if requirement.get("categories", []): for req_cats in requirement.get("categories", []): try: - check_group_requirements(context.categories.new, reqCats.get("added", [])) - check_group_requirements(context.categories.removed, reqCats.get("removed", [])) + check_group_requirements(context.categories.new, req_cats.get("added", [])) + check_group_requirements(context.categories.removed, req_cats.get("removed", [])) except RequirementNotMet: continue else: From 2aa17a7d36deda899dbbe99840403eb55f7c5e37 Mon Sep 17 00:00:00 2001 From: MarkusRost <2701034-MarkusRost@users.noreply.gitlab.com> Date: Wed, 26 May 2021 14:09:29 +0000 Subject: [PATCH 7/7] fix function --- extensions/hooks/edit_alerts.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extensions/hooks/edit_alerts.py b/extensions/hooks/edit_alerts.py index 005fb05..4339aff 100644 --- a/extensions/hooks/edit_alerts.py +++ b/extensions/hooks/edit_alerts.py @@ -77,8 +77,9 @@ def check_group_requirements(change_data: list, settings_data: list): # test all items in required_group are in change_data (one group fulfills the requirement) return the function for required_item in required_group: if required_item not in change_data: - continue - break + break + else: + break else: raise RequirementNotMet