# SeatSniper

> Discord bot that watches BookMyShow and pings you the moment your show opens.

Canonical page: https://www.ishannaik.com/projects/seatsniper

_We watch. You win. — BookMyShow alerts on Discord the second bookings go live._

- Category: Discord Bot Development
- Client: Self-initiated project
- Role: Bot Developer
- Year: 2026
- Duration: Ongoing (Pre-MVP)
- Source: https://github.com/Ishannaik/seatsniper

## Overview

SeatSniper is a Discord bot that watches BookMyShow for you. Give it a movie, a city, and optionally a theatre or screen format, and it polls on an interval and pings you the moment something changes: bookings opening for a film that wasn't bookable yet, a new date appearing (Friday releases, late Saturday drops), or a new show being added (that 9:30 PM IMAX that wasn't there this morning).

Under the hood every ticketing provider returns the same normalised `Show[]`, so the core never knows BookMyShow exists — a second site is a new folder, not a rewrite. Change detection is snapshot diffing: the last-seen shows are stored per watch, compared on each poll, and turned into typed `AlertEvent`s that each channel (Discord today, Telegram or email later) renders its own way.

Built on Bun and TypeScript with discord.js v14 and the built-in `bun:sqlite` for storage, it runs on an Oracle VPS under pm2. Unlike earlier BookMyShow scrapers, an unparseable response (403, CAPTCHA, region block) is treated as an error rather than a silent “not open yet”, so a broken watch fails fast instead of never firing.

## Features

- **Bookings-Open Alerts**: Pings you the instant a movie that wasn't bookable becomes available
- **New Date & Show Detection**: Catches Friday releases, late show drops, and new IMAX/4DX screens as soon as they are listed
- **Link Validation**: Validates your BookMyShow link against the live site at creation, so a broken watch fails fast instead of silently never firing
- **Persistent Subscriptions**: Watches created with date:any keep running and DM you whenever a new bookable date or cinema unlocks
- **Provider-Agnostic Core**: Every ticketing site returns the same normalised Show[], so adding a second site is a new folder, not a rewrite

## Technologies

TypeScript, Bun, discord.js, SQLite (bun:sqlite), node-tls-client, pm2

## Process

- **Research & Prior Art** (1 week): Read existing BookMyShow projects line by line, identified silent-failure flaws (403/CAPTCHA read as "not open") and the geo-fencing constraint that shaped hosting
- **Provider Layer** (Ongoing): Built the BookMyShow adapter against verified JSON endpoints, returning a normalised Show[] the core never has to know about
- **Core Engine** (Ongoing): Watch model, in-process scheduler, and snapshot-diff change detection emitting typed AlertEvents
- **Discord Notifications** (Ongoing): Slash commands (/watch, /list, /stop), embed builder, and DM alerts wired to the event stream

## Related projects

- [Kage](https://www.ishannaik.com/projects/kage-bot.md)
- [Sora](https://www.ishannaik.com/projects/sora-bot.md)
- [Zap](https://www.ishannaik.com/projects/zap.md)
