From 4e954b919c86ad17f6c7f934de4aa8d6fe5b9b1d Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Sat, 4 Mar 2023 17:01:58 +0100 Subject: [PATCH] server/client: refactor command input Keep happy path on the left and try to return as early as we can to help the reader understand the logic better The function is too large to be able to quickly scan an if / else chain and see the function return at the end --- server/client.ts | 70 +++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/server/client.ts b/server/client.ts index 826bef13..4ed691c2 100644 --- a/server/client.ts +++ b/server/client.ts @@ -465,38 +465,9 @@ class Client { const cmd = args?.shift()?.toLowerCase() || ""; const irc = target.network.irc; - let connected = irc && irc.connection && irc.connection.connected; + const connected = irc?.connected; - if (inputs.userInputs.has(cmd)) { - const plugin = inputs.userInputs.get(cmd); - - if (!plugin) { - // should be a no-op - throw new Error(`Plugin ${cmd} not found`); - } - - if (typeof plugin.input === "function" && (connected || plugin.allowDisconnected)) { - connected = true; - plugin.input.apply(client, [target.network, target.chan, cmd, args]); - } - } else if (inputs.pluginCommands.has(cmd)) { - const plugin = inputs.pluginCommands.get(cmd); - - if (typeof plugin.input === "function" && (connected || plugin.allowDisconnected)) { - connected = true; - plugin.input( - new PublicClient(client, plugin.packageInfo), - {network: target.network, chan: target.chan}, - cmd, - args - ); - } - } else if (connected) { - // TODO: fix - irc!.raw(text); - } - - if (!connected) { + const emitFailureDisconnected = () => { target.chan.pushMessage( this, new Msg({ @@ -504,7 +475,44 @@ class Client { text: "You are not connected to the IRC network, unable to send your command.", }) ); + }; + + const plugin = inputs.userInputs.get(cmd); + + if (plugin) { + if (!connected && !plugin.allowDisconnected) { + emitFailureDisconnected(); + return; + } + + plugin.input.apply(client, [target.network, target.chan, cmd, args]); + return; } + + const extPlugin = inputs.pluginCommands.get(cmd); + + if (extPlugin) { + if (!connected && !extPlugin.allowDisconnected) { + emitFailureDisconnected(); + return; + } + + extPlugin.input( + new PublicClient(client, extPlugin.packageInfo), + {network: target.network, chan: target.chan}, + cmd, + args + ); + return; + } + + if (!connected) { + emitFailureDisconnected(); + return; + } + + // TODO: fix + irc!.raw(text); } compileCustomHighlights() {