| | import json |
| | import logging |
| | import aiohttp |
| |
|
| | from open_webui.config import WEBUI_FAVICON_URL |
| | from open_webui.env import AIOHTTP_CLIENT_TIMEOUT, VERSION |
| |
|
| | log = logging.getLogger(__name__) |
| |
|
| |
|
| | async def post_webhook(name: str, url: str, message: str, event_data: dict) -> bool: |
| | try: |
| | log.debug(f"post_webhook: {url}, {message}, {event_data}") |
| | payload = {} |
| |
|
| | |
| | if "https://hooks.slack.com" in url or "https://chat.googleapis.com" in url: |
| | payload["text"] = message |
| | |
| | elif "https://discord.com/api/webhooks" in url: |
| | payload["content"] = ( |
| | message |
| | if len(message) < 2000 |
| | else f"{message[: 2000 - 20]}... (truncated)" |
| | ) |
| | |
| | elif "webhook.office.com" in url: |
| | action = event_data.get("action", "undefined") |
| | facts = [ |
| | {"name": name, "value": value} |
| | for name, value in json.loads(event_data.get("user", {})).items() |
| | ] |
| | payload = { |
| | "@type": "MessageCard", |
| | "@context": "http://schema.org/extensions", |
| | "themeColor": "0076D7", |
| | "summary": message, |
| | "sections": [ |
| | { |
| | "activityTitle": message, |
| | "activitySubtitle": f"{name} ({VERSION}) - {action}", |
| | "activityImage": WEBUI_FAVICON_URL, |
| | "facts": facts, |
| | "markdown": True, |
| | } |
| | ], |
| | } |
| | |
| | else: |
| | payload = {**event_data} |
| |
|
| | log.debug(f"payload: {payload}") |
| | async with aiohttp.ClientSession( |
| | trust_env=True, timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT) |
| | ) as session: |
| | async with session.post(url, json=payload) as r: |
| | r_text = await r.text() |
| | r.raise_for_status() |
| | log.debug(f"r.text: {r_text}") |
| |
|
| | return True |
| | except Exception as e: |
| | log.exception(e) |
| | return False |
| |
|