You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
3.8 KiB
TypeScript

import * as fs from "fs";
import { BehaviorNodeTypeModel } from "../common/BehaviorTreeModel";
import * as glob from "glob";
import * as path from "path";
export interface ServerModel {
name: string;
host: string;
}
export interface WorkspaceModel {
isRelative?: boolean;
nodeConfPath: string;
workdir: string;
servers?: ServerModel[];
}
const unknowNodeType: BehaviorNodeTypeModel = {
name: "unknow",
desc: "新建节点",
type: "Action",
};
export default class Workspace {
private filepath: string;
private nodeConfPath: string;
private workdir: string;
private model: WorkspaceModel;
private name2conf: { [name: string]: BehaviorNodeTypeModel } = {};
private types: BehaviorNodeTypeModel[] = [];
constructor(filepath: string) {
this.filepath = filepath;
}
load() {
if (!this.filepath) {
return;
}
try {
const str = fs.readFileSync(this.filepath, "utf8");
const model = JSON.parse(str) as WorkspaceModel;
if (model.isRelative) {
const root = path.dirname(this.filepath);
this.nodeConfPath = path.join(root,model.nodeConfPath);
this.workdir = path.join(root,model.workdir);
} else {
this.nodeConfPath = model.nodeConfPath;
this.workdir = model.workdir;
}
this.model = model;
this.initNodeConf();
} catch (error) {
console.log(error);
}
}
private initNodeConf() {
if (!this.nodeConfPath) {
return;
}
const types: BehaviorNodeTypeModel[] = JSON.parse(
fs.readFileSync(this.nodeConfPath, "utf8")
);
this.name2conf = {};
types.forEach((t) => {
this.name2conf[t.name] = t;
});
this.types = types;
}
getNodeConfPath() {
return this.nodeConfPath;
}
setNodeConfPath(path: string) {
this.nodeConfPath = path;
this.initNodeConf();
}
getWorkdir(): string {
return this.workdir;
}
setWorkdir(workdir: string) {
this.workdir = workdir;
}
getServers() {
if(this.model && this.model.servers) {
return this.model.servers;
} else {
return [];
}
}
getModel() {
return this.model;
}
writeAllTrees(outFilePath: string, cb?: (err: string) => void) {
if (!fs.existsSync(this.getWorkdir())) {
cb && cb("请先打开工作区");
return;
}
glob.glob(path.join(this.getWorkdir(), "**/*.json"), function (err, files) {
if (err) {
console.error(err);
cb && cb(err.message);
return;
}
let result = new Array();
files.forEach((file) => {
const data = fs.readFileSync(file, "utf8");
result.push(JSON.parse(data));
});
fs.writeFileSync(outFilePath, JSON.stringify(result, null, 2));
cb && cb(null);
});
}
save(filepath?: string) {
if (filepath) {
this.filepath = filepath;
}
if (!this.filepath) {
return;
}
fs.writeFileSync(
this.filepath,
JSON.stringify(
{
nodeConfPath: this.nodeConfPath,
workdir: this.workdir,
},
null,
2
)
);
}
get nodeConf() {
return this.types;
}
getFilepath() {
return this.filepath;
}
setFilepath(filepath: string) {
this.filepath = filepath;
}
getNodeConf(name: string) {
return this.name2conf[name] || unknowNodeType;
}
}