@echo off
title cleaner
cls
chcp 65001 > nul
setlocal DisableDelayedExpansion

set "color_green=0A"
set "default_dir=C:\Program Files (x86)\Steam\steamapps\common\GarrysMod"
set "PerpDeeeepClean=1"

:startup
cls
color 6
echo    Date: %DATE% %TIME%
echo.
echo    Cleaning files in: %default_dir%
echo.

call :DeleteFilesAndFolders "%default_dir%"

:DeleteFilesAndFolders
set "base_dir=%~1"
set "gmod_dir=%base_dir%\garrysmod"

echo Deleting trace files...
del "%base_dir%\*.mdmp" >nul 2>&1
del "%base_dir%\*.log" >nul 2>&1
del "%base_dir%\*.log1" >nul 2>&1
del "%gmod_dir%\cl.db" >nul 2>&1
del "%gmod_dir%\sv.db" >nul 2>&1
del "%gmod_dir%\mn.db" >nul 2>&1
del "%gmod_dir%\demoheader.tmp" >nul 2>&1
del "%gmod_dir%\voice_ban.dt" >nul 2>&1
del "%gmod_dir%\modelsounds.cache" >nul 2>&1
del "%gmod_dir%\media\mapkeys.res" >nul 2>&1
del "%gmod_dir%\*.dem" >nul 2>&1

echo Cleaning cached demos..
del "%gmod_dir%\cache\*.dem" >nul 2>&1

echo Cleaning cfg folder...
if exist "%gmod_dir%\cfg" (
    powershell -Command "Get-ChildItem -Path '%gmod_dir%\cfg' -ErrorAction SilentlyContinue | Where-Object { $_.Name -notmatch '^(config\.cfg|config_default\.cfg|config_default|mountdepots\.txt)$' } | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue" >nul 2>&1
    if exist "%gmod_dir%\cfg\config.cfg" (
        echo Cleaning config.cfg...
        powershell -Command "$file = '%gmod_dir%\cfg\config.cfg'; (Get-Content $file) | Where-Object { $_ -notmatch '^\s*cl_clanid' -and $_ -notmatch '^\s*password' } | Set-Content $file" >nul 2>&1
    )
)

echo Cleaning client.vdf billy tracking entries...
if exist "%gmod_dir%\cfg\client.vdf" (
    powershell -Command "$file = '%gmod_dir%\cfg\client.vdf'; if (Test-Path $file) { $content = Get-Content $file -Raw; $content = $content -replace '\t\"mat_texture_list_billy\"\s+\"1000000000\"\r?\n', ''; $content = $content -replace '\t\"cl_session_billy\"\s+\"1000000000\"\r?\n', ''; $content = $content -replace '\t\"sv_cache_billy\"\s+\"1000000000\"\r?\n', ''; $content = $content -replace '\t\"net_graph_billy\"\s+\"1000000000\"\r?\n', ''; $content = $content -replace '\t\"r_drawworld_billy\"\s+\"1000000000\"\r?\n', ''; Set-Content $file -Value $content -NoNewline }" >nul 2>&1
)

if "%PerpDeeeepClean%"=="1" (
    echo Deleting client.vdf - Perp..
    del "%gmod_dir%\cfg\client.vdf" >nul 2>&1
)

