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