More work on all things!

This commit is contained in:
Frisk 2021-04-28 13:37:32 +02:00
parent 1b3ffb0228
commit d0795c76e7
No known key found for this signature in database
GPG key ID: 213F7C15068AF8AC
6 changed files with 98 additions and 36 deletions

View file

@ -19,7 +19,7 @@ from src.discord.message import DiscordMessage
from src.api import formatter from src.api import formatter
from src.i18n import rc_formatters from src.i18n import rc_formatters
from src.api.context import Context from src.api.context import Context
from src.api.util import embed_helper from src.api.util import embed_helper, sanitize_to_url, parse_mediawiki_changes, clean_link, compact_author
from src.configloader import settings from src.configloader import settings
from src.exceptions import * from src.exceptions import *
@ -44,20 +44,29 @@ def embed_edit(ctx: Context, change: dict) -> DiscordMessage:
embed["color"] = 8750469 embed["color"] = 8750469
if change["title"].startswith("MediaWiki:Tag-"): # Refresh tag list when tag display name is edited if change["title"].startswith("MediaWiki:Tag-"): # Refresh tag list when tag display name is edited
ctx.client.refresh_internal_data() ctx.client.refresh_internal_data()
embed["link"] = "{wiki}index.php?title={article}&curid={pageid}&diff={diff}&oldid={oldrev}".format( # Sparse is better than dense.
wiki=ctx.client.WIKI_SCRIPT_PATH, pageid=change["pageid"], diff=change["revid"], oldrev=change["old_revid"], # Readability counts.
article=change["title"].replace(" ", "_").replace("%", "%25").replace("\\", "%5C").replace("&", "%26")) embed["url"] = "{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=sanitize_to_url(change["title"])
)
embed["title"] = "{redirect}{article} ({new}{minor}{bot}{space}{editsize})".format( embed["title"] = "{redirect}{article} ({new}{minor}{bot}{space}{editsize})".format(
redirect="" if "redirect" in change else "", article=change["title"], editsize="+" + str( redirect="" if "redirect" in change else "",
editsize) if editsize > 0 else editsize, new=_("(N!) ") if action == "new" else "", article=change["title"],
minor=_("m") if action == "edit" and "minor" in change else "", bot=_('b') if "bot" in change else "", 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 "") space=" " if "bot" in change or (action == "edit" and "minor" in change) or action == "new" else "")
if settings["appearance"]["embed"]["show_edit_changes"]: if settings["appearance"]["embed"]["show_edit_changes"]:
try: try:
if action == "new": if action == "new":
changed_content = ctx.client.make_api_request( changed_content = ctx.client.make_api_request(
"?action=compare&format=json&torev={diff}&topst=1&prop=diff".format(diff=change["revid"] "?action=compare&format=json&fromslots=main&torev={diff}&fromtext-main=&topst=1&prop=diff".format(
), "compare", "*") diff=change["revid"]), "compare", "*")
else: else:
changed_content = ctx.client.make_api_request( changed_content = ctx.client.make_api_request(
"?action=compare&format=json&fromrev={oldrev}&torev={diff}&topst=1&prop=diff".format( "?action=compare&format=json&fromrev={oldrev}&torev={diff}&topst=1&prop=diff".format(
@ -65,34 +74,21 @@ def embed_edit(ctx: Context, change: dict) -> DiscordMessage:
except ServerError: except ServerError:
changed_content = None changed_content = None
if changed_content: if changed_content:
EditDiff = ctx.client.content_parser() parse_mediawiki_changes(ctx, changed_content, embed)
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: else:
logger.warning("Unable to download data on the edit content!") logger.warning("Unable to download data on the edit content!")
embed["description"] = ctx.parsedcomment
return embed return embed
@formatter.compact(event="edit", mode="compact") @formatter.compact(event="edit", mode="compact")
def compact_edit(ctx: Context, change: dict): def compact_edit(ctx: Context, change: dict):
parsed_comment = "" if ctx.parsedcomment is None else " *(" + ctx.parsedcomment + ")*"
author, author_url = compact_author(ctx, change)
action = ctx.event action = ctx.event
edit_link = link_formatter("{wiki}index.php?title={article}&curid={pageid}&diff={diff}&oldid={oldrev}".format( edit_link = clean_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"], wiki=ctx.client.WIKI_SCRIPT_PATH, pageid=change["pageid"], diff=change["revid"], oldrev=change["old_revid"],
article=change["title"])) article=sanitize_to_url(change["title"])))
logger.debug(edit_link) logger.debug(edit_link)
edit_size = change["newlen"] - change["oldlen"] edit_size = change["newlen"] - change["oldlen"]
sign = "" sign = ""
@ -101,8 +97,6 @@ def compact_edit(ctx: Context, change: dict):
bold = "" bold = ""
if abs(edit_size) > 500: if abs(edit_size) > 500:
bold = "**" bold = "**"
if change["title"].startswith("MediaWiki:Tag-"):
pass
if action == "edit": if action == "edit":
content = _( content = _(
"[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}({sign}{edit_size}){bold}").format( "[{author}]({author_url}) edited [{article}]({edit_link}){comment} {bold}({sign}{edit_size}){bold}").format(
@ -116,7 +110,7 @@ def compact_edit(ctx: Context, change: dict):
return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content) return DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url, content=content)
# Page creation - event new # Page creation - event new aliases to embed_edit since they share a lot of their code
@formatter.embed(event="new", mode="embed") @formatter.embed(event="new", mode="embed")
def embed_new(ctx, change): def embed_new(ctx, change):

View file

@ -36,6 +36,7 @@ class Client:
self.WIKI_SCRIPT_PATH = src.misc.WIKI_SCRIPT_PATH self.WIKI_SCRIPT_PATH = src.misc.WIKI_SCRIPT_PATH
self.WIKI_JUST_DOMAIN = src.misc.WIKI_JUST_DOMAIN self.WIKI_JUST_DOMAIN = src.misc.WIKI_JUST_DOMAIN
self.content_parser = src.misc.ContentParser self.content_parser = src.misc.ContentParser
self.tags = self.__recent_changes.tags
#self.make_api_request: src.rc.wiki.__recent_changes.api_request = self.__recent_changes.api_request #self.make_api_request: src.rc.wiki.__recent_changes.api_request = self.__recent_changes.api_request
def refresh_internal_data(self): def refresh_internal_data(self):
@ -68,6 +69,7 @@ class Client:
def get_formatters(self): def get_formatters(self):
return self._formatters return self._formatters
def get_ipmapper(self) -> dict: def get_ipmapper(self) -> dict:
"""Returns a dict mapping IPs with amount of their edits""" """Returns a dict mapping IPs with amount of their edits"""
return self.__recent_changes.map_ips return self.__recent_changes.map_ips

View file

@ -20,6 +20,9 @@ from src.discord.message import DiscordMessage
from src.configloader import settings from src.configloader import settings
import src.misc import src.misc
import logging import logging
from src.i18n import rc_formatters
_ = rc_formatters.gettext
if TYPE_CHECKING: if TYPE_CHECKING:
from src.api.context import Context from src.api.context import Context
@ -31,9 +34,39 @@ def default_message(event: str, formatter_hooks: dict) -> Callable:
return formatter_hooks.get(event, formatter_hooks.get("generic", formatter_hooks["no_formatter"])) return formatter_hooks.get(event, formatter_hooks.get("generic", formatter_hooks["no_formatter"]))
def link_formatter(link: str) -> str: def clean_link(link: str) -> str:
"""Adds <> around the link to prevent its embedding"""
return "<" + link.replace(" ", "_") + ">"
def sanitize_to_markdown(text: str):
"""Sanitizes given text to """
def sanitize_to_url(text: str) -> str: # TODO ) replaces needed?
"""Formats a link to not embed it""" """Formats a link to not embed it"""
return "<" + quote(link.replace(" ", "_"), "/:?=&") + ">" return quote(text, " \\/:").replace(' ', "_")
def parse_mediawiki_changes(ctx: Context, content: str, embed: DiscordMessage) -> None:
"""Parses MediaWiki changes and adds them to embed as fields "Added" and "Removed" """
edit_diff = ctx.client.content_parser()
edit_diff.feed(content)
if edit_diff.small_prev_del:
if edit_diff.small_prev_del.replace("~~", "").isspace():
edit_diff.small_prev_del = _('__Only whitespace__')
else:
edit_diff.small_prev_del = edit_diff.small_prev_del.replace("~~~~", "")
if edit_diff.small_prev_ins:
if edit_diff.small_prev_ins.replace("**", "").isspace():
edit_diff.small_prev_ins = _('__Only whitespace__')
else:
edit_diff.small_prev_ins = edit_diff.small_prev_ins.replace("****", "")
logger.debug("Changed content: {}".format(edit_diff.small_prev_ins))
if edit_diff.small_prev_del and not ctx.event == "new":
embed.add_field(_("Removed"), "{data}".format(data=edit_diff.small_prev_del), inline=True)
if edit_diff.small_prev_ins:
embed.add_field(_("Added"), "{data}".format(data=edit_diff.small_prev_ins), inline=True)
def escape_formatting(data: str) -> str: def escape_formatting(data: str) -> str:
@ -46,6 +79,19 @@ def create_article_path(article: str) -> str:
return src.misc.WIKI_ARTICLE_PATH.replace("$1", article) return src.misc.WIKI_ARTICLE_PATH.replace("$1", article)
def compact_author(ctx: Context, change: dict) -> (Optional[str], Optional[str]):
"""Returns link to the author and the author itself respecting the settings"""
author, author_url = None, None
if ctx.event != "suppressed":
author_url = clean_link(create_article_path("User:{user}".format(user=change["user"]))) # TODO Sanitize user in here and in embed_helper
if "anon" in change:
change["user"] = _("Unregistered user")
author = change["user"]
else:
author = change["user"]
return author, author_url
def embed_helper(ctx: Context, message: DiscordMessage, change: dict) -> None: def embed_helper(ctx: Context, message: DiscordMessage, change: dict) -> None:
"""Helps in preparing common edit/log fields for events. Passed arguments automatically become saturated with needed data. """Helps in preparing common edit/log fields for events. Passed arguments automatically become saturated with needed data.
@ -84,4 +130,21 @@ def embed_helper(ctx: Context, message: DiscordMessage, change: dict) -> None:
amount=ip_mapper[change["user"]]) amount=ip_mapper[change["user"]])
else: else:
author_url = create_article_path("User:{}".format(change["user"].replace(" ", "_"))) author_url = create_article_path("User:{}".format(change["user"].replace(" ", "_")))
if settings["appearance"]["embed"]["show_footer"]:
message["timestamp"] = change["timestamp"]
if "tags" in change and change["tags"]:
tag_displayname = []
for tag in change["tags"]:
if tag in ctx.client.tags:
if ctx.client.tags[tag] is None:
continue # Ignore hidden tags
else:
tag_displayname.append(ctx.client.tags[tag])
else:
tag_displayname.append(tag)
message.add_field(_("Tags"), ", ".join(tag_displayname))
if ctx.categories is not None and not (len(ctx.categories["new"]) == 0 and len(ctx.categorie["removed"]) == 0):
new_cat = (_("**Added**: ") + ", ".join(list(ctx.categories["new"])[0:16]) + ("\n" if len(ctx.categories["new"])<=15 else _(" and {} more\n").format(len(ctx.categories["new"])-15))) if ctx.categories["new"] else ""
del_cat = (_("**Removed**: ") + ", ".join(list(ctx.categories["removed"])[0:16]) + ("" if len(ctx.categories["removed"])<=15 else _(" and {} more").format(len(ctx.categories["removed"])-15))) if ctx.categories["removed"] else ""
message.add_field(_("Changed categories"), new_cat + del_cat)
message.set_author(change["user"], author_url) message.set_author(change["user"], author_url)

