diff --git a/configbuilder.py b/configbuilder.py
new file mode 100644
index 0000000..848f3c4
--- /dev/null
+++ b/configbuilder.py
@@ -0,0 +1,234 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Recent changes Gamepedia compatible Discord webhook is a project for using a webhook as recent changes page from MediaWiki.
+# Copyright (C) 2018 Frisk
+
+# This program 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.
+
+# This program 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 this program. If not, see .
+
+import json, time, sys, re
+
+try:
+ import requests
+except ModuleNotFoundError:
+ print("The requests module couldn't be found. Please install requests library using pip install requests.")
+ sys.exit(0)
+
+if "--help" in sys.argv:
+ print("""Usage: python configbuilder.py [OPTIONS]
+
+ Options:
+ --basic - Prepares only the most basic settings necessary to run the script, leaves a lot of customization options on default
+ --advanced - Prepares advanced settings with great range of customization
+ --annoying - Asks for every single value available""")
+ sys.exit(0)
+
+def default_or_custom(answer, default):
+ if answer == "":
+ return default
+ else:
+ return answer
+
+def yes_no(answer):
+ if answer.lower() == "y":
+ return True
+ elif answer.lower() == "n":
+ return False
+ else:
+ raise ValueError
+
+print("Welcome in RcGcDw config builder! You can accept the default value if provided in the question by using Enter key without providing any other input.\nWARNING! Your current settings.json will be overwritten if you continue!")
+
+try: # load settings
+ with open("settings.json.example") as sfile:
+ settings = json.load(sfile)
+except FileNotFoundError:
+ if yes_no(default_or_custom(input("Template config (settings.json.example) could not be found. Download the most recent stable one from master branch? (https://gitlab.com/piotrex43/RcGcDw/raw/master/settings.json.example)? (Y/n)"), "y")):
+ settings = requests.get("https://gitlab.com/piotrex43/RcGcDw/raw/master/settings.json.example").json()
+
+def basic():
+ while True:
+ if set_cooldown():
+ break
+ while True:
+ if set_wiki():
+ break
+ while True:
+ if set_lang():
+ break
+ while True:
+ if set_webhook():
+ break
+ while True:
+ if set_wikiname():
+ break
+ while True:
+ if set_displaymode():
+ break
+
+def advanced():
+
+
+def set_cooldown():
+ option = default_or_custom(input("Interval for fetching recent changes in seconds (min. 10, default 30).\n"), 30)
+ try:
+ option = int(option)
+ if option < 10:
+ print("Please give a value higher than 9!")
+ return False
+ else:
+ settings["cooldown"] = option
+ return True
+ except ValueError:
+ print("Please give a valid number.")
+ return False
+
+def set_wiki():
+ option = input("Please give the wiki you want to be monitored. (for example 'minecraft' or 'terraria-pl' are valid options)\n")
+ if option.startswith("http"):
+ regex = re.search(r"http(?:s|):\/\/(.*?)\.gamepedia.com", option)
+ if regex.group(1):
+ option = regex.group(1)
+ wiki_request = requests.get("https://{}.gamepedia.com".format(option), timeout=10, allow_redirects=False)
+ if wiki_request.status_code == 404 or wiki_request.status_code == 302:
+ print("Wiki at https://{}.gamepedia.com does not exist, are you sure you have entered the wiki correctly?".format(option))
+ return False
+ else:
+ settings["wiki"] = option
+ return True
+
+def set_lang():
+ option = default_or_custom(input(
+ "Please provide a language code for translation of the script. Translations available: en, de, ru, pt-br, fr, pl. (default en)\n"), "en")
+ if option in ["en", "de", "ru", "pt-br", "fr", "pl"]:
+ settings["lang"] = option
+ return True
+ return False
+
+def set_webhook():
+ option = input(
+ "Webhook URL is required. You can get it on Discord by following instructions on this page: https://support.discordapp.com/hc/en-us/articles/228383668-Intro-to-Webhooks\n")
+ if option.startswith("https://discordapp.com/api/webhooks/"):
+ test_webhook = requests.get(option)
+ if test_webhook.status_code != 200:
+ print("The webhook URL does not seem right. Reason: {}".format(test_webhook.json()["message"]))
+ return False
+ else:
+ settings["webhookURL"] = option
+ return True
+ else:
+ print("The webhook URL should start with https://discordapp.com/api/webhooks/, are you sure it's the right URL?")
+ return False
+
+def set_wikiname():
+ option = input("Please provide any wiki name for the wiki (can be whatever, but should be a full name of the wiki, for example \"Minecraft Wiki\")\n") # TODO Fetch the wiki yourself using api by default
+ settings["wikiname"] = option
+ return True
+
+def set_displaymode():
+ option = default_or_custom(input(
+ "Please choose the display mode for the feed. More on how they look like on https://gitlab.com/piotrex43/RcGcDw/wikis/Presentation. Valid values: compact or embed. Default: embed\n"), "embed").lower()
+ if option in ["embed", "compact"]:
+ settings["appearance"]["mode"] = option
+ return True
+ print("Invalid mode selected!")
+ return False
+
+def set_limit():
+ option = default_or_custom(input("Limit for amount of changes fetched every {} seconds. (default: 10, minimum: 1, the less active wiki is the lower the value should be)\n".format(settings["cooldown"])), 10)
+ try:
+ option = int(option)
+ if option < 2:
+ print("Please give a value higher than 1!")
+ return False
+ else:
+ settings["limit"] = option
+ return True
+ except ValueError:
+ print("Please give a valid number.")
+ return False
+
+def set_refetch_limit():
+ option = default_or_custom(input("Limit for amount of changes fetched every time the script starts. (default: 28, minimum: {})\n".format(settings["limit"])), 28)
+ try:
+ option = int(option)
+ if option < settings["limit"]:
+ print("Please give a value higher than {}!".format(settings["limit"]))
+ return False
+ else:
+ settings["limit"] = option
+ return True
+ except ValueError:
+ print("Please give a valid number.")
+ return False
+
+def set_updown_messages():
+ try:
+ option = yes_no(default_or_custom(input("Should the script send messages when the wiki becomes unavailable? (Y/n)"), "y"))
+ settings["show_updown_messages"] = option
+ return True
+ except ValueError:
+ print("Response not valid, please use y (yes) or n (no)")
+ return False
+
+def set_downup_avatars():
+ option = default_or_custom(input("Provide a link for a custom webhook avatar when the wiki goes DOWN. (default: no avatar)"), "") #TODO Add a check for the image
+ settings["avatars"]["connection_failed"] = option
+ option = default_or_custom(
+ input("Provide a link for a custom webhook avatar when the connection to the wiki is RESTORED. (default: no avatar)"),
+ "") # TODO Add a check for the image
+ settings["avatars"]["connection_failed"] = option
+ return True
+
+def set_ignored_events():
+ option = default_or_custom(
+ input("Provide a list of entry types that are supposed to be ignored. Separate them using commas. Example: external, edit, upload/overwrite. (default: external)"), "external") # TODO Add a check for the image
+ entry_types = []
+ for etype in option.split(","):
+ entry_types.append(etype.strip())
+ settings["ignored"] = entry_types
+
+def set_overview():
+ try:
+ option = yes_no(default_or_custom(input("Should the script send daily overviews of the actions done on the wiki for past 24 hours? (y/N)"), "n"))
+ settings["overview"] = option
+ return True
+ except ValueError:
+ print("Response not valid, please use y (yes) or n (no)")
+ return False
+
+def set_overview_time():
+ try:
+ option = default_or_custom(input("At what time should the daily overviews be sent? (script uses local machine time, the format of the time should be HH:MM, default is 00:00)"), "00:00")
+ re.match(r"$\d{2}:\d{2}^")
+ settings["overview"] = option
+ return True
+ except ValueError:
+ print("Response not valid, please use y (yes) or n (no)")
+ return False
+
+try:
+ basic()
+ with open("settings.json", "w") as settings_file:
+ settings_file.write(json.dumps(settings, indent=4))
+ if "--advanced" in sys.argv:
+ print("Basic part of the config has been completed. Starting the advanced part...")
+ advanced()
+ print("Responses has been saved! Your settings.json should be now valid and bot ready to run.")
+except KeyboardInterrupt:
+ if not yes_no(default_or_custom(input("\nSave the config before exiting? (y/N)"),"n")):
+ sys.exit(0)
+ else:
+ with open("settings.json", "w") as settings_file:
+ settings_file.write(json.dumps(settings, indent=4))
\ No newline at end of file
diff --git a/configloader.py b/configloader.py
new file mode 100644
index 0000000..d113705
--- /dev/null
+++ b/configloader.py
@@ -0,0 +1,12 @@
+import json, sys, logging
+
+try: # load settings
+ with open("settings.json") as sfile:
+ settings = json.load(sfile)
+ if settings["limitrefetch"] < settings["limit"] and settings["limitrefetch"] != -1:
+ settings["limitrefetch"] = settings["limit"]
+ if "user-agent" in settings["header"]:
+ settings["header"]["user-agent"] = settings["header"]["user-agent"].format(version="1.7") # set the version in the useragent
+except FileNotFoundError:
+ logging.critical("No config file could be found. Please make sure settings.json is in the directory.")
+ sys.exit(1)
diff --git a/locale/de/LC_MESSAGES/misc.mo b/locale/de/LC_MESSAGES/misc.mo
new file mode 100644
index 0000000..f6d60e5
Binary files /dev/null and b/locale/de/LC_MESSAGES/misc.mo differ
diff --git a/locale/de/LC_MESSAGES/misc.po b/locale/de/LC_MESSAGES/misc.po
new file mode 100644
index 0000000..6432d03
--- /dev/null
+++ b/locale/de/LC_MESSAGES/misc.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-05-20 17:18+0200\n"
+"PO-Revision-Date: 2019-05-20 17:25+0200\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.2.1\n"
+"Last-Translator: \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Language: de\n"
+
+#: misc.py:76
+msgid ""
+"\n"
+"__And more__"
+msgstr ""
+"\n"
+"__Und mehr__"
diff --git a/locale/de/LC_MESSAGES/rcgcdw.mo b/locale/de/LC_MESSAGES/rcgcdw.mo
index fbbc0eb..878254c 100644
Binary files a/locale/de/LC_MESSAGES/rcgcdw.mo and b/locale/de/LC_MESSAGES/rcgcdw.mo differ
diff --git a/locale/de/LC_MESSAGES/rcgcdw.po b/locale/de/LC_MESSAGES/rcgcdw.po
index 845c35d..836571c 100644
--- a/locale/de/LC_MESSAGES/rcgcdw.po
+++ b/locale/de/LC_MESSAGES/rcgcdw.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-03 11:33+0200\n"
-"PO-Revision-Date: 2019-05-03 11:34+0200\n"
+"POT-Creation-Date: 2019-05-21 23:49+0200\n"
+"PO-Revision-Date: 2019-05-22 00:01+0200\n"
"Last-Translator: Frisk \n"
"Language-Team: German\n"
"Language: de\n"
@@ -16,7 +16,7 @@ msgstr ""
"X-Generator: Poedit 2.2.1\n"
"X-Loco-Parser: loco_parse_po\n"
-#: rcgcdw.py:177
+#: rcgcdw.py:133
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}"
@@ -25,7 +25,7 @@ msgstr ""
"[{author}]({author_url}) bearbeitete [{article}]({edit_link}){comment} "
"({sign}{edit_size})"
-#: rcgcdw.py:179
+#: rcgcdw.py:135
#, python-brace-format
msgid ""
"[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}"
@@ -34,12 +34,12 @@ msgstr ""
"[{author}]({author_url}) erstellte [{article}]({edit_link}){comment} ({sign}"
"{edit_size})"
-#: rcgcdw.py:183
+#: rcgcdw.py:139
#, python-brace-format
msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
msgstr "[{author}]({author_url}) lud [{file}]({file_link}) hoch{comment}"
-#: rcgcdw.py:191
+#: rcgcdw.py:147
#, python-brace-format
msgid ""
"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
@@ -48,12 +48,12 @@ msgstr ""
"[{author}]({author_url}) lud eine neue Version von [{file}]({file_link}) "
"hoch{comment}"
-#: rcgcdw.py:195
+#: rcgcdw.py:151
#, python-brace-format
msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
msgstr "[{author}]({author_url}) löschte [{page}]({page_link}){comment}"
-#: rcgcdw.py:200
+#: rcgcdw.py:156
#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
@@ -62,15 +62,15 @@ msgstr ""
"[{author}]({author_url}) löschte die Weiterleitung [{page}]({page_link}) "
"durch Überschreiben{comment}"
-#: rcgcdw.py:205 rcgcdw.py:211
+#: rcgcdw.py:161 rcgcdw.py:167
msgid "without making a redirect"
msgstr "ohne eine Weiterleitung zu erstellen"
-#: rcgcdw.py:205 rcgcdw.py:212
+#: rcgcdw.py:161 rcgcdw.py:168
msgid "with a redirect"
msgstr "und erstellte eine Weiterleitung"
-#: rcgcdw.py:206
+#: rcgcdw.py:162
#, python-brace-format
msgid ""
"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
@@ -79,7 +79,7 @@ msgstr ""
"[{author}]({author_url}) verschob {redirect}*{article}* nach [{target}]"
"({target_url}) {made_a_redirect}{comment}"
-#: rcgcdw.py:213
+#: rcgcdw.py:169
#, python-brace-format
msgid ""
"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
@@ -88,7 +88,7 @@ msgstr ""
"[{author}]({author_url}) verschob {redirect}*{article}* nach [{target}]"
"({target_url}) und überschrieb eine Weiterleitung {made_a_redirect}{comment}"
-#: rcgcdw.py:219
+#: rcgcdw.py:175
#, python-brace-format
msgid ""
"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
@@ -97,18 +97,18 @@ msgstr ""
"[{author}]({author_url}) verschob die Schutzeinstellungen von {redirect}"
"*{article}* nach [{target}]({target_url}){comment}"
-#: rcgcdw.py:231 rcgcdw.py:598
+#: rcgcdw.py:187 rcgcdw.py:586
msgid "infinity and beyond"
msgstr "alle Ewigkeit"
-#: rcgcdw.py:246
+#: rcgcdw.py:202
#, python-brace-format
msgid ""
"[{author}]({author_url}) blocked [{user}]({user_url}) for {time}{comment}"
msgstr ""
"[{author}]({author_url}) sperrte [{user}]({user_url}) für {time}{comment}"
-#: rcgcdw.py:251
+#: rcgcdw.py:207
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed block settings for [{blocked_user}]"
@@ -117,7 +117,7 @@ msgstr ""
"[{author}]({author_url}) änderte die Sperreinstellungen für [{blocked_user}]"
"({user_url}){comment}"
-#: rcgcdw.py:256
+#: rcgcdw.py:212
#, python-brace-format
msgid ""
"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
@@ -125,7 +125,7 @@ msgstr ""
"[{author}]({author_url}) hob die Sperre von [{blocked_user}]({user_url}) "
"auf{comment}"
-#: rcgcdw.py:260
+#: rcgcdw.py:216
#, python-brace-format
msgid ""
"[{author}]({author_url}) left a [comment]({comment}) on {target} profile"
@@ -133,11 +133,11 @@ msgstr ""
"[{author}]({author_url}) hinterließ ein [Kommentar]({comment}) auf dem "
"Profil von {target}"
-#: rcgcdw.py:260
+#: rcgcdw.py:216
msgid "their own profile"
msgstr "das eigene Profil"
-#: rcgcdw.py:265
+#: rcgcdw.py:221
#, python-brace-format
msgid ""
"[{author}]({author_url}) replied to a [comment]({comment}) on {target} "
@@ -146,11 +146,11 @@ msgstr ""
"[{author}]({author_url}) antwortete auf ein [Kommentar]({comment}) auf dem "
"Profil von {target}"
-#: rcgcdw.py:268 rcgcdw.py:276 rcgcdw.py:283
+#: rcgcdw.py:224 rcgcdw.py:232 rcgcdw.py:236
msgid "their own"
msgstr "sich selbst"
-#: rcgcdw.py:273
+#: rcgcdw.py:229
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited a [comment]({comment}) on {target} profile"
@@ -158,90 +158,90 @@ msgstr ""
"[{author}]({author_url}) bearbeitete ein [Kommentar]({comment}) auf dem "
"Profil von {target}"
-#: rcgcdw.py:281
+#: rcgcdw.py:234
#, python-brace-format
msgid "[{author}]({author_url}) deleted a comment on {target} profile"
msgstr ""
"[{author}]({author_url}) löschte ein Kommentar auf dem Profil von {target}"
-#: rcgcdw.py:289 rcgcdw.py:648
+#: rcgcdw.py:242 rcgcdw.py:633
msgid "Location"
msgstr "Wohnort"
-#: rcgcdw.py:291 rcgcdw.py:650
+#: rcgcdw.py:244 rcgcdw.py:635
msgid "About me"
msgstr "\"Über mich\"-Abschnitt"
-#: rcgcdw.py:293 rcgcdw.py:652
+#: rcgcdw.py:246 rcgcdw.py:637
msgid "Google link"
msgstr "Google-Link"
-#: rcgcdw.py:295 rcgcdw.py:654
+#: rcgcdw.py:248 rcgcdw.py:639
msgid "Facebook link"
msgstr "Facebook-Link"
-#: rcgcdw.py:297 rcgcdw.py:656
+#: rcgcdw.py:250 rcgcdw.py:641
msgid "Twitter link"
msgstr "Twitter-Link"
-#: rcgcdw.py:299 rcgcdw.py:658
+#: rcgcdw.py:252 rcgcdw.py:643
msgid "Reddit link"
msgstr "Reddit-Link"
-#: rcgcdw.py:301 rcgcdw.py:660
+#: rcgcdw.py:254 rcgcdw.py:645
msgid "Twitch link"
msgstr "Twitch-Link"
-#: rcgcdw.py:303 rcgcdw.py:662
+#: rcgcdw.py:256 rcgcdw.py:647
msgid "PSN link"
msgstr "PSN-Link"
-#: rcgcdw.py:305 rcgcdw.py:664
+#: rcgcdw.py:258 rcgcdw.py:649
msgid "VK link"
msgstr "VK-Link"
-#: rcgcdw.py:307 rcgcdw.py:666
+#: rcgcdw.py:260 rcgcdw.py:651
msgid "XVL link"
msgstr "Xbox-Live-Link"
-#: rcgcdw.py:309 rcgcdw.py:668
+#: rcgcdw.py:262 rcgcdw.py:653
msgid "Steam link"
msgstr "Steam-Link"
-#: rcgcdw.py:311 rcgcdw.py:670
+#: rcgcdw.py:264 rcgcdw.py:655
msgid "Discord handle"
msgstr "Discord-Link"
-#: rcgcdw.py:313
+#: rcgcdw.py:266
msgid "unknown"
msgstr "unbekannt"
-#: rcgcdw.py:314
+#: rcgcdw.py:267
#, python-brace-format
msgid "[{target}]({target_url})'s"
msgstr "dem Profil von [{target}]({target_url})"
-#: rcgcdw.py:314
+#: rcgcdw.py:267
#, python-brace-format
msgid "[their own]({target_url})"
msgstr "dem [eigenen Profil]({target_url})"
-#: rcgcdw.py:315
+#: rcgcdw.py:268
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*"
msgstr ""
"[{author}]({author_url}) bearbeitete den {field} auf {target}. *({desc})*"
-#: rcgcdw.py:329 rcgcdw.py:331 rcgcdw.py:701 rcgcdw.py:703
+#: rcgcdw.py:282 rcgcdw.py:284 rcgcdw.py:687 rcgcdw.py:689
msgid "none"
msgstr "keine"
-#: rcgcdw.py:337 rcgcdw.py:688
+#: rcgcdw.py:290 rcgcdw.py:674
msgid "System"
msgstr "System"
-#: rcgcdw.py:343
+#: rcgcdw.py:296
#, python-brace-format
msgid ""
"[{author}]({author_url}) protected [{article}]({article_url}) with the "
@@ -250,11 +250,11 @@ msgstr ""
"[{author}]({author_url}) schützte [{article}]({article_url}) {settings}"
"{comment}"
-#: rcgcdw.py:345 rcgcdw.py:354 rcgcdw.py:712 rcgcdw.py:719
+#: rcgcdw.py:298 rcgcdw.py:307 rcgcdw.py:698 rcgcdw.py:705
msgid " [cascading]"
msgstr " [kaskadierend]"
-#: rcgcdw.py:351
+#: rcgcdw.py:304
#, python-brace-format
msgid ""
"[{author}]({author_url}) modified protection settings of [{article}]"
@@ -263,7 +263,7 @@ msgstr ""
"[{author}]({author_url}) änderte den Schutzstatus von [{article}]"
"({article_url}) {settings}{comment}"
-#: rcgcdw.py:359
+#: rcgcdw.py:312
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed protection from [{article}]({article_url})"
@@ -272,7 +272,7 @@ msgstr ""
"[{author}]({author_url}) entfernte den Schutz von [{article}]({article_url})"
"{comment}"
-#: rcgcdw.py:364
+#: rcgcdw.py:317
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed visibility of revision on page [{article}]"
@@ -287,7 +287,7 @@ msgstr[1] ""
"[{author}]({author_url}) änderte die Sichtbarkeit von {amount} Versionen von "
"[{article}]({article_url}){comment}"
-#: rcgcdw.py:370
+#: rcgcdw.py:323
#, python-brace-format
msgid ""
"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
@@ -302,40 +302,40 @@ msgstr[1] ""
"[{author}]({author_url}) importierte [{article}]({article_url}) mit {count} "
"Versionen{comment}"
-#: rcgcdw.py:376
+#: rcgcdw.py:329
#, python-brace-format
msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
msgstr ""
"[{author}]({author_url}) stellte [{article}]({article_url}) wieder "
"her{comment}"
-#: rcgcdw.py:378
+#: rcgcdw.py:331
#, python-brace-format
msgid "[{author}]({author_url}) changed visibility of log events{comment}"
msgstr ""
"[{author}]({author_url}) änderte die Sichtbarkeit eines "
"Logbucheintrags{comment}"
-#: rcgcdw.py:380
+#: rcgcdw.py:333
#, python-brace-format
msgid "[{author}]({author_url}) imported interwiki{comment}"
msgstr "[{author}]({author_url}) importierte Interwiki{comment}"
-#: rcgcdw.py:383
+#: rcgcdw.py:336
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
msgstr ""
"[{author}]({author_url}) änderte [Missbrauchsfilter {number}]({filter_url})"
-#: rcgcdw.py:386
+#: rcgcdw.py:339
#, python-brace-format
msgid ""
"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
msgstr ""
"[{author}]({author_url}) erstellte [Missbrauchsfilter {number}]({filter_url})"
-#: rcgcdw.py:392
+#: rcgcdw.py:345
#, python-brace-format
msgid ""
"[{author}]({author_url}) merged revision histories of [{article}]"
@@ -344,7 +344,7 @@ msgstr ""
"[{author}]({author_url}) vereinigte Versionen von [{article}]({article_url}) "
"in [{dest}]({dest_url}){comment}"
-#: rcgcdw.py:396
+#: rcgcdw.py:349
#, python-brace-format
msgid ""
"[{author}]({author_url}) added an entry to the [interwiki table]"
@@ -353,7 +353,7 @@ msgstr ""
"[{author}]({author_url}) erstellte den [Interwiki-Präfix]({table_url}) "
"{prefix} nach {website}"
-#: rcgcdw.py:402
+#: rcgcdw.py:355
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
@@ -362,13 +362,13 @@ msgstr ""
"[{author}]({author_url}) bearbeitete den [Interwiki-Präfix]({table_url}) "
"{prefix} nach {website}"
-#: rcgcdw.py:408
+#: rcgcdw.py:361
#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
msgstr "[{author}]({author_url}) entfernte ein [Interwiki-Präfix]({table_url})"
-#: rcgcdw.py:412
+#: rcgcdw.py:365
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the content model of the page [{article}]"
@@ -377,14 +377,14 @@ msgstr ""
"[{author}]({author_url}) änderte das Inhaltsmodell der Seite [{article}]"
"({article_url}) von {old} zu {new}{comment}"
-#: rcgcdw.py:417
+#: rcgcdw.py:370
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
msgstr ""
"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
-#: rcgcdw.py:421
+#: rcgcdw.py:374
#, python-brace-format
msgid ""
"[{author}]({author_url}) created the sprite sheet for [{article}]"
@@ -393,77 +393,89 @@ msgstr ""
"[{author}]({author_url}) erstellte das Sprite-sheet für [{article}]"
"({article_url})"
-#: rcgcdw.py:425
+#: rcgcdw.py:378
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
msgstr ""
"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
-#: rcgcdw.py:428
+#: rcgcdw.py:381
#, python-brace-format
msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\""
msgstr ""
"[{author}]({author_url}) erstellte eine [Markierung]({tag_url}) \"{tag}\""
-#: rcgcdw.py:432
+#: rcgcdw.py:385
#, python-brace-format
msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\""
msgstr ""
"[{author}]({author_url}) löschte eine [Markierung]({tag_url}) \"{tag}\""
-#: rcgcdw.py:436
+#: rcgcdw.py:389
#, python-brace-format
msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\""
msgstr ""
"[{author}]({author_url}) aktivierte eine [Markierung]({tag_url}) \"{tag}\""
-#: rcgcdw.py:439
+#: rcgcdw.py:392
#, python-brace-format
msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\""
msgstr ""
"[{author}]({author_url}) deaktivierte eine [Markierung]({tag_url}) \"{tag}\""
-#: rcgcdw.py:442
+#: rcgcdw.py:394
msgid "An action has been hidden by administration."
msgstr "Eine Aktion wurde versteckt."
-#: rcgcdw.py:450 rcgcdw.py:704
+#: rcgcdw.py:403 rcgcdw.py:690
msgid "No description provided"
msgstr "Keine Zusammenfassung angegeben"
-#: rcgcdw.py:500
+#: rcgcdw.py:453
msgid "(N!) "
msgstr "(N!) "
-#: rcgcdw.py:501
+#: rcgcdw.py:454
msgid "m "
msgstr "K "
-#: rcgcdw.py:525 rcgcdw.py:560
+#: rcgcdw.py:473 rcgcdw.py:478
+msgid "__Only whitespace__"
+msgstr "__Nur Leerraum__"
+
+#: rcgcdw.py:484
+msgid "Removed"
+msgstr "Entfernt"
+
+#: rcgcdw.py:487
+msgid "Added"
+msgstr "Hinzugefügt"
+
+#: rcgcdw.py:513 rcgcdw.py:548
msgid "Options"
msgstr "Optionen"
-#: rcgcdw.py:525
+#: rcgcdw.py:513
#, python-brace-format
msgid "([preview]({link}) | [undo]({undolink}))"
msgstr "([Vorschau]({link}) | [zurücksetzen]({undolink}))"
-#: rcgcdw.py:527
+#: rcgcdw.py:515
#, python-brace-format
msgid "Uploaded a new version of {name}"
msgstr "Neue Dateiversion {name}"
-#: rcgcdw.py:529
+#: rcgcdw.py:517
#, python-brace-format
msgid "Uploaded {name}"
msgstr "Neue Datei {name}"
-#: rcgcdw.py:545
+#: rcgcdw.py:533
msgid "**No license!**"
msgstr "**Keine Lizenz!**"
-#: rcgcdw.py:557
+#: rcgcdw.py:545
msgid ""
"\n"
"License: {}"
@@ -471,472 +483,482 @@ msgstr ""
"\n"
"Lizenz: {}"
-#: rcgcdw.py:560
+#: rcgcdw.py:548
#, python-brace-format
msgid "([preview]({link}))"
msgstr "([Vorschau]({link}))"
-#: rcgcdw.py:565
+#: rcgcdw.py:553
#, python-brace-format
msgid "Deleted page {article}"
msgstr "Löschte {article}"
-#: rcgcdw.py:569
+#: rcgcdw.py:557
#, python-brace-format
msgid "Deleted redirect {article} by overwriting"
msgstr "Löschte die Weiterleitung {article} um Platz zu machen"
-#: rcgcdw.py:574
+#: rcgcdw.py:562
msgid "No redirect has been made"
msgstr "Die Erstellung einer Weiterleitung wurde unterdrückt"
-#: rcgcdw.py:575
+#: rcgcdw.py:563
msgid "A redirect has been made"
msgstr "Eine Weiterleitung wurde erstellt"
-#: rcgcdw.py:576
+#: rcgcdw.py:564
#, python-brace-format
msgid "Moved {redirect}{article} to {target}"
msgstr "Verschob {redirect}{article} nach {target}"
-#: rcgcdw.py:580
+#: rcgcdw.py:568
#, python-brace-format
msgid "Moved {redirect}{article} to {title} over redirect"
msgstr ""
"Verschob {redirect}{article} nach {title} und überschrieb eine Weiterleitung"
-#: rcgcdw.py:585
+#: rcgcdw.py:573
#, python-brace-format
msgid "Moved protection settings from {redirect}{article} to {title}"
msgstr "Verschob die Schutzeinstellungen von {redirect}{article} nach {title}"
-#: rcgcdw.py:608
+#: rcgcdw.py:596
#, python-brace-format
msgid "Blocked {blocked_user} for {time}"
msgstr "Sperrte {blocked_user} für {time}"
-#: rcgcdw.py:614
+#: rcgcdw.py:602
#, python-brace-format
msgid "Changed block settings for {blocked_user}"
msgstr "Änderte die Sperreinstellungen für {blocked_user}"
-#: rcgcdw.py:620
+#: rcgcdw.py:608
#, python-brace-format
msgid "Unblocked {blocked_user}"
msgstr "Hob die Sperre von {blocked_user} auf"
-#: rcgcdw.py:625
+#: rcgcdw.py:612
#, python-brace-format
msgid "Left a comment on {target}'s profile"
msgstr "Hinterließ ein Kommentar auf dem Profil von {target}"
-#: rcgcdw.py:627
+#: rcgcdw.py:614
msgid "Left a comment on their own profile"
msgstr "Hinterließ ein Kommentar auf dem eigenen Profil"
-#: rcgcdw.py:632
+#: rcgcdw.py:618
#, python-brace-format
msgid "Replied to a comment on {target}'s profile"
msgstr "Antwortete auf ein Kommentar auf dem Profil von {target}"
-#: rcgcdw.py:634
+#: rcgcdw.py:620
msgid "Replied to a comment on their own profile"
msgstr "Antwortete auf ein Kommentar auf dem eigenen Profil"
-#: rcgcdw.py:639
+#: rcgcdw.py:624
#, python-brace-format
msgid "Edited a comment on {target}'s profile"
msgstr "Bearbeitete ein Kommentar auf dem Profil von {target}"
-#: rcgcdw.py:641
+#: rcgcdw.py:626
msgid "Edited a comment on their own profile"
msgstr "Bearbeitete ein Kommentar auf dem eigenen Profil"
-#: rcgcdw.py:672 rcgcdw.py:811
+#: rcgcdw.py:657
+msgid "Battle.net handle"
+msgstr "Battle.net-Link"
+
+#: rcgcdw.py:659 rcgcdw.py:797
msgid "Unknown"
msgstr "Unbekannt"
-#: rcgcdw.py:673
+#: rcgcdw.py:660
#, python-brace-format
msgid "Edited {target}'s profile"
msgstr "Bearbeitete das Profil von {target}"
-#: rcgcdw.py:673
+#: rcgcdw.py:660
msgid "Edited their own profile"
msgstr "Bearbeitete das eigene Profil"
-#: rcgcdw.py:675
+#: rcgcdw.py:662
#, python-brace-format
msgid "Cleared the {field} field"
msgstr "Entfernte den {field}"
-#: rcgcdw.py:677
+#: rcgcdw.py:664
#, python-brace-format
msgid "{field} field changed to: {desc}"
msgstr "{field} geändert zu: {desc}"
-#: rcgcdw.py:682
+#: rcgcdw.py:668
#, python-brace-format
msgid "Deleted a comment on {target}'s profile"
msgstr "Löschte ein Kommentar auf dem Profil von {target}"
-#: rcgcdw.py:686
+#: rcgcdw.py:672
#, python-brace-format
msgid "Changed group membership for {target}"
msgstr "Änderte die Gruppenzugehörigkeit von {target}"
-#: rcgcdw.py:690
+#: rcgcdw.py:676
#, python-brace-format
msgid "{target} got autopromoted to a new usergroup"
msgstr "{target} got autopromoted to a new usergroup"
-#: rcgcdw.py:705
+#: rcgcdw.py:691
#, python-brace-format
msgid "Groups changed from {old_groups} to {new_groups}{reason}"
msgstr ""
"Änderte die Gruppenzugehörigkeit von {old_groups} auf {new_groups}{reason}"
-#: rcgcdw.py:710
+#: rcgcdw.py:696
#, python-brace-format
msgid "Protected {target}"
msgstr "Schützte {target}"
-#: rcgcdw.py:717
+#: rcgcdw.py:703
#, python-brace-format
msgid "Changed protection level for {article}"
msgstr "Änderte den Schutzstatus von {article}"
-#: rcgcdw.py:724
+#: rcgcdw.py:710
#, python-brace-format
msgid "Removed protection from {article}"
msgstr "Entfernte den Schutz von {article}"
-#: rcgcdw.py:729
+#: rcgcdw.py:715
#, python-brace-format
msgid "Changed visibility of revision on page {article} "
msgid_plural "Changed visibility of {amount} revisions on page {article} "
msgstr[0] "Änderte die Sichtbarkeit einer Versionen von {article} "
msgstr[1] "Änderte die Sichtbarkeit von {amount} Versionen von {article} "
-#: rcgcdw.py:735
+#: rcgcdw.py:721
#, python-brace-format
msgid "Imported {article} with {count} revision"
msgid_plural "Imported {article} with {count} revisions"
msgstr[0] "Importierte {article} mit einer Version"
msgstr[1] "Importierte {article} mit {count} Versionen"
-#: rcgcdw.py:741
+#: rcgcdw.py:727
#, python-brace-format
msgid "Restored {article}"
msgstr "Stellte {article} wieder her"
-#: rcgcdw.py:744
+#: rcgcdw.py:730
msgid "Changed visibility of log events"
msgstr "Änderte die Sichtbarkeit eines Logbucheintrags"
-#: rcgcdw.py:747
+#: rcgcdw.py:733
msgid "Imported interwiki"
msgstr "Importierte Interwiki"
-#: rcgcdw.py:750
+#: rcgcdw.py:736
#, python-brace-format
msgid "Edited abuse filter number {number}"
msgstr "Änderte Missbrauchsfilter {number}"
-#: rcgcdw.py:753
+#: rcgcdw.py:739
#, python-brace-format
msgid "Created abuse filter number {number}"
msgstr "Erstellte Missbrauchsfilter {number}"
-#: rcgcdw.py:757
+#: rcgcdw.py:743
#, python-brace-format
msgid "Merged revision histories of {article} into {dest}"
msgstr "Vereinigte Versionen von {article} in {dest}"
-#: rcgcdw.py:761
+#: rcgcdw.py:747
msgid "Added an entry to the interwiki table"
msgstr "Fügte ein Interwiki-Präfix hinzu"
-#: rcgcdw.py:762 rcgcdw.py:768
+#: rcgcdw.py:748 rcgcdw.py:754
#, python-brace-format
msgid "Prefix: {prefix}, website: {website} | {desc}"
msgstr "Präfix: {prefix}, URL: {website} | {desc}"
-#: rcgcdw.py:767
+#: rcgcdw.py:753
msgid "Edited an entry in interwiki table"
msgstr "Änderte ein Interwiki-Präfix"
-#: rcgcdw.py:773
+#: rcgcdw.py:759
msgid "Deleted an entry in interwiki table"
msgstr "Entfernte ein Interwiki-Präfix"
-#: rcgcdw.py:774
+#: rcgcdw.py:760
#, python-brace-format
msgid "Prefix: {prefix} | {desc}"
msgstr "Präfix: {prefix} | {desc}"
-#: rcgcdw.py:778
+#: rcgcdw.py:764
#, python-brace-format
msgid "Changed the content model of the page {article}"
msgstr "Änderte das Inhaltsmodell von {article}"
-#: rcgcdw.py:779
+#: rcgcdw.py:765
#, python-brace-format
msgid "Model changed from {old} to {new}: {reason}"
msgstr "Modell geändert von {old} zu {new}: {reason}"
-#: rcgcdw.py:785
+#: rcgcdw.py:771
#, python-brace-format
msgid "Edited the sprite for {article}"
msgstr "Edited the sprite for {article}"
-#: rcgcdw.py:789
+#: rcgcdw.py:775
#, python-brace-format
msgid "Created the sprite sheet for {article}"
msgstr "Created the sprite sheet for {article}"
-#: rcgcdw.py:793
+#: rcgcdw.py:779
#, python-brace-format
msgid "Edited the slice for {article}"
msgstr "Edited the slice for {article}"
-#: rcgcdw.py:796
+#: rcgcdw.py:782
#, python-brace-format
msgid "Created a tag \"{tag}\""
msgstr "Erstellte die Markierung \"{tag}\""
-#: rcgcdw.py:800
+#: rcgcdw.py:786
#, python-brace-format
msgid "Deleted a tag \"{tag}\""
msgstr "Löschte die Markierung \"{tag}\""
-#: rcgcdw.py:804
+#: rcgcdw.py:790
#, python-brace-format
msgid "Activated a tag \"{tag}\""
msgstr "Aktivierte die Markierung \"{tag}\""
-#: rcgcdw.py:807
+#: rcgcdw.py:793
#, python-brace-format
msgid "Deactivated a tag \"{tag}\""
msgstr "Deaktivierte die Markierung \"{tag}\""
-#: rcgcdw.py:810
+#: rcgcdw.py:796
msgid "Action has been hidden by administration."
msgstr "Aktion wurde versteckt"
-#: rcgcdw.py:837
+#: rcgcdw.py:823
msgid "Tags"
msgstr "Markierungen"
-#: rcgcdw.py:843
+#: rcgcdw.py:828
msgid "**Added**: "
msgstr "**Hinzugefügt:** "
-#: rcgcdw.py:843
+#: rcgcdw.py:828
msgid " and {} more\n"
msgstr " und {} mehr\n"
-#: rcgcdw.py:844
+#: rcgcdw.py:829
msgid "**Removed**: "
msgstr "**Entfernt:** "
-#: rcgcdw.py:844
+#: rcgcdw.py:829
msgid " and {} more"
msgstr " und {} mehr"
-#: rcgcdw.py:845
+#: rcgcdw.py:830
msgid "Changed categories"
msgstr "Geänderte Kategorien"
-#: rcgcdw.py:886
+#: rcgcdw.py:849
msgid "~~hidden~~"
msgstr "~~versteckt~~"
-#: rcgcdw.py:892
+#: rcgcdw.py:855
msgid "hidden"
msgstr "versteckt"
-#: rcgcdw.py:995
+#: rcgcdw.py:922 rcgcdw.py:924 rcgcdw.py:926 rcgcdw.py:928 rcgcdw.py:930
+#: rcgcdw.py:932 rcgcdw.py:934
+#, python-brace-format
+msgid "{value} (avg. {avg})"
+msgstr "{value} (vgl. {avg})"
+
+#: rcgcdw.py:975
msgid "Daily overview"
msgstr "Tägliche Übersicht"
-#: rcgcdw.py:1005
+#: rcgcdw.py:984
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] " (eine Aktion)"
msgstr[1] " ({} Aktionen)"
-#: rcgcdw.py:1009
+#: rcgcdw.py:986
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] " (eine Änderung)"
msgstr[1] " ({} Änderungen)"
-#: rcgcdw.py:1014
+#: rcgcdw.py:991
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] " UTC (eine Aktion)"
msgstr[1] " UTC ({} Aktionen)"
-#: rcgcdw.py:1016 rcgcdw.py:1017 rcgcdw.py:1021
+#: rcgcdw.py:993 rcgcdw.py:994 rcgcdw.py:998
msgid "But nobody came"
msgstr "Keine Aktivität"
-#: rcgcdw.py:1024
+#: rcgcdw.py:1002
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] "Aktivster Benutzer"
msgstr[1] "Aktivste Benutzer"
-#: rcgcdw.py:1025
+#: rcgcdw.py:1003
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] "Meist bearbeiteter Artikel"
msgstr[1] "Meist bearbeitete Artikel"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1004
msgid "Edits made"
msgstr "Bearbeitungen"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1004
msgid "New files"
msgstr "Neue Dateien"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1004
msgid "Admin actions"
msgstr "Admin-Aktionen"
-#: rcgcdw.py:1027
+#: rcgcdw.py:1005
msgid "Bytes changed"
msgstr "Bytes geändert"
-#: rcgcdw.py:1027
+#: rcgcdw.py:1005
msgid "New articles"
msgstr "Neue Artikel"
-#: rcgcdw.py:1028
+#: rcgcdw.py:1006
msgid "Unique contributors"
msgstr "Einzelne Autoren"
-#: rcgcdw.py:1029
+#: rcgcdw.py:1007
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] "Aktivste Stunde"
msgstr[1] "Aktivste Stunden"
-#: rcgcdw.py:1030
+#: rcgcdw.py:1008
msgid "Day score"
msgstr "Tageswert"
-#: rcgcdw.py:1177
+#: rcgcdw.py:1149
#, python-brace-format
msgid "Connection to {wiki} seems to be stable now."
msgstr "{wiki} scheint wieder erreichbar zu sein."
-#: rcgcdw.py:1178 rcgcdw.py:1289
+#: rcgcdw.py:1150 rcgcdw.py:1261
msgid "Connection status"
msgstr "Verbindungsstatus"
-#: rcgcdw.py:1288
+#: rcgcdw.py:1260
#, python-brace-format
msgid "{wiki} seems to be down or unreachable."
msgstr "Das {wiki} scheint unerreichbar zu sein."
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "director"
msgstr "Direktor"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "bot"
msgstr "Bot"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "editor"
msgstr "editor"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "directors"
msgstr "Direktor"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "sysop"
msgstr "Administrator"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "bureaucrat"
msgstr "Bürokrat"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "reviewer"
msgstr "reviewer"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "autoreview"
msgstr "autoreview"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "autopatrol"
msgstr "autopatrol"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "wiki_guardian"
msgstr "Wiki Guardian"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "second"
msgid_plural "seconds"
msgstr[0] "Sekunde"
msgstr[1] "Sekunden"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "minute"
msgid_plural "minutes"
msgstr[0] "Minute"
msgstr[1] "Minuten"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "hour"
msgid_plural "hours"
msgstr[0] "Stunde"
msgstr[1] "Stunden"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "day"
msgid_plural "days"
msgstr[0] "Tag"
msgstr[1] "Tage"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "week"
msgid_plural "weeks"
msgstr[0] "Woche"
msgstr[1] "Wochen"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "month"
msgid_plural "months"
msgstr[0] "Monat"
msgstr[1] "Monate"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "year"
msgid_plural "years"
msgstr[0] "Jahr"
msgstr[1] "Jahre"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "millennium"
msgid_plural "millennia"
msgstr[0] "Jahrtausend"
msgstr[1] "Jahrtausende"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "decade"
msgid_plural "decades"
msgstr[0] "Jahrzehnt"
msgstr[1] "Jahrzehnte"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "century"
msgid_plural "centuries"
msgstr[0] "Jahrhundert"
diff --git a/locale/en/LC_MESSAGES/misc.mo b/locale/en/LC_MESSAGES/misc.mo
new file mode 100644
index 0000000..2a92917
Binary files /dev/null and b/locale/en/LC_MESSAGES/misc.mo differ
diff --git a/locale/en/LC_MESSAGES/misc.po b/locale/en/LC_MESSAGES/misc.po
new file mode 100644
index 0000000..f1358ed
--- /dev/null
+++ b/locale/en/LC_MESSAGES/misc.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-05-20 17:18+0200\n"
+"PO-Revision-Date: 2019-05-20 17:32+0200\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.2.1\n"
+"Last-Translator: \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Language: en\n"
+
+#: misc.py:76
+msgid ""
+"\n"
+"__And more__"
+msgstr ""
+"\n"
+"__And more__"
diff --git a/locale/en/LC_MESSAGES/rcgcdw.mo b/locale/en/LC_MESSAGES/rcgcdw.mo
index f38a5ba..7a873ec 100644
Binary files a/locale/en/LC_MESSAGES/rcgcdw.mo and b/locale/en/LC_MESSAGES/rcgcdw.mo differ
diff --git a/locale/en/LC_MESSAGES/rcgcdw.po b/locale/en/LC_MESSAGES/rcgcdw.po
index 58e843c..1052c89 100644
--- a/locale/en/LC_MESSAGES/rcgcdw.po
+++ b/locale/en/LC_MESSAGES/rcgcdw.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-03 11:33+0200\n"
-"PO-Revision-Date: 2019-05-03 11:38+0200\n"
+"POT-Creation-Date: 2019-05-20 17:17+0200\n"
+"PO-Revision-Date: 2019-05-20 17:31+0200\n"
"Last-Translator: Frisk \n"
"Language-Team: \n"
"Language: en\n"
@@ -18,7 +18,7 @@ msgstr ""
"X-Generator: Poedit 2.2.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: rcgcdw.py:177
+#: rcgcdw.py:184
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}"
@@ -27,7 +27,7 @@ msgstr ""
"[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}"
"{edit_size})"
-#: rcgcdw.py:179
+#: rcgcdw.py:186
#, python-brace-format
msgid ""
"[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}"
@@ -36,12 +36,12 @@ msgstr ""
"[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}"
"{edit_size})"
-#: rcgcdw.py:183
+#: rcgcdw.py:190
#, python-brace-format
msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
msgstr "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
-#: rcgcdw.py:191
+#: rcgcdw.py:198
#, python-brace-format
msgid ""
"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
@@ -50,12 +50,12 @@ msgstr ""
"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
"{comment}"
-#: rcgcdw.py:195
+#: rcgcdw.py:202
#, python-brace-format
msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
msgstr "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
-#: rcgcdw.py:200
+#: rcgcdw.py:207
#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
@@ -64,33 +64,33 @@ msgstr ""
"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
"({page_link}){comment}"
-#: rcgcdw.py:205 rcgcdw.py:211
+#: rcgcdw.py:212 rcgcdw.py:218
msgid "without making a redirect"
msgstr "without making a redirect"
-#: rcgcdw.py:205 rcgcdw.py:212
+#: rcgcdw.py:212 rcgcdw.py:219
msgid "with a redirect"
msgstr "with a redirect"
-#: rcgcdw.py:206
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
-"({target_url}) {made_a_redirect}{comment}"
-msgstr ""
-"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
-"({target_url}) {made_a_redirect}{comment}"
-
#: rcgcdw.py:213
#, python-brace-format
msgid ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+msgstr ""
+"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
+"({target_url}) {made_a_redirect}{comment}"
+
+#: rcgcdw.py:220
+#, python-brace-format
+msgid ""
"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
"[{target}]({target_url}) {made_a_redirect}{comment}"
msgstr ""
"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
"[{target}]({target_url}) {made_a_redirect}{comment}"
-#: rcgcdw.py:219
+#: rcgcdw.py:226
#, python-brace-format
msgid ""
"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
@@ -99,18 +99,18 @@ msgstr ""
"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
"* to [{target}]({target_url}){comment}"
-#: rcgcdw.py:231 rcgcdw.py:598
+#: rcgcdw.py:238 rcgcdw.py:637
msgid "infinity and beyond"
msgstr "infinity and beyond"
-#: rcgcdw.py:246
+#: rcgcdw.py:253
#, python-brace-format
msgid ""
"[{author}]({author_url}) blocked [{user}]({user_url}) for {time}{comment}"
msgstr ""
"[{author}]({author_url}) blocked [{user}]({user_url}) for {time}{comment}"
-#: rcgcdw.py:251
+#: rcgcdw.py:258
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed block settings for [{blocked_user}]"
@@ -119,25 +119,25 @@ msgstr ""
"[{author}]({author_url}) changed block settings for [{blocked_user}]"
"({user_url}){comment}"
-#: rcgcdw.py:256
+#: rcgcdw.py:263
#, python-brace-format
msgid ""
"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
msgstr ""
"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
-#: rcgcdw.py:260
+#: rcgcdw.py:267
#, python-brace-format
msgid ""
"[{author}]({author_url}) left a [comment]({comment}) on {target} profile"
msgstr ""
"[{author}]({author_url}) left a [comment]({comment}) on {target} profile"
-#: rcgcdw.py:260
+#: rcgcdw.py:267
msgid "their own profile"
msgstr "their own profile"
-#: rcgcdw.py:265
+#: rcgcdw.py:272
#, python-brace-format
msgid ""
"[{author}]({author_url}) replied to a [comment]({comment}) on {target} "
@@ -146,100 +146,100 @@ msgstr ""
"[{author}]({author_url}) replied to a [comment]({comment}) on {target} "
"profile"
-#: rcgcdw.py:268 rcgcdw.py:276 rcgcdw.py:283
+#: rcgcdw.py:275 rcgcdw.py:283 rcgcdw.py:287
msgid "their own"
msgstr "their own"
-#: rcgcdw.py:273
+#: rcgcdw.py:280
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited a [comment]({comment}) on {target} profile"
msgstr ""
"[{author}]({author_url}) edited a [comment]({comment}) on {target} profile"
-#: rcgcdw.py:281
+#: rcgcdw.py:285
#, python-brace-format
msgid "[{author}]({author_url}) deleted a comment on {target} profile"
msgstr "[{author}]({author_url}) deleted a comment on {target} profile"
-#: rcgcdw.py:289 rcgcdw.py:648
+#: rcgcdw.py:293 rcgcdw.py:684
msgid "Location"
msgstr "Location"
-#: rcgcdw.py:291 rcgcdw.py:650
+#: rcgcdw.py:295 rcgcdw.py:686
msgid "About me"
msgstr "About me"
-#: rcgcdw.py:293 rcgcdw.py:652
+#: rcgcdw.py:297 rcgcdw.py:688
msgid "Google link"
msgstr "Google link"
-#: rcgcdw.py:295 rcgcdw.py:654
+#: rcgcdw.py:299 rcgcdw.py:690
msgid "Facebook link"
msgstr "Facebook link"
-#: rcgcdw.py:297 rcgcdw.py:656
+#: rcgcdw.py:301 rcgcdw.py:692
msgid "Twitter link"
msgstr "Twitter link"
-#: rcgcdw.py:299 rcgcdw.py:658
+#: rcgcdw.py:303 rcgcdw.py:694
msgid "Reddit link"
msgstr "Reddit link"
-#: rcgcdw.py:301 rcgcdw.py:660
+#: rcgcdw.py:305 rcgcdw.py:696
msgid "Twitch link"
msgstr "Twitch link"
-#: rcgcdw.py:303 rcgcdw.py:662
+#: rcgcdw.py:307 rcgcdw.py:698
msgid "PSN link"
msgstr "PSN link"
-#: rcgcdw.py:305 rcgcdw.py:664
+#: rcgcdw.py:309 rcgcdw.py:700
msgid "VK link"
msgstr "VK link"
-#: rcgcdw.py:307 rcgcdw.py:666
+#: rcgcdw.py:311 rcgcdw.py:702
msgid "XVL link"
msgstr "XVL link"
-#: rcgcdw.py:309 rcgcdw.py:668
+#: rcgcdw.py:313 rcgcdw.py:704
msgid "Steam link"
msgstr "Steam link"
-#: rcgcdw.py:311 rcgcdw.py:670
+#: rcgcdw.py:315 rcgcdw.py:706
msgid "Discord handle"
msgstr "Discord handle"
-#: rcgcdw.py:313
+#: rcgcdw.py:317
msgid "unknown"
msgstr "unknown"
-#: rcgcdw.py:314
+#: rcgcdw.py:318
#, python-brace-format
msgid "[{target}]({target_url})'s"
msgstr "[{target}]({target_url})'s"
-#: rcgcdw.py:314
+#: rcgcdw.py:318
#, python-brace-format
msgid "[their own]({target_url})"
msgstr "[their own]({target_url})"
-#: rcgcdw.py:315
+#: rcgcdw.py:319
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*"
msgstr ""
"[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*"
-#: rcgcdw.py:329 rcgcdw.py:331 rcgcdw.py:701 rcgcdw.py:703
+#: rcgcdw.py:333 rcgcdw.py:335 rcgcdw.py:736 rcgcdw.py:738
msgid "none"
msgstr "none"
-#: rcgcdw.py:337 rcgcdw.py:688
+#: rcgcdw.py:341 rcgcdw.py:723
msgid "System"
msgstr "System"
-#: rcgcdw.py:343
+#: rcgcdw.py:347
#, python-brace-format
msgid ""
"[{author}]({author_url}) protected [{article}]({article_url}) with the "
@@ -248,11 +248,11 @@ msgstr ""
"[{author}]({author_url}) protected [{article}]({article_url}) with the "
"following settings: {settings}{comment}"
-#: rcgcdw.py:345 rcgcdw.py:354 rcgcdw.py:712 rcgcdw.py:719
+#: rcgcdw.py:349 rcgcdw.py:358 rcgcdw.py:747 rcgcdw.py:754
msgid " [cascading]"
msgstr " [cascading]"
-#: rcgcdw.py:351
+#: rcgcdw.py:355
#, python-brace-format
msgid ""
"[{author}]({author_url}) modified protection settings of [{article}]"
@@ -261,7 +261,7 @@ msgstr ""
"[{author}]({author_url}) modified protection settings of [{article}]"
"({article_url}) to: {settings}{comment}"
-#: rcgcdw.py:359
+#: rcgcdw.py:363
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed protection from [{article}]({article_url})"
@@ -270,7 +270,7 @@ msgstr ""
"[{author}]({author_url}) removed protection from [{article}]({article_url})"
"{comment}"
-#: rcgcdw.py:364
+#: rcgcdw.py:368
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed visibility of revision on page [{article}]"
@@ -285,7 +285,7 @@ msgstr[1] ""
"[{author}]({author_url}) changed visibility of {amount} revisions on page "
"[{article}]({article_url}){comment}"
-#: rcgcdw.py:370
+#: rcgcdw.py:374
#, python-brace-format
msgid ""
"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
@@ -300,54 +300,54 @@ msgstr[1] ""
"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
"revisions{comment}"
-#: rcgcdw.py:376
+#: rcgcdw.py:380
#, python-brace-format
msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
msgstr "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
-#: rcgcdw.py:378
+#: rcgcdw.py:382
#, python-brace-format
msgid "[{author}]({author_url}) changed visibility of log events{comment}"
msgstr "[{author}]({author_url}) changed visibility of log events{comment}"
-#: rcgcdw.py:380
+#: rcgcdw.py:384
#, python-brace-format
msgid "[{author}]({author_url}) imported interwiki{comment}"
msgstr "[{author}]({author_url}) imported interwiki{comment}"
-#: rcgcdw.py:383
+#: rcgcdw.py:387
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
msgstr ""
"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
-#: rcgcdw.py:386
+#: rcgcdw.py:390
#, python-brace-format
msgid ""
"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
msgstr ""
"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
-#: rcgcdw.py:392
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) merged revision histories of [{article}]"
-"({article_url}) into [{dest}]({dest_url}){comment}"
-msgstr ""
-"[{author}]({author_url}) merged revision histories of [{article}]"
-"({article_url}) into [{dest}]({dest_url}){comment}"
-
#: rcgcdw.py:396
#, python-brace-format
msgid ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+msgstr ""
+"[{author}]({author_url}) merged revision histories of [{article}]"
+"({article_url}) into [{dest}]({dest_url}){comment}"
+
+#: rcgcdw.py:400
+#, python-brace-format
+msgid ""
"[{author}]({author_url}) added an entry to the [interwiki table]"
"({table_url}) pointing to {website} with {prefix} prefix"
msgstr ""
"[{author}]({author_url}) added an entry to the [interwiki table]"
"({table_url}) pointing to {website} with {prefix} prefix"
-#: rcgcdw.py:402
+#: rcgcdw.py:406
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
@@ -356,105 +356,119 @@ msgstr ""
"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
"pointing to {website} with {prefix} prefix"
-#: rcgcdw.py:408
-#, python-brace-format
-msgid ""
-"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
-msgstr ""
-"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
-
#: rcgcdw.py:412
#, python-brace-format
msgid ""
-"[{author}]({author_url}) changed the content model of the page [{article}]"
-"({article_url}) from {old} to {new}{comment}"
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
msgstr ""
-"[{author}]({author_url}) changed the content model of the page [{article}]"
-"({article_url}) from {old} to {new}{comment}"
+"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
-#: rcgcdw.py:417
+#: rcgcdw.py:416
#, python-brace-format
msgid ""
-"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
msgstr ""
-"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
+"[{author}]({author_url}) changed the content model of the page [{article}]"
+"({article_url}) from {old} to {new}{comment}"
#: rcgcdw.py:421
#, python-brace-format
msgid ""
-"[{author}]({author_url}) created the sprite sheet for [{article}]"
-"({article_url})"
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
msgstr ""
-"[{author}]({author_url}) created the sprite sheet for [{article}]"
-"({article_url})"
+"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
#: rcgcdw.py:425
#, python-brace-format
msgid ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+msgstr ""
+"[{author}]({author_url}) created the sprite sheet for [{article}]"
+"({article_url})"
+
+#: rcgcdw.py:429
+#, python-brace-format
+msgid ""
"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
msgstr ""
"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
-#: rcgcdw.py:428
+#: rcgcdw.py:432
#, python-brace-format
msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\""
msgstr "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\""
-#: rcgcdw.py:432
+#: rcgcdw.py:436
#, python-brace-format
msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\""
msgstr "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\""
-#: rcgcdw.py:436
+#: rcgcdw.py:440
#, python-brace-format
msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\""
msgstr "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\""
-#: rcgcdw.py:439
+#: rcgcdw.py:443
#, python-brace-format
msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\""
msgstr "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\""
-#: rcgcdw.py:442
+#: rcgcdw.py:445
msgid "An action has been hidden by administration."
msgstr "An action has been hidden by administration."
-#: rcgcdw.py:450 rcgcdw.py:704
+#: rcgcdw.py:454 rcgcdw.py:739
msgid "No description provided"
msgstr "No description provided"
-#: rcgcdw.py:500
+#: rcgcdw.py:504
msgid "(N!) "
msgstr "(N!) "
-#: rcgcdw.py:501
+#: rcgcdw.py:505
msgid "m "
msgstr "m "
-#: rcgcdw.py:525 rcgcdw.py:560
+#: rcgcdw.py:524 rcgcdw.py:529
+msgid "__Only whitespace__"
+msgstr "__Only whitespace__"
+
+#: rcgcdw.py:535
+#| msgid "**Removed**: "
+msgid "Removed"
+msgstr "Removed"
+
+#: rcgcdw.py:538
+#| msgid "**Added**: "
+msgid "Added"
+msgstr "Added"
+
+#: rcgcdw.py:564 rcgcdw.py:599
msgid "Options"
msgstr "Options"
-#: rcgcdw.py:525
+#: rcgcdw.py:564
#, python-brace-format
msgid "([preview]({link}) | [undo]({undolink}))"
msgstr "([preview]({link}) | [undo]({undolink}))"
-#: rcgcdw.py:527
+#: rcgcdw.py:566
#, python-brace-format
msgid "Uploaded a new version of {name}"
msgstr "Uploaded a new version of {name}"
-#: rcgcdw.py:529
+#: rcgcdw.py:568
#, python-brace-format
msgid "Uploaded {name}"
msgstr "Uploaded {name}"
-#: rcgcdw.py:545
+#: rcgcdw.py:584
msgid "**No license!**"
msgstr "**No license!**"
-#: rcgcdw.py:557
+#: rcgcdw.py:596
msgid ""
"\n"
"License: {}"
@@ -462,470 +476,476 @@ msgstr ""
"\n"
"License: {}"
-#: rcgcdw.py:560
+#: rcgcdw.py:599
#, python-brace-format
msgid "([preview]({link}))"
msgstr "([preview]({link}))"
-#: rcgcdw.py:565
+#: rcgcdw.py:604
#, python-brace-format
msgid "Deleted page {article}"
msgstr "Deleted page {article}"
-#: rcgcdw.py:569
+#: rcgcdw.py:608
#, python-brace-format
msgid "Deleted redirect {article} by overwriting"
msgstr "Deleted redirect {article} by overwriting"
-#: rcgcdw.py:574
+#: rcgcdw.py:613
msgid "No redirect has been made"
msgstr "No redirect has been made"
-#: rcgcdw.py:575
+#: rcgcdw.py:614
msgid "A redirect has been made"
msgstr "A redirect has been made"
-#: rcgcdw.py:576
+#: rcgcdw.py:615
#, python-brace-format
msgid "Moved {redirect}{article} to {target}"
msgstr "Moved {redirect}{article} to {target}"
-#: rcgcdw.py:580
+#: rcgcdw.py:619
#, python-brace-format
msgid "Moved {redirect}{article} to {title} over redirect"
msgstr "Moved {redirect}{article} to {title} over redirect"
-#: rcgcdw.py:585
+#: rcgcdw.py:624
#, python-brace-format
msgid "Moved protection settings from {redirect}{article} to {title}"
msgstr "Moved protection settings from {redirect}{article} to {title}"
-#: rcgcdw.py:608
+#: rcgcdw.py:647
#, python-brace-format
msgid "Blocked {blocked_user} for {time}"
msgstr "Blocked {blocked_user} for {time}"
-#: rcgcdw.py:614
+#: rcgcdw.py:653
#, python-brace-format
msgid "Changed block settings for {blocked_user}"
msgstr "Changed block settings for {blocked_user}"
-#: rcgcdw.py:620
+#: rcgcdw.py:659
#, python-brace-format
msgid "Unblocked {blocked_user}"
msgstr "Unblocked {blocked_user}"
-#: rcgcdw.py:625
+#: rcgcdw.py:663
#, python-brace-format
msgid "Left a comment on {target}'s profile"
msgstr "Left a comment on {target}'s profile"
-#: rcgcdw.py:627
+#: rcgcdw.py:665
msgid "Left a comment on their own profile"
msgstr "Left a comment on their own profile"
-#: rcgcdw.py:632
+#: rcgcdw.py:669
#, python-brace-format
msgid "Replied to a comment on {target}'s profile"
msgstr "Replied to a comment on {target}'s profile"
-#: rcgcdw.py:634
+#: rcgcdw.py:671
msgid "Replied to a comment on their own profile"
msgstr "Replied to a comment on their own profile"
-#: rcgcdw.py:639
+#: rcgcdw.py:675
#, python-brace-format
msgid "Edited a comment on {target}'s profile"
msgstr "Edited a comment on {target}'s profile"
-#: rcgcdw.py:641
+#: rcgcdw.py:677
msgid "Edited a comment on their own profile"
msgstr "Edited a comment on their own profile"
-#: rcgcdw.py:672 rcgcdw.py:811
+#: rcgcdw.py:708 rcgcdw.py:846
msgid "Unknown"
msgstr "Unknown"
-#: rcgcdw.py:673
+#: rcgcdw.py:709
#, python-brace-format
msgid "Edited {target}'s profile"
msgstr "Edited {target}'s profile"
-#: rcgcdw.py:673
+#: rcgcdw.py:709
msgid "Edited their own profile"
msgstr "Edited their own profile"
-#: rcgcdw.py:675
+#: rcgcdw.py:711
#, python-brace-format
msgid "Cleared the {field} field"
msgstr "Cleared the {field} field"
-#: rcgcdw.py:677
+#: rcgcdw.py:713
#, python-brace-format
msgid "{field} field changed to: {desc}"
msgstr "{field} field changed to: {desc}"
-#: rcgcdw.py:682
+#: rcgcdw.py:717
#, python-brace-format
msgid "Deleted a comment on {target}'s profile"
msgstr "Deleted a comment on {target}'s profile"
-#: rcgcdw.py:686
+#: rcgcdw.py:721
#, python-brace-format
msgid "Changed group membership for {target}"
msgstr "Changed group membership for {target}"
-#: rcgcdw.py:690
+#: rcgcdw.py:725
#, python-brace-format
msgid "{target} got autopromoted to a new usergroup"
msgstr "{target} got autopromoted to a new usergroup"
-#: rcgcdw.py:705
+#: rcgcdw.py:740
#, python-brace-format
msgid "Groups changed from {old_groups} to {new_groups}{reason}"
msgstr "Groups changed from {old_groups} to {new_groups}{reason}"
-#: rcgcdw.py:710
+#: rcgcdw.py:745
#, python-brace-format
msgid "Protected {target}"
msgstr "Protected {target}"
-#: rcgcdw.py:717
+#: rcgcdw.py:752
#, python-brace-format
msgid "Changed protection level for {article}"
msgstr "Changed protection level for {article}"
-#: rcgcdw.py:724
+#: rcgcdw.py:759
#, python-brace-format
msgid "Removed protection from {article}"
msgstr "Removed protection from {article}"
-#: rcgcdw.py:729
+#: rcgcdw.py:764
#, python-brace-format
msgid "Changed visibility of revision on page {article} "
msgid_plural "Changed visibility of {amount} revisions on page {article} "
msgstr[0] "Changed visibility of revision on page {article} "
msgstr[1] "Changed visibility of {amount} revisions on page {article} "
-#: rcgcdw.py:735
+#: rcgcdw.py:770
#, python-brace-format
msgid "Imported {article} with {count} revision"
msgid_plural "Imported {article} with {count} revisions"
msgstr[0] "Imported {article} with {count} revision"
msgstr[1] "Imported {article} with {count} revisions"
-#: rcgcdw.py:741
+#: rcgcdw.py:776
#, python-brace-format
msgid "Restored {article}"
msgstr "Restored {article}"
-#: rcgcdw.py:744
+#: rcgcdw.py:779
msgid "Changed visibility of log events"
msgstr "Changed visibility of log events"
-#: rcgcdw.py:747
+#: rcgcdw.py:782
msgid "Imported interwiki"
msgstr "Imported interwiki"
-#: rcgcdw.py:750
+#: rcgcdw.py:785
#, python-brace-format
msgid "Edited abuse filter number {number}"
msgstr "Edited abuse filter number {number}"
-#: rcgcdw.py:753
+#: rcgcdw.py:788
#, python-brace-format
msgid "Created abuse filter number {number}"
msgstr "Created abuse filter number {number}"
-#: rcgcdw.py:757
+#: rcgcdw.py:792
#, python-brace-format
msgid "Merged revision histories of {article} into {dest}"
msgstr "Merged revision histories of {article} into {dest}"
-#: rcgcdw.py:761
+#: rcgcdw.py:796
msgid "Added an entry to the interwiki table"
msgstr "Added an entry to the interwiki table"
-#: rcgcdw.py:762 rcgcdw.py:768
+#: rcgcdw.py:797 rcgcdw.py:803
#, python-brace-format
msgid "Prefix: {prefix}, website: {website} | {desc}"
msgstr "Prefix: {prefix}, website: {website} | {desc}"
-#: rcgcdw.py:767
+#: rcgcdw.py:802
msgid "Edited an entry in interwiki table"
msgstr "Edited an entry in interwiki table"
-#: rcgcdw.py:773
+#: rcgcdw.py:808
msgid "Deleted an entry in interwiki table"
msgstr "Deleted an entry in interwiki table"
-#: rcgcdw.py:774
+#: rcgcdw.py:809
#, python-brace-format
msgid "Prefix: {prefix} | {desc}"
msgstr "Prefix: {prefix} | {desc}"
-#: rcgcdw.py:778
+#: rcgcdw.py:813
#, python-brace-format
msgid "Changed the content model of the page {article}"
msgstr "Changed the content model of the page {article}"
-#: rcgcdw.py:779
+#: rcgcdw.py:814
#, python-brace-format
msgid "Model changed from {old} to {new}: {reason}"
msgstr "Model changed from {old} to {new}: {reason}"
-#: rcgcdw.py:785
+#: rcgcdw.py:820
#, python-brace-format
msgid "Edited the sprite for {article}"
msgstr "Edited the sprite for {article}"
-#: rcgcdw.py:789
+#: rcgcdw.py:824
#, python-brace-format
msgid "Created the sprite sheet for {article}"
msgstr "Created the sprite sheet for {article}"
-#: rcgcdw.py:793
+#: rcgcdw.py:828
#, python-brace-format
msgid "Edited the slice for {article}"
msgstr "Edited the slice for {article}"
-#: rcgcdw.py:796
+#: rcgcdw.py:831
#, python-brace-format
msgid "Created a tag \"{tag}\""
msgstr "Created a tag \"{tag}\""
-#: rcgcdw.py:800
+#: rcgcdw.py:835
#, python-brace-format
msgid "Deleted a tag \"{tag}\""
msgstr "Deleted a tag \"{tag}\""
-#: rcgcdw.py:804
+#: rcgcdw.py:839
#, python-brace-format
msgid "Activated a tag \"{tag}\""
msgstr "Activated a tag \"{tag}\""
-#: rcgcdw.py:807
+#: rcgcdw.py:842
#, python-brace-format
msgid "Deactivated a tag \"{tag}\""
msgstr "Deactivated a tag \"{tag}\""
-#: rcgcdw.py:810
+#: rcgcdw.py:845
msgid "Action has been hidden by administration."
msgstr "Action has been hidden by administration."
-#: rcgcdw.py:837
+#: rcgcdw.py:872
msgid "Tags"
msgstr "Tags"
-#: rcgcdw.py:843
+#: rcgcdw.py:877
msgid "**Added**: "
msgstr "**Added**: "
-#: rcgcdw.py:843
+#: rcgcdw.py:877
msgid " and {} more\n"
msgstr " and {} more\n"
-#: rcgcdw.py:844
+#: rcgcdw.py:878
msgid "**Removed**: "
msgstr "**Removed**: "
-#: rcgcdw.py:844
+#: rcgcdw.py:878
msgid " and {} more"
msgstr " and {} more"
-#: rcgcdw.py:845
+#: rcgcdw.py:879
msgid "Changed categories"
msgstr "Changed categories"
-#: rcgcdw.py:886
+#: rcgcdw.py:920
msgid "~~hidden~~"
msgstr "~~hidden~~"
-#: rcgcdw.py:892
+#: rcgcdw.py:926
msgid "hidden"
msgstr "hidden"
-#: rcgcdw.py:995
+#: rcgcdw.py:1000 rcgcdw.py:1002 rcgcdw.py:1004 rcgcdw.py:1006 rcgcdw.py:1008
+#: rcgcdw.py:1010 rcgcdw.py:1012
+#, python-brace-format
+msgid "{value} (avg. {avg})"
+msgstr "{value} (avg. {avg})"
+
+#: rcgcdw.py:1053
msgid "Daily overview"
msgstr "Daily overview"
-#: rcgcdw.py:1005
+#: rcgcdw.py:1062
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] " ({} action)"
msgstr[1] " ({} actions)"
-#: rcgcdw.py:1009
+#: rcgcdw.py:1064
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] " ({} edit)"
msgstr[1] " ({} edits)"
-#: rcgcdw.py:1014
+#: rcgcdw.py:1069
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] " UTC ({} action)"
msgstr[1] " UTC ({} actions)"
-#: rcgcdw.py:1016 rcgcdw.py:1017 rcgcdw.py:1021
+#: rcgcdw.py:1071 rcgcdw.py:1072 rcgcdw.py:1076
msgid "But nobody came"
msgstr "But nobody came"
-#: rcgcdw.py:1024
+#: rcgcdw.py:1080
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] "Most active user"
msgstr[1] "Most active users"
-#: rcgcdw.py:1025
+#: rcgcdw.py:1081
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] "Most edited article"
msgstr[1] "Most edited articles"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1082
msgid "Edits made"
msgstr "Edits made"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1082
msgid "New files"
msgstr "New files"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1082
msgid "Admin actions"
msgstr "Admin actions"
-#: rcgcdw.py:1027
+#: rcgcdw.py:1083
msgid "Bytes changed"
msgstr "Bytes changed"
-#: rcgcdw.py:1027
+#: rcgcdw.py:1083
msgid "New articles"
msgstr "New articles"
-#: rcgcdw.py:1028
+#: rcgcdw.py:1084
msgid "Unique contributors"
msgstr "Unique contributors"
-#: rcgcdw.py:1029
+#: rcgcdw.py:1085
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] "Most active hour"
msgstr[1] "Most active hours"
-#: rcgcdw.py:1030
+#: rcgcdw.py:1086
msgid "Day score"
msgstr "Day score"
-#: rcgcdw.py:1177
+#: rcgcdw.py:1227
#, python-brace-format
msgid "Connection to {wiki} seems to be stable now."
msgstr "Connection to {wiki} seems to be stable now."
-#: rcgcdw.py:1178 rcgcdw.py:1289
+#: rcgcdw.py:1228 rcgcdw.py:1339
msgid "Connection status"
msgstr "Connection status"
-#: rcgcdw.py:1288
+#: rcgcdw.py:1338
#, python-brace-format
msgid "{wiki} seems to be down or unreachable."
msgstr "{wiki} seems to be down or unreachable."
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "director"
msgstr "Director"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "bot"
msgstr "Bot"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "editor"
msgstr "Editor"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "directors"
msgstr "Directors"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "sysop"
msgstr "Administrator"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "bureaucrat"
msgstr "Bureaucrat"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "reviewer"
msgstr "Reviewer"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "autoreview"
msgstr "Autoreview"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "autopatrol"
msgstr "Autopatrol"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "wiki_guardian"
msgstr "Wiki guardian"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "second"
msgid_plural "seconds"
msgstr[0] "second"
msgstr[1] "seconds"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minute"
msgstr[1] "minutes"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "hour"
msgid_plural "hours"
msgstr[0] "hour"
msgstr[1] "hours"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "day"
msgid_plural "days"
msgstr[0] "day"
msgstr[1] "days"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "week"
msgid_plural "weeks"
msgstr[0] "week"
msgstr[1] "weeks"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "month"
msgid_plural "months"
msgstr[0] "month"
msgstr[1] "months"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "year"
msgid_plural "years"
msgstr[0] "year"
msgstr[1] "years"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "millennium"
msgid_plural "millennia"
msgstr[0] "millennium"
msgstr[1] "millennia"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "decade"
msgid_plural "decades"
msgstr[0] "decade"
msgstr[1] "decades"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "century"
msgid_plural "centuries"
msgstr[0] "century"
diff --git a/locale/fr/LC_MESSAGES/misc.mo b/locale/fr/LC_MESSAGES/misc.mo
new file mode 100644
index 0000000..6b75484
Binary files /dev/null and b/locale/fr/LC_MESSAGES/misc.mo differ
diff --git a/locale/fr/LC_MESSAGES/misc.po b/locale/fr/LC_MESSAGES/misc.po
new file mode 100644
index 0000000..10034b3
--- /dev/null
+++ b/locale/fr/LC_MESSAGES/misc.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-05-20 17:18+0200\n"
+"PO-Revision-Date: 2019-05-21 01:24+0200\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.2.1\n"
+"Last-Translator: \n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Language: fr\n"
+
+#: misc.py:76
+msgid ""
+"\n"
+"__And more__"
+msgstr ""
+"\n"
+"__Et plus__"
diff --git a/locale/fr/LC_MESSAGES/rcgcdw.mo b/locale/fr/LC_MESSAGES/rcgcdw.mo
index 1e1ad4a..a1196d7 100644
Binary files a/locale/fr/LC_MESSAGES/rcgcdw.mo and b/locale/fr/LC_MESSAGES/rcgcdw.mo differ
diff --git a/locale/fr/LC_MESSAGES/rcgcdw.po b/locale/fr/LC_MESSAGES/rcgcdw.po
index 57386c4..35efd16 100644
--- a/locale/fr/LC_MESSAGES/rcgcdw.po
+++ b/locale/fr/LC_MESSAGES/rcgcdw.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-03 11:33+0200\n"
-"PO-Revision-Date: 2019-05-03 11:36+0200\n"
+"POT-Creation-Date: 2019-05-20 17:17+0200\n"
+"PO-Revision-Date: 2019-05-21 01:26+0200\n"
"Last-Translator: Frisk \n"
"Language-Team: \n"
"Language: fr\n"
@@ -20,67 +20,67 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Poedit-SearchPath-0: rcgcdw.pot\n"
-#: rcgcdw.py:177
+#: rcgcdw.py:184
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}"
"{edit_size})"
msgstr ""
-#: rcgcdw.py:179
+#: rcgcdw.py:186
#, python-brace-format
msgid ""
"[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}"
"{edit_size})"
msgstr ""
-#: rcgcdw.py:183
+#: rcgcdw.py:190
#, python-brace-format
msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
msgstr ""
-#: rcgcdw.py:191
+#: rcgcdw.py:198
#, python-brace-format
msgid ""
"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
"{comment}"
msgstr ""
-#: rcgcdw.py:195
+#: rcgcdw.py:202
#, python-brace-format
msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
msgstr ""
-#: rcgcdw.py:200
+#: rcgcdw.py:207
#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
"({page_link}){comment}"
msgstr ""
-#: rcgcdw.py:205 rcgcdw.py:211
+#: rcgcdw.py:212 rcgcdw.py:218
msgid "without making a redirect"
msgstr ""
-#: rcgcdw.py:205 rcgcdw.py:212
+#: rcgcdw.py:212 rcgcdw.py:219
msgid "with a redirect"
msgstr ""
-#: rcgcdw.py:206
+#: rcgcdw.py:213
#, python-brace-format
msgid ""
"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
"({target_url}) {made_a_redirect}{comment}"
msgstr ""
-#: rcgcdw.py:213
+#: rcgcdw.py:220
#, python-brace-format
msgid ""
"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
"[{target}]({target_url}) {made_a_redirect}{comment}"
msgstr ""
-#: rcgcdw.py:219
+#: rcgcdw.py:226
#, fuzzy, python-brace-format
#| msgid "Moved protection settings from {redirect}{article} to {title}"
msgid ""
@@ -89,17 +89,17 @@ msgid ""
msgstr ""
"Transfert des paramètres de protection de {redirect}{article} vers {title}"
-#: rcgcdw.py:231 rcgcdw.py:598
+#: rcgcdw.py:238 rcgcdw.py:637
msgid "infinity and beyond"
msgstr "toujours"
-#: rcgcdw.py:246
+#: rcgcdw.py:253
#, python-brace-format
msgid ""
"[{author}]({author_url}) blocked [{user}]({user_url}) for {time}{comment}"
msgstr ""
-#: rcgcdw.py:251
+#: rcgcdw.py:258
#, fuzzy, python-brace-format
#| msgid "Changed block settings for {blocked_user}"
msgid ""
@@ -107,26 +107,26 @@ msgid ""
"({user_url}){comment}"
msgstr "Modification des paramètres de blocage pour {blocked_user}"
-#: rcgcdw.py:256
+#: rcgcdw.py:263
#, python-brace-format
msgid ""
"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
msgstr ""
-#: rcgcdw.py:260
+#: rcgcdw.py:267
#, fuzzy, python-brace-format
#| msgid "Left a comment on {target}'s profile"
msgid ""
"[{author}]({author_url}) left a [comment]({comment}) on {target} profile"
msgstr "Ajout d'un commentaire sur le profil de {target}"
-#: rcgcdw.py:260
+#: rcgcdw.py:267
#, fuzzy
#| msgid "Edited their own profile"
msgid "their own profile"
msgstr "Modification de son propre profil"
-#: rcgcdw.py:265
+#: rcgcdw.py:272
#, fuzzy, python-brace-format
#| msgid "Replied to a comment on {target}'s profile"
msgid ""
@@ -134,127 +134,127 @@ msgid ""
"profile"
msgstr "Réponse à un commentaire sur le profil de {target}"
-#: rcgcdw.py:268 rcgcdw.py:276 rcgcdw.py:283
+#: rcgcdw.py:275 rcgcdw.py:283 rcgcdw.py:287
msgid "their own"
msgstr ""
-#: rcgcdw.py:273
+#: rcgcdw.py:280
#, fuzzy, python-brace-format
#| msgid "Edited a comment on {target}'s profile"
msgid ""
"[{author}]({author_url}) edited a [comment]({comment}) on {target} profile"
msgstr "Édition d'un commentaire sur le profil de {target}"
-#: rcgcdw.py:281
+#: rcgcdw.py:285
#, fuzzy, python-brace-format
#| msgid "Deleted a comment on {target}'s profile"
msgid "[{author}]({author_url}) deleted a comment on {target} profile"
msgstr "Retrait d'un commentaire sur le profil de {target}"
-#: rcgcdw.py:289 rcgcdw.py:648
+#: rcgcdw.py:293 rcgcdw.py:684
msgid "Location"
msgstr "Emplacement"
-#: rcgcdw.py:291 rcgcdw.py:650
+#: rcgcdw.py:295 rcgcdw.py:686
msgid "About me"
msgstr "À propos de moi"
-#: rcgcdw.py:293 rcgcdw.py:652
+#: rcgcdw.py:297 rcgcdw.py:688
msgid "Google link"
msgstr "Lien Google"
-#: rcgcdw.py:295 rcgcdw.py:654
+#: rcgcdw.py:299 rcgcdw.py:690
msgid "Facebook link"
msgstr "Lien Facebook"
-#: rcgcdw.py:297 rcgcdw.py:656
+#: rcgcdw.py:301 rcgcdw.py:692
msgid "Twitter link"
msgstr "Lien Twitter"
-#: rcgcdw.py:299 rcgcdw.py:658
+#: rcgcdw.py:303 rcgcdw.py:694
msgid "Reddit link"
msgstr "Lien Reddit"
-#: rcgcdw.py:301 rcgcdw.py:660
+#: rcgcdw.py:305 rcgcdw.py:696
msgid "Twitch link"
msgstr "Lien Twitch"
-#: rcgcdw.py:303 rcgcdw.py:662
+#: rcgcdw.py:307 rcgcdw.py:698
msgid "PSN link"
msgstr "Lien PSN"
-#: rcgcdw.py:305 rcgcdw.py:664
+#: rcgcdw.py:309 rcgcdw.py:700
msgid "VK link"
msgstr "Lien VK"
-#: rcgcdw.py:307 rcgcdw.py:666
+#: rcgcdw.py:311 rcgcdw.py:702
msgid "XVL link"
msgstr "Lien XVL"
-#: rcgcdw.py:309 rcgcdw.py:668
+#: rcgcdw.py:313 rcgcdw.py:704
msgid "Steam link"
msgstr "Lien Steam"
-#: rcgcdw.py:311 rcgcdw.py:670
+#: rcgcdw.py:315 rcgcdw.py:706
msgid "Discord handle"
msgstr ""
-#: rcgcdw.py:313
+#: rcgcdw.py:317
#, fuzzy
#| msgid "Unknown"
msgid "unknown"
msgstr "Inconnu"
-#: rcgcdw.py:314
+#: rcgcdw.py:318
#, python-brace-format
msgid "[{target}]({target_url})'s"
msgstr ""
-#: rcgcdw.py:314
+#: rcgcdw.py:318
#, python-brace-format
msgid "[their own]({target_url})"
msgstr ""
-#: rcgcdw.py:315
+#: rcgcdw.py:319
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*"
msgstr ""
-#: rcgcdw.py:329 rcgcdw.py:331 rcgcdw.py:701 rcgcdw.py:703
+#: rcgcdw.py:333 rcgcdw.py:335 rcgcdw.py:736 rcgcdw.py:738
msgid "none"
msgstr "aucun"
-#: rcgcdw.py:337 rcgcdw.py:688
+#: rcgcdw.py:341 rcgcdw.py:723
msgid "System"
msgstr "Système"
-#: rcgcdw.py:343
+#: rcgcdw.py:347
#, python-brace-format
msgid ""
"[{author}]({author_url}) protected [{article}]({article_url}) with the "
"following settings: {settings}{comment}"
msgstr ""
-#: rcgcdw.py:345 rcgcdw.py:354 rcgcdw.py:712 rcgcdw.py:719
+#: rcgcdw.py:349 rcgcdw.py:358 rcgcdw.py:747 rcgcdw.py:754
msgid " [cascading]"
msgstr " [protection en cascade]"
-#: rcgcdw.py:351
+#: rcgcdw.py:355
#, python-brace-format
msgid ""
"[{author}]({author_url}) modified protection settings of [{article}]"
"({article_url}) to: {settings}{comment}"
msgstr ""
-#: rcgcdw.py:359
+#: rcgcdw.py:363
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed protection from [{article}]({article_url})"
"{comment}"
msgstr ""
-#: rcgcdw.py:364
+#: rcgcdw.py:368
#, fuzzy, python-brace-format
#| msgid "Changed visibility of revision on page {article} "
#| msgid_plural "Changed visibility of {amount} revisions on page {article} "
@@ -268,7 +268,7 @@ msgstr[0] "Modification de la visibilité d'une révision de la page {article} "
msgstr[1] ""
"Modification de la visibilité de {amount} révisions sur la page {article} "
-#: rcgcdw.py:370
+#: rcgcdw.py:374
#, python-brace-format
msgid ""
"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
@@ -279,78 +279,78 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:376
+#: rcgcdw.py:380
#, python-brace-format
msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
msgstr ""
-#: rcgcdw.py:378
+#: rcgcdw.py:382
#, fuzzy, python-brace-format
#| msgid "Changed visibility of log events"
msgid "[{author}]({author_url}) changed visibility of log events{comment}"
msgstr "Modification de la visibilité d'évènements des journaux"
-#: rcgcdw.py:380
+#: rcgcdw.py:384
#, python-brace-format
msgid "[{author}]({author_url}) imported interwiki{comment}"
msgstr ""
-#: rcgcdw.py:383
+#: rcgcdw.py:387
#, fuzzy, python-brace-format
#| msgid "Edited abuse filter number {number}"
msgid ""
"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
msgstr "Édition de la règle {number} du filtre anti-abus"
-#: rcgcdw.py:386
+#: rcgcdw.py:390
#, fuzzy, python-brace-format
#| msgid "Edited abuse filter number {number}"
msgid ""
"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
msgstr "Édition de la règle {number} du filtre anti-abus"
-#: rcgcdw.py:392
+#: rcgcdw.py:396
#, python-brace-format
msgid ""
"[{author}]({author_url}) merged revision histories of [{article}]"
"({article_url}) into [{dest}]({dest_url}){comment}"
msgstr ""
-#: rcgcdw.py:396
+#: rcgcdw.py:400
#, python-brace-format
msgid ""
"[{author}]({author_url}) added an entry to the [interwiki table]"
"({table_url}) pointing to {website} with {prefix} prefix"
msgstr ""
-#: rcgcdw.py:402
+#: rcgcdw.py:406
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
"pointing to {website} with {prefix} prefix"
msgstr ""
-#: rcgcdw.py:408
+#: rcgcdw.py:412
#, fuzzy, python-brace-format
#| msgid "Deleted an entry in interwiki table"
msgid ""
"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
msgstr "Retrait d'une entrée de la table interwiki"
-#: rcgcdw.py:412
+#: rcgcdw.py:416
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the content model of the page [{article}]"
"({article_url}) from {old} to {new}{comment}"
msgstr ""
-#: rcgcdw.py:417
+#: rcgcdw.py:421
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
msgstr ""
-#: rcgcdw.py:421
+#: rcgcdw.py:425
#, fuzzy, python-brace-format
#| msgid "Created the sprite sheet for {article}"
msgid ""
@@ -358,74 +358,86 @@ msgid ""
"({article_url})"
msgstr "Création d'une feuille de sprite pour {article}"
-#: rcgcdw.py:425
+#: rcgcdw.py:429
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
msgstr ""
-#: rcgcdw.py:428
+#: rcgcdw.py:432
#, python-brace-format
msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\""
msgstr ""
-#: rcgcdw.py:432
+#: rcgcdw.py:436
#, python-brace-format
msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\""
msgstr ""
-#: rcgcdw.py:436
+#: rcgcdw.py:440
#, python-brace-format
msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\""
msgstr ""
-#: rcgcdw.py:439
+#: rcgcdw.py:443
#, python-brace-format
msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\""
msgstr ""
-#: rcgcdw.py:442
+#: rcgcdw.py:445
#, fuzzy
#| msgid "Action has been hidden by Gamepedia staff."
msgid "An action has been hidden by administration."
msgstr "L'action a été masquée par le personnel de Gamepedia."
-#: rcgcdw.py:450 rcgcdw.py:704
+#: rcgcdw.py:454 rcgcdw.py:739
msgid "No description provided"
msgstr "Aucune description"
-#: rcgcdw.py:500
+#: rcgcdw.py:504
msgid "(N!) "
msgstr "(N!) "
-#: rcgcdw.py:501
+#: rcgcdw.py:505
msgid "m "
msgstr "m "
-#: rcgcdw.py:525 rcgcdw.py:560
+#: rcgcdw.py:524 rcgcdw.py:529
+msgid "__Only whitespace__"
+msgstr "__Espaces uniquement__"
+
+#: rcgcdw.py:535
+msgid "Removed"
+msgstr "Retirés"
+
+#: rcgcdw.py:538
+msgid "Added"
+msgstr "Ajoutés"
+
+#: rcgcdw.py:564 rcgcdw.py:599
msgid "Options"
msgstr "Options"
-#: rcgcdw.py:525
+#: rcgcdw.py:564
#, python-brace-format
msgid "([preview]({link}) | [undo]({undolink}))"
msgstr "([Aperçu]({link}) | [Annuler]({undolink}))"
-#: rcgcdw.py:527
+#: rcgcdw.py:566
#, python-brace-format
msgid "Uploaded a new version of {name}"
msgstr "Téléversement d'une nouvelle version de {name}"
-#: rcgcdw.py:529
+#: rcgcdw.py:568
#, python-brace-format
msgid "Uploaded {name}"
msgstr "Téléversement de {name}"
-#: rcgcdw.py:545
+#: rcgcdw.py:584
msgid "**No license!**"
msgstr "**Aucune license!**"
-#: rcgcdw.py:557
+#: rcgcdw.py:596
msgid ""
"\n"
"License: {}"
@@ -433,146 +445,146 @@ msgstr ""
"\n"
"License: {}"
-#: rcgcdw.py:560
+#: rcgcdw.py:599
#, python-brace-format
msgid "([preview]({link}))"
msgstr "([Aperçu]({link}))"
-#: rcgcdw.py:565
+#: rcgcdw.py:604
#, python-brace-format
msgid "Deleted page {article}"
msgstr "Suppression de la page {article}"
-#: rcgcdw.py:569
+#: rcgcdw.py:608
#, python-brace-format
msgid "Deleted redirect {article} by overwriting"
msgstr "Suppression par écrasement de la redirection {article}"
-#: rcgcdw.py:574
+#: rcgcdw.py:613
msgid "No redirect has been made"
msgstr "Aucune redirection créée"
-#: rcgcdw.py:575
+#: rcgcdw.py:614
msgid "A redirect has been made"
msgstr "Une redirection a été créée"
-#: rcgcdw.py:576
+#: rcgcdw.py:615
#, python-brace-format
msgid "Moved {redirect}{article} to {target}"
msgstr "Déplacement de {redirect}{article} vers {target}"
-#: rcgcdw.py:580
+#: rcgcdw.py:619
#, python-brace-format
msgid "Moved {redirect}{article} to {title} over redirect"
msgstr "Déplacement de {redirect}{article} vers {title} par redirection"
-#: rcgcdw.py:585
+#: rcgcdw.py:624
#, python-brace-format
msgid "Moved protection settings from {redirect}{article} to {title}"
msgstr ""
"Transfert des paramètres de protection de {redirect}{article} vers {title}"
-#: rcgcdw.py:608
+#: rcgcdw.py:647
#, python-brace-format
msgid "Blocked {blocked_user} for {time}"
msgstr "{blocked_user} a été bloqué pour {time}"
-#: rcgcdw.py:614
+#: rcgcdw.py:653
#, python-brace-format
msgid "Changed block settings for {blocked_user}"
msgstr "Modification des paramètres de blocage pour {blocked_user}"
-#: rcgcdw.py:620
+#: rcgcdw.py:659
#, python-brace-format
msgid "Unblocked {blocked_user}"
msgstr "{blocked_user} a été débloqué"
-#: rcgcdw.py:625
+#: rcgcdw.py:663
#, python-brace-format
msgid "Left a comment on {target}'s profile"
msgstr "Ajout d'un commentaire sur le profil de {target}"
-#: rcgcdw.py:627
+#: rcgcdw.py:665
msgid "Left a comment on their own profile"
msgstr "Ajout d'un commentaire sur son propre profil"
-#: rcgcdw.py:632
+#: rcgcdw.py:669
#, python-brace-format
msgid "Replied to a comment on {target}'s profile"
msgstr "Réponse à un commentaire sur le profil de {target}"
-#: rcgcdw.py:634
+#: rcgcdw.py:671
msgid "Replied to a comment on their own profile"
msgstr "Réponse à un commentaire sur son propre profil"
-#: rcgcdw.py:639
+#: rcgcdw.py:675
#, python-brace-format
msgid "Edited a comment on {target}'s profile"
msgstr "Édition d'un commentaire sur le profil de {target}"
-#: rcgcdw.py:641
+#: rcgcdw.py:677
msgid "Edited a comment on their own profile"
msgstr "Modification d'un commentaire sur son propre profil"
-#: rcgcdw.py:672 rcgcdw.py:811
+#: rcgcdw.py:708 rcgcdw.py:846
msgid "Unknown"
msgstr "Inconnu"
-#: rcgcdw.py:673
+#: rcgcdw.py:709
#, python-brace-format
msgid "Edited {target}'s profile"
msgstr "Modification du profil de {target}"
-#: rcgcdw.py:673
+#: rcgcdw.py:709
msgid "Edited their own profile"
msgstr "Modification de son propre profil"
-#: rcgcdw.py:675
+#: rcgcdw.py:711
#, python-brace-format
msgid "Cleared the {field} field"
msgstr ""
-#: rcgcdw.py:677
+#: rcgcdw.py:713
#, python-brace-format
msgid "{field} field changed to: {desc}"
msgstr "{field} modifié pour: {desc}"
-#: rcgcdw.py:682
+#: rcgcdw.py:717
#, python-brace-format
msgid "Deleted a comment on {target}'s profile"
msgstr "Retrait d'un commentaire sur le profil de {target}"
-#: rcgcdw.py:686
+#: rcgcdw.py:721
#, python-brace-format
msgid "Changed group membership for {target}"
msgstr "Modification des groupes pour {target}"
-#: rcgcdw.py:690
+#: rcgcdw.py:725
#, python-brace-format
msgid "{target} got autopromoted to a new usergroup"
msgstr "{target} a été auto-promu dans un nouveau groupe"
-#: rcgcdw.py:705
+#: rcgcdw.py:740
#, python-brace-format
msgid "Groups changed from {old_groups} to {new_groups}{reason}"
msgstr "Groupe modifié de {old_groups} vers {new_groups}{reason}"
-#: rcgcdw.py:710
+#: rcgcdw.py:745
#, python-brace-format
msgid "Protected {target}"
msgstr "Protection de {target}"
-#: rcgcdw.py:717
+#: rcgcdw.py:752
#, python-brace-format
msgid "Changed protection level for {article}"
msgstr "Modification du niveau de protection de {article}"
-#: rcgcdw.py:724
+#: rcgcdw.py:759
#, python-brace-format
msgid "Removed protection from {article}"
msgstr "Retrait de la protection de {article}"
-#: rcgcdw.py:729
+#: rcgcdw.py:764
#, python-brace-format
msgid "Changed visibility of revision on page {article} "
msgid_plural "Changed visibility of {amount} revisions on page {article} "
@@ -580,328 +592,334 @@ msgstr[0] "Modification de la visibilité d'une révision de la page {article} "
msgstr[1] ""
"Modification de la visibilité de {amount} révisions sur la page {article} "
-#: rcgcdw.py:735
+#: rcgcdw.py:770
#, python-brace-format
msgid "Imported {article} with {count} revision"
msgid_plural "Imported {article} with {count} revisions"
msgstr[0] "Article {article} importé avec {count} révision"
msgstr[1] "Article {article} importé avec {count} révisions"
-#: rcgcdw.py:741
+#: rcgcdw.py:776
#, python-brace-format
msgid "Restored {article}"
msgstr "Restauration de {article}"
-#: rcgcdw.py:744
+#: rcgcdw.py:779
msgid "Changed visibility of log events"
msgstr "Modification de la visibilité d'évènements des journaux"
-#: rcgcdw.py:747
+#: rcgcdw.py:782
msgid "Imported interwiki"
msgstr "Importation d'interwiki"
-#: rcgcdw.py:750
+#: rcgcdw.py:785
#, python-brace-format
msgid "Edited abuse filter number {number}"
msgstr "Édition de la règle {number} du filtre anti-abus"
-#: rcgcdw.py:753
+#: rcgcdw.py:788
#, fuzzy, python-brace-format
#| msgid "Edited abuse filter number {number}"
msgid "Created abuse filter number {number}"
msgstr "Édition de la règle {number} du filtre anti-abus"
-#: rcgcdw.py:757
+#: rcgcdw.py:792
#, python-brace-format
msgid "Merged revision histories of {article} into {dest}"
msgstr "Fusion de l'historique de {article} vers {dest}"
-#: rcgcdw.py:761
+#: rcgcdw.py:796
msgid "Added an entry to the interwiki table"
msgstr "Ajout d'une entrée à la table interwiki"
-#: rcgcdw.py:762 rcgcdw.py:768
+#: rcgcdw.py:797 rcgcdw.py:803
#, python-brace-format
msgid "Prefix: {prefix}, website: {website} | {desc}"
msgstr "Préfixe: {prefix}, site: {website} | {desc}"
-#: rcgcdw.py:767
+#: rcgcdw.py:802
msgid "Edited an entry in interwiki table"
msgstr "Modification d'une entrée de la table interwiki"
-#: rcgcdw.py:773
+#: rcgcdw.py:808
msgid "Deleted an entry in interwiki table"
msgstr "Retrait d'une entrée de la table interwiki"
-#: rcgcdw.py:774
+#: rcgcdw.py:809
#, python-brace-format
msgid "Prefix: {prefix} | {desc}"
msgstr "Préfixe: {prefix} | {desc}"
-#: rcgcdw.py:778
+#: rcgcdw.py:813
#, python-brace-format
msgid "Changed the content model of the page {article}"
msgstr "Modification du modèle de contenu de l'article {article}"
-#: rcgcdw.py:779
+#: rcgcdw.py:814
#, python-brace-format
msgid "Model changed from {old} to {new}: {reason}"
msgstr "Modèle changé de {old} à {new}: {reason}"
-#: rcgcdw.py:785
+#: rcgcdw.py:820
#, python-brace-format
msgid "Edited the sprite for {article}"
msgstr "Édition du sprite de {article}"
-#: rcgcdw.py:789
+#: rcgcdw.py:824
#, python-brace-format
msgid "Created the sprite sheet for {article}"
msgstr "Création d'une feuille de sprite pour {article}"
-#: rcgcdw.py:793
+#: rcgcdw.py:828
#, python-brace-format
msgid "Edited the slice for {article}"
msgstr "Edited the slice for {article}"
-#: rcgcdw.py:796
+#: rcgcdw.py:831
#, python-brace-format
msgid "Created a tag \"{tag}\""
msgstr "Création du tag « {tag} »"
-#: rcgcdw.py:800
+#: rcgcdw.py:835
#, python-brace-format
msgid "Deleted a tag \"{tag}\""
msgstr "Suppression du tag « {tag} »"
-#: rcgcdw.py:804
+#: rcgcdw.py:839
#, python-brace-format
msgid "Activated a tag \"{tag}\""
msgstr "Activation du tag « {tag} »"
-#: rcgcdw.py:807
+#: rcgcdw.py:842
#, python-brace-format
msgid "Deactivated a tag \"{tag}\""
msgstr "Désactivation du tag « {tag} »"
-#: rcgcdw.py:810
+#: rcgcdw.py:845
#, fuzzy
#| msgid "Action has been hidden by Gamepedia staff."
msgid "Action has been hidden by administration."
msgstr "L'action a été masquée par le personnel de Gamepedia."
-#: rcgcdw.py:837
+#: rcgcdw.py:872
msgid "Tags"
msgstr "Tags"
-#: rcgcdw.py:843
+#: rcgcdw.py:877
msgid "**Added**: "
msgstr "**Ajoutées : ** "
-#: rcgcdw.py:843
+#: rcgcdw.py:877
msgid " and {} more\n"
msgstr " et {} autres\n"
-#: rcgcdw.py:844
+#: rcgcdw.py:878
msgid "**Removed**: "
msgstr "**Retirées : ** "
-#: rcgcdw.py:844
+#: rcgcdw.py:878
msgid " and {} more"
msgstr " et {} autres"
-#: rcgcdw.py:845
+#: rcgcdw.py:879
msgid "Changed categories"
msgstr "Catégories modifiées"
-#: rcgcdw.py:886
+#: rcgcdw.py:920
msgid "~~hidden~~"
msgstr ""
-#: rcgcdw.py:892
+#: rcgcdw.py:926
msgid "hidden"
msgstr ""
-#: rcgcdw.py:995
+#: rcgcdw.py:1000 rcgcdw.py:1002 rcgcdw.py:1004 rcgcdw.py:1006 rcgcdw.py:1008
+#: rcgcdw.py:1010 rcgcdw.py:1012
+#, python-brace-format
+msgid "{value} (avg. {avg})"
+msgstr ""
+
+#: rcgcdw.py:1053
msgid "Daily overview"
msgstr "Résumé de la journée"
-#: rcgcdw.py:1005
+#: rcgcdw.py:1062
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] " ({} action)"
msgstr[1] " ({} actions)"
-#: rcgcdw.py:1009
+#: rcgcdw.py:1064
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] " ({} modification)"
msgstr[1] " ({} modifications)"
-#: rcgcdw.py:1014
+#: rcgcdw.py:1069
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] " UTC ({} action)"
msgstr[1] " UTC ({} actions)"
-#: rcgcdw.py:1016 rcgcdw.py:1017 rcgcdw.py:1021
+#: rcgcdw.py:1071 rcgcdw.py:1072 rcgcdw.py:1076
msgid "But nobody came"
msgstr "Aucune activité"
-#: rcgcdw.py:1024
+#: rcgcdw.py:1080
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] "Membre le plus actif"
msgstr[1] "Membres les plus actifs"
-#: rcgcdw.py:1025
+#: rcgcdw.py:1081
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] "Article le plus modifié"
msgstr[1] "Articles les plus modifiés"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1082
msgid "Edits made"
msgstr "Modifications effectuées"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1082
msgid "New files"
msgstr "Nouveaux fichiers"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1082
msgid "Admin actions"
msgstr "Actions d'administrateur"
-#: rcgcdw.py:1027
+#: rcgcdw.py:1083
msgid "Bytes changed"
msgstr "Octets modifiés"
-#: rcgcdw.py:1027
+#: rcgcdw.py:1083
msgid "New articles"
msgstr "Nouveaux articles"
-#: rcgcdw.py:1028
+#: rcgcdw.py:1084
msgid "Unique contributors"
msgstr "Contributeurs uniques"
-#: rcgcdw.py:1029
+#: rcgcdw.py:1085
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] "Heure la plus active"
msgstr[1] "Heures les plus actives"
-#: rcgcdw.py:1030
+#: rcgcdw.py:1086
msgid "Day score"
msgstr "Score du jour"
-#: rcgcdw.py:1177
+#: rcgcdw.py:1227
#, python-brace-format
msgid "Connection to {wiki} seems to be stable now."
msgstr "La connexion avec {wiki} semble stable maintenant."
-#: rcgcdw.py:1178 rcgcdw.py:1289
+#: rcgcdw.py:1228 rcgcdw.py:1339
msgid "Connection status"
msgstr "Statut de connexion"
-#: rcgcdw.py:1288
+#: rcgcdw.py:1338
#, python-brace-format
msgid "{wiki} seems to be down or unreachable."
msgstr "{wiki} semble être down ou inatteignable."
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "director"
msgstr "Directeur"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "bot"
msgstr "Robot"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "editor"
msgstr "editor"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "directors"
msgstr "Directeur"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "sysop"
msgstr "Administrateur"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "bureaucrat"
msgstr "Bureaucrate"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "reviewer"
msgstr "reviewer"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "autoreview"
msgstr "autoreview"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "autopatrol"
msgstr "autopatrol"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "wiki_guardian"
msgstr "Gardien du wiki"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "second"
msgid_plural "seconds"
msgstr[0] "seconde"
msgstr[1] "secondes"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minute"
msgstr[1] "minutes"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "hour"
msgid_plural "hours"
msgstr[0] "heure"
msgstr[1] "heures"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "day"
msgid_plural "days"
msgstr[0] "jour"
msgstr[1] "jours"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "week"
msgid_plural "weeks"
msgstr[0] "semaine"
msgstr[1] "semaines"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "month"
msgid_plural "months"
msgstr[0] "mois"
msgstr[1] "mois"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "year"
msgid_plural "years"
msgstr[0] "année"
msgstr[1] "années"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "millennium"
msgid_plural "millennia"
msgstr[0] "millénaire"
msgstr[1] "millénaires"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "decade"
msgid_plural "decades"
msgstr[0] "décennie"
msgstr[1] "décennies"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "century"
msgid_plural "centuries"
msgstr[0] "centenaire"
diff --git a/locale/pl/LC_MESSAGES/misc.mo b/locale/pl/LC_MESSAGES/misc.mo
new file mode 100644
index 0000000..d674b72
Binary files /dev/null and b/locale/pl/LC_MESSAGES/misc.mo differ
diff --git a/locale/pl/LC_MESSAGES/misc.po b/locale/pl/LC_MESSAGES/misc.po
new file mode 100644
index 0000000..760567e
--- /dev/null
+++ b/locale/pl/LC_MESSAGES/misc.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-05-20 17:18+0200\n"
+"PO-Revision-Date: 2019-05-20 17:23+0200\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.2.1\n"
+"Last-Translator: \n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
+"Language: pl\n"
+
+#: misc.py:76
+msgid ""
+"\n"
+"__And more__"
+msgstr ""
+"\n"
+"__Oraz więcej__"
diff --git a/locale/pl/LC_MESSAGES/rcgcdw.mo b/locale/pl/LC_MESSAGES/rcgcdw.mo
index ee5e619..e7ef773 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 d130184..f5ffb97 100644
--- a/locale/pl/LC_MESSAGES/rcgcdw.po
+++ b/locale/pl/LC_MESSAGES/rcgcdw.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: RcGcDw\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-03 11:33+0200\n"
-"PO-Revision-Date: 2019-05-03 11:34+0200\n"
+"POT-Creation-Date: 2019-05-21 23:49+0200\n"
+"PO-Revision-Date: 2019-05-21 23:55+0200\n"
"Last-Translator: Frisk \n"
"Language-Team: \n"
"Language: pl\n"
@@ -19,7 +19,7 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n"
-#: rcgcdw.py:177
+#: rcgcdw.py:133
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}"
@@ -28,7 +28,7 @@ msgstr ""
"[{author}]({author_url}) editował(-a) [{article}]({edit_link}){comment} "
"({sign}{edit_size})"
-#: rcgcdw.py:179
+#: rcgcdw.py:135
#, python-brace-format
msgid ""
"[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}"
@@ -37,12 +37,12 @@ msgstr ""
"[{author}]({author_url}) stworzył(-a) [{article}]({edit_link}){comment} "
"({sign}{edit_size})"
-#: rcgcdw.py:183
+#: rcgcdw.py:139
#, python-brace-format
msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
msgstr "[{author}]({author_url}) przesłał(-a) [{file}]({file_link}){comment}"
-#: rcgcdw.py:191
+#: rcgcdw.py:147
#, python-brace-format
msgid ""
"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
@@ -51,12 +51,12 @@ msgstr ""
"[{author}]({author_url}) przesłał(-a) nową wersję [{file}]({file_link})"
"{comment}"
-#: rcgcdw.py:195
+#: rcgcdw.py:151
#, python-brace-format
msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
msgstr "[{author}]({author_url}) usunął/usunęła [{page}]({page_link}){comment}"
-#: rcgcdw.py:200
+#: rcgcdw.py:156
#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
@@ -65,15 +65,15 @@ msgstr ""
"[{author}]({author_url}) usunął/usunęła przekierowanie przez nadpisanie "
"[{page}]({page_link}){comment}"
-#: rcgcdw.py:205 rcgcdw.py:211
+#: rcgcdw.py:161 rcgcdw.py:167
msgid "without making a redirect"
msgstr "bez utworzenia przekierowania przekierowania"
-#: rcgcdw.py:205 rcgcdw.py:212
+#: rcgcdw.py:161 rcgcdw.py:168
msgid "with a redirect"
msgstr "z przekierowaniem"
-#: rcgcdw.py:206
+#: rcgcdw.py:162
#, python-brace-format
msgid ""
"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
@@ -82,7 +82,7 @@ msgstr ""
"[{author}]({author_url}) przeniósł/przeniosła {redirect}*{article}* do "
"[{target}]({target_url}) {made_a_redirect}{comment}"
-#: rcgcdw.py:213
+#: rcgcdw.py:169
#, python-brace-format
msgid ""
"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
@@ -91,7 +91,7 @@ msgstr ""
"[{author}]({author_url}) przeniósł/przeniosła {redirect}*{article}* do "
"przekierowania [{target}]({target_url}) {made_a_redirect}{comment}"
-#: rcgcdw.py:219
+#: rcgcdw.py:175
#, python-brace-format
msgid ""
"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
@@ -100,11 +100,11 @@ msgstr ""
"[{author}]({author_url}) przeniósł/przeniosła ustawienia zabezpieczeń z "
"{redirect}*{article}* do [{target}]({target_url}){comment}"
-#: rcgcdw.py:231 rcgcdw.py:598
+#: rcgcdw.py:187 rcgcdw.py:586
msgid "infinity and beyond"
msgstr "wieczność"
-#: rcgcdw.py:246
+#: rcgcdw.py:202
#, python-brace-format
msgid ""
"[{author}]({author_url}) blocked [{user}]({user_url}) for {time}{comment}"
@@ -112,7 +112,7 @@ msgstr ""
"[{author}]({author_url}) zablokował(-a) [{user}]({user_url}) na {time}"
"{comment}"
-#: rcgcdw.py:251
+#: rcgcdw.py:207
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed block settings for [{blocked_user}]"
@@ -121,25 +121,25 @@ msgstr ""
"[{author}]({author_url}) zmienił(-a) ustawienia blokady dla [{blocked_user}]"
"({user_url}){comment}"
-#: rcgcdw.py:256
+#: rcgcdw.py:212
#, python-brace-format
msgid ""
"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
msgstr ""
"[{author}]({author_url}) odblokował(-a) [{blocked_user}]({user_url}){comment}"
-#: rcgcdw.py:260
+#: rcgcdw.py:216
#, python-brace-format
msgid ""
"[{author}]({author_url}) left a [comment]({comment}) on {target} profile"
msgstr ""
"[{author}]({author_url}) pozostawił(-a) [komentarz]({comment}) na {target}"
-#: rcgcdw.py:260
+#: rcgcdw.py:216
msgid "their own profile"
msgstr "swoim własnym profilu"
-#: rcgcdw.py:265
+#: rcgcdw.py:221
#, python-brace-format
msgid ""
"[{author}]({author_url}) replied to a [comment]({comment}) on {target} "
@@ -148,100 +148,100 @@ msgstr ""
"[{author}]({author_url}) odpowiedział(-a) na [komentarz]({comment}) na "
"{target}"
-#: rcgcdw.py:268 rcgcdw.py:276 rcgcdw.py:283
+#: rcgcdw.py:224 rcgcdw.py:232 rcgcdw.py:236
msgid "their own"
msgstr "swój własny"
-#: rcgcdw.py:273
+#: rcgcdw.py:229
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited a [comment]({comment}) on {target} profile"
msgstr ""
"[{author}]({author_url}) edytował(-a) [komentarz]({comment}) na {target}"
-#: rcgcdw.py:281
+#: rcgcdw.py:234
#, python-brace-format
msgid "[{author}]({author_url}) deleted a comment on {target} profile"
msgstr "[{author}]({author_url}) usunął/usunęła komentarz na {target}"
-#: rcgcdw.py:289 rcgcdw.py:648
+#: rcgcdw.py:242 rcgcdw.py:633
msgid "Location"
msgstr "Lokacja"
-#: rcgcdw.py:291 rcgcdw.py:650
+#: rcgcdw.py:244 rcgcdw.py:635
msgid "About me"
msgstr "O mnie"
-#: rcgcdw.py:293 rcgcdw.py:652
+#: rcgcdw.py:246 rcgcdw.py:637
msgid "Google link"
msgstr "link Google"
-#: rcgcdw.py:295 rcgcdw.py:654
+#: rcgcdw.py:248 rcgcdw.py:639
msgid "Facebook link"
msgstr "link Facebook"
-#: rcgcdw.py:297 rcgcdw.py:656
+#: rcgcdw.py:250 rcgcdw.py:641
msgid "Twitter link"
msgstr "link Twitter"
-#: rcgcdw.py:299 rcgcdw.py:658
+#: rcgcdw.py:252 rcgcdw.py:643
msgid "Reddit link"
msgstr "link Reddit"
-#: rcgcdw.py:301 rcgcdw.py:660
+#: rcgcdw.py:254 rcgcdw.py:645
msgid "Twitch link"
msgstr "link Twitch"
-#: rcgcdw.py:303 rcgcdw.py:662
+#: rcgcdw.py:256 rcgcdw.py:647
msgid "PSN link"
msgstr "link PSN"
-#: rcgcdw.py:305 rcgcdw.py:664
+#: rcgcdw.py:258 rcgcdw.py:649
msgid "VK link"
msgstr "link VK"
-#: rcgcdw.py:307 rcgcdw.py:666
+#: rcgcdw.py:260 rcgcdw.py:651
msgid "XVL link"
msgstr "link XVL"
-#: rcgcdw.py:309 rcgcdw.py:668
+#: rcgcdw.py:262 rcgcdw.py:653
msgid "Steam link"
msgstr "link Steam"
-#: rcgcdw.py:311 rcgcdw.py:670
+#: rcgcdw.py:264 rcgcdw.py:655
msgid "Discord handle"
msgstr "konto Discord"
-#: rcgcdw.py:313
+#: rcgcdw.py:266
msgid "unknown"
msgstr "nieznana sekcja"
-#: rcgcdw.py:314
+#: rcgcdw.py:267
#, python-brace-format
msgid "[{target}]({target_url})'s"
msgstr "na profilu użytkownika [{target}]({target_url})"
-#: rcgcdw.py:314
+#: rcgcdw.py:267
#, python-brace-format
msgid "[their own]({target_url})"
msgstr "na [swoim własnym profilu użytkownika]({target_url})"
-#: rcgcdw.py:315
+#: rcgcdw.py:268
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*"
msgstr ""
"[{author}]({author_url}) edytował(-a) pole {field} {target}. *({desc})*"
-#: rcgcdw.py:329 rcgcdw.py:331 rcgcdw.py:701 rcgcdw.py:703
+#: rcgcdw.py:282 rcgcdw.py:284 rcgcdw.py:687 rcgcdw.py:689
msgid "none"
msgstr "brak"
-#: rcgcdw.py:337 rcgcdw.py:688
+#: rcgcdw.py:290 rcgcdw.py:674
msgid "System"
msgstr "System"
-#: rcgcdw.py:343
+#: rcgcdw.py:296
#, python-brace-format
msgid ""
"[{author}]({author_url}) protected [{article}]({article_url}) with the "
@@ -250,11 +250,11 @@ msgstr ""
"[{author}]({author_url}) zabezpieczył(-a) [{article}]({article_url}) z "
"następującymi ustawieniami: {settings}{comment}"
-#: rcgcdw.py:345 rcgcdw.py:354 rcgcdw.py:712 rcgcdw.py:719
+#: rcgcdw.py:298 rcgcdw.py:307 rcgcdw.py:698 rcgcdw.py:705
msgid " [cascading]"
msgstr " [kaskadowo]"
-#: rcgcdw.py:351
+#: rcgcdw.py:304
#, python-brace-format
msgid ""
"[{author}]({author_url}) modified protection settings of [{article}]"
@@ -263,7 +263,7 @@ msgstr ""
"[{author}]({author_url}) modyfikował(-a) ustawienia zabezpieczeń [{article}]"
"({article_url}) na: {settings}{comment}"
-#: rcgcdw.py:359
+#: rcgcdw.py:312
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed protection from [{article}]({article_url})"
@@ -272,7 +272,7 @@ msgstr ""
"[{author}]({author_url}) usunął/usunęła zabezpieczenia z [{article}]"
"({article_url}){comment}"
-#: rcgcdw.py:364
+#: rcgcdw.py:317
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed visibility of revision on page [{article}]"
@@ -290,7 +290,7 @@ msgstr[2] ""
"[{author}]({author_url}) zmienił(-a) widoczność {amount} wersji strony "
"[{article}]({article_url}){comment}"
-#: rcgcdw.py:370
+#: rcgcdw.py:323
#, python-brace-format
msgid ""
"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
@@ -308,23 +308,23 @@ msgstr[2] ""
"[{author}]({author_url}) zaimportował(-a) [{article}]({article_url}) {count} "
"wersjami{comment}"
-#: rcgcdw.py:376
+#: rcgcdw.py:329
#, python-brace-format
msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
msgstr ""
"[{author}]({author_url}) przywrócił(-a) [{article}]({article_url}){comment}"
-#: rcgcdw.py:378
+#: rcgcdw.py:331
#, python-brace-format
msgid "[{author}]({author_url}) changed visibility of log events{comment}"
msgstr "[{author}]({author_url}) zmienił(-a) widoczność wydarzeń{comment}"
-#: rcgcdw.py:380
+#: rcgcdw.py:333
#, python-brace-format
msgid "[{author}]({author_url}) imported interwiki{comment}"
msgstr "[{author}]({author_url}) zaimportował(-a) interwiki{comment}"
-#: rcgcdw.py:383
+#: rcgcdw.py:336
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
@@ -332,7 +332,7 @@ msgstr ""
"[{author}]({author_url}) edytował(-a) filtr nadużyć [numer {number}]"
"({filter_url})"
-#: rcgcdw.py:386
+#: rcgcdw.py:339
#, python-brace-format
msgid ""
"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
@@ -340,7 +340,7 @@ msgstr ""
"[{author}]({author_url}) stworzył(-a) filtr nadużyć [numer {number}]"
"({filter_url})"
-#: rcgcdw.py:392
+#: rcgcdw.py:345
#, python-brace-format
msgid ""
"[{author}]({author_url}) merged revision histories of [{article}]"
@@ -349,7 +349,7 @@ msgstr ""
"[{author}]({author_url}) połączył(-a) historie zmian [{article}]"
"({article_url}) z [{dest}]({dest_url}){comment}"
-#: rcgcdw.py:396
+#: rcgcdw.py:349
#, python-brace-format
msgid ""
"[{author}]({author_url}) added an entry to the [interwiki table]"
@@ -358,7 +358,7 @@ msgstr ""
"[{author}]({author_url}) dodał(-a) wpis do [tabeli interwiki]({table_url}), "
"który prowadzi do {website} z prefixem {prefix}"
-#: rcgcdw.py:402
+#: rcgcdw.py:355
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
@@ -367,7 +367,7 @@ msgstr ""
"[{author}]({author_url}) edytował(-a) wpis w [tabeli interwiki]"
"({table_url}), który prowadzi do {website} z prefixem {prefix}"
-#: rcgcdw.py:408
+#: rcgcdw.py:361
#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
@@ -375,7 +375,7 @@ msgstr ""
"[{author}]({author_url}) usunął/usunęła wpis z [tabeli interwiki]"
"({table_url})"
-#: rcgcdw.py:412
+#: rcgcdw.py:365
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the content model of the page [{article}]"
@@ -384,14 +384,14 @@ msgstr ""
"[{author}]({author_url}) zmienił(-a) model zawartości [{article}]"
"({article_url}) z {old} na {new}{comment}"
-#: rcgcdw.py:417
+#: rcgcdw.py:370
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
msgstr ""
"[{author}]({author_url}) edytował(-a) sprite [{article}]({article_url})"
-#: rcgcdw.py:421
+#: rcgcdw.py:374
#, python-brace-format
msgid ""
"[{author}]({author_url}) created the sprite sheet for [{article}]"
@@ -399,72 +399,84 @@ msgid ""
msgstr ""
"[{author}]({author_url}) utworzył(-a) sprite sheet [{article}]({article_url})"
-#: rcgcdw.py:425
+#: rcgcdw.py:378
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
msgstr "[{author}]({author_url}) edytował(-a) slice [{article}]({article_url})"
-#: rcgcdw.py:428
+#: rcgcdw.py:381
#, python-brace-format
msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\""
msgstr "[{author}]({author_url}) utworzył(-a) [tag]({tag_url}) \"{tag}\""
-#: rcgcdw.py:432
+#: rcgcdw.py:385
#, python-brace-format
msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\""
msgstr "[{author}]({author_url}) usunął/usunęła [tag]({tag_url}) \"{tag}\""
-#: rcgcdw.py:436
+#: rcgcdw.py:389
#, python-brace-format
msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\""
msgstr "[{author}]({author_url}) aktywował(-a) [tag]({tag_url}) \"{tag}\""
-#: rcgcdw.py:439
+#: rcgcdw.py:392
#, python-brace-format
msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\""
msgstr "[{author}]({author_url}) dezaktywował(-a) [tag]({tag_url}) \"{tag}\""
-#: rcgcdw.py:442
+#: rcgcdw.py:394
msgid "An action has been hidden by administration."
msgstr "Akcja została ukryta przez administrację."
-#: rcgcdw.py:450 rcgcdw.py:704
+#: rcgcdw.py:403 rcgcdw.py:690
msgid "No description provided"
msgstr "Nie podano opisu zmian"
-#: rcgcdw.py:500
+#: rcgcdw.py:453
msgid "(N!) "
msgstr "(N!) "
-#: rcgcdw.py:501
+#: rcgcdw.py:454
msgid "m "
msgstr "d "
-#: rcgcdw.py:525 rcgcdw.py:560
+#: rcgcdw.py:473 rcgcdw.py:478
+msgid "__Only whitespace__"
+msgstr "__Tylko znaki niedrukowane__"
+
+#: rcgcdw.py:484
+msgid "Removed"
+msgstr "Usunięto"
+
+#: rcgcdw.py:487
+msgid "Added"
+msgstr "Dodano"
+
+#: rcgcdw.py:513 rcgcdw.py:548
msgid "Options"
msgstr "Opcje"
-#: rcgcdw.py:525
+#: rcgcdw.py:513
#, python-brace-format
msgid "([preview]({link}) | [undo]({undolink}))"
msgstr "([podgląd]({link}) | [wycofaj]({undolink}))"
-#: rcgcdw.py:527
+#: rcgcdw.py:515
#, python-brace-format
msgid "Uploaded a new version of {name}"
msgstr "Przesłał(a) nową wersję {name}"
-#: rcgcdw.py:529
+#: rcgcdw.py:517
#, python-brace-format
msgid "Uploaded {name}"
msgstr "Przesłał(a) {name}"
-#: rcgcdw.py:545
+#: rcgcdw.py:533
msgid "**No license!**"
msgstr "**Brak licencji!**"
-#: rcgcdw.py:557
+#: rcgcdw.py:545
msgid ""
"\n"
"License: {}"
@@ -472,148 +484,152 @@ msgstr ""
"\n"
"Licencja: {}"
-#: rcgcdw.py:560
+#: rcgcdw.py:548
#, python-brace-format
msgid "([preview]({link}))"
msgstr "([podgląd]({link}))"
-#: rcgcdw.py:565
+#: rcgcdw.py:553
#, python-brace-format
msgid "Deleted page {article}"
msgstr "Usunął/usunęła {article}"
-#: rcgcdw.py:569
+#: rcgcdw.py:557
#, python-brace-format
msgid "Deleted redirect {article} by overwriting"
msgstr ""
"Usunął/usunęła przekierowanie ({article}) aby utworzyć miejsce dla "
"przenoszonej strony"
-#: rcgcdw.py:574
+#: rcgcdw.py:562
msgid "No redirect has been made"
msgstr "Nie utworzono przekierowania"
-#: rcgcdw.py:575
+#: rcgcdw.py:563
msgid "A redirect has been made"
msgstr "Zostało utworzone przekierowanie"
-#: rcgcdw.py:576
+#: rcgcdw.py:564
#, python-brace-format
msgid "Moved {redirect}{article} to {target}"
msgstr "Przeniósł/przeniosła {redirect}{article} do {target}"
-#: rcgcdw.py:580
+#: rcgcdw.py:568
#, python-brace-format
msgid "Moved {redirect}{article} to {title} over redirect"
msgstr ""
"Przeniósł/przeniosła {redirect}{article} do strony przekierowującej {title}"
-#: rcgcdw.py:585
+#: rcgcdw.py:573
#, python-brace-format
msgid "Moved protection settings from {redirect}{article} to {title}"
msgstr "Przeniesiono ustawienia zabezpieczeń z {redirect}{article} do {title}"
-#: rcgcdw.py:608
+#: rcgcdw.py:596
#, python-brace-format
msgid "Blocked {blocked_user} for {time}"
msgstr "Zablokowano {blocked_user} na {time}"
-#: rcgcdw.py:614
+#: rcgcdw.py:602
#, python-brace-format
msgid "Changed block settings for {blocked_user}"
msgstr "Zmienił ustawienia blokady {blocked_user}"
-#: rcgcdw.py:620
+#: rcgcdw.py:608
#, python-brace-format
msgid "Unblocked {blocked_user}"
msgstr "Odblokował {blocked_user}"
-#: rcgcdw.py:625
+#: rcgcdw.py:612
#, python-brace-format
msgid "Left a comment on {target}'s profile"
msgstr "Pozostawiono komentarz na profilu użytkownika {target}"
-#: rcgcdw.py:627
+#: rcgcdw.py:614
msgid "Left a comment on their own profile"
msgstr "Pozostawił(a) komentarz na swoim profilu"
-#: rcgcdw.py:632
+#: rcgcdw.py:618
#, python-brace-format
msgid "Replied to a comment on {target}'s profile"
msgstr "Odpowiedziano na komentarz na profilu użytkownika {target}"
-#: rcgcdw.py:634
+#: rcgcdw.py:620
msgid "Replied to a comment on their own profile"
msgstr "Odpowiedział(a) na komentarz na swoim profilu"
-#: rcgcdw.py:639
+#: rcgcdw.py:624
#, python-brace-format
msgid "Edited a comment on {target}'s profile"
msgstr "Edytowano komentarz na profilu użytkownika {target}"
-#: rcgcdw.py:641
+#: rcgcdw.py:626
msgid "Edited a comment on their own profile"
msgstr "Edytował(a) komentarz na swoim profilu"
-#: rcgcdw.py:672 rcgcdw.py:811
+#: rcgcdw.py:657
+msgid "Battle.net handle"
+msgstr "konto Battle.net"
+
+#: rcgcdw.py:659 rcgcdw.py:797
msgid "Unknown"
msgstr "Nieznana"
-#: rcgcdw.py:673
+#: rcgcdw.py:660
#, python-brace-format
msgid "Edited {target}'s profile"
msgstr "Edytowano profil użytkownika {target}"
-#: rcgcdw.py:673
+#: rcgcdw.py:660
msgid "Edited their own profile"
msgstr "Edytował(a) swój profil"
-#: rcgcdw.py:675
+#: rcgcdw.py:662
#, python-brace-format
msgid "Cleared the {field} field"
msgstr "Wyczyszczono pole {field}"
-#: rcgcdw.py:677
+#: rcgcdw.py:664
#, python-brace-format
msgid "{field} field changed to: {desc}"
msgstr "pole \"{field}\" zostało zmienione na: {desc}"
-#: rcgcdw.py:682
+#: rcgcdw.py:668
#, python-brace-format
msgid "Deleted a comment on {target}'s profile"
msgstr "Usunął komentarz na profilu użytkownika {target}"
-#: rcgcdw.py:686
+#: rcgcdw.py:672
#, python-brace-format
msgid "Changed group membership for {target}"
msgstr "Zmieniono przynależność do grup dla {target}"
-#: rcgcdw.py:690
+#: rcgcdw.py:676
#, python-brace-format
msgid "{target} got autopromoted to a new usergroup"
msgstr "{target} automatycznie otrzymał nową grupę użytkownika"
-#: rcgcdw.py:705
+#: rcgcdw.py:691
#, python-brace-format
msgid "Groups changed from {old_groups} to {new_groups}{reason}"
msgstr "Grupy zmienione z {old_groups} do {new_groups}{reason}"
-#: rcgcdw.py:710
+#: rcgcdw.py:696
#, python-brace-format
msgid "Protected {target}"
msgstr "Zabezpieczono {target}"
-#: rcgcdw.py:717
+#: rcgcdw.py:703
#, python-brace-format
msgid "Changed protection level for {article}"
msgstr "Zmieniono poziom zabezpieczeń {article}"
-#: rcgcdw.py:724
+#: rcgcdw.py:710
#, python-brace-format
msgid "Removed protection from {article}"
msgstr "Usunięto zabezpieczenie {article}"
-#: rcgcdw.py:729
+#: rcgcdw.py:715
#, python-brace-format
msgid "Changed visibility of revision on page {article} "
msgid_plural "Changed visibility of {amount} revisions on page {article} "
@@ -621,7 +637,7 @@ msgstr[0] "Zmieniono widoczność wersji na stronie {article} "
msgstr[1] "Zmieniono widoczność {amount} wersji na stronie {article} "
msgstr[2] "Zmieniono widoczność {amount} wersji na stronie {article} "
-#: rcgcdw.py:735
+#: rcgcdw.py:721
#, python-brace-format
msgid "Imported {article} with {count} revision"
msgid_plural "Imported {article} with {count} revisions"
@@ -629,333 +645,339 @@ msgstr[0] "Zaimportowano {article} z {count} wersją"
msgstr[1] "Zaimportowano {article} z {count} wersjami"
msgstr[2] "Zaimportowano {article} z {count} wersjami"
-#: rcgcdw.py:741
+#: rcgcdw.py:727
#, python-brace-format
msgid "Restored {article}"
msgstr "Przywrócono {article}"
-#: rcgcdw.py:744
+#: rcgcdw.py:730
msgid "Changed visibility of log events"
msgstr "Zmieniono widoczność logów"
-#: rcgcdw.py:747
+#: rcgcdw.py:733
msgid "Imported interwiki"
msgstr "Zaimportowano interwiki"
-#: rcgcdw.py:750
+#: rcgcdw.py:736
#, python-brace-format
msgid "Edited abuse filter number {number}"
msgstr "Edytowano filtr nadużyć numer {number}"
-#: rcgcdw.py:753
+#: rcgcdw.py:739
#, python-brace-format
msgid "Created abuse filter number {number}"
msgstr "Utworzono filtr nadużyć numer {number}"
-#: rcgcdw.py:757
+#: rcgcdw.py:743
#, python-brace-format
msgid "Merged revision histories of {article} into {dest}"
msgstr "Połączono historie {article} z {dest}"
-#: rcgcdw.py:761
+#: rcgcdw.py:747
msgid "Added an entry to the interwiki table"
msgstr "Dodano wpis do tabeli interwiki"
-#: rcgcdw.py:762 rcgcdw.py:768
+#: rcgcdw.py:748 rcgcdw.py:754
#, python-brace-format
msgid "Prefix: {prefix}, website: {website} | {desc}"
msgstr "Prefix: {prefix}, strona: {website} | {desc}"
-#: rcgcdw.py:767
+#: rcgcdw.py:753
msgid "Edited an entry in interwiki table"
msgstr "Edytowano wpis interwiki"
-#: rcgcdw.py:773
+#: rcgcdw.py:759
msgid "Deleted an entry in interwiki table"
msgstr "Usunięto wpis interwiki"
-#: rcgcdw.py:774
+#: rcgcdw.py:760
#, python-brace-format
msgid "Prefix: {prefix} | {desc}"
msgstr "Prefix: {prefix} | {desc}"
-#: rcgcdw.py:778
+#: rcgcdw.py:764
#, python-brace-format
msgid "Changed the content model of the page {article}"
msgstr "Zmieniono model zawartości {article}"
-#: rcgcdw.py:779
+#: rcgcdw.py:765
#, python-brace-format
msgid "Model changed from {old} to {new}: {reason}"
msgstr "Model został zmieniony z {old} na {new}: {reason}"
-#: rcgcdw.py:785
+#: rcgcdw.py:771
#, python-brace-format
msgid "Edited the sprite for {article}"
msgstr "Edytowano sprite dla {article}"
-#: rcgcdw.py:789
+#: rcgcdw.py:775
#, python-brace-format
msgid "Created the sprite sheet for {article}"
msgstr "Utworzono sprite sheet dla {article}"
-#: rcgcdw.py:793
+#: rcgcdw.py:779
#, python-brace-format
msgid "Edited the slice for {article}"
msgstr "Edytowano część sprite dla {article}"
-#: rcgcdw.py:796
+#: rcgcdw.py:782
#, python-brace-format
msgid "Created a tag \"{tag}\""
msgstr "Utworzono tag \"{tag}\""
-#: rcgcdw.py:800
+#: rcgcdw.py:786
#, python-brace-format
msgid "Deleted a tag \"{tag}\""
msgstr "Usunięto tag \"{tag}\""
-#: rcgcdw.py:804
+#: rcgcdw.py:790
#, python-brace-format
msgid "Activated a tag \"{tag}\""
msgstr "Aktywowano tag \"{tag}\""
-#: rcgcdw.py:807
+#: rcgcdw.py:793
#, python-brace-format
msgid "Deactivated a tag \"{tag}\""
msgstr "Dezaktywowano tag \"{tag}\""
-#: rcgcdw.py:810
+#: rcgcdw.py:796
msgid "Action has been hidden by administration."
msgstr "Akcja została ukryta przez administrację."
-#: rcgcdw.py:837
+#: rcgcdw.py:823
msgid "Tags"
msgstr "Tagi"
-#: rcgcdw.py:843
+#: rcgcdw.py:828
msgid "**Added**: "
msgstr "**Dodane**: "
-#: rcgcdw.py:843
+#: rcgcdw.py:828
msgid " and {} more\n"
msgstr " oraz {} innych\n"
-#: rcgcdw.py:844
+#: rcgcdw.py:829
msgid "**Removed**: "
msgstr "**Usunięte**: "
-#: rcgcdw.py:844
+#: rcgcdw.py:829
msgid " and {} more"
msgstr " oraz {} innych"
-#: rcgcdw.py:845
+#: rcgcdw.py:830
msgid "Changed categories"
msgstr "Zmienione kategorie"
-#: rcgcdw.py:886
+#: rcgcdw.py:849
msgid "~~hidden~~"
msgstr "~~ukryte~~"
-#: rcgcdw.py:892
+#: rcgcdw.py:855
msgid "hidden"
msgstr "ukryte"
-#: rcgcdw.py:995
+#: rcgcdw.py:922 rcgcdw.py:924 rcgcdw.py:926 rcgcdw.py:928 rcgcdw.py:930
+#: rcgcdw.py:932 rcgcdw.py:934
+#, python-brace-format
+msgid "{value} (avg. {avg})"
+msgstr "{value} (średnio {avg})"
+
+#: rcgcdw.py:975
msgid "Daily overview"
msgstr "Podsumowanie dnia"
-#: rcgcdw.py:1005
+#: rcgcdw.py:984
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] " ({} akcja)"
msgstr[1] " ({} akcje)"
msgstr[2] " ({} akcji)"
-#: rcgcdw.py:1009
+#: rcgcdw.py:986
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] " ({} edycja)"
msgstr[1] " ({} edycje)"
msgstr[2] " ({} edycji)"
-#: rcgcdw.py:1014
+#: rcgcdw.py:991
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] " UTC ({} akcja)"
msgstr[1] " UTC ({} akcje)"
msgstr[2] " UTC ({} akcji)"
-#: rcgcdw.py:1016 rcgcdw.py:1017 rcgcdw.py:1021
+#: rcgcdw.py:993 rcgcdw.py:994 rcgcdw.py:998
msgid "But nobody came"
msgstr "Ale nikt nie przyszedł"
-#: rcgcdw.py:1024
+#: rcgcdw.py:1002
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] "Najbardziej aktywny użytkownik"
msgstr[1] "Najbardziej aktywni użytkownicy"
msgstr[2] "Najbardziej aktywni użytkownicy"
-#: rcgcdw.py:1025
+#: rcgcdw.py:1003
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] "Najczęściej edytowany artykuł"
msgstr[1] "Najczęściej edytowane artykuły"
msgstr[2] "Najczęściej edytowane artykuły"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1004
msgid "Edits made"
msgstr "Zrobionych edycji"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1004
msgid "New files"
msgstr "Nowych plików"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1004
msgid "Admin actions"
msgstr "Akcji administratorskich"
-#: rcgcdw.py:1027
+#: rcgcdw.py:1005
msgid "Bytes changed"
msgstr "Zmienionych bajtów"
-#: rcgcdw.py:1027
+#: rcgcdw.py:1005
msgid "New articles"
msgstr "Nowych artykułów"
-#: rcgcdw.py:1028
+#: rcgcdw.py:1006
msgid "Unique contributors"
msgstr "Unikalnych edytujących"
-#: rcgcdw.py:1029
+#: rcgcdw.py:1007
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] "Najbardziej aktywna godzina"
msgstr[1] "Najbardziej aktywne godziny"
msgstr[2] "Najbardziej aktywne godziny"
-#: rcgcdw.py:1030
+#: rcgcdw.py:1008
msgid "Day score"
msgstr "Wynik dnia"
-#: rcgcdw.py:1177
+#: rcgcdw.py:1149
#, python-brace-format
msgid "Connection to {wiki} seems to be stable now."
msgstr "Połączenie z {wiki} wygląda na stabilne."
-#: rcgcdw.py:1178 rcgcdw.py:1289
+#: rcgcdw.py:1150 rcgcdw.py:1261
msgid "Connection status"
msgstr "Problem z połączeniem"
-#: rcgcdw.py:1288
+#: rcgcdw.py:1260
#, python-brace-format
msgid "{wiki} seems to be down or unreachable."
msgstr "{wiki} nie działa lub jest nieosiągalna."
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "director"
msgstr "Dyrektor"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "bot"
msgstr "Bot"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "editor"
msgstr "Redaktor"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "directors"
msgstr "Dyrektorzy"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "sysop"
msgstr "Administrator"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "bureaucrat"
msgstr "Biurokrata"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "reviewer"
msgstr "Przeglądający"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "autoreview"
msgstr "Automatycznie przeglądający"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "autopatrol"
msgstr "Automatycznie zatwierdzający"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "wiki_guardian"
msgstr "Strażnik wiki"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "second"
msgid_plural "seconds"
msgstr[0] "sekunda"
msgstr[1] "sekundy"
msgstr[2] "sekund"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minuta"
msgstr[1] "minuty"
msgstr[2] "minut"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "hour"
msgid_plural "hours"
msgstr[0] "godzina"
msgstr[1] "godziny"
msgstr[2] "godzin"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "day"
msgid_plural "days"
msgstr[0] "dzień"
msgstr[1] "dni"
msgstr[2] "dni"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "week"
msgid_plural "weeks"
msgstr[0] "tydzień"
msgstr[1] "tygodnie"
msgstr[2] "tygodni"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "month"
msgid_plural "months"
msgstr[0] "miesiąc"
msgstr[1] "miesiące"
msgstr[2] "miesięcy"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "year"
msgid_plural "years"
msgstr[0] "rok"
msgstr[1] "lata"
msgstr[2] "lat"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "millennium"
msgid_plural "millennia"
msgstr[0] "tysiąclecie"
msgstr[1] "tysiąclecia"
msgstr[2] "tysiącleci"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "decade"
msgid_plural "decades"
msgstr[0] "dekada"
msgstr[1] "dekady"
msgstr[2] "dekad"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "century"
msgid_plural "centuries"
msgstr[0] "stulecie"
diff --git a/locale/pt-br/LC_MESSAGES/misc.mo b/locale/pt-br/LC_MESSAGES/misc.mo
new file mode 100644
index 0000000..b6dd340
Binary files /dev/null and b/locale/pt-br/LC_MESSAGES/misc.mo differ
diff --git a/locale/pt-br/LC_MESSAGES/misc.po b/locale/pt-br/LC_MESSAGES/misc.po
new file mode 100644
index 0000000..710038a
--- /dev/null
+++ b/locale/pt-br/LC_MESSAGES/misc.po
@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-05-20 17:18+0200\n"
+"PO-Revision-Date: 2019-05-21 01:22+0200\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.2.1\n"
+"Last-Translator: \n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Language: pt\n"
+
+#: misc.py:76
+msgid ""
+"\n"
+"__And more__"
+msgstr ""
+"\n"
+"__E mais__"
diff --git a/locale/pt-br/LC_MESSAGES/rcgcdw.mo b/locale/pt-br/LC_MESSAGES/rcgcdw.mo
index bbe92d0..27486a0 100644
Binary files a/locale/pt-br/LC_MESSAGES/rcgcdw.mo and b/locale/pt-br/LC_MESSAGES/rcgcdw.mo differ
diff --git a/locale/pt-br/LC_MESSAGES/rcgcdw.po b/locale/pt-br/LC_MESSAGES/rcgcdw.po
index 18537b2..57c4cbe 100644
--- a/locale/pt-br/LC_MESSAGES/rcgcdw.po
+++ b/locale/pt-br/LC_MESSAGES/rcgcdw.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-03 11:33+0200\n"
-"PO-Revision-Date: 2019-05-03 11:37+0200\n"
+"POT-Creation-Date: 2019-05-20 17:17+0200\n"
+"PO-Revision-Date: 2019-05-21 01:24+0200\n"
"Last-Translator: Frisk \n"
"Language-Team: \n"
"Language: pt_BR\n"
@@ -18,67 +18,67 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 2.2.1\n"
-#: rcgcdw.py:177
+#: rcgcdw.py:184
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}"
"{edit_size})"
msgstr ""
-#: rcgcdw.py:179
+#: rcgcdw.py:186
#, python-brace-format
msgid ""
"[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}"
"{edit_size})"
msgstr ""
-#: rcgcdw.py:183
+#: rcgcdw.py:190
#, python-brace-format
msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
msgstr ""
-#: rcgcdw.py:191
+#: rcgcdw.py:198
#, python-brace-format
msgid ""
"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
"{comment}"
msgstr ""
-#: rcgcdw.py:195
+#: rcgcdw.py:202
#, python-brace-format
msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
msgstr ""
-#: rcgcdw.py:200
+#: rcgcdw.py:207
#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
"({page_link}){comment}"
msgstr ""
-#: rcgcdw.py:205 rcgcdw.py:211
+#: rcgcdw.py:212 rcgcdw.py:218
msgid "without making a redirect"
msgstr ""
-#: rcgcdw.py:205 rcgcdw.py:212
+#: rcgcdw.py:212 rcgcdw.py:219
msgid "with a redirect"
msgstr ""
-#: rcgcdw.py:206
+#: rcgcdw.py:213
#, python-brace-format
msgid ""
"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
"({target_url}) {made_a_redirect}{comment}"
msgstr ""
-#: rcgcdw.py:213
+#: rcgcdw.py:220
#, python-brace-format
msgid ""
"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
"[{target}]({target_url}) {made_a_redirect}{comment}"
msgstr ""
-#: rcgcdw.py:219
+#: rcgcdw.py:226
#, fuzzy, python-brace-format
#| msgid "Moved protection settings from {redirect}{article} to {title}"
msgid ""
@@ -86,17 +86,17 @@ msgid ""
"* to [{target}]({target_url}){comment}"
msgstr "Configurações de proteção movidos de {redirect}{article} para {title}"
-#: rcgcdw.py:231 rcgcdw.py:598
+#: rcgcdw.py:238 rcgcdw.py:637
msgid "infinity and beyond"
msgstr "infinito e além"
-#: rcgcdw.py:246
+#: rcgcdw.py:253
#, python-brace-format
msgid ""
"[{author}]({author_url}) blocked [{user}]({user_url}) for {time}{comment}"
msgstr ""
-#: rcgcdw.py:251
+#: rcgcdw.py:258
#, fuzzy, python-brace-format
#| msgid "Changed block settings for {blocked_user}"
msgid ""
@@ -104,26 +104,26 @@ msgid ""
"({user_url}){comment}"
msgstr "Configurações de bloqueio alteradas para {blocked_user}"
-#: rcgcdw.py:256
+#: rcgcdw.py:263
#, python-brace-format
msgid ""
"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
msgstr ""
-#: rcgcdw.py:260
+#: rcgcdw.py:267
#, fuzzy, python-brace-format
#| msgid "Left a comment on {target}'s profile"
msgid ""
"[{author}]({author_url}) left a [comment]({comment}) on {target} profile"
msgstr "Deixou um comentário no perfil de {target}"
-#: rcgcdw.py:260
+#: rcgcdw.py:267
#, fuzzy
#| msgid "Edited their own profile"
msgid "their own profile"
msgstr "Editou seu próprio perfil"
-#: rcgcdw.py:265
+#: rcgcdw.py:272
#, fuzzy, python-brace-format
#| msgid "Replied to a comment on {target}'s profile"
msgid ""
@@ -131,127 +131,127 @@ msgid ""
"profile"
msgstr "Respondeu a um comentário no perfil de {target}"
-#: rcgcdw.py:268 rcgcdw.py:276 rcgcdw.py:283
+#: rcgcdw.py:275 rcgcdw.py:283 rcgcdw.py:287
msgid "their own"
msgstr ""
-#: rcgcdw.py:273
+#: rcgcdw.py:280
#, fuzzy, python-brace-format
#| msgid "Edited a comment on {target}'s profile"
msgid ""
"[{author}]({author_url}) edited a [comment]({comment}) on {target} profile"
msgstr "Editou um comentário no perfil de {target}"
-#: rcgcdw.py:281
+#: rcgcdw.py:285
#, fuzzy, python-brace-format
#| msgid "Deleted a comment on {target}'s profile"
msgid "[{author}]({author_url}) deleted a comment on {target} profile"
msgstr "Excluiu um comentário no perfil de {target}"
-#: rcgcdw.py:289 rcgcdw.py:648
+#: rcgcdw.py:293 rcgcdw.py:684
msgid "Location"
msgstr "Localização"
-#: rcgcdw.py:291 rcgcdw.py:650
+#: rcgcdw.py:295 rcgcdw.py:686
msgid "About me"
msgstr "Sobre mim"
-#: rcgcdw.py:293 rcgcdw.py:652
+#: rcgcdw.py:297 rcgcdw.py:688
msgid "Google link"
msgstr "Link do Google"
-#: rcgcdw.py:295 rcgcdw.py:654
+#: rcgcdw.py:299 rcgcdw.py:690
msgid "Facebook link"
msgstr "Facebook link"
-#: rcgcdw.py:297 rcgcdw.py:656
+#: rcgcdw.py:301 rcgcdw.py:692
msgid "Twitter link"
msgstr "Link do Twitter"
-#: rcgcdw.py:299 rcgcdw.py:658
+#: rcgcdw.py:303 rcgcdw.py:694
msgid "Reddit link"
msgstr "Link do Reddit"
-#: rcgcdw.py:301 rcgcdw.py:660
+#: rcgcdw.py:305 rcgcdw.py:696
msgid "Twitch link"
msgstr "Link do Twitch"
-#: rcgcdw.py:303 rcgcdw.py:662
+#: rcgcdw.py:307 rcgcdw.py:698
msgid "PSN link"
msgstr "Link do PSN"
-#: rcgcdw.py:305 rcgcdw.py:664
+#: rcgcdw.py:309 rcgcdw.py:700
msgid "VK link"
msgstr "Link do VK"
-#: rcgcdw.py:307 rcgcdw.py:666
+#: rcgcdw.py:311 rcgcdw.py:702
msgid "XVL link"
msgstr "Link do XVL"
-#: rcgcdw.py:309 rcgcdw.py:668
+#: rcgcdw.py:313 rcgcdw.py:704
msgid "Steam link"
msgstr "Link do Steam"
-#: rcgcdw.py:311 rcgcdw.py:670
+#: rcgcdw.py:315 rcgcdw.py:706
msgid "Discord handle"
msgstr ""
-#: rcgcdw.py:313
+#: rcgcdw.py:317
#, fuzzy
#| msgid "Unknown"
msgid "unknown"
msgstr "Desconhecido"
-#: rcgcdw.py:314
+#: rcgcdw.py:318
#, python-brace-format
msgid "[{target}]({target_url})'s"
msgstr ""
-#: rcgcdw.py:314
+#: rcgcdw.py:318
#, python-brace-format
msgid "[their own]({target_url})"
msgstr ""
-#: rcgcdw.py:315
+#: rcgcdw.py:319
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*"
msgstr ""
-#: rcgcdw.py:329 rcgcdw.py:331 rcgcdw.py:701 rcgcdw.py:703
+#: rcgcdw.py:333 rcgcdw.py:335 rcgcdw.py:736 rcgcdw.py:738
msgid "none"
msgstr "nenhum"
-#: rcgcdw.py:337 rcgcdw.py:688
+#: rcgcdw.py:341 rcgcdw.py:723
msgid "System"
msgstr "Sistema"
-#: rcgcdw.py:343
+#: rcgcdw.py:347
#, python-brace-format
msgid ""
"[{author}]({author_url}) protected [{article}]({article_url}) with the "
"following settings: {settings}{comment}"
msgstr ""
-#: rcgcdw.py:345 rcgcdw.py:354 rcgcdw.py:712 rcgcdw.py:719
+#: rcgcdw.py:349 rcgcdw.py:358 rcgcdw.py:747 rcgcdw.py:754
msgid " [cascading]"
msgstr " [em cascata]"
-#: rcgcdw.py:351
+#: rcgcdw.py:355
#, python-brace-format
msgid ""
"[{author}]({author_url}) modified protection settings of [{article}]"
"({article_url}) to: {settings}{comment}"
msgstr ""
-#: rcgcdw.py:359
+#: rcgcdw.py:363
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed protection from [{article}]({article_url})"
"{comment}"
msgstr ""
-#: rcgcdw.py:364
+#: rcgcdw.py:368
#, fuzzy, python-brace-format
#| msgid "Changed visibility of revision on page {article} "
#| msgid_plural "Changed visibility of {amount} revisions on page {article} "
@@ -264,7 +264,7 @@ msgid_plural ""
msgstr[0] "Visibilidade alterada da revisão na página {article} "
msgstr[1] "Visibilidade alterada de {amount} revisões na página {article} "
-#: rcgcdw.py:370
+#: rcgcdw.py:374
#, python-brace-format
msgid ""
"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
@@ -275,78 +275,78 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:376
+#: rcgcdw.py:380
#, python-brace-format
msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
msgstr ""
-#: rcgcdw.py:378
+#: rcgcdw.py:382
#, fuzzy, python-brace-format
#| msgid "Changed visibility of log events"
msgid "[{author}]({author_url}) changed visibility of log events{comment}"
msgstr "Visibilidade alterada de eventos de registros"
-#: rcgcdw.py:380
+#: rcgcdw.py:384
#, python-brace-format
msgid "[{author}]({author_url}) imported interwiki{comment}"
msgstr ""
-#: rcgcdw.py:383
+#: rcgcdw.py:387
#, fuzzy, python-brace-format
#| msgid "Edited abuse filter number {number}"
msgid ""
"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
msgstr "Número de filtro de abuso editado {number}"
-#: rcgcdw.py:386
+#: rcgcdw.py:390
#, fuzzy, python-brace-format
#| msgid "Created abuse filter number {number}"
msgid ""
"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
msgstr "Criado filtro de abuso número {number}"
-#: rcgcdw.py:392
+#: rcgcdw.py:396
#, python-brace-format
msgid ""
"[{author}]({author_url}) merged revision histories of [{article}]"
"({article_url}) into [{dest}]({dest_url}){comment}"
msgstr ""
-#: rcgcdw.py:396
+#: rcgcdw.py:400
#, python-brace-format
msgid ""
"[{author}]({author_url}) added an entry to the [interwiki table]"
"({table_url}) pointing to {website} with {prefix} prefix"
msgstr ""
-#: rcgcdw.py:402
+#: rcgcdw.py:406
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
"pointing to {website} with {prefix} prefix"
msgstr ""
-#: rcgcdw.py:408
+#: rcgcdw.py:412
#, fuzzy, python-brace-format
#| msgid "Deleted an entry in interwiki table"
msgid ""
"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
msgstr "Excluiu uma entrada na tabela interwiki"
-#: rcgcdw.py:412
+#: rcgcdw.py:416
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the content model of the page [{article}]"
"({article_url}) from {old} to {new}{comment}"
msgstr ""
-#: rcgcdw.py:417
+#: rcgcdw.py:421
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
msgstr ""
-#: rcgcdw.py:421
+#: rcgcdw.py:425
#, fuzzy, python-brace-format
#| msgid "Created the sprite sheet for {article}"
msgid ""
@@ -354,72 +354,84 @@ msgid ""
"({article_url})"
msgstr "Criou a folha de sprites para {article}"
-#: rcgcdw.py:425
+#: rcgcdw.py:429
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
msgstr ""
-#: rcgcdw.py:428
+#: rcgcdw.py:432
#, python-brace-format
msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\""
msgstr ""
-#: rcgcdw.py:432
+#: rcgcdw.py:436
#, python-brace-format
msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\""
msgstr ""
-#: rcgcdw.py:436
+#: rcgcdw.py:440
#, python-brace-format
msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\""
msgstr ""
-#: rcgcdw.py:439
+#: rcgcdw.py:443
#, python-brace-format
msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\""
msgstr ""
-#: rcgcdw.py:442
+#: rcgcdw.py:445
msgid "An action has been hidden by administration."
msgstr ""
-#: rcgcdw.py:450 rcgcdw.py:704
+#: rcgcdw.py:454 rcgcdw.py:739
msgid "No description provided"
msgstr "Nenhuma descrição fornecida"
-#: rcgcdw.py:500
+#: rcgcdw.py:504
msgid "(N!) "
msgstr "(N!) "
-#: rcgcdw.py:501
+#: rcgcdw.py:505
msgid "m "
msgstr "m "
-#: rcgcdw.py:525 rcgcdw.py:560
+#: rcgcdw.py:524 rcgcdw.py:529
+msgid "__Only whitespace__"
+msgstr "__Apenas espaço em branco__"
+
+#: rcgcdw.py:535
+msgid "Removed"
+msgstr "Removido"
+
+#: rcgcdw.py:538
+msgid "Added"
+msgstr "Adicionado"
+
+#: rcgcdw.py:564 rcgcdw.py:599
msgid "Options"
msgstr "Opções"
-#: rcgcdw.py:525
+#: rcgcdw.py:564
#, python-brace-format
msgid "([preview]({link}) | [undo]({undolink}))"
msgstr "([visualização]({link}) | [desfazer]({undolink}))"
-#: rcgcdw.py:527
+#: rcgcdw.py:566
#, python-brace-format
msgid "Uploaded a new version of {name}"
msgstr "Carregou uma nova versão de {name}"
-#: rcgcdw.py:529
+#: rcgcdw.py:568
#, python-brace-format
msgid "Uploaded {name}"
msgstr "Carregado {name}"
-#: rcgcdw.py:545
+#: rcgcdw.py:584
msgid "**No license!**"
msgstr "* * Sem licença!* *"
-#: rcgcdw.py:557
+#: rcgcdw.py:596
msgid ""
"\n"
"License: {}"
@@ -427,470 +439,476 @@ msgstr ""
"\n"
"Licença: {}"
-#: rcgcdw.py:560
+#: rcgcdw.py:599
#, python-brace-format
msgid "([preview]({link}))"
msgstr "([visualização]({link}))"
-#: rcgcdw.py:565
+#: rcgcdw.py:604
#, python-brace-format
msgid "Deleted page {article}"
msgstr "Página {article} excluída"
-#: rcgcdw.py:569
+#: rcgcdw.py:608
#, python-brace-format
msgid "Deleted redirect {article} by overwriting"
msgstr "Redirecionado {article} excluído por sobrescrevendo"
-#: rcgcdw.py:574
+#: rcgcdw.py:613
msgid "No redirect has been made"
msgstr "Nenhum redirecionamento foi feito"
-#: rcgcdw.py:575
+#: rcgcdw.py:614
msgid "A redirect has been made"
msgstr "Foi feito um redirecionamento"
-#: rcgcdw.py:576
+#: rcgcdw.py:615
#, python-brace-format
msgid "Moved {redirect}{article} to {target}"
msgstr "Movido {redirect}{article} para {target}"
-#: rcgcdw.py:580
+#: rcgcdw.py:619
#, python-brace-format
msgid "Moved {redirect}{article} to {title} over redirect"
msgstr "Movido {redirect}{article} para {title} ao redirecionar"
-#: rcgcdw.py:585
+#: rcgcdw.py:624
#, python-brace-format
msgid "Moved protection settings from {redirect}{article} to {title}"
msgstr "Configurações de proteção movidos de {redirect}{article} para {title}"
-#: rcgcdw.py:608
+#: rcgcdw.py:647
#, python-brace-format
msgid "Blocked {blocked_user} for {time}"
msgstr "Bloqueado {blocked_user} por {time}"
-#: rcgcdw.py:614
+#: rcgcdw.py:653
#, python-brace-format
msgid "Changed block settings for {blocked_user}"
msgstr "Configurações de bloqueio alteradas para {blocked_user}"
-#: rcgcdw.py:620
+#: rcgcdw.py:659
#, python-brace-format
msgid "Unblocked {blocked_user}"
msgstr "Desbloqueado {blocked_user}"
-#: rcgcdw.py:625
+#: rcgcdw.py:663
#, python-brace-format
msgid "Left a comment on {target}'s profile"
msgstr "Deixou um comentário no perfil de {target}"
-#: rcgcdw.py:627
+#: rcgcdw.py:665
msgid "Left a comment on their own profile"
msgstr "Deixou um comentário em seu próprio perfil"
-#: rcgcdw.py:632
+#: rcgcdw.py:669
#, python-brace-format
msgid "Replied to a comment on {target}'s profile"
msgstr "Respondeu a um comentário no perfil de {target}"
-#: rcgcdw.py:634
+#: rcgcdw.py:671
msgid "Replied to a comment on their own profile"
msgstr "Respondeu a um comentário em seu próprio perfil"
-#: rcgcdw.py:639
+#: rcgcdw.py:675
#, python-brace-format
msgid "Edited a comment on {target}'s profile"
msgstr "Editou um comentário no perfil de {target}"
-#: rcgcdw.py:641
+#: rcgcdw.py:677
msgid "Edited a comment on their own profile"
msgstr "Editou um comentário em seu próprio perfil"
-#: rcgcdw.py:672 rcgcdw.py:811
+#: rcgcdw.py:708 rcgcdw.py:846
msgid "Unknown"
msgstr "Desconhecido"
-#: rcgcdw.py:673
+#: rcgcdw.py:709
#, python-brace-format
msgid "Edited {target}'s profile"
msgstr "Editado perfil {target}"
-#: rcgcdw.py:673
+#: rcgcdw.py:709
msgid "Edited their own profile"
msgstr "Editou seu próprio perfil"
-#: rcgcdw.py:675
+#: rcgcdw.py:711
#, python-brace-format
msgid "Cleared the {field} field"
msgstr ""
-#: rcgcdw.py:677
+#: rcgcdw.py:713
#, python-brace-format
msgid "{field} field changed to: {desc}"
msgstr "campo {field} alterado para: {desc}"
-#: rcgcdw.py:682
+#: rcgcdw.py:717
#, python-brace-format
msgid "Deleted a comment on {target}'s profile"
msgstr "Excluiu um comentário no perfil de {target}"
-#: rcgcdw.py:686
+#: rcgcdw.py:721
#, python-brace-format
msgid "Changed group membership for {target}"
msgstr "Alterado grupo do membro de {target}"
-#: rcgcdw.py:690
+#: rcgcdw.py:725
#, python-brace-format
msgid "{target} got autopromoted to a new usergroup"
msgstr "{target} recebeu um promovido para um novo grupo de usuários"
-#: rcgcdw.py:705
+#: rcgcdw.py:740
#, python-brace-format
msgid "Groups changed from {old_groups} to {new_groups}{reason}"
msgstr "Grupos alterados de {old_groups} para {new_groups} {reason}"
-#: rcgcdw.py:710
+#: rcgcdw.py:745
#, python-brace-format
msgid "Protected {target}"
msgstr "Protegido {target}"
-#: rcgcdw.py:717
+#: rcgcdw.py:752
#, python-brace-format
msgid "Changed protection level for {article}"
msgstr "Nível de proteção alterado para {article}"
-#: rcgcdw.py:724
+#: rcgcdw.py:759
#, python-brace-format
msgid "Removed protection from {article}"
msgstr "Removida a proteção de {article}"
-#: rcgcdw.py:729
+#: rcgcdw.py:764
#, python-brace-format
msgid "Changed visibility of revision on page {article} "
msgid_plural "Changed visibility of {amount} revisions on page {article} "
msgstr[0] "Visibilidade alterada da revisão na página {article} "
msgstr[1] "Visibilidade alterada de {amount} revisões na página {article} "
-#: rcgcdw.py:735
+#: rcgcdw.py:770
#, python-brace-format
msgid "Imported {article} with {count} revision"
msgid_plural "Imported {article} with {count} revisions"
msgstr[0] "Importou {article} com {count} revisão"
msgstr[1] "{article} importado com {count} revisões"
-#: rcgcdw.py:741
+#: rcgcdw.py:776
#, python-brace-format
msgid "Restored {article}"
msgstr "Página {article} excluída"
-#: rcgcdw.py:744
+#: rcgcdw.py:779
msgid "Changed visibility of log events"
msgstr "Visibilidade alterada de eventos de registros"
-#: rcgcdw.py:747
+#: rcgcdw.py:782
msgid "Imported interwiki"
msgstr "Interwiki importado"
-#: rcgcdw.py:750
+#: rcgcdw.py:785
#, python-brace-format
msgid "Edited abuse filter number {number}"
msgstr "Número de filtro de abuso editado {number}"
-#: rcgcdw.py:753
+#: rcgcdw.py:788
#, python-brace-format
msgid "Created abuse filter number {number}"
msgstr "Criado filtro de abuso número {number}"
-#: rcgcdw.py:757
+#: rcgcdw.py:792
#, python-brace-format
msgid "Merged revision histories of {article} into {dest}"
msgstr "Históricos de revisão mesclados de {article} em {dest}"
-#: rcgcdw.py:761
+#: rcgcdw.py:796
msgid "Added an entry to the interwiki table"
msgstr "Adicionado uma entrada para a tabela interwiki"
-#: rcgcdw.py:762 rcgcdw.py:768
+#: rcgcdw.py:797 rcgcdw.py:803
#, python-brace-format
msgid "Prefix: {prefix}, website: {website} | {desc}"
msgstr "Prefixo: {prefix}, site: {website} | {desc}"
-#: rcgcdw.py:767
+#: rcgcdw.py:802
msgid "Edited an entry in interwiki table"
msgstr "Editou uma entrada na tabela interwiki"
-#: rcgcdw.py:773
+#: rcgcdw.py:808
msgid "Deleted an entry in interwiki table"
msgstr "Excluiu uma entrada na tabela interwiki"
-#: rcgcdw.py:774
+#: rcgcdw.py:809
#, python-brace-format
msgid "Prefix: {prefix} | {desc}"
msgstr "Prefixo: {prefix} | {desc}"
-#: rcgcdw.py:778
+#: rcgcdw.py:813
#, python-brace-format
msgid "Changed the content model of the page {article}"
msgstr "Alterou o modelo de conteúdo da página {article}"
-#: rcgcdw.py:779
+#: rcgcdw.py:814
#, python-brace-format
msgid "Model changed from {old} to {new}: {reason}"
msgstr "Modelo alterado de {old} para {new}: {reason}"
-#: rcgcdw.py:785
+#: rcgcdw.py:820
#, python-brace-format
msgid "Edited the sprite for {article}"
msgstr "Editou o sprite para {article}"
-#: rcgcdw.py:789
+#: rcgcdw.py:824
#, python-brace-format
msgid "Created the sprite sheet for {article}"
msgstr "Criou a folha de sprites para {article}"
-#: rcgcdw.py:793
+#: rcgcdw.py:828
#, python-brace-format
msgid "Edited the slice for {article}"
msgstr "Editou a fatia de {article}"
-#: rcgcdw.py:796
+#: rcgcdw.py:831
#, python-brace-format
msgid "Created a tag \"{tag}\""
msgstr "Criei uma etiqueta \"{tag}\""
-#: rcgcdw.py:800
+#: rcgcdw.py:835
#, python-brace-format
msgid "Deleted a tag \"{tag}\""
msgstr "Excluiu uma etiqueta \"{tag}\""
-#: rcgcdw.py:804
+#: rcgcdw.py:839
#, python-brace-format
msgid "Activated a tag \"{tag}\""
msgstr "Ativou uma etiqueta \"{tag}\""
-#: rcgcdw.py:807
+#: rcgcdw.py:842
#, python-brace-format
msgid "Deactivated a tag \"{tag}\""
msgstr "Desativou uma etiqueta \"{tag}\""
-#: rcgcdw.py:810
+#: rcgcdw.py:845
msgid "Action has been hidden by administration."
msgstr ""
-#: rcgcdw.py:837
+#: rcgcdw.py:872
msgid "Tags"
msgstr "Etiquetas"
-#: rcgcdw.py:843
+#: rcgcdw.py:877
msgid "**Added**: "
msgstr "**Adicionado**: "
-#: rcgcdw.py:843
+#: rcgcdw.py:877
msgid " and {} more\n"
msgstr " e {} mais\n"
-#: rcgcdw.py:844
+#: rcgcdw.py:878
msgid "**Removed**: "
msgstr "**Removida**: "
-#: rcgcdw.py:844
+#: rcgcdw.py:878
msgid " and {} more"
msgstr " e {} mais"
-#: rcgcdw.py:845
+#: rcgcdw.py:879
msgid "Changed categories"
msgstr "Mudanças de categorias"
-#: rcgcdw.py:886
+#: rcgcdw.py:920
msgid "~~hidden~~"
msgstr ""
-#: rcgcdw.py:892
+#: rcgcdw.py:926
msgid "hidden"
msgstr ""
-#: rcgcdw.py:995
+#: rcgcdw.py:1000 rcgcdw.py:1002 rcgcdw.py:1004 rcgcdw.py:1006 rcgcdw.py:1008
+#: rcgcdw.py:1010 rcgcdw.py:1012
+#, python-brace-format
+msgid "{value} (avg. {avg})"
+msgstr ""
+
+#: rcgcdw.py:1053
msgid "Daily overview"
msgstr "Visão geral diária"
-#: rcgcdw.py:1005
+#: rcgcdw.py:1062
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] " ({} açao)"
msgstr[1] " ({} ações)"
-#: rcgcdw.py:1009
+#: rcgcdw.py:1064
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] " ({} editado)"
msgstr[1] " ({} edições)"
-#: rcgcdw.py:1014
+#: rcgcdw.py:1069
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] " UTC ({} ação)"
msgstr[1] " UTC ({} ações)"
-#: rcgcdw.py:1016 rcgcdw.py:1017 rcgcdw.py:1021
+#: rcgcdw.py:1071 rcgcdw.py:1072 rcgcdw.py:1076
msgid "But nobody came"
msgstr "Mas ninguém veio"
-#: rcgcdw.py:1024
+#: rcgcdw.py:1080
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] "Usuário mais ativo"
msgstr[1] "Usuários mais ativos"
-#: rcgcdw.py:1025
+#: rcgcdw.py:1081
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] "Artigo mais editado"
msgstr[1] "Artigos mais editados"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1082
msgid "Edits made"
msgstr "Edições feitas"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1082
msgid "New files"
msgstr "Novos arquivos"
-#: rcgcdw.py:1026
+#: rcgcdw.py:1082
msgid "Admin actions"
msgstr "Ações de administração"
-#: rcgcdw.py:1027
+#: rcgcdw.py:1083
msgid "Bytes changed"
msgstr "Bytes alterados"
-#: rcgcdw.py:1027
+#: rcgcdw.py:1083
msgid "New articles"
msgstr "Novos artigos"
-#: rcgcdw.py:1028
+#: rcgcdw.py:1084
msgid "Unique contributors"
msgstr "Contribuidores exclusivos"
-#: rcgcdw.py:1029
+#: rcgcdw.py:1085
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] "Hora mais ativa"
msgstr[1] "Horas mais ativas"
-#: rcgcdw.py:1030
+#: rcgcdw.py:1086
msgid "Day score"
msgstr "Pontuação do dia"
-#: rcgcdw.py:1177
+#: rcgcdw.py:1227
#, python-brace-format
msgid "Connection to {wiki} seems to be stable now."
msgstr "A conexão com {wiki} parece estar estável agora."
-#: rcgcdw.py:1178 rcgcdw.py:1289
+#: rcgcdw.py:1228 rcgcdw.py:1339
msgid "Connection status"
msgstr "Status da conexão"
-#: rcgcdw.py:1288
+#: rcgcdw.py:1338
#, python-brace-format
msgid "{wiki} seems to be down or unreachable."
msgstr "{wiki} parece estar inativo ou inacessível."
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "director"
msgstr "diretor"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "bot"
msgstr "robô"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "editor"
msgstr "editor"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "directors"
msgstr "diretores"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "sysop"
msgstr "administrador"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "bureaucrat"
msgstr "burocrata"
-#: rcgcdw.py:1342
+#: rcgcdw.py:1394
msgid "reviewer"
msgstr "revisor"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "autoreview"
msgstr "revisão automática"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "autopatrol"
msgstr "patrulha automatica"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "wiki_guardian"
msgstr "guardião_wiki"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "second"
msgid_plural "seconds"
msgstr[0] "segundo"
msgstr[1] "segundos"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minuto"
msgstr[1] "minutos"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "hour"
msgid_plural "hours"
msgstr[0] "hora"
msgstr[1] "horas"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "day"
msgid_plural "days"
msgstr[0] "dia"
msgstr[1] "dias"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "week"
msgid_plural "weeks"
msgstr[0] "semana"
msgstr[1] "semanas"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "month"
msgid_plural "months"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "year"
msgid_plural "years"
msgstr[0] "ano"
msgstr[1] "anos"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "millennium"
msgid_plural "millennia"
msgstr[0] "milénio"
msgstr[1] "milénios"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "decade"
msgid_plural "decades"
msgstr[0] "década"
msgstr[1] "décadas"
-#: rcgcdw.py:1343
+#: rcgcdw.py:1395
msgid "century"
msgid_plural "centuries"
msgstr[0] "século"
diff --git a/locale/ru/LC_MESSAGES/misc.mo b/locale/ru/LC_MESSAGES/misc.mo
new file mode 100644
index 0000000..63f2da1
Binary files /dev/null and b/locale/ru/LC_MESSAGES/misc.mo differ
diff --git a/locale/ru/LC_MESSAGES/misc.po b/locale/ru/LC_MESSAGES/misc.po
new file mode 100644
index 0000000..c959c33
--- /dev/null
+++ b/locale/ru/LC_MESSAGES/misc.po
@@ -0,0 +1,25 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-05-20 17:18+0200\n"
+"PO-Revision-Date: 2019-05-21 01:19+0200\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.2.1\n"
+"Last-Translator: \n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
+"Language: ru\n"
+
+#: misc.py:76
+msgid ""
+"\n"
+"__And more__"
+msgstr ""
diff --git a/misc.pot b/misc.pot
new file mode 100644
index 0000000..9fdf7d8
--- /dev/null
+++ b/misc.pot
@@ -0,0 +1,24 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-05-20 17:18+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: misc.py:76
+msgid ""
+"\n"
+"__And more__"
+msgstr ""
diff --git a/misc.py b/misc.py
new file mode 100644
index 0000000..ea30a4e
--- /dev/null
+++ b/misc.py
@@ -0,0 +1,222 @@
+# -*- coding: utf-8 -*-
+
+# Recent changes Gamepedia compatible Discord webhook is a project for using a webhook as recent changes page from MediaWiki.
+# Copyright (C) 2018 Frisk
+
+# This program 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.
+
+# This program 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 this program. If not, see .
+
+import json, logging, sys, re
+from html.parser import HTMLParser
+from configloader import settings
+import gettext
+
+# Initialize translation
+
+t = gettext.translation('misc', localedir='locale', languages=[settings["lang"]])
+_ = t.gettext
+
+# Create a custom logger
+
+misc_logger = logging.getLogger("rcgcdw.misc")
+
+data_template = {"rcid": 99999999999,
+ "daily_overview": {"edits": None, "new_files": None, "admin_actions": None, "bytes_changed": None,
+ "new_articles": None, "unique_editors": None, "day_score": None, "days_tracked": 0}}
+
+
+def generate_datafile():
+ """Generate a data.json file from a template."""
+ try:
+ with open("data.json", 'w') as data:
+ data.write(json.dumps(data_template, indent=4))
+ except PermissionError:
+ misc_logger.critical("Could not create a data file (no permissions). No way to store last edit.")
+ sys.exit(1)
+
+
+def load_datafile() -> object:
+ """Read a data.json file and return a dictionary with contents
+ :rtype: object
+ """
+ try:
+ with open("data.json") as data:
+ return json.loads(data.read())
+ except FileNotFoundError:
+ generate_datafile()
+ misc_logger.info("The data file could not be found. Generating a new one...")
+ return data_template
+
+
+def save_datafile(data):
+ """Overwrites the data.json file with given dictionary"""
+ try:
+ with open("data.json", "w") as data_file:
+ data_file.write(json.dumps(data, indent=4))
+ except PermissionError:
+ misc_logger.critical("Could not modify a data file (no permissions). No way to store last edit.")
+ sys.exit(1)
+
+
+def weighted_average(value, weight, new_value):
+ """Calculates weighted average of value number with weight weight and new_value with weight 1"""
+ return round(((value * weight) + new_value) / (weight + 1), 2)
+
+
+def link_formatter(link):
+ """Formats a link to not embed it"""
+ 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 = ""
+
+
+class LinkParser(HTMLParser):
+ new_string = ""
+ recent_href = ""
+
+ def handle_starttag(self, tag, attrs):
+ for attr in attrs:
+ if attr[0] == 'href':
+ self.recent_href = attr[1]
+ if self.recent_href.startswith("//"):
+ self.recent_href = "https:{rest}".format(rest=self.recent_href)
+ elif not self.recent_href.startswith("http"):
+ self.recent_href = "https://{wiki}.gamepedia.com".format(wiki=settings["wiki"]) + self.recent_href
+ self.recent_href = self.recent_href.replace(")", "\\)")
+
+ def handle_data(self, data):
+ if self.recent_href:
+ self.new_string = self.new_string + "[{}](<{}>)".format(data, self.recent_href)
+ self.recent_href = ""
+ else:
+ self.new_string = self.new_string + data
+
+ def handle_comment(self, data):
+ self.new_string = self.new_string + data
+
+ def handle_endtag(self, tag):
+ misc_logger.debug(self.new_string)
+
+
+def safe_read(request, *keys):
+ if request is None:
+ return None
+ try:
+ request = request.json()
+ for item in keys:
+ request = request[item]
+ except KeyError:
+ misc_logger.warning(
+ "Failure while extracting data from request on key {key} in {change}".format(key=item, change=request))
+ return None
+ except ValueError:
+ misc_logger.warning("Failure while extracting data from request in {change}".format(change=request))
+ return None
+ return request
+
+
+def handle_discord_http(code, formatted_embed, result):
+ if 300 > code > 199: # message went through
+ return 0
+ elif code == 400: # HTTP BAD REQUEST result.status_code, data, result, header
+ misc_logger.error(
+ "Following message has been rejected by Discord, please submit a bug on our bugtracker adding it:")
+ misc_logger.error(formatted_embed)
+ misc_logger.error(result.text)
+ return 1
+ elif code == 401 or code == 404: # HTTP UNAUTHORIZED AND NOT FOUND
+ misc_logger.error("Webhook URL is invalid or no longer in use, please replace it with proper one.")
+ sys.exit(1)
+ elif code == 429:
+ misc_logger.error("We are sending too many requests to the Discord, slowing down...")
+ return 2
+ elif 499 < code < 600:
+ misc_logger.error(
+ "Discord have trouble processing the event, and because the HTTP code returned is {} it means we blame them.".format(
+ code))
+ return 3
+
+
+def add_to_dict(dictionary, key):
+ if key in dictionary:
+ dictionary[key] += 1
+ else:
+ dictionary[key] = 1
+ return dictionary
\ No newline at end of file
diff --git a/rcgcdw.pot b/rcgcdw.pot
index ed0ef1c..530fa82 100644
--- a/rcgcdw.pot
+++ b/rcgcdw.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-03 11:33+0200\n"
+"POT-Creation-Date: 2019-05-21 23:49+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,230 +18,230 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: rcgcdw.py:177
+#: rcgcdw.py:133
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited [{article}]({edit_link}){comment} ({sign}"
"{edit_size})"
msgstr ""
-#: rcgcdw.py:179
+#: rcgcdw.py:135
#, python-brace-format
msgid ""
"[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}"
"{edit_size})"
msgstr ""
-#: rcgcdw.py:183
+#: rcgcdw.py:139
#, python-brace-format
msgid "[{author}]({author_url}) uploaded [{file}]({file_link}){comment}"
msgstr ""
-#: rcgcdw.py:191
+#: rcgcdw.py:147
#, python-brace-format
msgid ""
"[{author}]({author_url}) uploaded a new version of [{file}]({file_link})"
"{comment}"
msgstr ""
-#: rcgcdw.py:195
+#: rcgcdw.py:151
#, python-brace-format
msgid "[{author}]({author_url}) deleted [{page}]({page_link}){comment}"
msgstr ""
-#: rcgcdw.py:200
+#: rcgcdw.py:156
#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted redirect by overwriting [{page}]"
"({page_link}){comment}"
msgstr ""
-#: rcgcdw.py:205 rcgcdw.py:211
+#: rcgcdw.py:161 rcgcdw.py:167
msgid "without making a redirect"
msgstr ""
-#: rcgcdw.py:205 rcgcdw.py:212
+#: rcgcdw.py:161 rcgcdw.py:168
msgid "with a redirect"
msgstr ""
-#: rcgcdw.py:206
+#: rcgcdw.py:162
#, python-brace-format
msgid ""
"[{author}]({author_url}) moved {redirect}*{article}* to [{target}]"
"({target_url}) {made_a_redirect}{comment}"
msgstr ""
-#: rcgcdw.py:213
+#: rcgcdw.py:169
#, python-brace-format
msgid ""
"[{author}]({author_url}) moved {redirect}*{article}* over redirect to "
"[{target}]({target_url}) {made_a_redirect}{comment}"
msgstr ""
-#: rcgcdw.py:219
+#: rcgcdw.py:175
#, python-brace-format
msgid ""
"[{author}]({author_url}) moved protection settings from {redirect}*{article}"
"* to [{target}]({target_url}){comment}"
msgstr ""
-#: rcgcdw.py:231 rcgcdw.py:598
+#: rcgcdw.py:187 rcgcdw.py:586
msgid "infinity and beyond"
msgstr ""
-#: rcgcdw.py:246
+#: rcgcdw.py:202
#, python-brace-format
msgid ""
"[{author}]({author_url}) blocked [{user}]({user_url}) for {time}{comment}"
msgstr ""
-#: rcgcdw.py:251
+#: rcgcdw.py:207
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed block settings for [{blocked_user}]"
"({user_url}){comment}"
msgstr ""
-#: rcgcdw.py:256
+#: rcgcdw.py:212
#, python-brace-format
msgid ""
"[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}"
msgstr ""
-#: rcgcdw.py:260
+#: rcgcdw.py:216
#, python-brace-format
msgid ""
"[{author}]({author_url}) left a [comment]({comment}) on {target} profile"
msgstr ""
-#: rcgcdw.py:260
+#: rcgcdw.py:216
msgid "their own profile"
msgstr ""
-#: rcgcdw.py:265
+#: rcgcdw.py:221
#, python-brace-format
msgid ""
"[{author}]({author_url}) replied to a [comment]({comment}) on {target} "
"profile"
msgstr ""
-#: rcgcdw.py:268 rcgcdw.py:276 rcgcdw.py:283
+#: rcgcdw.py:224 rcgcdw.py:232 rcgcdw.py:236
msgid "their own"
msgstr ""
-#: rcgcdw.py:273
+#: rcgcdw.py:229
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited a [comment]({comment}) on {target} profile"
msgstr ""
-#: rcgcdw.py:281
+#: rcgcdw.py:234
#, python-brace-format
msgid "[{author}]({author_url}) deleted a comment on {target} profile"
msgstr ""
-#: rcgcdw.py:289 rcgcdw.py:648
+#: rcgcdw.py:242 rcgcdw.py:633
msgid "Location"
msgstr ""
-#: rcgcdw.py:291 rcgcdw.py:650
+#: rcgcdw.py:244 rcgcdw.py:635
msgid "About me"
msgstr ""
-#: rcgcdw.py:293 rcgcdw.py:652
+#: rcgcdw.py:246 rcgcdw.py:637
msgid "Google link"
msgstr ""
-#: rcgcdw.py:295 rcgcdw.py:654
+#: rcgcdw.py:248 rcgcdw.py:639
msgid "Facebook link"
msgstr ""
-#: rcgcdw.py:297 rcgcdw.py:656
+#: rcgcdw.py:250 rcgcdw.py:641
msgid "Twitter link"
msgstr ""
-#: rcgcdw.py:299 rcgcdw.py:658
+#: rcgcdw.py:252 rcgcdw.py:643
msgid "Reddit link"
msgstr ""
-#: rcgcdw.py:301 rcgcdw.py:660
+#: rcgcdw.py:254 rcgcdw.py:645
msgid "Twitch link"
msgstr ""
-#: rcgcdw.py:303 rcgcdw.py:662
+#: rcgcdw.py:256 rcgcdw.py:647
msgid "PSN link"
msgstr ""
-#: rcgcdw.py:305 rcgcdw.py:664
+#: rcgcdw.py:258 rcgcdw.py:649
msgid "VK link"
msgstr ""
-#: rcgcdw.py:307 rcgcdw.py:666
+#: rcgcdw.py:260 rcgcdw.py:651
msgid "XVL link"
msgstr ""
-#: rcgcdw.py:309 rcgcdw.py:668
+#: rcgcdw.py:262 rcgcdw.py:653
msgid "Steam link"
msgstr ""
-#: rcgcdw.py:311 rcgcdw.py:670
+#: rcgcdw.py:264 rcgcdw.py:655
msgid "Discord handle"
msgstr ""
-#: rcgcdw.py:313
+#: rcgcdw.py:266
msgid "unknown"
msgstr ""
-#: rcgcdw.py:314
+#: rcgcdw.py:267
#, python-brace-format
msgid "[{target}]({target_url})'s"
msgstr ""
-#: rcgcdw.py:314
+#: rcgcdw.py:267
#, python-brace-format
msgid "[their own]({target_url})"
msgstr ""
-#: rcgcdw.py:315
+#: rcgcdw.py:268
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the {field} on {target} profile. *({desc})*"
msgstr ""
-#: rcgcdw.py:329 rcgcdw.py:331 rcgcdw.py:701 rcgcdw.py:703
+#: rcgcdw.py:282 rcgcdw.py:284 rcgcdw.py:687 rcgcdw.py:689
msgid "none"
msgstr ""
-#: rcgcdw.py:337 rcgcdw.py:688
+#: rcgcdw.py:290 rcgcdw.py:674
msgid "System"
msgstr ""
-#: rcgcdw.py:343
+#: rcgcdw.py:296
#, python-brace-format
msgid ""
"[{author}]({author_url}) protected [{article}]({article_url}) with the "
"following settings: {settings}{comment}"
msgstr ""
-#: rcgcdw.py:345 rcgcdw.py:354 rcgcdw.py:712 rcgcdw.py:719
+#: rcgcdw.py:298 rcgcdw.py:307 rcgcdw.py:698 rcgcdw.py:705
msgid " [cascading]"
msgstr ""
-#: rcgcdw.py:351
+#: rcgcdw.py:304
#, python-brace-format
msgid ""
"[{author}]({author_url}) modified protection settings of [{article}]"
"({article_url}) to: {settings}{comment}"
msgstr ""
-#: rcgcdw.py:359
+#: rcgcdw.py:312
#, python-brace-format
msgid ""
"[{author}]({author_url}) removed protection from [{article}]({article_url})"
"{comment}"
msgstr ""
-#: rcgcdw.py:364
+#: rcgcdw.py:317
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed visibility of revision on page [{article}]"
@@ -252,7 +252,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:370
+#: rcgcdw.py:323
#, python-brace-format
msgid ""
"[{author}]({author_url}) imported [{article}]({article_url}) with {count} "
@@ -263,615 +263,637 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:376
+#: rcgcdw.py:329
#, python-brace-format
msgid "[{author}]({author_url}) restored [{article}]({article_url}){comment}"
msgstr ""
-#: rcgcdw.py:378
+#: rcgcdw.py:331
#, python-brace-format
msgid "[{author}]({author_url}) changed visibility of log events{comment}"
msgstr ""
-#: rcgcdw.py:380
+#: rcgcdw.py:333
#, python-brace-format
msgid "[{author}]({author_url}) imported interwiki{comment}"
msgstr ""
-#: rcgcdw.py:383
+#: rcgcdw.py:336
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited abuse filter [number {number}]({filter_url})"
msgstr ""
-#: rcgcdw.py:386
+#: rcgcdw.py:339
#, python-brace-format
msgid ""
"[{author}]({author_url}) created abuse filter [number {number}]({filter_url})"
msgstr ""
-#: rcgcdw.py:392
+#: rcgcdw.py:345
#, python-brace-format
msgid ""
"[{author}]({author_url}) merged revision histories of [{article}]"
"({article_url}) into [{dest}]({dest_url}){comment}"
msgstr ""
-#: rcgcdw.py:396
+#: rcgcdw.py:349
#, python-brace-format
msgid ""
"[{author}]({author_url}) added an entry to the [interwiki table]"
"({table_url}) pointing to {website} with {prefix} prefix"
msgstr ""
-#: rcgcdw.py:402
+#: rcgcdw.py:355
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited an entry in [interwiki table]({table_url}) "
"pointing to {website} with {prefix} prefix"
msgstr ""
-#: rcgcdw.py:408
+#: rcgcdw.py:361
#, python-brace-format
msgid ""
"[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})"
msgstr ""
-#: rcgcdw.py:412
+#: rcgcdw.py:365
#, python-brace-format
msgid ""
"[{author}]({author_url}) changed the content model of the page [{article}]"
"({article_url}) from {old} to {new}{comment}"
msgstr ""
-#: rcgcdw.py:417
+#: rcgcdw.py:370
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the sprite for [{article}]({article_url})"
msgstr ""
-#: rcgcdw.py:421
+#: rcgcdw.py:374
#, python-brace-format
msgid ""
"[{author}]({author_url}) created the sprite sheet for [{article}]"
"({article_url})"
msgstr ""
-#: rcgcdw.py:425
+#: rcgcdw.py:378
#, python-brace-format
msgid ""
"[{author}]({author_url}) edited the slice for [{article}]({article_url})"
msgstr ""
-#: rcgcdw.py:428
+#: rcgcdw.py:381
#, python-brace-format
msgid "[{author}]({author_url}) created a [tag]({tag_url}) \"{tag}\""
msgstr ""
-#: rcgcdw.py:432
+#: rcgcdw.py:385
#, python-brace-format
msgid "[{author}]({author_url}) deleted a [tag]({tag_url}) \"{tag}\""
msgstr ""
-#: rcgcdw.py:436
+#: rcgcdw.py:389
#, python-brace-format
msgid "[{author}]({author_url}) activated a [tag]({tag_url}) \"{tag}\""
msgstr ""
-#: rcgcdw.py:439
+#: rcgcdw.py:392
#, python-brace-format
msgid "[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\""
msgstr ""
-#: rcgcdw.py:442
+#: rcgcdw.py:394
msgid "An action has been hidden by administration."
msgstr ""
-#: rcgcdw.py:450 rcgcdw.py:704
+#: rcgcdw.py:403 rcgcdw.py:690
msgid "No description provided"
msgstr ""
-#: rcgcdw.py:500
+#: rcgcdw.py:453
msgid "(N!) "
msgstr ""
-#: rcgcdw.py:501
+#: rcgcdw.py:454
msgid "m "
msgstr ""
-#: rcgcdw.py:525 rcgcdw.py:560
+#: rcgcdw.py:473 rcgcdw.py:478
+msgid "__Only whitespace__"
+msgstr ""
+
+#: rcgcdw.py:484
+msgid "Removed"
+msgstr ""
+
+#: rcgcdw.py:487
+msgid "Added"
+msgstr ""
+
+#: rcgcdw.py:513 rcgcdw.py:548
msgid "Options"
msgstr ""
-#: rcgcdw.py:525
+#: rcgcdw.py:513
#, python-brace-format
msgid "([preview]({link}) | [undo]({undolink}))"
msgstr ""
-#: rcgcdw.py:527
+#: rcgcdw.py:515
#, python-brace-format
msgid "Uploaded a new version of {name}"
msgstr ""
-#: rcgcdw.py:529
+#: rcgcdw.py:517
#, python-brace-format
msgid "Uploaded {name}"
msgstr ""
-#: rcgcdw.py:545
+#: rcgcdw.py:533
msgid "**No license!**"
msgstr ""
-#: rcgcdw.py:557
+#: rcgcdw.py:545
msgid ""
"\n"
"License: {}"
msgstr ""
-#: rcgcdw.py:560
+#: rcgcdw.py:548
#, python-brace-format
msgid "([preview]({link}))"
msgstr ""
-#: rcgcdw.py:565
+#: rcgcdw.py:553
#, python-brace-format
msgid "Deleted page {article}"
msgstr ""
-#: rcgcdw.py:569
+#: rcgcdw.py:557
#, python-brace-format
msgid "Deleted redirect {article} by overwriting"
msgstr ""
-#: rcgcdw.py:574
+#: rcgcdw.py:562
msgid "No redirect has been made"
msgstr ""
-#: rcgcdw.py:575
+#: rcgcdw.py:563
msgid "A redirect has been made"
msgstr ""
-#: rcgcdw.py:576
+#: rcgcdw.py:564
#, python-brace-format
msgid "Moved {redirect}{article} to {target}"
msgstr ""
-#: rcgcdw.py:580
+#: rcgcdw.py:568
#, python-brace-format
msgid "Moved {redirect}{article} to {title} over redirect"
msgstr ""
-#: rcgcdw.py:585
+#: rcgcdw.py:573
#, python-brace-format
msgid "Moved protection settings from {redirect}{article} to {title}"
msgstr ""
-#: rcgcdw.py:608
+#: rcgcdw.py:596
#, python-brace-format
msgid "Blocked {blocked_user} for {time}"
msgstr ""
-#: rcgcdw.py:614
+#: rcgcdw.py:602
#, python-brace-format
msgid "Changed block settings for {blocked_user}"
msgstr ""
-#: rcgcdw.py:620
+#: rcgcdw.py:608
#, python-brace-format
msgid "Unblocked {blocked_user}"
msgstr ""
-#: rcgcdw.py:625
+#: rcgcdw.py:612
#, python-brace-format
msgid "Left a comment on {target}'s profile"
msgstr ""
-#: rcgcdw.py:627
+#: rcgcdw.py:614
msgid "Left a comment on their own profile"
msgstr ""
-#: rcgcdw.py:632
+#: rcgcdw.py:618
#, python-brace-format
msgid "Replied to a comment on {target}'s profile"
msgstr ""
-#: rcgcdw.py:634
+#: rcgcdw.py:620
msgid "Replied to a comment on their own profile"
msgstr ""
-#: rcgcdw.py:639
+#: rcgcdw.py:624
#, python-brace-format
msgid "Edited a comment on {target}'s profile"
msgstr ""
-#: rcgcdw.py:641
+#: rcgcdw.py:626
msgid "Edited a comment on their own profile"
msgstr ""
-#: rcgcdw.py:672 rcgcdw.py:811
+#: rcgcdw.py:657
+msgid "Battle.net handle"
+msgstr ""
+
+#: rcgcdw.py:659 rcgcdw.py:797
msgid "Unknown"
msgstr ""
-#: rcgcdw.py:673
+#: rcgcdw.py:660
#, python-brace-format
msgid "Edited {target}'s profile"
msgstr ""
-#: rcgcdw.py:673
+#: rcgcdw.py:660
msgid "Edited their own profile"
msgstr ""
-#: rcgcdw.py:675
+#: rcgcdw.py:662
#, python-brace-format
msgid "Cleared the {field} field"
msgstr ""
-#: rcgcdw.py:677
+#: rcgcdw.py:664
#, python-brace-format
msgid "{field} field changed to: {desc}"
msgstr ""
-#: rcgcdw.py:682
+#: rcgcdw.py:668
#, python-brace-format
msgid "Deleted a comment on {target}'s profile"
msgstr ""
-#: rcgcdw.py:686
+#: rcgcdw.py:672
#, python-brace-format
msgid "Changed group membership for {target}"
msgstr ""
-#: rcgcdw.py:690
+#: rcgcdw.py:676
#, python-brace-format
msgid "{target} got autopromoted to a new usergroup"
msgstr ""
-#: rcgcdw.py:705
+#: rcgcdw.py:691
#, python-brace-format
msgid "Groups changed from {old_groups} to {new_groups}{reason}"
msgstr ""
-#: rcgcdw.py:710
+#: rcgcdw.py:696
#, python-brace-format
msgid "Protected {target}"
msgstr ""
-#: rcgcdw.py:717
+#: rcgcdw.py:703
#, python-brace-format
msgid "Changed protection level for {article}"
msgstr ""
-#: rcgcdw.py:724
+#: rcgcdw.py:710
#, python-brace-format
msgid "Removed protection from {article}"
msgstr ""
-#: rcgcdw.py:729
+#: rcgcdw.py:715
#, python-brace-format
msgid "Changed visibility of revision on page {article} "
msgid_plural "Changed visibility of {amount} revisions on page {article} "
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:735
+#: rcgcdw.py:721
#, python-brace-format
msgid "Imported {article} with {count} revision"
msgid_plural "Imported {article} with {count} revisions"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:741
+#: rcgcdw.py:727
#, python-brace-format
msgid "Restored {article}"
msgstr ""
-#: rcgcdw.py:744
+#: rcgcdw.py:730
msgid "Changed visibility of log events"
msgstr ""
-#: rcgcdw.py:747
+#: rcgcdw.py:733
msgid "Imported interwiki"
msgstr ""
-#: rcgcdw.py:750
+#: rcgcdw.py:736
#, python-brace-format
msgid "Edited abuse filter number {number}"
msgstr ""
-#: rcgcdw.py:753
+#: rcgcdw.py:739
#, python-brace-format
msgid "Created abuse filter number {number}"
msgstr ""
-#: rcgcdw.py:757
+#: rcgcdw.py:743
#, python-brace-format
msgid "Merged revision histories of {article} into {dest}"
msgstr ""
-#: rcgcdw.py:761
+#: rcgcdw.py:747
msgid "Added an entry to the interwiki table"
msgstr ""
-#: rcgcdw.py:762 rcgcdw.py:768
+#: rcgcdw.py:748 rcgcdw.py:754
#, python-brace-format
msgid "Prefix: {prefix}, website: {website} | {desc}"
msgstr ""
-#: rcgcdw.py:767
+#: rcgcdw.py:753
msgid "Edited an entry in interwiki table"
msgstr ""
-#: rcgcdw.py:773
+#: rcgcdw.py:759
msgid "Deleted an entry in interwiki table"
msgstr ""
-#: rcgcdw.py:774
+#: rcgcdw.py:760
#, python-brace-format
msgid "Prefix: {prefix} | {desc}"
msgstr ""
-#: rcgcdw.py:778
+#: rcgcdw.py:764
#, python-brace-format
msgid "Changed the content model of the page {article}"
msgstr ""
-#: rcgcdw.py:779
+#: rcgcdw.py:765
#, python-brace-format
msgid "Model changed from {old} to {new}: {reason}"
msgstr ""
-#: rcgcdw.py:785
+#: rcgcdw.py:771
#, python-brace-format
msgid "Edited the sprite for {article}"
msgstr ""
-#: rcgcdw.py:789
+#: rcgcdw.py:775
#, python-brace-format
msgid "Created the sprite sheet for {article}"
msgstr ""
-#: rcgcdw.py:793
+#: rcgcdw.py:779
#, python-brace-format
msgid "Edited the slice for {article}"
msgstr ""
-#: rcgcdw.py:796
+#: rcgcdw.py:782
#, python-brace-format
msgid "Created a tag \"{tag}\""
msgstr ""
-#: rcgcdw.py:800
+#: rcgcdw.py:786
#, python-brace-format
msgid "Deleted a tag \"{tag}\""
msgstr ""
-#: rcgcdw.py:804
+#: rcgcdw.py:790
#, python-brace-format
msgid "Activated a tag \"{tag}\""
msgstr ""
-#: rcgcdw.py:807
+#: rcgcdw.py:793
#, python-brace-format
msgid "Deactivated a tag \"{tag}\""
msgstr ""
-#: rcgcdw.py:810
+#: rcgcdw.py:796
msgid "Action has been hidden by administration."
msgstr ""
-#: rcgcdw.py:837
+#: rcgcdw.py:823
msgid "Tags"
msgstr ""
-#: rcgcdw.py:843
+#: rcgcdw.py:828
msgid "**Added**: "
msgstr ""
-#: rcgcdw.py:843
+#: rcgcdw.py:828
msgid " and {} more\n"
msgstr ""
-#: rcgcdw.py:844
+#: rcgcdw.py:829
msgid "**Removed**: "
msgstr ""
-#: rcgcdw.py:844
+#: rcgcdw.py:829
msgid " and {} more"
msgstr ""
-#: rcgcdw.py:845
+#: rcgcdw.py:830
msgid "Changed categories"
msgstr ""
-#: rcgcdw.py:886
+#: rcgcdw.py:849
msgid "~~hidden~~"
msgstr ""
-#: rcgcdw.py:892
+#: rcgcdw.py:855
msgid "hidden"
msgstr ""
-#: rcgcdw.py:995
+#: rcgcdw.py:922 rcgcdw.py:924 rcgcdw.py:926 rcgcdw.py:928 rcgcdw.py:930
+#: rcgcdw.py:932 rcgcdw.py:934
+#, python-brace-format
+msgid "{value} (avg. {avg})"
+msgstr ""
+
+#: rcgcdw.py:975
msgid "Daily overview"
msgstr ""
-#: rcgcdw.py:1005
+#: rcgcdw.py:984
msgid " ({} action)"
msgid_plural " ({} actions)"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1009
+#: rcgcdw.py:986
msgid " ({} edit)"
msgid_plural " ({} edits)"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1014
+#: rcgcdw.py:991
msgid " UTC ({} action)"
msgid_plural " UTC ({} actions)"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1016 rcgcdw.py:1017 rcgcdw.py:1021
+#: rcgcdw.py:993 rcgcdw.py:994 rcgcdw.py:998
msgid "But nobody came"
msgstr ""
-#: rcgcdw.py:1024
+#: rcgcdw.py:1002
msgid "Most active user"
msgid_plural "Most active users"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1025
+#: rcgcdw.py:1003
msgid "Most edited article"
msgid_plural "Most edited articles"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1026
+#: rcgcdw.py:1004
msgid "Edits made"
msgstr ""
-#: rcgcdw.py:1026
+#: rcgcdw.py:1004
msgid "New files"
msgstr ""
-#: rcgcdw.py:1026
+#: rcgcdw.py:1004
msgid "Admin actions"
msgstr ""
-#: rcgcdw.py:1027
+#: rcgcdw.py:1005
msgid "Bytes changed"
msgstr ""
-#: rcgcdw.py:1027
+#: rcgcdw.py:1005
msgid "New articles"
msgstr ""
-#: rcgcdw.py:1028
+#: rcgcdw.py:1006
msgid "Unique contributors"
msgstr ""
-#: rcgcdw.py:1029
+#: rcgcdw.py:1007
msgid "Most active hour"
msgid_plural "Most active hours"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1030
+#: rcgcdw.py:1008
msgid "Day score"
msgstr ""
-#: rcgcdw.py:1177
+#: rcgcdw.py:1149
#, python-brace-format
msgid "Connection to {wiki} seems to be stable now."
msgstr ""
-#: rcgcdw.py:1178 rcgcdw.py:1289
+#: rcgcdw.py:1150 rcgcdw.py:1261
msgid "Connection status"
msgstr ""
-#: rcgcdw.py:1288
+#: rcgcdw.py:1260
#, python-brace-format
msgid "{wiki} seems to be down or unreachable."
msgstr ""
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "director"
msgstr ""
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "bot"
msgstr ""
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "editor"
msgstr ""
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "directors"
msgstr ""
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "sysop"
msgstr ""
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "bureaucrat"
msgstr ""
-#: rcgcdw.py:1342
+#: rcgcdw.py:1316
msgid "reviewer"
msgstr ""
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "autoreview"
msgstr ""
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "autopatrol"
msgstr ""
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "wiki_guardian"
msgstr ""
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "second"
msgid_plural "seconds"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "minute"
msgid_plural "minutes"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "hour"
msgid_plural "hours"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "day"
msgid_plural "days"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "week"
msgid_plural "weeks"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "month"
msgid_plural "months"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "year"
msgid_plural "years"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "millennium"
msgid_plural "millennia"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "decade"
msgid_plural "decades"
msgstr[0] ""
msgstr[1] ""
-#: rcgcdw.py:1343
+#: rcgcdw.py:1317
msgid "century"
msgid_plural "centuries"
msgstr[0] ""
diff --git a/rcgcdw.py b/rcgcdw.py
index 6417f01..f32fef1 100644
--- a/rcgcdw.py
+++ b/rcgcdw.py
@@ -20,11 +20,13 @@
# WARNING! SHITTY CODE AHEAD. ENTER ONLY IF YOU ARE SURE YOU CAN TAKE IT
# You have been warned
-import time, logging, json, requests, datetime, re, gettext, math, random, os.path, schedule, sys, ipaddress
+import time, logging.config, json, requests, datetime, re, gettext, math, random, os.path, schedule, sys, ipaddress
+import misc
from bs4 import BeautifulSoup
from collections import defaultdict, Counter
from urllib.parse import quote_plus
-from html.parser import HTMLParser
+from configloader import settings
+from misc import link_formatter, LinkParser, ContentParser, safe_read, handle_discord_http, add_to_dict
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.")
@@ -32,69 +34,43 @@ if __name__ != "__main__": # return if called as a module
TESTING = True if "--test" in sys.argv else False # debug mode, pipeline testing
-try: # load settings
- with open("settings.json") as sfile:
- settings = json.load(sfile)
- if settings["limitrefetch"] < settings["limit"] and settings["limitrefetch"] != -1:
- settings["limitrefetch"] = settings["limit"]
- if "user-agent" in settings["header"]:
- settings["header"]["user-agent"] = settings["header"]["user-agent"].format(version="1.6.0.1") # set the version in the useragent
-except FileNotFoundError:
- logging.critical("No config file could be found. Please make sure settings.json is in the directory.")
- sys.exit(1)
+# Prepare logging
+
+logging.config.dictConfig(settings["logging"])
+logger = logging.getLogger("rcgcdw")
+logger.debug("Current settings: {settings}".format(settings=settings))
+
+# Setup translation
-logged_in = False
-logging.basicConfig(level=settings["verbose_level"])
-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))
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.")
+ 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
+storage = misc.load_datafile()
+
+# Remove previous data holding file if exists and limitfetch allows
+
+if settings["limitrefetch"] != -1 and os.path.exists("lastchange.txt") is True:
+ with open("lastchange.txt", 'r') as sfile:
+ logger.info("Converting old lastchange.txt file into new data storage data.json...")
+ storage["rcid"] = int(sfile.read().strip())
+ misc.save_datafile(storage)
+ os.remove("lastchange.txt")
+
+# A few initial vars
+
+logged_in = False
supported_logs = ["protect/protect", "protect/modify", "protect/unprotect", "upload/overwrite", "upload/upload", "delete/delete", "delete/delete_redir", "delete/restore", "delete/revision", "delete/event", "import/upload", "import/interwiki", "merge/merge", "move/move", "move/move_redir", "protect/move_prot", "block/block", "block/unblock", "block/reblock", "rights/rights", "rights/autopromote", "abusefilter/modify", "abusefilter/create", "interwiki/iw_add", "interwiki/iw_edit", "interwiki/iw_delete", "curseprofile/comment-created", "curseprofile/comment-edited", "curseprofile/comment-deleted", "curseprofile/profile-edited", "curseprofile/comment-replied", "contentmodel/change", "sprite/sprite", "sprite/sheet", "sprite/slice", "managetags/create", "managetags/delete", "managetags/activate", "managetags/deactivate", "tag/update"]
+LinkParser = LinkParser()
class MWError(Exception):
pass
-
-class LinkParser(HTMLParser):
- new_string = ""
- recent_href = ""
-
- def handle_starttag(self, tag, attrs):
- for attr in attrs:
- if attr[0] == 'href':
- self.recent_href = attr[1]
- if self.recent_href.startswith("//"):
- self.recent_href = "https:{rest}".format(rest=self.recent_href)
- elif not self.recent_href.startswith("http"):
- self.recent_href = "https://{wiki}.gamepedia.com".format(wiki=settings["wiki"]) + self.recent_href
- self.recent_href = self.recent_href.replace(")", "\\)")
-
- def handle_data(self, data):
- if self.recent_href:
- self.new_string = self.new_string + "[{}](<{}>)".format(data, self.recent_href)
- self.recent_href = ""
- else:
- self.new_string = self.new_string + data
-
- def handle_comment(self, data):
- self.new_string = self.new_string + data
-
- def handle_endtag(self, tag):
- logging.debug(self.new_string)
-
-
-LinkParser = LinkParser()
-
-
def send(message, name, avatar):
dictionary_creator = {"content": message}
if name:
@@ -104,23 +80,6 @@ def send(message, name, avatar):
send_to_discord(dictionary_creator)
-def safe_read(request, *keys):
- if request is None:
- return None
- try:
- request = request.json()
- for item in keys:
- request = request[item]
- except KeyError:
- logging.warning(
- "Failure while extracting data from request on key {key} in {change}".format(key=item, change=request))
- return None
- except ValueError:
- logging.warning("Failure while extracting data from request in {change}".format(change=request))
- return None
- return request
-
-
def send_to_discord_webhook(data):
header = settings["header"]
if "content" not in data:
@@ -131,10 +90,10 @@ def send_to_discord_webhook(data):
result = requests.post(settings["webhookURL"], data=data,
headers=header, timeout=10)
except requests.exceptions.Timeout:
- logging.warning("Timeouted while sending data to the webhook.")
+ logger.warning("Timeouted while sending data to the webhook.")
return 3
except requests.exceptions.ConnectionError:
- logging.warning("Connection error while sending the data to a webhook")
+ logger.warning("Connection error while sending the data to a webhook")
return 3
else:
return handle_discord_http(result.status_code, data, result)
@@ -151,12 +110,9 @@ def send_to_discord(data):
time.sleep(5.0)
recent_changes.unsent_messages.append(data)
elif code < 2:
- time.sleep(2.5)
+ time.sleep(2.0)
pass
-def link_formatter(link):
- return "<"+re.sub(r"([ \)])", "\\\\\\1", link)+">"
-
def compact_formatter(action, change, parsed_comment, categories):
if action != "suppressed":
author_url = link_formatter("https://{wiki}.gamepedia.com/User:{user}".format(wiki=settings["wiki"], user=change["user"]))
@@ -179,7 +135,7 @@ def compact_formatter(action, change, parsed_comment, categories):
content = _("[{author}]({author_url}) created [{article}]({edit_link}){comment} ({sign}{edit_size})").format(author=author, author_url=author_url, article=change["title"], edit_link=edit_link, comment=parsed_comment, edit_size=edit_size, sign=sign)
elif action =="upload/upload":
file_link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=change["title"]))
content = _("[{author}]({author_url}) uploaded [{file}]({file_link}){comment}").format(author=author,
author_url=author_url,
file=change["title"],
@@ -187,34 +143,34 @@ def compact_formatter(action, change, parsed_comment, categories):
comment=parsed_comment)
elif action == "upload/overwrite":
file_link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=change["title"]))
content = _("[{author}]({author_url}) uploaded a new version of [{file}]({file_link}){comment}").format(author=author, author_url=author_url, file=change["title"], file_link=file_link, comment=parsed_comment)
elif action == "delete/delete":
page_link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=change["title"]))
content = _("[{author}]({author_url}) deleted [{page}]({page_link}){comment}").format(author=author, author_url=author_url, page=change["title"], page_link=page_link,
comment=parsed_comment)
elif action == "delete/delete_redir":
page_link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=change["title"]))
content = _("[{author}]({author_url}) deleted redirect by overwriting [{page}]({page_link}){comment}").format(author=author, author_url=author_url, page=change["title"], page_link=page_link,
comment=parsed_comment)
elif action == "move/move":
link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["logparams"]['target_title']))
+ article=change["logparams"]['target_title']))
redirect_status = _("without making a redirect") if "suppressredirect" in change["logparams"] else _("with a redirect")
content = _("[{author}]({author_url}) moved {redirect}*{article}* to [{target}]({target_url}) {made_a_redirect}{comment}").format(author=author, author_url=author_url, redirect="⤷ " if "redirect" in change else "", article=change["title"],
target=change["logparams"]['target_title'], target_url=link, comment=parsed_comment, made_a_redirect=redirect_status)
elif action == "move/move_redir":
link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["logparams"]["target_title"]))
+ article=change["logparams"]["target_title"]))
redirect_status = _("without making a redirect") if "suppressredirect" in change["logparams"] else _(
"with a redirect")
content = _("[{author}]({author_url}) moved {redirect}*{article}* over redirect to [{target}]({target_url}) {made_a_redirect}{comment}").format(author=author, author_url=author_url, redirect="⤷ " if "redirect" in change else "", article=change["title"],
target=change["logparams"]['target_title'], target_url=link, comment=parsed_comment, made_a_redirect=redirect_status)
elif action == "protect/move_prot":
link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["logparams"]["oldtitle_title"]))
+ article=change["logparams"]["oldtitle_title"]))
content = _(
"[{author}]({author_url}) moved protection settings from {redirect}*{article}* to [{target}]({target_url}){comment}").format(author=author, author_url=author_url, redirect="⤷ " if "redirect" in change else "", article=change["logparams"]["oldtitle_title"],
target=change["title"], target_url=link, comment=parsed_comment)
@@ -223,10 +179,10 @@ def compact_formatter(action, change, parsed_comment, categories):
try:
ipaddress.ip_address(user)
link = link_formatter("https://{wiki}.gamepedia.com/Special:Contributions/{user}".format(wiki=settings["wiki"],
- user=user))
+ user=user))
except ValueError:
link = link_formatter("https://{wiki}.gamepedia.com/{user}".format(wiki=settings["wiki"],
- user=change["title"]))
+ user=change["title"]))
if change["logparams"]["duration"] == "infinite":
block_time = _("infinity and beyond")
else:
@@ -240,27 +196,27 @@ def compact_formatter(action, change, parsed_comment, categories):
english_length + "s",
int(english_length_num)))
except AttributeError:
- logging.error("Could not strip s from the block event, seems like the regex didn't work?")
+ logger.error("Could not strip s from the block event, seems like the regex didn't work?")
return
content = _(
"[{author}]({author_url}) blocked [{user}]({user_url}) for {time}{comment}").format(author=author, author_url=author_url, user=user, time=block_time, user_url=link, comment=parsed_comment)
elif action == "block/reblock":
link = link_formatter("https://{wiki}.gamepedia.com/{user}".format(wiki=settings["wiki"],
- user=change["title"]))
+ user=change["title"]))
user = change["title"].split(':')[1]
content = _("[{author}]({author_url}) changed block settings for [{blocked_user}]({user_url}){comment}").format(author=author, author_url=author_url, blocked_user=user, user_url=link, comment=parsed_comment)
elif action == "block/unblock":
link = link_formatter("https://{wiki}.gamepedia.com/{user}".format(wiki=settings["wiki"],
- user=change["title"]))
+ user=change["title"]))
user = change["title"].split(':')[1]
content = _("[{author}]({author_url}) unblocked [{blocked_user}]({user_url}){comment}").format(author=author, author_url=author_url, blocked_user=user, user_url=link, comment=parsed_comment)
elif action == "curseprofile/comment-created":
link = link_formatter("https://{wiki}.gamepedia.com/Special:CommentPermalink/{commentid}".format(wiki=settings["wiki"],
- commentid=change["logparams"]["4:comment_id"]))
+ commentid=change["logparams"]["4:comment_id"]))
content = _("[{author}]({author_url}) left a [comment]({comment}) on {target} profile").format(author=author, author_url=author_url, comment=link, target=change["title"].split(':')[1]+"'s" if change["title"].split(':')[1] != change["user"] else _("their own profile"))
elif action == "curseprofile/comment-replied":
link = link_formatter("https://{wiki}.gamepedia.com/Special:CommentPermalink/{commentid}".format(wiki=settings["wiki"],
- commentid=change["logparams"][
+ commentid=change["logparams"][
"4:comment_id"]))
content = _("[{author}]({author_url}) replied to a [comment]({comment}) on {target} profile").format(author=author,
author_url=author_url,
@@ -268,23 +224,20 @@ def compact_formatter(action, change, parsed_comment, categories):
target=change["title"].split(':')[1] if change["title"].split(':')[1] !=change["user"] else _("their own"))
elif action == "curseprofile/comment-edited":
link = link_formatter("https://{wiki}.gamepedia.com/Special:CommentPermalink/{commentid}".format(wiki=settings["wiki"],
- commentid=change["logparams"][
+ commentid=change["logparams"][
"4:comment_id"]))
content = _("[{author}]({author_url}) edited a [comment]({comment}) on {target} profile").format(author=author,
author_url=author_url,
comment=link,
target=change["title"].split(':')[1] if change["title"].split(':')[1] !=change["user"] else _("their own"))
elif action == "curseprofile/comment-deleted":
- link = link_formatter("https://{wiki}.gamepedia.com/Special:CommentPermalink/{commentid}".format(wiki=settings["wiki"],
- commentid=change["logparams"]["4:comment_id"]))
- # link = "https://{wiki}.gamepedia.com/UserProfile:{target}".format(wiki=settings["wiki"], target=params["target"].replace(" ", "_").replace(')', '\)'))
content = _("[{author}]({author_url}) deleted a comment on {target} profile").format(author=author,
author_url=author_url,
target=change["title"].split(':')[1] if change["title"].split(':')[1] !=change["user"] else _("their own"))
elif action == "curseprofile/profile-edited":
link = link_formatter("https://{wiki}.gamepedia.com/UserProfile:{target}".format(wiki=settings["wiki"],
- target=change["title"].split(':')[1]))
+ target=change["title"].split(':')[1]))
if change["logparams"]['4:section'] == "profile-location":
field = _("Location")
elif change["logparams"]['4:section'] == "profile-aboutme":
@@ -309,6 +262,8 @@ def compact_formatter(action, change, parsed_comment, categories):
field = _("Steam link")
elif change["logparams"]['4:section'] == "profile-link-discord":
field = _("Discord handle")
+ elif change["logparams"]['4:section'] == "profile-link-battlenet":
+ field = _("Battle.net handle")
else:
field = _("unknown")
target = _("[{target}]({target_url})'s").format(target=change["title"].split(':')[1], target_url=link) if change["title"].split(':')[1] != author else _("[their own]({target_url})").format(target_url=link)
@@ -339,14 +294,14 @@ def compact_formatter(action, change, parsed_comment, categories):
comment=parsed_comment)
elif action == "protect/protect":
link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=change["title"]))
content = _("[{author}]({author_url}) protected [{article}]({article_url}) with the following settings: {settings}{comment}").format(author=author, author_url=author_url,
article=change["title"], article_url=link,
settings=change["logparams"]["description"]+_(" [cascading]") if "cascade" in change["logparams"] else "",
comment=parsed_comment)
elif action == "protect/modify":
link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=change["title"]))
content = _(
"[{author}]({author_url}) modified protection settings of [{article}]({article_url}) to: {settings}{comment}").format(
author=author, author_url=author_url,
@@ -355,24 +310,24 @@ def compact_formatter(action, change, parsed_comment, categories):
comment=parsed_comment)
elif action == "protect/unprotect":
link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=change["title"]))
content = _("[{author}]({author_url}) removed protection from [{article}]({article_url}){comment}").format(author=author, author_url=author_url, article=change["title"], article_url=link, comment=parsed_comment)
elif action == "delete/revision":
amount = len(change["logparams"]["ids"])
link = link_formatter("".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=change["title"]))
content = ngettext("[{author}]({author_url}) changed visibility of revision on page [{article}]({article_url}){comment}",
"[{author}]({author_url}) changed visibility of {amount} revisions on page [{article}]({article_url}){comment}", amount).format(author=author, author_url=author_url,
article=change["title"], article_url=link, amount=amount, comment=parsed_comment)
elif action == "import/upload":
link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=change["title"]))
content = ngettext("[{author}]({author_url}) imported [{article}]({article_url}) with {count} revision{comment}",
"[{author}]({author_url}) imported [{article}]({article_url}) with {count} revisions{comment}", change["logparams"]["count"]).format(
author=author, author_url=author_url, article=change["title"], article_url=link, count=change["logparams"]["count"], comment=parsed_comment)
elif action == "delete/restore":
link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=change["title"]))
content = _("[{author}]({author_url}) restored [{article}]({article_url}){comment}").format(author=author, author_url=author_url, article=change["title"], article_url=link, comment=parsed_comment)
elif action == "delete/event":
content = _("[{author}]({author_url}) changed visibility of log events{comment}").format(author=author, author_url=author_url, comment=parsed_comment)
@@ -386,9 +341,9 @@ def compact_formatter(action, change, parsed_comment, categories):
content = _("[{author}]({author_url}) created abuse filter [number {number}]({filter_url})").format(author=author, author_url=author_url, number=change["logparams"]['newId'], filter_url=link)
elif action == "merge/merge":
link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=change["title"]))
link_dest = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["logparams"]["dest_title"]))
+ article=change["logparams"]["dest_title"]))
content = _("[{author}]({author_url}) merged revision histories of [{article}]({article_url}) into [{dest}]({dest_url}){comment}").format(author=author, author_url=author_url, article=change["title"], article_url=link, dest_url=link_dest,
dest=change["logparams"]["dest_title"], comment=parsed_comment)
elif action == "interwiki/iw_add":
@@ -408,20 +363,20 @@ def compact_formatter(action, change, parsed_comment, categories):
content = _("[{author}]({author_url}) deleted an entry in [interwiki table]({table_url})").format(author=author, author_url=author_url, table_url=link)
elif action == "contentmodel/change":
link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=change["title"]))
content = _("[{author}]({author_url}) changed the content model of the page [{article}]({article_url}) from {old} to {new}{comment}").format(author=author, author_url=author_url, article=change["title"], article_url=link, old=change["logparams"]["oldmodel"],
new=change["logparams"]["newmodel"], comment=parsed_comment)
elif action == "sprite/sprite":
link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=change["title"]))
content = _("[{author}]({author_url}) edited the sprite for [{article}]({article_url})").format(author=author, author_url=author_url, article=change["title"], article_url=link)
elif action == "sprite/sheet":
link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=change["title"]))
content = _("[{author}]({author_url}) created the sprite sheet for [{article}]({article_url})").format(author=author, author_url=author_url, article=change["title"], article_url=link)
elif action == "sprite/slice":
link = link_formatter("https://{wiki}.gamepedia.com/{article}".format(wiki=settings["wiki"],
- article=change["title"]))
+ article=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 == "managetags/create":
link = "".format(wiki=settings["wiki"])
@@ -438,10 +393,10 @@ def compact_formatter(action, change, parsed_comment, categories):
link = "".format(wiki=settings["wiki"])
content = _("[{author}]({author_url}) deactivated a [tag]({tag_url}) \"{tag}\"").format(author=author, author_url=author_url, tag=change["logparams"]["tag"], tag_url=link)
elif action == "suppressed":
- link = "".format(wiki=settings["wiki"])
content = _("An action has been hidden by administration.")
send_to_discord({'content': content})
+
def embed_formatter(action, change, parsed_comment, categories):
data = {"embeds": []}
embed = defaultdict(dict)
@@ -452,22 +407,22 @@ def embed_formatter(action, change, parsed_comment, categories):
if "anon" in change:
author_url = "https://{wiki}.gamepedia.com/Special:Contributions/{user}".format(wiki=settings["wiki"],
user=change["user"].replace(" ", "_")) # Replace here needed in case of #75
- logging.debug("current user: {} with cache of IPs: {}".format(change["user"], recent_changes.map_ips.keys()))
+ logger.debug("current user: {} with cache of IPs: {}".format(change["user"], recent_changes.map_ips.keys()))
if change["user"] not in list(recent_changes.map_ips.keys()):
contibs = safe_read(recent_changes.safe_request(
"https://{wiki}.gamepedia.com/api.php?action=query&format=json&list=usercontribs&uclimit=max&ucuser={user}&ucstart={timestamp}&ucprop=".format(
wiki=settings["wiki"], user=change["user"], timestamp=change["timestamp"])), "query", "usercontribs")
if contibs is None:
- logging.warning(
+ logger.warning(
"WARNING: Something went wrong when checking amount of contributions for given IP address")
change["user"] = change["user"] + "(?)"
else:
recent_changes.map_ips[change["user"]] = len(contibs)
- logging.debug("1Current params user {} and state of map_ips {}".format(change["user"], recent_changes.map_ips))
+ logger.debug("Current params user {} and state of map_ips {}".format(change["user"], recent_changes.map_ips))
change["user"] = "{author} ({contribs})".format(author=change["user"], contribs=len(contibs))
else:
- logging.debug(
- "2Current params user {} and state of map_ips {}".format(change["user"], recent_changes.map_ips))
+ logger.debug(
+ "Current params user {} and state of map_ips {}".format(change["user"], recent_changes.map_ips))
if action in ("edit", "new"):
recent_changes.map_ips[change["user"]] += 1
change["user"] = "{author} ({amount})".format(author=change["user"],
@@ -499,6 +454,41 @@ 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"]:
+ if action == "new":
+ 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", "*")
+ else:
+ changed_content = safe_read(recent_changes.safe_request(
+ "https://{wiki}.gamepedia.com/api.php?action=compare&format=json&fromrev={oldrev}&torev={diff}&topst=1&prop=diff".format(
+ wiki=settings["wiki"], diff=change["revid"],oldrev=change["old_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("Unable 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(
@@ -508,7 +498,7 @@ def embed_formatter(action, change, parsed_comment, categories):
article=change["title"].replace(" ", "_"))
additional_info_retrieved = False
if urls is not None:
- logging.debug(urls)
+ logger.debug(urls)
if "-1" not in urls: # image still exists and not removed
img_info = next(iter(urls.values()))["imageinfo"]
embed["image"]["url"] = img_info[0]["url"]
@@ -532,7 +522,7 @@ def embed_formatter(action, change, parsed_comment, categories):
"https://{wiki}.gamepedia.com/api.php?action=query&format=json&prop=revisions&titles={article}&rvprop=content".format(
wiki=settings["wiki"], article=quote_plus(change["title"], safe=''))), "query", "pages")
if article_content is None:
- logging.warning("Something went wrong when getting license for the image")
+ logger.warning("Something went wrong when getting license for the image")
return 0
if "-1" not in article_content:
content = list(article_content.values())[0]['revisions'][0]['*']
@@ -546,11 +536,11 @@ def embed_formatter(action, change, parsed_comment, categories):
else:
license = "?"
except IndexError:
- logging.error(
+ logger.error(
"Given regex for the license detection is incorrect. It does not have a capturing group called \"license\" specified. Please fix license_regex value in the config!")
license = "?"
except re.error:
- logging.error(
+ logger.error(
"Given regex for the license detection is incorrect. Please fix license_regex or license_regex_detect values in the config!")
license = "?"
if license is not None:
@@ -603,7 +593,7 @@ def embed_formatter(action, change, parsed_comment, categories):
english_length = english_length.rstrip("s").strip()
block_time = "{num} {translated_length}".format(num=english_length_num, translated_length=ngettext(english_length, english_length + "s", int(english_length_num)))
except AttributeError:
- logging.error("Could not strip s from the block event, seems like the regex didn't work?")
+ logger.error("Could not strip s from the block event, seems like the regex didn't work?")
return
embed["title"] = _("Blocked {blocked_user} for {time}").format(blocked_user=user, time=block_time)
elif action == "block/reblock":
@@ -621,19 +611,16 @@ def embed_formatter(action, change, parsed_comment, categories):
elif action == "curseprofile/comment-created":
link = "https://{wiki}.gamepedia.com/Special:CommentPermalink/{commentid}".format(wiki=settings["wiki"],
commentid=change["logparams"]["4:comment_id"])
- # link = "https://{wiki}.gamepedia.com/UserProfile:{target}".format(wiki=settings["wiki"], target=params["target"].replace(" ", "_").replace(')', '\)')) old way of linking
embed["title"] = _("Left a comment on {target}'s profile").format(target=change["title"].split(':')[1]) if change["title"].split(':')[1] != \
change["user"] else _(
"Left a comment on their own profile")
elif action == "curseprofile/comment-replied":
- # link = "https://{wiki}.gamepedia.com/UserProfile:{target}".format(wiki=settings["wiki"], target=params["target"].replace(" ", "_").replace(')', '\)'))
link = "https://{wiki}.gamepedia.com/Special:CommentPermalink/{commentid}".format(wiki=settings["wiki"],
commentid=change["logparams"]["4:comment_id"])
embed["title"] = _("Replied to a comment on {target}'s profile").format(target=change["title"].split(':')[1]) if change["title"].split(':')[1] != \
change["user"] else _(
"Replied to a comment on their own profile")
elif action == "curseprofile/comment-edited":
- # link = "https://{wiki}.gamepedia.com/UserProfile:{target}".format(wiki=settings["wiki"], target=params["target"].replace(" ", "_").replace(')', '\)'))
link = "https://{wiki}.gamepedia.com/Special:CommentPermalink/{commentid}".format(wiki=settings["wiki"],
commentid=change["logparams"]["4:comment_id"])
embed["title"] = _("Edited a comment on {target}'s profile").format(target=change["title"].split(':')[1]) if change["title"].split(':')[1] != \
@@ -668,6 +655,8 @@ def embed_formatter(action, change, parsed_comment, categories):
field = _("Steam link")
elif change["logparams"]['4:section'] == "profile-link-discord":
field = _("Discord handle")
+ elif change["logparams"]['4:section'] == "profile-link-battlenet":
+ field = _("Battle.net handle")
else:
field = _("Unknown")
embed["title"] = _("Edited {target}'s profile").format(target=change["title"].split(':')[1]) if change["user"] != change["title"].split(':')[1] else _("Edited their own profile")
@@ -676,9 +665,11 @@ def embed_formatter(action, change, parsed_comment, categories):
else:
parsed_comment = _("{field} field changed to: {desc}").format(field=field, desc=BeautifulSoup(change["parsedcomment"], "lxml").get_text())
elif action == "curseprofile/comment-deleted":
- link = "https://{wiki}.gamepedia.com/Special:CommentPermalink/{commentid}".format(wiki=settings["wiki"],
+ if "4:comment_id" in change["logparams"]:
+ link = "https://{wiki}.gamepedia.com/Special:CommentPermalink/{commentid}".format(wiki=settings["wiki"],
commentid=change["logparams"]["4:comment_id"])
- # link = "https://{wiki}.gamepedia.com/UserProfile:{target}".format(wiki=settings["wiki"], target=params["target"].replace(" ", "_").replace(')', '\)'))
+ else:
+ link = "https://{wiki}.gamepedia.com/{profile}".format(wiki=settings["wiki"], profile=change["title"])
embed["title"] = _("Deleted a comment on {target}'s profile").format(target=change["title"].split(':')[1])
elif action in ("rights/rights", "rights/autopromote"):
link = "https://{wiki}.gamepedia.com/User:".format(wiki=settings["wiki"]) + change["title"].split(":")[1].replace(" ", "_")
@@ -810,7 +801,7 @@ def embed_formatter(action, change, parsed_comment, categories):
embed["title"] = _("Action has been hidden by administration.")
embed["author"]["name"] = _("Unknown")
else:
- logging.warning("No entry for {event} with params: {params}".format(event=action, params=change))
+ logger.warning("No entry for {event} with params: {params}".format(event=action, params=change))
embed["author"]["icon_url"] = settings["appearance"]["embed"][action]["icon"]
embed["url"] = link
embed["description"] = parsed_comment
@@ -835,11 +826,10 @@ def embed_formatter(action, change, parsed_comment, categories):
else:
tag_displayname.append(tag)
embed["fields"].append({"name": _("Tags"), "value": ", ".join(tag_displayname)})
- logging.debug("Current params in edit action: {}".format(change))
+ logger.debug("Current params in edit action: {}".format(change))
if categories is not None and not (len(categories["new"]) == 0 and len(categories["removed"]) == 0):
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(list(categories["new"])[0:16]) + ("\n" if len(categories["new"])<=15 else _(" and {} more\n").format(len(categories["new"])-15))) if categories["new"] else ""
del_cat = (_("**Removed**: ") + ", ".join(list(categories["removed"])[0:16]) + ("" if len(categories["removed"])<=15 else _(" and {} more").format(len(categories["removed"])-15))) if categories["removed"] else ""
embed["fields"].append({"name": _("Changed categories"), "value": new_cat + del_cat})
@@ -849,31 +839,9 @@ def embed_formatter(action, change, parsed_comment, categories):
send_to_discord(formatted_embed)
-def handle_discord_http(code, formatted_embed, result):
- if 300 > code > 199: # message went through
- return 0
- elif code == 400: # HTTP BAD REQUEST result.status_code, data, result, header
- logging.error(
- "Following message has been rejected by Discord, please submit a bug on our bugtracker adding it:")
- logging.error(formatted_embed)
- logging.error(result.text)
- return 1
- elif code == 401 or code == 404: # HTTP UNAUTHORIZED AND NOT FOUND
- logging.error("Webhook URL is invalid or no longer in use, please replace it with proper one.")
- sys.exit(1)
- elif code == 429:
- logging.error("We are sending too many requests to the Discord, slowing down...")
- return 2
- elif 499 < code < 600:
- logging.error(
- "Discord have trouble processing the event, and because the HTTP code returned is {} it means we blame them.".format(
- code))
- return 3
-
-
def essential_info(change, changed_categories):
"""Prepares essential information for both embed and compact message format."""
- logging.debug(change)
+ logger.debug(change)
if ("actionhidden" in change or "suppressed" in change) and "suppressed" not in settings["ignored"]: # if event is hidden using suppression
appearance_mode("suppressed", change, "", changed_categories)
return
@@ -887,30 +855,30 @@ def essential_info(change, changed_categories):
if not parsed_comment:
parsed_comment = None
if change["type"] in ["edit", "new"]:
- logging.debug("List of categories in essential_info: {}".format(changed_categories))
+ logger.debug("List of categories in essential_info: {}".format(changed_categories))
if "userhidden" in change:
change["user"] = _("hidden")
identification_string = change["type"]
elif change["type"] == "log":
identification_string = "{logtype}/{logaction}".format(logtype=change["logtype"], logaction=change["logaction"])
if identification_string not in supported_logs:
- logging.warning(
+ logger.warning(
"This event is not implemented in the script. Please make an issue on the tracker attaching the following info: wiki url, time, and this information: {}".format(
change))
return
elif change["type"] == "categorize":
return
else:
- logging.warning("This event is not implemented in the script. Please make an issue on the tracker attaching the following info: wiki url, time, and this information: {}".format(change))
+ logger.warning("This event is not implemented in the script. Please make an issue on the tracker attaching the following info: wiki url, time, and this information: {}".format(change))
return
if identification_string in settings["ignored"]:
return
appearance_mode(identification_string, change, parsed_comment, changed_categories)
def day_overview_request():
- logging.info("Fetching daily overview... This may take up to 30 seconds!")
+ logger.info("Fetching daily overview... This may take up to 30 seconds!")
timestamp = (datetime.datetime.utcnow() - datetime.timedelta(hours=24)).isoformat(timespec='milliseconds')
- logging.debug("timestamp is {}".format(timestamp))
+ logger.debug("timestamp is {}".format(timestamp))
complete = False
result = []
passes = 0
@@ -925,18 +893,18 @@ def day_overview_request():
rc = request['query']['recentchanges']
continuearg = request["continue"]["rccontinue"] if "continue" in request else None
except ValueError:
- logging.warning("ValueError in fetching changes")
+ logger.warning("ValueError in fetching changes")
recent_changes.downtime_controller()
complete = 2
except KeyError:
- logging.warning("Wiki returned %s" % (request.json()))
+ logger.warning("Wiki returned %s" % (request.json()))
complete = 2
else:
result += rc
if continuearg:
continuearg = "&rccontinue={}".format(continuearg)
passes += 1
- logging.debug(
+ logger.debug(
"continuing requesting next pages of recent changes with {} passes and continuearg being {}".format(
passes, continuearg))
time.sleep(3.0)
@@ -945,20 +913,37 @@ def day_overview_request():
else:
complete = 2
if passes == 10:
- logging.debug("quit the loop because there been too many passes")
- return (result, complete)
+ logger.debug("quit the loop because there been too many passes")
+ return result, complete
-def add_to_dict(dictionary, key):
- if key in dictionary:
- dictionary[key] += 1
+def daily_overview_sync(edits, files, admin, changed_bytes, new_articles, unique_contributors, day_score):
+ weight = storage["daily_overview"]["days_tracked"]
+ if weight == 0:
+ storage["daily_overview"].update({"edits": edits, "new_files": files, "admin_actions": admin, "bytes_changed": changed_bytes, "new_articles": new_articles, "unique_editors": unique_contributors, "day_score": day_score})
+ edits, files, admin, changed_bytes, new_articles, unique_contributors, day_score = str(edits), str(files), str(admin), str(changed_bytes), str(new_articles), str(unique_contributors), str(day_score)
else:
- dictionary[key] = 1
- return dictionary
+ edits_avg = misc.weighted_average(storage["daily_overview"]["edits"], weight, edits)
+ edits = _("{value} (avg. {avg})").format(value=edits, avg=edits_avg)
+ files_avg = misc.weighted_average(storage["daily_overview"]["new_files"], weight, files)
+ files = _("{value} (avg. {avg})").format(value=files, avg=files_avg)
+ admin_avg = misc.weighted_average(storage["daily_overview"]["admin_actions"], weight, admin)
+ admin = _("{value} (avg. {avg})").format(value=admin, avg=admin_avg)
+ changed_bytes_avg = misc.weighted_average(storage["daily_overview"]["bytes_changed"], weight, changed_bytes)
+ changed_bytes = _("{value} (avg. {avg})").format(value=changed_bytes, avg=changed_bytes_avg)
+ new_articles_avg = misc.weighted_average(storage["daily_overview"]["new_articles"], weight, new_articles)
+ new_articles = _("{value} (avg. {avg})").format(value=new_articles, avg=new_articles_avg)
+ unique_contributors_avg = misc.weighted_average(storage["daily_overview"]["unique_editors"], weight, unique_contributors)
+ unique_contributors = _("{value} (avg. {avg})").format(value=unique_contributors, avg=unique_contributors_avg)
+ day_score_avg = misc.weighted_average(storage["daily_overview"]["day_score"], weight, day_score)
+ day_score = _("{value} (avg. {avg})").format(value=day_score, avg=day_score_avg)
+ storage["daily_overview"].update({"edits": edits_avg, "new_files": files_avg, "admin_actions": admin_avg, "bytes_changed": changed_bytes_avg,
+ "new_articles": new_articles_avg, "unique_editors": unique_contributors_avg, "day_score": day_score_avg})
+ storage["daily_overview"]["days_tracked"] += 1
+ misc.save_datafile(storage)
+ return edits, files, admin, changed_bytes, new_articles, unique_contributors, day_score
-
-def day_overview(): # time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime(time.time()))
- # (datetime.datetime.utcnow()+datetime.timedelta(hours=0)).isoformat(timespec='milliseconds')+'Z'
+def day_overview():
result = day_overview_request()
if result[1] == 1:
activity = defaultdict(dict)
@@ -999,12 +984,9 @@ 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()
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()
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()
@@ -1020,52 +1002,47 @@ def day_overview(): # time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime(time.
if not active_articles:
active_articles = [_("But nobody came")]
embed["fields"] = []
+ edits, files, admin, changed_bytes, new_articles, unique_contributors, overall = daily_overview_sync(edits, files, admin, changed_bytes, new_articles, len(activity), overall)
fields = (
(ngettext("Most active user", "Most active users", len(active_users)), ', '.join(active_users)),
(ngettext("Most edited article", "Most edited articles", len(active_articles)), ', '.join(active_articles)),
(_("Edits made"), edits), (_("New files"), files), (_("Admin actions"), admin),
(_("Bytes changed"), changed_bytes), (_("New articles"), new_articles),
- (_("Unique contributors"), str(len(activity))),
+ (_("Unique contributors"), unique_contributors),
(ngettext("Most active hour", "Most active hours", len(active_hours)), ', '.join(active_hours) + houramount),
- (_("Day score"), str(overall)))
+ (_("Day score"), overall))
for name, value in fields:
embed["fields"].append({"name": name, "value": value})
data = {"embeds": [dict(embed)]}
formatted_embed = json.dumps(data, indent=4)
send_to_discord(formatted_embed)
else:
- logging.debug("function requesting changes for day overview returned with error code")
+ logger.debug("function requesting changes for day overview returned with error code")
class Recent_Changes_Class(object):
- ids = []
- map_ips = {}
- recent_id = 0
- downtimecredibility = 0
- last_downtime = 0
- tags = {}
- groups = {}
- streak = -1
- unsent_messages = []
- mw_messages = {}
- session = requests.Session()
- session.headers.update(settings["header"])
- if settings["limitrefetch"] != -1:
- with open("lastchange.txt", "r") as record:
- file_content = record.read().strip()
- if file_content:
- file_id = int(file_content)
- logging.debug("File_id is {val}".format(val=file_id))
- else:
- logging.debug("File is empty")
- file_id = 999999999
- else:
- file_id = 999999999 # such value won't cause trouble, and it will make sure no refetch happen
+ def __init__(self):
+ self.ids = []
+ self.map_ips = {}
+ self.recent_id = 0
+ self.downtimecredibility = 0
+ self.last_downtime = 0
+ self.tags = {}
+ self.groups = {}
+ self.streak = -1
+ self.unsent_messages = []
+ self.mw_messages = {}
+ self.session = requests.Session()
+ self.session.headers.update(settings["header"])
+ if settings["limitrefetch"] != -1:
+ self.file_id = storage["rcid"]
+ else:
+ self.file_id = 999999999 # such value won't cause trouble, and it will make sure no refetch happen
@staticmethod
def handle_mw_errors(request):
if "errors" in request:
- logging.error(request["errors"])
+ logger.error(request["errors"])
raise MWError
return request
@@ -1073,16 +1050,16 @@ class Recent_Changes_Class(object):
global logged_in
# session.cookies.clear()
if '@' not in settings["wiki_bot_login"]:
- logging.error(
+ logger.error(
"Please provide proper nickname for login from https://{wiki}.gamepedia.com/Special:BotPasswords".format(
wiki=settings["wiki"]))
return
if len(settings["wiki_bot_password"]) != 32:
- logging.error(
+ logger.error(
"Password seems incorrect. It should be 32 characters long! Grab it from https://{wiki}.gamepedia.com/Special:BotPasswords".format(
wiki=settings["wiki"]))
return
- logging.info("Trying to log in to https://{wiki}.gamepedia.com...".format(wiki=settings["wiki"]))
+ logger.info("Trying to log in to https://{wiki}.gamepedia.com...".format(wiki=settings["wiki"]))
try:
response = self.handle_mw_errors(
self.session.post("https://{wiki}.gamepedia.com/api.php".format(wiki=settings["wiki"]),
@@ -1095,19 +1072,19 @@ class Recent_Changes_Class(object):
'lgpassword': settings["wiki_bot_password"],
'lgtoken': response.json()['query']['tokens']['logintoken']}))
except ValueError:
- logging.error("Logging in have not succeeded")
+ logger.error("Logging in have not succeeded")
return
except MWError:
- logging.error("Logging in have not succeeded")
+ logger.error("Logging in have not succeeded")
return
try:
if response.json()['login']['result'] == "Success":
- logging.info("Logging to the wiki succeeded")
+ logger.info("Successfully logged in")
logged_in = True
else:
- logging.error("Logging in have not succeeded")
+ logger.error("Logging in have not succeeded")
except:
- logging.error("Logging in have not succeeded")
+ logger.error("Logging in have not succeeded")
def add_cache(self, change):
self.ids.append(change["rcid"])
@@ -1117,37 +1094,37 @@ class Recent_Changes_Class(object):
def fetch(self, amount=settings["limit"]):
if self.unsent_messages:
- logging.info(
+ logger.info(
"{} messages waiting to be delivered to Discord due to Discord throwing errors/no connection to Discord servers.".format(
len(self.unsent_messages)))
for num, item in enumerate(self.unsent_messages):
- logging.debug(
+ logger.debug(
"Trying to send a message to Discord from the queue with id of {} and content {}".format(str(num),
str(item)))
if send_to_discord_webhook(item) < 2:
- logging.debug("Sending message succeeded")
+ logger.debug("Sending message succeeded")
time.sleep(2.5)
else:
- logging.debug("Sending message failed")
+ logger.debug("Sending message failed")
break
else:
self.unsent_messages = []
- logging.debug("Queue emptied, all messages delivered")
+ logger.debug("Queue emptied, all messages delivered")
self.unsent_messages = self.unsent_messages[num:]
- logging.debug(self.unsent_messages)
+ logger.debug(self.unsent_messages)
last_check = self.fetch_changes(amount=amount)
self.recent_id = last_check if last_check is not None else self.file_id
if settings["limitrefetch"] != -1 and self.recent_id != self.file_id:
self.file_id = self.recent_id
- with open("lastchange.txt", "w") as record:
- record.write(str(self.file_id))
- logging.debug("Most recent rcid is: {}".format(self.recent_id))
+ storage["rcid"] = self.recent_id
+ misc.save_datafile(storage)
+ logger.debug("Most recent rcid is: {}".format(self.recent_id))
return self.recent_id
def fetch_changes(self, amount, clean=False):
global logged_in
if len(self.ids) == 0:
- logging.debug("ids is empty, triggering clean fetch")
+ logger.debug("ids is empty, triggering clean fetch")
clean = True
changes = self.safe_request(
"https://{wiki}.gamepedia.com/api.php?action=query&format=json&list=recentchanges&rcshow=!bot&rcprop=title%7Credirect%7Ctimestamp%7Cids%7Cloginfo%7Cparsedcomment%7Csizes%7Cflags%7Ctags%7Cuser&rclimit={amount}&rctype=edit%7Cnew%7Clog%7Cexternal{categorize}".format(
@@ -1157,15 +1134,15 @@ class Recent_Changes_Class(object):
changes = changes.json()['query']['recentchanges']
changes.reverse()
except ValueError:
- logging.warning("ValueError in fetching changes")
+ logger.warning("ValueError in fetching changes")
if changes.url == "https://www.gamepedia.com":
- logging.critical(
+ logger.critical(
"The wiki specified in the settings most probably doesn't exist, got redirected to gamepedia.com")
sys.exit(1)
self.downtime_controller()
return None
except KeyError:
- logging.warning("Wiki returned %s" % (changes.json()))
+ logger.warning("Wiki returned %s" % (changes.json()))
return None
else:
if self.downtimecredibility > 0:
@@ -1183,15 +1160,15 @@ class Recent_Changes_Class(object):
for change in changes:
if not (change["rcid"] in self.ids or change["rcid"] < self.recent_id) and not clean:
new_events += 1
- logging.debug(
+ logger.debug(
"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
- logging.debug("There were too many new events, requesting max amount of events from the wiki.")
+ logger.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:
- logging.debug(
+ logger.debug(
"There were too many new events, but the limit was high enough we don't care anymore about fetching them all.")
if change["type"] == "categorize":
if "commenthidden" not in change:
@@ -1203,31 +1180,31 @@ class Recent_Changes_Class(object):
comment_to_match = re.sub(r'<.*?a>', '', change["parsedcomment"])
if recent_changes.mw_messages["recentchanges-page-added-to-category"] in comment_to_match or recent_changes.mw_messages["recentchanges-page-added-to-category-bundled"] in comment_to_match:
categorize_events[change["revid"]]["new"].add(cat_title)
- logging.debug("Matched {} to added category for {}".format(cat_title, change["revid"]))
+ logger.debug("Matched {} to added category for {}".format(cat_title, change["revid"]))
elif recent_changes.mw_messages["recentchanges-page-removed-from-category"] in comment_to_match or recent_changes.mw_messages["recentchanges-page-removed-from-category-bundled"] in comment_to_match:
categorize_events[change["revid"]]["removed"].add(cat_title)
- logging.debug("Matched {} to removed category for {}".format(cat_title, change["revid"]))
+ logger.debug("Matched {} to removed category for {}".format(cat_title, change["revid"]))
else:
- logging.debug("Unknown match for category change with messages {}, {}, {}, {} and comment_to_match {}".format(recent_changes.mw_messages["recentchanges-page-added-to-category"], recent_changes.mw_messages["recentchanges-page-removed-from-category"], recent_changes.mw_messages["recentchanges-page-removed-from-category-bundled"], recent_changes.mw_messages["recentchanges-page-added-to-category-bundled"], comment_to_match))
+ logger.debug("Unknown match for category change with messages {}, {}, {}, {} and comment_to_match {}".format(recent_changes.mw_messages["recentchanges-page-added-to-category"], recent_changes.mw_messages["recentchanges-page-removed-from-category"], recent_changes.mw_messages["recentchanges-page-removed-from-category-bundled"], recent_changes.mw_messages["recentchanges-page-added-to-category-bundled"], comment_to_match))
else:
- logging.warning("Init information not available, could not read category information. Please restart the bot.")
+ logger.warning("Init information not available, could not read category information. Please restart the bot.")
else:
- logging.debug("Log entry got suppressed, ignoring entry.")
+ logger.debug("Log entry got suppressed, ignoring entry.")
# if change["revid"] in categorize_events:
# categorize_events[change["revid"]].append(cat_title)
# else:
- # logging.debug("New category '{}' for {}".format(cat_title, change["revid"]))
+ # logger.debug("New category '{}' for {}".format(cat_title, change["revid"]))
# categorize_events[change["revid"]] = {cat_title: }
for change in changes:
if change["rcid"] in self.ids or change["rcid"] < self.recent_id:
- logging.debug("Change ({}) is in ids or is lower than recent_id {}".format(change["rcid"],
+ logger.debug("Change ({}) is in ids or is lower than recent_id {}".format(change["rcid"],
self.recent_id))
continue
- logging.debug(self.ids)
- logging.debug(self.recent_id)
+ logger.debug(self.ids)
+ logger.debug(self.recent_id)
self.add_cache(change)
if clean and not (self.recent_id == 0 and change["rcid"] > self.file_id):
- logging.debug("Rejected {val}".format(val=change["rcid"]))
+ logger.debug("Rejected {val}".format(val=change["rcid"]))
continue
essential_info(change, categorize_events.get(change.get("revid"), None))
return change["rcid"]
@@ -1236,11 +1213,11 @@ class Recent_Changes_Class(object):
try:
request = self.session.get(url, timeout=10, allow_redirects=False)
except requests.exceptions.Timeout:
- logging.warning("Reached timeout error for request on link {url}".format(url=url))
+ logger.warning("Reached timeout error for request on link {url}".format(url=url))
self.downtime_controller()
return None
except requests.exceptions.ConnectionError:
- logging.warning("Reached connection error for request on link {url}".format(url=url))
+ logger.warning("Reached connection error for request on link {url}".format(url=url))
self.downtime_controller()
return None
else:
@@ -1248,7 +1225,7 @@ class Recent_Changes_Class(object):
self.downtime_controller()
return None
elif request.status_code == 302:
- logging.critical("Redirect detected! Either the wiki given in the script settings (wiki field) is incorrect/the wiki got removed or Gamepedia is giving us the false value. Please provide the real URL to the wiki, current URL redirects to {}".format(request.next.url))
+ logger.critical("Redirect detected! Either the wiki given in the script settings (wiki field) is incorrect/the wiki got removed or Gamepedia is giving us the false value. Please provide the real URL to the wiki, current URL redirects to {}".format(request.next.url))
sys.exit(0)
return request
@@ -1263,7 +1240,7 @@ class Recent_Changes_Class(object):
except requests.exceptions.Timeout:
pass
if online < 1:
- logging.error("Failure when checking Internet connection at {time}".format(
+ logger.error("Failure when checking Internet connection at {time}".format(
time=time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime())))
self.downtimecredibility = 0
if not looped:
@@ -1309,11 +1286,12 @@ class Recent_Changes_Class(object):
for key, message in self.mw_messages.items():
if key.startswith("recentchanges-page-"):
self.mw_messages[key] = re.sub(r'\[\[.*?\]\]', '', message)
+ logger.info("Gathered information about the tags and interface messages.")
else:
- logging.warning("Could not retrieve initial wiki information. Some features may not work correctly!")
- logging.debug(startup_info)
+ logger.warning("Could not retrieve initial wiki information. Some features may not work correctly!")
+ logger.debug(startup_info)
else:
- logging.error("Could not retrieve initial wiki information. Possibly internet connection issue?")
+ logger.error("Could not retrieve initial wiki information. Possibly internet connection issue?")
recent_changes = Recent_Changes_Class()
@@ -1323,7 +1301,7 @@ if settings["appearance"]["mode"] == "embed":
elif settings["appearance"]["mode"] == "compact":
appearance_mode = compact_formatter
else:
- logging.critical("Unknown formatter!")
+ logger.critical("Unknown formatter!")
sys.exit(1)
# Log in and download wiki information
@@ -1332,9 +1310,10 @@ try:
recent_changes.log_in()
recent_changes.init_info()
except requests.exceptions.ConnectionError:
- logging.critical("A connection can't be established with the wiki. Exiting...")
+ logger.critical("A connection can't be established with the wiki. Exiting...")
sys.exit(1)
time.sleep(1.0)
+logger.info("Script started! Fetching newest changes...")
recent_changes.fetch(amount=settings["limitrefetch"] if settings["limitrefetch"] != -1 else settings["limit"])
schedule.every(settings["cooldown"]).seconds.do(recent_changes.fetch)
@@ -1349,13 +1328,13 @@ if settings["overview"]:
str(overview_time.tm_min).zfill(2))).do(day_overview)
del overview_time
except schedule.ScheduleValueError:
- logging.error("Invalid time format! Currently: {}:{}".format(time.strptime(settings["overview_time"], '%H:%M').tm_hour, time.strptime(settings["overview_time"], '%H:%M').tm_min))
+ logger.error("Invalid time format! Currently: {}:{}".format(time.strptime(settings["overview_time"], '%H:%M').tm_hour, time.strptime(settings["overview_time"], '%H:%M').tm_min))
except ValueError:
- logging.error("Invalid time format! Currentely: {}. Note: It needs to be in HH:MM format.".format(settings["overview_time"]))
+ logger.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)
if TESTING:
- logging.debug("DEBUGGING")
+ logger.debug("DEBUGGING")
recent_changes.recent_id -= 5
recent_changes.file_id -= 5
recent_changes.ids = [1]
diff --git a/settings.json.example b/settings.json.example
index 6d74771..9e1270d 100644
--- a/settings.json.example
+++ b/settings.json.example
@@ -5,7 +5,7 @@
"header": {
"user-agent": "RcGcDw/{version}"
},
- "limit": 11,
+ "limit": 10,
"webhookURL": "https://discordapp.com/api/webhooks/111111111111111111/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"limitrefetch": 28,
"wikiname": "Minecraft Wiki",
@@ -16,7 +16,6 @@
"embed": ""
},
"ignored": ["external"],
- "verbose_level": 0,
"show_updown_messages": true,
"overview": false,
"overview_time": "00:00",
@@ -27,10 +26,37 @@
"wiki_bot_login": "",
"wiki_bot_password": "",
"show_added_categories": true,
+ "logging": {
+ "version": 1,
+ "disable_existing_loggers": false,
+ "formatters": {
+ "standard": {
+ "format": "%(name)s - %(levelname)s: %(message)s"
+ }
+ },
+ "handlers": {
+ "default": {
+ "formatter": "standard",
+ "class": "logging.StreamHandler",
+ "stream": "ext://sys.stdout"
+ }
+ },
+ "loggers": {
+ "": {
+ "level": 0,
+ "handlers": ["default"]
+ },
+ "rcgcdw": {
+ },
+ "rcgcdw.misc": {
+ }
+ }
+ },
"appearance":{
"mode": "embed",
"embed": {
- "daily_overview": {
+ "show_edit_changes": false,
+ "daily_overview": {
"color": 16312092,
"icon":""
},