From 0c93846637f34772d6dfaaae3d17ffc050a4a4cc Mon Sep 17 00:00:00 2001
From: echicken <echicken@bbs.electronicchicken.com>
Date: Sun, 7 Mar 2021 06:05:50 +0000
Subject: [PATCH] Don't assign bbs methods to properties of another object.
 Wrap calls to bbs methods in a function, use that as property. Formatting
 changes so that if I ever work on this again in the future it will look
 slightly less horrible. Changes were made for ragnarok; if you're not him,
 you probably shouldn't use this.

---
 exec/load/menu-commands.js | 304 ++++++++++++++++---------------------
 1 file changed, 135 insertions(+), 169 deletions(-)

diff --git a/exec/load/menu-commands.js b/exec/load/menu-commands.js
index e86cefa228..6c265367a2 100644
--- a/exec/load/menu-commands.js
+++ b/exec/load/menu-commands.js
@@ -1,32 +1,44 @@
 // Mapping of menuedit/menushell 'commands' to built-in or helper functions
 
-var inBBS = function() {
-	return (typeof js.global.bbs == "undefined") ? false : true;
-}
+var inBBS = js.global.bbs !== undefined;
 
 load("sbbsdefs.js");
-if(inBBS)
-	load("menu-command-helpers.js");
+if (inBBS) load("menu-command-helpers.js");
 
 var menuFile = system.data_dir + "menus.json";
 
 // We can recategorize stuff later if needed
 var Commands = {
-	'User' : {},
-	'System' : {},
-	'Messages' : {},
-	'Externals' : {}, // Placeholder, don't populate
-	'Files' : {},
-	'Menus' : {} // Placeholder, don't populate
+	User: {},
+	System: {},
+	Messages: {},
+	Externals: {}, // Placeholder, don't populate
+	Files: {},
+	Menus: {}, // Placeholder, don't populate
 };
 
