Add gitlab webhook support

This commit is contained in:
Abel Luck 2022-12-01 13:47:27 +00:00
parent 9d41d56e0c
commit a1ae717c8f
26 changed files with 1824 additions and 8 deletions

70
ops_bot/gitlab/hook.py Normal file
View file

@ -0,0 +1,70 @@
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