move message utils to a separate file
This commit is contained in:
parent
961f494fa2
commit
b74e24da32
3 changed files with 33 additions and 28 deletions
|
@ -20,11 +20,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1687793116,
|
"lastModified": 1688188316,
|
||||||
"narHash": "sha256-6xRgZ2E9r/BNam87vMkHJ/0EPTTKzeNwhw3abKilEE4=",
|
"narHash": "sha256-CXuQllDKCxtZaB/umnZOvoJ/d4kJguYgffeTA9l1B3o=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "9e4e0807d2142d17f463b26a8b796b3fe20a3011",
|
"rev": "8277b539d371bf4308fc5097911aa58bfac1794f",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
27
main.mjs
27
main.mjs
|
@ -8,6 +8,7 @@ import {
|
||||||
} from "fp-ts";
|
} from "fp-ts";
|
||||||
import { flow, pipe } from "fp-ts/lib/function.js";
|
import { flow, pipe } from "fp-ts/lib/function.js";
|
||||||
import { describeArticle } from "./api.mjs";
|
import { describeArticle } from "./api.mjs";
|
||||||
|
import { extractMessageLink } from "./message.mjs";
|
||||||
import config from "./config.mjs";
|
import config from "./config.mjs";
|
||||||
|
|
||||||
const bot = new TelegramBot(config.telegramBotToken, {
|
const bot = new TelegramBot(config.telegramBotToken, {
|
||||||
|
@ -16,7 +17,7 @@ const bot = new TelegramBot(config.telegramBotToken, {
|
||||||
|
|
||||||
console.log("The telegram bot listens for updates");
|
console.log("The telegram bot listens for updates");
|
||||||
|
|
||||||
bot.on("channel_post", async (msg) => {
|
bot.on("channel_post", (msg) => {
|
||||||
const link = extractMessageLink(msg);
|
const link = extractMessageLink(msg);
|
||||||
if (option.isNone(link)) {
|
if (option.isNone(link)) {
|
||||||
console.log("cannot find link in msg:", msg);
|
console.log("cannot find link in msg:", msg);
|
||||||
|
@ -44,27 +45,3 @@ bot.on("channel_post", async (msg) => {
|
||||||
),
|
),
|
||||||
)(config)();
|
)(config)();
|
||||||
});
|
});
|
||||||
|
|
||||||
function extractMessageLink(msg) {
|
|
||||||
return pipe(
|
|
||||||
getTextLink(msg),
|
|
||||||
option.orElse(() => getMessageUrl(msg)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const RE_URL =
|
|
||||||
/(http|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])/;
|
|
||||||
|
|
||||||
function getMessageUrl(msg) {
|
|
||||||
return option.fromNullable(RE_URL.exec(msg.text)?.[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getTextLink(msg) {
|
|
||||||
return readonlyArray.findFirstMap(
|
|
||||||
flow(option.fromPredicate(isTextLink), option.map((link) => link.url)),
|
|
||||||
)(msg.entities ?? readonnlyArray.empty);
|
|
||||||
}
|
|
||||||
|
|
||||||
function isTextLink(msgEntity) {
|
|
||||||
return msgEntity.type === "text_link";
|
|
||||||
}
|
|
||||||
|
|
28
message.mjs
Normal file
28
message.mjs
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
import { option, readonlyArray } from "fp-ts";
|
||||||
|
import { flow, pipe } from "fp-ts/lib/function.js";
|
||||||
|
|
||||||
|
const RE_URL =
|
||||||
|
/(http|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])/;
|
||||||
|
|
||||||
|
// getMessageUrl :: Message -> Option<string>
|
||||||
|
const getMessageUrl = (msg) => option.fromNullable(RE_URL.exec(msg.text)?.[0]);
|
||||||
|
|
||||||
|
// getMessageEntities :: Message -> ReadonlyArray<MessageEntity>
|
||||||
|
const getMessageEntities = (msg) => msg.entities ?? readonlyArray.empty;
|
||||||
|
|
||||||
|
// isTextLink :: MessageEntity -> boolean
|
||||||
|
const isTextLink = (msgEntity) => msgEntity.type === "text_link";
|
||||||
|
|
||||||
|
// getTextLink :: Message -> Option<string>
|
||||||
|
const getTextLink = flow(
|
||||||
|
getMessageEntities,
|
||||||
|
readonlyArray.findFirstMap(
|
||||||
|
flow(option.fromPredicate(isTextLink), option.map((link) => link.url)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
export const extractMessageLink = (msg) =>
|
||||||
|
pipe(
|
||||||
|
getTextLink(msg),
|
||||||
|
option.orElse(() => getMessageUrl(msg)),
|
||||||
|
);
|
Reference in a new issue