os-ai-pr-bot/src/Bot/Trigger.hs

63 lines
1.7 KiB
Haskell
Raw Normal View History

2026-02-14 06:16:52 +11:00
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]