This repository has been archived on 2024-07-25. You can view files and clone it, but cannot push or open issues or pull requests.
yandexgpt_tg_bot/main.mjs
2023-07-01 13:35:43 +03:00

66 lines
1.5 KiB
JavaScript

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";
}