diff --git a/docs/API spec.md b/docs/API spec.md index 977f406..5d9d332 100644 --- a/docs/API spec.md +++ b/docs/API spec.md @@ -44,22 +44,19 @@ _ = rc_formatters.gettext logger = logging.getLogger("extensions.abusefilter") -class abusefilter(): - def __init__(self, api): - super().__init__(api) + +@formatter.embed(event="abuselog/modify", mode="embed") +def embed_modify(ctx: Context, change: dict) -> DiscordMessage: + embed = DiscordMessage(ctx.message_type, ctx.event, webhook_url=ctx.webhook_url) + embed.set_link(create_article_path("Special:AbuseFilter/history/{number}/diff/prev/{historyid}".format(number=change["logparams"]['newId'], historyid=change["logparams"]["historyId"]))) + embed["title"] = _("Edited abuse filter number {number}").format(number=change["logparams"]['newId']) + return embed - @formatter.embed(event="abuselog/modify", mode="embed") - def embed_modify(self, ctx: Context, change: dict) -> DiscordMessage: - embed = DiscordMessage(ctx.message_type, ctx.event, webhook_url=ctx.webhook_url) - embed.set_link(create_article_path("Special:AbuseFilter/history/{number}/diff/prev/{historyid}".format(number=change["logparams"]['newId'], historyid=change["logparams"]["historyId"]))) - embed["title"] = _("Edited abuse filter number {number}").format(number=change["logparams"]['newId']) - return embed - - @formatter.compact(event="abuselog/modify") - def embed_modify(self, ctx: Context, change: dict) -> DiscordMessage: - link = link_formatter(create_article_path("Special:AbuseFilter/history/{number}/diff/prev/{historyid}".format(number=change["logparams"]['newId'], historyid=change["logparams"]["historyId"]))) - content = _("[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})").format(author=author, author_url=author_url, number=change["logparams"]['newId'], filter_url=link) - return DiscordMessage +@formatter.compact(event="abuselog/modify") +def embed_modify(ctx: Context, change: dict) -> DiscordMessage: + link = link_formatter(create_article_path("Special:AbuseFilter/history/{number}/diff/prev/{historyid}".format(number=change["logparams"]['newId'], historyid=change["logparams"]["historyId"]))) + content = _("[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})").format(author=author, author_url=author_url, number=change["logparams"]['newId'], filter_url=link) + return DiscordMessage ``` diff --git a/extensions/base/mediawiki.py b/extensions/base/mediawiki.py index 9dfdd7e..6423a89 100644 --- a/extensions/base/mediawiki.py +++ b/extensions/base/mediawiki.py @@ -27,73 +27,69 @@ _ = rc_formatters.gettext logger = logging.getLogger("extensions.base") -class base(): - def __init__(self, api): - super().__init__(api) - - @formatter.embed(event="edit", mode="embed") - def embed_edit(self, ctx: Context, change: dict) -> DiscordMessage: - embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url) - action = ctx.event - editsize = change["newlen"] - change["oldlen"] - if editsize > 0: - if editsize > 6032: - embed["color"] = 65280 +@formatter.embed(event="edit", mode="embed") +def embed_edit(ctx: Context, change: dict) -> DiscordMessage: + embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url) + action = ctx.event + editsize = change["newlen"] - change["oldlen"] + if editsize > 0: + if editsize > 6032: + embed["color"] = 65280 + else: + embed["color"] = 35840 + (math.floor(editsize / 52)) * 256 + elif editsize < 0: + if editsize < -6032: + embed["color"] = 16711680 + else: + embed["color"] = 9175040 + (math.floor((editsize * -1) / 52)) * 65536 + elif editsize == 0: + embed["color"] = 8750469 + if change["title"].startswith("MediaWiki:Tag-"): # Refresh tag list when tag display name is edited + ctx.client.refresh_internal_data() + embed.set_link("{wiki}index.php?title={article}&curid={pageid}&diff={diff}&oldid={oldrev}".format( + wiki=ctx.client.WIKI_SCRIPT_PATH, pageid=change["pageid"], diff=change["revid"], oldrev=change["old_revid"], + article=change["title"].replace(" ", "_").replace("%", "%25").replace("\\", "%5C").replace("&", "%26"))) + embed["title"] = "{redirect}{article} ({new}{minor}{bot}{space}{editsize})".format( + redirect="⤷ " if "redirect" in change else "", article=change["title"], editsize="+" + str( + editsize) if editsize > 0 else editsize, new=_("(N!) ") if action == "new" else "", + minor=_("m") if action == "edit" and "minor" in change else "", bot=_('b') if "bot" in change else "", + space=" " if "bot" in change or (action == "edit" and "minor" in change) or action == "new" else "") + if settings["appearance"]["embed"]["show_edit_changes"]: + try: + if action == "new": + changed_content = ctx.client.make_api_request( + "{wiki}?action=compare&format=json&fromtext=&torev={diff}&topst=1&prop=diff".format( + wiki=ctx.client.WIKI_API_PATH, diff=change["revid"] + ), "compare", "*") else: - embed["color"] = 35840 + (math.floor(editsize / 52)) * 256 - elif editsize < 0: - if editsize < -6032: - embed["color"] = 16711680 - else: - embed["color"] = 9175040 + (math.floor((editsize * -1) / 52)) * 65536 - elif editsize == 0: - embed["color"] = 8750469 - if change["title"].startswith("MediaWiki:Tag-"): # Refresh tag list when tag display name is edited - ctx.client.refresh_internal_data() - link = "{wiki}index.php?title={article}&curid={pageid}&diff={diff}&oldid={oldrev}".format( - wiki=ctx.client.WIKI_SCRIPT_PATH, pageid=change["pageid"], diff=change["revid"], oldrev=change["old_revid"], - article=change["title"].replace(" ", "_").replace("%", "%25").replace("\\", "%5C").replace("&", "%26")) - embed["title"] = "{redirect}{article} ({new}{minor}{bot}{space}{editsize})".format( - redirect="⤷ " if "redirect" in change else "", article=change["title"], editsize="+" + str( - editsize) if editsize > 0 else editsize, new=_("(N!) ") if action == "new" else "", - minor=_("m") if action == "edit" and "minor" in change else "", bot=_('b') if "bot" in change else "", - space=" " if "bot" in change or (action == "edit" and "minor" in change) or action == "new" else "") - if settings["appearance"]["embed"]["show_edit_changes"]: - try: - if action == "new": - changed_content = ctx.client.make_api_request( - "{wiki}?action=compare&format=json&fromtext=&torev={diff}&topst=1&prop=diff".format( - wiki=ctx.client.WIKI_API_PATH, diff=change["revid"] - ), "compare", "*") + changed_content = ctx.client.make_api_request( + "{wiki}?action=compare&format=json&fromrev={oldrev}&torev={diff}&topst=1&prop=diff".format( + wiki=ctx.client.WIKI_API_PATH, diff=change["revid"], oldrev=change["old_revid"] + ), "compare", "*") + except ServerError: + changed_content = None + if changed_content: + EditDiff = ctx.client.content_parser() + EditDiff.feed(changed_content) + if EditDiff.small_prev_del: + if EditDiff.small_prev_del.replace("~~", "").isspace(): + EditDiff.small_prev_del = _('__Only whitespace__') else: - changed_content = ctx.client.make_api_request( - "{wiki}?action=compare&format=json&fromrev={oldrev}&torev={diff}&topst=1&prop=diff".format( - wiki=ctx.client.WIKI_API_PATH, diff=change["revid"], oldrev=change["old_revid"] - ), "compare", "*") - except (ServerError): - changed_content = None - if changed_content: - EditDiff = ctx.client.content_parser() - EditDiff.feed(changed_content) - if EditDiff.small_prev_del: - if EditDiff.small_prev_del.replace("~~", "").isspace(): - EditDiff.small_prev_del = _('__Only whitespace__') - else: - EditDiff.small_prev_del = EditDiff.small_prev_del.replace("~~~~", "") - if EditDiff.small_prev_ins: - if EditDiff.small_prev_ins.replace("**", "").isspace(): - EditDiff.small_prev_ins = _('__Only whitespace__') - else: - EditDiff.small_prev_ins = EditDiff.small_prev_ins.replace("****", "") - logger.debug("Changed content: {}".format(EditDiff.small_prev_ins)) - if EditDiff.small_prev_del and not action == "new": - embed.add_field(_("Removed"), "{data}".format(data=EditDiff.small_prev_del), inline=True) - if EditDiff.small_prev_ins: - embed.add_field(_("Added"), "{data}".format(data=EditDiff.small_prev_ins), inline=True) - else: - logger.warning("Unable to download data on the edit content!") - return embed + EditDiff.small_prev_del = EditDiff.small_prev_del.replace("~~~~", "") + if EditDiff.small_prev_ins: + if EditDiff.small_prev_ins.replace("**", "").isspace(): + EditDiff.small_prev_ins = _('__Only whitespace__') + else: + EditDiff.small_prev_ins = EditDiff.small_prev_ins.replace("****", "") + logger.debug("Changed content: {}".format(EditDiff.small_prev_ins)) + if EditDiff.small_prev_del and not action == "new": + embed.add_field(_("Removed"), "{data}".format(data=EditDiff.small_prev_del), inline=True) + if EditDiff.small_prev_ins: + embed.add_field(_("Added"), "{data}".format(data=EditDiff.small_prev_ins), inline=True) + else: + logger.warning("Unable to download data on the edit content!") + return embed - @formatter.compact(event="edit", mode="compact") - def compact_edit(self, ctx: Context, change: dict): - return DiscordMessage() +@formatter.compact(event="edit", mode="compact") +def compact_edit(ctx: Context, change: dict): + return DiscordMessage() diff --git a/src/api/context.py b/src/api/context.py index 365d0f7..f61c76e 100644 --- a/src/api/context.py +++ b/src/api/context.py @@ -23,4 +23,7 @@ class Context: self.event = None def set_categories(self, cats): - self.categories = cats \ No newline at end of file + self.categories = cats + + def set_parsedcomment(self, parsedcomment: str): + self.parsedcomment = parsedcomment \ No newline at end of file diff --git a/src/api/util.py b/src/api/util.py index 01aab94..ada568e 100644 --- a/src/api/util.py +++ b/src/api/util.py @@ -18,7 +18,9 @@ from typing import Optional, Callable from src.discord.message import DiscordMessage from src.configloader import settings import src.misc +import logging +logger = logging.getLogger("src.api.util") def default_message(event: str, formatter_hooks: dict) -> Callable: """Returns a method of a formatter responsible for the event or None if such does not exist.""" @@ -37,4 +39,45 @@ def escape_formatting(data: str) -> str: def create_article_path(article: str) -> str: """Takes the string and creates an URL with it as the article name""" - return src.misc.WIKI_ARTICLE_PATH.replace("$1", article) \ No newline at end of file + return src.misc.WIKI_ARTICLE_PATH.replace("$1", article) + + +def embed_helper(ctx, message: DiscordMessage, change: dict): + """Helps in preparing common edit/log fields for events. Sets up: + + author, author_url, icon""" + + def format_user(change, recent_changes, action): + if "anon" in change: + author_url = create_article_path("Special:Contributions/{user}".format( + user=change["user"].replace(" ", "_"))) # Replace here needed in case of #75 + logger.debug("current user: {} with cache of IPs: {}".format(change["user"], recent_changes.map_ips.keys())) + if change["user"] not in list(recent_changes.map_ips.keys()): + contibs = ctx.client.make_api_request( + "{wiki}?action=query&format=json&list=usercontribs&uclimit=max&ucuser={user}&ucstart={timestamp}&ucprop=".format( + wiki=ctx.client.WIKI_API_PATH, user=change["user"], timestamp=change["timestamp"]), "query", + "usercontribs") + if contibs is None: + logger.warning( + "WARNING: Something went wrong when checking amount of contributions for given IP address") + if settings.get("hide_ips", False): + change["user"] = _("Unregistered user") + change["user"] = change["user"] + "(?)" + else: + recent_changes.map_ips[change["user"]] = len(contibs) + logger.debug( + "Current params user {} and state of map_ips {}".format(change["user"], recent_changes.map_ips)) + if settings.get("hide_ips", False): + change["user"] = _("Unregistered user") + change["user"] = "{author} ({contribs})".format(author=change["user"], contribs=len(contibs)) + else: + logger.debug( + "Current params user {} and state of map_ips {}".format(change["user"], recent_changes.map_ips)) + if action in ("edit", "new"): + recent_changes.map_ips[change["user"]] += 1 + change["user"] = "{author} ({amount})".format( + author=change["user"] if settings.get("hide_ips", False) is False else _("Unregistered user"), + amount=recent_changes.map_ips[change["user"]]) + else: + author_url = create_article_path("User:{}".format(change["user"].replace(" ", "_"))) + message.set_author(change["user"], author_url) diff --git a/src/rcgcdw.py b/src/rcgcdw.py index 08f77a4..9b699cb 100644 --- a/src/rcgcdw.py +++ b/src/rcgcdw.py @@ -245,6 +245,7 @@ def rc_processor(change, changed_categories): parsed_comment = re.sub(r"(`|_|\*|~|{|}|\|\|)", "\\\\\\1", parsed_comment) else: parsed_comment = _("~~hidden~~") + context.set_parsedcomment(parsed_comment) if "userhidden" in change: change["user"] = _("hidden") if change.get("ns", -1) in settings.get("ignored_namespaces", ()): @@ -268,6 +269,7 @@ def abuselog_processing(entry, recent_changes): abuselog_appearance_mode(entry, recent_changes) +load_extensions() # Log in and download wiki information wiki = Wiki(rc_processor, abuselog_processing) client = src.api.client.Client(formatter_hooks, wiki) @@ -306,8 +308,6 @@ if 1 == 2: # additional translation strings in unreachable code _("autoreview"), _("autopatrol"), _("wiki_guardian"), ngettext("second", "seconds", 1), ngettext("minute", "minutes", 1), ngettext("hour", "hours", 1), ngettext("day", "days", 1), ngettext("week", "weeks", 1), ngettext("month", "months",1), ngettext("year", "years", 1), ngettext("millennium", "millennia", 1), ngettext("decade", "decades", 1), ngettext("century", "centuries", 1)) # noinspection PyUnreachableCode -load_extensions() - if TESTING: logger.debug("DEBUGGING ")