+function _wrap(fn) {
+	return function() {
+		fn();
+	}
+}
+
+function getMenus() {
+	if (!file_exists(menuFile)) return;
+	var f = new File(menuFile);
+	f.open("r");
+	Commands.Menus = JSON.parse(f.read());
+	f.close();
+}
+
 /*	Pattern:
 
 	Commands[area][command] = {
-		'Description' : "This is what this does."
+		Description: "This is what this does."
 	}
-	if(inBBS()) // Not being loaded from jsexec
+	if (inBBS) { // Not being loaded from jsexec
 		Commands[area][command].Action = some.method;
+	}
 
 	(If Action doesn't rely on the 'bbs' or 'console' objects, the inBBS()
 	check can be skipped.)
@@ -39,312 +51,266 @@ var Commands = {
 // User & user-activity related functions
 
 Commands.User.Config = {
-	'Description' : "Enter the user settings configuration menu"
+	Description: "Enter the user settings configuration menu"
 };
-if(inBBS())
-	Commands.User.Config.Action = bbs.user_config;
+
+if (inBBS) {
+	Commands.User.Config.Action = _wrap(bbs.user_config);
+	Commands.User.Find.Action = findUser;
+	Commands.User.Info.Action = _wrap(bbs.user_info);
+	Commands.User.List.Action = _wrap(bbs.list_users);
+	Commands.User.ListNodes.Action = _wrap(bbs.list_nodes);
+	Commands.User.ListNodesActive.Action = _wrap(bbs.whos_online);
+	Commands.User.Logons.Action = _wrap(bbs.list_logons);
+	Commands.User.SelectShell.Action = _wrap(bbs.select_shell);
+	Commands.User.SelectEditor.Action = _wrap(bbs.select_editor);
+}
 
 Commands.User.Find = {
-	'Description' : "Find user by username/number"
+	Description: "Find user by username/number"
 };
-if(inBBS())
-	Commands.User.Find.Action = findUser;
 
 Commands.User.Info = {
-	'Description' : "Display current user information"
+	Description: "Display current user information"
 };
-if(inBBS())
-	Commands.User.Info.Action = bbs.user_info;
 
 Commands.User.List = {
-	'Description' : "List users"
+	Description: "List users"
 }
-if(inBBS())
-	Commands.User.List.Action = bbs.list_users;
 
 Commands.User.ListNodes = {
-	'Description' : "List all node activity"
+	Description: "List all node activity"
 }
-if(inBBS())
-	Commands.User.ListNodes.Action = bbs.list_nodes;
 
 Commands.User.ListNodesActive = {
-	'Description' : "List all active nodes"
+	Description: "List all active nodes"
 }
-if(inBBS())
-	Commands.User.ListNodesActive.Action = bbs.whos_online;
 
 Commands.User.Logons = {
-	'Description' : "Display the recent-logon list"
+	Description: "Display the recent-logon list"
 }
-if(inBBS())
-	Commands.User.Logons.Action = bbs.list_logons;
 
 Commands.User.SelectShell = {
-	'Description' : "Select a command shell"
+	Description: "Select a command shell"
 }
-if(inBBS())
-	Commands.User.SelectShell.Action = bbs.select_shell;
 
 Commands.User.SelectEditor = {
-	'Description' : "Select an external message editor"
+	Description: "Select an external message editor"
 }
-if(inBBS())
-	Commands.User.SelectEditor.Action = bbs.select_editor;
 
 // System areas & functions that don't fit elsewhere
 
+if (inBBS) {
+	Commands.System.Chat.Action = function() { bbs.exec("?chat_sec.js"); }
+	Commands.System.ExternalPrograms.Action = _wrap(bbs.xtrn_sec);
+	Commands.System.Info.Action = _wrap(bbs.sys_info);
+	Commands.System.LogOff.Action = _wrap(bbs.logoff);
+	Commands.System.LogOffFast.Action = _wrap(bbs.logout);
+	Commands.System.NodeChat.Action = _wrap(bbs.multinode_chat);
+	Commands.System.NodeChatPrivate.Action = _wrap(bbs.private_chat);
+	Commands.System.NodeMessage.Action = _wrap(bbs.private_message);
+	Commands.System.NodeStats.Action = _wrap(bbs.node_stats);
+	Commands.System.PageSysop.Action = _wrap(bbs.page_sysop);
+	Commands.System.PageGuru.Action = _wrap(bbs.page_guru);
+	Commands.System.Stats.Action = _wrap(bbs.sys_stats);
+	Commands.System.TextSection.Action = _wrap(bbs.text_sec);
+	Commands.System.TimeBank.Action = _wrap(bbs.time_bank);
+	Commands.System.Version.Action = _wrap(bbs.ver);
+}
+
 Commands.System.Chat = {
-	'Description' : "Enter the chat section"
+	Description: "Enter the chat section"
 }
-if(inBBS())
-	Commands.System.Chat.Action = function() { bbs.exec("?chat_sec.js"); }
 
 Commands.System.ExternalPrograms = {
-	'Description' : "External Programs section"
+	Description: "External Programs section"
 }
-if(inBBS())
-	Commands.System.ExternalPrograms.Action = bbs.xtrn_sec;
 
 Commands.System.Info = {
-	'Description' : "Display system information"
+	Description: "Display system information"
 }
-if(inBBS())
-	Commands.System.Info.Action = bbs.sys_info;
 
 Commands.System.LogOff = {
-	'Description' : "Log off"
+	Description: "Log off"
 }
-if(inBBS())
-	Commands.System.LogOff.Action = bbs.logoff;
 
 Commands.System.LogOffFast = {
-	'Description' : "Log off, fast"
+	Description: "Log off, fast"
 }
-if(inBBS())
-	Commands.System.LogOffFast.Action = bbs.logout;
 
 Commands.System.NodeChat = {
-	'Description' : "Enter multi-node chat"
+	Description: "Enter multi-node chat"
 }
-if(inBBS())
-	Commands.System.NodeChat.Action = bbs.multinode_chat;
 
 Commands.System.NodeChatPrivate = {
-	'Description' : "Enter private inter-node chat"
+	Description: "Enter private inter-node chat"
 }
-if(inBBS())
-	Commands.System.NodeChatPrivate.Action = bbs.private_chat;
 
 Commands.System.NodeMessage = {
-	'Description' : "Inter-node private message prompt"
+	Description: "Inter-node private message prompt"
 }
-if(inBBS())
-	Commands.System.NodeMessage.Action = bbs.private_message;
 
 Commands.System.NodeStats = {
-	'Description' : "Display node statistics"
+	Description: "Display node statistics"
 }
-if(inBBS())
-	Commands.System.NodeStats.Action = bbs.node_stats;
 
 Commands.System.PageSysop = {
-	'Description' : "Page the sysop for chat"
+	Description: "Page the sysop for chat"
 }
-if(inBBS())
-	Commands.System.PageSysop.Action = bbs.page_sysop;
 
 Commands.System.PageGuru = {
-	'Description' : "Page the annoying guru for chat"
+	Description: "Page the annoying guru for chat"
 }
-if(inBBS())
-	Commands.System.PageGuru.Action = bbs.page_guru;
 
 Commands.System.Stats = {
-	'Description' : "Display system statistics"
+	Description: "Display system statistics"
 }
-if(inBBS())
-	Commands.System.Stats.Action = bbs.sys_stats;
 
 Commands.System.TextSection = {
-	'Description' : "Text files section"
+	Description: "Text files section"
 }
-if(inBBS())
-	Commands.System.TextSection.Action = bbs.text_sec;
 
 Commands.System.TimeBank = {
-	'Description' : "Time Bank"
+	Description: "Time Bank"
 }
-if(inBBS())
-	Commands.System.TimeBank.Action = bbs.time_bank;
 
 Commands.System.Version = {
-	'Description' : "Display software version information"
+	Description: "Display software version information"
 }
-if(inBBS())
-	Commands.System.Version.Action = bbs.ver;
 
 // Message area related functions
 
+if (inBBS) {
+	Commands.Messages.BulkMail.Action = _wrap(bbs.bulk_mail);
+	Commands.Messages.Find.Action = findMessages;
+	Commands.Messages.Post.Action = _wrap(bbs.post_msg);
+	Commands.Messages.MailRead.Action = _wrap(bbs.read_mail);
+	Commands.Messages.QWKSection.Action = _wrap(bbs.qwk_sec);
+	Commands.Messages.Read.Action = _wrap(bbs.scan_msgs);
+	Commands.Messages.Scan.Action = scanSubs;
+	Commands.Messages.ScanConfig.Action = _wrap(bbs.cfg_msg_scan);
+	Commands.Messages.ScanPointers.Action = _wrap(bbs.cfg_msg_ptrs);
+	Commands.Messages.ScanPointersReinit.Action = _wrap(bbs.reinit_msg_ptrs);
+	Commands.Messages.SelectGroup.Action = selectMessageGroup;
+	Commands.Messages.SelectArea.Action = selectMessageArea;
+	Commands.Messages.SelectGroupAndArea.Action = selectGroupAndArea;
+	Commands.Messages.SendMail.Action = sendMail;
+	Commands.Messages.SendNetMail.Action = sendNetMail;
+	Commands.Messages.SubInfo.Action = _wrap(bbs.sub_info);
+}
+
 Commands.Messages.BulkMail = {
-	'Description' : "Send bulk private mail"
+	Description: "Send bulk private mail"
 }
-if(inBBS())
-	Commands.Messages.BulkMail.Action = bbs.bulk_mail;
 
 Commands.Messages.Find = {
-	'Description' : "Search message groups/areas/subs"
+	Description: "Search message groups/areas/subs"
 }
-if(inBBS())
-	Commands.Messages.Find.Action = findMessages;
 
 Commands.Messages.Post = {
-	'Description' : "Post a message in the current area"
+	Description: "Post a message in the current area"
 }
-if(inBBS())
-	Commands.Messages.Post.Action = bbs.post_msg;
 
 Commands.Messages.MailRead = {
-	'Description' : "Read private mail / email"
+	Description: "Read private mail / email"
 }
-if(inBBS())
-	Commands.Messages.MailRead.Action = bbs.read_mail;
 
 Commands.Messages.QWKSection = {
-	'Description' : "Enter the QWK transfer/configuration section"
+	Description: "Enter the QWK transfer/configuration section"
 }
-if(inBBS())
-	Commands.Messages.QWKSection.Action = bbs.qwk_sec;
 
 Commands.Messages.Read = {
-	'Description' : "Read messages in the current area"
+	Description: "Read messages in the current area"
 }
-if(inBBS())
-	Commands.Messages.Read.Action = bbs.scan_msgs;
 
 Commands.Messages.Scan = {
-	'Description' : "Scan for new messages"
+	Description: "Scan for new messages"
 }
-if(inBBS())
-	Commands.Messages.Scan.Action = scanSubs;
 
 Commands.Messages.ScanConfig = {
-	'Description' : "New message scan configuration"
+	Description: "New message scan configuration"
 }
-if(inBBS())
-	Commands.Messages.ScanConfig.Action = bbs.cfg_msg_scan;
 
 Commands.Messages.ScanPointers = {
-	'Description' : "Configure message scan pointer values"
+	Description: "Configure message scan pointer values"
 }
-if(inBBS())
-	Commands.Messages.ScanPointers.Action = bbs.cfg_msg_ptrs;
 
 Commands.Messages.ScanPointersReinit = {
-	'Description' : "Re-initialize new message scan pointer values"
+	Description: "Re-initialize new message scan pointer values"
 }
-if(inBBS())
-	Commands.Messages.ScanPointersReinit.Action = bbs.reinit_msg_ptrs;
 
 Commands.Messages.SelectGroup = {
-	'Description' : "Select a message group"
+	Description: "Select a message group"
 }
-if(inBBS())
-	Commands.Messages.SelectGroup.Action = selectMessageGroup;
 
 Commands.Messages.SelectArea = {
-	'Description' : "Select a message area"
+	Description: "Select a message area"
 }
-if(inBBS())
-	Commands.Messages.SelectArea.Action = selectMessageArea;
 
 Commands.Messages.SelectGroupAndArea = {
-	'Description' : "Select a message group and area"
+	Description: "Select a message group and area"
 }
-if(inBBS())
-	Commands.Messages.SelectGroupAndArea.Action = selectGroupAndArea;
 
 Commands.Messages.SendMail = {
-	'Description' : "Send local private mail"
+	Description: "Send local private mail"
 }
-if(inBBS())
-	Commands.Messages.SendMail.Action = sendMail;
 
 Commands.Messages.SendNetMail = {
-	'Description' : "Send netmail/email"
+	Description: "Send netmail/email"
 }
-if(inBBS())
-	Commands.Messages.SendNetMail.Action = sendNetMail;
 
 Commands.Messages.SubInfo = {
-	'Description' : "Display message sub-board information"
+	Description: "Display message sub-board information"
 }
-if(inBBS())
-	Commands.Messages.SubInfo.Action = bbs.sub_info;
 
 // File area related functions
 
+if (inBBS) {
+	Commands.Files.BatchMenu.Action = _wrap(bbs.batch_menu);
+	Commands.Files.BatchDownload.Action = _wrap(bbs.batch_download);
+	Commands.Files.DirInfo.Action = _wrap(bbs.dir_info);
+	Commands.Files.List.Action = _wrap(bbs.list_files);
+	Commands.Files.ListExtended.Action = _wrap(bbs.list_file_info);
+	Commands.Files.Scan.Action = _wrap(bbs.scan_dirs);
+	Commands.Files.TempXfer.Action = _wrap(bbs.temp_xfer);
+	Commands.Files.Upload.Action = _wrap(bbs.upload_file);
+	Commands.Files.XferPolicy.Action = _wrap(bbs.xfer_policy);
+}
+
 Commands.Files.BatchMenu = {
-	'Description' : "Enter the batch file transfer menu"
+	Description: "Enter the batch file transfer menu"
 }
-if(inBBS())
-	Commands.Files.BatchMenu.Action = bbs.batch_menu;
 
 Commands.Files.BatchDownload = {
-	'Description' : "Start a batch download"
+	Description: "Start a batch download"
 }
-if(inBBS())
-	Commands.Files.BatchDownload.Action = bbs.batch_download;
 
 Commands.Files.DirInfo = {
-	'Description' : "Display file directory information"
+	Description: "Display file directory information"
 }
-if(inBBS())
-	Commands.Files.DirInfo.Action = bbs.dir_info;
 
 Commands.Files.List = {
-	'Description' : "List all files in the current directory"
+	Description: "List all files in the current directory"
 }
-if(inBBS())
-	Commands.Files.List.Action = bbs.list_files;
 
 Commands.Files.ListExtended = {
-	'Description' : "List all files in current directory (extended info)"
+	Description: "List all files in current directory (extended info)"
 }
-if(inBBS())
-	Commands.Files.ListExtended.Action = bbs.list_file_info;
 
 Commands.Files.Scan = {
-	'Description' : "Scan directories for files"
+	Description: "Scan directories for files"
 }
-if(inBBS())
-	Commands.Files.Scan.Action = bbs.scan_dirs;
 
 Commands.Files.TempXfer = {
-	'Description' : "Enter the temporary file transfer menu"
+	Description: "Enter the temporary file transfer menu"
 }
-if(inBBS())
-	Commands.Files.TempXfer.Action = bbs.temp_xfer;
 
 Commands.Files.Upload = {
-	'Description' : "Upload a file to the current directory"
+	Description: "Upload a file to the current directory"
 }
-if(inBBS())
-	Commands.Files.Upload.Action = bbs.upload_file;
 
 Commands.Files.XferPolicy = {
-	'Description' : "Display the file transfer policy"
-}
-if(inBBS())
-	Commands.Files.XferPolicy.Action = bbs.xfer_policy;
-
-var getMenus = function() {
-	if(!file_exists(menuFile))
-		return;
-	var f = new File(menuFile);
-	f.open("r");
-	Commands.Menus = JSON.parse(f.read());
-	f.close();
+	Description: "Display the file transfer policy"
 }
 
 getMenus();
\ No newline at end of file
-- 
GitLab