new format args

This commit is contained in:
jane 2021-05-26 20:18:11 -04:00
parent 0e827d1c85
commit 1e30598bc4
4 changed files with 212 additions and 218 deletions

104
bot.js
View file

@ -10,7 +10,7 @@ import fs from 'fs';
const cfg = require('./config.json'); const cfg = require('./config.json');
if (!fs.existsSync('./whitelist.json')) { if (!fs.existsSync('./whitelist.json')) {
fs.writeFileSync('./whitelist.json', '{}'); fs.writeFileSync('./whitelist.json', '{}');
} }
const whitelist = require('./whitelist.json'); const whitelist = require('./whitelist.json');
@ -19,45 +19,49 @@ const dir = dirname(import.meta.url);
const bot = new Eris(cfg.token); const bot = new Eris(cfg.token);
global.ctx = { global.ctx = {
bot: bot, bot: bot,
log_level: levels[cfg.log_level.toUpperCase()] || levels.WARN, log_level: levels[cfg.log_level.toUpperCase()] || levels.WARN,
set_ctx: (key, value) => { set_ctx: (key, value) => {
global.ctx[key] = value; global.ctx[key] = value;
}, },
lights: {
port: cfg.lights_port,
addr: cfg.lights_address
}
}; };
const log = new Logger(filename(import.meta.url), global.ctx.log_level); const log = new Logger(filename(import.meta.url), global.ctx.log_level);
const parse = new CommandParser(global.ctx, cfg.prefix || undefined); const parse = new CommandParser(global.ctx, cfg.prefix || undefined);
const checkUser = (user) => { const checkUser = (user) => {
if (cfg.user_whitelist.includes(user.id) || (whitelist.user && whitelist.user.includes(user.id))) { if (cfg.user_whitelist.includes(user.id) || (whitelist.user && whitelist.user.includes(user.id))) {
return true; return true;
} }
log.info(`user not on whitelist: ${user.username}`); log.info(`user not on whitelist: ${user.username}`);
return false; return false;
}; };
const checkGuild = (guild) => { const checkGuild = (guild) => {
if (cfg.whitelist.includes(guild.id) || (whitelist.guild && whitelist.guild.includes(guild.id))) { if (cfg.whitelist.includes(guild.id) || (whitelist.guild && whitelist.guild.includes(guild.id))) {
return true; return true;
} }
log.info(`guild not on whitelist: ${guild.name}`); log.info(`guild not on whitelist: ${guild.name}`);
return false; return false;
}; };
const saveWhitelist = () => { const saveWhitelist = () => {
let data = JSON.stringify(whitelist); let data = JSON.stringify(whitelist);
fs.writeFileSync('./whitelist.json', data); fs.writeFileSync('./whitelist.json', data);
}; };
global.ctx.whitelist = { global.ctx.whitelist = {
guild: checkGuild, guild: checkGuild,
user: checkUser, user: checkUser,
save: saveWhitelist, save: saveWhitelist,
wl: whitelist, wl: whitelist,
}; };
bot.on('ready', () => { bot.on('ready', () => {
log.info('ready recieved.'); log.info('ready recieved.');
bot.guilds.forEach((guild) => checkGuild(guild)); bot.guilds.forEach((guild) => checkGuild(guild));
}); });
bot.on('messageCreate', (msg) => parse.parseMsg(msg, global.ctx)); bot.on('messageCreate', (msg) => parse.parseMsg(msg, global.ctx));
@ -67,32 +71,32 @@ bot.on('error', (err) => log.error(err.toString()));
bot.connect(); bot.connect();
async function load_commands() { async function load_commands() {
for (let file of files) { for (let file of files) {
let p = path.join(cmd_dir, file); let p = path.join(cmd_dir, file);
log.debug(p); log.debug(p);
let obj; let obj;
try { try {
obj = await import('file:////' + p); obj = await import('file:////' + p);
} catch (e) { } catch (e) {
log.warn(`loading file ${file}, ran into issue: ${e.stack}`); log.warn(`loading file ${file}, ran into issue: ${e.stack}`);
continue; continue;
} }
if (obj.default != undefined) { if (obj.default != undefined) {
if (obj.default.constructor.name == 'CommandInitializer') { if (obj.default.constructor.name == 'CommandInitializer') {
obj.default.initialize(global.ctx); obj.default.initialize(global.ctx);
let cmds = obj.default.getCommands(); let cmds = obj.default.getCommands();
if (parse.isCmd(cmds)) { if (parse.isCmd(cmds)) {
parse.addCommand(cmds); parse.addCommand(cmds);
} else if (cmds.constructor.name == 'Array') { } else if (cmds.constructor.name == 'Array') {
for (let cmd of cmds) { for (let cmd of cmds) {
parse.addCommand(cmd); parse.addCommand(cmd);
} }
} }
} }
} else { } else {
log.warn('module ' + file + ' returned an undefined module.'); log.warn('module ' + file + ' returned an undefined module.');
} }
} }
} }
let cmd_dir = path.join(dir, 'cmd'); let cmd_dir = path.join(dir, 'cmd');

