{- Artifact Copyright (C) 2018 Leif Metcalf This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . -} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DuplicateRecordFields #-} module Artifact.Raw where import Artifact.Internal.Extensions import GHC.Generics import Control.Applicative import qualified Data.Text as T import Data.Aeson data FirstResponseRaw = FirstResponseRaw { cdn_root :: T.Text , url :: T.Text , expire_time :: Int } deriving (Generic, Show) instance FromJSON FirstResponseRaw data SecondResponseRaw = SecondResponseRaw { card_set :: CardSetRaw } deriving (Generic, Show) instance FromJSON SecondResponseRaw data CardSetRaw = CardSetRaw { version :: Int , set_info :: SetInfoRaw , card_list :: [CardRaw] } deriving (Generic, Show) instance FromJSON CardSetRaw data SetInfoRaw = SetInfoRaw { set_id :: Int , pack_item_def :: Int , name :: SetNameRaw } deriving (Generic, Show) instance FromJSON SetInfoRaw data SetNameRaw = SetNameRaw { english :: T.Text } deriving (Generic, Show) instance FromJSON SetNameRaw data CardRaw = CardHeroRaw HeroRaw | CardPassiveRaw PassiveRaw | CardActiveRaw ActiveRaw | CardCreepRaw CreepRaw | CardImprovementRaw ImprovementRaw | CardItemRaw ItemRaw | CardSpellRaw SpellRaw deriving (Show) instance FromJSON CardRaw where parseJSON v = (CardHeroRaw <$> parseJSON v) <|> (CardPassiveRaw <$> parseJSON v) <|> (CardActiveRaw <$> parseJSON v) <|> (CardCreepRaw <$> parseJSON v) <|> (CardImprovementRaw <$> parseJSON v) <|> (CardItemRaw <$> parseJSON v) <|> (CardSpellRaw <$> parseJSON v) data HeroRaw = HeroRaw { card_id :: Int , base_card_id :: Int , card_type :: T.Text , card_name :: CardNameRaw , mini_image :: CardImageRaw , large_image :: CardImageRaw , ingame_image :: CardImageRaw , illustrator :: Maybe T.Text , rarity :: T.Text , is_blue :: Maybe Bool , is_black :: Maybe Bool , is_green :: Maybe Bool , is_red :: Maybe Bool , item_def :: Int , attack :: Maybe Int , armor :: Maybe Int , hit_points :: Int , references :: [ReferenceRaw] } deriving (Show) instance FromJSON HeroRaw where parseJSON = withObject "Hero" $ \v -> do card_id <- v .: "card_id" base_card_id <- v .: "base_card_id" card_type <- v .: "card_type" .:= "Hero" card_name <- v .: "card_name" mini_image <- v .: "mini_image" large_image <- v .: "large_image" ingame_image <- v .: "ingame_image" illustrator <- v .:? "illustrator" rarity <- v .: "rarity" is_blue <- v .:? "is_blue" is_black <- v .:? "is_black" is_green <- v .:? "is_green" is_red <- v .:? "is_red" item_def <- v .: "item_def" attack <- v .:? "attack" armor <- v .:? "armor" hit_points <- v .: "hit_points" references <- v .: "references" pure $ HeroRaw card_id base_card_id card_type card_name mini_image large_image ingame_image illustrator rarity is_blue is_black is_green is_red item_def attack armor hit_points references data PassiveRaw = PassiveRaw { card_id :: Int , base_card_id :: Int , card_type :: T.Text , card_name :: CardNameRaw , card_text :: CardTextRaw , references :: [ReferenceRaw] } deriving (Show) instance FromJSON PassiveRaw where parseJSON = withObject "Passive" $ \v -> do card_id <- v .: "card_id" base_card_id <- v .: "base_card_id" card_type <- v .: "card_type" .:= "Passive Ability" card_name <- v .: "card_name" card_text <- v .: "card_text" references <- v .: "references" pure $ PassiveRaw card_id base_card_id card_type card_name card_text references data ActiveRaw = ActiveRaw { card_id :: Int , base_card_id :: Int , card_type :: T.Text , card_name :: CardNameRaw , card_text :: CardTextRaw , references :: [ReferenceRaw] } deriving (Show) instance FromJSON ActiveRaw where parseJSON = withObject "Active" $ \v -> do card_id <- v .: "card_id" base_card_id <- v .: "base_card_id" card_type <- v .: "card_type" .:= "Ability" card_name <- v .: "card_name" card_text <- v .: "card_text" references <- v .: "references" pure $ ActiveRaw card_id base_card_id card_type card_name card_text references data CreepRaw = CreepRaw { card_id :: Int , base_card_id :: Int , card_type :: T.Text , card_name :: CardNameRaw , card_text :: CardTextRaw , mini_image :: CardImageRaw , large_image :: CardImageRaw , illustrator :: Maybe T.Text , rarity :: Maybe T.Text , is_blue :: Maybe Bool , is_black :: Maybe Bool , is_green :: Maybe Bool , is_red :: Maybe Bool , mana_cost :: Int , item_def :: Maybe Int , attack :: Maybe Int , armor :: Maybe Int , hit_points :: Int , references :: [ReferenceRaw] } deriving (Show) instance FromJSON CreepRaw where parseJSON = withObject "Creep" $ \v -> do card_id <- v .: "card_id" base_card_id <- v .: "base_card_id" card_type <- v .: "card_type" .:= "Creep" card_name <- v .: "card_name" card_text <- v .: "card_text" mini_image <- v .: "mini_image" large_image <- v .: "large_image" illustrator <- v .:? "illustrator" rarity <- v .:? "rarity" is_blue <- v .:? "is_blue" is_black <- v .:? "is_black" is_green <- v .:? "is_green" is_red <- v .:? "is_red" mana_cost <- v .: "mana_cost" item_def <- v .:? "item_def" attack <- v .:? "attack" armor <- v .:? "armor" hit_points <- v .: "hit_points" references <- v .: "references" pure $ CreepRaw card_id base_card_id card_type card_name card_text mini_image large_image illustrator rarity is_blue is_black is_green is_red mana_cost item_def attack armor hit_points references data ImprovementRaw = ImprovementRaw { card_id :: Int , base_card_id :: Int , card_type :: T.Text , card_name :: CardNameRaw , card_text :: CardTextRaw , mini_image :: CardImageRaw , large_image :: CardImageRaw , illustrator :: Maybe T.Text , rarity :: Maybe T.Text , is_blue :: Maybe Bool , is_black :: Maybe Bool , is_green :: Maybe Bool , is_red :: Maybe Bool , mana_cost :: Int , item_def :: Maybe Int , references :: [ReferenceRaw] } deriving (Show) instance FromJSON ImprovementRaw where parseJSON = withObject "Improvement" $ \v -> do card_id <- v .: "card_id" base_card_id <- v .: "base_card_id" card_type <- v .: "card_type" .:= "Improvement" card_name <- v .: "card_name" card_text <- v .: "card_text" mini_image <- v .: "mini_image" large_image <- v .: "large_image" illustrator <- v .:? "illustrator" rarity <- v .:? "rarity" is_blue <- v .:? "is_blue" is_black <- v .:? "is_black" is_green <- v .:? "is_green" is_red <- v .:? "is_red" mana_cost <- v .: "mana_cost" item_def <- v .:? "item_def" references <- v .: "references" pure $ ImprovementRaw card_id base_card_id card_type card_name card_text mini_image large_image illustrator rarity is_blue is_black is_green is_red mana_cost item_def references data ItemRaw = ItemRaw { card_id :: Int , base_card_id :: Int , card_type :: T.Text , card_name :: CardNameRaw , card_text :: CardTextRaw , mini_image :: CardImageRaw , large_image :: CardImageRaw , illustrator :: Maybe T.Text , rarity :: Maybe T.Text , sub_type :: T.Text , gold_cost :: Int , item_def :: Maybe Int , references :: [ReferenceRaw] } deriving (Show) instance FromJSON ItemRaw where parseJSON = withObject "Item" $ \v -> do card_id <- v .: "card_id" base_card_id <- v .: "base_card_id" card_type <- v .: "card_type" .:= "Item" card_name <- v .: "card_name" card_text <- v .: "card_text" mini_image <- v .: "mini_image" large_image <- v .: "large_image" illustrator <- v .:? "illustrator" rarity <- v .:? "rarity" sub_type <- v .: "sub_type" gold_cost <- v .: "gold_cost" item_def <- v .:? "item_def" references <- v .: "references" pure $ ItemRaw card_id base_card_id card_type card_name card_text mini_image large_image illustrator rarity sub_type gold_cost item_def references data SpellRaw = SpellRaw { card_id :: Int , base_card_id :: Int , card_type :: T.Text , card_name :: CardNameRaw , card_text :: CardTextRaw , mini_image :: CardImageRaw , large_image :: CardImageRaw , illustrator :: Maybe T.Text , rarity :: Maybe T.Text , is_blue :: Maybe Bool , is_black :: Maybe Bool , is_green :: Maybe Bool , is_red :: Maybe Bool , mana_cost :: Int , item_def :: Maybe Int , references :: [ReferenceRaw] } deriving (Show) instance FromJSON SpellRaw where parseJSON = withObject "Spell" $ \v -> do card_id <- v .: "card_id" base_card_id <- v .: "base_card_id" card_type <- v .: "card_type" .:= "Spell" card_name <- v .: "card_name" card_text <- v .: "card_text" mini_image <- v .: "mini_image" large_image <- v .: "large_image" illustrator <- v .:? "illustrator" rarity <- v .:? "rarity" is_blue <- v .:? "is_blue" is_black <- v .:? "is_black" is_green <- v .:? "is_green" is_red <- v .:? "is_red" mana_cost <- v .: "mana_cost" item_def <- v .:? "item_def" references <- v .: "references" pure $ SpellRaw card_id base_card_id card_type card_name card_text mini_image large_image illustrator rarity is_blue is_black is_green is_red mana_cost item_def references data CardNameRaw = CardNameRaw { english :: T.Text } deriving (Generic, Show) instance FromJSON CardNameRaw data CardTextRaw = CardTextRaw { english :: Maybe T.Text } deriving (Generic, Show) instance FromJSON CardTextRaw data CardImageRaw = CardImageRaw { _default :: T.Text } deriving (Generic, Show) instance FromJSON CardImageRaw where parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = drop 1 } --suffixed with 'Ref' to avoid name clash data ReferenceRaw = ReferenceIncludeRaw IncludeRefRaw | ReferencePassiveRaw PassiveRefRaw | ReferenceActiveRaw ActiveRefRaw | ReferenceBasicRaw BasicRefRaw deriving (Show) instance FromJSON ReferenceRaw where parseJSON v = (ReferenceIncludeRaw <$> parseJSON v) <|> (ReferencePassiveRaw <$> parseJSON v) <|> (ReferenceActiveRaw <$> parseJSON v) <|> (ReferenceBasicRaw <$> parseJSON v) data IncludeRefRaw = IncludeRefRaw { card_id :: Int , ref_type :: T.Text , count :: Int } deriving (Show) instance FromJSON IncludeRefRaw where parseJSON = withObject "IncludeRef" $ \v -> do card_id <- v .: "card_id" ref_type <- v .: "ref_type" .:= "includes" count <- v .: "count" pure $ IncludeRefRaw card_id ref_type count data PassiveRefRaw = PassiveRefRaw { card_id :: Int , ref_type :: T.Text } deriving (Show) instance FromJSON PassiveRefRaw where parseJSON = withObject "PassiveRef" $ \v -> do card_id <- v .: "card_id" ref_type <- v .: "ref_type" .:= "passive_ability" pure $ PassiveRefRaw card_id ref_type data ActiveRefRaw = ActiveRefRaw { card_id :: Int , ref_type :: T.Text } deriving (Show) instance FromJSON ActiveRefRaw where parseJSON = withObject "ActiveRef" $ \v -> do card_id <- v .: "card_id" ref_type <- v .: "ref_type" .:= "active_ability" pure $ ActiveRefRaw card_id ref_type data BasicRefRaw = BasicRefRaw { card_id :: Int , ref_type :: T.Text } deriving (Show) instance FromJSON BasicRefRaw where parseJSON = withObject "BasicRef" $ \v -> do card_id <- v .: "card_id" ref_type <- v .: "ref_type" .:= "references" pure $ BasicRefRaw card_id ref_type