diff --git a/config.example.yml b/config.example.yml index 766a3da..6521fef 100644 --- a/config.example.yml +++ b/config.example.yml @@ -17,6 +17,8 @@ vk: templates: message_new: templates/message_new.md wall_post_new: templates/post_new.md + group_join: templates/group_join.md + group_leave: templates/group_leave.md # groups: # - id: 0 # name: 'Group name' diff --git a/src/service/telegram/index.ts b/src/service/telegram/index.ts index 667804e..cc44c26 100644 --- a/src/service/telegram/index.ts +++ b/src/service/telegram/index.ts @@ -101,7 +101,7 @@ export class TelegramService { * @param signal */ public stop = (signal: string) => { - if (!this.isWebhookEnabled) { + if (this.isWebhookEnabled) { return; } diff --git a/src/service/vk/handlers/JoinLeaveHandler.ts b/src/service/vk/handlers/JoinLeaveHandler.ts new file mode 100644 index 0000000..b5963fe --- /dev/null +++ b/src/service/vk/handlers/JoinLeaveHandler.ts @@ -0,0 +1,61 @@ +import { VkEventHandler } from "./VkEventHandler"; +import { GroupMemberContext } from "vk-io"; +import { NextMiddleware } from "middleware-io"; +import logger from "../../logger"; +import { UsersUserFull } from "vk-io/lib/api/schemas/objects"; +import { ConfigGroup } from "../types"; +import { ExtraReplyMessage } from "telegraf/typings/telegram-types"; + +interface Fields {} + +interface Values { + user: UsersUserFull; + group: ConfigGroup; + isJoined: boolean; + isLeave: boolean; + count: number; +} + +export class JoinLeaveHandler extends VkEventHandler { + public execute = async ( + context: GroupMemberContext, + next: NextMiddleware + ) => { + const user = await this.getUserByID(String(context.userId)); + const dir = context.isJoin ? "joined" : "left"; + const count = await this.getMembersCount(); + + logger.debug( + `vk, group ${this.group.name}: ${user.first_name} ${user.last_name} ${dir} the group` + ); + + const parsed = this.template.theme({ + user, + group: this.group, + isJoined: context.isJoin, + isLeave: context.isLeave, + count, + }); + + const extras: ExtraReplyMessage = { + parse_mode: "Markdown", + disable_web_page_preview: true, + }; + + await this.telegram.sendMessageToChan(this.channel.id, parsed, extras); + + await next(); + }; + + /** + * Returns current members count + * @private + */ + private getMembersCount = async () => { + const resp = await this.instance.api.groups.getMembers({ + group_id: this.group.id.toString(), + }); + + return resp.count; + }; +} diff --git a/src/service/vk/handlers/MessageNewHandler.ts b/src/service/vk/handlers/MessageNewHandler.ts index 16e9f13..eac5791 100644 --- a/src/service/vk/handlers/MessageNewHandler.ts +++ b/src/service/vk/handlers/MessageNewHandler.ts @@ -42,6 +42,7 @@ export class MessageNewHandler extends VkEventHandler { const extras: ExtraReplyMessage = { parse_mode: "Markdown", + disable_web_page_preview: true, }; this.appendButtons(extras, user.id); diff --git a/src/service/vk/handlers/index.ts b/src/service/vk/handlers/index.ts index 9514ac4..2d4e814 100644 --- a/src/service/vk/handlers/index.ts +++ b/src/service/vk/handlers/index.ts @@ -7,6 +7,7 @@ import { TelegramService } from "../../telegram"; import { Template } from "../../template"; import { PostNewHandler } from "./PostNewHandler"; import { Storage } from "../../db"; +import { JoinLeaveHandler } from "./JoinLeaveHandler"; interface Handler { new ( @@ -22,8 +23,8 @@ interface Handler { } export const vkEventToHandler: Record = { - [VkEvent.GroupJoin]: StubHandler, - [VkEvent.GroupLeave]: StubHandler, + [VkEvent.GroupJoin]: JoinLeaveHandler, + [VkEvent.GroupLeave]: JoinLeaveHandler, [VkEvent.MessageNew]: MessageNewHandler, [VkEvent.WallPostNew]: PostNewHandler, }; diff --git a/templates/group_join.md b/templates/group_join.md new file mode 100644 index 0000000..44bb9df --- /dev/null +++ b/templates/group_join.md @@ -0,0 +1,9 @@ +--- +--- +{{!-- + use handlebars template here + 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}} + ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ΅. Участники: {{count}}. diff --git a/templates/group_leave.md b/templates/group_leave.md new file mode 100644 index 0000000..23dc366 --- /dev/null +++ b/templates/group_leave.md @@ -0,0 +1,9 @@ +--- +--- +{{!-- + use handlebars template here + 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}} + ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹. Участники: {{count}}.