if exist "%gmod_dir%\data" (
    echo Cleaning data folder...
    pushd "%gmod_dir%\data"
    
    echo Deleting specific tracking files... 
    del /q "billy\player_data.txt" >nul 2>&1
    del /q "billy\settings.dat" >nul 2>&1
    del /q "billy\cache\user.bin" >nul 2>&1
    del /q "expression2\e2_autosave_billy.txt" >nul 2>&1
    del /q "starfall\sf_cache_billy.txt" >nul 2>&1
    del /q "pac3\player_settings.txt" >nul 2>&1
    del /q "advdupe2\player_identity.txt" >nul 2>&1
    del /q "textscreens\user_prefs.txt" >nul 2>&1
    del /q "sprays\spray_config.dat" >nul 2>&1
    del /q "screenshots\thumbs\cache.dat" >nul 2>&1
    del /q "saves\player_progress.dat" >nul 2>&1
    del /q "downloads\server_data.txt" >nul 2>&1
    del /q "materials\temp_cache.txt" >nul 2>&1
    del /q "sound\temp_cache.txt" >nul 2>&1
    del /q "models\temp_cache.txt" >nul 2>&1
    del /q "maps\temp_cache.txt" >nul 2>&1
    del /q "lua\temp_cache.txt" >nul 2>&1
    del /q "cfg\billy_user.cfg" >nul 2>&1
    del /q "cfg\server_settings.dat" >nul 2>&1
    del /q "data_static\player.dat" >nul 2>&1
    del /q "workshop\subscribed_cache.txt" >nul 2>&1
    del /q "resource\fonts\fontcache.txt" >nul 2>&1
    del /q "ucl\user_data.txt" >nul 2>&1
    del /q "ulib\user_data.txt" >nul 2>&1
    del /q "fadmin\user_data.txt" >nul 2>&1
    del /q "sam\user_data.txt" >nul 2>&1
    del /q "ulx\user_data.txt" >nul 2>&1
    del /q "wiremod\user_data.txt" >nul 2>&1
    del /q "precision\tool_settings.txt" >nul 2>&1
    del /q "stacker\tool_settings.txt" >nul 2>&1
    del /q "smartsnap\preferences.txt" >nul 2>&1
    del /q "niknaks\cache.txt" >nul 2>&1
    del /q "gmodadminsuite\player.txt" >nul 2>&1
    del /q "bricks_server\inventory_cache.txt" >nul 2>&1
    del /q "darkrp_modules\player_data.txt" >nul 2>&1
    del /q "permaprops\player_data.txt" >nul 2>&1
    del /q "^!workshop\content.dat" >nul 2>&1
    del /q "_clientscheme.txt" >nul 2>&1
    del /q "_serverinfo.txt" >nul 2>&1
    del /q "game_config\settings.txt" >nul 2>&1
    del /q "tmp\session.dat" >nul 2>&1
    
    echo Deleting addon identity files...
    del /q "advdupe2\_identity.txt" >nul 2>&1
    del /q "expression2\_identity.txt" >nul 2>&1
    del /q "starfall\_identity.txt" >nul 2>&1
    del /q "wire\_identity.txt" >nul 2>&1
    del /q "pac3\_identity.txt" >nul 2>&1
    del /q "pac\_identity.txt" >nul 2>&1
    del /q "outfitter\_identity.txt" >nul 2>&1
    del /q "sprays\_identity.txt" >nul 2>&1
    del /q "e2files\_identity.txt" >nul 2>&1
    del /q "sf_filedata\_identity.txt" >nul 2>&1
    del /q "acf\_identity.txt" >nul 2>&1
    del /q "photon\_identity.txt" >nul 2>&1
    del /q "simfphys\_identity.txt" >nul 2>&1
    del /q "lfs\_identity.txt" >nul 2>&1
    del /q "wac\_identity.txt" >nul 2>&1
    del /q "cfc\_identity.txt" >nul 2>&1
    del /q "m9k\_identity.txt" >nul 2>&1
    del /q "tfa\_identity.txt" >nul 2>&1
    del /q "cw2\_identity.txt" >nul 2>&1
    del /q "fas2\_identity.txt" >nul 2>&1
    del /q "gdcw\_identity.txt" >nul 2>&1
    del /q "customization\_identity.txt" >nul 2>&1
    
    for /d %%I in (*) do (
        if /i "%%I" neq "advdupe2" if /i "%%I" neq "zovgame" if /i "%%I" neq "bases" if /i "%%I" neq "kh" if /i "%%I" neq "exodium" if /i "%%I" neq "kirk" (
            echo Deleting data\%%I...
            rd /s /q "%%I" >nul 2>&1
        )
    )
    for %%F in (*) do (
        if /i "%%F" neq "smokes_store_fetch.txt" (
            del /q "%%F" >nul 2>&1
        )
    )
    popd
)

for %%D in ("%gmod_dir%\demos" "%gmod_dir%\dupes" "%gmod_dir%\videos" "%gmod_dir%\download" "%gmod_dir%\saves" "%gmod_dir%\screenshots" "%gmod_dir%\media") do (
    if exist "%%~D" (
        echo Cleaning %%~nxD folder...
        rd /s /q "%%~D" >nul 2>&1
        mkdir "%%~D" >nul 2>&1
    )
)

echo Cleaning maps folder...
if exist "%gmod_dir%\maps" (
    powershell -Command "Get-ChildItem -Path '%gmod_dir%\maps' -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.Name -notmatch '^(gm_flatgrass\.nav|gm_flatgrass\.bsp|gm_construct\.nav|gm_construct\.bsp|gm_construct\.ain|gm_flatgrass\.ain|graphs)$' } | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue" >nul 2>&1
)

if exist "%base_dir%\ChromiumCache" (
    echo Deleting ChromiumCache....
    rd /s /q "%base_dir%\ChromiumCache" >nul 2>&1
)

if exist "%base_dir%\crashes" (
    echo Cleaning crashes folder...
    pushd "%base_dir%\crashes"
    for /f "delims=" %%F in ('dir /b /a 2^>nul') do (
        if exist "%%F" (
            if exist "%%F\" (
                rd /s /q "%%F" >nul 2>&1
            ) else (
                del /f /q "%%F" >nul 2>&1
            )
        )
    )
    popd
    rd /s /q "%base_dir%\crashes" >nul 2>&1
    mkdir "%base_dir%\crashes" >nul 2>&1
)

call :RandomizeFileDates
goto :Complete

:RandomizeFileDates
echo Randomizing file dates...
setlocal enabledelayedexpansion
powershell -Command "$baseDir = '%base_dir%'; $min = Get-Date -Date '01/01/2020'; $max = Get-Date; $span = $max - $min; $limit = [int]$span.TotalSeconds; if (Test-Path $baseDir) { Get-ChildItem -Path $baseDir -Recurse -Force -ErrorAction SilentlyContinue | ForEach-Object { $val = Get-Random -Minimum 0 -Maximum $limit; $d = $min.AddSeconds($val); try { $_.CreationTime = $d; $_.LastWriteTime = $d } catch {} } }" >nul 2>&1
endlocal
goto :eof

:Complete
cls
exit