{-# LANGUAGE TemplateHaskell #-} -- | Effect for working with an interaction module Calamity.Interactions.Eff ( InteractionEff (..), getInteraction, getInteractionID, getApplicationID, getInteractionToken, getInteractionUser, ) where import Calamity.Types.Model.Interaction import Calamity.Types.Model.User (User) import Calamity.Types.Snowflake import Control.Applicative ((<|>)) import Optics ((^.), (^?), _Just, (%)) import Data.Maybe (fromJust) import Polysemy import qualified Polysemy as P data InteractionEff m a where GetInteraction :: InteractionEff m Interaction makeSem ''InteractionEff getInteractionID :: P.Member InteractionEff r => P.Sem r (Snowflake Interaction) getInteractionID = (^. #id) <$> getInteraction getApplicationID :: P.Member InteractionEff r => P.Sem r (Snowflake Application) getApplicationID = (^. #applicationID) <$> getInteraction getInteractionToken :: P.Member InteractionEff r => P.Sem r InteractionToken getInteractionToken = (^. #token) <$> getInteraction getInteractionUser :: P.Member InteractionEff r => P.Sem r (Snowflake User) getInteractionUser = do int <- getInteraction let uid = int ^? #user % _Just % #id mid = int ^? #member % _Just % #id pure . fromJust $ uid <|> mid