module Web.Exhentai.API.Auth
  ( Credential (..),
    auth,
  )
where

import Data.ByteString (ByteString)
import GHC.Generics
import Network.HTTP.Client.Conduit
import Network.HTTP.Client.MultipartFormData
import Web.Exhentai.Types.CookieT

data Credential = Credential
  { Credential -> ByteString
username :: ByteString,
    Credential -> ByteString
password :: ByteString
  }
  deriving (Int -> Credential -> ShowS
[Credential] -> ShowS
Credential -> String
(Int -> Credential -> ShowS)
-> (Credential -> String)
-> ([Credential] -> ShowS)
-> Show Credential
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Credential] -> ShowS
$cshowList :: [Credential] -> ShowS
show :: Credential -> String
$cshow :: Credential -> String
showsPrec :: Int -> Credential -> ShowS
$cshowsPrec :: Int -> Credential -> ShowS
Show, Credential -> Credential -> Bool
(Credential -> Credential -> Bool)
-> (Credential -> Credential -> Bool) -> Eq Credential
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Credential -> Credential -> Bool
$c/= :: Credential -> Credential -> Bool
== :: Credential -> Credential -> Bool
$c== :: Credential -> Credential -> Bool
Eq, (forall x. Credential -> Rep Credential x)
-> (forall x. Rep Credential x -> Credential) -> Generic Credential
forall x. Rep Credential x -> Credential
forall x. Credential -> Rep Credential x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Credential x -> Credential
$cfrom :: forall x. Credential -> Rep Credential x
Generic)

-- | Authenticates and loads user preferences.
-- This should be called before any other functions are called
auth :: MonadHttpState m => Credential -> m ()
auth :: Credential -> m ()
auth Credential {ByteString
password :: ByteString
username :: ByteString
$sel:password:Credential :: Credential -> ByteString
$sel:username:Credential :: Credential -> ByteString
..} = do
  Request
initReq <- String -> m Request
forall (m :: Type -> Type). MonadHttp m => String -> m Request
formRequest String
"POST https://forums.e-hentai.org/index.php"
  let parts :: [PartM IO]
parts =
        [ Text -> ByteString -> PartM IO
forall (m :: Type -> Type).
Applicative m =>
Text -> ByteString -> PartM m
partBS Text
"CookieDate" ByteString
"1",
          Text -> ByteString -> PartM IO
forall (m :: Type -> Type).
Applicative m =>
Text -> ByteString -> PartM m
partBS Text
"b" ByteString
"d",
          Text -> ByteString -> PartM IO
forall (m :: Type -> Type).
Applicative m =>
Text -> ByteString -> PartM m
partBS Text
"bt" ByteString
"1-6",
          Text -> ByteString -> PartM IO
forall (m :: Type -> Type).
Applicative m =>
Text -> ByteString -> PartM m
partBS Text
"UserName" ByteString
username,
          Text -> ByteString -> PartM IO
forall (m :: Type -> Type).
Applicative m =>
Text -> ByteString -> PartM m
partBS Text
"PassWord" ByteString
password,
          Text -> ByteString -> PartM IO
forall (m :: Type -> Type).
Applicative m =>
Text -> ByteString -> PartM m
partBS Text
"ipb_login_submit" ByteString
"Login!"
        ]
  let req :: Request
req =
        [(ByteString, Maybe ByteString)] -> Request -> Request
setQueryString
          [ (ByteString
"act", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just ByteString
"Login"),
            (ByteString
"CODE", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just ByteString
"01")
          ]
          Request
initReq
  Request
finalReq <- [PartM IO] -> Request -> m Request
forall (m :: Type -> Type).
MonadHttp m =>
[PartM IO] -> Request -> m Request
attachFormData [PartM IO]
parts Request
req
  Request -> m ()
forall (m :: Type -> Type). MonadHttpState m => Request -> m ()
modifyingJar Request
finalReq
  Request
req2 <- String -> m Request
forall (m :: Type -> Type). MonadHttp m => String -> m Request
formRequest String
"https://exhentai.org"
  Request -> m ()
forall (m :: Type -> Type). MonadHttpState m => Request -> m ()
modifyingJar Request
req2
  Request
req3 <- String -> m Request
forall (m :: Type -> Type). MonadHttp m => String -> m Request
formRequest String
"https://exhentai.org/uconfig.php"
  Request -> m ()
forall (m :: Type -> Type). MonadHttpState m => Request -> m ()
modifyingJar Request
req3
  Request
req4 <- String -> m Request
forall (m :: Type -> Type). MonadHttp m => String -> m Request
formRequest String
"https://exhentai.org/mytags"
  Request -> m ()
forall (m :: Type -> Type). MonadHttpState m => Request -> m ()
modifyingJar Request
req4