diff --git a/services/minecraft/package.json b/services/minecraft/package.json index 00c599f23..32a5fc2e7 100644 --- a/services/minecraft/package.json +++ b/services/minecraft/package.json @@ -19,6 +19,7 @@ "es-toolkit": "^1.44.0", "eventemitter3": "^5.0.4", "minecraft-data": "^3.102.3", + "canvas": "^3.2.1", "mineflayer": "^4.33.0", "mineflayer-armor-manager": "^2.0.1", "mineflayer-auto-eat": "^5.0.3", diff --git a/services/minecraft/src/debug/mineflayer-viewer.ts b/services/minecraft/src/debug/mineflayer-viewer.ts new file mode 100644 index 000000000..06af9f16e --- /dev/null +++ b/services/minecraft/src/debug/mineflayer-viewer.ts @@ -0,0 +1,44 @@ +import type { Bot } from 'mineflayer' + +import { useLogger } from '../utils/logger' + +interface MineflayerViewerOptions { + port: number + firstPerson?: boolean +} + +export function setupMineflayerViewer(mineflayer: { bot: Bot }, options: MineflayerViewerOptions): void { + let isViewerStarted = false + + mineflayer.bot.once('spawn', async () => { + if (isViewerStarted) + return + + isViewerStarted = true + + const logger = useLogger() + try { + const { mineflayer: mineflayerViewer } = await import('prismarine-viewer') + + mineflayerViewer(mineflayer.bot, { + port: options.port, + firstPerson: options.firstPerson ?? true, + }) + + logger.log(`Mineflayer viewer running at http://localhost:${options.port}`) + } + catch (err) { + const e = err as NodeJS.ErrnoException + const message = typeof e.message === 'string' ? e.message : '' + const isCanvasMissing = e?.code === 'MODULE_NOT_FOUND' && message.includes('\'canvas\'') + const isCanvasBinaryMissing = e?.code === 'MODULE_NOT_FOUND' && message.includes('canvas.node') + + if (isCanvasMissing || isCanvasBinaryMissing) { + logger.log('Mineflayer viewer disabled: node-canvas is not available') + return + } + + logger.errorWithError('Failed to start mineflayer viewer', e as Error) + } + }) +} diff --git a/services/minecraft/src/debug/server.ts b/services/minecraft/src/debug/server.ts index d22b4742a..e51e28bfe 100644 --- a/services/minecraft/src/debug/server.ts +++ b/services/minecraft/src/debug/server.ts @@ -18,6 +18,24 @@ import { useLogger } from '../utils/logger' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) +function createViewerHtml(targetUrl: string): string { + return ` + +
+ + +