2025-01-26 10:17:33 +01:00
|
|
|
module TeaCleaner.Filter
|
2025-02-18 11:57:18 +01:00
|
|
|
( FilterResult(..)
|
|
|
|
, UserFilter(..)
|
|
|
|
, filterByActivities
|
2025-01-26 10:17:33 +01:00
|
|
|
, filterByUserProperties
|
|
|
|
) where
|
|
|
|
|
|
|
|
import qualified Data.Text as Text
|
|
|
|
import Data.Time (LocalTime(..), ZonedTime(..))
|
|
|
|
import Data.Time.Calendar.OrdinalDate (fromOrdinalDate)
|
|
|
|
import qualified Data.Vector as Vector
|
|
|
|
import TeaCleaner.Client (Activity(..), User(..), getActivities)
|
2025-02-18 11:57:18 +01:00
|
|
|
import TeaCleaner.Configuration (Settings(..))
|
2025-01-26 10:17:33 +01:00
|
|
|
|
2025-02-18 11:57:18 +01:00
|
|
|
data UserFilter
|
|
|
|
= PassFilter
|
|
|
|
| SuspiciousFilter
|
|
|
|
| FailedFilter
|
|
|
|
deriving (Eq, Show)
|
|
|
|
|
|
|
|
data FilterResult = FilterResult User UserFilter
|
|
|
|
deriving (Show)
|
|
|
|
|
|
|
|
filterByUserProperties :: User -> FilterResult
|
|
|
|
filterByUserProperties user@User{ created, lastLogin, description, website }
|
|
|
|
| zonedDay created == zonedDay lastLogin
|
|
|
|
, zonedDay created > fromOrdinalDate 2024 1
|
|
|
|
, zonedDay created < fromOrdinalDate 2025 17
|
|
|
|
, not (Text.null description)
|
|
|
|
, not (Text.null website) = FilterResult user SuspiciousFilter
|
|
|
|
| otherwise = FilterResult user PassFilter
|
2025-01-26 10:17:33 +01:00
|
|
|
where
|
|
|
|
zonedDay = localDay . zonedTimeToLocalTime
|
|
|
|
|
2025-02-18 11:57:18 +01:00
|
|
|
filterByActivities :: Settings -> User -> IO FilterResult
|
|
|
|
filterByActivities settings user = getActivities settings user
|
2025-01-26 10:17:33 +01:00
|
|
|
>>= evalActivities
|
|
|
|
where
|
|
|
|
evalActivities activities
|
|
|
|
| Just (Activity{ opType }, rest) <- Vector.uncons activities
|
2025-02-18 11:57:18 +01:00
|
|
|
, Vector.null rest
|
|
|
|
, opType == "create_repo" = pure $ FilterResult user SuspiciousFilter
|
|
|
|
evalActivities _ = pure $ FilterResult user PassFilter
|