content: {-# 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 Data.Maybe (fromJust)
  import Optics ((%), (^.), (^?), _Just)
  import Polysemy
  import Polysemy qualified 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
  