UNPKG

amaran-light-cli

Version:

Command line tool for controlling Aputure Amaran lights via WebSocket to a local Amaran desktop app.

172 lines 7.34 kB
import chalk from 'chalk'; import { addStandardOptions, runDeviceAction } from '../cmdUtils.js'; export function registerEffect(program, deps) { const { asyncCommand } = deps; const effect = program.command('effect').description('Control effects'); addStandardOptions(effect.command('list').description('List available system effects')).action(asyncCommand(handleEffectList(deps))); addStandardOptions(effect .command('set <device> <effect_type>') .option('-i, --intensity <percent>', 'Intensity percentage') .description('Set a system effect')).action(asyncCommand(handleEffectSet(deps))); addStandardOptions(effect.command('custom <device> <effect_name>').description('Set a custom effect by name')).action(asyncCommand(handleEffectCustom(deps))); addStandardOptions(effect.command('speed <device> <speed>').description('Set effect speed')).action(asyncCommand(handleEffectSpeed(deps))); addStandardOptions(effect.command('intensity <device> <intensity>').description('Set effect intensity')).action(asyncCommand(handleEffectIntensity(deps))); } function handleEffectList(deps) { const { createController } = deps; return async (options) => { const controller = await createController(options.url, options.clientId, options.debug); controller.getSystemEffectList((success, message, data) => { if (success) { const effects = data.data; console.log(chalk.blue('System Effects:')); effects.forEach((eff) => { console.log(` - ${eff}`); }); } else { console.error(chalk.red(`Error getting effect list: ${message}`)); } controller.disconnect(); }); }; } function handleEffectSet(deps) { return async (deviceQuery, effectType, options) => { let intensity; if (options.intensity) { const p = parseFloat(options.intensity); if (!Number.isNaN(p)) { intensity = p * 10; // Convert to API scale } } // Special handling for "all" devices if (deviceQuery.toLowerCase() === 'all') { const { createController } = deps; const controller = await createController(options.url, options.clientId, options.debug); try { await controller.setSystemEffectForAllLights(effectType, intensity, (success, message) => { if (!success) { console.error(chalk.red(`Error setting effect for all lights: ${message}`)); } }); console.log(chalk.green(`Effect ${effectType} set for all lights`)); } finally { await controller.disconnect(); } return; } return runDeviceAction({ deps, options, deviceQuery, actionName: `set effect ${effectType}`, }, (device, controller) => { return new Promise((resolve) => { controller.setSystemEffect(device.node_id, effectType, intensity, (success, message) => { if (success) { console.log(chalk.green(`✓ Effect ${effectType} set on ${device.device_name || 'device'}`)); } else { console.error(chalk.red(`✗ Failed to set effect: ${message}`)); } resolve(); }); }); }, () => { console.log(chalk.yellow('Bulk effect set not supported.')); return Promise.resolve(); }); }; } function handleEffectCustom(deps) { return async (deviceQuery, effectName, options) => { return runDeviceAction({ deps, options, deviceQuery, actionName: `set custom effect ${effectName}`, }, (device, controller) => { return new Promise((resolve) => { controller.setEffect(device.node_id, effectName, {}, (success, message) => { if (success) { console.log(chalk.green(`✓ Custom effect ${effectName} set on ${device.device_name || 'device'}`)); } else { console.error(chalk.red(`✗ Failed to set custom effect: ${message}`)); } resolve(); }); }); }, () => { console.log(chalk.yellow('Bulk custom effect not supported.')); return Promise.resolve(); }); }; } function handleEffectSpeed(deps) { return async (deviceQuery, speedStr, options) => { const speed = parseInt(speedStr, 10); if (Number.isNaN(speed)) { console.error(chalk.red('Speed must be a number')); return; } return runDeviceAction({ deps, options, deviceQuery, actionName: `set effect speed to ${speed}`, }, (device, controller) => { return new Promise((resolve) => { controller.setEffectSpeed(device.node_id, speed, (success, message) => { if (success) { console.log(chalk.green(`✓ Effect speed set to ${speed} on ${device.device_name || 'device'}`)); } else { console.error(chalk.red(`✗ Failed to set effect speed: ${message}`)); } resolve(); }); }); }, () => { console.log(chalk.yellow('Bulk effect speed not supported.')); return Promise.resolve(); }); }; } function handleEffectIntensity(deps) { return async (deviceQuery, valueStr, options) => { const value = parseInt(valueStr, 10); if (Number.isNaN(value)) { console.error(chalk.red('Intensity must be a number')); return; } // Note: The API usually expects 0-1000 range or similar. Check constants. // Assuming user inputs API value directly for this low-level command, // or we could map from percent. Let's assume input matches API expectation for now. return runDeviceAction({ deps, options, deviceQuery, actionName: `set effect intensity to ${value}`, }, (device, controller) => { return new Promise((resolve) => { controller.setEffectIntensity(device.node_id, value, (success, message) => { if (success) { console.log(chalk.green(`✓ Effect intensity set to ${value} on ${device.device_name || 'device'}`)); } else { console.error(chalk.red(`✗ Failed to set effect intensity: ${message}`)); } resolve(); }); }); }, () => { console.log(chalk.yellow('Bulk effect intensity not supported.')); return Promise.resolve(); }); }; } export default registerEffect; //# sourceMappingURL=effect.js.map