Some more work towards making the client work, added context class

This commit is contained in:
Frisk 2021-04-25 02:32:50 +02:00
parent d725b97c2a
commit a9d6fa1830
No known key found for this signature in database
GPG key ID: 213F7C15068AF8AC
6 changed files with 54 additions and 16 deletions

View file

@ -18,7 +18,8 @@ import math
from src.discord.message import DiscordMessage
from src.api import formatter
from src.i18n import rc_formatters
from src.api.client import Client, client
from src.api.client import Client
from src.api.context import Context
from src.configloader import settings
from src.exceptions import *
@ -32,7 +33,7 @@ class base():
super().__init__(api)
@formatter.embed(event="edit", mode="embed")
def embed_edit(self, ctx: Client, change: dict) -> DiscordMessage:
def embed_edit(self, ctx: Context, change: dict) -> DiscordMessage:
embed = DiscordMessage(ctx.message_type, ctx.event, ctx.webhook_url)
action = ctx.event
editsize = change["newlen"] - change["oldlen"]
@ -92,6 +93,7 @@ class base():
embed.add_field(_("Added"), "{data}".format(data=EditDiff.small_prev_ins), inline=True)
else:
logger.warning("Unable to download data on the edit content!")
return embed
@formatter.compact(event="edit", mode="embed")
def compact_edit(self, change: dict):

View file

@ -60,5 +60,7 @@ class Client:
"""
return self.__recent_changes.api_request(params, *json_path, timeout, allow_redirects)
def get_formatters(self):
return self._formatters
client = Client()

23
src/api/context.py Normal file
View file

@ -0,0 +1,23 @@
# This file is part of Recent changes Goat compatible Discord webhook (RcGcDw).
#
# RcGcDw 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.
#
# RcGcDw 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 RcGcDw. If not, see <http://www.gnu.org/licenses/>.
class Context:
"""Context object containing client and some metadata regarding specific formatter call"""
def __init__(self, message_type: str, webhook_url: str, client):
self.client = client
self.webhook_url = webhook_url
self.message_type = message_type
self.event = None

View file

@ -14,11 +14,13 @@
# along with RcGcDw. If not, see <http://www.gnu.org/licenses/>.
import src.rcgcdw
import logging
from src.configloader import settings
from src.exceptions import FormatterBreaksAPISpec
from src.discord.message import DiscordMessage
from typing import Optional, Callable
logger = logging.getLogger("src.api.formatter")
def _register_formatter(func: Callable[[dict], DiscordMessage], kwargs: dict[str, str], formatter_type: str,
action_type: Optional[str]=None):
@ -35,6 +37,10 @@ def _register_formatter(func: Callable[[dict], DiscordMessage], kwargs: dict[str
if action_type is None:
raise FormatterBreaksAPISpec("event type")
if settings["appearance"]["mode"] == formatter_type:
if action_type in src.rcgcdw.formatter_hooks:
logger.warning(f"Action {action_type} is already defined inside of "
f"{src.rcgcdw.formatter_hooks[action_type].__module__}! "
f"Overwriting it with one from {func.__module__}")
src.rcgcdw.formatter_hooks[action_type] = func

View file

@ -20,6 +20,7 @@ import sys
import time
import logging
import requests
import src.api.client
from bs4 import BeautifulSoup
from src.configloader import settings
@ -28,6 +29,7 @@ from src.misc import WIKI_SCRIPT_PATH, WIKI_API_PATH, datafile, send_simple, saf
from src.discord.queue import messagequeue
from src.exceptions import MWError, BadRequest, ClientError, ServerError, MediaWikiError
from src.session import session
from src.api.context import Context
from typing import Union
# from src.rc_formatters import compact_formatter, embed_formatter, compact_abuselog_formatter, embed_abuselog_formatter
from src.i18n import rc
@ -202,7 +204,7 @@ class Wiki(object):
logger.debug("Change ({}) is lower or equal to recent_id {}".format(change["rcid"], recent_id))
continue
logger.debug(recent_id)
essential_info(change, categorize_events.get(change.get("revid"), None))
rc_processor(change, categorize_events.get(change.get("revid"), None))
return highest_id
def prepare_abuse_log(self, abuse_log: list):
@ -454,12 +456,13 @@ class Wiki(object):
wiki = Wiki()
def essential_info(change, changed_categories):
def rc_processor(change, changed_categories):
"""Prepares essential information for both embed and compact message format."""
formatters = src.api.client.client.get_formatters() # TODO Make it better? Importing might be a hell
logger.debug(change)
context = Context(settings["appearance"]["mode"], settings["webhookURL"], src.api.client.client)
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, wiki)
return
context.event = "suppressed"
if "commenthidden" not in change:
LinkParser.feed(change["parsedcomment"])
parsed_comment = LinkParser.new_string

View file

@ -39,18 +39,21 @@ if settings["fandom_discussions"]["enabled"]:
import src.discussions
TESTING = True if "--test" in sys.argv else False # debug mode, pipeline testing
formatter_hooks = {}
# Prepare logging
logging.config.dictConfig(settings["logging"])
logger = logging.getLogger("rcgcdw")
logger.debug("Current settings: {settings}".format(settings=settings))
from src.migrations import * # migrations after logging
def load_extensions():
"""Loads all of the extensions, can be a local import because all we need is them to register"""
try:
import extensions
except ImportError:
logger.critical("No extensions module found. What's going on?")
raise
sys.exit(1)
storage = datafile
@ -63,8 +66,6 @@ if settings["limitrefetch"] != -1 and os.path.exists("lastchange.txt") is True:
datafile.save_datafile()
os.remove("lastchange.txt")
formatter_hooks = {}
def day_overview_request():
logger.info("Fetching daily overview... This may take up to 30 seconds!")
@ -251,6 +252,7 @@ if 1 == 2: # additional translation strings in unreachable code
_("autoreview"), _("autopatrol"), _("wiki_guardian"), ngettext("second", "seconds", 1), ngettext("minute", "minutes", 1), ngettext("hour", "hours", 1), ngettext("day", "days", 1), ngettext("week", "weeks", 1), ngettext("month", "months",1), ngettext("year", "years", 1), ngettext("millennium", "millennia", 1), ngettext("decade", "decades", 1), ngettext("century", "centuries", 1))
# noinspection PyUnreachableCode
load_extensions()
if TESTING:
logger.debug("DEBUGGING ")