82 lines
3.0 KiB
Haskell
Raw Normal View History

2025-02-24 21:09:23 +01:00
{- This Source Code Form is subject to the terms of the Mozilla Public License,
v. 2.0. If a copy of the MPL was not distributed with this file, You can
obtain one at https://mozilla.org/MPL/2.0/. -}
2025-01-24 22:38:58 +01:00
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(..))
2025-02-18 11:57:18 +01:00
import TeaCleaner.Filter
( UserFilter(..)
, FilterResult(..)
, filterByActivities
, filterByUserProperties
)
2025-01-26 10:17:33 +01:00
import TeaCleaner.Client (User(..), getUsers, purgeUser)
2025-02-18 11:57:18 +01:00
import TeaCleaner.Configuration
( ProgramOptions(..)
, Settings(..)
, decodeSettingsFile
, commandLineInfo
, execParser
)
import Control.Monad (when)
2025-02-22 21:30:29 +01:00
import Data.IORef (modifyIORef, readIORef)
2025-01-24 22:38:58 +01:00
2025-02-22 21:30:29 +01:00
printStatistics :: Settings -> IO ()
printStatistics Settings{ statistics } =
readIORef statistics >>= printCount
2025-01-24 22:38:58 +01:00
where
2025-02-22 21:30:29 +01:00
printCount count =
let count' = Text.Builder.decimal count
2025-01-24 22:38:58 +01:00
in Text.Lazy.IO.putStrLn
$ Text.Builder.toLazyText
2025-02-22 21:30:29 +01:00
$ "Count: " <> count'
2025-02-18 11:57:18 +01:00
2025-02-22 21:30:29 +01:00
handleResults :: Settings -> Bool -> Vector FilterResult -> IO (Vector User)
handleResults settings liveRun =
Vector.foldM' handleResult Vector.empty
where
handleResult accumulator (FilterResult user FailedFilter)
= handleFailedFilter settings liveRun user
>> pure accumulator
handleResult accumulator (FilterResult _ PassFilter) = pure accumulator
handleResult accumulator (FilterResult user SuspiciousFilter) = pure
$ Vector.snoc accumulator user
handleFailedFilter :: Settings -> Bool -> User -> IO ()
handleFailedFilter settings liveRun user = Text.IO.putStrLn buildValue
>> modifyIORef (getField @"statistics" settings) (+ 1)
2025-02-18 11:57:18 +01:00
>> when liveRun (purgeUser settings user)
where
buildValue = getField @"username" user <> "\n"
2025-01-26 10:17:33 +01:00
<> " 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"
2025-01-24 22:38:58 +01:00
main :: IO ()
2025-01-26 10:17:33 +01:00
main = execParser commandLineInfo >>= withArguments
2025-01-24 22:38:58 +01:00
where
2025-02-18 11:57:18 +01:00
withArguments ProgramOptions{ liveRun } = decodeSettingsFile "config/tea-cleaner.toml"
>>= withSettings liveRun
withSettings :: Bool -> Settings -> IO ()
withSettings liveRun settings = getUsers settings
2025-02-22 21:30:29 +01:00
>>= handleResults settings liveRun . fmap (filterByUserProperties settings)
2025-02-18 11:57:18 +01:00
>>= traverse (filterByActivities settings)
>>= handleResults settings liveRun
2025-02-22 21:30:29 +01:00
>> printStatistics settings