11from collections .abc import Callable
2+ from dataclasses import dataclass
23from typing import Any
34
45import discord
@@ -110,6 +111,35 @@ async def on_submit(self, interaction: Interaction) -> None:
110111 await self .embed_view .apply_template (self .template .value , self .message , interaction )
111112
112113
114+ @dataclass
115+ class FilterTarget :
116+ """The filter being edited and its context."""
117+ filter_list : FilterList
118+ list_type : ListType
119+ filter_type : type [Filter ]
120+
121+
122+ @dataclass
123+ class FilterContent :
124+ """Content and description of the filter being edited."""
125+ content : str | None
126+ description : str | None
127+
128+
129+ def build_type_per_setting_name (
130+ filter_type : type [Filter ],
131+ loaded_settings : dict ,
132+ loaded_filter_settings : dict ,
133+ ) -> dict :
134+ """Build the type_per_setting_name dict from the loaded settings."""
135+ type_per_setting_name = {setting : info [2 ] for setting , info in loaded_settings .items ()}
136+ type_per_setting_name .update ({
137+ f"{ filter_type .name } /{ name } " : type_
138+ for name , (_ , _ , type_ ) in loaded_filter_settings .get (filter_type .name , {}).items ()
139+ })
140+ return type_per_setting_name
141+
142+
113143class FilterEditView (EditBaseView ):
114144 """A view used to edit a filter's settings before updating the database."""
115145
@@ -118,11 +148,8 @@ class _REMOVE:
118148
119149 def __init__ (
120150 self ,
121- filter_list : FilterList ,
122- list_type : ListType ,
123- filter_type : type [Filter ],
124- content : str | None ,
125- description : str | None ,
151+ filter_target : FilterTarget ,
152+ filter_content : FilterContent ,
126153 settings_overrides : dict ,
127154 filter_settings_overrides : dict ,
128155 loaded : LoadedTypes ,
@@ -131,19 +158,17 @@ def __init__(
131158 confirm_callback : Callable
132159 ):
133160 super ().__init__ (author )
134- self .filter_list = filter_list
135- self .list_type = list_type
136- self .filter_type = filter_type
137- self .content = content
138- self .description = description
161+ self .filter_target = filter_target
162+ self .filter_content = filter_content
139163 self .settings_overrides = settings_overrides
140164 self .filter_settings_overrides = filter_settings_overrides
141165 self .loaded = loaded
142166 self .embed = embed
143167 self .confirm_callback = confirm_callback
144168
145169 all_settings_repr_dict = build_filter_repr_dict (
146- filter_list , list_type , filter_type , settings_overrides , filter_settings_overrides
170+ filter_target .filter_list , filter_target .list_type , filter_target .filter_type ,
171+ settings_overrides , filter_settings_overrides
147172 )
148173 populate_embed_from_dict (embed , all_settings_repr_dict )
149174
@@ -156,14 +181,15 @@ def __init__(
156181 add_select = CustomCallbackSelect (
157182 self ._prompt_new_value ,
158183 placeholder = "Select a setting to edit" ,
159- options = [SelectOption (label = name ) for name in sorted (self . type_per_setting_name )],
184+ options = [SelectOption (label = name ) for name in sorted (type_per_setting_name )],
160185 row = 1
161186 )
162187 self .add_item (add_select )
163188
164189 if settings_overrides or filter_settings_overrides :
165190 override_names = (
166- list (settings_overrides ) + [f"{ filter_list .name } /{ setting } " for setting in filter_settings_overrides ]
191+ list (settings_overrides )
192+ + [f"{ filter_target .filter_list .name } /{ setting } " for setting in filter_settings_overrides ]
167193 )
168194 remove_select = CustomCallbackSelect (
169195 self ._remove_override ,
@@ -199,21 +225,21 @@ async def enter_template(self, interaction: Interaction, button: discord.ui.Butt
199225 @discord .ui .button (label = "✅ Confirm" , style = discord .ButtonStyle .green , row = 4 )
200226 async def confirm (self , interaction : Interaction , button : discord .ui .Button ) -> None :
201227 """Confirm the content, description, and settings, and update the filters database."""
202- if self .content is None :
228+ if self .filter_content . content is None :
203229 await interaction .response .send_message (
204230 ":x: Cannot add a filter with no content." , ephemeral = True , reference = interaction .message
205231 )
206- if self .description is None :
207- self .description = ""
232+ if self .filter_content . description is None :
233+ self .filter_content . description = ""
208234 await interaction .response .edit_message (view = None ) # Make sure the interaction succeeds first.
209235 try :
210236 await self .confirm_callback (
211237 interaction .message ,
212- self .filter_list ,
213- self .list_type ,
214- self .filter_type ,
215- self .content ,
216- self .description ,
238+ self .filter_target . filter_list ,
239+ self .filter_target . list_type ,
240+ self .filter_target . filter_type ,
241+ self .filter_content . content ,
242+ self .filter_content . description ,
217243 self .settings_overrides ,
218244 self .filter_settings_overrides
219245 )
@@ -348,7 +374,7 @@ async def apply_template(self, template_id: str, embed_message: discord.Message,
348374 """Replace any non-overridden settings with overrides from the given filter."""
349375 try :
350376 settings , filter_settings = template_settings (
351- template_id , self .filter_list , self .list_type , self .filter_type
377+ template_id , self .filter_target . filter_list , self .filter_target . list_type , self . filter_target .filter_type
352378 )
353379 except BadArgument as e : # The interaction object is necessary to send an ephemeral message.
354380 await interaction .response .send_message (f":x: { e } " , ephemeral = True )
@@ -373,11 +399,15 @@ async def _remove_override(self, interaction: Interaction, select: discord.ui.Se
373399 def copy (self ) -> FilterEditView :
374400 """Create a copy of this view."""
375401 return FilterEditView (
376- self .filter_list ,
377- self .list_type ,
378- self .filter_type ,
379- self .content ,
380- self .description ,
402+ FilterTarget (
403+ self .filter_target .filter_list ,
404+ self .filter_target .list_type ,
405+ self .filter_target .filter_type ,
406+ ),
407+ FilterContent (
408+ self .filter_content .content ,
409+ self .filter_content .description ,
410+ ),
381411 self .settings_overrides ,
382412 self .filter_settings_overrides ,
383413 self .loaded ,
0 commit comments