diff --git a/frontend/src/components/PlayerPanel.vue b/frontend/src/components/PlayerPanel.vue index e78f249..201f7af 100644 --- a/frontend/src/components/PlayerPanel.vue +++ b/frontend/src/components/PlayerPanel.vue @@ -361,13 +361,8 @@ async function cycleLoop() { :title="`${fx.name} – ${fx.description}`" @click="onToggleEffect(fx)" > -
- - {{ fx.name }} -
- - {{ fx.active ? 'WŁ' : fx.badge }} - + + {{ fx.name }} @@ -419,8 +414,8 @@ async function cycleLoop() { .btn-effect { display: flex; align-items: center; - justify-content: space-between; - gap: 6px; + justify-content: center; + gap: 7px; padding: 8px 10px; background: rgba(255, 255, 255, 0.03); border: 1px solid var(--border-glass, rgba(255, 255, 255, 0.08)); @@ -451,13 +446,6 @@ async function cycleLoop() { border-color: rgba(245, 158, 11, 0.7); } -.effect-info { - display: flex; - align-items: center; - gap: 6px; - overflow: hidden; -} - .effect-icon { flex-shrink: 0; transition: transform 0.2s ease; @@ -473,21 +461,4 @@ async function cycleLoop() { overflow: hidden; text-overflow: ellipsis; } - -.effect-badge { - font-size: 0.62rem; - font-weight: 700; - padding: 2px 6px; - border-radius: 12px; - background: rgba(255, 255, 255, 0.08); - color: var(--text-muted); - letter-spacing: 0.4px; - flex-shrink: 0; -} - -.effect-badge.active { - background: #f59e0b; - color: #0f172a; - box-shadow: 0 0 8px rgba(245, 158, 11, 0.4); -} diff --git a/frontend/src/types/status.ts b/frontend/src/types/status.ts index 3d95e72..3253a90 100644 --- a/frontend/src/types/status.ts +++ b/frontend/src/types/status.ts @@ -54,7 +54,6 @@ export interface PlayerEffect { id: string name: string description: string - badge: string icon: string active: boolean } diff --git a/tests/test_effects.py b/tests/test_effects.py index da89bcd..dc93e5b 100644 --- a/tests/test_effects.py +++ b/tests/test_effects.py @@ -89,6 +89,22 @@ class TestAudioEffects(unittest.TestCase): self.assertFalse(toggled) self.assertFalse(pipeline.is_active("distortion")) + def test_effects_metadata_does_not_contain_badge(self): + from zyrarbot.audio.effects.registry import get_available_effects_metadata + + metadata = get_available_effects_metadata() + self.assertGreater(len(metadata), 0) + for entry in metadata: + self.assertIn("id", entry) + self.assertIn("name", entry) + self.assertIn("description", entry) + self.assertIn("icon", entry) + self.assertNotIn("badge", entry) + + def test_effect_instances_have_no_badge_attribute(self): + for effect in create_default_effects(): + self.assertFalse(hasattr(effect, "badge")) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_music_player.py b/tests/test_music_player.py index cd408c2..ac9d746 100644 --- a/tests/test_music_player.py +++ b/tests/test_music_player.py @@ -256,6 +256,11 @@ class MusicPlayerQueueTest(unittest.IsolatedAsyncioTestCase): player.set_effect(GUILD, "fourth_density", True) self.assertEqual(player.state(GUILD).active_effects, {"distortion", "fourth_density"}) + # Stopping/clearing the player disables all active effects + player.clear(GUILD) + self.assertEqual(player.state(GUILD).active_effects, set()) + self.assertFalse(player.is_effect_active(GUILD, "distortion")) + self.assertFalse(player.is_effect_active(GUILD, "fourth_density")) async def test_default_plays_are_applied_per_guild(self): player, _ = build_player() diff --git a/zyrarbot/audio/effects/base.py b/zyrarbot/audio/effects/base.py index e05394e..f26e59d 100644 --- a/zyrarbot/audio/effects/base.py +++ b/zyrarbot/audio/effects/base.py @@ -9,7 +9,6 @@ class AudioEffect(ABC): id: str name: str description: str - badge: str icon: str @abstractmethod diff --git a/zyrarbot/audio/effects/distortion.py b/zyrarbot/audio/effects/distortion.py index 4357012..ded7c41 100644 --- a/zyrarbot/audio/effects/distortion.py +++ b/zyrarbot/audio/effects/distortion.py @@ -17,7 +17,6 @@ class DistortionEffect(AudioEffect): id = "distortion" name = "Przester" description = "Ekstremalne podbicie głośności (1000%) z przesterem" - badge = "1000%" icon = "zap" def __init__(self, multiplier: float = 10.0) -> None: diff --git a/zyrarbot/audio/effects/fourth_density.py b/zyrarbot/audio/effects/fourth_density.py index df14488..530750c 100644 --- a/zyrarbot/audio/effects/fourth_density.py +++ b/zyrarbot/audio/effects/fourth_density.py @@ -12,7 +12,6 @@ class FourthDensityEffect(AudioEffect): id = "fourth_density" name = "Czwarta gęstość" description = "Pływający ton (sinusoidalna zmiana pitch z okresem ~1 sekundy)" - badge = "~1s PITCH" icon = "sparkles" def __init__( diff --git a/zyrarbot/audio/effects/muffled.py b/zyrarbot/audio/effects/muffled.py index 6e84c93..b3d3a08 100644 --- a/zyrarbot/audio/effects/muffled.py +++ b/zyrarbot/audio/effects/muffled.py @@ -11,7 +11,6 @@ class MuffledEffect(AudioEffect): id = "muffled" name = "Pod wodą" description = "Filtr dolnoprzepustowy (dźwięk przytłumiony / zza ściany)" - badge = "LOWPASS" icon = "waves" def __init__(self, alpha: float = 0.085) -> None: diff --git a/zyrarbot/audio/effects/registry.py b/zyrarbot/audio/effects/registry.py index 7e98b7c..9bd2aec 100644 --- a/zyrarbot/audio/effects/registry.py +++ b/zyrarbot/audio/effects/registry.py @@ -31,7 +31,6 @@ def get_available_effects_metadata() -> list[dict[str, Any]]: "id": effect.id, "name": effect.name, "description": effect.description, - "badge": effect.badge, "icon": effect.icon, } for effect in create_default_effects() diff --git a/zyrarbot/audio/effects/robot.py b/zyrarbot/audio/effects/robot.py index 328dd57..55cc5d9 100644 --- a/zyrarbot/audio/effects/robot.py +++ b/zyrarbot/audio/effects/robot.py @@ -12,7 +12,6 @@ class RobotEffect(AudioEffect): id = "robot" name = "Robot" description = "Metaliczny, robotyczny głos cyborga (ring modulation ~65Hz)" - badge = "CYBORG" icon = "bot" def __init__(self, freq_hz: float = 65.0, mix: float = 0.85) -> None: diff --git a/zyrarbot/audio/effects/toaster.py b/zyrarbot/audio/effects/toaster.py index 1317bf5..6483191 100644 --- a/zyrarbot/audio/effects/toaster.py +++ b/zyrarbot/audio/effects/toaster.py @@ -11,7 +11,6 @@ class ToasterEffect(AudioEffect): id = "toaster" name = "Dźwięk z tostera" description = "Memiczny dźwięk z mikrofalówki / kalkulatora (bitcrusher 5-bit, aliasing)" - badge = "8-BIT" icon = "radio" def __init__(self, bit_depth: int = 5, downsample: int = 6) -> None: diff --git a/zyrarbot/audio/effects/tremolo.py b/zyrarbot/audio/effects/tremolo.py index 1b70dd1..f73dd50 100644 --- a/zyrarbot/audio/effects/tremolo.py +++ b/zyrarbot/audio/effects/tremolo.py @@ -19,7 +19,6 @@ class TremoloEffect(AudioEffect): id = "tremolo" name = "Tremolo" description = "Pulsowanie amplitudy (efekt wibracji głośności)" - badge = "LFO" icon = "activity" def __init__(self, freq_hz: float = 4.0, depth: float = 0.6) -> None: diff --git a/zyrarbot/music/guild_music_state.py b/zyrarbot/music/guild_music_state.py index 56122f4..9f31ade 100644 --- a/zyrarbot/music/guild_music_state.py +++ b/zyrarbot/music/guild_music_state.py @@ -32,6 +32,7 @@ class GuildMusicState: self.queue.clear() self.current = None self.index = -1 + self.active_effects.clear() def find(self, track_id: str) -> YTDLSource | None: diff --git a/zyrarbot/music/music_player.py b/zyrarbot/music/music_player.py index 7f444a6..bec0151 100644 --- a/zyrarbot/music/music_player.py +++ b/zyrarbot/music/music_player.py @@ -103,6 +103,7 @@ class MusicPlayer: self._playback_tokens[guild_id] = self._playback_tokens.get(guild_id, 0) + 1 self._interrupted_playbacks.discard(guild_id) self.state(guild_id).reset() + self._apply_volume(guild_id) def has_saved_queue(self, guild_id: int) -> bool: return bool(self._queues and self._queues.exists(guild_id)) @@ -236,6 +237,10 @@ class MusicPlayer: def is_effect_active(self, guild_id: int, effect_id: str) -> bool: return effect_id in self.state(guild_id).active_effects + def clear_effects(self, guild_id: int) -> None: + self.state(guild_id).active_effects.clear() + self._apply_volume(guild_id) + def set_loop_mode(self, guild_id: int, mode: LoopMode) -> None: