diff --git a/extensions/base/__init__.py b/extensions/base/__init__.py
index d2fffcb..2feb663 100644
--- a/extensions/base/__init__.py
+++ b/extensions/base/__init__.py
@@ -14,3 +14,4 @@
# along with RcGcDw. If not, see .
import extensions.base.mediawiki
+import extensions.base.abusefilter
diff --git a/extensions/base/cargo.py b/extensions/base/cargo.py
new file mode 100644
index 0000000..824dc3e
--- /dev/null
+++ b/extensions/base/cargo.py
@@ -0,0 +1,115 @@
+# 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 .
+
+import logging
+import re
+from src.discord.message import DiscordMessage
+from src.api import formatter
+from src.i18n import rc_formatters
+from src.api.context import Context
+from src.api.util import embed_helper, compact_author, create_article_path, sanitize_to_markdown
+
+_ = rc_formatters.gettext
+ngettext = rc_formatters.ngettext
+
+
+# Cargo - https://www.mediawiki.org/wiki/Extension:Cargo
+# cargo/createtable - Creation of Cargo table
+
+@formatter.embed(event="cargo/createtable")
+def embed_cargo_createtable(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ table = re.search(r"\[(.*?)]\(<(.*?)>\)", ctx.client.parse_links(change["logparams"]["0"]))
+ embed["url"] = table.group(2)
+ embed["title"] = _("Created the Cargo table \"{table}\"").format(table=table.group(1))
+ return embed
+
+
+@formatter.compact(event="cargo/createtable")
+def compact_cargo_createtable(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ table = re.search(r"\[(.*?)]\(<(.*?)>\)", ctx.client.parse_links(change["logparams"]["0"]))
+ content = _("[{author}]({author_url}) created the Cargo table \"{table}\"").format(author=author,
+ author_url=author_url,
+ table=table)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# cargo/recreatetable
+
+
+@formatter.embed(event="cargo/recreatetable")
+def embed_cargo_recreatetable(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ table = re.search(r"\[(.*?)]\(<(.*?)>\)", ctx.client.parse_links(change["logparams"]["0"]))
+ embed["url"] = table.group(2)
+ embed["title"] = _("Recreated the Cargo table \"{table}\"").format(table=table.group(1))
+ return embed
+
+
+@formatter.compact(event="cargo/recreatetable")
+def compact_cargo_recreatetable(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ table = re.search(r"\[(.*?)]\(<(.*?)>\)", ctx.client.parse_links(change["logparams"]["0"]))
+ content = _("[{author}]({author_url}) recreated the Cargo table \"{table}\"").format(author=author,
+ author_url=author_url,
+ table=table)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# cargo/replacetable
+
+
+@formatter.embed(event="cargo/replacetable")
+def embed_cargo_replacetable(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ table = re.search(r"\[(.*?)]\(<(.*?)>\)", ctx.client.parse_links(change["logparams"]["0"]))
+ embed["url"] = table.group(2)
+ embed["title"] = _("Replaced the Cargo table \"{table}\"").format(table=table.group(1))
+ return embed
+
+
+@formatter.compact(event="cargo/recreatetable")
+def compact_cargo_replacetable(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ table = re.search(r"\[(.*?)]\(<(.*?)>\)", ctx.client.parse_links(change["logparams"]["0"]))
+ content = _("[{author}]({author_url}) replaced the Cargo table \"{table}\"").format(author=author,
+ author_url=author_url,
+ table=table)
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
+
+
+# cargo/deletetable
+
+
+@formatter.embed(event="cargo/deletetable")
+def embed_cargo_deletetable(ctx: Context, change: dict):
+ embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
+ embed_helper(ctx, embed, change)
+ embed["url"] = create_article_path("Special:CargoTables")
+ embed["title"] = _("Deleted the Cargo table \"{table}\"").format(table=sanitize_to_markdown(change["logparams"]["0"]))
+ return embed
+
+
+@formatter.compact(event="cargo/recreatetable")
+def compact_cargo_deletetable(ctx: Context, change: dict):
+ author, author_url = compact_author(ctx, change)
+ content = _("[{author}]({author_url}) deleted the Cargo table \"{table}\"").format(author=author,
+ author_url=author_url,
+ table=sanitize_to_markdown(change["logparams"]["0"]))
+ return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
diff --git a/src/api/client.py b/src/api/client.py
index 8e047ed..d290349 100644
--- a/src/api/client.py
+++ b/src/api/client.py
@@ -23,7 +23,6 @@ from typing import TYPE_CHECKING
if TYPE_CHECKING:
from src.wiki import Wiki
-
class Client:
"""
A client for interacting with RcGcDw when creating formatters or hooks.
@@ -31,19 +30,25 @@ class Client:
def __init__(self, hooks, wiki):
self._formatters = hooks
self.__recent_changes: Wiki = wiki
- self.WIKI_API_PATH = src.misc.WIKI_API_PATH
- self.WIKI_ARTICLE_PATH = src.misc.WIKI_ARTICLE_PATH
- self.WIKI_SCRIPT_PATH = src.misc.WIKI_SCRIPT_PATH
- self.WIKI_JUST_DOMAIN = src.misc.WIKI_JUST_DOMAIN
+ self.WIKI_API_PATH: str = src.misc.WIKI_API_PATH
+ self.WIKI_ARTICLE_PATH: str = src.misc.WIKI_ARTICLE_PATH
+ self.WIKI_SCRIPT_PATH: str = src.misc.WIKI_SCRIPT_PATH
+ self.WIKI_JUST_DOMAIN: str = src.misc.WIKI_JUST_DOMAIN
self.content_parser = src.misc.ContentParser
self.tags = self.__recent_changes.tags
self.namespaces = self.__recent_changes.namespaces
+ self.LinkParser: type(src.misc.LinkParser) = src.misc.LinkParser
#self.make_api_request: src.rc.wiki.__recent_changes.api_request = self.__recent_changes.api_request
def refresh_internal_data(self):
"""Refreshes internal storage data for wiki tags and MediaWiki messages."""
self.__recent_changes.init_info()
+ def parse_links(self, summary: str):
+ link_parser = self.LinkParser()
+ link_parser.feed(summary)
+ return link_parser.new_string
+
def make_api_request(self, params: Union[str, OrderedDict], *json_path: str, timeout: int = 10, allow_redirects: bool = False):
"""Method to GET request data from the wiki's API with error handling including recognition of MediaWiki errors.
diff --git a/src/rc_formatters.py b/src/rc_formatters.py
index 1fa3d9f..c46cc04 100644
--- a/src/rc_formatters.py
+++ b/src/rc_formatters.py
@@ -229,22 +229,13 @@ def compact_formatter(action, change, parsed_comment, categories, recent_changes
link = link_formatter(create_article_path(change["title"]))
content = _("[{author}]({author_url}) edited the slice for [{article}]({article_url})").format(author=author, author_url=author_url, article=change["title"], article_url=link)
elif action == "cargo/createtable":
- LinkParser.feed(change["logparams"]["0"])
- table = LinkParser.new_string
- LinkParser.new_string = ""
- content = _("[{author}]({author_url}) created the Cargo table \"{table}\"").format(author=author, author_url=author_url, table=table)
+
elif action == "cargo/deletetable":
- content = _("[{author}]({author_url}) deleted the Cargo table \"{table}\"").format(author=author, author_url=author_url, table=change["logparams"]["0"])
+
elif action == "cargo/recreatetable":
- LinkParser.feed(change["logparams"]["0"])
- table = LinkParser.new_string
- LinkParser.new_string = ""
- content = _("[{author}]({author_url}) recreated the Cargo table \"{table}\"").format(author=author, author_url=author_url, table=table)
+
elif action == "cargo/replacetable":
- LinkParser.feed(change["logparams"]["0"])
- table = LinkParser.new_string
- LinkParser.new_string = ""
- content = _("[{author}]({author_url}) replaced the Cargo table \"{table}\"").format(author=author, author_url=author_url, table=table)
+
elif action == "managetags/create":
elif action == "managetags/delete":
@@ -614,30 +605,13 @@ def embed_formatter(action, change, parsed_comment, categories, recent_changes):
link = create_article_path(change["title"])
embed["title"] = _("Edited the slice for {article}").format(article=change["title"])
elif action == "cargo/createtable":
- LinkParser.feed(change["logparams"]["0"])
- table = re.search(r"\[(.*?)\]\(<(.*?)>\)", LinkParser.new_string)
- LinkParser.new_string = ""
- link = table.group(2)
- embed["title"] = _("Created the Cargo table \"{table}\"").format(table=table.group(1))
- parsed_comment = None
+
elif action == "cargo/deletetable":
- link = create_article_path("Special:CargoTables")
- embed["title"] = _("Deleted the Cargo table \"{table}\"").format(table=change["logparams"]["0"])
- parsed_comment = None
+
elif action == "cargo/recreatetable":
- LinkParser.feed(change["logparams"]["0"])
- table = re.search(r"\[(.*?)\]\(<(.*?)>\)", LinkParser.new_string)
- LinkParser.new_string = ""
- link = table.group(2)
- embed["title"] = _("Recreated the Cargo table \"{table}\"").format(table=table.group(1))
- parsed_comment = None
+
elif action == "cargo/replacetable":
- LinkParser.feed(change["logparams"]["0"])
- table = re.search(r"\[(.*?)\]\(<(.*?)>\)", LinkParser.new_string)
- LinkParser.new_string = ""
- link = table.group(2)
- embed["title"] = _("Replaced the Cargo table \"{table}\"").format(table=table.group(1))
- parsed_comment = None
+
elif action == "managetags/create":
elif action == "managetags/delete":
diff --git a/src/rcgcdw.py b/src/rcgcdw.py
index b2cf02a..7108d56 100644
--- a/src/rcgcdw.py
+++ b/src/rcgcdw.py
@@ -29,8 +29,7 @@ import src.api.client
from src.api.context import Context
from src.api.hooks import formatter_hooks, pre_hooks, post_hooks
from src.configloader import settings
-from src.misc import add_to_dict, datafile, \
- WIKI_API_PATH
+from src.misc import add_to_dict, datafile, WIKI_API_PATH, LinkParser
from src.api.util import create_article_path, default_message, sanitize_to_markdown
from src.discord.queue import send_to_discord
from src.discord.message import DiscordMessage, DiscordMessageMetadata