From 03bbf03279285746c181f52198b764a006ff2efc Mon Sep 17 00:00:00 2001 From: Jane Petrovna Date: Thu, 27 May 2021 14:56:26 -0400 Subject: [PATCH] defer to led server to provide functions --- bot.js | 5 ++ cmd/lights.js | 85 +++++++++--------- lights/light_parser.js | 25 +++--- lights/request.js | 25 +++++- parser.js | 198 ++++++++++++++++++++--------------------- whitelist.json | 2 +- 6 files changed, 183 insertions(+), 157 deletions(-) diff --git a/bot.js b/bot.js index fdff152..89c8de4 100644 --- a/bot.js +++ b/bot.js @@ -1,4 +1,6 @@ import { createRequire } from 'module'; +import { discover } from './lights/light_parser.js'; +import { contactServer } from './lights/request.js'; const require = createRequire(import.meta.url); import Eris from 'eris'; @@ -103,3 +105,6 @@ let cmd_dir = path.join(dir, 'cmd'); log.debug(dir); let files = fs.readdirSync(cmd_dir); load_commands(); +contactServer(discover, (err) => { + log.error(err); +}) diff --git a/cmd/lights.js b/cmd/lights.js index db088dd..6c3ba6c 100644 --- a/cmd/lights.js +++ b/cmd/lights.js @@ -1,56 +1,57 @@ 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'; const initializer = new CommandInitializer(); class LightsParser extends Command { - init(ctx, log) { - this.log = log; - initialize(ctx); - } - name = 'lights'; - whitelist = true; - func(msg, args, ctx) { - if (ctx.sleep) { - msg.channel.createMessage('i have sleep mode enabled. the lights are probably off.'); - return; - } - if (!args.length) { - msg.channel.createMessage('no args found.'); - return; - } - let instructions = parse(args[0]); + init(ctx, log) { + this.log = log; + initialize(ctx); + } + name = 'lights'; + whitelist = true; + func(msg, args, ctx) { + if (ctx.sleep) { + msg.channel.createMessage('i have sleep mode enabled. the lights are probably off.'); + return; + } + if (!args.length) { + msg.channel.createMessage('no args found.'); + return; + } + let instructions = parse(args[0]); - this.log.debug(instructions); - let res = '```\n'; - instructions.forEach((instruction) => { - res += JSON.stringify(instruction) + '\n'; - }); - res += '```'; - msg.channel.createMessage(`parsed instructions:\n${res}`); - req( - instructions.filter((i) => i.valid), - (response) => { - msg.channel.createMessage(`${response}`); - }, - (error) => { - msg.channel.createMessage(`error: ${error.message}`); - } - ); - } + this.log.debug(instructions); + let res = '```\n'; + instructions.forEach((instruction) => { + res += JSON.stringify(instruction) + '\n'; + }); + res += '```'; + msg.channel.createMessage(`parsed instructions:\n${res}`); + req( + instructions.filter((i) => i.valid), + (response) => { + msg.channel.createMessage(`${response}`); + }, + discover, + (error) => { + msg.channel.createMessage(`error: ${error.message}`); + } + ); + } } initializer.addCommand(new LightsParser()); class Sleep extends Command { - name = 'sleep'; - whitelist = true; - func(msg, args, ctx) { - let sleep = ctx.sleep; - sleep = !sleep; - msg.channel.createMessage(`sleep mode is now ${sleep ? 'on' : 'off'}`); - ctx.set_ctx('sleep', sleep); - } + name = 'sleep'; + whitelist = true; + func(msg, args, ctx) { + let sleep = ctx.sleep; + sleep = !sleep; + msg.channel.createMessage(`sleep mode is now ${sleep ? 'on' : 'off'}`); + ctx.set_ctx('sleep', sleep); + } } initializer.addCommand(new Sleep()); diff --git a/lights/light_parser.js b/lights/light_parser.js index f4661bc..7851201 100644 --- a/lights/light_parser.js +++ b/lights/light_parser.js @@ -1,7 +1,7 @@ import Logger, { levels } from '../logger.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 { constructor(channel) { @@ -58,17 +58,6 @@ class Instruction { } 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) { @@ -156,6 +145,18 @@ function parseSingleInstruction(str = '') { 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) { let parsed = []; let split = str.split('\n').filter((s) => s.length > 0); diff --git a/lights/request.js b/lights/request.js index a32cb53..d5e07d4 100644 --- a/lights/request.js +++ b/lights/request.js @@ -7,7 +7,22 @@ function getBinarySize(string) { 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 size = getBinarySize(string_data); if (size > 9999) { @@ -19,11 +34,15 @@ export default function req(data, callback, errorCallback) { let c_port = global.ctx.lights.port || port; 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.destroy(); callback('success.'); - }); + }) client.on('error', (e) => { client.destroy(); diff --git a/parser.js b/parser.js index 3c696c5..f294511 100644 --- a/parser.js +++ b/parser.js @@ -2,120 +2,120 @@ import Logger, { levels } from './logger.js'; import { filename } from './utils.js'; export class Command { - init(ctx, log) { - this.log = log; - } - log; - name = 'DEFAULT'; - whitelist = false; - func() {} + init(ctx, log) { + this.log = log; + } + log; + name = 'DEFAULT'; + whitelist = false; + func() { } } export class CommandInitializer { - commands = []; - uninitialized = []; + commands = []; + uninitialized = []; - initialize(ctx) { - for (let index in this.uninitialized) { - this.initCommand(this.uninitialized[index], ctx); - delete this.uninitialized[index]; - } - } + initialize(ctx) { + for (let index in this.uninitialized) { + this.initCommand(this.uninitialized[index], ctx); + delete this.uninitialized[index]; + } + } - initCommand(cmd, ctx) { - cmd.init(ctx, new Logger(`cmd.${cmd.name}`, ctx.log_level)); - this.commands.push(cmd); - } + initCommand(cmd, ctx) { + cmd.init(ctx, new Logger(`cmd.${cmd.name}`, ctx.log_level)); + this.commands.push(cmd); + } - addCommand(cmd) { - this.uninitialized.push(cmd); - } + addCommand(cmd) { + this.uninitialized.push(cmd); + } - getCommands() { - return this.commands; - } + getCommands() { + return this.commands; + } } export default class CommandParser { - constructor(ctx, prefix = ';') { - this.log = new Logger(filename(import.meta.url), ctx.log_level); - this.prefix = prefix ? prefix : this.prefix || ';'; - } - log; - prefix; - commands = []; + constructor(ctx, prefix = ';') { + this.log = new Logger(filename(import.meta.url), ctx.log_level); + this.prefix = prefix ? prefix : this.prefix || ';'; + } + log; + prefix; + commands = []; - addCommand(cmd) { - this.log.debug(`cmd to add: ${JSON.stringify(cmd)}`); - if (this.isCmd(cmd)) { - this.commands.push(cmd); - } - } + addCommand(cmd) { + this.log.debug(`cmd to add: ${JSON.stringify(cmd)}`); + if (this.isCmd(cmd)) { + this.commands.push(cmd); + } + } - hasCmd(str) { - let results = this.commands.filter((c) => c.name == str); + hasCmd(str) { + let results = this.commands.filter((c) => c.name == str); - return results.length ? results[0] : undefined; - } + return results.length ? results[0] : undefined; + } - isCmd(cmd) { - return typeof cmd == 'object' && cmd instanceof Command; - } + isCmd(cmd) { + return typeof cmd == 'object' && cmd instanceof Command; + } - getArgsList(split) { - let parsed_args = []; - let join_index = -1; - let add = true; - for (let index in split) { - if (split[index].startsWith('```')) { - join_index = index; - add = false; - } - if (add) { - parsed_args.push(split[index]); - } - if (split[index].endsWith('```') && join_index != -1) { - let joined = split - .slice(join_index, index + 1) - .join(' ') - .replace(/```/g, ''); - parsed_args.push(joined); - add = true; - join_index = -1; - } - } - return parsed_args; - } + getArgsList(split) { + let parsed_args = []; + let join_index = -1; + let add = true; + for (let index in split) { + if (split[index].startsWith('```')) { + join_index = index; + add = false; + } + if (add) { + parsed_args.push(split[index]); + } + if (split[index].endsWith('```') && join_index != -1) { + let joined = split + .slice(join_index, index + 1) + .join(' ') + .replace(/```/g, ''); + parsed_args.push(joined); + add = true; + join_index = -1; + } + } + return parsed_args; + } - parseMsg(msg, ctx) { - if (msg.author.bot) { - return; - } - if (msg.channel.guild && !ctx.whitelist.guild(msg.channel.guild)) { - msg.channel.createMessage('guild not whitelisted'); - return; - } - this.log.debug(msg.content); - this.log.debug(msg.content.startsWith(this.prefix)); - this.log.debug(msg.content[0]); - this.log.debug(this.prefix); - if (msg.content.startsWith(this.prefix)) { - let snip = msg.content.slice(this.prefix.length); - let unsep = snip.split(' '); - let res = this.hasCmd(unsep[0]); - let args = this.getArgsList(unsep.slice(1)); - this.log.debug(snip); - this.log.debug(res); - this.log.debug(args); + parseMsg(msg, ctx) { + if (msg.author.bot) { + return; + } + this.log.debug(msg.content); + this.log.debug(msg.content.startsWith(this.prefix)); + this.log.debug(msg.content[0]); + this.log.debug(this.prefix); + if (msg.content.startsWith(this.prefix)) { + let snip = msg.content.slice(this.prefix.length); + let unsep = snip.split(' '); + let res = this.hasCmd(unsep[0]); + let args = this.getArgsList(unsep.slice(1)); + this.log.debug(snip); + this.log.debug(res); + this.log.debug(args); - if (res != undefined) { - 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); - } - } - } - } + if (res != undefined) { + if (msg.channel.guild && !ctx.whitelist.guild(msg.channel.guild)) { + msg.channel.createMessage('guild not whitelisted'); + return; + } + 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); + } + } + } + } } diff --git a/whitelist.json b/whitelist.json index b751b5a..3251d4e 100644 --- a/whitelist.json +++ b/whitelist.json @@ -1 +1 @@ -{"guild":["656579275008245830","754155880173404260"],"user":["123601647258697730","240240073386229760","285424490916216832","529534860243632134"]} \ No newline at end of file +{"guild":["656579275008245830","754155880173404260","805978396974514206"],"user":["123601647258697730","240240073386229760","285424490916216832","529534860243632134"]} \ No newline at end of file