add `/sort` slash command

84140f4e4f6d6d631285b63135344c7eee0b160f

InspectorCaracal <51038201+InspectorCaracal@users.noreply.github.com>

1 files changed, +71 -0Showing whitespace changes
public/scripts/variables.js+71 -0
@@ -836,6 +836,32 @@ function randValuesCallback(from, to, args) {
836 return value;836 return value;
837}837}
838838
839function sortArrayObjectCallback(args, value) {
840 let parsedValue;
841 if (typeof value == 'string') {
842 try {
843 parsedValue = JSON.parse(value);
844 } catch {
845 // return the original input if it was invalid
846 return value;
847 }
848 } else {
849 parsedValue = value
850 }
851 if (Array.isArray(parsedValue)) {
852 // always sort lists by value
853 parsedValue.sort()
854 } else if (typeof parsedValue == 'object') {
855 let keysort = args.keysort;
856 if (isFalseBoolean(keysort)) {
857 parsedValue = Object.keys(parsedValue).sort(function(a,b){return parsedValue[a]-parsedValue[b]});
858 } else {
859 parsedValue = Object.keys(parsedValue).sort();
860 }
861 }
862 return JSON.stringify(parsedValue);
863}
864
839/**865/**
840 * Declare a new variable in the current scope.866 * Declare a new variable in the current scope.
841 * @param {NamedArguments} args Named arguments.867 * @param {NamedArguments} args Named arguments.
@@ -2110,6 +2136,51 @@ export function registerVariableCommands() {
2110 `,2136 `,
2111 }));2137 }));
2112 SlashCommandParser.addCommandObject(SlashCommand.fromProps({2138 SlashCommandParser.addCommandObject(SlashCommand.fromProps({
2139 name: 'sort',
2140 callback: sortArrayObjectCallback,
2141 returns: 'the sorted list or dictionary keys',
2142 namedArgumentList: [
2143 SlashCommandNamedArgument.fromProps({ name: 'keysort',
2144 description: 'whether to sort by key or value; ignored for lists',
2145 typeList: [ARGUMENT_TYPE.BOOLEAN],
2146 enumList: ['true', 'false'],
2147 defaultValue: 'true',
2148 }),
2149 ],
2150 unnamedArgumentList: [
2151 SlashCommandArgument.fromProps({
2152 description: 'value',
2153 typeList: [ARGUMENT_TYPE.STRING, ARGUMENT_TYPE.NUMBER, ARGUMENT_TYPE.LIST, ARGUMENT_TYPE.DICTIONARY],
2154 isRequired: true,
2155 forceEnum: false,
2156 }),
2157 ],
2158 helpString: `
2159 <div>
2160 Sorts a list or dictionary in ascending order and passes the result down the pipe.
2161 <ul>
2162 <li>
2163 For lists, returns the list sorted by value.
2164 </li>
2165 <li>
2166 For dictionaries, returns the ordered list of keys after sorting. Setting keysort=false means keys are sorted by associated value.
2167 </li>
2168 </ul>
2169 </div>
2170 <div>
2171 <strong>Examples:</strong>
2172 <ul>
2173 <li>
2174 <pre><code class="language-stscript">/sort [5,3,4,1,2] | /echo</code></pre>
2175 </li>
2176 <li>
2177 <pre><code class="language-stscript">/sort keysort=false {"a": 1, "d": 3, "c": 2, "b": 5} | /echo</code></pre>
2178 </li>
2179 </ul>
2180 </div>
2181 `,
2182 }));
2183 SlashCommandParser.addCommandObject(SlashCommand.fromProps({
2113 name: 'rand',2184 name: 'rand',
2114 callback: (args, value) => String(randValuesCallback(Number(args.from ?? 0), Number(args.to ?? (value ? value : 1)), args)),2185 callback: (args, value) => String(randValuesCallback(Number(args.from ?? 0), Number(args.to ?? (value ? value : 1)), args)),
2115 returns: 'random number',2186 returns: 'random number',