33 lines
1.3 KiB
C#
33 lines
1.3 KiB
C#
|
namespace MinecraftDiscordBot;
|
|||
|
|
|||
|
public abstract class ItemFilter {
|
|||
|
public abstract bool Match(Fluid item);
|
|||
|
public virtual bool MatchItem(Item item) => Match(item);
|
|||
|
|
|||
|
public static ItemFilter Parse(string filter)
|
|||
|
=> filter.StartsWith('@')
|
|||
|
? new ModNameFilter(filter[1..])
|
|||
|
: filter.StartsWith('$')
|
|||
|
? new TagFilter(filter[1..])
|
|||
|
: new ItemNameFilter(filter);
|
|||
|
|
|||
|
private class ModNameFilter : ItemFilter {
|
|||
|
private readonly string filter;
|
|||
|
public ModNameFilter(string filter) => this.filter = filter;
|
|||
|
public override bool Match(Fluid item) => item.ItemId.ModName.Contains(filter, StringComparison.InvariantCultureIgnoreCase);
|
|||
|
}
|
|||
|
|
|||
|
private class TagFilter : ItemFilter {
|
|||
|
private readonly string filter;
|
|||
|
public TagFilter(string filter) => this.filter = filter;
|
|||
|
public override bool Match(Fluid item)
|
|||
|
=> item.Tags?.Any(tag => tag.Contains(filter, StringComparison.InvariantCultureIgnoreCase)) ?? false;
|
|||
|
}
|
|||
|
|
|||
|
private class ItemNameFilter : ItemFilter {
|
|||
|
private readonly string filter;
|
|||
|
public ItemNameFilter(string filter) => this.filter = filter;
|
|||
|
public override bool Match(Fluid item) => item.DisplayName.Contains(filter, StringComparison.InvariantCultureIgnoreCase);
|
|||
|
}
|
|||
|
}
|