import { Hono } from 'hono' import { ServerResponse } from 'node:http' import { Writable } from 'node:stream' import { newTelegramBot, initTelegramBotCommands, sendMailToTelegram } from './telegram' import settings from './settings' import miniapp from './miniapp' import i18n from '../i18n' export const api = new Hono(); export { sendMailToTelegram } api.use("/telegram/*", async (c, next) => { const msgs = i18n.getMessagesbyContext(c); if (!c.env.TELEGRAM_BOT_TOKEN) { return c.text(msgs.TgBotTokenRequiredMsg, 400); } if (!c.env.KV) { return c.text(msgs.KVNotAvailableMsg, 400); } return await next(); }); api.use("/admin/telegram/*", async (c, next) => { const msgs = i18n.getMessagesbyContext(c); if (!c.env.TELEGRAM_BOT_TOKEN) { return c.text(msgs.TgBotTokenRequiredMsg, 400); } if (!c.env.KV) { return c.text(msgs.KVNotAvailableMsg, 400); } return await next(); }); api.post("/telegram/webhook", async (c) => { const token = c.env.TELEGRAM_BOT_TOKEN; const bot = newTelegramBot(c, token); let body = null; const res = new Writable(); Object.assign(res, { headersSent: false, setHeader: (name: string, value: string) => c.header(name, value), end: (data: any) => body = data, }); const reqJson = await c.req.json(); await bot.handleUpdate(reqJson, res as ServerResponse); return c.body(body); }); api.post("/admin/telegram/init", async (c) => { const domain = new URL(c.req.url).host; const token = c.env.TELEGRAM_BOT_TOKEN; const webhookUrl = `https://${domain}/telegram/webhook`; console.log(`setting webhook to ${webhookUrl}`); const bot = newTelegramBot(c, token); await bot.telegram.setWebhook(webhookUrl) await initTelegramBotCommands(c, bot); return c.json({ message: "webhook set successfully", }); }); api.get("/admin/telegram/status", async (c) => { const token = c.env.TELEGRAM_BOT_TOKEN; const bot = newTelegramBot(c, token); const info = await bot.telegram.getWebhookInfo() const commands = await bot.telegram.getMyCommands() return c.json({ info, commands }); }); api.get("/admin/telegram/settings", settings.getTelegramSettings); api.post("/admin/telegram/settings", settings.saveTelegramSettings); api.post("/telegram/get_bind_address", miniapp.getTelegramBindAddress); api.post("/telegram/new_address", miniapp.newTelegramAddress); api.post("/telegram/bind_address", miniapp.bindAddress); api.post("/telegram/unbind_address", miniapp.unbindAddress); api.post("/telegram/get_mail", miniapp.getMail);