from typing import Callable, Any from d4dj_utils.master.master_asset import MasterDict from discord.ext import commands from miyu_bot.commands.common.fuzzy_matching import FuzzyFilteredMap class MasterAssetManager: def __init__(self, masters: MasterDict, naming_function: Callable[[Any], str], filter_function=lambda _: True): self.masters = masters self.fuzzy_map = FuzzyFilteredMap(filter_function) self.unfiltered_fuzzy_map = FuzzyFilteredMap() for master in masters.values(): name = naming_function(master) if self.fuzzy_map.has_exact(name): continue self.fuzzy_map[name] = master self.unfiltered_fuzzy_map[name] = master def get(self, name_or_id: str, ctx: commands.Context): if ctx.channel.id in no_filter_channels: try: return self.masters[int(name_or_id)] except (KeyError, ValueError): return self.unfiltered_fuzzy_map[name_or_id] else: try: master = self.masters[int(name_or_id)] if master not in self.fuzzy_map.values(): master = self.fuzzy_map[name_or_id] return master except (KeyError, ValueError): return self.fuzzy_map[name_or_id] def get_sorted(self, name: str, ctx: commands.Context): if ctx.channel.id in no_filter_channels: return self.unfiltered_fuzzy_map.get_sorted(name) else: return self.fuzzy_map.get_sorted(name) def values(self, ctx: commands.Context): if ctx.channel.id in no_filter_channels: return self.unfiltered_fuzzy_map.values() else: return self.fuzzy_map.values() no_filter_channels = {790033228600705048, 790033272376918027}