mirror of
https://gitlab.com/chicken-riders/RcGcDw.git
synced 2025-02-23 00:24:09 +00:00
More work on all things!
This commit is contained in:
parent
1b3ffb0228
commit
d0795c76e7
|
@ -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):
|
||||||
|
|
|
@ -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
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue