{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
module Discord.Types.Prelude where
import Data.Bits
import Data.Word
import Data.Aeson.Types
import Data.Time.Clock
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
import qualified Data.ByteString.Char8 as Q
import Data.Time.Clock.POSIX
import Data.Monoid ((<>))
import Control.Monad (mzero)
data Auth = Auth T.Text
deriving (Show, Eq, Ord)
formatAuth :: Auth -> Q.ByteString
formatAuth (Auth token) = TE.encodeUtf8 $ bot <> token
where
bot = if "Bot " `T.isPrefixOf` token then "" else "Bot "
authToken :: Auth -> T.Text
authToken (Auth token) = token
newtype Snowflake = Snowflake Word64
deriving (Ord, Eq, Num, Integral, Enum, Real, Bits)
instance Show Snowflake where
show (Snowflake a) = show a
instance ToJSON Snowflake where
toJSON (Snowflake snowflake) = String . T.pack $ show snowflake
instance FromJSON Snowflake where
parseJSON (String snowflake) = Snowflake <$> (return . read $ T.unpack snowflake)
parseJSON _ = mzero
creationDate :: Snowflake -> UTCTime
creationDate x = posixSecondsToUTCTime . realToFrac
$ 1420070400 + quot (shiftR x 22) 1000
epochTime :: UTCTime
epochTime = posixSecondsToUTCTime 0