diff options
| author | Eugen Wissner <belka@caraus.de> | 2025-01-24 22:38:58 +0100 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2025-01-24 22:38:58 +0100 |
| commit | 3c430bca64c813a0a04cb98d5cd9a3d3fb70e1b0 (patch) | |
| tree | 2896d05540a33312ee2050ef1919a92085a13e01 /tea-cleaner/TeaCleaner/Client.hs | |
| parent | c8b05eedfc876a6ef09472b5e92ba0455ad0f8b1 (diff) | |
| download | kazbek-3c430bca64c813a0a04cb98d5cd9a3d3fb70e1b0.tar.gz | |
Add gitea spam user cleaning script
Diffstat (limited to 'tea-cleaner/TeaCleaner/Client.hs')
| -rw-r--r-- | tea-cleaner/TeaCleaner/Client.hs | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/tea-cleaner/TeaCleaner/Client.hs b/tea-cleaner/TeaCleaner/Client.hs new file mode 100644 index 0000000..1556be6 --- /dev/null +++ b/tea-cleaner/TeaCleaner/Client.hs @@ -0,0 +1,85 @@ +module TeaCleaner.Client + ( getActivities + , getUsers + , purgeUser + ) where + +import Data.List.NonEmpty (NonEmpty(..)) +import Data.Vector (Vector) +import Text.URI (URI(..)) +import qualified Text.URI as URI +import qualified Text.URI.QQ as URI +import TeaCleaner.Types (Activity(..), User(..)) +import qualified Data.ByteString.Char8 as Char8 +import Network.HTTP.Req + ( DELETE(..) + , GET(..) + , NoReqBody(..) + , defaultHttpConfig + , ignoreResponse + , jsonResponse + , oAuth2Bearer + , responseBody + , req + , runReq + , useHttpsURI + ) +import GHC.Records (HasField(..)) + +purgeUser :: String -> URI -> User -> IO () +purgeUser token server user = + let pathConstructor lastPiece = [URI.pathPiece|api|] :| + [ [URI.pathPiece|v1|] + , [URI.pathPiece|admin|] + , [URI.pathPiece|users|] + , lastPiece + ] + uri = server + { URI.uriPath = (False,) . pathConstructor + <$> URI.mkPathPiece (getField @"username" user) + , URI.uriQuery = [URI.QueryParam [URI.queryKey|purge|] [URI.queryValue|true|]] + } + in case useHttpsURI uri of + Just (httpsURI, httpsOptions) -> fmap responseBody + $ runReq defaultHttpConfig + $ req DELETE httpsURI NoReqBody ignoreResponse + $ httpsOptions <> oAuth2Bearer (Char8.pack token) + Nothing -> error "Invalid https URI" + +getActivities :: String -> URI -> User -> IO (Vector Activity) +getActivities token server user = + let pathConstructor lastPiece = [URI.pathPiece|api|] :| + [ [URI.pathPiece|v1|] + , [URI.pathPiece|users|] + , lastPiece + , [URI.pathPiece|activities|] + , [URI.pathPiece|feeds|] + ] + uri = server + { URI.uriPath = (False,) . pathConstructor + <$> URI.mkPathPiece (getField @"username" user) + , URI.uriQuery = [URI.QueryParam [URI.queryKey|purge|] [URI.queryValue|true|]] + } + in case useHttpsURI uri of + Just (httpsURI, httpsOptions) -> fmap responseBody + $ runReq defaultHttpConfig + $ req GET httpsURI NoReqBody jsonResponse + $ httpsOptions <> oAuth2Bearer (Char8.pack token) + Nothing -> error "Invalid https URI" + +getUsers :: String -> URI -> IO (Vector User) +getUsers token server = + let pathPieces = [URI.pathPiece|api|] :| + [ [URI.pathPiece|v1|] + , [URI.pathPiece|admin|] + , [URI.pathPiece|users|] + ] + uri = server + { URI.uriPath = Just (False, pathPieces) + } + in case useHttpsURI uri of + Just (httpsURI, httpsOptions) -> fmap responseBody + $ runReq defaultHttpConfig + $ req GET httpsURI NoReqBody jsonResponse + $ httpsOptions <> oAuth2Bearer (Char8.pack token) + Nothing -> error "Invalid https URI" |
