From 6e09a8dc231f7f87914dd1ab42087a2d845960bd Mon Sep 17 00:00:00 2001 From: Frisk Date: Mon, 20 May 2019 15:11:30 +0200 Subject: [PATCH] Added #71 --- misc.py | 72 ++++++++++++++++++++++++++++++++++++++++++- rcgcdw.py | 59 ++++++++++++++++++++++++++--------- settings.json.example | 3 +- 3 files changed, 118 insertions(+), 16 deletions(-) diff --git a/misc.py b/misc.py index c1743e9..fa7f696 100644 --- a/misc.py +++ b/misc.py @@ -1,4 +1,5 @@ import json, logging, sys, re +from html.parser import HTMLParser # Create a custom logger @@ -49,4 +50,73 @@ def weighted_average(value, weight, new_value): def link_formatter(link): """Formats a link to not embed it""" - return "<"+re.sub(r"([ \)])", "\\\\\\1", link)+">" \ No newline at end of file + return "<" + re.sub(r"([ \)])", "\\\\\\1", link) + ">" + + +class ContentParser(HTMLParser): + more = _("\n__And more__") + current_tag = "" + small_prev_ins = "" + small_prev_del = "" + ins_length = len(more) + del_length = len(more) + added = False + + def handle_starttag(self, tagname, attribs): + if tagname == "ins" or tagname == "del": + self.current_tag = tagname + if tagname == "td" and 'diff-addedline' in attribs[0]: + self.current_tag = tagname + "a" + if tagname == "td" and 'diff-deletedline' in attribs[0]: + self.current_tag = tagname + "d" + if tagname == "td" and 'diff-marker' in attribs[0]: + self.added = True + + def handle_data(self, data): + data = re.sub(r"(`|_|\*|~|<|>|{|}|@|/|\|)", "\\\\\\1", data, 0) + if self.current_tag == "ins" and self.ins_length <= 1000: + self.ins_length += len("**" + data + '**') + if self.ins_length <= 1000: + self.small_prev_ins = self.small_prev_ins + "**" + data + '**' + else: + self.small_prev_ins = self.small_prev_ins + self.more + if self.current_tag == "del" and self.del_length <= 1000: + self.del_length += len("~~" + data + '~~') + if self.del_length <= 1000: + self.small_prev_del = self.small_prev_del + "~~" + data + '~~' + else: + self.small_prev_del = self.small_prev_del + self.more + if (self.current_tag == "afterins" or self.current_tag == "tda") and self.ins_length <= 1000: + self.ins_length += len(data) + if self.ins_length <= 1000: + self.small_prev_ins = self.small_prev_ins + data + else: + self.small_prev_ins = self.small_prev_ins + self.more + if (self.current_tag == "afterdel" or self.current_tag == "tdd") and self.del_length <= 1000: + self.del_length += len(data) + if self.del_length <= 1000: + self.small_prev_del = self.small_prev_del + data + else: + self.small_prev_del = self.small_prev_del + self.more + if self.added: + if data == '+' and self.ins_length <= 1000: + self.ins_length += 1 + if self.ins_length <= 1000: + self.small_prev_ins = self.small_prev_ins + '\n' + else: + self.small_prev_ins = self.small_prev_ins + self.more + if data == '−' and self.del_length <= 1000: + self.del_length += 1 + if self.del_length <= 1000: + self.small_prev_del = self.small_prev_del + '\n' + else: + self.small_prev_del = self.small_prev_del + self.more + self.added = False + + def handle_endtag(self, tagname): + if tagname == "ins": + self.current_tag = "afterins" + elif tagname == "del": + self.current_tag = "afterdel" + else: + self.current_tag = "" diff --git a/rcgcdw.py b/rcgcdw.py index 7609ae0..a0ba72e 100644 --- a/rcgcdw.py +++ b/rcgcdw.py @@ -20,14 +20,12 @@ # WARNING! SHITTY CODE AHEAD. ENTER ONLY IF YOU ARE SURE YOU CAN TAKE IT # You have been warned -import time, logging.config, json, requests, datetime, re, gettext, math, random, os.path, schedule, sys, ipaddress, misc +import time, logging.config, json, requests, datetime, re, gettext, math, random, os.path, schedule, sys, ipaddress from bs4 import BeautifulSoup from collections import defaultdict, Counter from urllib.parse import quote_plus from html.parser import HTMLParser -from misc import link_formatter - if __name__ != "__main__": # return if called as a module logging.critical("The file is being executed as a module. Please execute the script using the console.") sys.exit(1) @@ -52,6 +50,21 @@ logging.debug("Current settings: {settings}".format(settings=settings)) logging.config.dictConfig(settings["logging"]) logger = logging.getLogger("rcgcdw") +# Setup translation + +try: + lang = gettext.translation('rcgcdw', localedir='locale', languages=[settings["lang"]]) +except FileNotFoundError: + logger.critical("No language files have been found. Make sure locale folder is located in the directory.") + sys.exit(1) + +lang.install() +ngettext = lang.ngettext + +import misc + +from misc import link_formatter +from misc import ContentParser storage = misc.load_datafile() @@ -64,17 +77,6 @@ if settings["limitrefetch"] != -1 and os.path.exists("lastchange.txt") is True: misc.save_datafile(storage) os.remove("lastchange.txt") -# Setup translation - -try: - lang = gettext.translation('rcgcdw', localedir='locale', languages=[settings["lang"]]) -except FileNotFoundError: - logger.critical("No language files have been found. Make sure locale folder is located in the directory.") - sys.exit(1) - -lang.install() -ngettext = lang.ngettext - # A few initial vars logged_in = False @@ -512,6 +514,35 @@ def embed_formatter(action, change, parsed_comment, categories): embed["title"] = "{redirect}{article} ({new}{minor}{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 "") + if settings["appearance"]["embed"]["show_edit_changes"]: + changed_content = safe_read(recent_changes.safe_request( + "https://{wiki}.gamepedia.com/api.php?action=compare&format=json&fromtext=&torev={diff}&topst=1&prop=diff".format( + wiki=settings["wiki"], diff=change["revid"] + )), "compare", "*") + if changed_content: + if "fields" not in embed: + embed["fields"] = [] + EditDiff = ContentParser() + 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["fields"].append( + {"name": "Removed", "value": "{data}".format(data=EditDiff.small_prev_del), "inline": True}) + if EditDiff.small_prev_ins: + embed["fields"].append( + {"name": "Added", "value": "{data}".format(data=EditDiff.small_prev_ins), "inline": True}) + else: + logging.warning("Unabled to download data on the edit content!") elif action in ("upload/overwrite", "upload/upload"): # sending files license = None urls = safe_read(recent_changes.safe_request( diff --git a/settings.json.example b/settings.json.example index b91520d..f6221d5 100644 --- a/settings.json.example +++ b/settings.json.example @@ -55,7 +55,8 @@ "appearance":{ "mode": "embed", "embed": { - "daily_overview": { + "show_edit_changes": false, + "daily_overview": { "color": 16312092, "icon":"" },