From 325c28c63ffbf42a971c002a54347738fb828694 Mon Sep 17 00:00:00 2001 From: sky Date: Tue, 14 Jun 2022 23:21:20 -0400 Subject: [PATCH 1/5] draft proposal for reorganizing command handling --- index.js | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/index.js b/index.js index 3ef8399..909c230 100644 --- a/index.js +++ b/index.js @@ -191,6 +191,11 @@ const submitted_message = async (level, sender) => { // `message` is the full text of the message. `sender` is the username // of the person that sent the message. +/** + * @param {string} message + * @param {import("tmi.js").Userstate} sender + * @param {Function} respond + */ async function HandleMessage(message, sender, respond) { if (sender.username === undefined || message === undefined) { console.log("undefined data"); @@ -200,12 +205,27 @@ async function HandleMessage(message, sender, respond) { let args = message.split(" "); let cmd = args.shift(); cmd = cmd.toLowerCase(); - args = args.join(" "); - message = cmd + args; - if (args.length == 0) { - message = cmd; - } else { - message = cmd + " " + args; + + // removes the bang at the beginning + const command = cmd.slice(1) + switch (command) { + case "open": + if (sender.isBroadcaster) { + queue_open = true; + respond("The queue is now open!") + } + break; + case "close": + if (sender.isBroadcaster) { + queue_open = false; + respond("The queue is now closed!") + } + break; + case "add": + addLevel(sender, message, respond); + break; + default: + break; } if (message == "!open" && sender.isBroadcaster) { @@ -498,3 +518,33 @@ const chatbot_helper = chatbot.helper( ); chatbot_helper.setup(HandleMessage); chatbot_helper.connect(); + +/** + * @param {import("tmi.js").Userstate} sender + * @param {string} message + * @param {Function} respond + */ +function addLevel(sender, message, respond) { + if (queue_open || sender.isBroadcaster) { + let level_code = get_remainder(message.toUpperCase()); + if (settings.custom_codes_enabled) { + let customCodesMap = new Map( + JSON.parse(fs.readFileSync("./customCodes.json")) + ); + let customNames = Array.from(customCodesMap.keys()); + let customCodes = Array.from(customCodesMap.values()); + let codeMatch = customNames + .map((a) => a.toUpperCase()) + .indexOf(level_code); + if (codeMatch !== -1) { + level_code = customCodes[codeMatch]; + } + } + respond( + quesoqueue.add(Level(level_code, sender.displayName, sender.username)) + ); + } else { + respond("Sorry, the queue is closed right now."); + } +} + From 9a690229773d657ceab906cb08aed937af419207 Mon Sep 17 00:00:00 2001 From: sky Date: Thu, 16 Jun 2022 14:14:25 -0400 Subject: [PATCH 2/5] updated proposal - command mapping - separate function for command --- index.js | 73 +++++++++++++++++++++----------------------------------- 1 file changed, 27 insertions(+), 46 deletions(-) diff --git a/index.js b/index.js index 909c230..ad6d214 100644 --- a/index.js +++ b/index.js @@ -10,6 +10,31 @@ gracefulFs.gracefulify(fs) quesoqueue.load(); +/** @type {import("./commandTypes.js").commandMapping} */ +const dummyMapping = {} +dummyMapping['add'] = addLevel + +/** + * @param {import("tmi.js").Userstate} sender + * @param {string[]} args + */ +function addLevel(sender, args) { + if (queue_open || sender.isBroadcaster) { + let [level_code] = args.map(el => el.toUpperCase()) + if (settings.custom_codes_enabled) { + let customCodesMap = new Map( + JSON.parse(fs.readFileSync("./customCodes.json", 'utf8')) + ); + if (customCodesMap.has(level_code)) { + level_code = customCodesMap.get(level_code) + } + } + return quesoqueue.add(Level(level_code, sender.displayName, sender.username)) + } else { + return "Sorry, the queue is closed right now." + } +} + var queue_open = settings.start_open; var selection_iter = 0; let level_timer; @@ -208,24 +233,8 @@ async function HandleMessage(message, sender, respond) { // removes the bang at the beginning const command = cmd.slice(1) - switch (command) { - case "open": - if (sender.isBroadcaster) { - queue_open = true; - respond("The queue is now open!") - } - break; - case "close": - if (sender.isBroadcaster) { - queue_open = false; - respond("The queue is now closed!") - } - break; - case "add": - addLevel(sender, message, respond); - break; - default: - break; + if (Object.keys(dummyMapping).includes(command)) { + respond(dummyMapping[command](sender, args)) } if (message == "!open" && sender.isBroadcaster) { @@ -519,32 +528,4 @@ const chatbot_helper = chatbot.helper( chatbot_helper.setup(HandleMessage); chatbot_helper.connect(); -/** - * @param {import("tmi.js").Userstate} sender - * @param {string} message - * @param {Function} respond - */ -function addLevel(sender, message, respond) { - if (queue_open || sender.isBroadcaster) { - let level_code = get_remainder(message.toUpperCase()); - if (settings.custom_codes_enabled) { - let customCodesMap = new Map( - JSON.parse(fs.readFileSync("./customCodes.json")) - ); - let customNames = Array.from(customCodesMap.keys()); - let customCodes = Array.from(customCodesMap.values()); - let codeMatch = customNames - .map((a) => a.toUpperCase()) - .indexOf(level_code); - if (codeMatch !== -1) { - level_code = customCodes[codeMatch]; - } - } - respond( - quesoqueue.add(Level(level_code, sender.displayName, sender.username)) - ); - } else { - respond("Sorry, the queue is closed right now."); - } -} From 16f02b03813a876b7cc557afd8ade9dc5573b499 Mon Sep 17 00:00:00 2001 From: sky Date: Thu, 16 Jun 2022 14:24:10 -0400 Subject: [PATCH 3/5] add aliases and fallback options --- commandTypes.d.ts | 7 +++++++ index.js | 12 ++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 commandTypes.d.ts diff --git a/commandTypes.d.ts b/commandTypes.d.ts new file mode 100644 index 0000000..431f9c5 --- /dev/null +++ b/commandTypes.d.ts @@ -0,0 +1,7 @@ +import { Userstate } from "tmi.js"; + +export type Command = (sender: Userstate, args: string[]) => string; + +export interface commandMapping { + [key: string]: Command +} \ No newline at end of file diff --git a/index.js b/index.js index ad6d214..09f31cf 100644 --- a/index.js +++ b/index.js @@ -13,6 +13,10 @@ quesoqueue.load(); /** @type {import("./commandTypes.js").commandMapping} */ const dummyMapping = {} dummyMapping['add'] = addLevel +/** @type {{[key: string]: string}} */ +const aliases = { + push: 'add' +} /** * @param {import("tmi.js").Userstate} sender @@ -232,10 +236,10 @@ async function HandleMessage(message, sender, respond) { cmd = cmd.toLowerCase(); // removes the bang at the beginning - const command = cmd.slice(1) - if (Object.keys(dummyMapping).includes(command)) { - respond(dummyMapping[command](sender, args)) - } + let command = cmd.slice(1) + const fallback = () => `!${command} is not a valid command` + const func = dummyMapping?.[command] ?? dummyMapping?.[aliases?.[command]] ?? fallback + respond(func(sender,args)) if (message == "!open" && sender.isBroadcaster) { queue_open = true; From 6ee6b070282c84105e125825844fb1d30a439f41 Mon Sep 17 00:00:00 2001 From: sky Date: Thu, 16 Jun 2022 14:57:47 -0400 Subject: [PATCH 4/5] command mapping updated changed command functions to be more functional --- index.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index 09f31cf..7d20295 100644 --- a/index.js +++ b/index.js @@ -13,16 +13,18 @@ quesoqueue.load(); /** @type {import("./commandTypes.js").commandMapping} */ const dummyMapping = {} dummyMapping['add'] = addLevel -/** @type {{[key: string]: string}} */ +/** @type {{[twitchCommand: string]: string}} */ const aliases = { - push: 'add' + push: 'add', + add: 'add' } /** * @param {import("tmi.js").Userstate} sender + * @param {(message: string) => void} respond * @param {string[]} args */ -function addLevel(sender, args) { +function addLevel(sender, respond, args) { if (queue_open || sender.isBroadcaster) { let [level_code] = args.map(el => el.toUpperCase()) if (settings.custom_codes_enabled) { @@ -33,9 +35,9 @@ function addLevel(sender, args) { level_code = customCodesMap.get(level_code) } } - return quesoqueue.add(Level(level_code, sender.displayName, sender.username)) + respond(quesoqueue.add(Level(level_code, sender.displayName, sender.username))) } else { - return "Sorry, the queue is closed right now." + respond("Sorry, the queue is closed right now.") } } @@ -223,7 +225,7 @@ const submitted_message = async (level, sender) => { /** * @param {string} message * @param {import("tmi.js").Userstate} sender - * @param {Function} respond + * @param {(message: string) => void} respond */ async function HandleMessage(message, sender, respond) { if (sender.username === undefined || message === undefined) { @@ -236,10 +238,10 @@ async function HandleMessage(message, sender, respond) { cmd = cmd.toLowerCase(); // removes the bang at the beginning - let command = cmd.slice(1) - const fallback = () => `!${command} is not a valid command` - const func = dummyMapping?.[command] ?? dummyMapping?.[aliases?.[command]] ?? fallback - respond(func(sender,args)) + let commandName = cmd.slice(1) + const fallback = () => null + const command = dummyMapping?.[aliases?.[commandName]] ?? fallback + command(sender, respond, args) if (message == "!open" && sender.isBroadcaster) { queue_open = true; From 8f5f504957247d8394cc2e34fc7281ebc50b7df8 Mon Sep 17 00:00:00 2001 From: sky Date: Thu, 16 Jun 2022 15:00:11 -0400 Subject: [PATCH 5/5] ensure all commands have prefix and exit early if not --- index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/index.js b/index.js index 7d20295..8b5be07 100644 --- a/index.js +++ b/index.js @@ -238,6 +238,7 @@ async function HandleMessage(message, sender, respond) { cmd = cmd.toLowerCase(); // removes the bang at the beginning + if (!cmd.startsWith('!')) return let commandName = cmd.slice(1) const fallback = () => null const command = dummyMapping?.[aliases?.[commandName]] ?? fallback