Source code for slack_webhook_notifier.main

import re
from datetime import datetime, timedelta
from functools import wraps
from typing import Any, Callable, Optional

import requests


[docs] def slack_notify( webhook_url: str, func_identifier: str, user_id: Optional[str] = None, custom_message: Optional[str] = None, # New parameter for custom message ) -> Callable[[Callable[..., Any]], Callable[..., Any]]: def decorator(func: Callable[..., Any]) -> Callable[..., Any]: @wraps(func) def wrapper(*args: Any, **kwargs: Any) -> Any: start_time: datetime = datetime.now() start_message: str = ( f"⏳ Automation has started.\n" f"Start Time: {start_time.strftime('%Y-%m-%d %H:%M:%S')}\n" f"Function Caller: {func_identifier}" ) send_slack_message(webhook_url, start_message) try: result = func(*args, **kwargs) end_time: datetime = datetime.now() duration: timedelta = end_time - start_time custom_message_str: str = f"\nReturn Message: {result}" if result else "" end_message: str = ( f"✅ Automation has completed successfully.\n" f"Start Time: {start_time.strftime('%Y-%m-%d %H:%M:%S')}\n" f"End Time: {end_time.strftime('%Y-%m-%d %H:%M:%S')}\n" f"Duration: {duration!s}\n" f"Function Caller: {func_identifier}" f"{custom_message_str}" ) send_slack_message(webhook_url, end_message) return result except Exception as err: end_time = datetime.now() duration = end_time - start_time # Remove any large SQL query from error message if it's a SQLAlchemy error error_message = str(err) if "SQL: " in error_message: try: error_message = re.sub(r"\[SQL: .*?\]", "", error_message).strip() except Exception as e: raise e user_mention: str = f"<@{user_id}> " if user_id else "" error_message: str = ( f"{user_mention}\n" f"🆘 Automation has crashed.\n" f"Start Time: {start_time.strftime('%Y-%m-%d %H:%M:%S')}\n" f"End Time: {end_time.strftime('%Y-%m-%d %H:%M:%S')}\n" f"Duration: {duration!s}\n" f"Function Caller: {func_identifier}\n" f"Error: {error_message!s}" ) send_slack_message(webhook_url, error_message) raise err return wrapper return decorator
[docs] def send_slack_message(webhook_url: str, message: str) -> None: try: response = requests.post(webhook_url, json={"text": message}, timeout=10) response.raise_for_status() # Raises HTTPError if status code is 4xx/5xx except requests.exceptions.RequestException as e: print(f"Failed to send Slack notification: {e}") raise # Ensure exceptions are raised for testing purposes