@2byte/tgbot-framework 1.0.2 → 1.0.3
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 -84
- package/package.json +6 -2
- package/src/cli/CreateBotCommand.ts +181 -181
- package/src/cli/GenerateCommand.ts +195 -111
- package/src/cli/InitCommand.ts +107 -107
- package/src/console/migrate.ts +82 -82
- package/src/core/ApiService.ts +21 -0
- package/src/core/ApiServiceManager.ts +63 -0
- package/src/core/App.ts +1113 -1042
- 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 -60
- package/src/illumination/Message2Byte.ts +255 -254
- 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 +35 -33
- package/src/libs/TelegramAccountControl.ts +738 -738
- package/src/types.ts +188 -186
- package/src/user/UserModel.ts +297 -288
- package/src/user/UserStore.ts +119 -119
- package/src/workflow/services/MassSendApiService.ts +80 -0
- package/templates/bot/.env.example +18 -17
- package/templates/bot/artisan.ts +8 -8
- package/templates/bot/bot.ts +79 -77
- 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/seed.ts +14 -14
- package/templates/bot/package.json +30 -30
- package/templates/bot/sectionList.ts +9 -7
- package/templates/bot/sections/ExampleInputSection.ts +85 -0
- package/templates/bot/sections/ExampleLiveTaskerSection.ts +60 -0
- package/templates/bot/sections/HomeSection.ts +63 -63
- package/templates/bot/workflow/services/ExampleServise.ts +24 -0
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "{{kebabName}}",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "{{description}}",
|
|
5
|
-
"main": "bot.ts",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"dev": "bun --watch bot.ts",
|
|
8
|
-
"start": "bun bot.ts",
|
|
9
|
-
"build": "bun build bot.ts --outdir ./dist",
|
|
10
|
-
"migrate": "bun database/migrate.ts",
|
|
11
|
-
"artisan": "bun artisan.ts",
|
|
12
|
-
"seed": "bun database/seed.ts",
|
|
13
|
-
"seed:clear": "bun database/seed.ts --clear",
|
|
14
|
-
"seed:clean": "bun database/seed.ts --clean-only"
|
|
15
|
-
},
|
|
16
|
-
"keywords": [
|
|
17
|
-
"telegram",
|
|
18
|
-
"bot",
|
|
19
|
-
"2byte"
|
|
20
|
-
],
|
|
21
|
-
"author": "{{author}}",
|
|
22
|
-
"license": "MIT",
|
|
23
|
-
"dependencies": {
|
|
24
|
-
"@2byte/tgbot-framework": "^1.0.0"
|
|
25
|
-
},
|
|
26
|
-
"devDependencies": {
|
|
27
|
-
"@types/node": "^20.19.8",
|
|
28
|
-
"bun-types": "^1.2.18",
|
|
29
|
-
"typescript": "^5.8.3"
|
|
30
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "{{kebabName}}",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "{{description}}",
|
|
5
|
+
"main": "bot.ts",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "bun --watch bot.ts",
|
|
8
|
+
"start": "bun bot.ts",
|
|
9
|
+
"build": "bun build bot.ts --outdir ./dist",
|
|
10
|
+
"migrate": "bun database/migrate.ts",
|
|
11
|
+
"artisan": "bun artisan.ts",
|
|
12
|
+
"seed": "bun database/seed.ts",
|
|
13
|
+
"seed:clear": "bun database/seed.ts --clear",
|
|
14
|
+
"seed:clean": "bun database/seed.ts --clean-only"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"telegram",
|
|
18
|
+
"bot",
|
|
19
|
+
"2byte"
|
|
20
|
+
],
|
|
21
|
+
"author": "{{author}}",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@2byte/tgbot-framework": "^1.0.0"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/node": "^20.19.8",
|
|
28
|
+
"bun-types": "^1.2.18",
|
|
29
|
+
"typescript": "^5.8.3"
|
|
30
|
+
}
|
|
31
31
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { SectionEnabledList, SectionList } from "
|
|
2
|
-
|
|
3
|
-
export const sectionList: SectionList = {
|
|
4
|
-
home: {},
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { SectionEnabledList, SectionList } from "@2byte/tgbot-framework";
|
|
2
|
+
|
|
3
|
+
export const sectionList: SectionList = {
|
|
4
|
+
home: {},
|
|
5
|
+
exampleInput: {},
|
|
6
|
+
exampleLiveTasker: {},
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const enabledList: SectionEnabledList = Object.keys(sectionList);
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { RunSectionRoute, Section } from "@2byte/tgbot-framework";
|
|
2
|
+
import { SectionOptions } from "@2byte/tgbot-framework";
|
|
3
|
+
import { InlineKeyboard } from "@2byte/tgbot-framework";
|
|
4
|
+
|
|
5
|
+
export default class ExampleInputSection extends Section {
|
|
6
|
+
static command = "exampleInput";
|
|
7
|
+
static description = "ExampleInput section";
|
|
8
|
+
static actionRoutes = {
|
|
9
|
+
"exampleInput.index": "index",
|
|
10
|
+
"exampleInput.input": "input",
|
|
11
|
+
"exampleInput.inputAwaiting": "inputAwaiting",
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
public sectionId = "exampleInput";
|
|
15
|
+
private mainInlineKeyboard: InlineKeyboard;
|
|
16
|
+
|
|
17
|
+
constructor(options: SectionOptions) {
|
|
18
|
+
super(options);
|
|
19
|
+
|
|
20
|
+
this.mainInlineKeyboard = this.makeInlineKeyboard().addFootFixedButtons(this.btnHome);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public async up(): Promise<void> {}
|
|
24
|
+
public async down(): Promise<void> {}
|
|
25
|
+
public async setup(): Promise<void> {}
|
|
26
|
+
public async unsetup(): Promise<void> {}
|
|
27
|
+
|
|
28
|
+
async index() {
|
|
29
|
+
const message = `
|
|
30
|
+
👋 Welcome to Exampleinput Section
|
|
31
|
+
`;
|
|
32
|
+
|
|
33
|
+
await this.message(message)
|
|
34
|
+
.inlineKeyboard(
|
|
35
|
+
this.mainInlineKeyboard.append(
|
|
36
|
+
this.makeInlineButton('➕ Example input', 'exampleInput.input')
|
|
37
|
+
).append(
|
|
38
|
+
this.makeInlineButton('➕ Example input with awaiting', 'exampleInput.inputAwaiting')
|
|
39
|
+
).append(
|
|
40
|
+
this.btnHome
|
|
41
|
+
)
|
|
42
|
+
)
|
|
43
|
+
.send();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async input() {
|
|
47
|
+
await this.message("Please enter some text:")
|
|
48
|
+
.inlineKeyboard(this.mainInlineKeyboard)
|
|
49
|
+
.requestInput("userText", {
|
|
50
|
+
runSection: new RunSectionRoute().section("exampleInput").method("exampleInputHandler"),
|
|
51
|
+
}).send();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async exampleInputHandler() {
|
|
55
|
+
const userText = this.getAnswerInput("userText");
|
|
56
|
+
|
|
57
|
+
await this.message(`You entered: ${userText}`)
|
|
58
|
+
.inlineKeyboard(this.mainInlineKeyboard.append(
|
|
59
|
+
this.makeInlineButton('➕ Example input', 'exampleInput.input')
|
|
60
|
+
))
|
|
61
|
+
.send();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async inputAwaiting() {
|
|
65
|
+
try {
|
|
66
|
+
const userText = await this.message("Please enter some text (with awaiting):")
|
|
67
|
+
.inlineKeyboard(this.mainInlineKeyboard)
|
|
68
|
+
.requestInputWithAwait("userTextAwaiting", {
|
|
69
|
+
allowCancel: true,
|
|
70
|
+
cancelButtonText: "Cancel",
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
await this.message(`You entered (awaiting): ${userText}`)
|
|
74
|
+
.inlineKeyboard(this.mainInlineKeyboard.append(
|
|
75
|
+
this.makeInlineButton('➕ Example input with awaiting', 'exampleInput.inputAwaiting')
|
|
76
|
+
))
|
|
77
|
+
.send();
|
|
78
|
+
} catch (error) {
|
|
79
|
+
await this.message("Input was cancelled.")
|
|
80
|
+
.inlineKeyboard(this.mainInlineKeyboard)
|
|
81
|
+
.send();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Section } from "@2byte/tgbot-framework";
|
|
2
|
+
import { SectionOptions } from "@2byte/tgbot-framework";
|
|
3
|
+
import { InlineKeyboard } from "@2byte/tgbot-framework";
|
|
4
|
+
|
|
5
|
+
export default class ExampleLiveTaskerSection extends Section {
|
|
6
|
+
static command = "examplelivetasker";
|
|
7
|
+
static description = "ExampleLiveTasker section";
|
|
8
|
+
static actionRoutes = {
|
|
9
|
+
"exampleLiveTasker.index": "index",
|
|
10
|
+
"exampleLiveTasker.runTasker": "runTasker",
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
public sectionId = "ExampleLiveTasker";
|
|
14
|
+
private mainInlineKeyboard: InlineKeyboard;
|
|
15
|
+
|
|
16
|
+
constructor(options: SectionOptions) {
|
|
17
|
+
super(options);
|
|
18
|
+
|
|
19
|
+
this.mainInlineKeyboard = this.makeInlineKeyboard().addFootFixedButtons(this.btnHome);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public async up(): Promise<void> {}
|
|
23
|
+
public async down(): Promise<void> {}
|
|
24
|
+
public async setup(): Promise<void> {}
|
|
25
|
+
public async unsetup(): Promise<void> {}
|
|
26
|
+
|
|
27
|
+
async index() {
|
|
28
|
+
const message = `
|
|
29
|
+
👋 Welcome to ExampleLiveTasker Section
|
|
30
|
+
`;
|
|
31
|
+
|
|
32
|
+
await this.message(message)
|
|
33
|
+
.inlineKeyboard(this.mainInlineKeyboard.append(
|
|
34
|
+
this.makeInlineButton('➕ Example Live Tasker', 'exampleLiveTasker.runTasker')
|
|
35
|
+
))
|
|
36
|
+
.send();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async runTasker() {
|
|
40
|
+
const msgPool = this.createUpdatePoolMessage("Starting tasker...");
|
|
41
|
+
|
|
42
|
+
await msgPool.send();
|
|
43
|
+
|
|
44
|
+
const msgProgressive = msgPool.liveProgressive();
|
|
45
|
+
|
|
46
|
+
await msgProgressive.setBaseMessage("Tasker in progress:").send();
|
|
47
|
+
|
|
48
|
+
for (let i = 1; i <= 5; i++) {
|
|
49
|
+
await new Promise((resolve) => setTimeout(resolve, 2000)); // Simulate a task taking time
|
|
50
|
+
await msgProgressive.appendItem(i, `Task ${i} running`).send();
|
|
51
|
+
await msgProgressive.sleepProgressBar(2000).send();
|
|
52
|
+
await msgProgressive.changeItem(i, `Task ${i} changed`).send();
|
|
53
|
+
await msgProgressive.setItemStatusCompleted(i).send();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
await msgProgressive.stopSleepProgress();
|
|
57
|
+
const res = await msgPool.append("\n\nAll tasks completed!").send();
|
|
58
|
+
console.log("Final message sent:", res);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
import { Section, SectionOptions, InlineKeyboard } from "@2byte/tgbot-framework";
|
|
2
|
-
|
|
3
|
-
export default class HomeSection extends Section {
|
|
4
|
-
static command = "start";
|
|
5
|
-
static description = "Example Bot Home section";
|
|
6
|
-
static actionRoutes = {
|
|
7
|
-
"home.index": "index",
|
|
8
|
-
"home.help": "help",
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
public sectionId = "home";
|
|
12
|
-
private mainInlineKeyboard: InlineKeyboard;
|
|
13
|
-
|
|
14
|
-
constructor(options: SectionOptions) {
|
|
15
|
-
super(options);
|
|
16
|
-
|
|
17
|
-
this.mainInlineKeyboard = this.makeInlineKeyboard(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
public async
|
|
23
|
-
public async
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
•
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
}
|
|
1
|
+
import { Section, SectionOptions, InlineKeyboard } from "@2byte/tgbot-framework";
|
|
2
|
+
|
|
3
|
+
export default class HomeSection extends Section {
|
|
4
|
+
static command = "start";
|
|
5
|
+
static description = "Example Bot Home section";
|
|
6
|
+
static actionRoutes = {
|
|
7
|
+
"home.index": "index",
|
|
8
|
+
"home.help": "help",
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
public sectionId = "home";
|
|
12
|
+
private mainInlineKeyboard: InlineKeyboard;
|
|
13
|
+
|
|
14
|
+
constructor(options: SectionOptions) {
|
|
15
|
+
super(options);
|
|
16
|
+
|
|
17
|
+
this.mainInlineKeyboard = this.makeInlineKeyboard().addFootFixedButtons(this.btnHome);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public async up(): Promise<void> {}
|
|
21
|
+
public async down(): Promise<void> {}
|
|
22
|
+
public async setup(): Promise<void> {}
|
|
23
|
+
public async unsetup(): Promise<void> {}
|
|
24
|
+
|
|
25
|
+
async index() {
|
|
26
|
+
const message = `
|
|
27
|
+
🏠 **Example Bot**
|
|
28
|
+
|
|
29
|
+
Добро пожаловать в Example бот!
|
|
30
|
+
Это стартовая секция, созданная с помощью 2byte framework.
|
|
31
|
+
|
|
32
|
+
Выберите действие:
|
|
33
|
+
`;
|
|
34
|
+
|
|
35
|
+
await this.message(message)
|
|
36
|
+
.markdown()
|
|
37
|
+
.inlineKeyboard(
|
|
38
|
+
this.mainInlineKeyboard
|
|
39
|
+
.append(this.makeInlineButton("ℹ️ Помощь", "home.help"))
|
|
40
|
+
.append(this.makeInlineButton("➕ Example Input", "exampleInput.index"))
|
|
41
|
+
.append(this.makeInlineButton("🚀 Example Live Tasker", "exampleLiveTasker.index"))
|
|
42
|
+
)
|
|
43
|
+
.send();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async help() {
|
|
47
|
+
const message = `
|
|
48
|
+
ℹ️ **Помощь**
|
|
49
|
+
|
|
50
|
+
Это бот, созданный с помощью 2byte Telegram Bot Framework.
|
|
51
|
+
|
|
52
|
+
Доступные команды:
|
|
53
|
+
• /start - Главное меню
|
|
54
|
+
|
|
55
|
+
Для разработчиков:
|
|
56
|
+
• bun run artisan make:section <name> - Создать секцию
|
|
57
|
+
• bun run migrate - Выполнить миграции
|
|
58
|
+
• bun run seed - Заполнить данными
|
|
59
|
+
`;
|
|
60
|
+
|
|
61
|
+
await this.message(message).inlineKeyboard(this.mainInlineKeyboard).markdown().send();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { App } from "@2byte/tgbot-framework";
|
|
2
|
+
import { ApiService } from "@2byte/tgbot-framework";
|
|
3
|
+
|
|
4
|
+
export default class ExampleService extends ApiService {
|
|
5
|
+
|
|
6
|
+
constructor(
|
|
7
|
+
protected app: App,
|
|
8
|
+
public name: string = "ExampleService"
|
|
9
|
+
) {
|
|
10
|
+
super(app, name);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public async setup(): Promise<void> {
|
|
14
|
+
return Promise.resolve();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public async unsetup(): Promise<void> {
|
|
18
|
+
return Promise.resolve();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public async run(): Promise<void> {
|
|
22
|
+
return Promise.resolve();
|
|
23
|
+
}
|
|
24
|
+
}
|