View file

@ -4,156 +4,165 @@ import { filename } from '../utils.js';
const log = new Logger(filename(import.meta.url), global.ctx.log_level); const log = new Logger(filename(import.meta.url), global.ctx.log_level);
class Target { class Target {
constructor(channel) { constructor(channel) {
this.channel = channel; this.channel = channel;
} }
channel; channel;
value; value;
} }
const available_targets = { const available_targets = {
r: new Target('r'), r: new Target('r'),
g: new Target('g'), g: new Target('g'),
b: new Target('b'), b: new Target('b'),
stack: new Target('stack'), stack: new Target('stack'),
stack2: new Target('stack2'), stack2: new Target('stack2'),
stack3: new Target('stack3'), stack3: new Target('stack3'),
stack4: new Target('stack4'), stack4: new Target('stack4'),
stack5: new Target('stack5'), stack5: new Target('stack5'),
stack6: new Target('stack6'), stack6: new Target('stack6'),
stack6: new Target('stackr'), stack6: new Target('stackr'),
stack6: new Target('stackg'), stack6: new Target('stackg'),
stack6: new Target('stackb'), stack6: new Target('stackb'),
tick: new Target('tick'), tick: new Target('tick'),
index: new Target('index'), index: new Target('index'),
}; };
class Instruction { class Instruction {
constructor(name, targets, args) { constructor(name, targets, args) {
let valid_targets = []; let valid_targets = [];
targets.forEach((t) => { let matched_args = [];
if (t instanceof Target) { targets.forEach((t, i) => {
let match = Object.keys(available_targets).find((key) => available_targets[key].channel === t.channel); if (t instanceof Target) {
if (match) { let match = Object.keys(available_targets).find((key) => available_targets[key].channel === t.channel);
valid_targets.push(t); if (match) {
} if (args[i]) {
} matched_args.push({
}); ...t,
this.name = name; arg: args[i]
this.targets = valid_targets; })
this.args = args; }
} else {
name; matched_args.push(t);
targets; }
args; }
}
});
this.name = name;
this.targets = valid_targets;
this.args = matched_args;
}
name;
targets;
args;
} }
export const instructions = [ export const instructions = [
{ n: 'CONSTANT', a: true }, { n: 'CONSTANT', a: true },
{ n: 'ADD', a: true }, { n: 'ADD', a: true },
{ n: 'SUBTRACT', a: true }, { n: 'SUBTRACT', a: true },
{ n: 'MULTIPLY', a: true }, { n: 'MULTIPLY', a: true },
{ n: 'DIVIDE', a: true }, { n: 'DIVIDE', a: true },
{ n: 'MODULO', a: true }, { n: 'MODULO', a: true },
{ n: 'FADE', a: true }, { n: 'FADE', a: true },
{ n: 'RANDOM', a: false }, { n: 'RANDOM', a: false },
{ n: 'JMP', a: false }, { n: 'JMP', a: false },
{ n: 'JNZ', a: true }, { n: 'JNZ', a: true },
{ n: 'JEZ', a: true }, { n: 'JEZ', a: true },
]; ];
export function initialize(ctx) { export function initialize(ctx) {
log.s(ctx.log_level); log.s(ctx.log_level);
} }
function parseSingleInstruction(str = '') { function parseSingleInstruction(str = '') {
let item = { let item = {
valid: false, valid: false,
instruction: undefined, instruction: undefined,
errors: undefined, errors: undefined,
}; };
let split = str.split(' '); let split = str.split(' ');
let cmd = split[0]; let cmd = split[0];
log.debug(cmd); log.debug(cmd);
let match = instructions.filter((i) => i.n == cmd.toUpperCase()); let match = instructions.filter((i) => i.n == cmd.toUpperCase());
log.debug(match); log.debug(match);
split = split.slice(1); split = split.slice(1);
if (match.length) { if (match.length) {
let inst_targets = []; let inst_targets = [];
let inst_args = []; let inst_args = [];
let parsed_args = []; let parsed_args = [];
let join_index = -1; let join_index = -1;
let add = true; let add = true;
for (let index in split) { for (let index in split) {
if (split[index].startsWith('[')) { if (split[index].startsWith('[')) {
join_index = index; join_index = index;
add = false; add = false;
} }
if (add) { if (add) {
parsed_args.push(split[index]); parsed_args.push(split[index]);
} }
if (split[index].endsWith(']') && join_index != -1) { if (split[index].endsWith(']') && join_index != -1) {
let joined = split let joined = split
.slice(join_index, index + 1) .slice(join_index, index + 1)
.join(' ') .join(' ')
.replace(/[\[\]]/g, ''); .replace(/[\[\]]/g, '');
parsed_args.push(joined); parsed_args.push(joined);
add = true; add = true;
join_index = -1; join_index = -1;
} }
} }
inst_targets = parsed_args[0] inst_targets = parsed_args[0]
.split(',') .split(',')
.map((s) => s.trim()) .map((s) => s.trim())
.map((t) => new Target(t)); .map((t) => new Target(t));
if (!inst_targets.length) { if (!inst_targets.length) {
item.errors = 'No valid targets.'; item.errors = 'No valid targets.';
} }
inst_targets.forEach((t) => { inst_targets.forEach((t) => {
let match = Object.keys(available_targets).find((key) => available_targets[key].channel === t.channel); let match = Object.keys(available_targets).find((key) => available_targets[key].channel === t.channel);
if (!match) { if (!match) {
item.errors = `Invalid target: ${t.channel}`; item.errors = `Invalid target: ${t.channel}`;
} }
}); });
if (match[0].a) { if (match[0].a) {
if (parsed_args.length < 2) { if (parsed_args.length < 2) {
item.errors = 'Not enough arguments.'; item.errors = 'Not enough arguments.';
return item; return item;
} }
inst_args = parsed_args[1] inst_args = parsed_args[1]
.split(',') .split(',')
.map((s) => s.trim()) .map((s) => s.trim())
.map((s) => (available_targets[s] ? s : parseInt(s))); .map((s) => (available_targets[s] ? s : parseInt(s)));
if (!inst_args.length) { if (!inst_args.length) {
item.errors = 'No valid args.'; item.errors = 'No valid args.';
} }
inst_args.forEach((arg) => { inst_args.forEach((arg) => {
if (arg === NaN) { if (arg === NaN) {
item.errors = 'An argument is null or undefined.'; item.errors = 'An argument is null or undefined.';
} }
}); });
} }
if (item.errors) { if (item.errors) {
return item; return item;
} }
item.instruction = new Instruction(match[0].n, inst_targets, inst_args || []); item.instruction = new Instruction(match[0].n, inst_targets, inst_args || []);
} else { } else {
item.errors = 'No command matched.'; item.errors = 'No command matched.';
return item; return item;
} }
item.valid = true; item.valid = true;
return item; return item;
} }
export default function parse(str) { export default function parse(str) {
let parsed = []; let parsed = [];
let split = str.split('\n').filter((s) => s.length > 0); let split = str.split('\n').filter((s) => s.length > 0);
split.forEach((item) => { split.forEach((item) => {
let parsedItem = parseSingleInstruction(item); let parsedItem = parseSingleInstruction(item);
parsed.push(parsedItem); parsed.push(parsedItem);
log.debug(item); log.debug(item);
}); });
return parsed; return parsed;
} }

