blockmine 1.4.8 → 1.5.1
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 +26 -19
- package/backend/package.json +5 -0
- package/backend/prisma/migrations/20250627144030_add_visual_editor_fields/migration.sql +26 -0
- package/backend/prisma/migrations/20250628113254_add_event_graphs/migration.sql +14 -0
- package/backend/prisma/migrations/20250628122517_added_eventgraph_name/migration.sql +26 -0
- package/backend/prisma/migrations/20250628122710_complex_events/migration.sql +36 -0
- package/backend/prisma/migrations/migration_lock.toml +2 -2
- package/backend/prisma/schema.prisma +45 -14
- package/backend/src/api/routes/bots.js +530 -286
- package/backend/src/api/routes/eventGraphs.js +375 -0
- package/backend/src/api/routes/plugins.js +5 -3
- package/backend/src/core/BotManager.js +297 -170
- package/backend/src/core/BotProcess.js +312 -44
- package/backend/src/core/EventGraphManager.js +164 -0
- package/backend/src/core/GraphExecutionEngine.js +706 -0
- package/backend/src/core/NodeRegistry.js +888 -0
- package/backend/src/core/PluginManager.js +12 -2
- package/backend/src/core/UserService.js +15 -2
- package/backend/src/core/services.js +12 -0
- package/backend/src/core/system/CommandManager.js +3 -1
- package/backend/src/lib/logger.js +15 -0
- package/backend/src/server.js +12 -4
- package/ecosystem.config.js +11 -0
- package/frontend/dist/assets/index-CY4JKfFL.js +8203 -0
- package/frontend/dist/assets/index-DC4RjP6E.css +1 -0
- package/frontend/dist/index.html +2 -2
- package/frontend/package.json +4 -0
- package/image/visualcommand.png +0 -0
- package/package.json +8 -2
- package/test_visual_command.json +9 -0
- package/frontend/dist/assets/index-CLCxr_rh.js +0 -8179
- package/frontend/dist/assets/index-Dk9CeSuD.css +0 -1
package/README.md
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
<div align="center">
|
|
2
3
|
<img src="./image/logo.png" alt="BlockMine Logo" width="150">
|
|
3
4
|
<h1>BlockMine</h1>
|
|
@@ -13,7 +14,7 @@
|
|
|
13
14
|
</p>
|
|
14
15
|
</div>
|
|
15
16
|
|
|
16
|
-
**BlockMine** — это open-source решение для централизованного управления и автоматизации ботов Minecraft. Запускайте ботов, управляйте ими в реальном
|
|
17
|
+
**BlockMine** — это open-source решение для централизованного управления и автоматизации ботов Minecraft. Запускайте ботов, управляйте ими в реальном времени, расширяйте их возможности с помощью плагинов и создавайте сложные сценарии поведения в визуальном редакторе.
|
|
17
18
|
|
|
18
19
|
---
|
|
19
20
|
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
## 🚀 Ключевые возможности
|
|
43
44
|
|
|
44
45
|
* **💻 Современный веб-интерфейс**: Адаптивная панель на React и Tailwind CSS для управления ботами, серверами и плагинами с любого устройства.
|
|
46
|
+
* **✨ Визуальный редактор логики (No-Code)**: Проектируйте поведение ботов с помощью интуитивного Drag-and-Drop интерфейса. Создавайте сложные команды и обработчики событий, не написав ни строчки кода.
|
|
45
47
|
* **🤖 Комплексное управление ботами**:
|
|
46
48
|
* Запуск, остановка и перезапуск ботов в один клик.
|
|
47
49
|
* Интерактивная консоль для каждого бота.
|
|
@@ -56,13 +58,10 @@
|
|
|
56
58
|
* Создавайте группы пользователей (`Admin`, `Member` и др.).
|
|
57
59
|
* Настраивайте детальные права доступа к каждой команде.
|
|
58
60
|
* Черный список для пользователей.
|
|
59
|
-
* **⚙️ Умная система команд**:
|
|
60
|
-
* Декларативное создание команд с автоматическим парсингом и валидацией аргументов.
|
|
61
|
-
* Автоматическая генерация сообщений об ошибках и подсказок по использованию.
|
|
62
61
|
* **🔄 Экспорт и импорт**:
|
|
63
|
-
* Создавайте **полные резервные копии** ботов в один ZIP-архив, включая все
|
|
64
|
-
*
|
|
65
|
-
*
|
|
62
|
+
* Создавайте **полные резервные копии** ботов в один ZIP-архив, включая все плагины и их настройки.
|
|
63
|
+
* Делитесь отдельными командами и графами событий через экспорт в JSON.
|
|
64
|
+
* Легко переносите ботов и их логику между разными установками BlockMine.
|
|
66
65
|
* **📦 Простая установка**: Запуск всей системы одной командой благодаря `npx`.
|
|
67
66
|
|
|
68
67
|
## ✨ Быстрый старт с `npx`
|
|
@@ -91,30 +90,38 @@
|
|
|
91
90
|
|
|
92
91
|
Чтобы максимально эффективно использовать панель, важно понимать её ключевые компоненты.
|
|
93
92
|
|
|
93
|
+
### 🎨 Визуальный редактор
|
|
94
|
+
<p align="center">
|
|
95
|
+
<img src="./image/visualcommand.png" alt="Скриншот визуального редактора BlockMine" width="100%">
|
|
96
|
+
</p>
|
|
97
|
+
Это сердце No-Code автоматизации в BlockMine. Редактор позволяет вам создавать логику, перетаскивая и соединяя функциональные блоки (ноды).
|
|
98
|
+
|
|
99
|
+
* **Создание команд**: Спроектируйте полноценную команду с аргументами, проверками прав и сложной логикой, не прикасаясь к коду.
|
|
100
|
+
* **Обработка событий**: Создавайте графы, которые реагируют на игровые события (например, вход игрока, сообщение в чате, появление моба) и выполняют заданные действия.
|
|
101
|
+
* **Наглядность**: Весь поток выполнения виден на одном экране, что упрощает понимание и отладку логики.
|
|
102
|
+
|
|
94
103
|
### 🔌 Плагины
|
|
95
|
-
Плагины — это
|
|
104
|
+
Плагины — это способ программного расширения функциональности. Они могут добавлять новые команды, новые ноды для визуального редактора или работать в фоновом режиме.
|
|
96
105
|
|
|
97
106
|
* **Магазин плагинов**: Встроенный браузер позволяет легко находить и устанавливать плагины в один клик.
|
|
98
107
|
* **Зависимости**: Система автоматически определит и предложит установить плагины, необходимые для работы выбранного вами.
|
|
99
|
-
* **Настройка**: Большинство плагинов можно настроить прямо в
|
|
108
|
+
* **Настройка**: Большинство плагинов можно настроить прямо в веб-интерфейсе.
|
|
100
109
|
|
|
101
110
|
### ⚙️ Команды
|
|
102
|
-
|
|
111
|
+
Команды могут быть созданы двумя способами: **программно** через плагины или **визуально** в редакторе. Независимо от способа создания, все команды управляются централизованно.
|
|
103
112
|
|
|
104
113
|
* **Алиасы**: Назначайте командам короткие псевдонимы (например, `@p` для `@ping`).
|
|
105
|
-
* **Кулдауны**: Устанавливайте задержку между использованиями
|
|
106
|
-
* **Включение/выключение**: Временно отключайте
|
|
107
|
-
* **Аргументы**:
|
|
114
|
+
* **Кулдауны**: Устанавливайте задержку между использованиями команды.
|
|
115
|
+
* **Включение/выключение**: Временно отключайте команды.
|
|
116
|
+
* **Аргументы**: Задавайте аргументы для ваших визуальных команд, которые будут доступны внутри графа.
|
|
108
117
|
|
|
109
118
|
### 🔐 Права и Группы (Permissions)
|
|
110
119
|
Это гибкая система, позволяющая точно контролировать, кто и что может делать с вашим ботом.
|
|
111
120
|
|
|
112
|
-
* **Права (Permissions)**: Каждое действие (например, использование команды `@fly`) защищено правом (`user.fly`). Права
|
|
113
|
-
* **Группы (Groups)**: Группы объединяют несколько прав. Например, группа `Member` может иметь право `member.say
|
|
121
|
+
* **Права (Permissions)**: Каждое действие (например, использование команды `@fly`) защищено правом (`user.fly`). Права могут создаваться плагинами или в панели управления.
|
|
122
|
+
* **Группы (Groups)**: Группы объединяют несколько прав. Например, группа `Member` может иметь право `member.say`.
|
|
114
123
|
* **Пользователи**: Каждый игрок, взаимодействующий с ботом, становится пользователем в системе. Вы можете добавлять пользователей в разные группы, выдавая им соответствующие права.
|
|
115
124
|
|
|
116
|
-
Эта система позволяет создавать сложные иерархии доступа, например: обычные игроки, участники клана, модераторы и администраторы, каждый со своим набором возможностей.
|
|
117
|
-
|
|
118
125
|
## 🧑💻 Для разработчиков и контрибьюторов
|
|
119
126
|
|
|
120
127
|
Если вы хотите внести свой вклад в проект или запустить его в режиме разработки.
|
|
@@ -135,5 +142,5 @@ npm install
|
|
|
135
142
|
npm run dev
|
|
136
143
|
```
|
|
137
144
|
|
|
138
|
-
|
|
139
|
-
|
|
145
|
+
* **Бэкенд** будет доступен на `http://localhost:3001`.
|
|
146
|
+
* **Фронтенд** с горячей перезагрузкой будет доступен на `http://localhost:5173`. Открывайте этот адрес для разработки.
|
package/backend/package.json
CHANGED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
-- RedefineTables
|
|
2
|
+
PRAGMA defer_foreign_keys=ON;
|
|
3
|
+
PRAGMA foreign_keys=OFF;
|
|
4
|
+
CREATE TABLE "new_Command" (
|
|
5
|
+
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
|
6
|
+
"botId" INTEGER NOT NULL,
|
|
7
|
+
"name" TEXT NOT NULL,
|
|
8
|
+
"isEnabled" BOOLEAN NOT NULL DEFAULT true,
|
|
9
|
+
"cooldown" INTEGER NOT NULL DEFAULT 0,
|
|
10
|
+
"aliases" TEXT NOT NULL DEFAULT '[]',
|
|
11
|
+
"description" TEXT,
|
|
12
|
+
"owner" TEXT,
|
|
13
|
+
"permissionId" INTEGER,
|
|
14
|
+
"allowedChatTypes" TEXT NOT NULL DEFAULT '["chat", "private"]',
|
|
15
|
+
"isVisual" BOOLEAN NOT NULL DEFAULT false,
|
|
16
|
+
"argumentsJson" TEXT DEFAULT '[]',
|
|
17
|
+
"graphJson" TEXT DEFAULT 'null',
|
|
18
|
+
CONSTRAINT "Command_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
|
19
|
+
CONSTRAINT "Command_permissionId_fkey" FOREIGN KEY ("permissionId") REFERENCES "Permission" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
|
20
|
+
);
|
|
21
|
+
INSERT INTO "new_Command" ("aliases", "allowedChatTypes", "botId", "cooldown", "description", "id", "isEnabled", "name", "owner", "permissionId") SELECT "aliases", "allowedChatTypes", "botId", "cooldown", "description", "id", "isEnabled", "name", "owner", "permissionId" FROM "Command";
|
|
22
|
+
DROP TABLE "Command";
|
|
23
|
+
ALTER TABLE "new_Command" RENAME TO "Command";
|
|
24
|
+
CREATE UNIQUE INDEX "Command_botId_name_key" ON "Command"("botId", "name");
|
|
25
|
+
PRAGMA foreign_keys=ON;
|
|
26
|
+
PRAGMA defer_foreign_keys=OFF;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "EventGraph" (
|
|
3
|
+
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
|
4
|
+
"botId" INTEGER NOT NULL,
|
|
5
|
+
"eventType" TEXT NOT NULL,
|
|
6
|
+
"isEnabled" BOOLEAN NOT NULL DEFAULT true,
|
|
7
|
+
"graphJson" TEXT DEFAULT 'null',
|
|
8
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
9
|
+
"updatedAt" DATETIME NOT NULL,
|
|
10
|
+
CONSTRAINT "EventGraph_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
-- CreateIndex
|
|
14
|
+
CREATE UNIQUE INDEX "EventGraph_botId_eventType_key" ON "EventGraph"("botId", "eventType");
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Warnings:
|
|
3
|
+
|
|
4
|
+
- Added the required column `name` to the `EventGraph` table without a default value. This is not possible if the table is not empty.
|
|
5
|
+
|
|
6
|
+
*/
|
|
7
|
+
-- RedefineTables
|
|
8
|
+
PRAGMA defer_foreign_keys=ON;
|
|
9
|
+
PRAGMA foreign_keys=OFF;
|
|
10
|
+
CREATE TABLE "new_EventGraph" (
|
|
11
|
+
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
|
12
|
+
"botId" INTEGER NOT NULL,
|
|
13
|
+
"name" TEXT NOT NULL,
|
|
14
|
+
"eventType" TEXT NOT NULL,
|
|
15
|
+
"isEnabled" BOOLEAN NOT NULL DEFAULT true,
|
|
16
|
+
"graphJson" TEXT DEFAULT 'null',
|
|
17
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
18
|
+
"updatedAt" DATETIME NOT NULL,
|
|
19
|
+
CONSTRAINT "EventGraph_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
20
|
+
);
|
|
21
|
+
INSERT INTO "new_EventGraph" ("botId", "createdAt", "eventType", "graphJson", "id", "isEnabled", "updatedAt", "name") SELECT "botId", "createdAt", "eventType", "graphJson", "id", "isEnabled", "updatedAt", "eventType" FROM "EventGraph";
|
|
22
|
+
DROP TABLE "EventGraph";
|
|
23
|
+
ALTER TABLE "new_EventGraph" RENAME TO "EventGraph";
|
|
24
|
+
CREATE UNIQUE INDEX "EventGraph_botId_name_key" ON "EventGraph"("botId", "name");
|
|
25
|
+
PRAGMA foreign_keys=ON;
|
|
26
|
+
PRAGMA defer_foreign_keys=OFF;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Warnings:
|
|
3
|
+
|
|
4
|
+
- You are about to drop the column `eventType` on the `EventGraph` table. All the data in the column will be lost.
|
|
5
|
+
|
|
6
|
+
*/
|
|
7
|
+
-- CreateTable
|
|
8
|
+
CREATE TABLE "EventTrigger" (
|
|
9
|
+
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
|
10
|
+
"graphId" INTEGER NOT NULL,
|
|
11
|
+
"eventType" TEXT NOT NULL,
|
|
12
|
+
CONSTRAINT "EventTrigger_graphId_fkey" FOREIGN KEY ("graphId") REFERENCES "EventGraph" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
-- RedefineTables
|
|
16
|
+
PRAGMA defer_foreign_keys=ON;
|
|
17
|
+
PRAGMA foreign_keys=OFF;
|
|
18
|
+
CREATE TABLE "new_EventGraph" (
|
|
19
|
+
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
|
20
|
+
"botId" INTEGER NOT NULL,
|
|
21
|
+
"name" TEXT NOT NULL,
|
|
22
|
+
"isEnabled" BOOLEAN NOT NULL DEFAULT true,
|
|
23
|
+
"graphJson" TEXT DEFAULT 'null',
|
|
24
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
25
|
+
"updatedAt" DATETIME NOT NULL,
|
|
26
|
+
CONSTRAINT "EventGraph_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
27
|
+
);
|
|
28
|
+
INSERT INTO "new_EventGraph" ("botId", "createdAt", "graphJson", "id", "isEnabled", "name", "updatedAt") SELECT "botId", "createdAt", "graphJson", "id", "isEnabled", "name", "updatedAt" FROM "EventGraph";
|
|
29
|
+
DROP TABLE "EventGraph";
|
|
30
|
+
ALTER TABLE "new_EventGraph" RENAME TO "EventGraph";
|
|
31
|
+
CREATE UNIQUE INDEX "EventGraph_botId_name_key" ON "EventGraph"("botId", "name");
|
|
32
|
+
PRAGMA foreign_keys=ON;
|
|
33
|
+
PRAGMA defer_foreign_keys=OFF;
|
|
34
|
+
|
|
35
|
+
-- CreateIndex
|
|
36
|
+
CREATE UNIQUE INDEX "EventTrigger_graphId_eventType_key" ON "EventTrigger"("graphId", "eventType");
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# Please do not edit this file manually
|
|
2
|
-
# It should be added in your version-control system (i.e. Git)
|
|
1
|
+
# Please do not edit this file manually
|
|
2
|
+
# It should be added in your version-control system (i.e. Git)
|
|
3
3
|
provider = "sqlite"
|
|
@@ -36,7 +36,8 @@ model Bot {
|
|
|
36
36
|
users User[]
|
|
37
37
|
groups Group[]
|
|
38
38
|
permissions Permission[]
|
|
39
|
-
commands Command[]
|
|
39
|
+
commands Command[]
|
|
40
|
+
eventGraphs EventGraph[]
|
|
40
41
|
|
|
41
42
|
createdAt DateTime @default(now())
|
|
42
43
|
updatedAt DateTime @updatedAt
|
|
@@ -64,22 +65,52 @@ model InstalledPlugin {
|
|
|
64
65
|
}
|
|
65
66
|
|
|
66
67
|
model Command {
|
|
67
|
-
id
|
|
68
|
-
botId
|
|
69
|
-
bot
|
|
70
|
-
name
|
|
71
|
-
isEnabled
|
|
72
|
-
cooldown
|
|
73
|
-
aliases
|
|
74
|
-
description
|
|
75
|
-
owner
|
|
76
|
-
permissionId
|
|
77
|
-
permission
|
|
78
|
-
allowedChatTypes String @default("[\"chat\", \"private\"]")
|
|
68
|
+
id Int @id @default(autoincrement())
|
|
69
|
+
botId Int
|
|
70
|
+
bot Bot @relation(fields: [botId], references: [id], onDelete: Cascade)
|
|
71
|
+
name String
|
|
72
|
+
isEnabled Boolean @default(true)
|
|
73
|
+
cooldown Int @default(0)
|
|
74
|
+
aliases String @default("[]")
|
|
75
|
+
description String?
|
|
76
|
+
owner String?
|
|
77
|
+
permissionId Int?
|
|
78
|
+
permission Permission? @relation(fields: [permissionId], references: [id], onDelete: SetNull)
|
|
79
|
+
allowedChatTypes String @default("[\"chat\", \"private\"]")
|
|
80
|
+
|
|
81
|
+
isVisual Boolean @default(false)
|
|
82
|
+
argumentsJson String? @default("[]")
|
|
83
|
+
graphJson String? @default("null")
|
|
79
84
|
|
|
80
85
|
@@unique([botId, name])
|
|
81
86
|
}
|
|
82
87
|
|
|
88
|
+
model EventGraph {
|
|
89
|
+
id Int @id @default(autoincrement())
|
|
90
|
+
botId Int
|
|
91
|
+
bot Bot @relation(fields: [botId], references: [id], onDelete: Cascade)
|
|
92
|
+
name String
|
|
93
|
+
isEnabled Boolean @default(true)
|
|
94
|
+
graphJson String? @default("null")
|
|
95
|
+
variables String? @default("[]")
|
|
96
|
+
|
|
97
|
+
triggers EventTrigger[]
|
|
98
|
+
|
|
99
|
+
createdAt DateTime @default(now())
|
|
100
|
+
updatedAt DateTime @updatedAt
|
|
101
|
+
|
|
102
|
+
@@unique([botId, name])
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
model EventTrigger {
|
|
106
|
+
id Int @id @default(autoincrement())
|
|
107
|
+
graphId Int
|
|
108
|
+
graph EventGraph @relation(fields: [graphId], references: [id], onDelete: Cascade)
|
|
109
|
+
eventType String // e.g., "entitySpawn", "chat"
|
|
110
|
+
|
|
111
|
+
@@unique([graphId, eventType])
|
|
112
|
+
}
|
|
113
|
+
|
|
83
114
|
model User {
|
|
84
115
|
id Int @id @default(autoincrement())
|
|
85
116
|
username String
|
|
@@ -163,7 +194,7 @@ model PanelUser {
|
|
|
163
194
|
// Роли пользователей (Admin, Moderator, Viewer)
|
|
164
195
|
model PanelRole {
|
|
165
196
|
id Int @id @default(autoincrement())
|
|
166
|
-
name String @unique
|
|
197
|
+
name String @unique
|
|
167
198
|
|
|
168
199
|
// Храним права как джсон строку. SQLite не поддерживает массивы.
|
|
169
200
|
// Пример: '["bot:create", "bot:delete", "user:manage"]'
|