| 3214 | 3214 | helpString: t`Plays the message received sound effect.`, |
| 3215 | 3215 | })); |
| 3216 | 3216 | |
| 3217 | + SlashCommandParser.addCommandObject(SlashCommand.fromProps({ |
| 3218 | + name: 'array-wrap', |
| 3219 | + aliases: ['list-wrap'], |
| 3220 | + returns: t`unnamed argument value wrapped into an array`, |
| 3221 | + helpString: t`Wraps a single unnamed argument into an array if it's not already an array. If the value is an empty string, returns an empty array.`, |
| 3222 | + unnamedArgumentList: [ |
| 3223 | + SlashCommandArgument.fromProps({ |
| 3224 | + description: t`value`, |
| 3225 | + acceptsMultiple: false, |
| 3226 | + isRequired: true, |
| 3227 | + typeList: [ARGUMENT_TYPE.STRING, ARGUMENT_TYPE.DICTIONARY, ARGUMENT_TYPE.BOOLEAN, ARGUMENT_TYPE.NUMBER, ARGUMENT_TYPE.LIST], |
| 3228 | + }), |
| 3229 | + ], |
| 3230 | + callback: (_args, value) => { |
| 3231 | + // Closures are not supported |
| 3232 | + if (value instanceof SlashCommandClosure) { |
| 3233 | + throw new SlashCommandExecutionError(t`Closures are not supported as unnamed arguments for /array-wrap. Did you forget to call the closure with parentheses?`); |
| 3234 | + } |
| 3235 | + |
| 3236 | + // Multiple unnamed arguments are not supported since acceptsMultiple is false, but check just in case |
| 3237 | + if (Array.isArray(value)) { |
| 3238 | + throw new SlashCommandExecutionError(t`/array-wrap does not support multiple unnamed arguments.`); |
| 3239 | + } |
| 3240 | + |
| 3241 | + // Empty string - empty arrays |
| 3242 | + if (value === '') { |
| 3243 | + return JSON.stringify([]); |
| 3244 | + } |
| 3245 | + |
| 3246 | + try { |
| 3247 | + // If the value is a valid JSON string, parse it |
| 3248 | + const parsedValue = JSON.parse(value); |
| 3249 | + |
| 3250 | + // Already an array - return as-is |
| 3251 | + if (Array.isArray(parsedValue)) { |
| 3252 | + return value; |
| 3253 | + } |
| 3254 | + |
| 3255 | + // If it's an object, wrap it into an array and stringify |
| 3256 | + if (typeof parsedValue === 'object' && parsedValue !== null) { |
| 3257 | + return JSON.stringify([parsedValue]); |
| 3258 | + } |
| 3259 | + |
| 3260 | + // Wrap the original value (string, number, boolean) into an array, preserving quotes for strings |
| 3261 | + return JSON.stringify([value]); |
| 3262 | + } catch { |
| 3263 | + // Not a valid JSON string - wrap the original value |
| 3264 | + return JSON.stringify([value]); |
| 3265 | + } |
| 3266 | + }, |
| 3267 | + })); |
| 3268 | + SlashCommandParser.addCommandObject(SlashCommand.fromProps({ |
| 3269 | + name: 'array-unwrap', |
| 3270 | + aliases: ['list-unwrap'], |
| 3271 | + returns: t`unnamed argument value unwrapped from an array`, |
| 3272 | + helpString: t`Unwraps the first element of an array provided as an unnamed argument. If the value is not an array, returns the value as-is. If the array is empty, returns an empty string.`, |
| 3273 | + unnamedArgumentList: [ |
| 3274 | + SlashCommandArgument.fromProps({ |
| 3275 | + description: t`value`, |
| 3276 | + acceptsMultiple: false, |
| 3277 | + isRequired: true, |
| 3278 | + typeList: [ARGUMENT_TYPE.STRING, ARGUMENT_TYPE.DICTIONARY, ARGUMENT_TYPE.BOOLEAN, ARGUMENT_TYPE.NUMBER, ARGUMENT_TYPE.LIST], |
| 3279 | + }), |
| 3280 | + ], |
| 3281 | + callback: (_args, value) => { |
| 3282 | + // Closures are not supported |
| 3283 | + if (value instanceof SlashCommandClosure) { |
| 3284 | + throw new SlashCommandExecutionError(t`Closures are not supported as unnamed arguments for /array-unwrap. Did you forget to call the closure with parentheses?`); |
| 3285 | + } |
| 3286 | + |
| 3287 | + // Multiple unnamed arguments are not supported since acceptsMultiple is false, but check just in case |
| 3288 | + if (Array.isArray(value)) { |
| 3289 | + throw new SlashCommandExecutionError(t`/array-unwrap does not support multiple unnamed arguments.`); |
| 3290 | + } |
| 3291 | + |
| 3292 | + try { |
| 3293 | + // If the value is a JSON array, get the first element |
| 3294 | + const parsed = JSON.parse(value); |
| 3295 | + |
| 3296 | + if (Array.isArray(parsed)) { |
| 3297 | + const unwrappedValue = parsed?.[0] ?? ''; |
| 3298 | + |
| 3299 | + // If the first element is null or undefined, return an empty string |
| 3300 | + if (unwrappedValue === null || unwrappedValue === undefined) { |
| 3301 | + return ''; |
| 3302 | + } |
| 3303 | + |
| 3304 | + // If the first element is an object, stringify it. |
| 3305 | + if (typeof unwrappedValue === 'object') { |
| 3306 | + return JSON.stringify(unwrappedValue); |
| 3307 | + } |
| 3308 | + |
| 3309 | + // Otherwise, return it as a string. |
| 3310 | + return String(unwrappedValue); |
| 3311 | + } |
| 3312 | + return value; |
| 3313 | + } catch { |
| 3314 | + // Not a valid JSON - return as-is |
| 3315 | + return value; |
| 3316 | + } |
| 3317 | + }, |
| 3318 | + })); |
| 3319 | + |
| 3217 | 3320 | registerVariableCommands(); |
| 3218 | 3321 | } |
| 3219 | 3322 | |