UNPKG

31.7 kBMarkdownView Raw
1# LSK.js – bots
2
3> @lskjs/bots – LSK.js module for telegram, slack, discord, whatsapp, twitter, instagram and vk bots creation
4
5[![LSK logo](https://badgen.net/badge/icon/MADE%20BY%20LSK?icon=zeit\&label\&color=red\&labelColor=red)](https://github.com/lskjs)
6[![NPM version](https://badgen.net/npm/v/@lskjs/bots)](https://www.npmjs.com/package/@lskjs/bots)
7[![NPM downloads](https://badgen.net/npm/dt/@lskjs/bots)](https://www.npmjs.com/package/@lskjs/bots)
8[![NPM Dependency count](https://badgen.net/bundlephobia/dependency-count/@lskjs/bots)](https://bundlephobia.com/result?p=@lskjs/bots)
9[![Have TypeScript types](https://badgen.net/npm/types/@lskjs/bots)](https://www.npmjs.com/package/@lskjs/bots)
10[![Have tree shaking](https://badgen.net/bundlephobia/tree-shaking/@lskjs/bots)](https://bundlephobia.com/result?p=@lskjs/bots)
11[![NPM Package size](https://badgen.net/bundlephobia/minzip/@lskjs/bots)](https://bundlephobia.com/result?p=@lskjs/bots)
12[![Package size](https://badgen.net//github/license/lskjs/lskjs)](https://github.com/lskjs/lskjs/blob/master/LICENSE)
13[![Ask us in Telegram](https://img.shields.io/badge/Ask%20us%20in-Telegram-brightblue.svg)](https://t.me/lskjschat)
14
15<!-- template file="scripts/templates/preview.md" start -->
16
17<!-- template end -->
18
19***
20
21<!-- # 📒 Table of contents -->
22
23# Table of contents
24
25* [⌨️ Install](#️-install)
26
27* [Bots Plugin Portal](#bots-plugin-portal)
28
29 * [Правила (rules)](#правила-rules)
30
31 * [`cron`](#cron)
32 * [`criteria`](#criteria)
33 * [`action`](#action)
34
35 * [Параметры, используемые при настройке критериев:](#параметры-используемые-при-настройке-критериев)
36
37 * [Список действий, которые реализованы в плагине:](#список-действий-которые-реализованы-в-плагине)
38
39 * [createMessage](#createmessage)
40 * [messageAppend](#messageappend)
41 * [messageTrim](#messagetrim)
42 * [messageEditExtra](#messageeditextra)
43 * [messageAddExtra](#messageaddextra)
44 * [sendMessage](#sendmessage)
45 * [reply](#reply)
46 * [repost](#repost)
47 * [copyMessage](#copymessage)
48 * [remove](#remove)
49 * [findMessage](#findmessage)
50 * [pinChatMessage](#pinchatmessage)
51 * [messageSplit](#messagesplit)
52 * [messagesJoin](#messagesjoin)
53 * [checkInterview](#checkinterview)
54 * [replyInterview](#replyinterview)
55
56* [Bots Plugin Interview](#bots-plugin-interview)
57
58 * [Interview](#interview)
59 * [Portal](#portal)
60
61* [📖 License](#-license)
62
63* [👥 Contributors](#-contributors)
64
65* [👏 Contributing](#-contributing)
66
67* [📮 Any questions? Always welcome :)](#-any-questions-always-welcome-)
68
69# ⌨️ Install
70
71```sh
72# yarn
73yarn i @lskjs/bots @lskjs/db axios bluebird lodash
74
75# npm
76npm i @lskjs/bots @lskjs/db axios bluebird lodash
77```
78
79***
80
81# Bots Plugin Portal
82
83**Bots Plugin Portal** (*@lskjs/bots-plugin-portal*) - плагин, позволяющий настраивать реакции бота на различные триггеры.
84
85Конфиг плагина находится по пути `bots.plugins.portal` и имеет вид:
86
87```js
88bots: {
89 plugins: {
90 portal: {
91 group: true,
92 rules: [
93 //...
94 ],
95 },
96 },
97},
98```
99
100**Params:**
101
102| Field | Type | Desription |
103| ------ | :------: | ------ |
104| group | Boolean | Группировать ли медиа-файлы |
105| rules | Array of Objects | Массив правил, которым следует бот при обработке входящих сообщений или при срабатывании крона |
106
107**Group values:**
108
109| Field | Value | Description |
110| ------ | :------: | ------ |
111| group | true | Группирует медиа-файлы в одно сообщение и помещает их в `ctx.group` |
112| group | false | Медиа-файлы приходят на сервер разными сообщениями |
113
114 /Reference/: При отправке боту нескольких медиа-файлов одним сообщением, на сервер медиа-файлы приходят разными сообщениями. Т.е. при отправке 5 изображений одним сообщением, на сервер приходит не одно сообщение, а 5.
115
116***
117
118## Правила (rules)
119
120Правила позволяют устанавливать триггеры на действия пользователей или на срабатывание крона. Представляют из себя объекты и могут быть вложены друг в друга.
121
122**Правила состоят из 3-х частей:**
123| Rule Part | Type | Required | Description |
124| ------ | :------: | :------: | ------ |
125| cron | Array of String\String | - | Позволяет устанавливать расписания срабатываний экшона |
126|criteria| Object | - | Критерии срабатывания экшона при обработке действий пользователя |
127| action | Object | + | Экшоны. Описания действий, которые выполняет бот |
128
129### `cron`
130
131Параметр позволяет устанавливать время срабатывания действия бота. Например, если необходимо установить отправку сообщений в чат каждую минуту, то конфиг будет выглядеть `cron: '* * * * *'`.
132
133Официальный пакет крона: [node-cron - npm](https://www.npmjs.com/package/node-cron)
134
135### `criteria`
136
137Параметр позволяет устанавливать критерии на триггеры срабатывания бота. Например, если необходимо, чтобы бот реагировал только на сообщения в определенном чате, то критерий будут выглядеть `chatId: 12345678`.
138
139Если criteria отсутствует, то правила могут срабатывать только по крону. Если же `criteria: {}`, то считается, что критерий отбора нет и правила будут срабатывать на любые взаимодействия с ботом.
140
141### `action`
142
143Параметр задает действия бота. Здесь настраивается, будет бот искать сообщения, оправлять или удалять их и тд.
144
145Действия могут быть вложенными и составлять цепочки при помощи полей `then` и `else`. При удачном выполнении действия-родителя бот будет выполнять действия из поля `then`. При неудачном - `else`. Аналогия с if/else, где if - then, а else - else. Например, при проверке checkMessage, если сообщение существует, то бот пройдет по ветке `then`, в противном случае по `else`.
146
147Кроме вложенности, action/then могут быть массивами и содержать параллельные действия.
148
149**Examples:**
150
151```js
152{
153 cron: '* * * * *',
154 criteria: {
155 chatId: 12345678,
156 },
157 action: {
158 type: 'checkMessage',
159 chatId: -123114346456,
160 userId: 12345678,
161 then: {
162 type: 'sendMessage',
163 text: 'some text by true checkMessage',
164 to: 12345678,
165 },
166 else: {
167 type: 'sendMessage',
168 text: 'some text by false checkMessage',
169 to: 12345678,
170 },
171 },
172},
173```
174
175```js
176{
177 cron: ['*/20 * * * *', '*/15 * * * * *'],
178 action: [
179 {
180 type: 'sendMessage',
181 text: 'some text 1',
182 to: 12345678,
183 },
184 {
185 type: 'sendMessage',
186 text: 'some text 2',
187 to: -87654321123,
188 },
189 ],
190}
191```
192
193```js
194{
195 criteria: {
196 chatId: 12345678,
197 },
198 action: {
199 type: 'reply',
200 text: 'some text by reply',
201 },
202},
203```
204
205## Параметры, используемые при настройке критериев:
206
207| Criteria Field | Type | Values | Description |
208| ------ | :------: | ------ | ------ |
209| userId | Array of Number\Array of String\Number\String | | ID пользователя, который взаимодействует с ботом |
210| chatId | Array of Number\Array of String\Number\String | | ID чата, в котором происходит взаимодействие с ботом |
211| chatType | String | private\group\supergroup\channel | Тип чата, в котором происходит взаимодействие |
212| messageType | String | | Тип сообщения. Различают множество типов сообщений |
213| messageText | String\RegExp | | Текст сообщения. Например, можно сделать критерий на команду запуска бота `messageText: /start` |
214| nextRoute | String\RegExp | | Следующий роут. Используется только при заполнении формы. Необходимо устанавливать данный критерий для блокировки каких-либо действий во время заполнения формы в целях избежать спама и лишних триггеров. |
215
216**Chat types:**
217
2181. `private` - личные диалог с ботом
2192. `group` - общий чат
2203. `supergroup` - общий чат
2214. `channel` - канал
222
223**Message types:**
224
2251. `mediaGroup` - группа медиа-файлов
2262. `audio` - приложен аудио-файл
2273. `document` - приложен документ
2284. `animation` - гифка
2295. `photo` - приложено изображение
2306. `sticker` - стикер
2317. `video` - приложено видео
2328. `video_note` - видео-кружочек
2339. `voice` - голосовое сообщение
23410. `contact` - контакт
23511. `dice` - игральная кость
23612. `game` - игра
23713. `poll` - голосование
23814. `quiz` - викторина
23915. `location` - геоданные
24016. `venue` - место
24117. `text` - текстовое сообщение
242
243## Список действий, которые реализованы в плагине:
244
2451. [createMessage](#createMessage) - создание сообщений
2462. [messageAppend](#messageAppend) - добавление текста в конец
2473. [messageTrim](#messageTrim) - фильтр текста
2484. [messageEditExtra](#messageEditExtra) - редактирование кнопок
2495. [messageAddExtra](#messageAddExtra) - добавление кнопок
2506. [sendMessage](#sendMessage) - отправка сообщений
2517. [reply](#reply) - реплай
2528. [repost](#repost) - репост
2539. [copyMessage](#copyMessage) - копирование сообщений
25410. [remove](#remove) - удаление сообщений
25511. [findMessage](#findMessage) - поиск сообщения
25612. [pinChatMessage](#pinChatMessage) - закрепление сообщения
25713. [messageSplit](#messageSplit) - разделение сообщения на элементы
25814. [messagesJoin](#messagesJoin) - группировка сообщений в одно
25915. [checkInterview](#checkInterview) - проверка заполнения формы
26016. [replyInterview](#replyInterview) - отправка формы
261
262### createMessage
263
264**createMessage** - действие бота, необходимое для создания сообщения и последующего редактирования перед отправкой. После создания сообщения, к нему можно добавить/изменить кнопки, отредактировать его текст и тд.
265
266При срабатывании createMessage от крона, создается пустое сообщение, которое можно заполнять различным контентом.<br/>
267При срабатывании createMessage от действия пользователя, сообщение создается на основе входящих данных. Т.е. в текст созданного сообщения помещается текст, написанный пользователем. С кнопками и файлами происходят аналогичные действия.
268
269**Params:**
270
271| Field | Type | Description |
272| ------ | :------: | ------ |
273| text | String | текст сообщения |
274| to | Array of Number\Array of String\Number\String | ID чата, в который будет отправлено сообщение |
275
276**Example:**
277
278```js
279{
280 criteria: {},
281 action: {
282 type: 'createMessage',
283 text: "It's field from message text",
284 to: 12345678,
285 },
286},
287```
288
289### messageAppend
290
291**messageAppend** - действие бота, позволяющее добавить текст в конец сообщения.
292
293**Params:**
294
295| Field | Type | Description |
296| ------ | :------: | ------ |
297| text | String | Добавочный текст |
298
299**Example:**
300
301```js
302{
303 criteria: {
304 messageText: /\/trim/,
305 },
306 action: {
307 type: 'messageAppend',
308 text: 'by @download4bot',
309 then: {
310 type: 'repost',
311 to: 12345678,
312 },
313 },
314},
315
316```
317
318### messageTrim
319
320**messageTrim** - действие бота, позволяющее отфильтровать текст сообщения.
321
322**Params:**
323
324| Field | Type | Description |
325| ------ | :------: | ------ |
326| hashtags | Boolean |Удаляет все хештеги из текста сообщения |
327| links | Boolean | Удаляет все ссылки из текста сообщения |
328| regExp | RegExp | Позволяет удалять любые пользовательские шаблоны из текста сообщения |
329
330**Example:**
331
332```js
333{
334 criteria: {
335 messageText: /\/trim/,
336 },
337 action: {
338 type: 'messageTrim',
339 hashtags: 1,
340 links: 1,
341 regExp: /1?123\n?/,
342 then: {
343 type: 'repost',
344 to: 12345678,
345 },
346 },
347},
348
349```
350
351### messageEditExtra
352
353**messageEditExtra** - действие бота, позволяющее отредактировать клавиатуру сообщения.
354
355**Params:**
356
357| Field | Type | Description |
358| ------ | :------: |------ |
359| extra | Array | Содержит редактируемые кнопки клавиатуры |
360
361**Extra params for type *LIKE***:
362
363| Field | Type | Required | Description |
364| ------ | :------: | :------: | ------ |
365| type | String | + | Кнопки лайк/дисслайк к сообщению |
366| buttons | Array | - | Содержит редактируемые кнопки клавиатуры |
367| buttons.disslike | Object | - | Настройка кнопки дисслайка |
368| buttons.like | Object | - | Настройка кнопки дисслайка |
369
370**Extra params for type *ANSWER***:
371
372| Field | Type | Required | Description |
373| ------ | :------: | :------: | ------ |
374| type | String | + | Кнопка для установления соединения с другим пользователем через бота (чат) |
375| text | String | - | Настройка текста кнопки |
376
377**Extra params for type *SENDER***:
378
379| Field | Type | Required | Description |
380| ------ | :------: | :------: | ------ |
381| type | String | + | Кнопка для перехода к отправителю сообщения |
382| text | String | - | Настройка текста кнопки |
383
384**Example:**
385
386```js
387{
388 criteria: {}
389 action: {
390 type: 'createMessage',
391 text: 'Title text',
392 then: {
393 type: 'messageEditExtra',
394 extra: [
395 {
396 type: 'like',
397 buttons: {
398 disslike: {
399 title: 'test 💔', // default: '💔'
400 value: 10, // default: 0
401 },
402 like: {
403 title: 'test ❤️', // default: '❤️'
404 value: 0, // default: 0
405 },
406 },
407 },
408 {
409 type: 'answer',
410 text: 'Answer @{ {username} }', // default: '@username'
411 },
412 {
413 type: 'sender',
414 text: 'Sender: @{ {username} }', // default: '@username'
415 },
416 ],
417 then: {
418 type: 'sendMessage',
419 to: 12345678,
420 },
421 },
422 },
423},
424```
425
426### messageAddExtra
427
428**messageAddExtra** - действие бота, позволяющее добавить новую клавиатуру сообщения. Если клавиатура уже существует, то messageAddExtra заменит текущую на новую.
429
430**Params:**
431| Field | Type | Description |
432| ------ | :------: | ------ |
433| extra | Array | Содержит редактируемые кнопки клавиатуры |
434
435**Extra params for type *LIKE***:
436
437| Field | Type | Required | Description |
438| ------ | :------: | :------: | ------ |
439| type | String | + | Кнопки лайк/дисслайк к сообщению |
440| buttons | Array | - | Содержит редактируемые кнопки клавиатуры |
441| buttons.disslike | Object | - | Настройка кнопки дисслайка |
442| buttons.like | Object | - | Настройка кнопки дисслайка |
443
444**Extra params for type *ANSWER***:
445
446| Field | Type | Required | Description |
447| ------ | :------: | :------: | ------ |
448| type | String | + | Кнопка для установления соединения с другим пользователем через бота (чат) |
449| text | String | - | Настройка текста кнопки |
450
451**Extra params for type *SENDER***:
452
453| Field | Type | Required | Description |
454| ------ | :------: | :------: | ------ |
455| type | String | + | Кнопка для перехода к отправителю сообщения |
456| text | String | - | Настройка текста кнопки |
457
458**Example:**
459
460```js
461{
462 criteria: {}
463 action: {
464 type: 'createMessage',
465 text: 'Title text',
466 then: {
467 type: 'messageAddExtra',
468 extra: [
469 {
470 type: 'like',
471 buttons: {
472 disslike: {
473 title: 'New disslike 💔', // default: '💔'
474 value: 10, // default: 0
475 },
476 like: {
477 title: 'New like ❤️', // default: '❤️'
478 value: 0, // default: 0
479 },
480 },
481 },
482 {
483 type: 'answer',
484 text: 'Answer @{ {username} }', // default: '@username'
485 },
486 {
487 type: 'sender',
488 text: 'Sender: @{ {username} }', // default: '@username'
489 },
490 ],
491 then: {
492 type: 'sendMessage',
493 to: 12345678,
494 },
495 },
496 },
497},
498```
499
500### sendMessage
501
502**sendMessage** - действие бота, при котором бот отправляет сообщение заданному пользователю. Для настройки сообщения используется цепочка действий: `createMessage` -> `messageAddExtra` -> `messageAppend` -> `messageTrim` -> `sendMessage`.
503
504**Params:**
505
506| Field | Type | Required | Description |
507| ------ | :------: | :------: | ------ |
508| text | String | - | Текст сообщения |
509| to | Array of String/Array of Number/String/Number | - | ID получателя(-ей) |
510
511**Example:**
512
513```js
514{
515 criteria: {},
516 action: {
517 type: 'createMessage',
518 then: {
519 type: 'sendMessage',
520 text: 'Text by sendMessage',
521 to: 12345678,
522 },
523 },
524},
525```
526
527### reply
528
529**reply** - действие бота, при котором бот отвечает на сообщение пользователя.
530
531**Params:**
532
533| Field | Type | Required | Description |
534| ------ | :------: | :------: | ------ |
535| text | String | - | Текст сообщения |
536
537**Example:**
538
539```js
540{
541 criteria: {
542 messageText: 'ping',
543 },
544 action: {
545 type: 'reply',
546 text: 'pong',
547 },
548},
549```
550
551### repost
552
553**repost** - действие бота, при котором бот пересылает активное сообщение в заданных чат.
554
555**Params:**
556
557| Field | Type | Required | Description |
558| ------ | :------: | :------: | ------ |
559| to | Array of String/Array of Number/String/Number | - | ID получателя(-ей) |
560
561**Example:**
562
563```js
564{
565 criteria: {
566 chatId: -136512436512436,
567 },
568 action: {
569 type: 'repost',
570 to: 12345678,
571 },
572},
573```
574
575### copyMessage
576
577**sendMessage** - действие бота, при котором бот копирует активное сообщение и пересылает его в заданных чат.
578
579**Params:**
580
581| Field | Type | Required | Description |
582| ------ | :------: | :------: | ------ |
583| to | Array of String/Array of Number/String/Number | - | ID получателя(-ей) |
584
585**Example:**
586
587```js
588{
589 criteria: {
590 chatId: -136512436512436,
591 },
592 action: {
593 type: 'copyMessage',
594 to: 12345678,
595 },
596},
597```
598
599### remove
600
601**remove** - действие бота, при котором бот удаляет активное сообщение. Активным сообщением является полученное сообщение, либо найденное при помощи findMessage.
602
603**Example:**
604
605```js
606{
607 criteria: {
608 messageText: 'попит',
609 },
610 action: {
611 type: 'remove',
612 },
613},
614```
615
616### findMessage
617
618**findMessage** - действие бота, позволяющее найти сообщение в чате по заданным параметрам. Поиск осуществляется в модели `BotsTelegramMessageModel`.
619
620**Params:**
621
622| Field | Type | Required | Description |
623| ------ | :------: | :------: | ------ |
624| random | Boolean | - | Если нашлось несколько сообщений, выбирать ли случайное. По умолчанию: последнее полученное ботом сообщение. |
625| criteria | Object | - | Критерии поиска сообщения в базе |
626| criteria.userId | Array of Number\Array of String\Number\String | - | ID пользователя |
627| criteria.chatId | Array of Number\Array of String\Number\String | - | ID чата |
628| criteria.chatType | String | - | Тип чата |
629| criteria.messageType | String | - | Тип сообщения |
630| criteria.messageDate | Number | - | Дата сообщения в ms |
631| criteria.messageText | String\RegExp | - | Текст сообщения |
632| criteria.messageId | String\RegExp | - | ID сообщения |
633
634**Example:**
635
636```js
637{
638 criteria: {
639 messageText: '/checkMessage',
640 },
641 action: {
642 type: 'findMessage',
643 criteria: {
644 chatId: -1232343354655,
645 messageText: '*message.text',
646 },
647 then: {
648 type: 'repost',
649 to: 12345678,
650 },
651 },
652},
653```
654
655### pinChatMessage
656
657**pinChatMessage** - действие бота, при котором бот закрепляет активное сообщение. Активным сообщением является полученное сообщение, либо сообщение после `findMessage`/`createMessage`.
658
659**Example:**
660
661```js
662{
663 criteria: {
664 messageText: /^#закрепить.*/,
665 },
666 action: {
667 type: 'pinChatMessage',
668 },
669},
670```
671
672### messageSplit
673
674**messageSplit** - действие бота, позволяющее разделять входящее сообщение на элементы для последующей работы. Например, если пользователь пишет боту сообщение, содержащее 5 изображений и подпись, то бот разделит сообщение на 6 элементов.
675
676**Example:**
677
678```js
679{
680 criteria: {},
681 action: {
682 type: 'messageSplit',
683 then: {
684 type: 'sendMessage',
685 to: 12345678,
686 },
687 },
688},
689```
690
691### messagesJoin
692
693**messagesJoin** - действие бота, позволяющее объединять несколько сообщений, переданных боту (например, пересылая сообщения). Если среди сообщений несколько подписей, то они объединятся в единый текст.
694
695**Example:**
696
697```js
698{
699 criteria: {},
700 action: {
701 type: 'messagesJoin',
702 then: {
703 type: 'sendMessage',
704 to: 12345678,
705 },
706 },
707},
708```
709
710### checkInterview
711
712**checkInterview** - действие бота для проверки, заполнил ли пользователь необходимые формы.
713
714**Params:**
715
716| Field | Type | Description |
717| ------ | :------: | ------ |
718| type | String | Тип действия бота. Запускает проверку на заполненность формы |
719| forms | Array of String/String | Список с названиями форм, которые следует заполнить для прохождения проверки |
720
721**Example:**
722
723```js
724{
725 criteria: {
726 messageText: /^(?!\/registration).*$/,
727 nextRoute: /^(?!\/interview).*$/,
728 },
729 action: {
730 type: 'checkInterview',
731 forms: ['intro'],
732 then: [
733 type: 'reply',
734 text: 'Успех!',
735 ],
736 else: {
737 type: 'reply',
738 text: 'Необходима регистрация! /registration'
739 },
740 },
741},
742```
743
744### replyInterview
745
746**replyInterview** - действие бота для отправки формы пользователю.
747
748**Params:**
749
750| Field | Type | Value | Description |
751| ------ | :------: | ------ | ------ |
752| type | String | | Тип действия бота. Отправляет форму пользователю |
753| formName | String | | Название формы, которая будет отправлена пользователю |
754| mode | String | form/dialog | Режим работы формы |
755| preview | Boolean | | Параметр, который указывает, необходимо ли выводить title формы перед вводом данных |
756| autosubmit | Boolean | | Параметр, который указывает, необходимо ли подтверждение данных формы |
757
758**Example:**
759
760```js
761{
762 criteria: {
763 chatType: 'private',
764 messageText: '/registration',
765 },
766 action: {
767 type: 'replyInterview',
768 formName: 'intro',
769 mode: 'form',
770 preview: false,
771 autosubmit: false,
772 then: {
773 type: 'reply',
774 text: 'Успех!',
775 },
776 },
777},
778```
779
780# Bots Plugin Interview
781
782**Bots Plugin Interview** (*@lskjs/bots-plugin-interview*) - плагин, позволяющий создавать формы ввода в боте. Реализована вариация с классической браузерной формой с подтверждением введенных данных. Режим диалога находится в стации разработки.
783
784Конфиг для плагина состоит из двух частей - interview и portal. Interview отвечает за настройку формы, её полей и их валидацию. Portal реализует взаимодействие с формой. Например, при каких действиях пользователя будет вызвана форма.
785
786Входные данные сохраняются в базу и хранятся в модели `BotsTelegramUserModel`. Путь в модели `meta.interview.[formName]`.
787
788## Interview
789
790Конфиг для настройки формы, её полей и их валиацию.
791
792`bot/plugins/interview/forms` - обязательный путь до форм.
793
794**Params:**
795
796| Field | Type | Description |
797| ------ | :------: | ------ |
798| intro | String | Название формы. Название формы должно быть уникально и используется в portal-части для коннекта с формой |
799| intro.title | String | Текст, который видит пользователь при появлении формы |
800| intro.controls | Object | Поля формы, которые будут заполняться пользователем |
801| controls.\[name/city/age] | String | Названия полей формы внутри конфига |
802| controls.name.title | String | Название поля формы, которое видит пользователь в `intro.title` |
803| controls.name.placeholder | String | Текст, выводимый перед заполнением поля формы |
804| controls.name.format | Func | Валидация входных данных |
805| intro.fields | Array of String | Массив с активными полями формы |
806
807**Example:**
808
809```js
810bots: {
811 plugins: {
812 interview: {
813 forms: {
814 intro: {
815 title: 'Добро пожаловать. Для продолжения пройдите краткую регистрацию!',
816 controls: {
817 name: {
818 title: 'Имя',
819 placeholder: 'Введите имя',
820 format: String,
821 },
822 city: {
823 title: 'Город',
824 placeholder: 'Введите город',
825 },
826 age: {
827 title: 'Возраст',
828 placeholder: 'Введите ваш возраст',
829 format: Number,
830 },
831 },
832 fields: ['name', 'city', 'age'],
833 },
834 },
835 },
836 },
837},
838```
839
840## Portal
841
842*см. Bost Plugin Portal - checkInterview & replyInterview.*
843
844# 📖 License
845
846This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details
847
848# 👥 Contributors
849
850<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
851
852<!-- prettier-ignore-start -->
853
854<!-- markdownlint-disable -->
855
856<table>
857 <tr>
858 <td align="center"><a href="https://isuvorov.com"><img src="https://avatars2.githubusercontent.com/u/1056977?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Igor Suvorov</b></sub></a><br /><a href="lskjs/lskjs///commits?author=isuvorov" title="Code">💻</a> <a href="#design-isuvorov" title="Design">🎨</a> <a href="#ideas-isuvorov" title="Ideas, Planning, & Feedback">🤔</a></td>
859 </tr>
860</table>
861<!-- markdownlint-restore -->
862<!-- prettier-ignore-end -->
863<!-- ALL-CONTRIBUTORS-LIST:END -->
864
865# 👏 Contributing
866
8671. Fork it (<https://github.com/yourname/yourproject/fork>)
8682. Create your feature branch (`git checkout -b features/fooBar`)
8693. Commit your changes (`git commit -am 'feat(image): Add some fooBar'`)
8704. Push to the branch (`git push origin feature/fooBar`)
8715. Create a new Pull Request
872
873# 📮 Any questions? Always welcome :)
874
875* [Email](mailto:hi@isuvorov.com)
876* [LSK.news – Telegram channel](https://t.me/lskjs)
877* [Спроси нас в телеграме ;)](https://t.me/lskjschat)