@2byte/tgbot-framework 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +300 -300
- package/bin/2byte-cli.ts +97 -97
- package/package.json +55 -55
- package/src/cli/CreateBotCommand.ts +181 -181
- package/src/cli/GenerateCommand.ts +195 -195
- package/src/cli/InitCommand.ts +107 -107
- package/src/cli/TgAccountManager.ts +50 -50
- package/src/console/migrate.ts +82 -82
- package/src/core/ApiService.ts +20 -20
- package/src/core/ApiServiceManager.ts +63 -63
- package/src/core/App.ts +1157 -1143
- package/src/core/BotArtisan.ts +79 -79
- package/src/core/BotMigration.ts +30 -30
- package/src/core/BotSeeder.ts +66 -66
- package/src/core/Model.ts +84 -84
- package/src/core/utils.ts +2 -2
- package/src/illumination/Artisan.ts +149 -149
- package/src/illumination/InlineKeyboard.ts +61 -61
- package/src/illumination/Message2Byte.ts +255 -255
- package/src/illumination/Message2ByteLiveProgressive.ts +278 -278
- package/src/illumination/Message2bytePool.ts +107 -107
- package/src/illumination/Migration.ts +186 -186
- package/src/illumination/RunSectionRoute.ts +85 -85
- package/src/illumination/Section.ts +410 -410
- package/src/illumination/SectionComponent.ts +64 -64
- package/src/illumination/Telegraf2byteContext.ts +32 -32
- package/src/index.ts +42 -42
- package/src/libs/TelegramAccountControl.ts +1140 -1140
- package/src/libs/TgSender.ts +53 -53
- package/src/models/Model.ts +67 -67
- package/src/models/Proxy.ts +217 -217
- package/src/models/TgAccount.ts +362 -362
- package/src/models/index.ts +2 -2
- package/src/types.ts +191 -191
- package/src/user/UserModel.ts +297 -297
- package/src/user/UserStore.ts +119 -119
- package/src/workflow/services/MassSendApiService.ts +83 -80
- package/templates/bot/.env.example +33 -33
- package/templates/bot/artisan.ts +8 -8
- package/templates/bot/bot.ts +82 -82
- package/templates/bot/database/dbConnector.ts +4 -4
- package/templates/bot/database/migrate.ts +9 -9
- package/templates/bot/database/migrations/001_create_users.sql +18 -18
- package/templates/bot/database/migrations/007_proxy.sql +27 -27
- package/templates/bot/database/migrations/008_tg_accounts.sql +32 -32
- package/templates/bot/database/seed.ts +14 -14
- package/templates/bot/docs/CLI_SERVICES.md +536 -536
- package/templates/bot/docs/INPUT_SYSTEM.md +211 -211
- package/templates/bot/docs/MASS_SEND_SERVICE.md +327 -0
- package/templates/bot/docs/SERVICE_EXAMPLES.md +384 -384
- package/templates/bot/docs/TASK_SYSTEM.md +156 -156
- package/templates/bot/models/Model.ts +7 -7
- package/templates/bot/models/index.ts +1 -1
- package/templates/bot/package.json +30 -30
- package/templates/bot/sectionList.ts +9 -9
- package/templates/bot/sections/ExampleInputSection.ts +85 -85
- package/templates/bot/sections/ExampleLiveTaskerSection.ts +60 -60
- package/templates/bot/sections/HomeSection.ts +63 -63
- package/templates/bot/workflow/services/ExampleService.ts +23 -23
|
@@ -1,211 +1,211 @@
|
|
|
1
|
-
# Улучшенная система ввода пользователя
|
|
2
|
-
|
|
3
|
-
## Обзор
|
|
4
|
-
|
|
5
|
-
Система ввода была значительно улучшена для поддержки:
|
|
6
|
-
- Возможности отмены ввода пользователем
|
|
7
|
-
- Настраиваемых опций отмены при создании запроса
|
|
8
|
-
- Сохранения состояния ожидания при неверном вводе
|
|
9
|
-
- Расширенной валидации, включая файлы
|
|
10
|
-
- Гибкой системы валидации для различных типов ботов
|
|
11
|
-
|
|
12
|
-
## Основные возможности
|
|
13
|
-
|
|
14
|
-
### 1. Настройка отмены ввода
|
|
15
|
-
|
|
16
|
-
При создании запроса на ввод можно настроить возможность отмены:
|
|
17
|
-
|
|
18
|
-
```typescript
|
|
19
|
-
// Разрешить отмену (по умолчанию)
|
|
20
|
-
.requestInput("phone", {
|
|
21
|
-
validator: "phone",
|
|
22
|
-
allowCancel: true, // по умолчанию true
|
|
23
|
-
cancelButtonText: "Отмена", // текст кнопки
|
|
24
|
-
cancelAction: "home.index[cancel_wait=1]", // действие при отмене
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
// Запретить отмену (обязательный ввод)
|
|
28
|
-
.requestInputWithAwait("password", {
|
|
29
|
-
allowCancel: false, // отмена запрещена
|
|
30
|
-
errorMessage: "Пароль обязателен для ввода"
|
|
31
|
-
})
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
### 2. Сохранение состояния при ошибках
|
|
35
|
-
|
|
36
|
-
При неверном вводе пользователь остается в режиме ожидания:
|
|
37
|
-
|
|
38
|
-
```typescript
|
|
39
|
-
.requestInput("code", {
|
|
40
|
-
validator: "code",
|
|
41
|
-
errorMessage: "Неверный формат кода. Введите 5-6 цифр",
|
|
42
|
-
allowCancel: true
|
|
43
|
-
})
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
Система будет:
|
|
47
|
-
- Показывать сообщение об ошибке
|
|
48
|
-
- Увеличивать счетчик попыток
|
|
49
|
-
- Сохранять состояние ожидания
|
|
50
|
-
- Позволять отмену только если `allowCancel: true`
|
|
51
|
-
|
|
52
|
-
### 3. Валидация файлов
|
|
53
|
-
|
|
54
|
-
Поддержка загрузки и валидации файлов:
|
|
55
|
-
|
|
56
|
-
```typescript
|
|
57
|
-
.requestInput("uploadedFile", {
|
|
58
|
-
validator: "file",
|
|
59
|
-
errorMessage: "Неподдерживаемый формат файла",
|
|
60
|
-
fileValidation: {
|
|
61
|
-
allowedTypes: ['image/jpeg', 'image/png', 'application/pdf'],
|
|
62
|
-
maxSize: 10 * 1024 * 1024, // 10 МБ
|
|
63
|
-
minSize: 1024, // 1 КБ
|
|
64
|
-
},
|
|
65
|
-
allowCancel: true
|
|
66
|
-
})
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### 4. Кастомная валидация
|
|
70
|
-
|
|
71
|
-
Поддержка асинхронных валидаторов:
|
|
72
|
-
|
|
73
|
-
```typescript
|
|
74
|
-
.requestInput("customData", {
|
|
75
|
-
validator: async (value) => {
|
|
76
|
-
// Асинхронная проверка
|
|
77
|
-
const isValid = await checkInDatabase(value);
|
|
78
|
-
return isValid;
|
|
79
|
-
},
|
|
80
|
-
errorMessage: "Данные не прошли проверку"
|
|
81
|
-
})
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
## Типы валидаторов
|
|
85
|
-
|
|
86
|
-
### Встроенные валидаторы:
|
|
87
|
-
- `"number"` - числовые значения
|
|
88
|
-
- `"phone"` - российские номера телефонов (79xxxxxxxxx)
|
|
89
|
-
- `"code"` - коды подтверждения (5-6 цифр)
|
|
90
|
-
- `"file"` - файлы (с дополнительными опциями)
|
|
91
|
-
|
|
92
|
-
### Кастомные валидаторы:
|
|
93
|
-
```typescript
|
|
94
|
-
// Синхронный валидатор
|
|
95
|
-
validator: (value: string) => value.length > 5
|
|
96
|
-
|
|
97
|
-
// Асинхронный валидатор
|
|
98
|
-
validator: async (value: string) => {
|
|
99
|
-
const result = await apiCall(value);
|
|
100
|
-
return result.isValid;
|
|
101
|
-
}
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
## Примеры использования
|
|
105
|
-
|
|
106
|
-
### Базовый ввод с отменой
|
|
107
|
-
```typescript
|
|
108
|
-
async startRegistration() {
|
|
109
|
-
await this.message("Введите ваш номер телефона:")
|
|
110
|
-
.requestInput("phone", {
|
|
111
|
-
validator: "phone",
|
|
112
|
-
errorMessage: "Неверный формат. Используйте: 79000000000",
|
|
113
|
-
allowCancel: true,
|
|
114
|
-
cancelButtonText: "Отмена",
|
|
115
|
-
cancelAction: "home.index[cancel_wait=1]",
|
|
116
|
-
runSection: new RunSectionRoute().section("home").method("processPhone")
|
|
117
|
-
})
|
|
118
|
-
.send();
|
|
119
|
-
}
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
### Обязательный ввод без отмены
|
|
123
|
-
```typescript
|
|
124
|
-
async requestPassword() {
|
|
125
|
-
return await this.message("Введите пароль:")
|
|
126
|
-
.requestInputWithAwait("password", {
|
|
127
|
-
errorMessage: "Пароль не может быть пустым",
|
|
128
|
-
allowCancel: false // отмена запрещена
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### Загрузка файлов с валидацией
|
|
134
|
-
```typescript
|
|
135
|
-
async uploadDocument() {
|
|
136
|
-
await this.message("Отправьте документ (PDF, до 5 МБ):")
|
|
137
|
-
.requestInput("document", {
|
|
138
|
-
validator: "file",
|
|
139
|
-
fileValidation: {
|
|
140
|
-
allowedTypes: ['application/pdf'],
|
|
141
|
-
maxSize: 5 * 1024 * 1024,
|
|
142
|
-
minSize: 1024
|
|
143
|
-
},
|
|
144
|
-
errorMessage: "Только PDF файлы до 5 МБ",
|
|
145
|
-
allowCancel: true,
|
|
146
|
-
runSection: new RunSectionRoute().section("home").method("processDocument")
|
|
147
|
-
})
|
|
148
|
-
.send();
|
|
149
|
-
}
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### Кастомная валидация с API
|
|
153
|
-
```typescript
|
|
154
|
-
async requestUsername() {
|
|
155
|
-
await this.message("Введите желаемое имя пользователя:")
|
|
156
|
-
.requestInput("username", {
|
|
157
|
-
validator: async (username: string) => {
|
|
158
|
-
// Проверяем доступность имени через API
|
|
159
|
-
const response = await fetch(`/api/check-username/${username}`);
|
|
160
|
-
const data = await response.json();
|
|
161
|
-
return data.available;
|
|
162
|
-
},
|
|
163
|
-
errorMessage: "Это имя уже занято. Попробуйте другое.",
|
|
164
|
-
allowCancel: true,
|
|
165
|
-
runSection: new RunSectionRoute().section("user").method("processUsername")
|
|
166
|
-
})
|
|
167
|
-
.send();
|
|
168
|
-
}
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
## Обработка отмены
|
|
172
|
-
|
|
173
|
-
Отмена обрабатывается автоматически через параметр `cancel_wait`:
|
|
174
|
-
|
|
175
|
-
```typescript
|
|
176
|
-
// В конструкторе Section автоматически вызывается:
|
|
177
|
-
this.cancelUserWaitingReply();
|
|
178
|
-
|
|
179
|
-
// Который проверяет параметр cancel_wait и очищает состояние ожидания
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
## Миграция с старой системы
|
|
183
|
-
|
|
184
|
-
### Было:
|
|
185
|
-
```typescript
|
|
186
|
-
.requestInput("phone", {
|
|
187
|
-
validator: "phone",
|
|
188
|
-
errorMessage: "Неверный номер"
|
|
189
|
-
})
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
### Стало:
|
|
193
|
-
```typescript
|
|
194
|
-
.requestInput("phone", {
|
|
195
|
-
validator: "phone",
|
|
196
|
-
errorMessage: "Неверный номер",
|
|
197
|
-
allowCancel: true, // новый параметр
|
|
198
|
-
cancelButtonText: "Отмена", // настройка текста кнопки
|
|
199
|
-
cancelAction: "home.index[cancel_wait=1]" // действие при отмене
|
|
200
|
-
})
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
Старый код будет работать с настройками по умолчанию (отмена разрешена).
|
|
204
|
-
|
|
205
|
-
## Лучшие практики
|
|
206
|
-
|
|
207
|
-
1. **Всегда предоставляйте возможность отмены** для необязательных действий
|
|
208
|
-
2. **Используйте понятные сообщения об ошибках** с указанием формата
|
|
209
|
-
3. **Ограничивайте размеры файлов** для предотвращения злоупотреблений
|
|
210
|
-
4. **Используйте асинхронную валидацию** для проверок через API
|
|
211
|
-
5. **Тестируйте различные сценарии** включая отмену и повторные попытки
|
|
1
|
+
# Улучшенная система ввода пользователя
|
|
2
|
+
|
|
3
|
+
## Обзор
|
|
4
|
+
|
|
5
|
+
Система ввода была значительно улучшена для поддержки:
|
|
6
|
+
- Возможности отмены ввода пользователем
|
|
7
|
+
- Настраиваемых опций отмены при создании запроса
|
|
8
|
+
- Сохранения состояния ожидания при неверном вводе
|
|
9
|
+
- Расширенной валидации, включая файлы
|
|
10
|
+
- Гибкой системы валидации для различных типов ботов
|
|
11
|
+
|
|
12
|
+
## Основные возможности
|
|
13
|
+
|
|
14
|
+
### 1. Настройка отмены ввода
|
|
15
|
+
|
|
16
|
+
При создании запроса на ввод можно настроить возможность отмены:
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
// Разрешить отмену (по умолчанию)
|
|
20
|
+
.requestInput("phone", {
|
|
21
|
+
validator: "phone",
|
|
22
|
+
allowCancel: true, // по умолчанию true
|
|
23
|
+
cancelButtonText: "Отмена", // текст кнопки
|
|
24
|
+
cancelAction: "home.index[cancel_wait=1]", // действие при отмене
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
// Запретить отмену (обязательный ввод)
|
|
28
|
+
.requestInputWithAwait("password", {
|
|
29
|
+
allowCancel: false, // отмена запрещена
|
|
30
|
+
errorMessage: "Пароль обязателен для ввода"
|
|
31
|
+
})
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 2. Сохранение состояния при ошибках
|
|
35
|
+
|
|
36
|
+
При неверном вводе пользователь остается в режиме ожидания:
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
.requestInput("code", {
|
|
40
|
+
validator: "code",
|
|
41
|
+
errorMessage: "Неверный формат кода. Введите 5-6 цифр",
|
|
42
|
+
allowCancel: true
|
|
43
|
+
})
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Система будет:
|
|
47
|
+
- Показывать сообщение об ошибке
|
|
48
|
+
- Увеличивать счетчик попыток
|
|
49
|
+
- Сохранять состояние ожидания
|
|
50
|
+
- Позволять отмену только если `allowCancel: true`
|
|
51
|
+
|
|
52
|
+
### 3. Валидация файлов
|
|
53
|
+
|
|
54
|
+
Поддержка загрузки и валидации файлов:
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
.requestInput("uploadedFile", {
|
|
58
|
+
validator: "file",
|
|
59
|
+
errorMessage: "Неподдерживаемый формат файла",
|
|
60
|
+
fileValidation: {
|
|
61
|
+
allowedTypes: ['image/jpeg', 'image/png', 'application/pdf'],
|
|
62
|
+
maxSize: 10 * 1024 * 1024, // 10 МБ
|
|
63
|
+
minSize: 1024, // 1 КБ
|
|
64
|
+
},
|
|
65
|
+
allowCancel: true
|
|
66
|
+
})
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 4. Кастомная валидация
|
|
70
|
+
|
|
71
|
+
Поддержка асинхронных валидаторов:
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
.requestInput("customData", {
|
|
75
|
+
validator: async (value) => {
|
|
76
|
+
// Асинхронная проверка
|
|
77
|
+
const isValid = await checkInDatabase(value);
|
|
78
|
+
return isValid;
|
|
79
|
+
},
|
|
80
|
+
errorMessage: "Данные не прошли проверку"
|
|
81
|
+
})
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Типы валидаторов
|
|
85
|
+
|
|
86
|
+
### Встроенные валидаторы:
|
|
87
|
+
- `"number"` - числовые значения
|
|
88
|
+
- `"phone"` - российские номера телефонов (79xxxxxxxxx)
|
|
89
|
+
- `"code"` - коды подтверждения (5-6 цифр)
|
|
90
|
+
- `"file"` - файлы (с дополнительными опциями)
|
|
91
|
+
|
|
92
|
+
### Кастомные валидаторы:
|
|
93
|
+
```typescript
|
|
94
|
+
// Синхронный валидатор
|
|
95
|
+
validator: (value: string) => value.length > 5
|
|
96
|
+
|
|
97
|
+
// Асинхронный валидатор
|
|
98
|
+
validator: async (value: string) => {
|
|
99
|
+
const result = await apiCall(value);
|
|
100
|
+
return result.isValid;
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Примеры использования
|
|
105
|
+
|
|
106
|
+
### Базовый ввод с отменой
|
|
107
|
+
```typescript
|
|
108
|
+
async startRegistration() {
|
|
109
|
+
await this.message("Введите ваш номер телефона:")
|
|
110
|
+
.requestInput("phone", {
|
|
111
|
+
validator: "phone",
|
|
112
|
+
errorMessage: "Неверный формат. Используйте: 79000000000",
|
|
113
|
+
allowCancel: true,
|
|
114
|
+
cancelButtonText: "Отмена",
|
|
115
|
+
cancelAction: "home.index[cancel_wait=1]",
|
|
116
|
+
runSection: new RunSectionRoute().section("home").method("processPhone")
|
|
117
|
+
})
|
|
118
|
+
.send();
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Обязательный ввод без отмены
|
|
123
|
+
```typescript
|
|
124
|
+
async requestPassword() {
|
|
125
|
+
return await this.message("Введите пароль:")
|
|
126
|
+
.requestInputWithAwait("password", {
|
|
127
|
+
errorMessage: "Пароль не может быть пустым",
|
|
128
|
+
allowCancel: false // отмена запрещена
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Загрузка файлов с валидацией
|
|
134
|
+
```typescript
|
|
135
|
+
async uploadDocument() {
|
|
136
|
+
await this.message("Отправьте документ (PDF, до 5 МБ):")
|
|
137
|
+
.requestInput("document", {
|
|
138
|
+
validator: "file",
|
|
139
|
+
fileValidation: {
|
|
140
|
+
allowedTypes: ['application/pdf'],
|
|
141
|
+
maxSize: 5 * 1024 * 1024,
|
|
142
|
+
minSize: 1024
|
|
143
|
+
},
|
|
144
|
+
errorMessage: "Только PDF файлы до 5 МБ",
|
|
145
|
+
allowCancel: true,
|
|
146
|
+
runSection: new RunSectionRoute().section("home").method("processDocument")
|
|
147
|
+
})
|
|
148
|
+
.send();
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Кастомная валидация с API
|
|
153
|
+
```typescript
|
|
154
|
+
async requestUsername() {
|
|
155
|
+
await this.message("Введите желаемое имя пользователя:")
|
|
156
|
+
.requestInput("username", {
|
|
157
|
+
validator: async (username: string) => {
|
|
158
|
+
// Проверяем доступность имени через API
|
|
159
|
+
const response = await fetch(`/api/check-username/${username}`);
|
|
160
|
+
const data = await response.json();
|
|
161
|
+
return data.available;
|
|
162
|
+
},
|
|
163
|
+
errorMessage: "Это имя уже занято. Попробуйте другое.",
|
|
164
|
+
allowCancel: true,
|
|
165
|
+
runSection: new RunSectionRoute().section("user").method("processUsername")
|
|
166
|
+
})
|
|
167
|
+
.send();
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Обработка отмены
|
|
172
|
+
|
|
173
|
+
Отмена обрабатывается автоматически через параметр `cancel_wait`:
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
// В конструкторе Section автоматически вызывается:
|
|
177
|
+
this.cancelUserWaitingReply();
|
|
178
|
+
|
|
179
|
+
// Который проверяет параметр cancel_wait и очищает состояние ожидания
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Миграция с старой системы
|
|
183
|
+
|
|
184
|
+
### Было:
|
|
185
|
+
```typescript
|
|
186
|
+
.requestInput("phone", {
|
|
187
|
+
validator: "phone",
|
|
188
|
+
errorMessage: "Неверный номер"
|
|
189
|
+
})
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Стало:
|
|
193
|
+
```typescript
|
|
194
|
+
.requestInput("phone", {
|
|
195
|
+
validator: "phone",
|
|
196
|
+
errorMessage: "Неверный номер",
|
|
197
|
+
allowCancel: true, // новый параметр
|
|
198
|
+
cancelButtonText: "Отмена", // настройка текста кнопки
|
|
199
|
+
cancelAction: "home.index[cancel_wait=1]" // действие при отмене
|
|
200
|
+
})
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Старый код будет работать с настройками по умолчанию (отмена разрешена).
|
|
204
|
+
|
|
205
|
+
## Лучшие практики
|
|
206
|
+
|
|
207
|
+
1. **Всегда предоставляйте возможность отмены** для необязательных действий
|
|
208
|
+
2. **Используйте понятные сообщения об ошибках** с указанием формата
|
|
209
|
+
3. **Ограничивайте размеры файлов** для предотвращения злоупотреблений
|
|
210
|
+
4. **Используйте асинхронную валидацию** для проверок через API
|
|
211
|
+
5. **Тестируйте различные сценарии** включая отмену и повторные попытки
|