{"id":15134042,"url":"https://github.com/xtcry/nestjs-vk","last_synced_at":"2025-10-23T09:31:27.511Z","repository":{"id":41986357,"uuid":"392036975","full_name":"xTCry/nestjs-vk","owner":"xTCry","description":"Modern VK API SDK module for NestJS","archived":false,"fork":false,"pushed_at":"2023-09-05T19:29:09.000Z","size":755,"stargazers_count":14,"open_issues_count":2,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-30T17:38:29.186Z","etag":null,"topics":["nest","nestjs","vk","vk-api","vk-bot","vk-io","vk-sdk","vkbot","vkontakte"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xTCry.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-08-02T17:26:49.000Z","updated_at":"2025-01-16T09:07:44.000Z","dependencies_parsed_at":"2023-02-15T08:46:47.108Z","dependency_job_id":null,"html_url":"https://github.com/xTCry/nestjs-vk","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xTCry%2Fnestjs-vk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xTCry%2Fnestjs-vk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xTCry%2Fnestjs-vk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xTCry%2Fnestjs-vk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xTCry","download_url":"https://codeload.github.com/xTCry/nestjs-vk/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237807468,"owners_count":19369597,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["nest","nestjs","vk","vk-api","vk-bot","vk-io","vk-sdk","vkbot","vkontakte"],"created_at":"2024-09-26T05:02:10.860Z","updated_at":"2025-10-23T09:31:22.129Z","avatar_url":"https://github.com/xTCry.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NestJS VK\n\n[![npm](https://img.shields.io/npm/v/nestjs-vk.svg?style=flat-square)](https://www.npmjs.com/package/nestjs-vk)\n[![NPM](https://img.shields.io/npm/dt/nestjs-vk.svg?style=flat-square)](https://www.npmjs.com/package/nestjs-vk)\n[![GitHub last commit](https://img.shields.io/github/last-commit/xtcry/nestjs-vk)](https://github.com/xtcry/nestjs-vk)\n\n\u003cimg src=\"https://nestjs.com/img/logo-small.svg\" title=\"NestJS logotype\" align=\"right\" width=\"95\" height=\"148\"\u003e\n\n**NestJS VK** – powerful solution for creating VK bots.\n\nThis package uses the best of the NodeJS world under the hood. [VK-IO](https://github.com/negezor/vk-io) is a powerful Node.js module that allows you to easily interact with the VK API and for creating bots, and [NestJS](https://github.com/nestjs) is a progressive framework for creating well-architectured applications.\n\nThis module provides a quick and easy way to interact with the VK API and create VK bots and deep integration with your NestJS application.\n\n**Features**\n\n- Simple. Easy to use.\n- Ability to create custom decorators.\n- Scenes support.\n- Ability to run multiple bots simultaneously.\n- Full support of NestJS guards, interceptors, filters and pipes!\n\n## Installation\n\n#### NPM\n\n```bash\n$ npm i nestjs-vk vk-io\n```\n\n#### Yarn\n\n```bash\n$ yarn add nestjs-vk vk-io\n```\n\n## Usage\n\nOnce the installation process is complete, we can import the `VkModule` into the root `AppModule`:\n\n```typescript\nimport { Module } from '@nestjs/common';\nimport { VkModule } from 'nestjs-vk';\n\nimport { AppUpdate } from './app.update';\nimport { SimpleScene } from './scene/simple.scene';\n\n@Module({\n  imports: [\n    VkModule.forManagers({\n      useSessionManager: false,\n      useSceneManager: false,\n      useHearManager: false,\n    }),\n    VkModule.forRootAsync({\n      inject: [MainMiddleware],\n      useFactory: async (mainMiddleware: MainMiddleware) =\u003e ({\n        token: process.env.VK_BOT_TOKEN,\n        options: {\n            pollingGroupId: +process.env.VK_BOT_GROUP_ID,\n            apiMode: 'sequential',\n        },\n        // launchOptions: false,\n        // notReplyMessage: true,\n        middlewaresBefore: [mainMiddleware.middlewaresBefore],\n        middlewaresAfter: [mainMiddleware.middlewaresAfter],\n      }),\n    }),\n    // VkModule.forRoot({\n    //   token: process.env.VK_BOT_TOKEN,\n    //   options: {\n    //     pollingGroupId: +process.env.VK_BOT_GROUP_ID,\n    //     apiMode: 'sequential',\n    //   },\n    // }),\n  ],\n  providers: [MainMiddleware, AppUpdate, SimpleScene],\n  exports: [MainMiddleware],\n})\nexport class AppModule {}\n```\n\n\nMain middleware `main.middleware.ts`:\n\n```typescript\nimport { Inject, Injectable } from '@nestjs/common';\nimport { VK_HEAR_MANAGER, VK_SCENE_MANAGER } from 'nestjs-vk';\nimport { MessageContext, Context, Composer } from 'vk-io';\nimport { HearManager } from '@vk-io/hear';\nimport { SessionManager } from '@vk-io/session';\nimport { SceneManager } from '@vk-io/scenes';\n\n@Injectable()\nexport class MainMiddleware {\n  private readonly sessionManager: SessionManager;\n  @Inject(VK_HEAR_MANAGER)\n  private readonly hearManagerProvider: HearManager\u003cMessageContext\u003e;\n  @Inject(VK_SCENE_MANAGER)\n  private readonly sceneManager: SceneManager;\n\n  constructor() {\n    this.sessionManager = new SessionManager({\n      // ...\n    });\n  }\n\n  get middlewaresBefore() {\n    const composer = Composer.builder\u003cContext\u003e();\n\n    composer.use(this.sessionManager.middleware);\n    composer.use(this.sceneManager.middleware);\n\n    return composer.compose();\n  }\n\n  get middlewaresAfter() {\n    const composer = Composer.builder\u003cContext\u003e();\n\n    composer.use(this.hearManagerProvider.middleware);\n\n    return composer.compose();\n  }\n}\n```\n\nThen create `app.update.ts` file and add some decorators for handling VK bot API updates:\n\n```typescript\nimport { InjectVkApi, Update, Ctx, Message, Hears, HearFallback } from 'nestjs-vk';\nimport { MessageContext, VK } from 'vk-io';\n\nimport { AppService } from './app.service';\nimport { SIMPLE_SCENE } from './vk.constants';\n\n@Update()\nexport class AppUpdate {\n  public groupId: number;\n\n  constructor(\n    @InjectVkApi()\n    private readonly vk: VK,\n    private readonly appService: AppService,\n  ) {}\n\n  async onModuleInit() {\n    try {\n      const [group] = await this.vk.api.groups.getById({});\n      this.groupId = group.id;\n    } catch (err) {\n      console.error(err);\n    }\n  }\n\n  @Hears(/^\\/?(start|старт)$/i)\n  async onStartCommand(@Ctx() ctx: MessageContext) {\n    await ctx.reply('Welcome');\n  }\n\n  @Hears('hi')\n  async hearsHi(@Ctx() ctx: MessageContext) {\n    return 'Hey there';\n  }\n\n  @Hears(/scene( ?(?\u003cstate\u003e[0-9]+))?$/i)\n  async hearsScene(@Ctx() ctx: MessageContext) {\n    const stateNumber = ((e) =\u003e (isNaN(Number(e)) ? null : Number(e)))(ctx.$match?.groups?.state);\n    ctx.scene.enter(SIMPLE_SCENE, { state: { stateNumber } });\n  }\n\n  @Hears(['/sub', 'subscriber'])\n  async onSubscriberCommand(@Ctx() ctx: MessageContext) {\n    const isSib = await this.vk.api.groups.isMember({\n      group_id: String(this.groupId),\n      user_id: ctx.senderId,\n    });\n    return isSib ? 'So good!' : 'No sub';\n  }\n\n  @HearFallback()\n  onHearFallback(@Ctx() ctx: MessageContext, @Message('text') text: string) {\n    if (text) {\n      return this.appService.echo(text);\n    } else if (ctx.hasAttachments('sticker')) {\n      ctx.send({ sticker_id: ctx.getAttachments('sticker')[0].id % 24 });\n      return;\n    }\n\n    return 'What?..';\n  }\n}\n```\n\nFor a simple scene, let's create an `simple.scene.ts` file and do a few steps for it:\n\n```typescript\nimport { Scene, AddStep, Ctx, SceneEnter, SceneLeave } from 'nestjs-vk';\nimport { MessageContext } from 'vk-io';\nimport { IStepContext } from '@vk-io/scenes';\n\nimport { SIMPLE_SCENE } from './vk.constants';\n\n@Scene(SIMPLE_SCENE)\nexport class SimpleScene {\n  @SceneEnter()\n  async onSceneEnter(@Ctx() ctx: IStepContext) {\n    const { stateNumber } = ctx.scene.state;\n    await ctx.reply(\n      `Hello! I am a simple scene. Your state number is ${stateNumber}.\\n` +\n        ` You can send me a number and I will multiply it by 2.`,\n    );\n  }\n\n  @SceneLeave()\n  async onSceneLeave(@Ctx() ctx: IStepContext) {\n    await ctx.reply('Bye!');\n  }\n\n  // @Hears('exit')\n  // async onHearsExit(@Ctx() ctx: IStepContext) {\n  //   await ctx.scene.leave();\n  // }\n\n  @AddStep()\n  async onAddStep(@Ctx() ctx: IStepContext) {\n    let { stateNumber: number } = ctx.scene.state;\n\n    if (!ctx.scene.step.firstTime) {\n      number = Number(ctx.text);\n    }\n\n    if (ctx.scene.step.firstTime \u0026\u0026 number === null) {\n      await ctx.reply('Please send me a number.');\n      return;\n    }\n\n    if (isNaN(number)) {\n      await ctx.reply('Wrong. Please send me a number.');\n      return;\n    }\n\n    await ctx.reply(`Your number multiplied by 2 is ${number * 2}.`);\n\n    if (number \u003e 20 \u0026\u0026 number % 2 === 0) {\n      await ctx.scene.leave();\n    }\n  }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxtcry%2Fnestjs-vk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxtcry%2Fnestjs-vk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxtcry%2Fnestjs-vk/lists"}