tea-cleaner: Read configuration file

This commit is contained in:
2025-02-18 11:57:18 +01:00
parent 346b9dcfdf
commit 06fa97bfcf
6 changed files with 163 additions and 97 deletions

View File

@ -2,30 +2,45 @@ module Main
( main
) where
import Data.Text (StrictText)
import Data.Vector (Vector)
import qualified Data.Text as Text
import Text.URI (URI, mkURI)
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 (filterByActivities, filterByUserProperties)
import TeaCleaner.Filter
( UserFilter(..)
, FilterResult(..)
, filterByActivities
, filterByUserProperties
)
import TeaCleaner.Client (User(..), getUsers, purgeUser)
import TeaCleaner.CommandLine (ProgramOptions(..), commandLineInfo, execParser)
import TeaCleaner.Configuration
( ProgramOptions(..)
, Settings(..)
, decodeSettingsFile
, commandLineInfo
, execParser
)
import Control.Monad (when)
printUsers :: URI -> StrictText -> Bool -> Vector User -> IO ()
printUsers server token liveRun users = printCount
>> Vector.forM_ users (printUser liveRun)
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
buildValue user = getField @"username" user <> "\n"
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"
@ -34,14 +49,23 @@ printUsers server token liveRun users = printCount
<> " Description: " <> getField @"description" user <> "\n"
<> " Avatar: " <> getField @"avatarUrl" user <> "\n"
<> "\n"
printUser True user = Text.IO.putStrLn (buildValue user)
>> purgeUser server token user
printUser False user = Text.IO.putStrLn (buildValue user)
main :: IO ()
main = execParser commandLineInfo >>= withArguments
where
withArguments ProgramOptions{..} = mkURI server >>= withServer liveRun token
withServer liveRun token server = getUsers server token
>>= Vector.filterM (filterByActivities server token) . Vector.filter filterByUserProperties
>>= printUsers server token liveRun
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