add score and heal filter parameters to card commands

pull/1/head
qwewqa 4 years ago
parent da28da829f
commit b84195573a
  1. 26
      miyu_bot/commands/cogs/card.py

@ -9,12 +9,11 @@ from d4dj_utils.master.skill_master import SkillMaster
from discord.ext import commands
from miyu_bot.bot.bot import D4DJBot
from miyu_bot.commands.common.argument_parsing import ParsedArguments, parse_arguments, ArgumentError
from miyu_bot.commands.common.argument_parsing import ParsedArguments, parse_arguments, ArgumentError, list_operator_for
from miyu_bot.commands.common.asset_paths import get_card_icon_path, get_card_art_path
from miyu_bot.commands.common.emoji import rarity_emoji_ids, attribute_emoji_ids_by_attribute_id, \
unit_emoji_ids_by_unit_id, parameter_bonus_emoji_ids_by_parameter_id
from miyu_bot.commands.common.formatting import format_info
from miyu_bot.bot.master_asset_manager import hash_master
from miyu_bot.commands.common.reaction_message import run_tabbed_message, run_reaction_message, run_paged_message
@ -134,6 +133,8 @@ class Card(commands.Cog):
attributes = {self.bot.aliases.attributes_by_name[a].id
for a in arguments.tags(self.bot.aliases.attributes_by_name.keys())}
birthday = arguments.tag('birthday') | arguments.word('birthday')
score_up_filters = arguments.repeatable(['skill', 'score_up', 'score'], is_list=True, numeric=True)
heal_filters = arguments.repeatable(['heal', 'recovery'], is_list=True, numeric=True)
event_bonus = bool(arguments.tags(['event', 'eventbonus', 'event_bonus']))
@ -158,7 +159,7 @@ class Card(commands.Cog):
if not (arguments.text() and sort is None):
sort = sort or CardAttribute.Power
cards = sorted(cards, key=lambda c: (sort.get_sort_key_from_card(c), c.max_power_with_limit_break))
if sort in [CardAttribute.Power, CardAttribute.Date, CardAttribute.ScoreUp]:
if sort in [CardAttribute.Power, CardAttribute.Date, CardAttribute.ScoreUp, CardAttribute.Heal]:
cards = cards[::-1]
if reverse_sort:
cards = cards[::-1]
@ -174,6 +175,13 @@ class Card(commands.Cog):
if birthday:
cards = [card for card in cards if card.name == 'Birthday']
for value, operation in score_up_filters:
operator = list_operator_for(operation)
cards = [card for card in cards if operator(card.skill.score_up_rate, value)]
for value, operation in heal_filters:
operator = list_operator_for(operation)
cards = [card for card in cards if operator(card.skill.max_recovery_value, value)]
return cards
def get_card_embed(self, card: CardMaster, limit_break):
@ -231,6 +239,7 @@ class CardAttribute(enum.Enum):
Power = enum.auto()
Date = enum.auto()
ScoreUp = enum.auto()
Heal = enum.auto()
def get_sort_key_from_card(self, card: CardMaster):
return {
@ -239,6 +248,7 @@ class CardAttribute(enum.Enum):
self.Power: card.max_power_with_limit_break,
self.Date: card.start_datetime,
self.ScoreUp: card.skill.score_up_rate,
self.Heal: card.skill.max_recovery_value,
}[self]
def get_formatted_from_card(self, card: CardMaster):
@ -247,9 +257,14 @@ class CardAttribute(enum.Enum):
self.Id: str(card.id).zfill(9),
self.Power: str(card.max_power_with_limit_break).rjust(5),
self.Date: str(card.start_datetime.date()),
self.ScoreUp: f'{card.skill.score_up_rate}%',
self.ScoreUp: self.format_skill(card.skill),
self.Heal: self.format_skill(card.skill),
}[self]
@staticmethod
def format_skill(skill):
return f'{str(skill.score_up_rate).rjust(2)}%,{str(skill.max_recovery_value).rjust(3)}hp'
card_attribute_aliases = {
'name': CardAttribute.Name,
@ -259,6 +274,9 @@ card_attribute_aliases = {
'date': CardAttribute.Date,
'skill': CardAttribute.ScoreUp,
'score_up': CardAttribute.ScoreUp,
'scoreup': CardAttribute.ScoreUp,
'heal': CardAttribute.Heal,
'recovery': CardAttribute.Heal,
}

Loading…
Cancel
Save