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: