| import os |
| import requests |
| import logging |
|
|
| logger = logging.getLogger(__name__) |
|
|
| class AlertManager: |
| def __init__(self): |
| |
| self.discord_webhook = os.environ.get("DISCORD_WEBHOOK_URL") |
| self.slack_webhook = os.environ.get("SLACK_WEBHOOK_URL") |
|
|
| def send_discord_alert(self, title: str, message: str, color: int = 5814783): |
| """Send a rich embed to Discord.""" |
| if not self.discord_webhook: |
| logger.debug("Discord webhook not configured.") |
| return |
|
|
| payload = { |
| "embeds": [{ |
| "title": title, |
| "description": message, |
| "color": color |
| }] |
| } |
| |
| try: |
| response = requests.post(self.discord_webhook, json=payload) |
| if response.status_code != 204: |
| logger.error(f"Failed to send Discord alert: {response.status_code}") |
| except Exception as e: |
| logger.error(f"Error sending Discord alert: {e}") |
|
|
| def send_slack_alert(self, title: str, message: str): |
| """Send a message to Slack.""" |
| if not self.slack_webhook: |
| logger.debug("Slack webhook not configured.") |
| return |
|
|
| payload = { |
| "text": f"*{title}*\n{message}" |
| } |
| |
| try: |
| response = requests.post(self.slack_webhook, json=payload) |
| if response.status_code != 200: |
| logger.error(f"Failed to send Slack alert: {response.status_code}") |
| except Exception as e: |
| logger.error(f"Error sending Slack alert: {e}") |
| |
| def alert_arbitrage(self, opp: dict): |
| """Format and send an arbitrage opportunity alert.""" |
| title = "🚨 New Arbitrage Opportunity Detected!" |
| msg = f"**{opp['event_name']}**\n" |
| msg += f"Buy on {opp['buy_platform']} @ ${opp['buy_price']}\n" |
| msg += f"Sell on {opp['sell_platform']} @ ${opp['sell_price']}\n" |
| msg += f"**Net Edge:** {opp['expected_profit_margin']*100:.2f}%\n" |
| msg += f"**Max Size:** ${opp['buy_size']:.2f}" |
| |
| |
| self.send_discord_alert(title, msg, color=5763719) |
| self.send_slack_alert(title, msg) |
|
|