diff --git a/src/service/telegram/index.ts b/src/service/telegram/index.ts index dc104e5..24af558 100644 --- a/src/service/telegram/index.ts +++ b/src/service/telegram/index.ts @@ -2,7 +2,7 @@ import { TelegramConfig, WebhookConfig } from "./types"; import { Telegraf } from "telegraf"; import logger from "../logger"; import { Response } from "express"; -import { Update } from "typegram"; +import { InputMediaPhoto, Update } from "typegram"; import loggerTgMiddleware from "../logger/tg"; import { ExtraReplyMessage } from "telegraf/typings/telegram-types"; @@ -80,7 +80,7 @@ export class TelegramService { }; /** - * Sends simple message to channel + * Sends message with photo to channel */ public sendPhotoToChan = async ( channel: string, @@ -95,6 +95,27 @@ export class TelegramService { }); }; + /** + * Sends simple message to channel + */ + public sendPhotoGroupToChan = async ( + channel: string, + caption: string, + src: string[], + extra?: ExtraReplyMessage + ) => { + logger.debug(`sending photo message "${caption}" to chan "${channel}"`); + const group: InputMediaPhoto[] = src.map((media, i) => ({ + type: "photo", + media, + caption: i === 0 ? caption : undefined, + })); + + return await this.bot.telegram.sendMediaGroup(channel, group, { + ...extra, + }); + }; + /** * Stops service * @param signal diff --git a/src/service/template/index.ts b/src/service/template/index.ts index 52d743d..7e889aa 100644 --- a/src/service/template/index.ts +++ b/src/service/template/index.ts @@ -31,7 +31,8 @@ export class Template< .use(frontmatter) .use(extract, { yaml: parse }) .use(removeFrontmatter) - .use(parser); + .use(parser) + .use(strip); const file = toVFile.readSync(path.join(__dirname, "../../", filename)); const result = processor.processSync(file); @@ -47,7 +48,7 @@ export class Template< * Themes the template with values */ public theme = (values: V) => { - return hb.compile(this.template)(values); + return hb.compile(this.template)(values).replace(/\n/g, "\n\n"); }; /** diff --git a/src/service/vk/handlers/PostNewHandler.ts b/src/service/vk/handlers/PostNewHandler.ts index 8d87269..960d575 100644 --- a/src/service/vk/handlers/PostNewHandler.ts +++ b/src/service/vk/handlers/PostNewHandler.ts @@ -17,6 +17,8 @@ import logger from "../../logger"; import Composer from "telegraf"; import CallbackQueryUpdate = Update.CallbackQueryUpdate; import { Template } from "../../template"; +import { getAttachment } from "../../../utils/attachment"; +import PhotoMessage = Message.PhotoMessage; type Button = "links" | "likes" | "more"; type UrlPrefix = string; @@ -93,30 +95,38 @@ export class PostNewHandler extends VkEventHandler { const text = context.wall?.text?.trim() || ""; - const parsed = this.themeText(text, postType, user); - const extras: ExtraReplyMessage = { disable_web_page_preview: true, - parse_mode: "Markdown", reply_markup: await this.createKeyboard(text, undefined, context.wall.id), }; - let msg: Message; + let msg: Message | PhotoMessage; const images = context.wall.getAttachments("photo"); + const thumbs = images + .map(getAttachment) + .filter((el) => el) + .slice(0, this.template.fields.images_limit) as string[]; + const hasThumb = - this.template.fields.image && - images.length && - images.some((img) => img.mediumSizeUrl); + this.template.fields.image && this.template.fields.images_limit; if (hasThumb) { - const thumb = await images.find((img) => img.mediumSizeUrl); - msg = await this.telegram.sendPhotoToChan( - this.channel.id, - this.trimTextForPhoto(text, PHOTO_CAPTION_LIMIT, postType, user), - thumb?.mediumSizeUrl!, - extras - ); + if (this.template.fields.images_limit! <= 1) { + msg = await this.telegram.sendPhotoToChan( + this.channel.id, + this.trimTextForPhoto(text, PHOTO_CAPTION_LIMIT, postType, user), + thumbs[0]!, + extras + ); + } else { + msg = (await this.telegram.sendPhotoGroupToChan( + this.channel.id, + this.trimTextForPhoto(text, PHOTO_CAPTION_LIMIT, postType, user), + thumbs, + extras + )) as any; + } } else { msg = await this.telegram.sendMessageToChan( this.channel.id, @@ -409,7 +419,9 @@ export class PostNewHandler extends VkEventHandler { const suffix = "..."; const trimmed = text.slice(0, limit - withoutText.length - suffix.length); - return this.themeText(`${trimmed}${suffix}`, type, user); + const txt = this.themeText(`${trimmed}${suffix}`, type, user); + + return txt; }; /** diff --git a/src/utils/attachment.ts b/src/utils/attachment.ts new file mode 100644 index 0000000..9401bcf --- /dev/null +++ b/src/utils/attachment.ts @@ -0,0 +1,9 @@ +import { PhotoAttachment } from "vk-io"; + +export const getAttachment = (img: PhotoAttachment): string | undefined => { + try { + return img.mediumSizeUrl; + } catch (e) { + return undefined; + } +}; diff --git a/templates/group_join.md b/templates/group_join.md index 44bb9df..66dd0ee 100644 --- a/templates/group_join.md +++ b/templates/group_join.md @@ -5,5 +5,5 @@ available variables are: user, group, text, isJoined, isLeave, count (see JoinLeaveHandler) --}} -πŸ˜ƒ [{{user.first_name}} {{user.last_name}}](https://vk.com/id{{user.id}}) {{#ifEq user.sex 1}}ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠ»Π°ΡΡŒ{{else}}присоСдинился{{/ifEq}} +πŸ˜ƒ [{{user.first_name}} {{user.last_name}}](https://vk.com/id{{user.id}}) https://vk.com/id{{user.id}} {{#ifEq user.sex 1}}ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠ»Π°ΡΡŒ{{else}}присоСдинился{{/ifEq}} ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ΅. Участники: {{count}}. diff --git a/templates/group_leave.md b/templates/group_leave.md index 23dc366..2af23dd 100644 --- a/templates/group_leave.md +++ b/templates/group_leave.md @@ -5,5 +5,5 @@ available variables are: user, group, text, isJoined, isLeave, count (see JoinLeaveHandler) --}} -😑 [{{user.first_name}} {{user.last_name}}](https://vk.com/id{{user.id}}) {{#ifEq user.sex 1}}свалила{{else}}свалил{{/ifEq}} +😑 [{{user.first_name}} {{user.last_name}}](https://vk.com/id{{user.id}}) https://vk.com/id{{user.id}} {{#ifEq user.sex 1}}свалила{{else}}свалил{{/ifEq}} ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹. Участники: {{count}}. diff --git a/templates/post_new.md b/templates/post_new.md index da01976..53a7576 100644 --- a/templates/post_new.md +++ b/templates/post_new.md @@ -9,7 +9,7 @@ http://vk.com/album-: Альбом ΠΏΠΎΠΊΠ°Ρ‚Π° likes: ['😱','πŸ€”','πŸ˜ƒ'] char_limit: 0 - images_limit: 2 + images_limit: 1 --- {{!-- @@ -18,12 +18,6 @@ (see PostNewHandler) --}} -{{#ifEq type 'suggest'}} -ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠΊΠ°: - -{{/ifEq}} +{{#ifEq type 'suggest'}}ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠΊΠ°:{{/ifEq}} {{text}} - -{{#if user}} -[{{user.first_name}} {{user.last_name}}](https://vk.com/id{{user.id}}) -{{/if}} +{{#if user}}[{{user.first_name}} {{user.last_name}}](https://vk.com/id{{user.id}}){{/if}}