mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-05 19:20:12 +08:00
refactor: remove print.js and simplify response handling in cli.js
This commit is contained in:
1 parent
56049a0a29
commit
0685d71299
2 files changed
+1
-140
No files matched your search
@@ -3,7 +3,6 @@ const fs = require('fs').promises
|
|||||||
const { exit } = require('process')
|
const { exit } = require('process')
|
||||||
const minimist = require('minimist')
|
const minimist = require('minimist')
|
||||||
const axios = require('axios')
|
const axios = require('axios')
|
||||||
const { colorize, printResponses, printHints } = require('./print.js')
|
|
||||||
const discoverFiles = require('./discover.js')
|
const discoverFiles = require('./discover.js')
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@@ -46,19 +45,6 @@ async function handleCommand(command) {
|
|||||||
}, {})
|
}, {})
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handleResponse({ responses, hints, end }) {
|
|
||||||
if (responses) {
|
|
||||||
await printResponses(responses, 90)
|
|
||||||
}
|
|
||||||
if (hints) {
|
|
||||||
await printHints(hints, 90)
|
|
||||||
}
|
|
||||||
if (end) {
|
|
||||||
console.log(colorize('Quest completed!', 'blue'))
|
|
||||||
}
|
|
||||||
await api.post('/commands/completed')
|
|
||||||
}
|
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
if (!CMD_NAME) exit(0)
|
if (!CMD_NAME) exit(0)
|
||||||
|
|
||||||
@@ -74,17 +60,7 @@ async function main() {
|
|||||||
pwd: PWD,
|
pwd: PWD,
|
||||||
params,
|
params,
|
||||||
}
|
}
|
||||||
try {
|
await api.post('/commands', payload)
|
||||||
const res = await api.post('/commands', payload)
|
|
||||||
if (!res.data || !res.data.responses) return
|
|
||||||
await handleResponse(res.data)
|
|
||||||
} catch (err) {
|
|
||||||
if (err.response) {
|
|
||||||
console.error(err.response.data)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
console.error(err.message)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,115 +0,0 @@
|
|||||||
/* eslint-disable no-restricted-syntax */
|
|
||||||
/* eslint-disable no-await-in-loop */
|
|
||||||
const readline = require('readline')
|
|
||||||
|
|
||||||
const RETURN_SYMBOL = '\u21B5'
|
|
||||||
|
|
||||||
// ANSI color map
|
|
||||||
const ANSI_COLORS = {
|
|
||||||
default: 0,
|
|
||||||
black: 30,
|
|
||||||
red: 31,
|
|
||||||
green: 32,
|
|
||||||
yellow: 33,
|
|
||||||
blue: 34,
|
|
||||||
magenta: 35,
|
|
||||||
cyan: 36,
|
|
||||||
white: 37,
|
|
||||||
}
|
|
||||||
|
|
||||||
function colorCode(color) {
|
|
||||||
return `\x1b[${ANSI_COLORS[color]}m`
|
|
||||||
}
|
|
||||||
|
|
||||||
function colorize(content, color) {
|
|
||||||
if (!color) return content
|
|
||||||
return `${colorCode(color)}${content}${colorCode('default')}`
|
|
||||||
}
|
|
||||||
|
|
||||||
process.stdin.setRawMode(true)
|
|
||||||
|
|
||||||
const rl = readline.createInterface({
|
|
||||||
input: process.stdin,
|
|
||||||
output: process.stdout,
|
|
||||||
terminal: false,
|
|
||||||
})
|
|
||||||
|
|
||||||
function waitForEnter() {
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
rl.once('line', resolve)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function formatLine(content, color) {
|
|
||||||
let result = colorCode(color)
|
|
||||||
let codeBlock = false
|
|
||||||
for (const c of content) {
|
|
||||||
switch (c) {
|
|
||||||
case '`':
|
|
||||||
result += colorCode(codeBlock ? color : 'green')
|
|
||||||
codeBlock = !codeBlock
|
|
||||||
break
|
|
||||||
|
|
||||||
default:
|
|
||||||
result += c
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result + colorCode('default') + RETURN_SYMBOL
|
|
||||||
}
|
|
||||||
|
|
||||||
function printLine(content, delay, color) {
|
|
||||||
const printContent = formatLine(content, color)
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
let i = 0
|
|
||||||
const timer = setInterval(() => {
|
|
||||||
process.stdout.write(printContent[i])
|
|
||||||
i += 1
|
|
||||||
if (i >= printContent.length) {
|
|
||||||
clearInterval(timer)
|
|
||||||
process.stdout.write('\n')
|
|
||||||
resolve()
|
|
||||||
}
|
|
||||||
}, delay)
|
|
||||||
|
|
||||||
waitForEnter().then(() => {
|
|
||||||
clearInterval(timer)
|
|
||||||
if (i >= printContent.length) return
|
|
||||||
process.stdout.write(printContent.slice(i))
|
|
||||||
process.stdout.write('\n')
|
|
||||||
resolve()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
async function printResponses(responses, delay = 100) {
|
|
||||||
console.log()
|
|
||||||
console.log(colorize('==============================', 'green'))
|
|
||||||
for (const response of responses) {
|
|
||||||
const { type, content, speaker, color } = response
|
|
||||||
if (type === 'narrative') {
|
|
||||||
for (const line of content) {
|
|
||||||
await printLine(line, delay, color || 'cyan')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (type === 'dialogue') {
|
|
||||||
console.log(colorize(`${speaker}:`, 'green'))
|
|
||||||
for (const line of content) {
|
|
||||||
await printLine(` ${line}`, delay, color || 'cyan')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log(colorize('------------------------------', 'green'))
|
|
||||||
console.log()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function printHints(hints, delay = 100) {
|
|
||||||
for (const hint of hints) {
|
|
||||||
await printLine(hint, delay, 'yellow')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
printResponses,
|
|
||||||
printHints,
|
|
||||||
colorize,
|
|
||||||
}
|
|
||||||
Reference in new issue
Block a user