aboutsummaryrefslogtreecommitdiff
path: root/tea-cleaner/Main.hs
blob: bfad0f7b5fd41751dca69f65b2ff34719ba74a08 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
module Main
    ( main
    ) where

import Data.Vector (Vector)
import qualified Data.Text as Text
import System.Environment (getArgs)
import qualified Text.URI as URI
import Data.Time (LocalTime(..), ZonedTime(..))
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 Data.Time.Calendar.OrdinalDate (fromOrdinalDate)
import TeaCleaner.Types (Activity(..), User(..))
import TeaCleaner.Client (getActivities, getUsers, purgeUser)

filterByUserProperties :: User -> Bool
filterByUserProperties 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)
  where
    zonedDay = localDay . zonedTimeToLocalTime

filterByActivities :: String -> URI.URI -> User -> IO Bool
filterByActivities server token user
    = getActivities server token user
    >>= evalActivities
  where
    evalActivities activities
        | Just (Activity{ opType }, rest) <- Vector.uncons activities
        , Vector.null rest = pure $ opType == "create_repo"
    evalActivities _ = pure False

printUsers :: String -> URI.URI -> Vector User -> IO ()
printUsers server token users = printCount
    >> Vector.forM_ users printUser
  where
    printCount =
        let count = Text.Builder.decimal $ Vector.length users
         in Text.Lazy.IO.putStrLn
            $ Text.Builder.toLazyText
            $ "Count: " <> count
    printUser user =
        let value
                = "  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"
         in Text.IO.putStrLn (getField @"username" user <> "\n" <> value)
            >> purgeUser server token user

main :: IO ()
main = getArgs >>= withArguments
  where
    withArguments [server, token]
        = URI.mkURI (Text.pack server)
        >>= withServer token
    withArguments _ = putStrLn "Expected exactly two arguments: server URL and the access token."
    withServer token server = getUsers token server
        >>= Vector.filterM (filterByActivities token server) . Vector.filter filterByUserProperties
        >>= printUsers token server