import TelegramBot from "node-telegram-bot-api"; import { readerTaskEither as rte, readonlyArray, semigroup, string, } from "fp-ts"; import { flow, pipe } from "fp-ts/lib/function.js"; import { describeArticle } from "./api.mjs"; import config from "./config.mjs"; const bot = new TelegramBot(config.telegramBotToken, { polling: true, }); console.log("The telegram bot listens for updates"); bot.on("channel_post", async (msg) => { const link = extractMessageLink(msg); if (!link) { console.log("cannot find link in msg:", msg); return; } pipe( describeArticle(link), rte.map( flow( readonlyArray.foldMap({ ...string.Monoid, ...pipe(string.Semigroup, semigroup.intercalate("\n")), })((row) => `- ${row}`), string.trimLeft, ), ), rte.match( (err) => console.log({ err }), (res) => bot.editMessageText(msg.text + "\n\nYandexGPT:\n\n" + res, { chat_id: msg.chat.id, message_id: msg.message_id, }), ), )(config)(); }); // TODO: use option instead function extractMessageLink(msg) { return getTextLink(msg) || getMessageUrl(msg); } const RE_URL = /(http|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])/; function getMessageUrl(msg) { return RE_URL.exec(msg.text)[0]; } function getTextLink(msg) { const textLinks = (msg.entities ?? []).filter(isTextLink); return textLinks.length ? textLinks[0].url : null; } function isTextLink(msgEntity) { return msgEntity.type === "text_link"; }