diff --git a/docker-compose.yml b/docker-compose.yml index e5b2474..d9fc5e2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,8 +21,9 @@ services: - '3000:3000' volumes: - /var/run/docker.sock:/var/run/docker.sock - - ./server/src:/app/src - - ./server/swagger.yaml:/app/swagger.yaml + - ./server/src:/app/server/src + - ./server/swagger.yaml:/app/server/swagger.yaml + - ./packages:/app/packages - ./quests:/app/quests environment: - MONGO_URL=mongodb://db:27017/odyssey-test diff --git a/packages/file-graph/fileGraph.js b/packages/file-graph/fileGraph.js index 611fc4c..7bfda7d 100644 --- a/packages/file-graph/fileGraph.js +++ b/packages/file-graph/fileGraph.js @@ -54,4 +54,8 @@ export default class FileGraph { // Implement other cases if needed } } + + toJSON() { + return this.root.toJSON() + } } diff --git a/packages/file-graph/index.js b/packages/file-graph/index.js new file mode 100644 index 0000000..4b1fcda --- /dev/null +++ b/packages/file-graph/index.js @@ -0,0 +1,3 @@ +export { default as File } from './file.js' +export { default as FileNode } from './fileNode.js' +export { default as FileGraph } from './fileGraph.js' diff --git a/packages/file-graph/package.json b/packages/file-graph/package.json index 69b2535..59d0b82 100644 --- a/packages/file-graph/package.json +++ b/packages/file-graph/package.json @@ -1,7 +1,8 @@ { - "name": "file-graph", + "name": "@linux-odyssey/file-graph", "version": "1.0.0", "main": "index.js", + "exports": "./index.js", "license": "MIT", "type": "module", "scripts": { diff --git a/server/Dockerfile b/server/Dockerfile index 6ee9ddd..078876b 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -1,13 +1,17 @@ FROM node WORKDIR /app -COPY server/package.json yarn.lock ./ +COPY ./package.json yarn.lock ./ +COPY server/package.json ./server/package.json +COPY packages/file-graph/package.json ./packages/file-graph/package.json RUN yarn install --frozen-lockfile --production -COPY server/src ./src -COPY server/swagger.yaml . +COPY ./server ./server +COPY packages/file-graph ./packages/file-graph COPY quests ./quests +WORKDIR /app/server + ENV NODE_ENV=production ENV HOST=0.0.0.0 ENV PORT=3000 diff --git a/server/Dockerfile.dev b/server/Dockerfile.dev index 86186c2..738d4ea 100644 --- a/server/Dockerfile.dev +++ b/server/Dockerfile.dev @@ -1,7 +1,9 @@ FROM node WORKDIR /app -COPY server/package.json yarn.lock ./ +COPY package.json yarn.lock ./ +COPY server/package.json ./server/package.json +COPY packages/file-graph/package.json ./packages/file-graph/package.json RUN yarn install --frozen-lockfile ENV NODE_ENV=development @@ -9,4 +11,4 @@ ENV HOST=0.0.0.0 ENV PORT=3000 EXPOSE 3000 -CMD [ "yarn", "dev" ] \ No newline at end of file +CMD [ "yarn", "server" ] \ No newline at end of file diff --git a/server/package.json b/server/package.json index 0fe6b1f..d30d738 100644 --- a/server/package.json +++ b/server/package.json @@ -10,6 +10,7 @@ "clean": "node src/cli/clean.js" }, "dependencies": { + "@linux-odyssey/file-graph": "1.0.0", "commander": "^11.0.0", "dockerode": "^3.3.5", "express": "^4.18.2", diff --git a/server/src/game/commandHandler.js b/server/src/game/commandHandler.js index 35335f3..caa7487 100644 --- a/server/src/game/commandHandler.js +++ b/server/src/game/commandHandler.js @@ -1,7 +1,10 @@ import minimist from 'minimist' +import { FileGraph } from '@linux-odyssey/file-graph' import Quest from '../models/quest.js' import { pushToSession } from '../api/socket.js' +console.log(typeof FileGraph) + // 檢查 pattern 是否符合 input const checkMatch = (pattern, input) => { if (pattern.length === 0) return true @@ -11,6 +14,40 @@ const checkMatch = (pattern, input) => { }) } +async function discoverHandler(session, commandInput, additionalData) { + const graph = new FileGraph(session.graph) + graph.discover(additionalData.discover) + console.log('graph:', graph.toString()) + session.graph = graph.toJSON() + await session.save() +} + +const pushGraph = (session, commandInput, additionalData) => { + pushToSession(session.id, 'graph', { + pwd: commandInput.pwd, + discover: additionalData.discover, + }) +} + +const eventListenr = { + add: [], + remove: [], + discover: [discoverHandler, pushGraph], + pwd: [], +} + +function handleEvent(session, commandInput, additionalData) { + const events = Object.keys(additionalData) + events.forEach((event) => { + const handlers = eventListenr[event] + if (handlers) { + handlers.forEach((handler) => + handler(session, commandInput, additionalData) + ) + } + }) +} + async function commandHandler(session, commandInput, additionalData) { const quest = await Quest.findById(session.quest) const stage = quest.stages.find((s) => s.id === session.progress) @@ -21,12 +58,8 @@ async function commandHandler(session, commandInput, additionalData) { const argv = minimist(commandInput.command.split(' ')) - if ('discover' in additionalData) { - pushToSession(session.id, 'graph', { - pwd: commandInput.pwd, - discover: additionalData.discover, - }) - } else if (argv._[0] === 'cd') { + handleEvent(session, commandInput, additionalData) + if (argv._[0] === 'cd') { pushToSession(session.id, 'graph', { pwd: commandInput.pwd }) } diff --git a/server/src/utils/quest.js b/server/src/utils/quest.js index e8a2276..315528f 100644 --- a/server/src/utils/quest.js +++ b/server/src/utils/quest.js @@ -4,7 +4,7 @@ import yaml from 'yaml' import Quest from '../models/quest.js' -const questDirectory = path.join(process.cwd(), 'quests') +const questDirectory = path.join(process.cwd(), '..', 'quests') export default async function loadAndUpdateQuests() { const questNames = await fs.readdir(questDirectory)