Skip to content

About

🎭 A BoJack Horseman–themed Slack bot for the #horsin-around comedy channel. Talent submit jokes via /pitch, earn a unique EP-ID, and face a live community vote. Features Encore Queue, Wit-ness Record, NSFW moderation, dual personas, and a ShowRunner that never misses an air date.

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

Β 

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🎭 Horsin' Around β€” Hollywoo's Stage Bot

Python Slack Bolt License Tests CI Socket Mode

"Everything is fine. I'm BoJack Horseman."

A BoJack Horseman–themed Slack bot for the #horsin-around channel. Talent file a Wit Entry via /pitch, earn an EP-ID, get roasted by the audience, and climb the Cringe-o-Meter leaderboard.


Features

Feature Description
🎀 /pitch Opens the Take the Stage modal β€” submit your best material
🎭 Stage Entry Card Every submission gets a branded card with live vote counts and a Cringe-o-Meter
πŸ—³οΈ Voting Community votes Certified Cringe or It's Fine I Guess β€” card updates in real time
πŸ“‹ Wit-ness Record Per-member stats modal: episodes filed, cringe %, career rating, episode history
πŸ” Encore Queue Daily 3-entry limit β€” overflow entries auto-post the next morning
πŸ“‘ Daily Broadcast Bot personas (BoJack & Princess Carolyn) post curated material on a randomised schedule
⭐ Weekly Special Curated show quotes posted weekly, alternating between personas
πŸ“£ Mr. PB Announcements Fortnightly educational posts + automatic milestone celebrations
πŸ›‘οΈ Cringe Warden Bouncer deletes non-text posts and DMs the talent with a nudge
πŸ“Š Warden's Watch Health monitoring with startup heartbeat to a private logs channel

Architecture

app/
β”œβ”€β”€ commands.py          # /pitch slash command
β”œβ”€β”€ modals.py            # Modal submissions & Wit-ness Record
β”œβ”€β”€ actions.py           # Vote button handlers
β”œβ”€β”€ events.py            # Message events & bouncer
β”œβ”€β”€ db/
β”‚   └── database.py      # SQLite β€” jokes, criminal_records, state tables
β”œβ”€β”€ services/
β”‚   β”œβ”€β”€ slack_service.py # All Slack API calls
β”‚   β”œβ”€β”€ pitch_service.py # External joke API fetchers (icanhazdadjoke, JokeAPI)
β”‚   β”œβ”€β”€ validation.py    # Content validation pipeline
β”‚   β”œβ”€β”€ queue_service.py # Encore retry warden (background thread)
β”‚   β”œβ”€β”€ show_runner.py   # Scheduled broadcasts (background thread)
β”‚   └── monitoring.py    # Warden's Watch health monitoring
└── utils/
    β”œβ”€β”€ blocks.py            # All Slack Block Kit card builders
    β”œβ”€β”€ config.py            # Config loader (config.json + env)
    β”œβ”€β”€ constants.py         # Content blocklist
    β”œβ”€β”€ personas.py          # Persona routing (BoJack / Princess Carolyn)
    β”œβ”€β”€ show_quotes.json     # Curated weekly special quotes
    └── announcements.json   # Mr. PB fortnightly announcement topics

Quick Start

1. Prerequisites

  • Python 3.14+
  • A Slack workspace with a bot app configured (Socket Mode enabled)
  • uv for dependency management

2. Clone & install

git clone https://github.com/CynthiaWahome/horsin-around.git
cd horsin-around
uv sync

3. Configure environment

cp .env.example .env

Open .env and fill in your tokens. Every variable is documented with an inline comment β€” .env.example is the source of truth.

4. Slack app permissions (OAuth scopes required)

Scope Purpose
chat:write Post messages
chat:write.customize Custom username + avatar per post
chat:write.public Post to channels without joining
reactions:write Add emoji reactions
users:read Fetch member profiles
channels:history Read message timestamps for reaction tracking
im:write Send DMs (welcome message)

Socket Mode also requires an App-Level Token with connections:write.

5. Run

uv run python3 main.py

Development

Run tests

uv run pytest tests/ -v

Skip daily entry limit (dev only)

TESTING_BYPASS_LIMIT=true

Personas

Persona Source Schedule
🐴 BoJack Horseman icanhazdadjoke.com Odd days
🐱 Princess Carolyn JokeAPI v2 Even days
🐢 Mr. Peanutbutter Internal content Announcements & milestones

Contributing

Pull requests are welcome. This is a small Slack community tool β€” keep changes focused and test-covered. Run uv run pytest tests/ -v before opening a PR. CI will enforce it anyway, but it's faster to catch things locally.

If you're adding to the content blocklist, edit app/utils/constants.py. If you're changing validation logic, make sure tests/test_validation.py covers the new behaviour.


Made by

Three characters who never got a writing credit: a horse with a drinking problem, his overachieving agent, and a golden labrador who has never once noticed when the room is uncomfortable.

They provided the vibes. The code wrote itself. (It did not write itself. πŸ€¦β€β™€οΈ)


License

MIT

About

🎭 A BoJack Horseman–themed Slack bot for the #horsin-around comedy channel. Talent submit jokes via /pitch, earn a unique EP-ID, and face a live community vote. Features Encore Queue, Wit-ness Record, NSFW moderation, dual personas, and a ShowRunner that never misses an air date.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages