diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..35b9342 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,12 @@ +image: python:3.6-alpine + +test: + type: test + script: + - apk add libxml2-dev libxslt-dev libxml2 gcc musl-dev linux-headers + - pip3.6 install -r requirements.txt + - sed -i -e "s/https:\/\/discordapp.com\/api\/webhooks\/111111111111111111\/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/$DISCORD/g" settings.json.example + - mv settings.json.example settings.json + - python3.6 rcgcdw.py --test + only: + - testing \ No newline at end of file diff --git a/locale/pl/LC_MESSAGES/rcgcdw.mo b/locale/pl/LC_MESSAGES/rcgcdw.mo index 1d9b9fd..f97c1e1 100644 Binary files a/locale/pl/LC_MESSAGES/rcgcdw.mo and b/locale/pl/LC_MESSAGES/rcgcdw.mo differ diff --git a/locale/pl/LC_MESSAGES/rcgcdw.po b/locale/pl/LC_MESSAGES/rcgcdw.po index 2a62ae4..2706268 100644 --- a/locale/pl/LC_MESSAGES/rcgcdw.po +++ b/locale/pl/LC_MESSAGES/rcgcdw.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: RcGcDw\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-01-26 19:51+0100\n" -"PO-Revision-Date: 2019-01-26 19:56+0100\n" +"PO-Revision-Date: 2019-02-12 13:20+0100\n" "Last-Translator: Frisk \n" "Language-Team: \n" "Language: pl\n" diff --git a/rcgcdw.py b/rcgcdw.py index 31970c2..a5c26c7 100644 --- a/rcgcdw.py +++ b/rcgcdw.py @@ -26,6 +26,12 @@ from collections import defaultdict, Counter from urllib.parse import quote_plus from html.parser import HTMLParser +if __name__ != "__main__": + logging.critical("The file is being executed as a module. Please execute the script using the console.") + sys.exit(1) + +TESTING = True if "--test" in sys.argv else False + try: with open("settings.json") as sfile: settings = json.load(sfile) @@ -37,11 +43,16 @@ except FileNotFoundError: logged_in = False logging.basicConfig(level=settings["verbose_level"]) -if settings["limitrefetch"] != -1 and os.path.exists("lastchange.txt") == False: +if settings["limitrefetch"] != -1 and os.path.exists("lastchange.txt") is False: with open("lastchange.txt", 'w') as sfile: sfile.write("99999999999") logging.debug("Current settings: {settings}".format(settings=settings)) -lang = gettext.translation('rcgcdw', localedir='locale', languages=[settings["lang"]]) +try: + lang = gettext.translation('rcgcdw', localedir='locale', languages=[settings["lang"]]) +except FileNotFoundError: + logging.critical("No language files have been found. Make sure locale folder is located in the directory.") + sys.exit(1) + lang.install() ngettext = lang.ngettext @@ -82,8 +93,7 @@ LinkParser = LinkParser() def send(message, name, avatar): - dictionary_creator = {} - dictionary_creator["content"] = message + dictionary_creator = {"content": message} if name: dictionary_creator["username"] = name if avatar: @@ -184,13 +194,13 @@ def webhook_formatter(action, STATIC, **params): if editsize < -6032: colornumber = 16711680 else: - colornumber = 9175040 + (math.floor((editsize * -1) / (52))) * 65536 + colornumber = 9175040 + (math.floor((editsize * -1) / 52)) * 65536 elif editsize == 0: colornumber = 8750469 link = "https://{wiki}.gamepedia.com/index.php?title={article}&curid={pageid}&diff={diff}&oldid={oldrev}".format( wiki=settings["wiki"], pageid=params["pageid"], diff=params["diff"], oldrev=params["oldrev"], article=params["title"].replace(" ", "_")) - embed["title"] = "{redirect}{article} ({new}{minor}{editsize})".format(redirect="⤷ " if STATIC["redirect"] else "",article=params["title"], editsize="+" + str( + embed["title"] = "{redirect}{article} ({new}{minor}{editsize})".format(redirect="⤷ " if STATIC["redirect"] else "", article=params["title"], editsize="+" + str( editsize) if editsize > 0 else editsize, new=_("(N!) ") if action == "new" else "", minor=_("m ") if action == "edit" and params[ "minor"] else "") @@ -199,7 +209,6 @@ def webhook_formatter(action, STATIC, **params): urls = safe_read(recent_changes.safe_request( "https://{wiki}.gamepedia.com/api.php?action=query&format=json&prop=imageinfo&list=&meta=&titles={filename}&iiprop=timestamp%7Curl&iilimit=2".format( wiki=settings["wiki"], filename=params["title"])), "query", "pages") - undolink = "" link = "https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"], article=params["title"].replace(" ", "_")) additional_info_retrieved = False @@ -266,7 +275,7 @@ def webhook_formatter(action, STATIC, **params): article=params["target"].replace(" ", "_")) params["desc"] = "{supress}. {desc}".format(desc=params["desc"], supress=_("No redirect has been made") if params[ - "supress"] == True else _( + "supress"] is True else _( "A redirect has been made")) embed["title"] = _("Moved {redirect}{article} to {target}").format(redirect="⤷ " if STATIC["redirect"] else "", article=params["title"], target=params["target"]) elif action == "move/move_redir": @@ -516,8 +525,8 @@ def webhook_formatter(action, STATIC, **params): if "fields" not in embed: embed["fields"] = [] # embed["fields"].append({"name": _("Changed categories"), "value": ", ".join(params["new_categories"][0:15]) + ("" if (len(params["new_categories"]) < 15) else _(" and {} more").format(len(params["new_categories"])-14))}) - new_cat = (_("**Added**: ") + ", ".join(STATIC["changed_categories"]["new"][0:16]) + ("\n" if len(STATIC["changed_categories"]["new"])<=15 else _(" and {} more\n").format(len(STATIC["changed_categories"]["new"])-15) ) ) if STATIC["changed_categories"]["new"] else "" - del_cat = (_("**Removed**: ") + ", ".join(STATIC["changed_categories"]["removed"][0:16]) + ("" if len(STATIC["changed_categories"]["removed"])<=15 else _(" and {} more").format(len(STATIC["changed_categories"]["removed"])-15) ) ) if STATIC["changed_categories"]["removed"] else "" + new_cat = (_("**Added**: ") + ", ".join(STATIC["changed_categories"]["new"][0:16]) + ("\n" if len(STATIC["changed_categories"]["new"])<=15 else _(" and {} more\n").format(len(STATIC["changed_categories"]["new"])-15))) if STATIC["changed_categories"]["new"] else "" + del_cat = (_("**Removed**: ") + ", ".join(STATIC["changed_categories"]["removed"][0:16]) + ("" if len(STATIC["changed_categories"]["removed"])<=15 else _(" and {} more").format(len(STATIC["changed_categories"]["removed"])-15))) if STATIC["changed_categories"]["removed"] else "" embed["fields"].append({"name": _("Changed categories"), "value": new_cat + del_cat}) data["embeds"].append(dict(embed)) data['avatar_url'] = settings["avatars"]["embed"] @@ -565,7 +574,7 @@ def first_pass( STATIC_VARS = {"timestamp": change["timestamp"], "tags": change["tags"], "redirect": (True if "redirect" in change else False), "ipaction": (True if "anon" in change else False), "changed_categories": changed_categories} if not parsedcomment: parsedcomment = _("No description provided") - parsedcomment = re.sub(r"(`|_|\*|~|<|>|{|})", "\\\\\\1", parsedcomment, 0) + parsedcomment = re.sub(r"(`|_|\*|~|<|>|{|}|\|\|)", "\\\\\\1", parsedcomment, 0) if change["type"] == "edit" and "edit" not in settings["ignored"]: logging.debug("List of categories in first_pass: {}".format(changed_categories)) if "userhidden" in change: @@ -812,12 +821,12 @@ def day_overview(): # time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime(time. embed["author"]["name"] = settings["wikiname"] embed["author"]["url"] = "https://{wiki}.gamepedia.com/".format(wiki=settings["wiki"]) if activity: - #v = activity.values() + # v = activity.values() active_users = [] for user, numberu in Counter(activity).most_common(3): # find most active users active_users.append(user + ngettext(" ({} action)", " ({} actions)", numberu).format(numberu)) # the_one = random.choice(active_users) - #v = articles.values() + # v = articles.values() for article, numbere in Counter(articles).most_common(3): # find most active users active_articles.append(article + ngettext(" ({} edit)", " ({} edits)", numbere).format(numbere)) v = hours.values() @@ -875,7 +884,8 @@ class Recent_Changes_Class(object): else: file_id = 999999999 # such value won't cause trouble, and it will make sure no refetch happen - def handle_mw_errors(self, request): + @staticmethod + def handle_mw_errors(request): if "errors" in request: logging.error(request["errors"]) raise MWError @@ -999,7 +1009,7 @@ class Recent_Changes_Class(object): "New event: {}".format(change["rcid"])) if new_events == settings["limit"]: if amount < 500: - # call the function again with max limit for more results, ignore the ones in this request + # call the function again with max limit for more results, ignore the ones in this request logging.debug("There were too many new events, requesting max amount of events from the wiki.") return self.fetch(amount=5000 if logged_in else 500) else: @@ -1128,13 +1138,13 @@ time.sleep(1.0) recent_changes.fetch(amount=settings["limitrefetch"] if settings["limitrefetch"] != -1 else settings["limit"]) schedule.every(settings["cooldown"]).seconds.do(recent_changes.fetch) -if 1 == 2: +if 1 == 2: # additional translation strings in unreachable code print(_("director"), _("bot"), _("editor"), _("directors"), _("sysop"), _("bureaucrat"), _("reviewer"), _("autoreview"), _("autopatrol"), _("wiki_guardian")) if settings["overview"]: try: - overview_time=time.strptime(settings["overview_time"], '%H:%M') + overview_time = time.strptime(settings["overview_time"], '%H:%M') schedule.every().day.at("{}:{}".format(str(overview_time.tm_hour).zfill(2), str(overview_time.tm_min).zfill(2))).do(day_overview) del overview_time @@ -1144,6 +1154,15 @@ if settings["overview"]: logging.error("Invalid time format! Currentely: {}. Note: It needs to be in HH:MM format.".format(settings["overview_time"])) schedule.every().day.at("00:00").do(recent_changes.clear_cache) -while 1: +if TESTING: + logging.debug("DEBUGGING") + recent_changes.recent_id -= 5 + recent_changes.file_id -= 5 + recent_changes.ids = [1] + recent_changes.fetch(amount=5) + day_overview() + sys.exit(0) + +while 1: time.sleep(1.0) schedule.run_pending() diff --git a/settings.json.example b/settings.json.example index 70a6d8c..850ca79 100644 --- a/settings.json.example +++ b/settings.json.example @@ -3,7 +3,7 @@ "wiki": "minecraft", "lang": "en", "header": { - "user-agent": "FrisksRcGcDw/1.5.1.2" + "user-agent": "FrisksRcGcDw/1.5.2" }, "limit": 11, "webhookURL": "https://discordapp.com/api/webhooks/111111111111111111/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", @@ -36,15 +36,15 @@ "color":"THIS COLOR DEPENDS ON EDIT SIZE, PLEASE DON'T CHANGE" }, "edit":{ - "icon":"https://d1u5p3l4wpay3k.cloudfront.net/minecraft_pl_gamepedia/d/df/Ksi%C4%85%C5%BCka_z_pi%C3%B3rem.png?version=d2b085f15fb5713091ed06f92f81c360", + "icon":"", "color":"THIS COLOR DEPENDS ON EDIT SIZE, PLEASE DON'T CHANGE" }, "upload/overwrite":{ - "icon":"", + "icon":"https://i.imgur.com/egJpa81.png", "color":12390624 }, "upload/upload":{ - "icon":"", + "icon":"https://i.imgur.com/egJpa81.png", "color":null }, "delete/delete":{ @@ -56,27 +56,27 @@ "color":1 }, "delete/restore":{ - "icon":"", + "icon":"https://i.imgur.com/9MnROIU.png", "color":null }, "delete/revision":{ - "icon":"", + "icon":"https://i.imgur.com/1gps6EZ.png", "color":null }, "delete/event":{ - "icon":"", + "icon":"https://i.imgur.com/1gps6EZ.png", "color":null }, "merge/merge":{ - "icon":"", + "icon":"https://i.imgur.com/uQMK9XK.png", "color":null }, "move/move":{ - "icon":"https://i.imgur.com/ZX02KBf.png", + "icon":"https://i.imgur.com/eXz9dog.png", "color":null }, "move/move_redir":{ - "icon":"https://i.imgur.com/ZX02KBf.png", + "icon":"https://i.imgur.com/UtC3YX2.png", "color":null }, "block/block":{ @@ -84,7 +84,7 @@ "color":1 }, "block/unblock":{ - "icon":"https://i.imgur.com/g7KgZHf.png", + "icon":"https://i.imgur.com/bvtBJ8o.png", "color":1 }, "block/reblock":{ @@ -92,19 +92,19 @@ "color":1 }, "protect/protect":{ - "icon":"https://i.imgur.com/Lfk0wuw.png", + "icon":"https://i.imgur.com/bzPt89Z.png", "color":null }, "protect/modify":{ - "icon":"https://i.imgur.com/Lfk0wuw.png", + "icon":"https://i.imgur.com/bzPt89Z.png", "color":null }, "protect/move_prot":{ - "icon":"https://i.imgur.com/ZX02KBf.png", + "icon":"https://i.imgur.com/bzPt89Z.png", "color":null }, "protect/unprotect":{ - "icon":"https://i.imgur.com/Lfk0wuw.png", + "icon":"https://i.imgur.com/2wN3Qcq.png", "color":null }, "import/upload":{ @@ -112,7 +112,7 @@ "color":null }, "import/interwiki":{ - "icon":"", + "icon":"https://i.imgur.com/sFkhghb.png", "color":null }, "rights/rights":{ @@ -120,35 +120,35 @@ "color":null }, "abusefilter/abusefilter":{ - "icon":"", + "icon":"https://i.imgur.com/Sn2NzRJ.png", "color":null }, "abusefilter/modify":{ - "icon":"", + "icon":"https://i.imgur.com/Sn2NzRJ.png", "color":null }, "abusefilter/create": { - "icon":"", + "icon":"https://i.imgur.com/Sn2NzRJ.png", "color":null }, "interwiki/iw_add":{ - "icon":"", + "icon":"https://i.imgur.com/sFkhghb.png", "color":null }, "interwiki/iw_edit":{ - "icon":"", + "icon":"https://i.imgur.com/sFkhghb.png", "color":null }, "interwiki/iw_delete":{ - "icon":"", + "icon":"https://i.imgur.com/sFkhghb.png", "color":null }, "curseprofile/comment-created":{ - "icon":"", + "icon":"https://i.imgur.com/Lvy5E32.png", "color":null }, "curseprofile/comment-edited":{ - "icon":"", + "icon":"https://i.imgur.com/Lvy5E32.png", "color":null }, "curseprofile/comment-deleted":{ @@ -156,7 +156,7 @@ "color":null }, "curseprofile/comment-replied":{ - "icon":"", + "icon":"https://i.imgur.com/hkyYsI1.png", "color":null }, "curseprofile/profile-edited":{ @@ -200,7 +200,7 @@ "color":null }, "suppressed":{ - "icon": "", + "icon": "https://i.imgur.com/1gps6EZ.png", "color": 8092539 } } diff --git a/setup.py b/setup.py index 58bfa84..f181065 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup setup( name='RcGcDw', - version='1.5.1.2', + version='1.5.2', packages=['venv.lib.python3.7.site-packages.bs4', 'venv.lib.python3.7.site-packages.bs4.tests', 'venv.lib.python3.7.site-packages.bs4.builder', 'venv.lib.python3.7.site-packages.idna', 'venv.lib.python3.7.site-packages.lxml', 'venv.lib.python3.7.site-packages.lxml.html',