# slopbot Zulip bot for [meshheads.org](https://zulip.meshheads.org) that replies with stock prices when it sees `$TICKER` patterns and calls `agent` for `@slop` mentions. ## Usage Post `$NVDA` or `$AAPL is mooning` in any stream and slopbot replies with the current price. Mention `@slop` and it runs a one-shot `agent` subprocess with recent Zulip topic history. ## Setup ```bash pip install -r requirements.txt cp .zuliprc.example .zuliprc cp .env.example .env # edit .zuliprc with your bot credentials # edit .env with agent/provider settings if needed python main.py ``` Run tests: ```bash ./test.sh ``` Install the pre-commit hook: ```bash ./scripts/install-git-hooks.sh ``` Deploy as a user-level systemd service: ```bash ./deploy.sh journalctl --user -u slopbot -f ``` To keep the user service running after logout, run once: ```bash sudo loginctl enable-linger $USER ``` Get your `.zuliprc` from Zulip: Settings → Bots → your bot → download config. ## Architecture - `main.py` — single-file bot, raw `zulip` event loop (no framework) - `fetch_price(ticker)` — isolated data layer, easy to swap yfinance for a real API - `ask_agent(msg, content)` — runs the Rust `agent` binary once per mention - `prompts/system.md` — bot persona, research workflow, and response behavior - `slop-search QUERY` — Kagi search helper available to the agent shell - `slop-fetch URL` — trafilatura page extraction helper available to the agent shell - `.env.example` — operational defaults, including `KAGI_API_KEY` - Regex: `\$([A-Z]{1,5})` — matches 1-5 uppercase letters after `$` - Deduplicates tickers per message, replies in-place (same stream + topic) - `flake.nix` — packages slopbot with `agent` from `/home/ben/src/bsima/agentd` as a Nix input ## Extending Future ideas: - Swap `fetch_price` for Finnhub/Polygon for real-time data - Add LLM commentary on price moves - Support crypto tickers - Add `@slopbot summarize $NVDA` command style