import { SpotifyClient } from '../spotify/client.js';
// Rate limiting for skip actions to prevent loops
const lastSkipTime = new Map<string, number>();
const SKIP_COOLDOWN_MS = 1000; // 1 second cooldown between skips
export async function controlPlayback(
client: SpotifyClient,
action: 'play' | 'pause' | 'skip-next' | 'skip-previous' | 'volume',
value?: number,
deviceId?: string
) {
switch (action) {
case 'play':
await client.resume(deviceId);
return { success: true, message: 'Playback resumed' };
case 'pause':
await client.pause(deviceId);
return { success: true, message: 'Playback paused' };
case 'skip-next': {
const now = Date.now();
const lastTime = lastSkipTime.get('skip-next') || 0;
if (now - lastTime < SKIP_COOLDOWN_MS) {
return {
success: true,
message: 'Skipped to next track (rate limited - already skipped recently)'
};
}
await client.skipToNext(deviceId);
lastSkipTime.set('skip-next', now);
return { success: true, message: 'Skipped to next track once' };
}
case 'skip-previous': {
const now = Date.now();
const lastTime = lastSkipTime.get('skip-previous') || 0;
if (now - lastTime < SKIP_COOLDOWN_MS) {
return {
success: true,
message: 'Skipped to previous track (rate limited - already skipped recently)'
};
}
await client.skipToPrevious(deviceId);
lastSkipTime.set('skip-previous', now);
return { success: true, message: 'Skipped to previous track once' };
}
case 'volume':
if (value === undefined || value < 0 || value > 100) {
throw new Error('Volume must be between 0 and 100');
}
await client.setVolume(value, deviceId);
return { success: true, message: `Volume set to ${value}%` };
default:
throw new Error(`Unknown action: ${action}`);
}
}
export async function getCurrentPlaying(client: SpotifyClient) {
const track = await client.getCurrentlyPlaying();
if (!track) {
return {
success: true,
playing: false,
message: 'No track currently playing',
};
}
return {
success: true,
playing: track.isPlaying,
track: {
name: track.name,
artist: track.artist,
album: track.album,
uri: track.uri,
progressMs: track.progressMs,
},
};
}