Something went wrong. Try again.
Personal Telegram bot for tracking the movies and shows you watch. Cloudflare Workers, D1, and TMDB.
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687import { Hono } from 'hono'import { OK, tg, parseCommand, handleStart, handleSearch, handleWatched, handleWatch, handlePage} from './src/handlers.js'import { parseCallback } from './src/callback.js'
const app = new Hono()
const COMMANDS = [ { command: 'help', description: 'How to use the bot' }, { command: 'watched', description: 'Your recent watch history' }]
const authed = async (c, next) => { const secret = c.env.WEBHOOK_SECRET if (!secret || c.req.header('x-telegram-bot-api-secret-token') !== secret) { return c.text('forbidden', 403) } await next()}
async function route(env, body) { if (body.message) { const chatId = body.message.chat.id const text = (body.message.text || '').trim()
if (!text) return OK()
const { command } = parseCommand(text)
if (command === 'start' || command === 'help') return handleStart(env, chatId) if (command === 'watched') return handleWatched(env, chatId) if (command) return OK()
return handleSearch(env, chatId, text, body.message.message_id) }
if (body.callback_query) { const cb = body.callback_query const chatId = cb.message.chat.id const parsed = parseCallback(cb.data)
if (!parsed) return OK()
if (parsed.action === 'watch') return handleWatch(env, cb, chatId, parsed.args) if (parsed.action === 'page') return handlePage(env, cb, chatId, parsed.args)
if (parsed.action === 'noop') { await tg(env.BOT_TOKEN, 'answerCallbackQuery', { callback_query_id: cb.id }) return OK() } }
return OK()}
app.post('/setup', authed, async (c) => { const { BOT_TOKEN, WEBHOOK_SECRET } = c.env const [commands, webhook] = await Promise.all([ tg(BOT_TOKEN, 'setMyCommands', { commands: COMMANDS }), tg(BOT_TOKEN, 'setWebhook', { url: `${new URL(c.req.url).origin}/webhook`, secret_token: WEBHOOK_SECRET, allowed_updates: ['message', 'callback_query'] }) ]) return c.json({ commands, webhook })})
app.post('/webhook', authed, async (c) => { try { const body = await c.req.json() const env = { ...c.env, waitUntil: (p) => c.executionCtx.waitUntil(p.catch(err => console.error('background', err))) } return await route(env, body) } catch (err) { console.error('webhook', err) return OK() }})
export default app