from app.classes.web.webhooks.base_webhook import WebhookProvider class MattermostWebhook(WebhookProvider): def _construct_mattermost_payload(self, server_name, title, message, bot_name): """ Constructs the payload required for sending a Mattermost webhook notification. The method formats the given information into a Markdown-styled message for MM, including an information card containing the Crafty version. Parameters: server_name (str): The name of the server triggering the notification. title (str): The title for the notification message. message (str): The main content of the notification message. bot_name (str): Override for the Webhook's name set on creation. Returns: tuple: A tuple containing the constructed payload (dict) incl headers (dict). """ formatted_text = ( f"-----\n\n" f"#### {title}\n" f"##### Server: ```{server_name}```\n\n" f"```\n{message}\n```\n\n" f"-----" ) headers = {"Content-Type": "application/json"} payload = { "text": formatted_text, "username": bot_name, "icon_url": self.WEBHOOK_PFP_URL, "props": { "card": ( f"[Crafty Controller " f"v.{self.CRAFTY_VERSION}](https://craftycontrol.com)" ) }, } return payload, headers def send(self, server_name, title, url, message, **kwargs): """ Sends a Mattermost webhook notification using the given details. The method constructs and dispatches a payload suitable for Mattermost's webhook system. Parameters: server_name (str): The name of the server triggering the notification. title (str): The title for the notification message. url (str): The webhook URL to send the notification to. message (str): The main content or body of the notification message. bot_name (str): Override for the Webhook's name set on creation, see note! Returns: str: "Dispatch successful!" if the message is sent successfully, otherwise an exception is raised. Raises: Exception: If there's an error in dispatching the webhook. Note: - To set webhook username & pfp Mattermost needs to be configured to allow this! - Mattermost's `config.json` setting is `"EnablePostUsernameOverride": true` - Mattermost's `config.json` setting is `"EnablePostIconOverride": true` """ bot_name = kwargs.get("bot_name", self.WEBHOOK_USERNAME) payload, headers = self._construct_mattermost_payload( server_name, title, message, bot_name ) return self._send_request(url, payload, headers)