"""Market sentiment Telegram handler. Commands: /briefing — Generate and send market briefing /watchlist — Show/edit watchlist """ import logging from icarus.core.market.sentiment import ( _load_watchlist, _save_watchlist, generate_briefing, format_briefing, ) async def handle_briefing_command(message: dict, bot) -> None: """Handle /briefing command.""" chat_id = message["chat"]["id"] # Send loading message loading = await bot.send_message( chat_id=chat_id, text="📊 Fetching market data..." ) try: # Generate briefing tickers = _load_watchlist() briefing = await generate_briefing(tickers) text = format_briefing(briefing) # Edit loading message await bot.edit_message_text( chat_id=chat_id, message_id=loading["message_id"], text=text, ) except Exception as e: logging.error("Failed to generate briefing: %s", e) await bot.edit_message_text( chat_id=chat_id, message_id=loading["message_id"], text=f"❌ Error generating briefing: {e}" ) async def handle_watchlist_command(message: dict, bot) -> None: """Handle /watchlist command — show current list.""" tickers = _load_watchlist() text = ( "📋 Current Watchlist:\n\n" + "\n".join(f" {i+1}. {t}" for i, t in enumerate(tickers)) + "\n\nTo update, reply with:\n" + "`watchlist AAPL MSFT TSLA NVDA`" ) await bot.send_message( chat_id=message["chat"]["id"], text=text, ) async def handle_watchlist_update(message: dict, bot) -> None: """Handle 'watchlist TICKER TICKER ...' message.""" text = message.get("text", "") parts = text.split() if len(parts) < 2: await bot.send_message( chat_id=message["chat"]["id"], text="Usage: `watchlist AAPL MSFT TSLA`" ) return new_tickers = [p.upper() for p in parts[1:] if p.isalpha()] if not new_tickers: await bot.send_message( chat_id=message["chat"]["id"], text="❌ No valid tickers found. Use format: `watchlist AAPL MSFT`" ) return _save_watchlist(new_tickers) await bot.send_message( chat_id=message["chat"]["id"], text=f"✅ Watchlist updated ({len(new_tickers)} tickers):\n" + ", ".join(new_tickers) )