module Bot.Trigger ( TriggerResult (..) , checkTrigger ) where import Data.Text (Text) import Data.Text qualified as T import Text.Regex.TDFA ((=~)) import Bot.Config (Config (..)) import Bot.Event data TriggerResult = Triggered { trPRNumber :: Int } | NotTriggered checkTrigger :: Config -> Event -> TriggerResult checkTrigger cfg = \case EvPullRequest pre | preAction pre `elem` ["opened", "reopened", "ready_for_review"] -> if matchesTrigger phrase (preTitle pre) || maybe False (matchesTrigger phrase) (preBody pre) then Triggered (preNumber pre) else NotTriggered | otherwise -> NotTriggered EvIssueComment ice | iceAction ice == "created" && iceIsPull ice -> if matchesTrigger phrase (iceCommentBody ice) then Triggered (iceNumber ice) else NotTriggered | otherwise -> NotTriggered EvPRReview prre | prreAction prre == "submitted" -> if matchesTrigger phrase (prreReviewBody prre) then Triggered (prreNumber prre) else NotTriggered | otherwise -> NotTriggered EvPRReviewComment prrce | prrceAction prrce == "created" -> if matchesTrigger phrase (prrceCommentBody prrce) then Triggered (prrceNumber prrce) else NotTriggered | otherwise -> NotTriggered where phrase = cfgTriggerPhrase cfg matchesTrigger :: Text -> Text -> Bool matchesTrigger phrase text = T.unpack text =~ pattern where pattern :: String pattern = "(^|\\s)" <> escapeRegex (T.unpack phrase) <> "([\\s.,!?;:]|$)" escapeRegex :: String -> String escapeRegex = concatMap esc where esc c | c `elem` (".*+?^${}()|[]\\" :: String) = ['\\', c] | otherwise = [c]