mindcraft/utils/coder.js
2023-11-07 20:21:19 -08:00

76 lines
No EOL
2.4 KiB
JavaScript

import { writeFile, unlink } from 'fs';
export class Coder {
constructor(agent) {
this.agent = agent;
this.current_code = '';
this.file_counter = 0;
this.fp = './agent_code/';
}
queueCode(code) {
if (code.startsWith('javascript'))
code = code.slice(10);
this.current_code = code;
}
hasCode() {
return this.current_code.length > 0;
}
writeFilePromise(filename, src) {
// makes it so we can await this function
return new Promise((resolve, reject) => {
writeFile(filename, src, (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
async execute() {
if (!this.current_code) return {success: false, message: "No code to execute."};
let src = "import * as skills from '../utils/skills.js';";
src += "\nimport * as world from '../utils/world.js';"
src += `\n\nexport async function main(bot) {\n`;
for (let line of this.current_code.split('\n')) {
src += ` ${line}\n`;
}
src += ` return true;\n}\n`; // potentially redundant return statement, in case agent doesn't return anything
console.log("writing to file...", src)
let filename = this.fp + this.file_counter + '.js';
if (this.file_counter > 0) {
let prev_filename = this.fp + (this.file_counter-1) + '.js';
unlink(prev_filename, (err) => {
console.log("deleted file " + prev_filename);
if (err) console.error(err);
});
}
this.file_counter++;
let result = await this.writeFilePromise(filename, src);
if (result) {
console.error('Error writing code execution file: ' + result);
return {success: false, message: result};
}
try {
console.log('executing code...\n');
let execution_file = await import('.'+filename);
let success = await execution_file.main(this.agent.bot);
this.current_code = '';
return {success, message: ""};
} catch (err) {
console.error("Problem executing code:" + err);
this.current_code = '';
return {success: false, message: err};
}
}
}