blockmine 1.0.0

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.
Files changed (61) hide show
  1. package/README.md +107 -0
  2. package/backend/cli.js +40 -0
  3. package/backend/nodemon.json +12 -0
  4. package/backend/package-lock.json +2539 -0
  5. package/backend/package.json +34 -0
  6. package/backend/prisma/migrations/20250614085849_add_bot_note/migration.sql +126 -0
  7. package/backend/prisma/migrations/20250614153037_add_plugin_installed_date/migration.sql +27 -0
  8. package/backend/prisma/migrations/migration_lock.toml +3 -0
  9. package/backend/prisma/schema.prisma +138 -0
  10. package/backend/prisma/seed.js +60 -0
  11. package/backend/src/api/routes/bots.js +777 -0
  12. package/backend/src/api/routes/permissions.js +79 -0
  13. package/backend/src/api/routes/plugins.js +110 -0
  14. package/backend/src/api/routes/servers.js +50 -0
  15. package/backend/src/api/routes/settings.js +40 -0
  16. package/backend/src/core/BotManager.js +264 -0
  17. package/backend/src/core/BotProcess.js +233 -0
  18. package/backend/src/core/DependencyService.js +93 -0
  19. package/backend/src/core/MessageQueue.js +126 -0
  20. package/backend/src/core/PermissionManager.js +97 -0
  21. package/backend/src/core/PluginLoader.js +64 -0
  22. package/backend/src/core/PluginManager.js +161 -0
  23. package/backend/src/core/PluginService.js +57 -0
  24. package/backend/src/core/UserService.js +181 -0
  25. package/backend/src/core/commands/ping.js +35 -0
  26. package/backend/src/core/commands/warn.js +40 -0
  27. package/backend/src/core/ipc/PermissionManager.stub.js +24 -0
  28. package/backend/src/core/ipc/UserService.stub.js +31 -0
  29. package/backend/src/core/system/Command.js +53 -0
  30. package/backend/src/core/system/CommandHandler.js +98 -0
  31. package/backend/src/core/system/CommandManager.js +59 -0
  32. package/backend/src/core/system/CommandRegistry.js +21 -0
  33. package/backend/src/core/system/parseArguments.js +43 -0
  34. package/backend/src/real-time/socketHandler.js +31 -0
  35. package/backend/src/server.js +66 -0
  36. package/frontend/dist/apple-touch-icon.png +0 -0
  37. package/frontend/dist/assets/index-B83SHIXE.css +1 -0
  38. package/frontend/dist/assets/index-Dh-PcVh1.js +8179 -0
  39. package/frontend/dist/favicon-96x96.png +0 -0
  40. package/frontend/dist/favicon.ico +0 -0
  41. package/frontend/dist/favicon.svg +3 -0
  42. package/frontend/dist/index.html +51 -0
  43. package/frontend/dist/logo.png +0 -0
  44. package/frontend/dist/logo.svg +178 -0
  45. package/frontend/dist/monacoeditorwork/css.worker.bundle.js +53462 -0
  46. package/frontend/dist/monacoeditorwork/editor.worker.bundle.js +13519 -0
  47. package/frontend/dist/monacoeditorwork/html.worker.bundle.js +29662 -0
  48. package/frontend/dist/monacoeditorwork/json.worker.bundle.js +21320 -0
  49. package/frontend/dist/monacoeditorwork/ts.worker.bundle.js +256353 -0
  50. package/frontend/dist/site.webmanifest +21 -0
  51. package/frontend/dist/vite.svg +1 -0
  52. package/frontend/dist/web-app-manifest-192x192.png +0 -0
  53. package/frontend/dist/web-app-manifest-512x512.png +0 -0
  54. package/frontend/package.json +65 -0
  55. package/image/1.png +0 -0
  56. package/image/2.png +0 -0
  57. package/image/3.png +0 -0
  58. package/image/logo.png +0 -0
  59. package/package.json +27 -0
  60. package/tailwind.config.js +0 -0
  61. package/vite.config.js +0 -0
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "backend",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "src/server.js",
6
+ "scripts": {
7
+ "start": "node src/server.js",
8
+ "dev": "nodemon src/server.js",
9
+ "test": "echo \"Error: no test specified\" && exit 1"
10
+ },
11
+ "prisma": {
12
+ "seed": "node prisma/seed.js"
13
+ },
14
+ "keywords": [],
15
+ "author": "",
16
+ "license": "ISC",
17
+ "dependencies": {
18
+ "@prisma/client": "^5.14.0",
19
+ "adm-zip": "^0.5.16",
20
+ "archiver": "^7.0.1",
21
+ "express": "^4.19.2",
22
+ "mineflayer": "^4.20.1",
23
+ "multer": "^2.0.1",
24
+ "pidusage": "^3.0.2",
25
+ "semver": "^7.6.2",
26
+ "simple-git": "^3.25.0",
27
+ "socket.io": "^4.7.5",
28
+ "socks": "^2.8.5"
29
+ },
30
+ "devDependencies": {
31
+ "nodemon": "^3.1.2",
32
+ "prisma": "^5.14.0"
33
+ }
34
+ }
@@ -0,0 +1,126 @@
1
+ -- CreateTable
2
+ CREATE TABLE "Server" (
3
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
+ "name" TEXT NOT NULL,
5
+ "host" TEXT NOT NULL,
6
+ "port" INTEGER NOT NULL DEFAULT 25565,
7
+ "version" TEXT NOT NULL
8
+ );
9
+
10
+ -- CreateTable
11
+ CREATE TABLE "Bot" (
12
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
13
+ "username" TEXT NOT NULL,
14
+ "password" TEXT,
15
+ "prefix" TEXT DEFAULT '@',
16
+ "note" TEXT,
17
+ "serverId" INTEGER NOT NULL,
18
+ "proxyHost" TEXT,
19
+ "proxyPort" INTEGER,
20
+ "proxyUsername" TEXT,
21
+ "proxyPassword" TEXT,
22
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
23
+ "updatedAt" DATETIME NOT NULL,
24
+ CONSTRAINT "Bot_serverId_fkey" FOREIGN KEY ("serverId") REFERENCES "Server" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
25
+ );
26
+
27
+ -- CreateTable
28
+ CREATE TABLE "InstalledPlugin" (
29
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
30
+ "botId" INTEGER NOT NULL,
31
+ "name" TEXT NOT NULL,
32
+ "version" TEXT NOT NULL,
33
+ "description" TEXT,
34
+ "sourceType" TEXT NOT NULL,
35
+ "sourceUri" TEXT,
36
+ "path" TEXT NOT NULL,
37
+ "isEnabled" BOOLEAN NOT NULL DEFAULT true,
38
+ "manifest" TEXT,
39
+ "settings" TEXT DEFAULT '{}',
40
+ CONSTRAINT "InstalledPlugin_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
41
+ );
42
+
43
+ -- CreateTable
44
+ CREATE TABLE "Command" (
45
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
46
+ "botId" INTEGER NOT NULL,
47
+ "name" TEXT NOT NULL,
48
+ "isEnabled" BOOLEAN NOT NULL DEFAULT true,
49
+ "cooldown" INTEGER NOT NULL DEFAULT 0,
50
+ "aliases" TEXT NOT NULL DEFAULT '[]',
51
+ "description" TEXT,
52
+ "owner" TEXT,
53
+ "permissionId" INTEGER,
54
+ "allowedChatTypes" TEXT NOT NULL DEFAULT '["chat", "private"]',
55
+ CONSTRAINT "Command_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
56
+ CONSTRAINT "Command_permissionId_fkey" FOREIGN KEY ("permissionId") REFERENCES "Permission" ("id") ON DELETE SET NULL ON UPDATE CASCADE
57
+ );
58
+
59
+ -- CreateTable
60
+ CREATE TABLE "User" (
61
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
62
+ "username" TEXT NOT NULL,
63
+ "isBlacklisted" BOOLEAN NOT NULL DEFAULT false,
64
+ "botId" INTEGER NOT NULL,
65
+ CONSTRAINT "User_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
66
+ );
67
+
68
+ -- CreateTable
69
+ CREATE TABLE "Group" (
70
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
71
+ "name" TEXT NOT NULL,
72
+ "owner" TEXT NOT NULL DEFAULT 'system',
73
+ "botId" INTEGER NOT NULL,
74
+ CONSTRAINT "Group_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
75
+ );
76
+
77
+ -- CreateTable
78
+ CREATE TABLE "Permission" (
79
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
80
+ "name" TEXT NOT NULL,
81
+ "description" TEXT,
82
+ "owner" TEXT NOT NULL DEFAULT 'system',
83
+ "botId" INTEGER NOT NULL,
84
+ CONSTRAINT "Permission_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
85
+ );
86
+
87
+ -- CreateTable
88
+ CREATE TABLE "UserGroup" (
89
+ "userId" INTEGER NOT NULL,
90
+ "groupId" INTEGER NOT NULL,
91
+
92
+ PRIMARY KEY ("userId", "groupId"),
93
+ CONSTRAINT "UserGroup_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
94
+ CONSTRAINT "UserGroup_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "Group" ("id") ON DELETE CASCADE ON UPDATE CASCADE
95
+ );
96
+
97
+ -- CreateTable
98
+ CREATE TABLE "GroupPermission" (
99
+ "groupId" INTEGER NOT NULL,
100
+ "permissionId" INTEGER NOT NULL,
101
+
102
+ PRIMARY KEY ("groupId", "permissionId"),
103
+ CONSTRAINT "GroupPermission_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "Group" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
104
+ CONSTRAINT "GroupPermission_permissionId_fkey" FOREIGN KEY ("permissionId") REFERENCES "Permission" ("id") ON DELETE CASCADE ON UPDATE CASCADE
105
+ );
106
+
107
+ -- CreateIndex
108
+ CREATE UNIQUE INDEX "Server_name_key" ON "Server"("name");
109
+
110
+ -- CreateIndex
111
+ CREATE UNIQUE INDEX "Bot_username_key" ON "Bot"("username");
112
+
113
+ -- CreateIndex
114
+ CREATE UNIQUE INDEX "InstalledPlugin_botId_name_key" ON "InstalledPlugin"("botId", "name");
115
+
116
+ -- CreateIndex
117
+ CREATE UNIQUE INDEX "Command_botId_name_key" ON "Command"("botId", "name");
118
+
119
+ -- CreateIndex
120
+ CREATE UNIQUE INDEX "User_botId_username_key" ON "User"("botId", "username");
121
+
122
+ -- CreateIndex
123
+ CREATE UNIQUE INDEX "Group_botId_name_key" ON "Group"("botId", "name");
124
+
125
+ -- CreateIndex
126
+ CREATE UNIQUE INDEX "Permission_botId_name_key" ON "Permission"("botId", "name");
@@ -0,0 +1,27 @@
1
+ -- AlterTable
2
+ ALTER TABLE "Bot" ADD COLUMN "owners" TEXT DEFAULT '';
3
+
4
+ -- RedefineTables
5
+ PRAGMA defer_foreign_keys=ON;
6
+ PRAGMA foreign_keys=OFF;
7
+ CREATE TABLE "new_InstalledPlugin" (
8
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
9
+ "botId" INTEGER NOT NULL,
10
+ "name" TEXT NOT NULL,
11
+ "version" TEXT NOT NULL,
12
+ "description" TEXT,
13
+ "sourceType" TEXT NOT NULL,
14
+ "sourceUri" TEXT,
15
+ "path" TEXT NOT NULL,
16
+ "isEnabled" BOOLEAN NOT NULL DEFAULT true,
17
+ "manifest" TEXT,
18
+ "settings" TEXT DEFAULT '{}',
19
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
20
+ CONSTRAINT "InstalledPlugin_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
21
+ );
22
+ INSERT INTO "new_InstalledPlugin" ("botId", "description", "id", "isEnabled", "manifest", "name", "path", "settings", "sourceType", "sourceUri", "version") SELECT "botId", "description", "id", "isEnabled", "manifest", "name", "path", "settings", "sourceType", "sourceUri", "version" FROM "InstalledPlugin";
23
+ DROP TABLE "InstalledPlugin";
24
+ ALTER TABLE "new_InstalledPlugin" RENAME TO "InstalledPlugin";
25
+ CREATE UNIQUE INDEX "InstalledPlugin_botId_name_key" ON "InstalledPlugin"("botId", "name");
26
+ PRAGMA foreign_keys=ON;
27
+ PRAGMA defer_foreign_keys=OFF;
@@ -0,0 +1,3 @@
1
+ # Please do not edit this file manually
2
+ # It should be added in your version-control system (i.e. Git)
3
+ provider = "sqlite"
@@ -0,0 +1,138 @@
1
+ // backend/prisma/schema.prisma
2
+
3
+ generator client {
4
+ provider = "prisma-client-js"
5
+ }
6
+
7
+ datasource db {
8
+ provider = "sqlite"
9
+ url = "file:./dev.db"
10
+ }
11
+
12
+ model Server {
13
+ id Int @id @default(autoincrement())
14
+ name String @unique
15
+ host String
16
+ port Int @default(25565)
17
+ version String
18
+ bots Bot[]
19
+ }
20
+
21
+ model Bot {
22
+ id Int @id @default(autoincrement())
23
+ username String @unique
24
+ password String?
25
+ prefix String? @default("@")
26
+ note String?
27
+ owners String? @default("")
28
+
29
+ server Server @relation(fields: [serverId], references: [id])
30
+ serverId Int
31
+
32
+ proxyHost String?
33
+ proxyPort Int?
34
+ proxyUsername String?
35
+ proxyPassword String?
36
+
37
+ installedPlugins InstalledPlugin[]
38
+ users User[]
39
+ groups Group[]
40
+ permissions Permission[]
41
+ commands Command[]
42
+
43
+ createdAt DateTime @default(now())
44
+ updatedAt DateTime @updatedAt
45
+ }
46
+
47
+
48
+ model InstalledPlugin {
49
+ id Int @id @default(autoincrement())
50
+ botId Int
51
+ bot Bot @relation(fields: [botId], references: [id], onDelete: Cascade)
52
+ name String
53
+ version String
54
+ description String?
55
+ sourceType String
56
+ sourceUri String?
57
+ path String
58
+ isEnabled Boolean @default(true)
59
+
60
+ manifest String?
61
+ settings String? @default("{}")
62
+
63
+ createdAt DateTime @default(now())
64
+
65
+ @@unique([botId, name])
66
+ }
67
+
68
+ model Command {
69
+ id Int @id @default(autoincrement())
70
+ botId Int
71
+ bot Bot @relation(fields: [botId], references: [id], onDelete: Cascade)
72
+ name String
73
+ isEnabled Boolean @default(true)
74
+ cooldown Int @default(0)
75
+ aliases String @default("[]") // Храним как джсон строку
76
+ description String?
77
+ owner String?
78
+ permissionId Int?
79
+ permission Permission? @relation(fields: [permissionId], references: [id], onDelete: SetNull)
80
+ allowedChatTypes String @default("[\"chat\", \"private\"]")
81
+
82
+ @@unique([botId, name])
83
+ }
84
+
85
+ model User {
86
+ id Int @id @default(autoincrement())
87
+ username String
88
+ isBlacklisted Boolean @default(false)
89
+ botId Int
90
+ bot Bot @relation(fields: [botId], references: [id], onDelete: Cascade)
91
+ groups UserGroup[]
92
+
93
+ @@unique([botId, username])
94
+ }
95
+
96
+ model Group {
97
+ id Int @id @default(autoincrement())
98
+ name String
99
+ owner String @default("system")
100
+ botId Int
101
+ bot Bot @relation(fields: [botId], references: [id], onDelete: Cascade)
102
+ permissions GroupPermission[]
103
+ users UserGroup[]
104
+
105
+ @@unique([botId, name])
106
+ }
107
+
108
+ model Permission {
109
+ id Int @id @default(autoincrement())
110
+ name String
111
+ description String?
112
+ owner String @default("system")
113
+ botId Int
114
+ bot Bot @relation(fields: [botId], references: [id], onDelete: Cascade)
115
+ groups GroupPermission[]
116
+ commands Command[]
117
+
118
+ @@unique([botId, name])
119
+ }
120
+
121
+
122
+ model UserGroup {
123
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
124
+ userId Int
125
+ group Group @relation(fields: [groupId], references: [id], onDelete: Cascade)
126
+ groupId Int
127
+
128
+ @@id([userId, groupId])
129
+ }
130
+
131
+ model GroupPermission {
132
+ group Group @relation(fields: [groupId], references: [id], onDelete: Cascade)
133
+ groupId Int
134
+ permission Permission @relation(fields: [permissionId], references: [id], onDelete: Cascade)
135
+ permissionId Int
136
+
137
+ @@id([groupId, permissionId])
138
+ }
@@ -0,0 +1,60 @@
1
+ const { PrismaClient } = require('@prisma/client');
2
+ const prisma = new PrismaClient();
3
+
4
+ const initialServers = [
5
+ {
6
+ name: 'Local Test Server',
7
+ host: '127.0.0.1',
8
+ port: 25565,
9
+ version: '1.20.4'
10
+ },
11
+ {
12
+ name: 'MineBlaze',
13
+ host: 'mc.mineblaze.net',
14
+ port: 25565,
15
+ version: '1.20.1'
16
+ },
17
+ {
18
+ name: 'MasedWorld',
19
+ host: 'mc.masedworld.net',
20
+ port: 25565,
21
+ version: '1.20.1'
22
+ },
23
+ {
24
+ name: 'DexLand',
25
+ host: 'mc.dexland.org',
26
+ port: 25565,
27
+ version: '1.20.1'
28
+ },
29
+ {
30
+ name: 'CheatMine',
31
+ host: 'mc.cheatmine.net',
32
+ port: 25565,
33
+ version: '1.20.1'
34
+ }
35
+ ];
36
+
37
+ async function main() {
38
+ console.log('Start seeding initial servers...');
39
+
40
+ await Promise.all(
41
+ initialServers.map(server =>
42
+ prisma.server.upsert({
43
+ where: { name: server.name },
44
+ update: {},
45
+ create: server,
46
+ })
47
+ )
48
+ );
49
+
50
+ console.log(`${initialServers.length} серверов были успешно созданы или уже существовали.`);
51
+ }
52
+
53
+ main()
54
+ .catch((e) => {
55
+ console.error('Error during seeding:', e);
56
+ process.exit(1);
57
+ })
58
+ .finally(async () => {
59
+ await prisma.$disconnect();
60
+ });