import re import attr import logging from typing import Any, Tuple from jinja2 import TemplateNotFound from mautrix.types import (EventType, RoomID, StateEvent, Membership, MessageType, JSON, TextMessageEventContent, Format, ReactionEventContent, RelationType) from mautrix.util.formatter import parse_html from ..util.template import TemplateManager, TemplateUtil from .types import EventParse, OTHER_ENUMS, Action from ..common import COLOR_ALARM, COLOR_OK, COLOR_UNKNOWN spaces = re.compile(" +") space = " " messages = TemplateManager("gitlab", "messages") templates = TemplateManager("gitlab", "mixins") async def parse_event(x_gitlab_event: str, payload: Any) -> Tuple[str, str]: evt = EventParse[x_gitlab_event].deserialize(payload) print("processing", evt) try: tpl = messages[evt.template_name] except TemplateNotFound as e: msg = f"Received unhandled gitlab event type {x_gitlab_event}" logging.info(msg) logging.info(payload) return [(msg, msg)] aborted = False def abort() -> None: nonlocal aborted aborted = True base_args = { **{field.key: field for field in Action if field.key.isupper()}, **OTHER_ENUMS, "util": TemplateUtil, } msgs = [] for subevt in evt.preprocess(): print("preprocessing", subevt) args = { **attr.asdict(subevt, recurse=False), **{key: getattr(subevt, key) for key in subevt.event_properties}, "abort": abort, **base_args, } args["templates"] = templates.proxy(args) html = tpl.render(**args) if not html or aborted: aborted = False continue html = spaces.sub(space, html.strip()) content = TextMessageEventContent(msgtype=MessageType.TEXT, format=Format.HTML, formatted_body=html, body=await parse_html(html)) content["xyz.maubot.gitlab.webhook"] = { "event_type": x_gitlab_event, **subevt.meta, } msgs.append((content.body, content.formatted_body)) return msgs