From b2be691cccca2f16768ecf6b870e91a303dc6f4d Mon Sep 17 00:00:00 2001 From: Frisk Date: Mon, 16 Nov 2020 23:09:34 +0100 Subject: [PATCH] Kinda finished working on message deletion? Needs testing and fix for the PATCH requests --- scripts/generate-translations.sh | 2 +- src/discord/message.py | 4 ++-- src/discord/queue.py | 2 +- src/discord/redaction.py | 25 +++++++++++++++++-------- src/fileio/database.py | 3 ++- src/i18n.py | 3 ++- src/message_redaction.py | 3 --- src/rc_formatters.py | 7 +++++++ 8 files changed, 32 insertions(+), 17 deletions(-) delete mode 100644 src/message_redaction.py diff --git a/scripts/generate-translations.sh b/scripts/generate-translations.sh index c67368e..e98ae14 100644 --- a/scripts/generate-translations.sh +++ b/scripts/generate-translations.sh @@ -1,5 +1,5 @@ cd .. -declare -a StringArray=("discussion_formatters" "rc_formatters" "rcgcdw" "rc" "misc") +declare -a StringArray=("discussion_formatters" "rc_formatters" "rcgcdw" "rc" "misc", "redaction") for file in ${StringArray[@]}; do xgettext -L Python --package-name=RcGcDw -o "locale/templates/$file.pot" src/$file.py done diff --git a/src/discord/message.py b/src/discord/message.py index 4bd2b2a..077c58b 100644 --- a/src/discord/message.py +++ b/src/discord/message.py @@ -72,9 +72,9 @@ class DiscordMessage: class DiscordMessageRaw(DiscordMessage): - def __init__(self, content: dict): + def __init__(self, content: dict, webhook_url: str): self.webhook_object = content - + self.webhook_url = webhook_url class DiscordMessageMetadata: def __init__(self, method, log_id = None, page_id = None, rev_id = None, webhook_url = None, new_data = None): diff --git a/src/discord/queue.py b/src/discord/queue.py index 4eb0013..4bc42dd 100644 --- a/src/discord/queue.py +++ b/src/discord/queue.py @@ -121,7 +121,7 @@ def send_to_discord_webhook(data: Optional[DiscordMessage], metadata: DiscordMes elif metadata.method == "DELETE": req = requests.Request("DELETE", metadata.webhook_url, **standard_args) elif metadata.method == "PATCH": - req = requests.Request("PATCH", metadata.webhook_url, data=data, **standard_args) + req = requests.Request("PATCH", data.webhook_url, data=repr(data), **standard_args) try: time.sleep(rate_limit) rate_limit = 0 diff --git a/src/discord/redaction.py b/src/discord/redaction.py index 48c248a..47232f8 100644 --- a/src/discord/redaction.py +++ b/src/discord/redaction.py @@ -1,11 +1,14 @@ import logging - +import json from src.configloader import settings from src.discord.message import DiscordMessageMetadata, DiscordMessage, DiscordMessageRaw from src.discord.queue import send_to_discord, messagequeue from src.fileio.database import db_cursor, db_connection +from src.i18n import redaction as redaction_translation -logger = logging.getLogger("rcgcdw.discord.redaction") +logger = logging.getLogger("rcgcdw.discord.redaction") # TODO Figure out why does this logger do not work +_ = redaction_translation.gettext +#ngettext = redaction_translation.ngettext def delete_messages(matching_data: dict): @@ -38,24 +41,30 @@ def redact_messages(ids: list, entry_type: int, to_censor: dict): to_censor: dict - logparams of message parts to censor""" for event_id in ids: if entry_type == 0: # TODO check if queries are proper - message = db_cursor.execute("SELECT content FROM messages INNER JOIN event ON event.msg_id = messages.message_id WHERE event.revid = ?;", event_id) + message = db_cursor.execute("SELECT content FROM messages INNER JOIN event ON event.msg_id = messages.message_id WHERE event.revid = ?;", (event_id, )) else: message = db_cursor.execute( "SELECT content FROM messages INNER JOIN event ON event.msg_id = messages.message_id WHERE event.logid = ?;", - event_id) + (event_id,)) if settings["appearance"]["mode"] == "embed": if message is not None: message = message.fetchone() - new_embed = message["embeds"][0] + try: + message = json.loads(message[0]) + new_embed = message["embeds"][0] + except ValueError: + logger.error("Couldn't loads JSON for message data. What happened? Data: {}".format(message[0])) + return if "user" in to_censor: new_embed["author"]["name"] = _("Removed") new_embed["author"].pop("url") if "action" in to_censor: new_embed["title"] = _("Removed") new_embed.pop("url") + if "content" in to_censor: + new_embed.pop("fields") if "comment" in to_censor: new_embed["description"] = _("Removed") message["embeds"][0] = new_embed - send_to_discord(DiscordMessageRaw(message), DiscordMessageMetadata("PATCH")) - - raise NotImplemented + logger.debug(message) + send_to_discord(DiscordMessageRaw(message, settings["webhookURL"]), DiscordMessageMetadata("PATCH")) diff --git a/src/fileio/database.py b/src/fileio/database.py index 99126f9..36dac2d 100644 --- a/src/fileio/database.py +++ b/src/fileio/database.py @@ -1,5 +1,6 @@ import sqlite3 import logging +import json from src.configloader import settings logger = logging.getLogger("rcgcdw.fileio.database") @@ -44,7 +45,7 @@ def check_tables(): def add_entry(pageid: int, revid: int, logid: int, message): """Add an edit or log entry to the DB""" - db_cursor.execute("INSERT INTO messages (message_id, content) VALUES (?, ?)", (message.get("id"), str(message))) + db_cursor.execute("INSERT INTO messages (message_id, content) VALUES (?, ?)", (message.get("id"), json.dumps(message))) db_cursor.execute("INSERT INTO event (pageid, revid, logid, msg_id) VALUES (?, ?, ?, ?)", (pageid, revid, logid, message.get("id"))) logger.debug("Adding an entry to the database (pageid: {}, revid: {}, logid: {}, message: {})".format(pageid, revid, logid, message)) db_connection.commit() diff --git a/src/i18n.py b/src/i18n.py index ec08ca8..1f43c4c 100644 --- a/src/i18n.py +++ b/src/i18n.py @@ -11,8 +11,9 @@ try: rc = gettext.translation('rc', localedir='locale', languages=[settings["lang"]]) rc_formatters = gettext.translation('rc_formatters', localedir='locale', languages=[settings["lang"]]) misc = gettext.translation('misc', localedir='locale', languages=[settings["lang"]]) + redaction = gettext.translation('redaction', localedir='locale', languages=[settings["lang"]]) else: - rcgcdw, discussion_formatters, rc, rc_formatters, misc = gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations() + rcgcdw, discussion_formatters, rc, rc_formatters, misc, redaction = gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations(), gettext.NullTranslations() except FileNotFoundError: logger.critical("No language files have been found. Make sure locale folder is located in the directory.") sys.exit(1) diff --git a/src/message_redaction.py b/src/message_redaction.py deleted file mode 100644 index b28b04f..0000000 --- a/src/message_redaction.py +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/rc_formatters.py b/src/rc_formatters.py index a4e003c..7973cde 100644 --- a/src/rc_formatters.py +++ b/src/rc_formatters.py @@ -738,6 +738,13 @@ def embed_formatter(action, change, parsed_comment, categories, recent_changes): embed["title"] = ngettext("Changed visibility of revision on page {article} ", "Changed visibility of {amount} revisions on page {article} ", amount).format( article=change["title"], amount=amount) + if AUTO_SUPPRESSION_ENABLED: + try: + logparams = change["logparams"] + except KeyError: + pass + else: + redact_messages(logparams.get("ids", []), 0, logparams.get("new", {})) elif action == "import/upload": link = create_article_path(change["title"]) embed["title"] = ngettext("Imported {article} with {count} revision",