72 lines
2.6 KiB
Haskell

module Main
( main
) where
import Data.Vector (Vector)
import qualified Data.Text as Text
import qualified Data.Vector as Vector
import qualified Data.Text.IO as Text.IO
import qualified Data.Text.Lazy.IO as Text.Lazy.IO
import qualified Data.Text.Lazy.Builder as Text.Builder
import qualified Data.Text.Lazy.Builder.Int as Text.Builder
import GHC.Records (HasField(..))
import TeaCleaner.Filter
( UserFilter(..)
, FilterResult(..)
, filterByActivities
, filterByUserProperties
)
import TeaCleaner.Client (User(..), getUsers, purgeUser)
import TeaCleaner.Configuration
( ProgramOptions(..)
, Settings(..)
, decodeSettingsFile
, commandLineInfo
, execParser
)
import Control.Monad (when)
handleResults :: Settings -> Bool -> Vector User -> IO ()
handleResults settings liveRun users = printCount
>> Vector.forM_ users (handleResult settings liveRun)
where
printCount =
let count = Text.Builder.decimal $ Vector.length users
in Text.Lazy.IO.putStrLn
$ Text.Builder.toLazyText
$ "Count: " <> count
handleResult :: Settings -> Bool -> User -> IO ()
handleResult settings liveRun user = Text.IO.putStrLn buildValue
>> when liveRun (purgeUser settings user)
where
buildValue = getField @"username" user <> "\n"
<> " Website: " <> getField @"website" user <> "\n"
<> " Created: " <> Text.pack (show $ getField @"created" user) <> "\n"
<> " Last login: " <> Text.pack (show $ getField @"lastLogin" user) <> "\n"
<> " Email: " <> getField @"email" user <> "\n"
<> " Website: " <> getField @"website" user <> "\n"
<> " Description: " <> getField @"description" user <> "\n"
<> " Avatar: " <> getField @"avatarUrl" user <> "\n"
<> "\n"
main :: IO ()
main = execParser commandLineInfo >>= withArguments
where
withArguments ProgramOptions{ liveRun } = decodeSettingsFile "config/tea-cleaner.toml"
>>= withSettings liveRun
withSettings :: Bool -> Settings -> IO ()
withSettings liveRun settings = getUsers settings
>>= Vector.foldM' foldFilterResult Vector.empty . fmap filterByUserProperties
>>= traverse (filterByActivities settings)
>>= Vector.foldM' foldFilterResult Vector.empty
>>= handleResults settings liveRun
where
foldFilterResult accumulator (FilterResult user SuspiciousFilter)
= pure $ Vector.snoc accumulator user
foldFilterResult accumulator (FilterResult _ PassFilter) = pure accumulator
foldFilterResult accumulator (FilterResult user FailedFilter)
= handleResult settings liveRun user
>> pure accumulator