63 lines
1.7 KiB
Haskell
63 lines
1.7 KiB
Haskell
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]
|