View file

@ -72,6 +72,8 @@ class DiscordMessage:
self.embed["color"] = math.floor(self.embed["color"]) self.embed["color"] = math.floor(self.embed["color"])
if not self.embed["author"]["icon_url"] and settings["event_appearance"].get(self.event_type, {"icon": None})["icon"]: if not self.embed["author"]["icon_url"] and settings["event_appearance"].get(self.event_type, {"icon": None})["icon"]:
self.embed["author"]["icon_url"] = settings["event_appearance"][self.event_type]["icon"] self.embed["author"]["icon_url"] = settings["event_appearance"][self.event_type]["icon"]
if len(self.embed["title"]) > 254:
self.embed["title"] = self.embed["title"][0:253] + ""
def set_author(self, name, url, icon_url=""): def set_author(self, name, url, icon_url=""):
self.embed["author"]["name"] = name self.embed["author"]["name"] = name

View file

@ -19,7 +19,7 @@ import gettext
from urllib.parse import quote_plus from urllib.parse import quote_plus
from src.configloader import settings from src.configloader import settings
from src.api.util import link_formatter, escape_formatting, create_article_path from src.api.util import escape_formatting, create_article_path, clean_link
from src.discord.queue import send_to_discord from src.discord.queue import send_to_discord
from src.discord.message import DiscordMessage, DiscordMessageMetadata from src.discord.message import DiscordMessage, DiscordMessageMetadata
from src.i18n import discussion_formatters from src.i18n import discussion_formatters
@ -44,7 +44,7 @@ def compact_formatter(post_type, post, article_paths):
else: else:
if post["createdBy"]["name"]: if post["createdBy"]["name"]:
author = post["createdBy"]["name"] author = post["createdBy"]["name"]
author_url = link_formatter(create_article_path("User:{user}".format(user=author))) author_url = clean_link(create_article_path("User:{user}".format(user=author)))
else: else:
author_url = "<{url}f/u/{creatorId}>".format(url=settings["fandom_discussions"]["wiki_url"], creatorId=post["creatorId"]) author_url = "<{url}f/u/{creatorId}>".format(url=settings["fandom_discussions"]["wiki_url"], creatorId=post["creatorId"])
event_type = "discussion" event_type = "discussion"

View file

@ -304,8 +304,9 @@ class Wiki(object):
# Making request # Making request
try: try:
if isinstance(params, str): # Todo Make it so there are some default arguments like warning/error format appended if isinstance(params, str): # Todo Make it so there are some default arguments like warning/error format appended
request = self.session.get(WIKI_API_PATH + params, timeout=timeout, allow_redirects=allow_redirects) request = self.session.get(WIKI_API_PATH + params+"&errorformat=raw", timeout=timeout, allow_redirects=allow_redirects)
elif isinstance(params, OrderedDict): elif isinstance(params, OrderedDict):
params["errorformat"] = "raw"
request = self.session.get(WIKI_API_PATH, params=params, timeout=timeout, allow_redirects=allow_redirects) request = self.session.get(WIKI_API_PATH, params=params, timeout=timeout, allow_redirects=allow_redirects)
else: else:
raise BadRequest(params) raise BadRequest(params)