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