StarfallBot/starfall/web/blueprints/base.py

52 lines
1.7 KiB
Python

import inspect
import logging
from abc import ABC
from types import FrameType
from flask import Blueprint
from flask.blueprints import BlueprintSetupState
from flask_assets import Environment
from starfall.types import SnapshotQueue
class BaseBlueprint(ABC):
def __init__(self, blueprint: Blueprint, assets: Environment):
self.queue: SnapshotQueue | None = None
self.assets: Environment = assets
blueprint.record(self.on_blueprint_setup)
if type(self) is not BaseBlueprint:
self._debug("Attaching blueprint of type %r to web service", type(self))
def on_blueprint_setup(self, state: BlueprintSetupState):
self.queue = state.options["options"]["queue"]
if type(self) is not BaseBlueprint:
self._info("Blueprint of type %r successfully set up", type(self))
def _log_access(self):
# There is always a previous frame - This function is called when a
# route is accessed by a user through a method unknown to this one.
frame: FrameType | None = inspect.currentframe()
if not isinstance(frame, FrameType):
return
f_back: FrameType | None = frame.f_back
if not isinstance(f_back, FrameType):
return
self._info("Route access: %r", f_back.f_code.co_name)
def _debug(self, msg: str, *args: object):
logging.getLogger("web").debug(msg, *args)
def _info(self, msg: str, *args: object):
logging.getLogger("web").info(msg, *args)
def _warn(self, msg: str, *args: object):
logging.getLogger("web").warning(msg, *args)
def _crit(self, msg: str, *args: object):
logging.getLogger("web").critical(msg, *args)