{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
module Discord.Internal.Types.Prelude where
import Data.Bits
import Data.Word
import Data.Aeson.Types
import Data.Time.Clock
import qualified Data.Text as T
import Data.Time.Clock.POSIX
import Data.Monoid ((<>))
import Control.Monad (mzero)
data Auth = Auth T.Text
deriving (Show, Eq, Ord)
authToken :: Auth -> T.Text
authToken (Auth tok) = let token = T.strip tok
bot = if "Bot " `T.isPrefixOf` token then "" else "Bot "
in bot <> 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 <$> (pure . read $ T.unpack snowflake)
parseJSON _ = mzero
type ChannelId = Snowflake
type GuildId = Snowflake
type MessageId = Snowflake
type EmojiId = Snowflake
type UserId = Snowflake
type OverwriteId = Snowflake
type RoleId = Snowflake
type IntegrationId = Snowflake
type WebhookId = Snowflake
snowflakeCreationDate :: Snowflake -> UTCTime
snowflakeCreationDate x = posixSecondsToUTCTime . realToFrac
$ 1420070400 + quot (shiftR x 22) 1000
epochTime :: UTCTime
epochTime = posixSecondsToUTCTime 0