defer to led server to provide functions
This commit is contained in:
parent
1e30598bc4
commit
03bbf03279
6 changed files with 183 additions and 157 deletions
5
bot.js
5
bot.js
|
@ -1,4 +1,6 @@
|
||||||
import { createRequire } from 'module';
|
import { createRequire } from 'module';
|
||||||
|
import { discover } from './lights/light_parser.js';
|
||||||
|
import { contactServer } from './lights/request.js';
|
||||||
const require = createRequire(import.meta.url);
|
const require = createRequire(import.meta.url);
|
||||||
|
|
||||||
import Eris from 'eris';
|
import Eris from 'eris';
|
||||||
|
@ -103,3 +105,6 @@ let cmd_dir = path.join(dir, 'cmd');
|
||||||
log.debug(dir);
|
log.debug(dir);
|
||||||
let files = fs.readdirSync(cmd_dir);
|
let files = fs.readdirSync(cmd_dir);
|
||||||
load_commands();
|
load_commands();
|
||||||
|
contactServer(discover, (err) => {
|
||||||
|
log.error(err);
|
||||||
|
})
|
||||||
|
|
|
@ -1,56 +1,57 @@
|
||||||
import { CommandInitializer, Command } from '../parser.js';
|
import { CommandInitializer, Command } from '../parser.js';
|
||||||
import parse, { initialize, instructions } from '../lights/light_parser.js';
|
import parse, { discover, initialize, instructions } from '../lights/light_parser.js';
|
||||||
import req from '../lights/request.js';
|
import req from '../lights/request.js';
|
||||||
|
|
||||||
const initializer = new CommandInitializer();
|
const initializer = new CommandInitializer();
|
||||||
|
|
||||||
class LightsParser extends Command {
|
class LightsParser extends Command {
|
||||||
init(ctx, log) {
|
init(ctx, log) {
|
||||||
this.log = log;
|
this.log = log;
|
||||||
initialize(ctx);
|
initialize(ctx);
|
||||||
}
|
}
|
||||||
name = 'lights';
|
name = 'lights';
|
||||||
whitelist = true;
|
whitelist = true;
|
||||||
func(msg, args, ctx) {
|
func(msg, args, ctx) {
|
||||||
if (ctx.sleep) {
|
if (ctx.sleep) {
|
||||||
msg.channel.createMessage('i have sleep mode enabled. the lights are probably off.');
|
msg.channel.createMessage('i have sleep mode enabled. the lights are probably off.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!args.length) {
|
if (!args.length) {
|
||||||
msg.channel.createMessage('no args found.');
|
msg.channel.createMessage('no args found.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let instructions = parse(args[0]);
|
let instructions = parse(args[0]);
|
||||||
|
|
||||||
this.log.debug(instructions);
|
this.log.debug(instructions);
|
||||||
let res = '```\n';
|
let res = '```\n';
|
||||||
instructions.forEach((instruction) => {
|
instructions.forEach((instruction) => {
|
||||||
res += JSON.stringify(instruction) + '\n';
|
res += JSON.stringify(instruction) + '\n';
|
||||||
});
|
});
|
||||||
res += '```';
|
res += '```';
|
||||||
msg.channel.createMessage(`parsed instructions:\n${res}`);
|
msg.channel.createMessage(`parsed instructions:\n${res}`);
|
||||||
req(
|
req(
|
||||||
instructions.filter((i) => i.valid),
|
instructions.filter((i) => i.valid),
|
||||||
(response) => {
|
(response) => {
|
||||||
msg.channel.createMessage(`${response}`);
|
msg.channel.createMessage(`${response}`);
|
||||||
},
|
},
|
||||||
(error) => {
|
discover,
|
||||||
msg.channel.createMessage(`error: ${error.message}`);
|
(error) => {
|
||||||
}
|
msg.channel.createMessage(`error: ${error.message}`);
|
||||||
);
|
}
|
||||||
}
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
initializer.addCommand(new LightsParser());
|
initializer.addCommand(new LightsParser());
|
||||||
|
|
||||||
class Sleep extends Command {
|
class Sleep extends Command {
|
||||||
name = 'sleep';
|
name = 'sleep';
|
||||||
whitelist = true;
|
whitelist = true;
|
||||||
func(msg, args, ctx) {
|
func(msg, args, ctx) {
|
||||||
let sleep = ctx.sleep;
|
let sleep = ctx.sleep;
|
||||||
sleep = !sleep;
|
sleep = !sleep;
|
||||||
msg.channel.createMessage(`sleep mode is now ${sleep ? 'on' : 'off'}`);
|
msg.channel.createMessage(`sleep mode is now ${sleep ? 'on' : 'off'}`);
|
||||||
ctx.set_ctx('sleep', sleep);
|
ctx.set_ctx('sleep', sleep);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
initializer.addCommand(new Sleep());
|
initializer.addCommand(new Sleep());
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import Logger, { levels } from '../logger.js';
|
import Logger, { levels } from '../logger.js';
|
||||||
import { filename } from '../utils.js';
|
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), "DEBUG");
|
||||||
|
|
||||||
class Target {
|
class Target {
|
||||||
constructor(channel) {
|
constructor(channel) {
|
||||||
|
@ -58,17 +58,6 @@ class Instruction {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const instructions = [
|
export const instructions = [
|
||||||
{ n: 'CONSTANT', a: true },
|
|
||||||
{ n: 'ADD', a: true },
|
|
||||||
{ n: 'SUBTRACT', a: true },
|
|
||||||
{ n: 'MULTIPLY', a: true },
|
|
||||||
{ n: 'DIVIDE', a: true },
|
|
||||||
{ n: 'MODULO', a: true },
|
|
||||||
{ n: 'FADE', a: true },
|
|
||||||
{ n: 'RANDOM', a: false },
|
|
||||||
{ n: 'JMP', a: false },
|
|
||||||
{ n: 'JNZ', a: true },
|
|
||||||
{ n: 'JEZ', a: true },
|
|
||||||
];
|
];
|
||||||
|
|
||||||
export function initialize(ctx) {
|
export function initialize(ctx) {
|
||||||
|
@ -156,6 +145,18 @@ function parseSingleInstruction(str = '') {
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function discover(data) {
|
||||||
|
for (let value of data) {
|
||||||
|
if (value.n != undefined) {
|
||||||
|
let found = instructions.filter((val) => { return val.n == value.n });
|
||||||
|
if (!found.length) {
|
||||||
|
log.debug(`discovered new keyword ${value.n}`);
|
||||||
|
instructions.push(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
|
|
@ -7,7 +7,22 @@ function getBinarySize(string) {
|
||||||
return Buffer.byteLength(string, 'utf8');
|
return Buffer.byteLength(string, 'utf8');
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function req(data, callback, errorCallback) {
|
export function contactServer(callback, errorCallback) {
|
||||||
|
let client = new net.Socket();
|
||||||
|
|
||||||
|
let c_port = global.ctx.lights.port || port;
|
||||||
|
let c_addr = global.ctx.lights.addr || hostname;
|
||||||
|
client.connect(c_port, c_addr, () => {
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('data', (dat) => {
|
||||||
|
let arr = JSON.parse(dat);
|
||||||
|
callback(arr);
|
||||||
|
client.destroy();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function req(data, callback, newFuncCallback, 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) {
|
||||||
|
@ -19,11 +34,15 @@ export default function req(data, callback, errorCallback) {
|
||||||
|
|
||||||
let c_port = global.ctx.lights.port || port;
|
let c_port = global.ctx.lights.port || port;
|
||||||
let c_addr = global.ctx.lights.addr || hostname;
|
let c_addr = global.ctx.lights.addr || hostname;
|
||||||
client.connect(c_port, c_addr, () => {
|
client.connect(c_port, c_addr, () => { });
|
||||||
|
|
||||||
|
client.on('data', (dat) => {
|
||||||
|
let arr = JSON.parse(dat);
|
||||||
|
newFuncCallback(arr);
|
||||||
client.write(string_data);
|
client.write(string_data);
|
||||||
client.destroy();
|
client.destroy();
|
||||||
callback('success.');
|
callback('success.');
|
||||||
});
|
})
|
||||||
|
|
||||||
client.on('error', (e) => {
|
client.on('error', (e) => {
|
||||||
client.destroy();
|
client.destroy();
|
||||||
|
|
198
parser.js
198
parser.js
|
@ -2,120 +2,120 @@ import Logger, { levels } from './logger.js';
|
||||||
import { filename } from './utils.js';
|
import { filename } from './utils.js';
|
||||||
|
|
||||||
export class Command {
|
export class Command {
|
||||||
init(ctx, log) {
|
init(ctx, log) {
|
||||||
this.log = log;
|
this.log = log;
|
||||||
}
|
}
|
||||||
log;
|
log;
|
||||||
name = 'DEFAULT';
|
name = 'DEFAULT';
|
||||||
whitelist = false;
|
whitelist = false;
|
||||||
func() {}
|
func() { }
|
||||||
}
|
}
|
||||||
|
|
||||||
export class CommandInitializer {
|
export class CommandInitializer {
|
||||||
commands = [];
|
commands = [];
|
||||||
uninitialized = [];
|
uninitialized = [];
|
||||||
|
|
||||||
initialize(ctx) {
|
initialize(ctx) {
|
||||||
for (let index in this.uninitialized) {
|
for (let index in this.uninitialized) {
|
||||||
this.initCommand(this.uninitialized[index], ctx);
|
this.initCommand(this.uninitialized[index], ctx);
|
||||||
delete this.uninitialized[index];
|
delete this.uninitialized[index];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
initCommand(cmd, ctx) {
|
initCommand(cmd, ctx) {
|
||||||
cmd.init(ctx, new Logger(`cmd.${cmd.name}`, ctx.log_level));
|
cmd.init(ctx, new Logger(`cmd.${cmd.name}`, ctx.log_level));
|
||||||
this.commands.push(cmd);
|
this.commands.push(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
addCommand(cmd) {
|
addCommand(cmd) {
|
||||||
this.uninitialized.push(cmd);
|
this.uninitialized.push(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
getCommands() {
|
getCommands() {
|
||||||
return this.commands;
|
return this.commands;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class CommandParser {
|
export default class CommandParser {
|
||||||
constructor(ctx, prefix = ';') {
|
constructor(ctx, prefix = ';') {
|
||||||
this.log = new Logger(filename(import.meta.url), ctx.log_level);
|
this.log = new Logger(filename(import.meta.url), ctx.log_level);
|
||||||
this.prefix = prefix ? prefix : this.prefix || ';';
|
this.prefix = prefix ? prefix : this.prefix || ';';
|
||||||
}
|
}
|
||||||
log;
|
log;
|
||||||
prefix;
|
prefix;
|
||||||
commands = [];
|
commands = [];
|
||||||
|
|
||||||
addCommand(cmd) {
|
addCommand(cmd) {
|
||||||
this.log.debug(`cmd to add: ${JSON.stringify(cmd)}`);
|
this.log.debug(`cmd to add: ${JSON.stringify(cmd)}`);
|
||||||
if (this.isCmd(cmd)) {
|
if (this.isCmd(cmd)) {
|
||||||
this.commands.push(cmd);
|
this.commands.push(cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hasCmd(str) {
|
hasCmd(str) {
|
||||||
let results = this.commands.filter((c) => c.name == str);
|
let results = this.commands.filter((c) => c.name == str);
|
||||||
|
|
||||||
return results.length ? results[0] : undefined;
|
return results.length ? results[0] : undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
isCmd(cmd) {
|
isCmd(cmd) {
|
||||||
return typeof cmd == 'object' && cmd instanceof Command;
|
return typeof cmd == 'object' && cmd instanceof Command;
|
||||||
}
|
}
|
||||||
|
|
||||||
getArgsList(split) {
|
getArgsList(split) {
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return parsed_args;
|
return parsed_args;
|
||||||
}
|
}
|
||||||
|
|
||||||
parseMsg(msg, ctx) {
|
parseMsg(msg, ctx) {
|
||||||
if (msg.author.bot) {
|
if (msg.author.bot) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (msg.channel.guild && !ctx.whitelist.guild(msg.channel.guild)) {
|
this.log.debug(msg.content);
|
||||||
msg.channel.createMessage('guild not whitelisted');
|
this.log.debug(msg.content.startsWith(this.prefix));
|
||||||
return;
|
this.log.debug(msg.content[0]);
|
||||||
}
|
this.log.debug(this.prefix);
|
||||||
this.log.debug(msg.content);
|
if (msg.content.startsWith(this.prefix)) {
|
||||||
this.log.debug(msg.content.startsWith(this.prefix));
|
let snip = msg.content.slice(this.prefix.length);
|
||||||
this.log.debug(msg.content[0]);
|
let unsep = snip.split(' ');
|
||||||
this.log.debug(this.prefix);
|
let res = this.hasCmd(unsep[0]);
|
||||||
if (msg.content.startsWith(this.prefix)) {
|
let args = this.getArgsList(unsep.slice(1));
|
||||||
let snip = msg.content.slice(this.prefix.length);
|
this.log.debug(snip);
|
||||||
let unsep = snip.split(' ');
|
this.log.debug(res);
|
||||||
let res = this.hasCmd(unsep[0]);
|
this.log.debug(args);
|
||||||
let args = this.getArgsList(unsep.slice(1));
|
|
||||||
this.log.debug(snip);
|
|
||||||
this.log.debug(res);
|
|
||||||
this.log.debug(args);
|
|
||||||
|
|
||||||
if (res != undefined) {
|
if (res != undefined) {
|
||||||
this.log.debug(`execute function ${res.name}`);
|
if (msg.channel.guild && !ctx.whitelist.guild(msg.channel.guild)) {
|
||||||
if (res.whitelist && !ctx.whitelist.user(msg.author)) {
|
msg.channel.createMessage('guild not whitelisted');
|
||||||
msg.channel.createMessage('not whitelisted');
|
return;
|
||||||
} else {
|
}
|
||||||
res.func(msg, args, ctx);
|
this.log.debug(`execute function ${res.name}`);
|
||||||
}
|
if (res.whitelist && !ctx.whitelist.user(msg.author)) {
|
||||||
}
|
msg.channel.createMessage('not whitelisted');
|
||||||
}
|
} else {
|
||||||
}
|
res.func(msg, args, ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
{"guild":["656579275008245830","754155880173404260"],"user":["123601647258697730","240240073386229760","285424490916216832","529534860243632134"]}
|
{"guild":["656579275008245830","754155880173404260","805978396974514206"],"user":["123601647258697730","240240073386229760","285424490916216832","529534860243632134"]}
|
Loading…
Reference in a new issue