@sprucelabs/spruce-cli
Version:
Command line interface for building Spruce skills.
60 lines (52 loc) • 1.89 kB
text/typescript
import { diskUtil } from '@sprucelabs/spruce-skill-utils'
import TerminalInterface from '../interfaces/TerminalInterface'
import { CommandService } from './CommandService'
export default class GameService {
private command: CommandService
private ui: TerminalInterface
private statusMessage?: string
private killed = false
public constructor(command: CommandService, ui: TerminalInterface) {
this.command = command
this.ui = ui
this.command.setCwd(diskUtil.resolvePath(__dirname, '../../'))
}
public setStatusMessage(message: string) {
this.statusMessage = message
}
public async play(introductionSentences: string[] = []) {
const sentencesToPlay = [...introductionSentences]
await this.ui.stopLoading()
this.killed = false
while (sentencesToPlay.length > 0) {
const next = sentencesToPlay.shift() as string
this.ui.renderLine(next)
await new Promise((r) => setTimeout(r, 2000))
if (this.killed) {
return
}
}
await this.command.execute('node ./node_modules/.bin/js-tetris-cli', {
spawnOptions: {
stdio: [process.stdin, 'pipe', 'pipe'],
},
onData: (data: string) => {
if (!this.killed) {
process.stdout?.write(data)
if (this.statusMessage) {
this.ui.saveCursor()
this.ui.moveCursorTo(0, 25)
this.ui.clearBelowCursor()
process.stdout?.write(this.statusMessage)
this.ui.restoreCursor()
}
}
},
})
}
public kill() {
this.killed = true
this.command.kill()
this.ui.clear()
}
}