Skip to content

Commit f3fc8c0

Browse files
committed
add eq
1 parent eac4d94 commit f3fc8c0

File tree

1 file changed

+147
-0
lines changed

1 file changed

+147
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
# pyright: reportCallIssue=false
2+
3+
from collections.abc import Iterable
4+
from typing import cast, final, override
5+
6+
import discord
7+
import wavelink
8+
from discord.ext import commands
9+
from wavelink.types.filters import Equalizer as EqualizerPayload
10+
11+
from nameless import Nameless
12+
from nameless.custom.ui import CustomDropdown
13+
from nameless.custom.ui.modal import CustomInput
14+
from nameless.custom.ui.modal.custom_modal import BaseCustomModal
15+
16+
from .base import FilterView
17+
18+
19+
def plot_eq(
20+
values: Iterable[EqualizerPayload], offset: float = 0.25, multiplier: int = 4
21+
):
22+
gains = [(value["gain"] + offset) * multiplier for value in values]
23+
cells = [f"{i} " + "▌" * int(value) for i, value in enumerate(gains, start=1)]
24+
return "\n".join(cells)
25+
26+
27+
class EqualizerInput(CustomInput[float]):
28+
@override
29+
async def callback(self, interaction: discord.Interaction): ...
30+
31+
32+
class EqualizerModal(BaseCustomModal[float]):
33+
def __init__(self, title: str, filters: wavelink.Filters) -> None:
34+
super().__init__(title)
35+
self.add_item(
36+
CustomInput(label="Gain", custom_id="gain_eq", default="0", convert=float)
37+
)
38+
39+
40+
@final
41+
class EqualizerSettingDropdown(CustomDropdown):
42+
def __init__(self, filters: wavelink.Filters):
43+
super().__init__(custom_id="equalizer_dropdown", placeholder="Select a band")
44+
45+
for eq in filters.equalizer.payload.values():
46+
self.add_option(
47+
label=f"Band {eq['band']}",
48+
value=str(eq["band"]),
49+
description=f"{'+' if eq['gain'] >= 0 else ''}{eq['gain']}",
50+
)
51+
self.self_add_option(label="Exit", value="-1").self_add_option(
52+
label="Save", value="-2"
53+
)
54+
55+
self._modal: EqualizerModal | None = None
56+
self._output_message: str | None = None
57+
58+
self.filters = filters
59+
60+
def get_field_index(self) -> int:
61+
return int(self.values[0])
62+
63+
@property
64+
def output_message(self) -> str:
65+
if not self._output_message:
66+
return "No message"
67+
return self._output_message
68+
69+
@property
70+
def input_value(self):
71+
if not self._modal:
72+
return 0
73+
return self._modal.value
74+
75+
@override
76+
async def callback(self, interaction: discord.Interaction[discord.Client]):
77+
assert self.view
78+
view = cast(FilterView, self.view)
79+
80+
get_index = self.get_field_index()
81+
if get_index == -1:
82+
return view.exit()
83+
elif get_index == -2:
84+
return view.save()
85+
86+
self._modal = EqualizerModal(
87+
title=f"Change gain for band {get_index}", filters=self.filters
88+
)
89+
await interaction.response.send_modal(self._modal)
90+
if await self._modal.wait():
91+
return
92+
93+
cast(FilterView, self.view).set_filter("equalizer", "bands")
94+
view.stop()
95+
96+
97+
class EqualizerSettingView(FilterView):
98+
def __init__(
99+
self,
100+
author: discord.Member | discord.User,
101+
message: discord.Message,
102+
filters: wavelink.Filters,
103+
):
104+
super().__init__(author, message, filters)
105+
self.add_item(EqualizerSettingDropdown(filters))
106+
107+
@override
108+
def get_dropdown(self) -> EqualizerSettingDropdown:
109+
return cast(EqualizerSettingDropdown, self.children[0])
110+
111+
112+
def make_embed(payload: dict[int, EqualizerPayload]) -> discord.Embed:
113+
return discord.Embed(
114+
title="Equalizer Settings",
115+
description="Select a setting to change",
116+
color=discord.Color.blurple(),
117+
).add_field(
118+
name="Current settings",
119+
value=f"```{plot_eq(payload.values())}```",
120+
inline=False,
121+
)
122+
123+
124+
async def make(
125+
ctx: commands.Context[Nameless],
126+
message: discord.Message,
127+
filters: wavelink.Filters,
128+
voice_client: wavelink.Player,
129+
):
130+
if not any(filters.equalizer.payload):
131+
filters.equalizer.reset()
132+
133+
while True:
134+
view = EqualizerSettingView(ctx.author, message, filters)
135+
await message.edit(view=view, embed=make_embed(filters.equalizer.payload))
136+
137+
if await view.wait():
138+
return
139+
140+
if view.is_exit():
141+
break
142+
143+
if view.is_save():
144+
await voice_client.set_filters(filters)
145+
return
146+
147+
await ctx.send("Equalizer settings not saved", ephemeral=True, delete_after=5)

0 commit comments

Comments
 (0)