View file

@ -4,26 +4,29 @@ const hostname = '192.168.1.219';
const port = 29999; const port = 29999;
function getBinarySize(string) { function getBinarySize(string) {
return Buffer.byteLength(string, 'utf8'); return Buffer.byteLength(string, 'utf8');
} }
export default function req(data, callback, errorCallback) { export default function req(data, callback, errorCallback) {
let string_data = JSON.stringify(data); let string_data = JSON.stringify(data);
let size = getBinarySize(string_data); let size = getBinarySize(string_data);
if (size > 9999) { if (size > 9999) {
errorCallback("too long"); errorCallback("too long");
return; return;
} }
let client = new net.Socket(); let client = new net.Socket();
client.connect(port, hostname, () => {
client.write(string_data);
client.destroy();
callback('success.');
});
client.on('error', (e) => { let c_port = global.ctx.lights.port || port;
client.destroy(); let c_addr = global.ctx.lights.addr || hostname;
errorCallback(e); client.connect(c_port, c_addr, () => {
}); client.write(string_data);
client.destroy();
callback('success.');
});
client.on('error', (e) => {
client.destroy();
errorCallback(e);
});
} }

View file

@ -1,7 +1,6 @@
dependencies: dependencies:
eris: 0.14.0 eris: 0.14.0
socket.engine: 1.0.0 lockfileVersion: 5.2
lockfileVersion: 5.1
packages: packages:
/eris/0.14.0: /eris/0.14.0:
dependencies: dependencies:
@ -14,31 +13,11 @@ packages:
tweetnacl: 1.0.3 tweetnacl: 1.0.3
resolution: resolution:
integrity: sha512-/W6X0SFR2swtA9oc4ga5Wh1TQcZtPgbUaDDdwYc67fvFUAtwC+V1xzWUZq2yDeJnTfB8Uot9SJWA8Lthe2sDtQ== integrity: sha512-/W6X0SFR2swtA9oc4ga5Wh1TQcZtPgbUaDDdwYc67fvFUAtwC+V1xzWUZq2yDeJnTfB8Uot9SJWA8Lthe2sDtQ==
/fs/0.0.1-security:
dev: false
resolution:
integrity: sha1-invTcYa23d84E/I4WLV+yq9eQdQ=
/ip/1.1.5:
dev: false
resolution:
integrity: sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
/net/1.0.2:
dev: false
resolution:
integrity: sha1-0XV+yaf7I3HYPPR1XOPifhCCk4g=
/opusscript/0.0.7: /opusscript/0.0.7:
dev: false dev: false
optional: true optional: true
resolution: resolution:
integrity: sha512-DcBadTdYTUuH9zQtepsLjQn4Ll6rs3dmeFvN+SD0ThPnxRBRm/WC1zXWPg+wgAJimB784gdZvUMA57gDP7FdVg== integrity: sha512-DcBadTdYTUuH9zQtepsLjQn4Ll6rs3dmeFvN+SD0ThPnxRBRm/WC1zXWPg+wgAJimB784gdZvUMA57gDP7FdVg==
/socket.engine/1.0.0:
dependencies:
fs: 0.0.1-security
ip: 1.1.5
net: 1.0.2
dev: false
resolution:
integrity: sha512-vwc9JVBNe33686TBl9T3Ro53FaF09z11NVnrf0HIlYUOIDaZ1OFA1J1O6igU57qhP3NyUv4a+kZtgMm6SnziaQ==
/tweetnacl/1.0.3: /tweetnacl/1.0.3:
dev: false dev: false
optional: true optional: true
@ -60,4 +39,3 @@ packages:
integrity: sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== integrity: sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==
specifiers: specifiers:
eris: ^0.14.0 eris: ^0.14.0
socket.engine: ^1.0.0