packages feed

artifact-0.0.0.0: src/Artifact/Raw.hs

{-
    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 <http://www.gnu.org/licenses/>.
-}

{-# 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